├── app ├── templates │ ├── ui │ │ ├── __init__.py │ │ ├── admin_page.html │ │ ├── home_page.html │ │ ├── comment_page.html │ │ └── s_page.html │ ├── __init__.py │ ├── home │ │ ├── __init__.py │ │ ├── 404.html │ │ ├── menu.html │ │ ├── search.html │ │ ├── animation.html │ │ ├── loginlog.html │ │ ├── moviecol.html │ │ ├── login.html │ │ ├── comments.html │ │ ├── pwd.html │ │ ├── layout.html │ │ ├── home.html │ │ ├── register.html │ │ ├── index.html │ │ └── user.html │ └── admin │ │ ├── __init__.py │ │ ├── pwd.html │ │ ├── userloginlog_list.html │ │ ├── adminloginlog_list.html │ │ ├── oplog_list.html │ │ ├── tag_add.html │ │ ├── tag_edit.html │ │ ├── login.html │ │ ├── index.html │ │ ├── tag_list.html │ │ ├── moviecol_list.html │ │ ├── admin_list.html │ │ ├── role_list.html │ │ ├── auth_list.html │ │ ├── auth_add.html │ │ ├── auth_edit.html │ │ ├── preview_list.html │ │ ├── user_view.html │ │ ├── comment_list.html │ │ ├── preview_add.html │ │ ├── preview_edit.html │ │ ├── movie_list.html │ │ ├── role_add.html │ │ ├── role_edit.html │ │ ├── user_list.html │ │ ├── admin_add.html │ │ ├── admin.html │ │ ├── grid.html │ │ ├── movie_add.html │ │ └── movie_edit.html ├── static │ ├── anmi │ │ └── __init__.py │ └── tpl │ │ └── 1-index-animation │ │ ├── main_banner │ │ ├── big0020150102211033.jpg │ │ ├── big0120150101183428.jpg │ │ ├── big0320150101183351.jpg │ │ ├── big0420150101224343.jpg │ │ └── big0720150102210934.jpg │ │ └── css │ │ └── style.css ├── home │ ├── __init__.py │ └── forms.py ├── admin │ └── __init__.py ├── tttt.py ├── __init__.py └── models.py ├── .idea ├── encodings.xml ├── vcs.xml ├── misc.xml ├── modules.xml └── movie.iml ├── manage.py ├── app.py └── README.md /app/templates/ui/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/static/anmi/__init__.py: -------------------------------------------------------------------------------- 1 | #!/user/bin/python 2 | # -*- coding:utf-8 -*- 3 | # @Time: 2018/9/1 9:32 4 | # @Author: Envse 5 | # @File: __init__.py.py -------------------------------------------------------------------------------- /app/templates/__init__.py: -------------------------------------------------------------------------------- 1 | #!/user/bin/python 2 | # -*- coding:utf-8 -*- 3 | # @Time: 2018/8/29 21:21 4 | # @Author: Envse 5 | # @File: __init__.py.py -------------------------------------------------------------------------------- /app/templates/home/__init__.py: -------------------------------------------------------------------------------- 1 | #!/user/bin/python 2 | # -*- coding:utf-8 -*- 3 | # @Time: 2018/8/29 21:21 4 | # @Author: Envse 5 | # @File: __init__.py.py -------------------------------------------------------------------------------- /app/templates/admin/__init__.py: -------------------------------------------------------------------------------- 1 | #!/user/bin/python 2 | # -*- coding:utf-8 -*- 3 | # @Time: 2018/8/29 21:22 4 | # @Author: Envse 5 | # @File: __init__.py.py -------------------------------------------------------------------------------- /app/static/tpl/1-index-animation/main_banner/big0020150102211033.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gutsyzhan/movie/HEAD/app/static/tpl/1-index-animation/main_banner/big0020150102211033.jpg -------------------------------------------------------------------------------- /app/static/tpl/1-index-animation/main_banner/big0120150101183428.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gutsyzhan/movie/HEAD/app/static/tpl/1-index-animation/main_banner/big0120150101183428.jpg -------------------------------------------------------------------------------- /app/static/tpl/1-index-animation/main_banner/big0320150101183351.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gutsyzhan/movie/HEAD/app/static/tpl/1-index-animation/main_banner/big0320150101183351.jpg -------------------------------------------------------------------------------- /app/static/tpl/1-index-animation/main_banner/big0420150101224343.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gutsyzhan/movie/HEAD/app/static/tpl/1-index-animation/main_banner/big0420150101224343.jpg -------------------------------------------------------------------------------- /app/static/tpl/1-index-animation/main_banner/big0720150102210934.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gutsyzhan/movie/HEAD/app/static/tpl/1-index-animation/main_banner/big0720150102210934.jpg -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/user/bin/python 2 | # -*- coding:utf-8 -*- 3 | # @Time: 2018/8/29 21:14 4 | # @Author: Envse 5 | # @File: manage.py 6 | 7 | 8 | from app import app 9 | if __name__ == '__main__': 10 | app.run() -------------------------------------------------------------------------------- /app/home/__init__.py: -------------------------------------------------------------------------------- 1 | #!/user/bin/python 2 | # -*- coding:utf-8 -*- 3 | # @Time: 2018/8/29 21:17 4 | # @Author: Envse 5 | # @File: __init__.py.py 6 | 7 | 8 | from flask import Blueprint 9 | home = Blueprint("home", __name__) 10 | import app.home.views -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | # from flask import Flask 2 | # 3 | # app = Flask(__name__) 4 | # 5 | # 6 | # @app.route('/') 7 | # def hello_world(): 8 | # return '

Hello World!

' 9 | # 10 | # 11 | # if __name__ == '__main__': 12 | # app.run() 13 | -------------------------------------------------------------------------------- /app/admin/__init__.py: -------------------------------------------------------------------------------- 1 | #!/user/bin/python 2 | # -*- coding:utf-8 -*- 3 | # @Time: 2018/8/29 21:17 4 | # @Author: Envse 5 | # @File: __init__.py.py 6 | 7 | 8 | from flask import Blueprint 9 | admin = Blueprint("admin", __name__) 10 | import app.admin.views -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/tttt.py: -------------------------------------------------------------------------------- 1 | # 2 | # 3 | # from werkzeug.security import generate_password_hash 4 | # 5 | # print(generate_password_hash('1242')) 6 | 7 | import uuid 8 | 9 | a = [(1, " 你好"), (2, "不错"), (3, "加油")] 10 | l=[] 11 | for x in a: 12 | print(x[0], type(x[0])) 13 | l.append(x[0]) 14 | print(l, type(l)) 15 | print("***************************") 16 | # list(map(lambda x:x[0])for x in a) 17 | print(list(map(lambda x:x[0],[(1, " 你好"), (2, "不错"), (3, "加油")]))) 18 | 19 | print(list(map(lambda x:x[0],form.auths.choices))) 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 项目介绍 2 | 利用flask搭建微电影视频网站 3 | # 开发环境 4 | Python3.6. + Flask1.0 + Virtualenv + Mysql + Dplayer.js 5 | # 演示地址 6 | 请在浏览器地址栏输入:http://movie.kenbings.top 7 | # 快速运行 8 | 如果你的机器上只安装了Python3,那么命令如下: 9 | ``` 10 | $ git clone https://github.com/kenbings/movie.git 11 | $ cd movie 12 | $ pip install -r requirements.txt 13 | $ python manage.py runserver 14 | ``` 15 | 如果Python2与Python3兼有,请使用下面的命令: 16 | ``` 17 | $ git clone https://github.com/kenbings/movie.git 18 | $ cd movie 19 | $ pip3 install -r requirements.txt 20 | $ python3 manage.py runserver 21 | ``` 22 | 然后在浏览器地址输入:http://127.0.0.1:5000 23 | # 版本更新 24 | 2018.9.12 上传修复好的代码,同时由于弹幕播放器代码有点bug还未修复,因此仍使用jwplayer.js播放器~~ 25 | -------------------------------------------------------------------------------- /.idea/movie.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 15 | 16 | 17 | 19 | -------------------------------------------------------------------------------- /app/templates/home/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 消失在宇宙星空中的404页面 6 | 7 | 8 | 9 | 10 |
11 | 12 |
13 |

迷失在太空中!

14 |

返回首页

