Python打造在线旅游攻略发布系统
在这个信息爆炸的时代,旅游攻略成为了许多人出行前的必备参考资料。如何高效地发布和管理这些攻略,成为了旅游爱好者和内容创作者的一大难题。今天,我们将用Python语言,打造一个功能齐全的在线旅游攻略发布系统,让攻略分享变得更加便捷。

项目背景
随着互联网的普及,越来越多的人选择在线获取旅游信息。传统的攻略发布方式,如博客、论坛,虽然也能满足基本需求,但在用户体验和信息管理上存在诸多不足。基于此,我们决定开发一个专门的旅游攻略发布系统,旨在提供更好的内容展示和互动体验。
技术选型
为了实现这一目标,我们选择了以下技术栈:
- 前端:HTML、CSS、JavaScript
- 后端:Python、Flask框架
- 数据库:SQLite
Flask是一个轻量级的Web框架,适合快速开发和部署小型项目。SQLite作为轻量级数据库,能够满足我们初期数据存储的需求。
系统功能
1. 用户注册与登录
用户可以通过注册账号,登录系统,发布和管理自己的旅游攻略。我们使用Flask的认证机制,确保用户信息的安全。
from flask import Flask, render_template, request, redirect, url_for, session
from flask_sqlalchemy import SQLAlchemy
from werkzeug.security import generate_password_hash, check_password_hash
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///travel.db'
app.config['SECRET_KEY'] = 'your_secret_key'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
password_hash = db.Column(db.String(120), nullable=False)
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
hashed_password = generate_password_hash(password)
new_user = User(username=username, password_hash=hashed_password)
db.session.add(new_user)
db.session.commit()
return redirect(url_for('login'))
return render_template('register.html')
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
user = User.query.filter_by(username=username).first()
if user and check_password_hash(user.password_hash, password):
session['user_id'] = user.id
return redirect(url_for('dashboard'))
return render_template('login.html')
2. 攻略发布与管理
用户登录后,可以发布新的旅游攻略,并对已发布的攻略进行编辑和删除。
class Guide(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
content = db.Column(db.Text, nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
@app.route('/dashboard')
def dashboard():
if 'user_id' not in session:
return redirect(url_for('login'))
user_guides = Guide.query.filter_by(user_id=session['user_id']).all()
return render_template('dashboard.html', guides=user_guides)
@app.route('/new_guide', methods=['GET', 'POST'])
def new_guide():
if request.method == 'POST':
title = request.form['title']
content = request.form['content']
new_guide = Guide(title=title, content=content, user_id=session['user_id'])
db.session.add(new_guide)
db.session.commit()
return redirect(url_for('dashboard'))
return render_template('new_guide.html')
@app.route('/edit_guide/<int:guide_id>', methods=['GET', 'POST'])
def edit_guide(guide_id):
guide = Guide.query.get(guide_id)
if request.method == 'POST':
guide.title = request.form['title']
guide.content = request.form['content']
db.session.commit()
return redirect(url_for('dashboard'))
return render_template('edit_guide.html', guide=guide)
@app.route('/delete_guide/<int:guide_id>')
def delete_guide(guide_id):
guide = Guide.query.get(guide_id)
db.session.delete(guide)
db.session.commit()
return redirect(url_for('dashboard'))
3. 攻略展示与搜索
游客可以浏览所有发布的攻略,并通过关键词搜索感兴趣的攻略。
@app.route('/')
def index():
guides = Guide.query.all()
return render_template('index.html', guides=guides)
@app.route('/search')
def search():
query = request.args.get('query')
search_results = Guide.query.filter(Guide.title.contains(query) | Guide.content.contains(query)).all()
return render_template('search