翼度科技»论坛 编程开发 python 查看内容

【Python毕业设计】基于Python+Flask+MySQL的学生信息管理系统(附完整源码

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
1、项目说明
基于python+Flask+mysql的学生信息管理系统项目实战
项目需要安装pycharm专业版,mysql数据库以及项目所需的所有模块
创建数据库名称db_online_notes,然后执行sql文件生成数据表和数据
项目需要安装 flask,pymysql以及其他的一些模块
安装命令如下:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 模块名称
如安装flask:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple flask

2、项目主要技术
python编程技术
flask框架技术
mysql数据库技术
html编程
css编程
js编程

3、项目结构
static 项目静态文件存储文件夹(images,css,js)
templates 项目模板文件文件夹(html)
log.txt 错误日志存放文件
forms.py 表单验证对象
mysql_util.py 数据库链接操作
manage.py 项目功能业务逻辑实现(项目入口)

4、项目主要功能
用户登录注册
文章信息的增删改查

5、部分源码
  1. from flask import Flask, render_template, request, redirect, session, jsonify, url_for
  2. from flask_sqlalchemy import SQLAlchemy
  3. from werkzeug.utils import secure_filename
  4. import os,shutil
  5. import random
  6. import json
  7. import pymysql
  8. import logging
  9. import math
  10. from operator import or_
  11. from exts.QueryPaginate import QueryPaginate
  12. app = Flask(__name__,static_folder='')
  13. app.config['DEBUG']=True
  14. #配置session key
  15. app.config['SECRET_KEY'] = '2cf0fa7e-48d9-11e6-93fb-c03fd53413ef'
  16. #SQLAlchemy相关配置
  17. app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:root@localhost:3306/student'
  18. app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
  19. app.config['SQLALCHEMY_ECHO'] = False
  20. # 创建组件对象
  21. db = SQLAlchemy(app)
  22. #**********配置初始系统变量**********
  23. data = {}
  24. data['SYSNAME']='毕业设计 - 学生信息管理系统'
  25. data['DEVURL']='http://www.wwww.com/'
  26. data['DEVNAME']='上海交大'
  27. #**********数据库配置**********
  28. #学生表
  29. class TStudent(db.Model):
  30.     __tablename__ = 't_student'
  31.     id = db.Column(db.Integer, primary_key=True)
  32.     student_no = db.Column(db.String(20))
  33.     student_name = db.Column(db.String(100))
  34.     department_no = db.Column(db.String(20))
  35. #课程表
  36. class TCourse(db.Model):
  37.     __tablename__ = 't_course'
  38.     id = db.Column(db.Integer, primary_key=True)
  39.     course_no = db.Column(db.String(20))
  40.     course_name = db.Column(db.String(100))
  41. #成绩表
  42. class TGrade(db.Model):
  43.     __tablename__ = 't_grade'
  44.     id = db.Column(db.Integer, primary_key=True)
  45.     student_no = db.Column(db.String(20))
  46.     course_no = db.Column(db.String(20))
  47.     grade = db.Column(db.String(10))
  48. #用户表
  49. class TUser(db.Model):
  50.     __tablename__ = 't_user'
  51.     id = db.Column(db.Integer, primary_key=True)
  52.     username = db.Column(db.String(20))
  53.     password = db.Column(db.String(20))
  54.     realname = db.Column(db.String(20))
  55. #学院表
  56. class TDepartment(db.Model):
  57.     __tablename__ = 't_department'
  58.     id = db.Column(db.Integer, primary_key=True)
  59.     department_no = db.Column(db.String(20))
  60.     department_name = db.Column(db.String(20))
  61. #**********路由部分**********
  62. #首页
  63. @app.route('/')
  64. @app.route('/index')
  65. def index():
  66.    
  67.     if(checkSignIn()==False):
  68.         return redirect('/signin')
  69.     studentCount = db.session.query(TStudent).count()
  70.     courseCount = db.session.query(TCourse).count()
  71.     userCount = db.session.query(TUser).count()
  72.     gradeCount = db.session.query(TGrade).count()
  73.     data['studentCount']= studentCount
  74.     data['courseCount']= courseCount
  75.     data['userCount']= studentCount
  76.     data['gradeCount']= gradeCount
  77.     studentData = db.session.query(TStudent,TDepartment).outerjoin(TDepartment, TStudent.department_no==TDepartment.department_no).order_by(TStudent.id.desc()).limit(10).all()
  78.     print(studentData)
  79.     data['studentData']=studentData
  80.     userData = db.session.query(TUser).order_by(TUser.id.desc()).limit(10).all()
  81.     data['userData']=userData
  82.    
  83.     return render_template('index.html', **data)
  84. '''
  85. #首页
  86. @app.route('/index')
  87. def index2():
  88.     if(checkSignIn()==False):
  89.         return redirect('/signin')
  90.     return render_template('index.html', **data)
  91. '''
  92. #用户登录模块
  93. @app.route('/signin',methods=['GET','POST'])
  94. def signin():
  95.     return render_template('sign-in.html',form=data)
  96. #用户退出模块
  97. @app.route('/signout',methods=['GET','POST'])
  98. def signout():
  99.     session.clear()
  100.     #return redirect('/signin')
  101.     return redirect(url_for('signin'))
  102. #用户登录验证
  103. @app.route('/dosignin',methods=['GET','POST'])
  104. def dosignin():
  105.     userName = request.values.get('userName')
  106.     userPass = request.values.get('userPass')
  107.     logging.info(request.remote_addr)#记录日志
  108.     print(request.headers)#头文件
  109.     print(request.remote_addr)#远程IP地址
  110.     user = db.session.query(TUser).filter(TUser.username == userName,
  111.     TUser.password == userPass
  112.     ).first()
  113.     if(user is not None):
  114.         session['userName']=userName
  115.         print(session)        
  116.         return redirect('/')
  117.     else:
  118.         data['errorMessage']='用户名或密码不正确!'
  119.         return render_template('signin.html',form=data)
  120. #用户注册模块
  121. @app.route('/signup',methods=['GET','POST'])
  122. def signup():
  123.    
  124.     return render_template('sign-up.html',form=data)
  125. #学生信息部分开始************************************
  126. #查看列表带分页
  127. @app.route('/students/',methods=['GET','POST'])
  128. def students():
  129.     studentNo = request.form.get('studentNo') if request.form.get('studentNo') is not None else ''
  130.     studentName = request.form.get('studentName') if request.form.get('studentName') is not None else ''
  131.     data['studentNo']=studentNo
  132.     data['studentName']=studentName
  133.    
  134.     page = int(request.form.get('search_page')) if request.form.get('search_page') is not None and request.form.get('search_page') != '0' else 1
  135.     query = db.session.query(TStudent).filter(or_(TStudent.student_no == studentNo, studentNo == ''),
  136.     or_(TStudent.student_name.like('%{0}%'.format(studentName)),studentName == '')
  137.     )
  138.     queryPaginate = QueryPaginate(query,10,page)
  139.     data['currdata']=queryPaginate.items
  140.     data['pagelist']=queryPaginate.iter_pages()
  141.     data['pages']=queryPaginate.pages
  142.     data['page']=queryPaginate.page
  143.     data['per_page']=queryPaginate.per_page
  144.     data['prev_num']=queryPaginate.prev_num
  145.     data['next_num']=queryPaginate.next_num
  146.    
  147.     return render_template('students.html',**data)
  148. #查看单个信息
  149. @app.route('/student/<int:studentid>',methods=['GET','POST'])
  150. def student(studentid):
  151.     data['studentid']=studentid
  152.     currdata = db.session.query(TStudent).filter(TStudent.id==studentid).first()
  153.     data['currdata'] = currdata
  154.     return render_template('student.html',**data)
  155. #编辑单个信息
  156. @app.route('/student/edit/<int:studentid>',methods=['GET'])
  157. def student_edit(studentid):
  158.     currdata = db.session.query(TStudent).filter(TStudent.id==studentid).first()
  159.     print(currdata)
  160.     data['currdata'] = currdata
  161.     return render_template('student_edit.html',**data)
  162. #编辑保存单个信息
  163. @app.route('/student/doedit/',methods=['POST'])
  164. def student_doedit():
  165.     studentid = request.form.get('studentid')
  166.     studentNo = request.form.get('studentNo')
  167.     studentName = request.form.get('studentName')
  168.     update_dict = {}
  169.     if(studentNo is not None):
  170.         update_dict['student_no']=studentNo
  171.     if(studentName is not None):
  172.         update_dict['student_name']=studentName   
  173.     db.session.query(TStudent).filter_by(id=studentid).update(update_dict)
  174.     db.session.commit()
  175.     print(data)
  176.     return redirect(url_for('students'))
  177. #删除单个信息
  178. @app.route('/student/del/<int:studentid>',methods=['GET'])
  179. def student_del(studentid):
  180.     db.session.query(TStudent).filter_by(id=studentid).delete()
  181.     db.session.commit()   
  182.     return redirect(url_for('students'))
  183. #删除单个信息
  184. @app.route('/student/dodel/',methods=['POST'])
  185. def student_dodel(studentid):
  186.    
  187.     db.session.query(TStudent).filter_by(id=studentid).delete()
  188.     db.session.commit()
  189.     return redirect(url_for('students'))
  190. #保存单个信息
  191. @app.route('/student/add',methods=['GET'])
  192. def student_add():
  193.     return render_template('student_add.html',form=data)
  194. #保存单个信息
  195. @app.route('/student/doAdd',methods=['POST'])
  196. def student_doadd():
  197.     studentNo = request.form.get('studentNo')
  198.     studentName = request.form.get('studentName')
  199.     print(request.form)
  200.     student = TStudent(student_no=studentNo,student_name=studentName)
  201.     db.session.add(student)
  202.     db.session.commit()
  203.     return redirect(url_for('students'))
  204. #学生信息部分结束************************************
  205. #课程信息部分开始************************************
  206. #查看列表带分页
  207. @app.route('/courses/',methods=['GET','POST'])
  208. def courses():
  209.     courseNo = request.form.get('courseNo') if request.form.get('courseNo') is not None else ''
  210.     courseName = request.form.get('courseName') if request.form.get('courseName') is not None else ''
  211.     data['courseNo']=courseNo
  212.     data['courseName']=courseName
  213.    
  214.     page = int(request.form.get('search_page')) if request.form.get('search_page') is not None and request.form.get('search_page') != '0' else 1
  215.     query = db.session.query(TCourse).filter(or_(TCourse.course_no == courseNo, courseNo == ''),
  216.     or_(TCourse.course_name.like('%{0}%'.format(courseName)),courseName == '')
  217.     )
  218.     queryPaginate = QueryPaginate(query,10,page)
  219.     data['currdata']=queryPaginate.items
  220.     data['pagelist']=queryPaginate.iter_pages()
  221.     data['pages']=queryPaginate.pages
  222.     data['page']=queryPaginate.page
  223.     data['per_page']=queryPaginate.per_page
  224.     data['prev_num']=queryPaginate.prev_num
  225.     data['next_num']=queryPaginate.next_num
  226.    
  227.     return render_template('courses.html',**data)
  228. #查看单个信息
  229. @app.route('/course/<int:courseid>',methods=['GET','POST'])
  230. def course(courseid):
  231.     data['courseid']=courseid
  232.     currdata = db.session.query(TCourse).filter(TCourse.id==courseid).first()
  233.     data['currdata'] = currdata
  234.     return render_template('course.html',**data)
  235. #编辑单个信息
  236. @app.route('/course/edit/<int:courseid>',methods=['GET'])
  237. def course_edit(courseid):
  238.     currdata = db.session.query(TCourse).filter(TCourse.id==courseid).first()
  239.     print(currdata)
  240.     data['currdata'] = currdata
  241.     return render_template('course_edit.html',**data)
  242. #编辑保存单个信息
  243. @app.route('/course/doedit/',methods=['POST'])
  244. def course_doedit():
  245.     courseid = request.form.get('courseid')
  246.     courseNo = request.form.get('courseNo')
  247.     courseName = request.form.get('courseName')
  248.     update_dict = {}
  249.     if(courseNo is not None):
  250.         update_dict['course_no']=courseNo
  251.     if(courseName is not None):
  252.         update_dict['course_name']=courseName   
  253.     db.session.query(TCourse).filter_by(id=courseid).update(update_dict)
  254.     db.session.commit()
  255.     print(data)
  256.     return redirect(url_for('courses'))
  257. #删除单个信息
  258. @app.route('/course/del/<int:courseid>',methods=['GET'])
  259. def course_del(courseid):
  260.     db.session.query(TCourse).filter_by(id=courseid).delete()
  261.     db.session.commit()   
  262.     return redirect(url_for('courses'))
  263. #删除单个信息
  264. @app.route('/course/dodel/',methods=['POST'])
  265. def course_dodel(courseid):
  266.    
  267.     db.session.query(TCourse).filter_by(id=courseid).delete()
  268.     db.session.commit()
  269.     return redirect(url_for('courses'))
  270. #保存单个信息
  271. @app.route('/course/add',methods=['GET'])
  272. def course_add():
  273.     return render_template('course_add.html',form=data)
  274. #保存单个信息
  275. @app.route('/course/doAdd',methods=['POST'])
  276. def course_doadd():
  277.     courseNo = request.form.get('courseNo')
  278.     courseName = request.form.get('courseName')
  279.     print(request.form)
  280.     course = TCourse(course_no=courseNo,course_name=courseName)
  281.     db.session.add(course)
  282.     db.session.commit()
  283.     return redirect(url_for('courses'))
  284. #课程信息部分结束************************************
  285. #成绩信息部分开始************************************
  286. @app.route('/grades/',methods=['GET','POST'])
  287. def grades():
  288.     studentNo = request.form.get('studentNo') if request.form.get('studentNo') is not None else ''
  289.     studentName = request.form.get('studentName') if request.form.get('studentName') is not None else ''
  290.     courseNo = request.form.get('courseNo') if request.form.get('courseNo') is not None else ''
  291.     courseName = request.form.get('courseName') if request.form.get('courseName') is not None else ''
  292.     data['studentNo']=studentNo
  293.     data['studentName']=studentName
  294.     data['courseNo']=courseNo
  295.     data['courseName']=courseName   
  296.    
  297.     page = int(request.form.get('search_page')) if request.form.get('search_page') is not None and request.form.get('search_page') != '0' else 1
  298.     query = db.session.query(TGrade,TStudent,TCourse).outerjoin(TStudent, TStudent.student_no==TGrade.student_no).outerjoin(TCourse,TCourse.course_no==TGrade.course_no).filter(or_(TCourse.course_no == courseNo, courseNo == ''),
  299.     or_(TCourse.course_name.like('%{0}%'.format(courseName)),courseName == ''),
  300.     or_(TStudent.student_no == studentNo, studentNo == ''),
  301.     or_(TStudent.student_name.like('%{0}%'.format(studentName)),studentName == '')                                                                                                                                                               
  302.     )
  303.     #print(query)
  304.     queryPaginate = QueryPaginate(query,10,page)
  305.     #print(queryPaginate.items)
  306.     data['currdata']=queryPaginate.items
  307.     data['pagelist']=queryPaginate.iter_pages()
  308.     data['pages']=queryPaginate.pages
  309.     data['page']=queryPaginate.page
  310.     data['per_page']=queryPaginate.per_page
  311.     data['prev_num']=queryPaginate.prev_num
  312.     data['next_num']=queryPaginate.next_num
  313.    
  314.     return render_template('grades.html',**data)
  315. #保存单个信息
  316. @app.route('/grade/add',methods=['GET'])
  317. def grade_add():
  318.     studentdata = db.session.query(TStudent).all()
  319.     data['studentdata']=studentdata
  320.    
  321.     coursedata = db.session.query(TCourse).all()
  322.     data['coursedata']=coursedata
  323.     return render_template('grade_add.html',**data)
  324. #保存单个信息
  325. @app.route('/grade/doAdd',methods=['POST'])
  326. def grade_doadd():
  327.     courseNo = request.form.get('courseNo')
  328.     studentNo = request.form.get('studentNo')
  329.     grade = request.form.get('grade')
  330.     grade = TGrade(course_no=courseNo,student_no=studentNo,grade=grade)
  331.     db.session.add(grade)
  332.     db.session.commit()
  333.     return redirect(url_for('grades'))
  334. #删除单个信息
  335. @app.route('/grade/del/<int:gradeid>',methods=['GET'])
  336. def grade_del(gradeid):
  337.     db.session.query(TGrade).filter_by(id=gradeid).delete()
  338.     db.session.commit()   
  339.     return redirect(url_for('grades'))
  340. #成绩信息部分结束************************************
  341. #用户信息部分开始************************************
  342. #查看列表
  343. @app.route('/users',methods=['GET','POST'])
  344. def users():
  345.     userName = request.form.get('userName') if request.form.get('userName') is not None else ''
  346.     realName = request.form.get('realName') if request.form.get('realName') is not None else ''
  347.     data['userName']=userName
  348.     data['realName']=realName   
  349.    
  350.     page = int(request.form.get('search_page')) if request.form.get('search_page') is not None and request.form.get('search_page') != '0' else 1
  351.     query = db.session.query(TUser).filter(or_(TUser.username == userName, userName == ''),
  352.     or_(TUser.realname.like('%{0}%'.format(realName)),realName == '')                                                                                                                                                           
  353.     )
  354.     print(query)
  355.     queryPaginate = QueryPaginate(query,10,page)
  356.     #print(queryPaginate.items)
  357.     data['currdata']=queryPaginate.items
  358.     data['pagelist']=queryPaginate.iter_pages()
  359.     data['pages']=queryPaginate.pages
  360.     data['page']=queryPaginate.page
  361.     data['per_page']=queryPaginate.per_page
  362.     data['prev_num']=queryPaginate.prev_num
  363.     data['next_num']=queryPaginate.next_num
  364.    
  365.     return render_template('users.html',**data)
  366. #查看单个信息
  367. @app.route('/user/<int:userid>',methods=['GET','POST'])
  368. def user(userid):
  369.     data['userid']=userid
  370.     print(data)
  371.     return render_template('user.html',form=data)
  372. #保存单个信息
  373. @app.route('/user/add',methods=['GET'])
  374. def user_add():
  375.     return render_template('user_add.html',**data)
  376. #保存单个信息
  377. @app.route('/user/doAdd',methods=['POST'])
  378. def user_doadd():
  379.     username = request.form.get('username')
  380.     password = request.form.get('password')
  381.     realname = request.form.get('realname')
  382.     user = TUser(username=username,password=password,realname=realname)
  383.     db.session.add(user)
  384.     db.session.commit()
  385.     return redirect(url_for('users'))
  386. #编辑单个信息
  387. @app.route('/user/edit/<int:userid>',methods=['GET'])
  388. def user_edit(userid):
  389.     currdata = db.session.query(TUser).filter(TUser.id==userid).first()
  390.     print(currdata)
  391.     data['currdata'] = currdata
  392.     return render_template('user_edit.html',**data)
  393. #编辑保存单个信息
  394. @app.route('/user/doedit/',methods=['POST'])
  395. def user_doedit():
  396.     userid = request.form.get('userid')
  397.     username = request.form.get('username')
  398.     password = request.form.get('password')
  399.     realname = request.form.get('realname')
  400.     update_dict = {}
  401.     if(username is not None):
  402.         update_dict['username']=username
  403.     if(password is not None):
  404.         update_dict['password']=password
  405.     if(realname is not None):
  406.         update_dict['realname']=realname            
  407.     db.session.query(TUser).filter_by(id=userid).update(update_dict)
  408.     db.session.commit()
  409.     print(data)
  410.     return redirect(url_for('users'))
  411. #删除单个信息
  412. @app.route('/user/del/<int:userid>',methods=['GET'])
  413. def user_del(userid):
  414.     db.session.query(TUser).filter_by(id=userid).delete()
  415.     db.session.commit()   
  416.     return redirect(url_for('users'))
  417. #用户信息部分结束************************************
  418. #用户设置部分结束************************************
  419. #编辑单个信息
  420. @app.route('/user/set/<username>',methods=['GET'])
  421. def user_set(username):
  422.     currdata = db.session.query(TUser).filter(TUser.username==username).first()
  423.     print(currdata)
  424.     data['currdata'] = currdata
  425.     return render_template('user_set.html',**data)
  426. #编辑保存单个信息
  427. @app.route('/user/doset/',methods=['POST'])
  428. def user_doset():
  429.     userid = request.form.get('userid')
  430.     username = request.form.get('username')
  431.     password = request.form.get('password')
  432.     realname = request.form.get('realname')
  433.     update_dict = {}
  434.     if(username is not None):
  435.         update_dict['username']=username
  436.     if(password is not None):
  437.         update_dict['password']=password
  438.     if(realname is not None):
  439.         update_dict['realname']=realname            
  440.     db.session.query(TUser).filter_by(id=userid).update(update_dict)
  441.     db.session.commit()
  442.     print(data)
  443.     return redirect(url_for('users'))
  444. #用户设置部分结束************************************
  445. @app.route('/faq',methods=['GET','POST'])
  446. def faq():
  447.    
  448.     return render_template('faq.html',**data)
  449. @app.route('/help',methods=['GET','POST'])
  450. def help():
  451.    
  452.     return render_template('help.html',**data)
  453. @app.route('/calendar',methods=['GET','POST'])
  454. def calendar():
  455.    
  456.     return render_template('calendar.html',form=data)
  457. @app.route('/media',methods=['GET','POST'])
  458. def media():
  459.    
  460.     return render_template('media.html',**data)
  461. @app.route('/theory',methods=['GET','POST'])
  462. def theory():
  463.    
  464.     return render_template('theory.html',**data)
  465. @app.route('/privacy-policy',methods=['GET','POST'])
  466. def privacypolicy():
  467.    
  468.     return render_template('privacy-policy.html',**data)
  469. @app.route('/terms-and-conditions',methods=['GET','POST'])
  470. def termsandconditions():
  471.    
  472.     return render_template('terms-and-conditions.html',**data)
  473. #系统级报警路由
  474. @app.errorhandler(403)
  475. def error403():
  476.    
  477.     return render_template('403.html',form=data)
  478. @app.errorhandler(404)
  479. def error404(error):
  480.    
  481.     return render_template('404.html',form=data)
  482. @app.errorhandler(500)
  483. def error500():
  484.    
  485.     return render_template('500.html',form=data)
  486. @app.errorhandler(503)
  487. def error503():
  488.    
  489.     return render_template('503.html',form=data)
  490. #**********测试用路由**********
  491. @app.route('/jsontest')
  492. def jsonTest():
  493.    
  494.     jsonStr = '{"name":"张三","age":"33"}'
  495.     jsonData = json.loads(jsonStr)
  496.     print(jsonData['name'])
  497.    
  498.     data={"name":"张三","age":"33"}
  499.     print (json.dumps(data,ensure_ascii=False))
  500.     #return jsonify(data)
  501.     return jsonify(name="张三",age=34)
  502. @app.route('/mysqltest')
  503. def mysqlTest():
  504.     cursor = db.cursor()
  505.     try:
  506.         mySql = "select * from kelly limit 10"
  507.         cursor.execute(mySql)
  508.         data = cursor.fetchall()
  509.     except Exception as e:
  510.         print("Error: ",e)
  511.     return jsonify(data)
  512. #**********方法部分**********
  513. #检测登录状态
  514. def checkSignIn():
  515.     #if(session.get('userName') is None or session.get('userName')==''):
  516.     if('userName' not in session):
  517.         return False
  518.     else:
  519.         return True
  520. #**********通用方法部分**********
  521. if __name__ == "__main__":
  522.     app.run(host='0.0.0.0',debug=False,port=8088)
  523.     #app.run(host='127.0.0.1',debug=False,port=8082)
复制代码
6、运行截图
 

 



 
 


 

 

 
7、项目总结
本项目是一个非常适合练手的项目,对我们的python编程和对flask框架的了解和提升都有很大的帮助,推荐大家学习研究这个项目,搞懂其中的原理流程以及知识点非常关键。
 
资料获取地址:https://item.taobao.com/item.htm?spm=a21dvs.23580594.0.0.4fee3d0dmeAXHu&ft=t&id=713204492149
B站视频讲解地址:
 
注:其他问题请参看视频讲解,都有介绍,一定要认真看完哦!
代码编写、视频录制不易,感谢您的支持,祝您学习愉快!
  

来源:https://www.cnblogs.com/kakasea/p/17330401.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具