15 |
16 | 17 |
18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/templates/home/menu.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |  会员中心 5 | 6 | 7 |  修改密码 8 | 9 | 10 |  评论记录 11 | 12 | 13 |  登录日志 14 | 15 | 16 |  收藏电影 17 | 18 |
19 |
-------------------------------------------------------------------------------- /app/__init__.py: -------------------------------------------------------------------------------- 1 | #!/user/bin/python 2 | # -*- coding:utf-8 -*- 3 | # @Time: 2018/8/29 21:15 4 | # @Author: Envse 5 | # @File: __init__.py.py 6 | 7 | 8 | from flask import Flask, render_template 9 | from flask_sqlalchemy import SQLAlchemy 10 | import mysql.connector 11 | import os 12 | from flask_redis import FlaskRedis 13 | 14 | app = Flask(__name__) 15 | app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+mysqlconnector://root:root@127.0.0.5/movie" 16 | app.config["SQLALCHEMY_TRACK_MODIFICATIONS "] = True 17 | app.config["REDIS_URL"] = "redis://192.168.232.1:6379/0" 18 | app.config["SECRET_KEY"] = "movie_licheetools_top" 19 | app.config["UP_DIR"] = os.path.join(os.path.abspath(os.path.dirname(__file__)), "static/uploads/") 20 | app.config["FC_DIR"] = os.path.join(os.path.abspath(os.path.dirname(__file__)), "static/uploads/users/") 21 | 22 | rd = FlaskRedis(app) 23 | app.debug = True 24 | db = SQLAlchemy(app) 25 | 26 | from app.home import home as home_blueprint 27 | from app.admin import admin as admin_blueprint 28 | 29 | app.register_blueprint(home_blueprint) 30 | app.register_blueprint(admin_blueprint, url_prefix="/admin") 31 | 32 | 33 | # 404页面 34 | @app.errorhandler(404) 35 | def page_not_found(error): 36 | return render_template("home/404.html"), 404 37 | -------------------------------------------------------------------------------- /app/templates/ui/admin_page.html: -------------------------------------------------------------------------------- 1 | {% macro page(data,url) -%} 2 | {% if data %} 3 | 30 | {% endif %} 31 | {%- endmacro %} -------------------------------------------------------------------------------- /app/templates/ui/home_page.html: -------------------------------------------------------------------------------- 1 | {% macro page(data,url) -%} 2 | {% if data %} 3 | 32 | {% endif %} 33 | {%- endmacro %} -------------------------------------------------------------------------------- /app/templates/ui/comment_page.html: -------------------------------------------------------------------------------- 1 | {% macro page(data,url,id) -%} 2 | {% if data %} 3 | 32 | {% endif %} 33 | {%- endmacro %} -------------------------------------------------------------------------------- /app/templates/ui/s_page.html: -------------------------------------------------------------------------------- 1 | {% macro page(data,url) -%} 2 | {% if data %} 3 | 32 | {% endif %} 33 | {%- endmacro %} -------------------------------------------------------------------------------- /app/templates/home/search.html: -------------------------------------------------------------------------------- 1 | {% extends "home/home.html" %} 2 | {% import "ui/s_page.html" as pg %} 3 | 4 | {% block content %} 5 |
6 |
7 | 10 |
11 |
12 | {% for v in page_data.items %} 13 |
14 |
15 | 16 | {{ v.title }} 18 | 19 |
20 |
21 |

{{ v.title }}播放影片

24 | {{ v.info }} 25 |
26 |
27 | {% endfor %} 28 |
29 |
30 | {{ pg.page(page_data, "home.search") }} 31 |
32 |
33 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/home/animation.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 热映电影 6 | 7 | 8 | 9 | 10 |
11 |
12 | 13 |
14 | 17 | 20 |
    21 | {% for v in data %} 22 |
  • 23 | 24 | 25 |

    {{ v.title }}

    26 |
  • 27 | {% endfor %} 28 |
29 | 30 |

31 | 32 |
33 | 34 |
35 | 36 |
37 |
38 | 39 |
40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /app/templates/home/loginlog.html: -------------------------------------------------------------------------------- 1 | {% extends "home/home.html" %} 2 | {% import "ui/home_page.html" as pg %} 3 | 4 | 5 | {% block css %} 6 | 21 | {% endblock %} 22 | 23 | {% block content %} 24 | {% include "home/menu.html" %} 25 | 26 |
27 |
28 |
29 |

 登录日志

30 |
31 |
32 | 33 | 34 | 35 | 36 | 37 | 38 | {% for v in page_data.items %} 39 | 40 | 41 | 42 | 43 | 44 | {% endfor %} 45 |
编号登录时间登录IP
{{ v.id }}{{ v.addtime }}{{ v.ip }}
46 | 49 |
50 |
51 |
52 | {% endblock %} 53 | {% block js %} 54 | 59 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/admin/pwd.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | 3 | {% block content %} 4 | 5 |
6 |

微电影管理系统

7 | 11 |
12 |
13 |
14 |
15 |
16 |
17 |

修改密码

18 |
19 |
20 |
21 |
22 | 23 | 24 | {{ form.old_pwd }} 25 | 26 | {% for err in form.old_pwd.errors %} 27 |
28 |

{{ err }}

29 |
30 | {% endfor %} 31 |
32 |
33 | 34 | 35 | {{ form.new_pwd }} 36 | 37 | {% for err in form.new_pwd.errors %} 38 |
39 |

{{ err }}

40 |
41 | {% endfor %} 42 | 43 |
44 |
45 | 50 |
51 |
52 |
53 |
54 |
55 | 56 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/admin/userloginlog_list.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | {% import "ui/admin_page.html" as pg %} 3 | 4 | {% block content %} 5 | 6 |
7 |

拾光电影管理系统

8 | 12 |
13 |
14 |
15 |
16 |
17 |
18 |

会员登录日志列表

19 |
20 |
21 | 23 | 24 |
25 | 27 |
28 |
29 |
30 |
31 |
32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | {% for v in page_data.items %} 41 | 42 | 43 | 44 | 45 | 46 | 47 | {% endfor %} 48 | 49 |
编号会员登录时间登录IP
{{ v.id }}{{ v.user.name }}{{ v.addtime }}{{ v.ip }}
50 |
51 | 54 |
55 |
56 |
57 |
58 | 59 | {% endblock %} 60 | 61 | {% block js %} 62 | 68 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/admin/adminloginlog_list.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | {% import "ui/admin_page.html" as pg %} 3 | 4 | {% block content %} 5 | 6 |
7 |

拾光电影管理系统

8 | 12 |
13 |
14 |
15 |
16 |
17 |
18 |

管理员登录日志列表

19 |
20 |
21 | 23 | 24 |
25 | 27 |
28 |
29 |
30 |
31 |
32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | {% for v in page_data.items %} 41 | 42 | 43 | 44 | 45 | 46 | 47 | {% endfor %} 48 | 49 |
编号管理员登录时间登录IP
{{ v.id }}{{ v.admin.name }}{{ v.addtime }}{{ v.ip }}
50 |
51 | 54 |
55 |
56 |
57 |
58 | 59 | {% endblock %} 60 | 61 | {% block js %} 62 | 68 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/home/moviecol.html: -------------------------------------------------------------------------------- 1 | {% extends "home/home.html" %} 2 | {% import "ui/home_page.html" as pg %} 3 | 4 | {% block css %} 5 | 20 | {% endblock %} 21 | 22 | {% block content %} 23 | {% include "home/menu.html" %} 24 | 25 |
26 |
27 |
28 |

 收藏电影

29 |
30 |
31 |
32 | {% for v in page_data.items %} 33 |
34 |
35 | 36 | {{ v.movie.title }} 37 | 38 |
39 |
40 |

{{ v.movie.title }}播放影片

43 | {{ v.movie.info }} 44 |
45 |
46 | {% endfor %} 47 |
48 |
49 | {{ pg.page(page_data, "home.moviecol") }} 50 |
51 |
52 |
53 |
54 | {% endblock %} 55 | {% block js %} 56 | 61 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/admin/oplog_list.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | {% import "ui/admin_page.html" as pg %} 3 | 4 | {% block content %} 5 | 6 |
7 |

拾光电影管理系统

8 | 12 |
13 |
14 |
15 |
16 |
17 |
18 |

操作日志列表

19 |
20 |
21 | 23 | 24 |
25 | 27 |
28 |
29 |
30 |
31 |
32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | {% for v in page_data.items %} 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | {% endfor %} 50 | 51 |
编号管理员操作时间操作原因操作IP
{{ v.id }}{{ v.admin.name }}{{ v.addtime }}{{ v.reason }}{{ v.ip }}
52 |
53 | 56 |
57 |
58 |
59 |
60 | 61 | {% endblock %} 62 | 63 | {% block js %} 64 | 70 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/home/login.html: -------------------------------------------------------------------------------- 1 | {% extends 'home/home.html' %} 2 | {% block content %} 3 |
4 |
5 |
6 |
7 |

 会员登录

8 |
9 |
10 | 11 | {% for msg in get_flashed_messages(category_filter=["err"]) %} 12 |
13 | 15 |

操作失败

16 | {{ msg }} 17 |
18 | {% endfor %} 19 | 20 | {% for msg in get_flashed_messages(category_filter=["ok"]) %} 21 |
22 | 24 |

操作成功

25 | {{ msg }} 26 |
27 | {% endfor %} 28 | 29 |
30 |
31 |
32 | 33 | 34 | {{ form.name }} 35 | {% for err in form.name.errors %} 36 |
{{ err }}
37 | {% endfor %} 38 |
39 |
40 | 41 | 42 | {{ form.pwd }} 43 | {% for err in form.pwd.errors %} 44 |
{{ err }}
45 | {% endfor %} 46 |
47 | 48 | {{ form.csrf_token }} 49 | {{ form.submit }} 50 |
51 |
52 |
53 |
54 |
55 |
56 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/admin/tag_add.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | 3 | {% block content %} 4 | 5 |
6 |

拾光电影管理系统

7 | 11 |
12 |
13 |
14 |
15 |
16 |
17 |

添加标签

18 |
19 |
20 |
21 | {% for msg in get_flashed_messages(category_filter=["ok"]) %} 22 |
23 | 25 |

操作成功

26 | {{ msg }} 27 |
28 | {% endfor %} 29 | 30 | {% for msg in get_flashed_messages(category_filter=["err"]) %} 31 |
32 | 34 |

操作失败

35 | {{ msg }} 36 |
37 | {% endfor %} 38 | 39 | 40 |
41 | 42 | {{ form.name }} 43 | {% for err in form.name.errors %} 44 |
45 |

{{ err }}

46 |
47 | {% endfor %} 48 |
49 |
50 | 54 |
55 |
56 |
57 |
58 |
59 | 60 | {% endblock %} 61 | 62 | {% block js %} 63 | 69 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/admin/tag_edit.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | 3 | {% block content %} 4 | 5 |
6 |

拾光电影管理系统

7 | 11 |
12 |
13 |
14 |
15 |
16 |
17 |

修改标签

18 |
19 |
20 |
21 | {% for msg in get_flashed_messages(category_filter=["ok"]) %} 22 |
23 | 25 |

