目录
1、需求分析 1
1.1系统目标 1
1.2系统功能需求 1
1.3系统的输入输出需求 2
1.4系统的性能需求 2
2、可行性分析 2
2.1 可行性研究前提 2
2.2 要求 3
3、数据库详细设计 4
3.1 概念结构设计 4
3.2 逻辑结构设计 5
3.3 物理结构设计 6
4、实现思路及相关技术 7
4.1 开发条件 7
4.2 系统界面设计 8
4.3 代码设计 14
5、实现要点难点 21
5.1前端页面设计 21
5.2 python语言与数据库的交互 22
6、总结 24
2、可行性分析
2.1 可行性研究前提
随着互联网时代的飞速发展,人们的购物需求也在不断地增长。许多人也因此会产生许多闲置不用的物品,如何处理这些闲置的物品就成为一个难题。实地去二手市场进行买卖不失为一种选择,但是不符合互联网时代的“便捷”。在高校之中,学生们去二手市场进行交易显然是不可行的。因此,设计这样一个二手物品交易发布平台就显得十分必要。
系统要求界面简洁直观,交互方便。能方便管理员管理用户们发布的二手物品交易和用户发表的评论,维护一个干净的平台。对于用户而言,浏览、搜索自己想要的二手物品是必要的功能(包括收藏自己喜爱的物品)。除此之外,用户也应该能够管理自己已经发布的二手物品,可以进行关闭交易、打开交易、撤销交易等操作。
2.2 要求
2.2.1 主要功能
1.用户账户管理:用户可以在网站上自行注册及登录,离开时注销退出。
2.二手物品查询:用户以及管理员都可以在网站首页浏览所有用户发布的未关闭的二手物品,并且通过点击超链接进入查看详情。
3.用户评论管理:进入每一个已发布的未关闭的二手物品交易的详情页面之后,用户可以在下方发表评论。只有管理员可以管理删除这些评论。
4.二手物品管理:只有管理员可以管理所有人发布的二手物品交易,对于用户发布的不符合规范或者长期没有交易成功的物品撤销。
5.二手物品发布:所有非管理员用户均可发布二手物品,填写相应的资料和上传图片后即可发布。
6.搜索功能:可以根据物品名关键字进行搜索,搜索框中输入的字段必须完全包含在物品名称中。
2.2.2 安全性
具有一定的安全性。系统中只有两级权限级别,即普通用户和系统管理员。普通用户的权限仅限于发布物品、管理自己发布的物品、发布评论,系统管理员的权限更大,能够管理所有普通用户发布的物品和所有用户发布的评论。由于权限等级的划分,系统的安全性、稳定性得到了一定地满足。
2.2.3 性能
可以方便快捷地完成二手物品查询,发布等各项操作。有一定的输入数据合法性检查功能,如用户发布物品时上传的物品只能属于规定的格式集合,用户注册时输入的邮箱地址的合法性。
2.2.4 可扩展性
能够适应需求的变化,开发新的功能。数据库表结构清晰,不产生冗余。
from flask import Flask,render_template,url_for,request,redirect,session,g
import config
from extensions import db
from models import User,Item,Comment,Interest
from decorators import login_required
import os
from werkzeug.security import generate_password_hash
UPLOAD_PATH = r'C:\Users\drsy9\PycharmProjects\Q&A_platform\static\images'
def allowfiletype(filename):
type = filename.split('.')[-1]
if type in ['png','jpg','bmp','gif']:
return True
else:
return False
app = Flask(__name__)
app.config.from_object(config)
db.init_app(app)
##首页,展示所有发布了的物品
@app.route('/')
def index():
items = {
'items' : Item.query.filter(Item.isclosed==0).order_by('-create_time').all(),
}
return render_template('index.html',**items)
##登录
@app.route('/login/',methods=['GET','POST'])
def login():
if request.method == 'GET':
return render_template('login.html',somethingwrong=False)
else:
username = request.form.get('username')
password = request.form.get('password')
user = User.query.filter(User.username==username).first()
##用户已经注册
if user and user.checkPassWord(password):
session['user_id'] = user.id
session.permanent = True
return redirect(url_for('index'))
else:
return render_template('login.html',somethingwrong=True)
##注销
@app.route('/logout/')
def logout():
session.clear()
return redirect(url_for('login'))
##注册
@app.route('/regist/',methods=['GET','POST'])
def regist():
if request.method == 'GET':
return render_template('register.html',user_exist=False,password_not_checked=False)
else:
email = request.form.get('email')
username = request.form.get('username')
password1 = request.form.get('password1')
password2 = request.form.get('password2')
rootuser = True if username=='root' else False
#user=False
user = User.query.filter(User.username==username).first()
if user:
return render_template('register.html',user_exist=True,password_not_checked=False)
else:
if password1!=password2:
return render_template('register.html',user_exist=False,password_not_checked=True)
else:
new_user = User(username=username,email=email,password=password1,authority=rootuser)
db.session.add(new_user)
db.session.commit()
return redirect(url_for('login'))
##发布交易
@app.route('/release/',methods=['GET','POST'])
@login_required
def release():
if request.method == 'GET':
return render_template('realease_item.html')
else:
name = request.form.get('item_name')
description = request.form.get('item_description')
price = request.form.get('item_price')
file = request.files.get('file')
if file:
img_name = file.filename
if allowfiletype(img_name):
imgurl = os.path.join(UPLOAD_PATH,img_name)
file.save(imgurl)
else:
imgurl = None
else:
imgurl = None
print(imgurl)
item = Item(name=name,description=description,price=price,imgpath=imgurl)
userid = session.get('user_id')
item.owner = User.query.filter(User.id==userid).first()
db.session.add(item)
db.session.commit()
return redirect(url_for('index'))
##物品详情及评论页面
@app.route('/detail/<itemid>/')
@login_required
def detail(itemid):
user = User.query.filter(User.id==session.get('user_id')).first()
root_user = True if user.authority else False
item = Item.query.filter(Item.id==itemid).first()
if item.imgpath:
item_img_name = item.imgpath.split('\\')[-1]
else:
item_img_name = ''
imgpath = url_for('static',filename='images/{
}'.format(item_img_name))
inter = Interest.query.filter(Interest.userid==session.get('user_id'),Interest.itemid==itemid).first()
if inter:
flag = True
else:
flag = False
contents = {
'item_id':item.id,
'item_name':item.name,
'item_price':item.price,
'item_description':item.description,
'item_owner':item.owner.username,
'item_createtime':item.create_time,
'item_imgpath':imgpath,
'comments':item.comments,
'owner_email':item.owner.email,
'flag':flag,
'rootuser':root_user,
}
return render_template('item_detail.html',**contents)
##在特定物品评论区添加评论
@app.route('/add_comment/',methods=['POST'])
@login_required
def add_comment():
content = request.form.get('content')
comment = Comment(content=content)
ownerid = session.get('user_id')
user = User.query.filter(User.id==ownerid).first()
comment.owner = user
itemid = request.form.get('item-id')
item = Item.query.filter(Item.id==itemid).first()
comment.item = item
db.session.add(comment)
db.session.commit()
return redirect(url_for('detail',itemid=itemid))
##搜索
@app.route('/search/')
@login_required
def search():
q = request.args.get('q')
if q:
items = Item.query.filter(Item.name.contains(q)).order_by('-create_time').all()
else:
items = Item.query.order_by('-create_time').all()
return render_template('index.html',items=items)
##个人中心
@app.route('/usercenter/<target>/')
def usercenter(target):
print(target)
userid = session.get('user_id')
user = User.query.filter(User.id==userid).first()
items = user.items
if target == 'items':
print('target is items')
return render_template('usercenter.html',type='item',items=items,flag=1)
elif target=='profile':
print('target is profile')
##找出用户所有感兴趣的物品
inters = Interest.query.filter(Interest.userid==userid).all()
items_id = []
for inter in inters:
items_id.append(inter.itemid)
interested_items = []
for i in items_id:
item = Item.query.filter(Item.id==i).first()
interested_items.append(item)
return render_template('usercenter.html',user_=user,interested_items=interested_items,type='profile',flag=2)
elif target=='profile_edit':
return render_template('usercenter.html',type='profile_edit',flag=3)
##关闭某个交易
@app.route('/closeitem/<itemid>/')
def closeitem(itemid):
item = Item.query.filter(Item.id==itemid).first()
item.isclosed = 1 ##关闭该物品的交易
db.session.commit()
return redirect(url_for('usercenter',target='items'))
##开放某个交易
@app.route('/openitem/<itemid>/')
def openitem(itemid):
item = Item.query.filter(Item.id==itemid).first()
item.isclosed = 0 ##关闭该物品的交易
db.session.commit()
return redirect(url_for('usercenter',target='items'))
##彻底删除某个交易(用户)
@app.route('/deleteitem/<itemid>')
def deleteitem(itemid):
item = Item.query.filter(Item.id == itemid).first()
comments = item.comments
for comment in comments:
db.session.delete(comment)
db.session.delete(item)
db.session.commit()
return redirect(url_for('usercenter',target='items'))
##修改物品定价
@app.route('/modify/<itemid>/',methods=['POST'])
def modify(itemid):
item = Item.query.filter(Item.id == itemid).first()
new_price = request.form.get('newprice')
item.price = new_price
db.session.commit()
return redirect(url_for('usercenter',target='items'))
##对某个物品感兴趣
@app.route('/interest/<itemid>/')
def interest(itemid):
userid = session.get('user_id')
new_interest = Interest(userid=userid,itemid=itemid)
db.session.add(new_interest)
db.session.commit()
return redirect(url_for('detail',itemid=itemid))
##取消对某个物品的感兴趣
@app.route('/de_interest/<itemid>/')
def de_interest(itemid):
userid = session.get('user_id')
inter = Interest.query.filter(Interest.userid==userid,Interest.itemid==itemid).first()
db.session.delete(inter)
db.session.commit()
return redirect(url_for('detail',itemid=itemid))
##删除某个发布的物品(管理员)
@app.route('/deleteitem_root/<itemid>/')
def deleteitem_root(itemid):
item = Item.query.filter(Item.id==itemid).first()
comments = item.comments
for comment in comments:
db.session.delete(comment)
db.session.delete(item)
db.session.commit()
return redirect(url_for('index'))
##删除评论(管理员)
@app.route('/deletecomment/<commentid>/')
def deletecomment(commentid):
comment = Comment.query.filter(Comment.id==commentid).first()
itemid = comment.itemid
db.session.delete(comment)
db.session.commit()
return redirect(url_for('detail',itemid=itemid))
##修改个人资料
@app.route('/edit_profile/',methods=['POST'])
def edit_profile():
userid = session.get('user_id')
user = User.query.filter(User.id==userid).first()
new_email = request.form.get('new_email')
new_password1 = request.form.get('new_password1')
new_password2 = request.form.get('new_password2')
if new_password1 != new_password2:
return render_template('usercenter.html',type='profile_edit',flag=3,password_wrong=True)
user.email = new_email
user.password = generate_password_hash(new_password1)
db.session.commit()
return redirect(url_for('usercenter',target='profile'))
##上下文处理函数
@app.context_processor
def mycontextprocessor():
userid = session.get('user_id')
##用户已经登录
if userid:
user = User.query.filter(User.id==userid).first()
return {
'user':user.username,'root_user':user.authority}
else:
return {
'root_user':False}
if __name__ == '__main__':
app.run()