一、引言
在线投票系统是一种常见的Web应用,它允许用户通过互联网参与各种投票活动,如选举、调查问卷等。本项目旨在使用Python语言,结合Flask轻量级Web框架,实现一个简单而功能完备的在线投票系统。该系统支持创建投票、参与投票、查看投票结果等核心功能,同时也注重用户界面的友好性和数据的安全性。
二、技术栈和框架
- 后端:Python 3.8, Flask 2.1.1
- 前端:HTML, CSS, JavaScript, Bootstrap 5
- 数据库:SQLite(开发环境)/PostgreSQL(生产环境)
- 模板引擎:Jinja2
- 表单处理:WTForms
- 安全性:Flask-Security(用户认证和授权)
- API设计:RESTful风格
三、功能模块设计
- 用户管理:用户注册、登录、注销账户,支持管理员角色。
- 投票创建:管理员可以创建投票,包括投票主题、选项、开始和结束时间。
- 参与投票:用户登录后可以查看当前开放的投票,并进行投票。
- 结果展示:投票结束后,展示投票结果,包括各选项得票数及百分比。
- 投票限制:同一用户对同一投票只能投一票,防止重复投票。
- 数据统计:后台管理界面展示投票数据统计,便于分析。
四、系统架构
- 前端:负责展示界面和用户交互,使用Bootstrap框架美化界面。
- 后端:Flask处理HTTP请求,调用业务逻辑,与数据库交互。
- 数据库:存储用户信息、投票信息、投票结果等数据。
- API层:对于需要的数据交互,采用RESTful API设计。
五、数据设计
- users表:用户ID, 用户名, 密码(哈希存储), 角色(普通用户/管理员)。
- votes表:投票ID, 标题, 描述, 开始时间, 结束时间, 创建者ID。
- options表:选项ID, 投票ID, 选项文本。
- votes_record表:记录ID, 用户ID, 投票ID, 选项ID, 投票时间。
六、核心代码展示
后端代码(Flask处理投票创建)
Python
# app.py
from flask import Flask, render_template, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from flask_security import Security, SQLAlchemyUserDatastore, UserMixin, RoleMixin, login_required
app = Flask(__name__)
app.config['SECRET_KEY'] = 'super-secret-key'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
app.config['SECURITY_PASSWORD_SALT'] = 'salt'
db = SQLAlchemy(app)
# 定义User和Role模型,以及UserDatastore
# 省略User和Role模型的定义...
# 创建数据存储
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore)
# 投票模型
class Vote(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
description = db.Column(db.Text)
start_time = db.Column(db.DateTime, nullable=False)
end_time = db.Column(db.DateTime, nullable=False)
creator_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
# 选项模型
class Option(db.Model):
id = db.Column(db.Integer, primary_key=True)
vote_id = db.Column(db.Integer, db.ForeignKey('vote.id'), nullable=False)
text = db.Column(db.String(200), nullable=False)
@app.route('/create_vote', methods=['GET', 'POST'])
@login_required
def create_vote():
if request.method == 'POST':
# 处理表单数据,创建投票和选项
vote = Vote(title=request.form['title'],
description=request.form['description'],
start_time=request.form['start_time'],
end_time=request.form['end_time'],
creator_id=current_user.id)
db.session.add(vote)
db.session.commit()
for option_text in request.form.getlist('options[]'):
option = Option(text=option_text, vote_id=vote.id)
db.session.add(option)
db.session.commit()
return redirect(url_for('index'))
return render_template('create_vote.html')
if __name__ == "__main__":
app.run(debug=True)
前端代码(投票创建表单)
Html
<!-- templates/create_vote.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>创建投票</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
<div class="container mt-5">
<h2>创建投票</h2>
<form method="POST">
<div class="form-group">
<label for="title">投票标题</label>
<input type="text" class="form-control" id="title" name="title" required>
</div>
<!-- 其他表单项省略... -->
<div class="form-group">
<label for="options">选项(按回车添加新选项)</label>
<input type="text" class="form-control mb-2" id="options" name="options[]" required>
<!-- 可以使用JavaScript动态添加更多选项输入框 -->
</div>
<button type="submit" class="btn btn-primary">创建投票</button>
</form>
</div>
</body>
</html>
七、总结
本项目采用Python和Flask框架实现了一个基本的在线投票系统,系统设计涵盖了用户管理、投票创建、参与投票、查看结果等核心功能。通过前后端分离的设计,结合Bootstrap提升用户界面的美观度,以及Flask-Security保证用户数据的安全性。数据库设计确保了数据的有效存储和查询。