操作成功

26 | {{ msg }} 27 |
28 | {% endfor %} 29 | 30 | {% for msg in get_flashed_messages(category_filter=["err"]) %} 31 |
32 | 34 |

操作失败

35 | {{ msg }} 36 |
37 | {% endfor %} 38 | 39 | 40 |
41 | 42 | {{ form.name(value=tag.name) }} 43 | 44 | {% for err in form.name.errors %} 45 |
46 |

{{ err }}

47 |
48 | {% endfor %} 49 |
50 |
51 | 55 |
56 |
57 |
58 |
59 |
60 | 61 | {% endblock %} 62 | 63 | {% block js %} 64 | 70 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/admin/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 拾光电影管理系统 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 20 |
21 | {% for msg in get_flashed_messages(category_filter=["err"]) %} 22 |
23 | 25 |

操作失败

26 | {{ msg }} 27 |
28 | {% endfor %} 29 | 30 | {% for msg in get_flashed_messages(category_filter=["ok"]) %} 31 |
32 | 34 |

操作成功

35 | {{ msg }} 36 |
37 | {% endfor %} 38 | 39 | 40 |
41 |
42 | {{ form.account }} 43 | 44 | {% for err in form.account.errors %} 45 |
46 |

{{ err }}

47 |
48 | {% endfor %} 49 |
50 |
51 | {{ form.pwd }} 52 | 53 | {% for err in form.pwd.errors %} 54 |
55 |

{{ err }}

56 |
57 | {% endfor %} 58 |
59 |
60 |
61 |
62 |
63 | {{ form.csrf_token }} 64 | {{ form.submit }} 65 |
66 |
67 |
68 |
69 |
70 | 71 | 72 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /app/templates/admin/index.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | 3 | {% block content %} 4 | 5 |
6 |

拾光电影管理系统

7 | 11 |
12 |
13 |
14 |
15 |
16 |
17 |

内存使用率

18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |

系统设置

26 |
27 |
28 |
29 |
30 | 31 | 33 |
34 |
35 | 36 | 38 |
39 |
40 | 41 | 43 |
44 |
45 | 46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 | 54 | {% endblock %} 55 | 56 | {% block js %} 57 | 58 | 89 | 95 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/admin/tag_list.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | {% import "ui/admin_page.html" as pg %} 3 | 4 | {% block content %} 5 | 6 |
7 |

拾光电影管理系统

8 | 12 |
13 |
14 |
15 |
16 |
17 |
18 |

标签列表

19 |
20 |
21 | 23 | 24 |
25 | 27 |
28 |
29 |
30 |
31 |
32 | {% for msg in get_flashed_messages(category_filter=["ok"]) %} 33 |
34 | 36 |

操作成功

37 | {{ msg }} 38 |
39 | {% endfor %} 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | {% for v in page_data.items %} 49 | 50 | 51 | 52 | 53 | 58 | 59 | {% endfor %} 60 | 61 |
编号名称添加时间操作事项
{{ v.id }}{{ v.name }}{{ v.addtime }} 54 | 编辑 55 |   56 | 删除 57 |
62 |
63 | 66 |
67 |
68 |
69 |
70 | 71 | {% endblock %} 72 | 73 | {% block js %} 74 | 80 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/admin/moviecol_list.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | {% import "ui/admin_page.html" as pg %} 3 | 4 | {% block content %} 5 | 6 |
7 |

拾光电影管理系统

8 | 12 |
13 |
14 |
15 |
16 |
17 |
18 |

收藏列表

19 |
20 |
21 | 23 | 24 |
25 | 27 |
28 |
29 |
30 |
31 |
32 | 33 | {% for msg in get_flashed_messages(category_filter=["ok"]) %} 34 |
35 | 37 |

操作成功

38 | {{ msg }} 39 |
40 | {% endfor %} 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | {% for v in page_data.items %} 52 | 53 | 54 | 55 | 56 | 57 | 61 | 62 | {% endfor %} 63 | 64 |
编号电影用户添加时间操作事项
{{ v.id }}{{ v.movie.title }}{{ v.user.name }}{{ v.addtime }} 58 |   59 | 删除 60 |
65 |
66 | 69 |
70 |
71 |
72 |
73 | 74 | {% endblock %} 75 | 76 | {% block js %} 77 | 83 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/admin/admin_list.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | {% import "ui/admin_page.html" as pg %} 3 | 4 | 5 | {% block content %} 6 | 7 |
8 |

拾光电影管理系统

9 | 13 |
14 |
15 |
16 |
17 |
18 |
19 |

管理员列表

20 |
21 |
22 | 24 | 25 |
26 | 28 |
29 |
30 |
31 |
32 |
33 | 34 | {% for msg in get_flashed_messages(category_filter=["ok"]) %} 35 |
36 | 38 |

操作成功

39 | {{ msg }} 40 |
41 | {% endfor %} 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | {% for v in page_data.items %} 53 | 54 | 55 | 56 | {% if v.is_super ==0 %} 57 | 58 | {% else %} 59 | 60 | {% endif %} 61 | 62 | 63 | 64 | {% endfor %} 65 | 66 |
编号管理员名称管理员类型管理员角色添加时间
{{ v.id }}{{ v.name }}超级管理员普通管理员{{ v.role.name }}{{ v.addtime }}
67 |
68 | 71 |
72 |
73 |
74 |
75 | 76 | {% endblock %} 77 | 78 | {% block js %} 79 | 85 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/admin/role_list.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | {% import "ui/admin_page.html" as pg %} 3 | 4 | {% block content %} 5 | 6 |
7 |

拾光电影管理系统

8 | 12 |
13 |
14 |
15 |
16 |
17 |
18 |

角色列表

19 |
20 |
21 | 23 | 24 |
25 | 27 |
28 |
29 |
30 |
31 |
32 | 33 | 34 | {% for msg in get_flashed_messages(category_filter=["ok"]) %} 35 |
36 | 38 |

操作成功

39 | {{ msg }} 40 |
41 | {% endfor %} 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | {% for v in page_data.items %} 53 | 54 | 55 | 56 | 57 | 62 | 63 | {% endfor %} 64 | 65 |
编号角色名称添加时间操作事项
{{ v.id }}{{ v.name }}{{ v.addtime }} 58 | 编辑 59 |   60 | 删除 61 |
66 |
67 | 70 |
71 |
72 |
73 |
74 | 75 | {% endblock %} 76 | 77 | {% block js %} 78 | 84 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/home/comments.html: -------------------------------------------------------------------------------- 1 | {% extends "home/home.html" %} 2 | {% import "ui/comment_page.html" as pg %} 3 | 4 | 5 | {% block css %} 6 | 21 | {% endblock %} 22 | 23 | {% block content %} 24 | {% include "home/menu.html" %} 25 | 26 |
27 |
28 |
29 |

 评论记录

30 |
31 |
32 | 66 |
67 | {{ pg.page(page_data, "home.comments") }} 68 |
69 |
70 |
71 |
72 | {% endblock %} 73 | {% block js %} 74 | 79 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/admin/auth_list.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | {% import "ui/admin_page.html" as pg %} 3 | 4 | {% block content %} 5 | 6 |
7 |

拾光电影管理系统

8 | 12 |
13 |
14 |
15 |
16 |
17 |
18 |

权限列表

19 |
20 |
21 | 23 | 24 |
25 | 27 |
28 |
29 |
30 |
31 |
32 | 33 | {% for msg in get_flashed_messages(category_filter=["ok"]) %} 34 |
35 | 37 |

操作成功

38 | {{ msg }} 39 |
40 | {% endfor %} 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | {% for v in page_data.items %} 52 | 53 | 54 | 55 | 56 | 57 | 62 | 63 | {% endfor %} 64 | 65 |
编号名称地址添加时间操作事项
{{ v.id }}{{ v.name }}{{ v.url }}{{ v.addtime }} 58 | 编辑 59 |   60 | 删除 61 |
66 |
67 | 70 |
71 |
72 |
73 |
74 | 75 | {% endblock %} 76 | 77 | {% block js %} 78 | 84 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/admin/auth_add.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | 3 | {% block content %} 4 | 5 |
6 |

拾光电影管理系统

7 | 11 |
12 |
13 |
14 |
15 |
16 |
17 |

添加权限

18 |
19 |
20 |
21 | 22 | {% for msg in get_flashed_messages(category_filter=["ok"]) %} 23 |
24 | 26 |

操作成功

27 | {{ msg }} 28 |
29 | {% endfor %} 30 | 31 | {% for msg in get_flashed_messages(category_filter=["err"]) %} 32 |
33 | 35 |

操作失败

36 | {{ msg }} 37 |
38 | {% endfor %} 39 | 40 |
41 | 42 | 43 | {{ form.name }} 44 | {% for err in form.name.errors %} 45 |
46 |

{{ err }}

47 |
48 | {% endfor %} 49 |
50 |
51 | 52 | 53 | {{ form.url }} 54 | {% for err in form.url.errors %} 55 |
56 |

{{ err }}

57 |
58 | {% endfor %} 59 |
60 |
61 | 66 |
67 |
68 |
69 |
70 |
71 | 72 | {% endblock %} 73 | 74 | {% block js %} 75 | 81 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/admin/auth_edit.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | 3 | {% block content %} 4 | 5 |
6 |

拾光电影管理系统

7 | 11 |
12 |
13 |
14 |
15 |
16 |
17 |

编辑权限

18 |
19 |
20 |
21 | 22 | {% for msg in get_flashed_messages(category_filter=["ok"]) %} 23 |
24 | 26 |

操作成功

27 | {{ msg }} 28 |
29 | {% endfor %} 30 | 31 | {% for msg in get_flashed_messages(category_filter=["err"]) %} 32 |
33 | 35 |

操作失败

36 | {{ msg }} 37 |
38 | {% endfor %} 39 | 40 |
41 | 42 | 43 | {{ form.name(value=auth.name) }} 44 | {% for err in form.name.errors %} 45 |
46 |

{{ err }}

47 |
48 | {% endfor %} 49 |
50 |
51 | 52 | 53 | {{ form.url(value=auth.url) }} 54 | {% for err in form.url.errors %} 55 |
56 |

{{ err }}

57 |
58 | {% endfor %} 59 |
60 |
61 | 66 |
67 |
68 |
69 |
70 |
71 | 72 | {% endblock %} 73 | 74 | {% block js %} 75 | 81 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/admin/preview_list.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | {% import "ui/admin_page.html" as pg %} 3 | 4 | {% block content %} 5 | 6 |
7 |

拾光电影管理系统

8 | 12 |
13 |
14 |
15 |
16 |
17 |
18 |

预告列表

19 |
20 |
21 | 23 | 24 |
25 | 27 |
28 |
29 |
30 |
31 |
32 | 33 | {% for msg in get_flashed_messages(category_filter=["ok"]) %} 34 |
35 | 37 |

操作成功

38 | {{ msg }} 39 |
40 | {% endfor %} 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | {% for v in page_data.items %} 52 | 53 | 54 | 55 | 58 | 59 | 64 | 65 | {% endfor %} 66 | 67 |
编号预告标题预告封面添加时间操作事项
{{ v.id }}{{ v.title }} 56 | 57 | {{ v.addtime }} 60 | 编辑 61 |   62 | 删除 63 |
68 |
69 | 72 |
73 |
74 |
75 |
76 | 77 | {% endblock %} 78 | 79 | {% block js %} 80 | 86 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/admin/user_view.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | 3 | {% block css %} 4 | 13 | {% endblock %} 14 | {% block content %} 15 | 16 |
17 |

拾光电影管理系统

18 | 22 |
23 |
24 |
25 |
26 |
27 |
28 |

会员详情

29 |
30 |
31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 61 | 62 | 63 | 64 | 67 | 68 | 69 | 70 | 73 | 74 | 75 | 76 | 79 | 80 | 81 |
编号:{{ user.id }}
昵称:{{ user.name }}
邮箱:{{ user.email }}
手机:{{ user.phone }}
头像: 52 | {% if user.face %} 53 | 55 | {% else %} 56 | 58 | 59 | {% endif %} 60 |
注册时间: 65 | {{ user.addtime }} 66 |
唯一标志符: 71 | {{ user.uuid }} 72 |
个性简介: 77 | {{ user.info }} 78 |
82 |
83 |
84 |
85 |
86 |
87 | 88 | {% endblock %} 89 | 90 | {% block js %} 91 | 97 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/admin/comment_list.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | {% import "ui/admin_page.html" as pg %} 3 | 4 | {% block content %} 5 | 6 |
7 |

拾光电影管理系统

8 | 12 |
13 |
14 |
15 |
16 |
17 |
18 |

评论列表

19 |
20 |
21 | 23 | 24 |
25 | 27 |
28 |
29 |
30 |
31 |
32 | 33 | {% for msg in get_flashed_messages(category_filter=["ok"]) %} 34 |
35 | 37 |

操作成功

38 | {{ msg }} 39 |
40 | {% endfor %} 41 | 42 | 43 | {% for v in page_data.items %} 44 |
45 | {% if v.user.face %} 46 | User Image 49 | {% else %} 50 | User Image 52 | {% endif %} 53 |
54 | 55 | {{ v.user.name }} 56 | 57 | 58 |   59 | {{ v.addtime }} 60 | 61 | 62 | 关于电影{{ v.movie.title }}的评论:{{ v.content|safe }} 63 |
删除 64 |
65 |
66 | 67 | {% endfor %} 68 |
69 | 72 |
73 |
74 |
75 |
76 | 77 | {% endblock %} 78 | 79 | {% block js %} 80 | 86 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/admin/preview_add.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | 3 | {% block content %} 4 | 5 |
6 |

拾光电影管理系统

7 | 11 |
12 |
13 |
14 |
15 |
16 |
17 |

添加预告

18 |
19 |
20 |
21 | 22 | {% for msg in get_flashed_messages(category_filter=["ok"]) %} 23 |
24 | 26 |

操作成功

27 | {{ msg }} 28 |
29 | {% endfor %} 30 | 31 | {% for msg in get_flashed_messages(category_filter=["err"]) %} 32 |
33 | 35 |

操作失败

36 | {{ msg }} 37 |
38 | {% endfor %} 39 | 40 |
41 | 42 | 43 | {{ form.title }} 44 | {% for err in form.title.errors %} 45 |
46 |

{{ err }}

47 |
48 | {% endfor %} 49 |
50 |
51 | 52 | 53 | {{ form.logo }} 54 | {% for err in form.logo.errors %} 55 |
56 |

{{ err }}

57 |
58 | {% endfor %} 59 | 61 |
62 |
63 | 68 |
69 |
70 |
71 |
72 |
73 | 74 | {% endblock %} 75 | 76 | {% block js %} 77 | 83 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/admin/preview_edit.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | 3 | {% block content %} 4 | 5 |
6 |

拾光电影管理系统

7 | 11 |
12 |
13 |
14 |
15 |
16 |
17 |

编辑预告

18 |
19 |
20 |
21 | 22 | {% for msg in get_flashed_messages(category_filter=["ok"]) %} 23 |
24 | 26 |

操作成功

27 | {{ msg }} 28 |
29 | {% endfor %} 30 | 31 | {% for msg in get_flashed_messages(category_filter=["err"]) %} 32 |
33 | 35 |

操作失败

36 | {{ msg }} 37 |
38 | {% endfor %} 39 | 40 |
41 | 42 | 43 | {{ form.title }} 44 | {% for err in form.title.errors %} 45 |
46 |

{{ err }}

47 |
48 | {% endfor %} 49 |
50 |
51 | 52 | 53 | {{ form.logo }} 54 | {% for err in form.logo.errors %} 55 |
56 |

{{ err }}

57 |
58 | {% endfor %} 59 | 61 |
62 |
63 | 68 |
69 |
70 |
71 |
72 |
73 | 74 | {% endblock %} 75 | 76 | {% block js %} 77 | 83 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/home/pwd.html: -------------------------------------------------------------------------------- 1 | {% extends "home/home.html" %} 2 | 3 | 4 | {% block css %} 5 | 18 | {% endblock %} 19 | 20 | {% block content %} 21 | {% include "home/menu.html" %} 22 | 23 |
24 |
25 |
26 |

 会员中心

27 |
28 |
29 | 30 | {% for msg in get_flashed_messages(category_filter=["err"]) %} 31 |
32 | 34 |

操作失败

35 | {{ msg }} 36 |
37 | {% endfor %} 38 | 39 | {% for msg in get_flashed_messages(category_filter=["ok"]) %} 40 |
41 | 43 |

操作成功

44 | {{ msg }} 45 |
46 | {% endfor %} 47 | 48 |
49 |
50 |
51 | 52 | 54 | {{ form.old_pwd }} 55 | {% for err in form.old_pwd.errors %} 56 |
{{ err }}
57 | {% endfor %} 58 |
59 |
60 | 61 | 63 | {{ form.new_pwd }} 64 | {% for err in form.new_pwd.errors %} 65 |
{{ err }}
66 | {% endfor %} 67 |
68 | 69 | {{ form.csrf_token }} 70 | {{ form.submit }} 71 |
72 |
73 |
74 |
75 |
76 | {% endblock %} 77 | {% block js %} 78 | 83 | {% endblock %} -------------------------------------------------------------------------------- /app/static/tpl/1-index-animation/css/style.css: -------------------------------------------------------------------------------- 1 | /*首页样式(音乐馆样式)*/ 2 | html,body,header,nav,footer,div,ul,ol,li,p,form,input,a,span,em,i,strong,b,font,img{ 3 | margin:0; padding:0; list-style:none; border:none;} 4 | body{font-family:"微软雅黑"; font-size:14px;} 5 | a{text-align:center; text-decoration:none; outline:none;} 6 | input{outline:none;} 7 | em{font-style:normal;} 8 | 9 | /*轮播图 开始*/ 10 | .main_banner{width:100%; height:375px;} 11 | .main_banner_wrap{ 12 | width:1180px; height:375px; position:relative; background:#112233/*333D46*/; 13 | margin:0 auto; overflow:hidden; box-shadow: 0px 1px 2px #c5c5c5; 14 | } 15 | #myCanvas { 16 | position: absolute; 17 | z-index: 13; 18 | opacity: 0.8; 19 | cursor: pointer; 20 | -webkit-animation: roll 3s; 21 | animation: roll 3s; 22 | } 23 | @-webkit-keyframes roll { 24 | from{-webkit-transform:rotate(120deg);opacity:0;} 25 | to{-webkit-transform:rotate(0deg);opacity:0.8;} 26 | } 27 | @keyframes roll { 28 | from{transform:rotate(120deg);opacity:0;} 29 | to{transform:rotate(0deg);opacity:0.8;} 30 | } 31 | .banner_btn{ /*a 标签 按钮*/ 32 | width:255px; height:240px; position:absolute; 33 | display:block; z-index:9; top:20px; 34 | } 35 | .btn_next{right:20px;} 36 | .banner_btn span{width:50px; height:100px; display:block; position:absolute; 37 | left:110px; top:70px; opacity:0; transition:0.5s; 38 | background:url(../images/bannerBtn.png) no-repeat 0 0;} 39 | .btn_next span{background-position:-50px 0;} 40 | .main_banner_box:hover .banner_btn_arrow{opacity:0.6;} 41 | .banner_btn span i{width:50px; height:100px; display:block; 42 | background:url(../images/bannerBtn.png) no-repeat 0 0;} 43 | .btn_next span i{background-position:-50px 0;} 44 | .banner_btn:hover i{ 45 | -webkit-animation:arrow 0.5s infinite alternate ease-in-out; 46 | -moz-animation:arrow 0.5s infinite alternate ease-in-out; 47 | } 48 | @-webkit-keyframes arrow{ 49 | from{-webkit-transform:scale(1); opacity:1;} 50 | to{-webkit-transform:scale(1.5); opacity:0.2;} 51 | } 52 | @-moz-keyframes arrow{ 53 | from{-moz-transform:scale(1); opacity:1;} 54 | to{-moz-transform:scale(1.5); opacity:0.2;} 55 | } 56 | 57 | .main_banner_box{ 58 | width:1200px; height:280px; margin:40px auto 0; position:relative; z-index:0; 59 | /*-webkit-倒影样式*/ 60 | -webkit-box-reflect:below 0 -webkit-linear-gradient(top,rgba(255,255,255,0) 0%,rgba(255,255,255,.2) 100%); 61 | } 62 | /*火狐倒影图层样式*/ 63 | .main_banner_box p#rflt{width:1200px; height:280px; position:absolute; left:0; top:280px; 64 | background:-moz-element(#m_box) no-repeat; -moz-transform:scaleY(-1); opacity:0.2; 65 | }/*火狐倒影图层样式*/ 66 | .main_banner li{ 67 | position:absolute; background:#000; overflow:hidden; 68 | box-shadow:0 4px 8px rgba(0, 0, 0, 0.15); 69 | } 70 | /*给每张图片初始设置不同宽高,层级,位置*/ 71 | .main_banner li#imgCard0{ 72 | width:670px; height:280px; z-index:5; 73 | left:255px; top:0px; opacity:1; background:#333d46; 74 | } 75 | .main_banner li#imgCard1{ 76 | width:580px; height:240px; z-index:1; 77 | left:600px; top:20px; opacity:1; background:#333d46; 78 | } 79 | .main_banner li#imgCard2{/*初始在背后,透明度为0*/ 80 | width:450px; height:180px; z-index:1; 81 | left:0px; top:60px; opacity:0; background:#333d46; 82 | } 83 | .main_banner li#imgCard3{/*初始在背后,透明度为0*/ 84 | width:450px; height:180px; z-index:1; 85 | left:0px; top:60px; opacity:0; background:#333d46; 86 | } 87 | .main_banner li#imgCard4{ 88 | width:580px; height:240px; z-index:2; 89 | left:0px; top:20px; opacity:1; background:#333d46; 90 | } 91 | .main_banner li img{width:100%; height:100%;} 92 | .main_banner li span{/*遮罩层*/ 93 | width:100%; height:100%; position:absolute; top:0; left:0; 94 | z-index:1; background:#000; opacity:0; filter:alpha(opacity=0); 95 | color:#fff; font-size:30px; line-height:120px; text-align:center; 96 | } 97 | .main_banner li p{width:100%; height:50px; position:absolute; 98 | left:0; bottom:-50px; background:rgba(0,0,0,0.7); color:#fff; 99 | text-indent:38px; line-height:50px; font-size:25px; 100 | } 101 | 102 | /*指示器按钮*/ 103 | .btn_list{text-align:center; position:relative; left:0; top:6px; z-index:10;} 104 | .btn_list span{ 105 | width:15px; height:15px; display:inline-block; margin:15px 5px; 106 | background:#787d82; border-radius:50%; cursor:pointer; 107 | } 108 | .btn_list span.curr{background:#FFAE00;} 109 | 110 | /*轮播图 结束*/ -------------------------------------------------------------------------------- /app/templates/admin/movie_list.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | {% import "ui/admin_page.html" as pg %} 3 | 4 | {% block content %} 5 | 6 |
7 |

拾光电影管理系统

8 | 12 |
13 |
14 |
15 |
16 |
17 |
18 |

电影列表

19 |
20 |
21 | 23 | 24 |
25 | 27 |
28 |
29 |
30 |
31 |
32 | {% for msg in get_flashed_messages(category_filter=["ok"]) %} 33 |
34 | 36 |

操作成功

37 | {{ msg }} 38 |
39 | {% endfor %} 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | {% for v in page_data.items %} 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 70 | 71 | {% endfor %} 72 | 73 |
编号片名片长标签地区星级播放数量评论数量上映时间操作事项
{{ v.id }}{{ v.title }}{{ v.length }}{{ v.tag.id }}{{ v.area }}{{ v.star }}{{ v.playnum }}{{ v.commentnum }}{{ v.addtime }} 66 | 编辑 67 |   68 | 删除 69 |
74 |
75 | 78 |
79 |
80 |
81 |
82 | 83 | {% endblock %} 84 | 85 | {% block js %} 86 | 92 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/admin/role_add.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | 3 | {% block css %} 4 | 9 | {% endblock %} 10 | 11 | {% block content %} 12 | 13 |
14 |

拾光电影管理系统

15 | 19 |
20 |
21 |
22 |
23 |
24 |
25 |

添加角色

26 |
27 |
28 |
29 | 30 | {% for msg in get_flashed_messages(category_filter=["ok"]) %} 31 |
32 | 34 |

操作成功

35 | {{ msg }} 36 |
37 | {% endfor %} 38 | 39 | {% for msg in get_flashed_messages(category_filter=["err"]) %} 40 |
41 | 43 |

操作失败

44 | {{ msg }} 45 |
46 | {% endfor %} 47 | 48 | 49 |
50 | 51 | 52 | {{ form.name }} 53 | {% for err in form.name.errors %} 54 |
55 |

{{ err }}

56 |
57 | {% endfor %} 58 |
59 |
60 |
61 | 62 |
63 |
64 | 73 |
74 |
75 |
76 | 81 |
82 |
83 |
84 |
85 |
86 | 87 | {% endblock %} 88 | 89 | {% block js %} 90 | 96 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/admin/role_edit.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | 3 | {% block css %} 4 | 9 | {% endblock %} 10 | 11 | {% block content %} 12 | 13 |
14 |

拾光电影管理系统

15 | 19 |
20 |
21 |
22 |
23 |
24 |
25 |

编辑角色

26 |
27 |
28 |
29 | 30 | {% for msg in get_flashed_messages(category_filter=["ok"]) %} 31 |
32 | 34 |

操作成功

35 | {{ msg }} 36 |
37 | {% endfor %} 38 | 39 | {% for msg in get_flashed_messages(category_filter=["err"]) %} 40 |
41 | 43 |

操作失败

44 | {{ msg }} 45 |
46 | {% endfor %} 47 | 48 | 49 |
50 | 51 | 52 | {{ form.name(value=role.name) }} 53 | {% for err in form.name.errors %} 54 |
55 |

{{ err }}

56 |
57 | {% endfor %} 58 |
59 |
60 |
61 | 62 |
63 |
64 | 73 |
74 |
75 |
76 | 81 |
82 |
83 |
84 |
85 |
86 | 87 | {% endblock %} 88 | 89 | {% block js %} 90 | 96 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/admin/user_list.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | {% import "ui/admin_page.html" as pg %} 3 | 4 | {% block content %} 5 | 6 |
7 |

拾光电影管理系统

8 | 12 |
13 |
14 |
15 |
16 |
17 |
18 |

会员列表

19 |
20 |
21 | 23 | 24 |
25 | 27 |
28 |
29 |
30 |
31 |
32 | 33 | {% for msg in get_flashed_messages(category_filter=["ok"]) %} 34 |
35 | 37 |

操作成功

38 | {{ msg }} 39 |
40 | {% endfor %} 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | {% for v in page_data.items %} 55 | 56 | 57 | 58 | 59 | 60 | 68 | 69 | 70 | 79 | 80 | {% endfor %} 81 | 82 |
编号昵称邮箱手机头像状态注册时间操作事项
{{ v.id }}{{ v.name }}{{ v.email }}{{ v.phone }} 61 | {% if v.face %} 62 | 63 | {% else %} 64 | 65 | {% endif %} 66 | 67 | 正常/冻结{{ v.addtime }} 71 | 查看 72 |   73 | 解冻 74 |   75 | 冻结 76 |   77 | 删除 78 |
83 |
84 | 87 |
88 |
89 |
90 |
91 | 92 | {% endblock %} 93 | 94 | {% block js %} 95 | 101 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/home/layout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 拾光电影网 10 | 11 | 12 | 13 | 14 | 24 | {% block css %}{% endblock %} 25 | 26 | 27 | 28 | 29 | 30 | 76 | 77 | 78 | {% block content %}{% endblock %} 79 | 80 | 81 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 105 | 117 | {% block js %} {% endblock %} 118 | 119 | 120 | -------------------------------------------------------------------------------- /app/templates/home/home.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 拾光电影网 10 | 11 | 12 | 13 | 14 | 24 | {% block css %}{% endblock %} 25 | 26 | 27 | 28 | 29 | 30 | 76 | 77 | 78 |
79 | {% block content %}{% endblock %} 80 |
81 | 82 | 83 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 107 | 119 | {% block js %} {% endblock %} 120 | 121 | 122 | -------------------------------------------------------------------------------- /app/templates/home/register.html: -------------------------------------------------------------------------------- 1 | {% extends 'home/home.html' %} 2 | {% block content %} 3 |
4 |
5 |
6 |
7 |

 会员注册

8 |
9 |
10 | 11 | {% for msg in get_flashed_messages(category_filter=["err"]) %} 12 |
13 | 15 |

操作失败

16 | {{ msg }} 17 |
18 | {% endfor %} 19 | 20 | {% for msg in get_flashed_messages(category_filter=["ok"]) %} 21 |
22 | 24 |

操作成功

25 | {{ msg }} 26 |
27 | {% endfor %} 28 | 29 | 30 |
31 |
32 |
33 | 34 | 35 | {{ form.name }} 36 | {% for err in form.name.errors %} 37 |
{{ err }}
38 | {% endfor %} 39 | 40 |
41 | 42 | 43 | {{ form.email }} 44 | {% for err in form.email.errors %} 45 |
{{ err }}
46 | {% endfor %} 47 |
48 |
49 | 50 | 51 | {{ form.phone }} 52 | {% for err in form.phone.errors %} 53 |
{{ err }}
54 | {% endfor %} 55 |
56 |
57 | 58 | 59 | {{ form.pwd }} 60 | {% for err in form.pwd.errors %} 61 |
{{ err }}
62 | {% endfor %} 63 |
64 |
65 | 66 | 67 | {{ form.repwd }} 68 | {% for err in form.repwd.errors %} 69 |
{{ err }}
70 | {% endfor %} 71 |
72 | 73 | {{ form.csrf_token }} 74 | {{ form.submit }} 75 |
76 |
77 |
78 |
79 |
80 |
81 | {% endblock %} 82 | -------------------------------------------------------------------------------- /app/templates/admin/admin_add.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | 3 | 4 | {% block content %} 5 | 6 |
7 |

拾光电影管理系统

8 | 12 |
13 |
14 |
15 |
16 |
17 |
18 |

添加管理员

19 |
20 |
21 |
22 | 23 | {% for msg in get_flashed_messages(category_filter=["ok"]) %} 24 |
25 | 27 |

操作成功

28 | {{ msg }} 29 |
30 | {% endfor %} 31 | 32 | {% for msg in get_flashed_messages(category_filter=["err"]) %} 33 |
34 | 36 |

操作失败

37 | {{ msg }} 38 |
39 | {% endfor %} 40 | 41 |
42 | 43 | 44 | {{ form.name }} 45 | {% for err in form.name.errors %} 46 |
47 |

{{ err }}

48 |
49 | {% endfor %} 50 | 51 |
52 |
53 | 54 | 55 | {{ form.pwd }} 56 | {% for err in form.pwd.errors %} 57 |
58 |

{{ err }}

59 |
60 | {% endfor %} 61 |
62 |
63 | 64 | 66 | {{ form.repwd }} 67 | {% for err in form.repwd.errors %} 68 |
69 |

{{ err }}

70 |
71 | {% endfor %} 72 |
73 |
74 | 75 | 79 | {{ form.role_id }} 80 | {% for err in form.role_id.errors %} 81 |
82 |

{{ err }}

83 |
84 | {% endfor %} 85 |
86 |
87 | 92 |
93 |
94 |
95 |
96 |
97 | 98 | {% endblock %} 99 | 100 | {% block js %} 101 | 107 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/home/index.html: -------------------------------------------------------------------------------- 1 | {% extends "home/layout.html" %} 2 | {% import "ui/home_page.html" as pg %} 3 | 4 | {% block content %} 5 | 6 |
7 |
8 |
9 |
10 | 11 |
12 |
13 |
14 |
15 | 16 | 17 |
18 |
19 |
20 |
21 | 22 | 23 | 24 | 31 | 32 | 33 | 38 | 39 | 40 | 41 | 47 | 48 | 49 | 50 | 55 | 56 | 57 | 58 | 63 | 64 |
电影标签 25 | {% for v in tags %} 26 |  {{ v.name }} 28 | {% endfor %} 29 | 30 |
电影星级 34 | {% for v in range(1,6) %} 35 |  {{ v }}星 36 | {% endfor %} 37 |
上映时间 42 |  最近 43 |   44 |   45 |  更早 46 |
播放数量 51 |  从高到低 52 |   53 |  从低到高 54 |
评论数量 59 |  从高到低 60 |   61 |  从低到高 62 |
65 |
66 | 67 | {% for v in page_data.items %} 68 |
69 |
70 | 72 | 73 |
74 | {{ v.title }}
75 |
76 | {% for val in range(1,v.star+1) %} 77 | 78 | {% endfor %} 79 | {% for val in range(1,5-v.star) %} 80 | 81 | {% endfor %} 82 |
83 |
84 |  播放 85 |
86 |
87 | {% endfor %} 88 | 89 |
90 | {{ pg.page(page_data, "home.index") }} 91 |
92 |
93 |
94 |
95 | 96 | {% endblock %} 97 | -------------------------------------------------------------------------------- /app/templates/admin/admin.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 拾光电影管理系统 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 24 | {% block css %}{% endblock %} 25 | 26 | 27 |
28 |
29 | 33 | 67 |
68 | 93 |
94 | 95 | {% block content %}{% endblock %} 96 | 97 |
98 | 104 |
105 |
106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | {% block js %}{% endblock %} 116 | 117 | 118 | -------------------------------------------------------------------------------- /app/templates/home/user.html: -------------------------------------------------------------------------------- 1 | {% extends "home/home.html" %} 2 | 3 | 4 | {% block css %} 5 | 20 | {% endblock %} 21 | 22 | {% block content %} 23 | {% include "home/menu.html" %} 24 |
25 |
26 |
27 |

 会员中心

28 |
29 |
30 | 31 | {% for msg in get_flashed_messages(category_filter=["err"]) %} 32 |
33 | 35 |

操作失败

36 | {{ msg }} 37 |
38 | {% endfor %} 39 | 40 | {% for msg in get_flashed_messages(category_filter=["ok"]) %} 41 |
42 | 44 |

操作成功

45 | {{ msg }} 46 |
47 | {% endfor %} 48 | 49 |
50 |
51 |
52 | 53 | 55 | {{ form.name }} 56 | {% for err in form.name.errors %} 57 |
{{ err }}
58 | {% endfor %} 59 |
60 |
61 | 62 | 64 | {{ form.email }} 65 | {% for err in form.email.errors %} 66 |
{{ err }}
67 | {% endfor %} 68 |
69 |
70 | 71 | 73 | {{ form.phone }} 74 | {% for err in form.phone.errors %} 75 |
{{ err }}
76 | {% endfor %} 77 |
78 |
79 | 80 | {% if user.face %} 81 | 83 | {% else %} 84 | 85 | {% endif %} 86 | 87 | {{ form.face }} 88 | {% for err in form.face.errors %} 89 |
{{ err }}
90 | {% endfor %} 91 | 94 |
95 |
96 | 97 | 98 | {{ form.info }} 99 | {% for err in form.info.errors %} 100 |
{{ err }}
101 | {% endfor %} 102 |
103 | 104 | {{ form.csrf_token }} 105 | {{ form.submit }} 106 |
107 |
108 |
109 |
110 |
111 | 112 | {% endblock %} 113 | 114 | {% block js %} 115 | 120 | {% endblock %} 121 | -------------------------------------------------------------------------------- /app/home/forms.py: -------------------------------------------------------------------------------- 1 | #!/user/bin/python 2 | # -*- coding:utf-8 -*- 3 | # @Time: 2018/8/29 21:17 4 | # @Author: Envse 5 | # @File: forms.py 6 | 7 | 8 | from flask_wtf import FlaskForm 9 | from wtforms import StringField, PasswordField, SubmitField, FileField, TextAreaField, SelectField, SelectMultipleField 10 | from wtforms.validators import DataRequired, ValidationError, EqualTo, Email, Regexp 11 | from app.models import User 12 | from werkzeug.security import generate_password_hash 13 | 14 | 15 | # 前台会员注册 16 | class RegisterForm(FlaskForm): 17 | name = StringField( 18 | label="昵称", 19 | validators=[ 20 | DataRequired("昵称不能为空!") 21 | ], 22 | description="昵称", 23 | render_kw={ 24 | "class": "form-control input-lg", 25 | "placeholder": "请输入昵称!", 26 | # "required": "required" # 注释此处显示forms报错errors信息 27 | } 28 | ) 29 | email = StringField( 30 | label="邮箱", 31 | validators=[ 32 | DataRequired("邮箱不能为空!"), 33 | Email("邮箱格式不正确!") 34 | ], 35 | description="邮箱", 36 | render_kw={ 37 | "class": "form-control input-lg", 38 | "placeholder": "请输入邮箱!", 39 | # "required": "required" # 注释此处显示forms报错errors信息 40 | } 41 | ) 42 | phone = StringField( 43 | label="手机号码", 44 | validators=[ 45 | DataRequired("手机号码不能为空!"), 46 | Regexp("1[3458]\\d{9}", message="手机格式不正确!") 47 | ], 48 | description="手机号码", 49 | render_kw={ 50 | "class": "form-control input-lg", 51 | "placeholder": "请输入手机号码!", 52 | # "required": "required" # 注释此处显示forms报错errors信息 53 | } 54 | ) 55 | pwd = PasswordField( 56 | label="密码", 57 | validators=[ 58 | DataRequired("密码不能为空!") 59 | ], 60 | description="密码", 61 | render_kw={ 62 | "class": "form-control input-lg", 63 | "placeholder": "请输入密码!", 64 | # "required": "required" # 注释此处显示forms报错errors信息 65 | } 66 | ) 67 | repwd = PasswordField( 68 | label="确认密码", 69 | validators=[ 70 | DataRequired("确认密码不能为空!"), 71 | EqualTo('pwd', message="两次密码不一致!") 72 | ], 73 | description="确认密码", 74 | render_kw={ 75 | "class": "form-control input-lg", 76 | "placeholder": "请输入确认密码!", 77 | # "required": "required" # 注释此处显示forms报错errors信息 78 | } 79 | ) 80 | submit = SubmitField( 81 | '注册', 82 | render_kw={ 83 | "class": "btn btn-lg btn-success btn-block", 84 | } 85 | ) 86 | 87 | def validate_name(self, field): 88 | name = field.data 89 | user = User.query.filter_by(name=name).count() 90 | if user == 1: 91 | raise ValidationError("该昵称已经存在!") 92 | 93 | def validate_email(self, field): 94 | email = field.data 95 | user = User.query.filter_by(email=email).count() 96 | if user == 1: 97 | raise ValidationError("该邮箱已经存在!") 98 | 99 | def validate_phone(self, field): 100 | phone = field.data 101 | user = User.query.filter_by(phone=phone).count() 102 | if user == 1: 103 | raise ValidationError("该手机号已经存在!") 104 | 105 | 106 | # 前台会员登录 107 | class LoginForm(FlaskForm): 108 | name = StringField( 109 | label="账号", 110 | validators=[ 111 | DataRequired("账号不能为空!") 112 | ], 113 | description="账号", 114 | render_kw={ 115 | "class": "form-control input-lg", 116 | "placeholder": "请输入账号!", 117 | # "required": "required" # 注释此处显示forms报错errors信息 118 | } 119 | ) 120 | pwd = PasswordField( 121 | label="密码", 122 | validators=[ 123 | DataRequired("密码不能为空!") 124 | ], 125 | description="密码", 126 | render_kw={ 127 | "class": "form-control input-lg", 128 | "placeholder": "请输入密码!", 129 | # "required": "required" # 注释此处显示forms报错errors信息 130 | } 131 | ) 132 | submit = SubmitField( 133 | '登录', 134 | render_kw={ 135 | "class": "btn btn-lg btn-primary btn-block", 136 | } 137 | ) 138 | 139 | def validate_name(self, field): 140 | name = field.data 141 | user = User.query.filter_by(name=name).count() 142 | if user == 0: 143 | raise ValidationError("该账号不存在!") 144 | 145 | 146 | # 修改个人资料 147 | class UserdetailForm(FlaskForm): 148 | name = StringField( 149 | label="昵称", 150 | validators=[ 151 | DataRequired("昵称不能为空!") 152 | ], 153 | description="昵称", 154 | render_kw={ 155 | "class": "form-control input-lg", 156 | "placeholder": "请输入昵称!", 157 | # "required": "required" # 注释此处显示forms报错errors信息 158 | } 159 | ) 160 | email = StringField( 161 | label="邮箱", 162 | validators=[ 163 | DataRequired("邮箱不能为空!"), 164 | Email("邮箱格式不正确!") 165 | ], 166 | description="邮箱", 167 | render_kw={ 168 | "class": "form-control input-lg", 169 | "placeholder": "请输入邮箱!", 170 | # "required": "required" # 注释此处显示forms报错errors信息 171 | } 172 | ) 173 | phone = StringField( 174 | label="手机号码", 175 | validators=[ 176 | DataRequired("手机号码不能为空!"), 177 | Regexp("1[3458]\\d{9}", message="手机格式不正确!") 178 | ], 179 | description="手机号码", 180 | render_kw={ 181 | "class": "form-control input-lg", 182 | "placeholder": "请输入手机号码!", 183 | # "required": "required" # 注释此处显示forms报错errors信息 184 | } 185 | ) 186 | face = FileField( 187 | label="头像", 188 | validators=[ 189 | DataRequired("请上传头像!") 190 | ], 191 | description="头像", 192 | ) 193 | info = TextAreaField( 194 | label="简介", 195 | validators=[ 196 | DataRequired("简介不能为空") 197 | ], 198 | description="简介", 199 | render_kw={ 200 | "class": "form-control", 201 | "rows=": 10, 202 | } 203 | ) 204 | submit = SubmitField( 205 | '保存修改', 206 | render_kw={ 207 | "class": "btn btn-success", 208 | } 209 | ) 210 | 211 | 212 | # 修改密码 213 | class PwdForm(FlaskForm): 214 | old_pwd = PasswordField( 215 | label="旧密码", 216 | validators=[ 217 | DataRequired("旧密码不能为空!") 218 | ], 219 | description="旧密码", 220 | render_kw={ 221 | "class": "form-control", 222 | "placeholder": "请输入旧密码!", 223 | # "required": "required" # 注释此处显示forms报错errors信息 224 | } 225 | ) 226 | new_pwd = PasswordField( 227 | label="新密码", 228 | validators=[ 229 | DataRequired("新密码不能为空!") 230 | ], 231 | description="新密码", 232 | render_kw={ 233 | "class": "form-control", 234 | "placeholder": "请输入新密码!", 235 | # "required": "required" # 注释此处显示forms报错errors信息 236 | } 237 | ) 238 | submit = SubmitField( 239 | '修改密码', 240 | render_kw={ 241 | "class": "btn btn-success", 242 | } 243 | ) 244 | 245 | 246 | # 添加评论 247 | class CommentForm(FlaskForm): 248 | content = TextAreaField( 249 | label="内容", 250 | validators=[ 251 | DataRequired("请输入内容!"), 252 | ], 253 | description="内容", 254 | render_kw={ 255 | "id": "input_content", 256 | } 257 | ) 258 | submit = SubmitField( 259 | '提交评论', 260 | render_kw={ 261 | "class": "btn btn-success", 262 | "id": "btn-sub", 263 | } 264 | ) 265 | -------------------------------------------------------------------------------- /app/models.py: -------------------------------------------------------------------------------- 1 | #!/user/bin/python 2 | # -*- coding:utf-8 -*- 3 | # @Time: 2018/8/29 21:20 4 | # @Author: Envse 5 | # @File: models.py 6 | 7 | 8 | from datetime import datetime 9 | from app import db 10 | 11 | 12 | # 定义会员数据模型 13 | class User(db.Model): 14 | __tablename__ = "user" 15 | __table_args__ = {"useexisting": True} 16 | id = db.Column(db.Integer, primary_key=True) # 编号 17 | name = db.Column(db.String(100), unique=True) # 昵称 18 | pwd = db.Column(db.String(100)) # 密码 19 | email = db.Column(db.String(100), unique=True) # 邮箱 20 | phone = db.Column(db.String(11), unique=True) # 电话号码 21 | info = db.Column(db.Text) # 个性简介 22 | face = db.Column(db.String(255), unique=True) # 头像 23 | addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 添加时间 24 | uuid = db.Column(db.String(255), unique=True) # 唯一标志符 25 | userlogs = db.relationship('UserLog', backref='user') # 会员日志外键关系 26 | comments = db.relationship('Comment', backref='user') # 评论外键关系关联 27 | moviecols = db.relationship('MovieCol', backref='user') # 电影收藏外键关系关联 28 | 29 | def __repr__(self): 30 | return '' % self.name 31 | 32 | def check_pwd(self, pwd): 33 | from werkzeug.security import check_password_hash 34 | return check_password_hash(self.pwd, pwd) 35 | 36 | 37 | # 定义会员登录日志模型 38 | class UserLog(db.Model): 39 | __tablename__ = "userlog" 40 | __table_args__ = {"useexisting": True} 41 | id = db.Column(db.Integer, primary_key=True) # 编号 42 | user_id = db.Column(db.Integer, db.ForeignKey('user.id')) # 所属会员 43 | ip = db.Column(db.String(100)) # 登录IP 44 | addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 添加时间 45 | 46 | def __repr__(self): 47 | return '' % self.id 48 | 49 | 50 | # 定义标签数据模型 51 | class Tag(db.Model): 52 | __tablename__ = "tag" 53 | __table_args__ = {"useexisting": True} 54 | id = db.Column(db.Integer, primary_key=True) # 编号 55 | name = db.Column(db.String(100), unique=True) # 标题 56 | addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 添加时间 57 | movies = db.relationship('Movie', backref='tag') # 电影外键关系关联 58 | 59 | def __repr__(self): 60 | return '' % self.name 61 | 62 | 63 | # 定义电影数据模型 64 | class Movie(db.Model): 65 | __tablename__ = "movie" 66 | __table_args__ = {"useexisting": True} 67 | id = db.Column(db.Integer, primary_key=True) # 编号 68 | title = db.Column(db.String(255), unique=True) # 电影标题 69 | url = db.Column(db.String(255), unique=True) # 电影地址 70 | info = db.Column(db.Text) # 电影简介 71 | logo = db.Column(db.String(255), unique=True) # 电影封面 72 | star = db.Column(db.SmallInteger) # 星级 73 | playnum = db.Column(db.BigInteger) # 电影播放量 74 | commentnum = db.Column(db.BigInteger) # 电影评论量 75 | tag_id = db.Column(db.Integer, db.ForeignKey('tag.id')) # 所属标签 76 | area = db.Column(db.String(255)) # 地区 77 | release_time = db.Column(db.Date) # 发布时间 78 | length = db.Column(db.String(100)) # 电影长度 79 | addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 添加时间 80 | comments = db.relationship('Comment', backref='movie') # 电影评论外键关联 81 | movieclos = db.relationship('MovieCol', backref='movie') # 电影收藏外键关联 82 | 83 | def __repr__(self): 84 | return '' % self.title 85 | 86 | 87 | # 定义上映预告数据模型 88 | class Preview(db.Model): 89 | __tablename__ = "preview" 90 | __table_args__ = {"useexisting": True} 91 | id = db.Column(db.Integer, primary_key=True) # 编号 92 | title = db.Column(db.String(255), unique=True) # 电影标题 93 | logo = db.Column(db.String(255), unique=True) # 电影封面 94 | addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 添加时间 95 | 96 | def __repr__(self): 97 | return '' % self.title 98 | 99 | 100 | # 定义评论数据模型 101 | class Comment(db.Model): 102 | __tablename__ = "comment" 103 | __table_args__ = {"useexisting": True} 104 | id = db.Column(db.Integer, primary_key=True) # 编号 105 | content = db.Column(db.Text) # 评论内容 106 | movie_id = db.Column(db.Integer, db.ForeignKey('movie.id')) # 所属电影 107 | user_id = db.Column(db.Integer, db.ForeignKey('user.id')) # 所属用户 108 | addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 添加时间 109 | 110 | def __repr__(self): 111 | return '' % self.id 112 | 113 | 114 | # 定义收藏电影数据模型 115 | class MovieCol(db.Model): 116 | __tablename__ = "moviecol" 117 | __table_args__ = {"useexisting": True} 118 | id = db.Column(db.Integer, primary_key=True) # 编号 119 | movie_id = db.Column(db.Integer, db.ForeignKey('movie.id')) # 所属电影 120 | user_id = db.Column(db.Integer, db.ForeignKey('user.id')) # 所属用户 121 | addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 最近登录时间 122 | 123 | def __repr__(self): 124 | return '' % self.id 125 | 126 | 127 | # 定义权限数据模型 128 | class Auth(db.Model): 129 | __tablename__ = "auth" 130 | __table_args__ = {"useexisting": True} 131 | id = db.Column(db.Integer, primary_key=True) # 编号 132 | name = db.Column(db.String(100), unique=True) # 名称 133 | url = db.Column(db.String(255), unique=True) # 电影地址 134 | addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 添加时间 135 | 136 | def __repr__(self): 137 | return '' % self.name 138 | 139 | 140 | # 定义角色数据模型 141 | class Role(db.Model): 142 | __tablename__ = "role" 143 | __table_args__ = {"useexisting": True} 144 | id = db.Column(db.Integer, primary_key=True) # 编号 145 | name = db.Column(db.String(100), unique=True) # 名称 146 | auths = db.Column(db.String(600)) # 权限列表 147 | admins = db.relationship("Admin", backref='role') # 管理员外键关系关联 148 | addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 添加时间 149 | 150 | def __repr__(self): 151 | return '' % self.name 152 | 153 | 154 | # 定义管理员数据模型 155 | class Admin(db.Model): 156 | __tablename__ = "admin" 157 | __table_args__ = {"useexisting": True} 158 | id = db.Column(db.Integer, primary_key=True) # 编号 159 | name = db.Column(db.String(100), unique=True) # 管理员名称 160 | pwd = db.Column(db.String(100)) # 管理员密码 161 | is_super = db.Column(db.SmallInteger) # 是否为超级管理员,0为超级管理员 162 | role_id = db.Column(db.Integer, db.ForeignKey('role.id')) # 所属角色 163 | addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 添加时间 164 | adminlogs = db.relationship('AdminLog', backref='admin') # 管理员登录日志外键关系关联 165 | oplogs = db.relationship('OpLog', backref='admin') # 管理员操作日志外键关系关联 166 | 167 | def __repr__(self): 168 | return '' % self.name 169 | 170 | def check_pwd(self, pwd): 171 | from werkzeug.security import check_password_hash 172 | return check_password_hash(self.pwd, pwd) 173 | 174 | 175 | # 定义管理员登陆日志数据模型 176 | class AdminLog(db.Model): 177 | __tablename__ = "adminlog" 178 | __table_args__ = {"useexisting": True} 179 | id = db.Column(db.Integer, primary_key=True) # 编号 180 | admin_id = db.Column(db.Integer, db.ForeignKey('admin.id')) # 所属管理员 181 | ip = db.Column(db.String(100)) # 登录IP 182 | addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 添加时间 183 | 184 | def __repr__(self): 185 | return '' % self.id 186 | 187 | 188 | # 定义操作日志数据模型 189 | class OpLog(db.Model): 190 | __tablename__ = "oplog" 191 | __table_args__ = {"useexisting": True} 192 | id = db.Column(db.Integer, primary_key=True) # 编号 193 | admin_id = db.Column(db.Integer, db.ForeignKey('admin.id')) # 所属管理员 194 | ip = db.Column(db.String(100)) # 登录IP 195 | reason = db.Column(db.String(600)) # 操作原因 196 | addtime = db.Column(db.DateTime, index=True, default=datetime.now) # 添加时间 197 | 198 | def __repr__(self): 199 | return '' % self.id 200 | 201 | 202 | if __name__ == '__main__': 203 | db.create_all() -------------------------------------------------------------------------------- /app/templates/admin/grid.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /app/templates/admin/movie_add.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | 3 | {% block content %} 4 | 5 |
6 |

拾光电影管理系统

7 | 11 |
12 |
13 |
14 |
15 |
16 |
17 |

添加电影

18 |
19 |
20 |
21 | 22 | {% for msg in get_flashed_messages(category_filter=["ok"]) %} 23 |
24 | 26 |

操作成功

27 | {{ msg }} 28 |
29 | {% endfor %} 30 | 31 | {% for msg in get_flashed_messages(category_filter=["err"]) %} 32 |
33 | 35 |

操作失败

36 | {{ msg }} 37 |
38 | {% endfor %} 39 | 40 |
41 | 42 | 43 | {{ form.title }} 44 | {% for err in form.title.errors %} 45 |
46 |

{{ err }}

47 |
48 | {% endfor %} 49 |
50 |
51 | 52 | 53 | {{ form.url }} 54 | {% for err in form.url.errors %} 55 |
56 |

{{ err }}

57 |
58 | {% endfor %} 59 |
60 |
61 |
62 |
63 |
64 | 65 | 66 | {{ form.info }} 67 | {% for err in form.info.errors %} 68 |
69 |

{{ err }}

70 |
71 | {% endfor %} 72 |
73 |
74 | 75 | 76 | {{ form.logo }} 77 | {% for err in form.logo.errors %} 78 |
79 |

{{ err }}

80 |
81 | {% endfor %} 82 | 84 |
85 |
86 | 87 | {{ form.star }} 88 | {% for err in form.star.errors %} 89 |
90 |

{{ err }}

91 |
92 | {% endfor %} 93 |
94 |
95 | 96 | {{ form.tag_id }} 97 | {% for err in form.tag_id.errors %} 98 |
99 |

{{ err }}

100 |
101 | {% endfor %} 102 |
103 |
104 | 105 | 106 | {{ form.area }} 107 | {% for err in form.area.errors %} 108 |
109 |

{{ err }}

110 |
111 | {% endfor %} 112 |
113 |
114 | 115 | 116 | {{ form.length }} 117 | {% for err in form.length.errors %} 118 |
119 |

{{ err }}

120 |
121 | {% endfor %} 122 |
123 |
124 | 125 | 127 | {{ form.release_time }} 128 | {% for err in form.release_time.errors %} 129 |
130 |

{{ err }}

131 |
132 | {% endfor %} 133 |
134 |
135 | 140 |
141 |
142 |
143 |
144 |
145 | 146 | {% endblock %} 147 | 148 | {% block js %} 149 | 150 | 154 | 179 | 189 | 195 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/admin/movie_edit.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/admin.html" %} 2 | 3 | {% block content %} 4 | 5 |
6 |

拾光电影管理系统

7 | 11 |
12 |
13 |
14 |
15 |
16 |
17 |

修改电影

18 |
19 |
20 |
21 | 22 | {% for msg in get_flashed_messages(category_filter=["ok"]) %} 23 |
24 | 26 |

操作成功

27 | {{ msg }} 28 |
29 | {% endfor %} 30 | 31 | {% for msg in get_flashed_messages(category_filter=["err"]) %} 32 |
33 | 35 |

操作失败

36 | {{ msg }} 37 |
38 | {% endfor %} 39 | 40 |
41 | 42 | 43 | {{ form.title(value=movie.title)}} 44 | {% for err in form.title.errors %} 45 |
46 |

{{ err }}

47 |
48 | {% endfor %} 49 |
50 |
51 | 52 | 53 | {{ form.url(value=movie.url) }} 54 | {% for err in form.url.errors %} 55 |
56 |

{{ err }}

57 |
58 | {% endfor %} 59 |
60 |
61 |
62 |
63 |
64 | 65 | 66 | {{ form.info }} 67 | {% for err in form.info.errors %} 68 |
69 |

{{ err }}

70 |
71 | {% endfor %} 72 |
73 |
74 | 75 | 76 | {{ form.logo }} 77 | {% for err in form.logo.errors %} 78 |
79 |

{{ err }}

80 |
81 | {% endfor %} 82 | 84 |
85 |
86 | 87 | {{ form.star }} 88 | {% for err in form.star.errors %} 89 |
90 |

{{ err }}

91 |
92 | {% endfor %} 93 |
94 |
95 | 96 | {{ form.tag_id }} 97 | {% for err in form.tag_id.errors %} 98 |
99 |

{{ err }}

100 |
101 | {% endfor %} 102 |
103 |
104 | 105 | 106 | {{ form.area(value=movie.area) }} 107 | {% for err in form.area.errors %} 108 |
109 |

{{ err }}

110 |
111 | {% endfor %} 112 |
113 |
114 | 115 | 116 | {{ form.length(value=movie.length) }} 117 | {% for err in form.length.errors %} 118 |
119 |

{{ err }}

120 |
121 | {% endfor %} 122 |
123 |
124 | 125 | 127 | {{ form.release_time(value=movie.release_time) }} 128 | {% for err in form.release_time.errors %} 129 |
130 |

{{ err }}

131 |
132 | {% endfor %} 133 |
134 |
135 | 140 |
141 |
142 |
143 |
144 |
145 | 146 | {% endblock %} 147 | 148 | 149 | {% block js %} 150 | 151 | 155 | 180 | 190 | 196 | {% endblock %} --------------------------------------------------------------------------------