├── LICENSE ├── README.md ├── book_service ├── .idea │ ├── book_service.iml │ ├── misc.xml │ ├── modules.xml │ └── workspace.xml ├── app.js ├── bin │ └── www ├── common │ └── db.js ├── models │ ├── article.js │ ├── comment.js │ ├── mail.js │ ├── movie.js │ ├── recommend.js │ └── user.js ├── package-lock.json ├── package.json ├── public │ └── stylesheets │ │ └── style.css ├── routes │ ├── admin.js │ ├── index.js │ └── users.js └── views │ ├── error.jade │ ├── index.jade │ └── layout.jade ├── book_view ├── .babelrc ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .postcssrc.js ├── README.md ├── build │ ├── build.js │ ├── check-versions.js │ ├── logo.png │ ├── utils.js │ ├── vue-loader.conf.js │ ├── webpack.base.conf.js │ ├── webpack.dev.conf.js │ └── webpack.prod.conf.js ├── config │ ├── dev.env.js │ ├── index.js │ ├── prod.env.js │ └── test.env.js ├── index.html ├── package-lock.json ├── package.json ├── src │ ├── App.vue │ ├── assets │ │ └── logo.png │ ├── components │ │ ├── AdminMenu.vue │ │ ├── Comment.vue │ │ ├── CommonFooter.vue │ │ ├── HelloWorld.vue │ │ ├── IndexHeaderPic.vue │ │ ├── MovieIndexHeader.vue │ │ ├── MoviesList.vue │ │ ├── NewsList.vue │ │ ├── UserInfo.vue │ │ └── UserMessage.vue │ ├── main.js │ ├── pages │ │ ├── admin.vue │ │ ├── adminAddArticle.vue │ │ ├── adminAddMovie.vue │ │ ├── adminArticleList.vue │ │ ├── adminCommentList.vue │ │ ├── adminMovieList.vue │ │ ├── adminUserList.vue │ │ ├── forgetPassword.vue │ │ ├── index.vue │ │ ├── loginPage.vue │ │ ├── movieDetail.vue │ │ ├── moviesList.vue │ │ ├── newsDetail.vue │ │ ├── newsList.vue │ │ ├── registerPage.vue │ │ └── userInfo.vue │ └── router │ │ └── index.js ├── static │ └── .gitkeep └── test │ ├── e2e │ ├── custom-assertions │ │ └── elementCount.js │ ├── nightwatch.conf.js │ ├── runner.js │ └── specs │ │ └── test.js │ └── unit │ ├── .eslintrc │ ├── jest.conf.js │ ├── setup.js │ └── specs │ └── HelloWorld.spec.js ├── database ├── json │ ├── articles.json │ ├── comments.json │ ├── mails.json │ ├── movies.json │ ├── recommends.json │ └── users.json └── sql │ ├── movieServer.articles.sql │ ├── movieServer.comments.sql │ ├── movieServer.mails.sql │ ├── movieServer.movies.sql │ ├── movieServer.recommends.sql │ └── movieServer.users.sql └── screenshot ├── 1.首页.png ├── 10.添加电影页面.png ├── 11.影评管理页面.png ├── 12.添加影评页面.png ├── 13.评论管理页面.png ├── 14.用户管理页面.png ├── 2.注册页面.png ├── 3.登录页面.png ├── 4.电影列表页面.png ├── 5.影评列表页面.png ├── 6.电影详情页面.png ├── 7.影评详情页面.png ├── 8.后台管理主页面.png └── 9.电影管理页面.png /README.md: -------------------------------------------------------------------------------- 1 | # VueMovieWebsite 2 | 使用 Vue + Node.js + Express + MongoDB + iView 实现的一个电影社区网站。由于时间有限,一些细节可能不够完善。 3 | 4 | 更多相关内容可参考我的博客:[Vue.js学习笔记](https://blog.csdn.net/weixin_42762089/article/details/91492148#Vue.js%E7%94%B5%E5%BD%B1%E7%BD%91%E7%AB%99%E9%A1%B9%E7%9B%AE) 5 | 6 | ## 安装 7 | 8 | 此项目分为服务端和前端,服务端代码在 `book_service` 文件夹中,前端代码在 `book_view` 文件夹中,数据库文件在 `database` 文件夹中(分为 json 和 sql 两种格式) 9 | 10 | 1. 先下载源代码,并且安装 `Node.js` 11 | 12 | 2. 安装模块:命令行环境进入`book_service` 文件夹,执行 `npm instll`,同样进入`book_view` 文件夹,执行 `npm instll` 13 | 14 | 3. 启动服务:命令行环境进入`book_service` 文件夹,执行 `npm start`,同样进入`book_view` 文件夹,执行 `npm start` 15 | 16 | 4. 在浏览器中打开网址即可: http://localhost:8080 17 | 18 | ## 1.技术选择 19 | 20 | 数据库:[MongoDB](https://www.mongodb.com/)(一个介于关系数据库和非关系数据库之间的产品) 21 | 22 | 服务器端:[JavaScript](https://www.liaoxuefeng.com/wiki/1022910821149312) + [Node.js](http://nodejs.cn/) + [Express框架](http://www.expressjs.com.cn/) 23 | 24 | 前端:[Vue.js框架](https://cn.vuejs.org/index.html) 25 | 26 | UI库:[iView](https://www.iviewui.com/) 27 | 28 | ## 2.开发环境 29 | 30 | IDE:WebStorm 31 | 32 | MongoDB可视化界面软件:Studio 3T 33 | 34 | 服务器测试:Postman客户端 35 | 36 | ## 3.主要功能 37 | 38 | * 前台 39 | 40 | 1. 用户的注册、登录、忘记密码、个人资料显示 41 | 42 | 2. 主页显示电影推荐及影评推荐 43 | 44 | 3. 电影详细信息页面:显示电影名称、上映日期、预告片地址、观看次数、点赞次数、观看地址、已审核的用户评论 45 | 46 | 4. 影评详细信息页面:显示影评标题、发布日期、影评内容、已审核的用户评论 47 | 48 | 5. 用户对电影的浏览、评论、点赞、跳转到观看网址 49 | 50 | 6. 用户对影评的浏览、评论 51 | 52 | * 后台 53 | 54 | 1. 电影管理: 查询所有电影、添加电影、删除电影、修改电影信息、更新主页的推荐电影 55 | 56 | 2. 影评管理:查询所有影评、添加影评、删除影评、修改影评信息、更新主页的推荐影评 57 | 58 | 3. 评论管理:查询所有用户评论、删除用户评论、审核用户评论 59 | 60 | 4. 用户管理:查询所有用户、删除用户、封停/解封用户、修改用户身份(用户/管理员)、修改用户权限(0-普通用户,1-普通管理员,2-超级管理员,数字越大权限越高) 61 | 62 | ## 4.数据库描述 63 | 64 | 数据库主要有6张表: 65 | 66 | 1. articles 影评表 67 | 68 | 2. comments 用户评论表 69 | 70 | 3. movies 电影表 71 | 72 | 4. recommends 主页显示大图的电影表 73 | 74 | 5. users 用户表 75 | 76 | 6. mails 站内信表(时间有限,此功能前台部分未实现) 77 | 78 | ## 5.项目截图 79 | 80 | ![首页](screenshot/1.首页.png) 81 | 82 | ![注册页面](screenshot/2.注册页面.png) 83 | 84 | ![登录页面](screenshot/3.登录页面.png) 85 | 86 | ![电影列表页面](screenshot/4.电影列表页面.png) 87 | 88 | ![影评列表页面](screenshot/5.影评列表页面.png) 89 | 90 | ![电影详情页面](screenshot/6.电影详情页面.png) 91 | 92 | ![影评详情页面](screenshot/7.影评详情页面.png) 93 | 94 | ![后台管理主页面](screenshot/8.后台管理主页面.png) 95 | 96 | ![电影管理页面](screenshot/9.电影管理页面.png) 97 | 98 | ![添加电影页面](screenshot/10.添加电影页面.png) 99 | 100 | ![影评管理页面](screenshot/11.影评管理页面.png) 101 | 102 | ![添加影评页面](screenshot/12.添加影评页面.png) 103 | 104 | ![评论管理页面](screenshot/13.评论管理页面.png) 105 | 106 | ![用户管理页面](screenshot/14.用户管理页面.png) 107 | -------------------------------------------------------------------------------- /book_service/.idea/book_service.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /book_service/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /book_service/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /book_service/app.js: -------------------------------------------------------------------------------- 1 | var createError = require('http-errors'); 2 | var express = require('express'); 3 | var path = require('path'); 4 | var cookieParser = require('cookie-parser'); 5 | var logger = require('morgan'); 6 | 7 | var indexRouter = require('./routes/index'); 8 | var usersRouter = require('./routes/users'); 9 | var adminRouter = require('./routes/admin'); 10 | 11 | var app = express(); 12 | 13 | 14 | 15 | // view engine setup 16 | app.set('views', path.join(__dirname, 'views')); 17 | app.set('view engine', 'jade'); 18 | 19 | app.use(logger('dev')); 20 | app.use(express.json()); 21 | app.use(express.urlencoded({ extended: false })); 22 | app.use(cookieParser()); 23 | app.use(express.static(path.join(__dirname, 'public'))); 24 | 25 | // 全路由的配置,跨域代码: 26 | app.all('*', function (req, res, next) { 27 | res.header('Access-Control-Allow-Origin', '*'); 28 | res.header('Access-Control-Allow-Headers', 'Content-Type, Content-length, Authorization, Accept, X-Requested-With, yourHeaderFeild'); 29 | res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS'); 30 | if(req.method == 'OPTIONS') 31 | res.send(200); 32 | else 33 | next(); 34 | }); 35 | 36 | app.use('/', indexRouter); 37 | app.use('/users', usersRouter); 38 | app.use('/admin', adminRouter); 39 | 40 | // catch 404 and forward to error handler 41 | app.use(function(req, res, next) { 42 | next(createError(404)); 43 | }); 44 | 45 | // error handler 46 | app.use(function(err, req, res, next) { 47 | // set locals, only providing error in development 48 | res.locals.message = err.message; 49 | res.locals.error = req.app.get('env') === 'development' ? err : {}; 50 | 51 | // render the error page 52 | res.status(err.status || 500); 53 | res.render('error'); 54 | }); 55 | 56 | module.exports = app; 57 | -------------------------------------------------------------------------------- /book_service/bin/www: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * Module dependencies. 5 | */ 6 | 7 | var app = require('../app'); 8 | var debug = require('debug')('book-service:server'); 9 | var http = require('http'); 10 | 11 | /** 12 | * Get port from environment and store in Express. 13 | */ 14 | 15 | var port = normalizePort(process.env.PORT || '3000'); 16 | app.set('port', port); 17 | 18 | /** 19 | * Create HTTP server. 20 | */ 21 | 22 | var server = http.createServer(app); 23 | 24 | /** 25 | * Listen on provided port, on all network interfaces. 26 | */ 27 | 28 | server.listen(port); 29 | server.on('error', onError); 30 | server.on('listening', onListening); 31 | 32 | /** 33 | * Normalize a port into a number, string, or false. 34 | */ 35 | 36 | function normalizePort(val) { 37 | var port = parseInt(val, 10); 38 | 39 | if (isNaN(port)) { 40 | // named pipe 41 | return val; 42 | } 43 | 44 | if (port >= 0) { 45 | // port number 46 | return port; 47 | } 48 | 49 | return false; 50 | } 51 | 52 | /** 53 | * Event listener for HTTP server "error" event. 54 | */ 55 | 56 | function onError(error) { 57 | if (error.syscall !== 'listen') { 58 | throw error; 59 | } 60 | 61 | var bind = typeof port === 'string' 62 | ? 'Pipe ' + port 63 | : 'Port ' + port; 64 | 65 | // handle specific listen errors with friendly messages 66 | switch (error.code) { 67 | case 'EACCES': 68 | console.error(bind + ' requires elevated privileges'); 69 | process.exit(1); 70 | break; 71 | case 'EADDRINUSE': 72 | console.error(bind + ' is already in use'); 73 | process.exit(1); 74 | break; 75 | default: 76 | throw error; 77 | } 78 | } 79 | 80 | /** 81 | * Event listener for HTTP server "listening" event. 82 | */ 83 | 84 | function onListening() { 85 | var addr = server.address(); 86 | var bind = typeof addr === 'string' 87 | ? 'pipe ' + addr 88 | : 'port ' + addr.port; 89 | debug('Listening on ' + bind); 90 | } 91 | -------------------------------------------------------------------------------- /book_service/common/db.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose'); 2 | var url = 'mongodb://localhost/movieServer'; 3 | mongoose.connect(url); 4 | 5 | /* 链接成功 */ 6 | mongoose.connection.on('connected', function() { 7 | console.log('Mongoose connection open to ' + url); 8 | }); 9 | 10 | // 链接异常 11 | mongoose.connection.on('error', function(err) { 12 | console.log('Mongoose connection error:' + err); 13 | }); 14 | 15 | // 链接断开 16 | mongoose.connection.on('disconnected', function() { 17 | console.log('Mongoose connection disconnected'); 18 | }); 19 | 20 | module.exports = mongoose; 21 | -------------------------------------------------------------------------------- /book_service/models/article.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('..//common/db'); 2 | 3 | // 建立文章的数据集 4 | var article = new mongoose.Schema({ 5 | articleTitle: String, 6 | articleContext: String, 7 | articleTime: String, 8 | articleMainPage: Boolean 9 | }); 10 | 11 | // 查找所有的文章 12 | article.statics.findAll = function (callBack) { 13 | this.find({}, callBack); 14 | }; 15 | 16 | // 根据文章ID查找 17 | article.statics.findByArticleId = function (id, callBack) { 18 | this.find({_id:id}, callBack); 19 | }; 20 | 21 | var articleModel = mongoose.model('article', article); 22 | 23 | module.exports = articleModel; 24 | -------------------------------------------------------------------------------- /book_service/models/comment.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('..//common/db'); 2 | 3 | // 建立电影评论数据集 4 | var comment = new mongoose.Schema({ 5 | movie_id: String, 6 | username: String, 7 | context: String, 8 | check: Boolean 9 | }); 10 | 11 | // 查找所有电影评论 12 | comment.statics.findAll = function (callBack) { 13 | this.find({}, callBack); 14 | }; 15 | 16 | // 根据电影ID查找已审核的评论 17 | comment.statics.findByMovieId = function (m_id, callBack) { 18 | this.find({movie_id:m_id, check: true}, callBack); 19 | }; 20 | 21 | var commentModel = mongoose.model('comment', comment); 22 | 23 | module.exports = commentModel; 24 | -------------------------------------------------------------------------------- /book_service/models/mail.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('..//common/db'); 2 | 3 | // 建立站内信数据集 4 | var mail = new mongoose.Schema({ 5 | fromUser: String, 6 | toUser: String, 7 | title: String, 8 | context: String, 9 | date: String 10 | }); 11 | 12 | // 根据收信人ID查找站内信 13 | mail.statics.findByToUserId = function (to_id, callBack) { 14 | this.find({toUser:to_id}, callBack); 15 | }; 16 | 17 | // 根据发信人ID查找站内信 18 | mail.statics.findByFromUserId = function (from_id, callBack) { 19 | this.find({fromUser:from_id}, callBack); 20 | }; 21 | 22 | var mailModel = mongoose.model('mail', mail); 23 | 24 | module.exports = mailModel; 25 | -------------------------------------------------------------------------------- /book_service/models/movie.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('..//common/db'); 2 | 3 | // 建立电影数据集 4 | var movie = new mongoose.Schema({ 5 | movieName: String, 6 | movieImg: String, 7 | movieVideo: String, 8 | movieDownload: String, 9 | movieTime: String, 10 | movieNumSuppose: Number, 11 | movieNumDownload: Number, 12 | movieMainPage: Boolean 13 | }); 14 | 15 | // 查找所有电影 16 | movie.statics.findAll = function (callBack) { 17 | this.find({}, callBack); 18 | }; 19 | 20 | // 根据电影id查找 21 | movie.statics.findById = function (m_id, callBack) { 22 | this.find({_id:m_id}, callBack); 23 | }; 24 | 25 | // 根据电影名查找 26 | movie.statics.findByMovieName = function (m_name, callBack) { 27 | this.find({movieName:m_name}, callBack); 28 | }; 29 | 30 | var movieModel = mongoose.model('movie', movie); 31 | 32 | module.exports = movieModel; 33 | -------------------------------------------------------------------------------- /book_service/models/recommend.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('..//common/db'); 2 | 3 | // 建立首页推荐的数据集 4 | var recommend = new mongoose.Schema({ 5 | recommendImg: String, 6 | recommendSrc: String, 7 | recommendTitle: String 8 | }); 9 | 10 | // 查找所有首页推荐的电影 11 | recommend.statics.findAll = function (callBack) { 12 | this.find({}, callBack); 13 | }; 14 | 15 | // 根据电影ID查找首页推荐 16 | recommend.statics.findByIndexId = function (m_id, callBack) { 17 | this.find({findByIndexId:m_id}, callBack); 18 | }; 19 | 20 | var recommendModel = mongoose.model('recommend', recommend); 21 | 22 | module.exports = recommendModel; 23 | -------------------------------------------------------------------------------- /book_service/models/user.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('..//common/db'); 2 | 3 | // 建立用户数据集 4 | var user = new mongoose.Schema({ 5 | username: String, 6 | password: String, 7 | userMail: String, 8 | userPhone: String, 9 | userAdmin: Boolean, 10 | userPower: Number, // userPower取值范围:0,1,2 0是普通用户没有后台权限,1是管理员1级权限,2是管理员2级权限能做的操作更多(如封停用户,管理用户权限,添加/删除主页推荐图片) 11 | userStop: Boolean 12 | }); 13 | 14 | // 查找所有用户 15 | user.statics.findAll = function (callBack) { 16 | this.find({}, callBack); 17 | }; 18 | 19 | // 根据用户名查找 20 | user.statics.findByUsername = function (name, callBack) { 21 | this.find({username:name}, callBack); 22 | }; 23 | 24 | // 根据用户id查找 25 | user.statics.findByUserId = function (id, callBack) { 26 | this.find({_id:id}, callBack); 27 | }; 28 | 29 | // 登录匹配:用户名与密码正确并且没有被封停 30 | user.statics.findUserLogin = function (name, password, callBack) { 31 | this.find({username:name, password:password}, callBack); 32 | }; 33 | 34 | // 根据用户名、邮箱、电话找回密码 35 | user.statics.findUserPassword = function (name, mail, phone, callBack) { 36 | this.find({username:name, userMail:mail, userPhone:phone}, callBack); 37 | }; 38 | 39 | var userModel = mongoose.model('user', user); 40 | module.exports = userModel; 41 | -------------------------------------------------------------------------------- /book_service/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "book-service", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "node ./bin/www" 7 | }, 8 | "dependencies": { 9 | "cookie-parser": "~1.4.4", 10 | "crypto": "^1.0.1", 11 | "debug": "~2.6.9", 12 | "express": "~4.16.1", 13 | "http-errors": "~1.6.3", 14 | "jade": "~1.11.0", 15 | "mongoose": "^5.6.0", 16 | "morgan": "~1.9.1" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /book_service/public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } 9 | -------------------------------------------------------------------------------- /book_service/routes/index.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | var mongoose = require('mongoose'); 4 | var recommend = require('../models/recommend'); 5 | var movie = require('../models/movie'); 6 | var article = require('../models/article'); 7 | var user = require('../models/user'); 8 | 9 | // 定义路由 10 | /* GET home page. */ 11 | router.get('/', function(req, res, next) { 12 | res.render('index', { title: 'Express' }); 13 | }); 14 | 15 | // 定义路由 16 | router.get('/mongooseTest', function (req, res, next) { 17 | mongoose.connect('mongodb://localhost/pets', {useMongoClient: true}); 18 | mongoose.Promise = global.Promise; 19 | 20 | var schema = new mongoose.Schema({name: String}); 21 | var Cat = mongoose.model('Cat', schema); 22 | 23 | var tom = new Cat({ name: 'Tom'}); 24 | tom.save(function (err) { 25 | if(err) 26 | console.log(err); 27 | else 28 | console.log('success insert'); 29 | }); 30 | res.send('数据库连接测试。。。'); 31 | }); 32 | 33 | // 显示主页的推荐大图 34 | router.get('/showIndex', function (req, res, next) { 35 | recommend.findAll(function (err, getRecommend) { 36 | res.json({status: 0 , message: "获取所有主页显示大图的电影", data: getRecommend}); 37 | }) 38 | }); 39 | 40 | // 显示主页的推荐电影 41 | router.get('/showRanking', function (req, res, next) { 42 | movie.find({movieMainPage: true}, function (err, getRecommend) { 43 | res.json({status: 0 , message: "获取所有主页推荐的电影", data: getRecommend}); 44 | }) 45 | }); 46 | 47 | // 显示所有的电影 48 | router.get('/showMovie', function (req, res, next) { 49 | movie.findAll(function (err, getMovies) { 50 | res.json({status: 0 , message: "获取所有的电影", data: getMovies}); 51 | }) 52 | }); 53 | 54 | // 显示主页的推荐文章 55 | router.get('/showArticle', function (req, res, next) { 56 | article.find({articleMainPage: true}, function (err, getArticles) { 57 | res.json({status: 0 , message: "获取所有主页推荐的文章", data: getArticles}); 58 | }) 59 | }); 60 | 61 | // 显示所有的文章 62 | router.get('/showAllArticle', function (req, res, next) { 63 | article.findAll(function (err, getAllArticles) { 64 | res.json({status: 0 , message: "获取所有的文章", data: getAllArticles}); 65 | }) 66 | }); 67 | 68 | // 显示文章的内容 69 | router.post('/articleDetail', function (req, res, next) { 70 | if(!req.body.article_id) 71 | res.json({status:1, message: "文章id出错"}); 72 | article.findByArticleId(req.body.article_id, function (err, getArticle) { 73 | res.json({status: 0 , message: "获取文章成功", data: getArticle}); 74 | }) 75 | }); 76 | 77 | // 显示用户个人信息的内容 78 | router.post('/showUser', function (req, res, next) { 79 | if(!req.body.user_id) 80 | res.json({status:1, message: "用户未登录"}); 81 | user.findByUserId(req.body.user_id, function (err, getUser) { 82 | res.json({status:0, message: "获取用户信息成功", data: { 83 | user_id: getUser[0]._id, 84 | username: getUser[0].username, 85 | userMail: getUser[0].userMail, 86 | userPhone: getUser[0].userPhone, 87 | userAdmin: getUser[0].userAdmin, 88 | userPower: getUser[0].userPower, 89 | userStop: getUser[0].userStop 90 | }}) 91 | }) 92 | }); 93 | 94 | module.exports = router; 95 | -------------------------------------------------------------------------------- /book_service/routes/users.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | var user = require('../models/user'); 4 | var crypto = require('crypto'); 5 | var movie = require('../models/movie'); 6 | var mail = require('../models/mail'); 7 | var comment = require('../models/comment'); 8 | var article = require('../models/article'); 9 | const init_token = 'TKL02o'; 10 | 11 | /* GET users listing. */ 12 | // status: 1为出错,0为正常。message: 提示信息。data: 返回的数据 13 | // 用户登录接口 14 | router.post('/login', function (req, res, next) { 15 | if(!req.body.username) 16 | res.json({status:1, message: "用户名为空"}); 17 | if(!req.body.password) 18 | res.json({status:1, message: "密码为空"}); 19 | user.findUserLogin(req.body.username, req.body.password, function (err, userSave) { 20 | console.log(userSave); 21 | if(userSave.length != 0){ 22 | if(userSave[0].userStop == true) 23 | res.json({status:1, message: "该账户已被封停"}); 24 | else{ 25 | var token_after = getMD5Password(userSave[0]._id); 26 | res.json({status:0, data: {token: token_after, user: userSave}, message: "用户登录成功"}); 27 | } 28 | } 29 | else 30 | res.json({status:1, message: "用户名或密码错误"}); 31 | }); 32 | }); 33 | 34 | // 用户注册接口 35 | router.post('/register', function (req, res, next) { 36 | if(!req.body.username) 37 | res.json({status:1, message: "用户名为空"}); 38 | if(!req.body.password) 39 | res.json({status:1, message: "密码为空"}); 40 | if(!req.body.userMail) 41 | res.json({status:1, message: "邮箱为空"}); 42 | if(!req.body.userPhone) 43 | res.json({status:1, message: "手机号码为空"}); 44 | 45 | user.findByUsername(req.body.username, function (err, userSave) { 46 | if(userSave.length != 0) 47 | res.json({status:1, message: "用户名已存在"}); 48 | else{ 49 | var registerUser = new user({ 50 | username: req.body.username, 51 | password: req.body.password, 52 | userMail: req.body.userMail, 53 | userPhone: req.body.userPhone, 54 | userAdmin: 0, 55 | userPower: 0, 56 | userStop: 0 57 | }); 58 | registerUser.save(function () { 59 | res.json({status:0, message: "注册成功"}); 60 | }); 61 | } 62 | }) 63 | }); 64 | 65 | // 用户评论接口 66 | router.post('/postComment', function (req, res, next) { 67 | if(!req.body.username) 68 | var username = "匿名用户"; 69 | if(!req.body.movie_id) 70 | res.json({status:1, message: "电影id为空"}); 71 | else if(!req.body.context){ 72 | res.json({status:1, message: "评论内容为空"}); 73 | } 74 | else{ 75 | var saveComment = new comment({ 76 | movie_id: req.body.movie_id, 77 | username: req.body.username ? req.body.username : username, 78 | context: req.body.context, 79 | check: 0 80 | }); 81 | saveComment.save(function (err) { 82 | if(err) 83 | res.json({status:1, message: err}); 84 | else 85 | res.json({status:0, message: "评论成功,请等待系统管理员审核"}); 86 | }); 87 | } 88 | }); 89 | 90 | // 根据用户id查询用户身份 91 | router.post('/showIdentity', function(req, res, next) { 92 | if(!req.body.user_id) 93 | res.json({status:1, message: "用户id为空"}); 94 | user.findByUserId(req.body.user_id, function (err, identityData) { 95 | res.json({status:0, message:"获取用户身份信息成功", data: identityData}); 96 | }) 97 | }); 98 | 99 | // 根据电影id获取已审核的评论 100 | router.post('/showComment', function(req, res, next) { 101 | if(!req.body.movie_id) 102 | res.json({status:1, message: "电影id为空"}); 103 | comment.findByMovieId(req.body.movie_id, function (err, comment) { 104 | res.json({status:0, message:"获取已审核的评论成功", data: comment}); 105 | }) 106 | }); 107 | 108 | // 用户点赞接口 109 | router.post('/support', function (req, res, next) { 110 | if(!req.body.movie_id) 111 | res.json({status:1, message: "电影id为空"}); 112 | movie.findById(req.body.movie_id, function (err, supportMovie) { 113 | movie.update({_id: req.body.movie_id}, {movieNumSuppose: supportMovie[0].movieNumSuppose+1}, function (err) { 114 | if(err) 115 | res.json({status:1, message: "点赞失败", data: err}); 116 | else 117 | res.json({status:0, message: "点赞成功"}); 118 | }); 119 | }); 120 | }); 121 | 122 | // 用户找回密码接口 123 | router.post('/findPassword', function (req, res, next) { 124 | if(!req.body.username) 125 | res.json({status:1, message: "用户名为空"}); 126 | if(!req.body.userMail) 127 | res.json({status:1, message: "邮箱为空"}); 128 | if(!req.body.userPhone) 129 | res.json({status:1, message: "手机号码为空"}); 130 | // 如果newPassword不存在,则检查该用户是否存在;若newPassword存在,则修改用户的密码 131 | if(!req.body.newPassword){ 132 | user.findUserPassword(req.body.username, req.body.userMail, req.body.userPhone, function (err, findUser) { 133 | if(findUser.length != 0){ 134 | if(findUser[0].userStop === false) 135 | res.json({status: 0, message : "验证成功"}); 136 | else 137 | res.json({status: 1, message : "该账户已被封停,无法设置新密码"}); 138 | } else { 139 | res.json({status: 1, message : "验证失败,请检查所有信息是否正确"}); 140 | } 141 | }) 142 | } else { 143 | user.findByUsername(req.body.username, function (err) { 144 | user.update({username: req.body.username}, {password: req.body.newPassword}, function (err) { 145 | if(err) 146 | res.json({status:1, message: "设置新密码失败", data: err}); 147 | else 148 | res.json({status:0, message: "设置新密码成功"}); 149 | }) 150 | }) 151 | } 152 | 153 | }); 154 | 155 | // 用户发送站内信接口 156 | router.post('/sendEmail', function (req, res, next) { 157 | if(!req.body.token) 158 | res.json({status:1, message: "用户登录状态出错"}); 159 | if(!req.body.user_id) 160 | res.json({status:1, message: "用户未登录"}); 161 | if(!req.body.toUserName) 162 | res.json({status:1, message: "收信人不能为空"}); 163 | if(!req.body.title) 164 | res.json({status:1, message: "标题不能为空"}); 165 | if(!req.body.context) 166 | res.json({status:1, message: "内容不能为空"}); 167 | if(req.body.token == getMD5Password(req.body.user_id)){ 168 | user.findByUsername(req.body.toUserName, function (err, toUser) { 169 | if(toUser.length != 0){ 170 | var nowTime = new Date(); 171 | var newEmail = new mail({ 172 | fromUser: req.body.user_id, 173 | toUser: toUser[0]._id, 174 | title: req.body.title, 175 | context: req.body.context, 176 | date: nowTime.toLocaleString() 177 | }); 178 | newEmail.save(function () { 179 | res.json({status: 0, message : "发送成功"}); 180 | }); 181 | }else{ 182 | res.json({status: 1, message : "收信人不存在"}); 183 | } 184 | }) 185 | }else{ 186 | res.json({status: 1, message : "用户登录错误"}); 187 | } 188 | }); 189 | 190 | 191 | // 接收站内信接口,receive=1:发送的内容,receive=2:接收的内容 192 | router.post('/showEmail', function (req, res, next) { 193 | if(!req.body.token) 194 | res.json({status:1, message: "用户登录状态出错"}); 195 | if(!req.body.user_id) 196 | res.json({status:1, message: "用户未登录"}); 197 | if(!req.body.receive) 198 | res.json({status:1, message: "参数出错"}); 199 | if(req.body.token == getMD5Password(req.body.user_id)){ 200 | if(req.body.receive == 1){ 201 | mail.findByFromUserId(req.body.user_id, function (err, sendMail) { 202 | res.json({status: 0, message : "获取发送的站内信成功", data: sendMail}); 203 | }) 204 | }else{ 205 | mail.findByToUserId(req.body.user_id, function (err, receiveMail) { 206 | res.json({status: 0, message : "获取收到的站内信成功", data: receiveMail}); 207 | }) 208 | } 209 | }else{ 210 | res.json({status: 1, message : "用户登录错误"}); 211 | } 212 | }); 213 | 214 | // 下载电影接口 215 | router.post('/download', function (req, res, next) { 216 | if(!req.body.movie_id) 217 | res.json({status:1, message: "电影id为空"}); 218 | movie.findById(req.body.movie_id, function (err, supportMovie) { 219 | if(err) 220 | res.json({status:1, message: "下载失败:不存在此电影id", data: err}); 221 | else 222 | { 223 | movie.update({_id: req.body.movie_id}, {movieNumDownload: supportMovie[0].movieNumDownload+1}, function (err) { 224 | if(err) 225 | res.json({status:1, message: "下载失败", data: err}); 226 | else 227 | res.json({status:0, message: "下载成功", data: supportMovie[0].movieDownload}); 228 | }); 229 | } 230 | }); 231 | }); 232 | 233 | // 根据id查看电影接口 234 | router.post('/movieDetail', function (req, res, next) { 235 | if(!req.body.movie_id) 236 | res.json({status:1, message: "电影id为空"}); 237 | movie.findById(req.body.movie_id, function (err, findMovie) { 238 | if(err) 239 | res.json({status:1, message: "不存在此电影id", data: err}); 240 | else 241 | { 242 | if(err) 243 | res.json({status:1, message: "根据id查看电影失败", data: err}); 244 | else 245 | res.json({status:0, message: "根据id查看电影成功", data: findMovie[0]}); 246 | } 247 | }); 248 | }); 249 | 250 | // 根据id查看文章接口 251 | router.post('/articleDetail', function (req, res, next) { 252 | if(!req.body.article_id) 253 | res.json({status:1, message: "文章id为空"}); 254 | article.findByArticleId(req.body.article_id, function (err, findArticle) { 255 | if(err) 256 | res.json({status:1, message: "不存在此文章id", data: err}); 257 | else 258 | { 259 | if(err) 260 | res.json({status:1, message: "根据id查看文章失败", data: err}); 261 | else 262 | res.json({status:0, message: "根据id查看文章成功", data: findArticle[0]}); 263 | } 264 | }); 265 | }); 266 | 267 | // 获取MD5值 268 | function getMD5Password(id){ 269 | var md5 = crypto.createHash('md5'); 270 | var token_before = id + init_token; 271 | return md5.update(token_before).digest('hex'); 272 | } 273 | 274 | module.exports = router; 275 | -------------------------------------------------------------------------------- /book_service/views/error.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | h1= message 5 | h2= error.status 6 | pre #{error.stack} 7 | -------------------------------------------------------------------------------- /book_service/views/index.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | h1= title 5 | p Welcome to #{title} 6 | -------------------------------------------------------------------------------- /book_service/views/layout.jade: -------------------------------------------------------------------------------- 1 | doctype html 2 | html 3 | head 4 | title= title 5 | link(rel='stylesheet', href='/stylesheets/style.css') 6 | body 7 | block content 8 | -------------------------------------------------------------------------------- /book_view/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { 4 | "modules": false, 5 | "targets": { 6 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] 7 | } 8 | }], 9 | "stage-2" 10 | ], 11 | "plugins": ["transform-vue-jsx", "transform-runtime"], 12 | "env": { 13 | "test": { 14 | "presets": ["env", "stage-2"], 15 | "plugins": ["transform-vue-jsx", "transform-es2015-modules-commonjs", "dynamic-import-node"] 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /book_view/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /book_view/.eslintignore: -------------------------------------------------------------------------------- 1 | /build/ 2 | /config/ 3 | /dist/ 4 | /*.js 5 | /test/unit/coverage/ 6 | -------------------------------------------------------------------------------- /book_view/.eslintrc.js: -------------------------------------------------------------------------------- 1 | // https://eslint.org/docs/user-guide/configuring 2 | 3 | module.exports = { 4 | root: true, 5 | parserOptions: { 6 | parser: 'babel-eslint' 7 | }, 8 | env: { 9 | browser: true, 10 | }, 11 | extends: [ 12 | // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention 13 | // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules. 14 | 'plugin:vue/essential', 15 | // https://github.com/standard/standard/blob/master/docs/RULES-en.md 16 | 'standard' 17 | ], 18 | // required to lint *.vue files 19 | plugins: [ 20 | 'vue' 21 | ], 22 | // add your custom rules here 23 | rules: { 24 | // allow async-await 25 | 'generator-star-spacing': 'off', 26 | // allow debugger during development 27 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /book_view/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | /dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | /test/unit/coverage/ 8 | /test/e2e/reports/ 9 | selenium-debug.log 10 | 11 | # Editor directories and files 12 | .idea 13 | .vscode 14 | *.suo 15 | *.ntvs* 16 | *.njsproj 17 | *.sln 18 | -------------------------------------------------------------------------------- /book_view/.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | "postcss-import": {}, 6 | "postcss-url": {}, 7 | // to edit target browsers: use "browserslist" field in package.json 8 | "autoprefixer": {} 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /book_view/README.md: -------------------------------------------------------------------------------- 1 | # book_view 2 | 3 | > A Vue.js project 4 | 5 | ## Build Setup 6 | 7 | ``` bash 8 | # install dependencies 9 | npm install 10 | 11 | # serve with hot reload at localhost:8080 12 | npm run dev 13 | 14 | # build for production with minification 15 | npm run build 16 | 17 | # build for production and view the bundle analyzer report 18 | npm run build --report 19 | 20 | # run unit tests 21 | npm run unit 22 | 23 | # run e2e tests 24 | npm run e2e 25 | 26 | # run all tests 27 | npm test 28 | ``` 29 | 30 | For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader). 31 | -------------------------------------------------------------------------------- /book_view/build/build.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | require('./check-versions')() 3 | 4 | process.env.NODE_ENV = 'production' 5 | 6 | const ora = require('ora') 7 | const rm = require('rimraf') 8 | const path = require('path') 9 | const chalk = require('chalk') 10 | const webpack = require('webpack') 11 | const config = require('../config') 12 | const webpackConfig = require('./webpack.prod.conf') 13 | 14 | const spinner = ora('building for production...') 15 | spinner.start() 16 | 17 | rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { 18 | if (err) throw err 19 | webpack(webpackConfig, (err, stats) => { 20 | spinner.stop() 21 | if (err) throw err 22 | process.stdout.write(stats.toString({ 23 | colors: true, 24 | modules: false, 25 | children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build. 26 | chunks: false, 27 | chunkModules: false 28 | }) + '\n\n') 29 | 30 | if (stats.hasErrors()) { 31 | console.log(chalk.red(' Build failed with errors.\n')) 32 | process.exit(1) 33 | } 34 | 35 | console.log(chalk.cyan(' Build complete.\n')) 36 | console.log(chalk.yellow( 37 | ' Tip: built files are meant to be served over an HTTP server.\n' + 38 | ' Opening index.html over file:// won\'t work.\n' 39 | )) 40 | }) 41 | }) 42 | -------------------------------------------------------------------------------- /book_view/build/check-versions.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const chalk = require('chalk') 3 | const semver = require('semver') 4 | const packageConfig = require('../package.json') 5 | const shell = require('shelljs') 6 | 7 | function exec (cmd) { 8 | return require('child_process').execSync(cmd).toString().trim() 9 | } 10 | 11 | const versionRequirements = [ 12 | { 13 | name: 'node', 14 | currentVersion: semver.clean(process.version), 15 | versionRequirement: packageConfig.engines.node 16 | } 17 | ] 18 | 19 | if (shell.which('npm')) { 20 | versionRequirements.push({ 21 | name: 'npm', 22 | currentVersion: exec('npm --version'), 23 | versionRequirement: packageConfig.engines.npm 24 | }) 25 | } 26 | 27 | module.exports = function () { 28 | const warnings = [] 29 | 30 | for (let i = 0; i < versionRequirements.length; i++) { 31 | const mod = versionRequirements[i] 32 | 33 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { 34 | warnings.push(mod.name + ': ' + 35 | chalk.red(mod.currentVersion) + ' should be ' + 36 | chalk.green(mod.versionRequirement) 37 | ) 38 | } 39 | } 40 | 41 | if (warnings.length) { 42 | console.log('') 43 | console.log(chalk.yellow('To use this template, you must update following to modules:')) 44 | console.log() 45 | 46 | for (let i = 0; i < warnings.length; i++) { 47 | const warning = warnings[i] 48 | console.log(' ' + warning) 49 | } 50 | 51 | console.log() 52 | process.exit(1) 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /book_view/build/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangjun1996/VueMovieWebsite/31b11000a973ea36fd0e8b2b84af759534114a7f/book_view/build/logo.png -------------------------------------------------------------------------------- /book_view/build/utils.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const config = require('../config') 4 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 5 | const packageConfig = require('../package.json') 6 | 7 | exports.assetsPath = function (_path) { 8 | const assetsSubDirectory = process.env.NODE_ENV === 'production' 9 | ? config.build.assetsSubDirectory 10 | : config.dev.assetsSubDirectory 11 | 12 | return path.posix.join(assetsSubDirectory, _path) 13 | } 14 | 15 | exports.cssLoaders = function (options) { 16 | options = options || {} 17 | 18 | const cssLoader = { 19 | loader: 'css-loader', 20 | options: { 21 | sourceMap: options.sourceMap 22 | } 23 | } 24 | 25 | const postcssLoader = { 26 | loader: 'postcss-loader', 27 | options: { 28 | sourceMap: options.sourceMap 29 | } 30 | } 31 | 32 | // generate loader string to be used with extract text plugin 33 | function generateLoaders (loader, loaderOptions) { 34 | const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader] 35 | 36 | if (loader) { 37 | loaders.push({ 38 | loader: loader + '-loader', 39 | options: Object.assign({}, loaderOptions, { 40 | sourceMap: options.sourceMap 41 | }) 42 | }) 43 | } 44 | 45 | // Extract CSS when that option is specified 46 | // (which is the case during production build) 47 | if (options.extract) { 48 | return ExtractTextPlugin.extract({ 49 | use: loaders, 50 | fallback: 'vue-style-loader' 51 | }) 52 | } else { 53 | return ['vue-style-loader'].concat(loaders) 54 | } 55 | } 56 | 57 | // https://vue-loader.vuejs.org/en/configurations/extract-css.html 58 | return { 59 | css: generateLoaders(), 60 | postcss: generateLoaders(), 61 | less: generateLoaders('less'), 62 | sass: generateLoaders('sass', { indentedSyntax: true }), 63 | scss: generateLoaders('sass'), 64 | stylus: generateLoaders('stylus'), 65 | styl: generateLoaders('stylus') 66 | } 67 | } 68 | 69 | // Generate loaders for standalone style files (outside of .vue) 70 | exports.styleLoaders = function (options) { 71 | const output = [] 72 | const loaders = exports.cssLoaders(options) 73 | 74 | for (const extension in loaders) { 75 | const loader = loaders[extension] 76 | output.push({ 77 | test: new RegExp('\\.' + extension + '$'), 78 | use: loader 79 | }) 80 | } 81 | 82 | return output 83 | } 84 | 85 | exports.createNotifierCallback = () => { 86 | const notifier = require('node-notifier') 87 | 88 | return (severity, errors) => { 89 | if (severity !== 'error') return 90 | 91 | const error = errors[0] 92 | const filename = error.file && error.file.split('!').pop() 93 | 94 | notifier.notify({ 95 | title: packageConfig.name, 96 | message: severity + ': ' + error.name, 97 | subtitle: filename || '', 98 | icon: path.join(__dirname, 'logo.png') 99 | }) 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /book_view/build/vue-loader.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const utils = require('./utils') 3 | const config = require('../config') 4 | const isProduction = process.env.NODE_ENV === 'production' 5 | const sourceMapEnabled = isProduction 6 | ? config.build.productionSourceMap 7 | : config.dev.cssSourceMap 8 | 9 | module.exports = { 10 | loaders: utils.cssLoaders({ 11 | sourceMap: sourceMapEnabled, 12 | extract: isProduction 13 | }), 14 | cssSourceMap: sourceMapEnabled, 15 | cacheBusting: config.dev.cacheBusting, 16 | transformToRequire: { 17 | video: ['src', 'poster'], 18 | source: 'src', 19 | img: 'src', 20 | image: 'xlink:href' 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /book_view/build/webpack.base.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const utils = require('./utils') 4 | const config = require('../config') 5 | const vueLoaderConfig = require('./vue-loader.conf') 6 | 7 | function resolve (dir) { 8 | return path.join(__dirname, '..', dir) 9 | } 10 | 11 | const createLintingRule = () => ({ 12 | test: /\.(js|vue)$/, 13 | loader: 'eslint-loader', 14 | enforce: 'pre', 15 | include: [resolve('src'), resolve('test')], 16 | options: { 17 | formatter: require('eslint-friendly-formatter'), 18 | emitWarning: !config.dev.showEslintErrorsInOverlay 19 | } 20 | }) 21 | 22 | module.exports = { 23 | context: path.resolve(__dirname, '../'), 24 | entry: { 25 | app: './src/main.js' 26 | }, 27 | output: { 28 | path: config.build.assetsRoot, 29 | filename: '[name].js', 30 | publicPath: process.env.NODE_ENV === 'production' 31 | ? config.build.assetsPublicPath 32 | : config.dev.assetsPublicPath 33 | }, 34 | resolve: { 35 | extensions: ['.js', '.vue', '.json'], 36 | alias: { 37 | 'vue$': 'vue/dist/vue.esm.js', 38 | '@': resolve('src'), 39 | } 40 | }, 41 | module: { 42 | rules: [ 43 | // ...(config.dev.useEslint ? [createLintingRule()] : []), 44 | { 45 | test: /\.vue$/, 46 | loader: 'vue-loader', 47 | options: vueLoaderConfig 48 | }, 49 | { 50 | test: /\.js$/, 51 | loader: 'babel-loader', 52 | include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')] 53 | }, 54 | { 55 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, 56 | loader: 'url-loader', 57 | options: { 58 | limit: 10000, 59 | name: utils.assetsPath('img/[name].[hash:7].[ext]') 60 | } 61 | }, 62 | { 63 | test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, 64 | loader: 'url-loader', 65 | options: { 66 | limit: 10000, 67 | name: utils.assetsPath('media/[name].[hash:7].[ext]') 68 | } 69 | }, 70 | { 71 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, 72 | loader: 'url-loader', 73 | options: { 74 | limit: 10000, 75 | name: utils.assetsPath('fonts/[name].[hash:7].[ext]') 76 | } 77 | } 78 | ] 79 | }, 80 | node: { 81 | // prevent webpack from injecting useless setImmediate polyfill because Vue 82 | // source contains it (although only uses it if it's native). 83 | setImmediate: false, 84 | // prevent webpack from injecting mocks to Node native modules 85 | // that does not make sense for the client 86 | dgram: 'empty', 87 | fs: 'empty', 88 | net: 'empty', 89 | tls: 'empty', 90 | child_process: 'empty' 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /book_view/build/webpack.dev.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const utils = require('./utils') 3 | const webpack = require('webpack') 4 | const config = require('../config') 5 | const merge = require('webpack-merge') 6 | const path = require('path') 7 | const baseWebpackConfig = require('./webpack.base.conf') 8 | const CopyWebpackPlugin = require('copy-webpack-plugin') 9 | const HtmlWebpackPlugin = require('html-webpack-plugin') 10 | const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') 11 | const portfinder = require('portfinder') 12 | 13 | const HOST = process.env.HOST 14 | const PORT = process.env.PORT && Number(process.env.PORT) 15 | 16 | const devWebpackConfig = merge(baseWebpackConfig, { 17 | module: { 18 | rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true }) 19 | }, 20 | // cheap-module-eval-source-map is faster for development 21 | devtool: config.dev.devtool, 22 | 23 | // these devServer options should be customized in /config/index.js 24 | devServer: { 25 | clientLogLevel: 'warning', 26 | historyApiFallback: { 27 | rewrites: [ 28 | { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') }, 29 | ], 30 | }, 31 | hot: true, 32 | contentBase: false, // since we use CopyWebpackPlugin. 33 | compress: true, 34 | host: HOST || config.dev.host, 35 | port: PORT || config.dev.port, 36 | open: config.dev.autoOpenBrowser, 37 | overlay: config.dev.errorOverlay 38 | ? { warnings: false, errors: true } 39 | : false, 40 | publicPath: config.dev.assetsPublicPath, 41 | proxy: config.dev.proxyTable, 42 | quiet: true, // necessary for FriendlyErrorsPlugin 43 | watchOptions: { 44 | poll: config.dev.poll, 45 | } 46 | }, 47 | plugins: [ 48 | new webpack.DefinePlugin({ 49 | 'process.env': require('../config/dev.env') 50 | }), 51 | new webpack.HotModuleReplacementPlugin(), 52 | new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update. 53 | new webpack.NoEmitOnErrorsPlugin(), 54 | // https://github.com/ampedandwired/html-webpack-plugin 55 | new HtmlWebpackPlugin({ 56 | filename: 'index.html', 57 | template: 'index.html', 58 | inject: true 59 | }), 60 | // copy custom static assets 61 | new CopyWebpackPlugin([ 62 | { 63 | from: path.resolve(__dirname, '../static'), 64 | to: config.dev.assetsSubDirectory, 65 | ignore: ['.*'] 66 | } 67 | ]) 68 | ] 69 | }) 70 | 71 | module.exports = new Promise((resolve, reject) => { 72 | portfinder.basePort = process.env.PORT || config.dev.port 73 | portfinder.getPort((err, port) => { 74 | if (err) { 75 | reject(err) 76 | } else { 77 | // publish the new Port, necessary for e2e tests 78 | process.env.PORT = port 79 | // add port to devServer config 80 | devWebpackConfig.devServer.port = port 81 | 82 | // Add FriendlyErrorsPlugin 83 | devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({ 84 | compilationSuccessInfo: { 85 | messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`], 86 | }, 87 | onErrors: config.dev.notifyOnErrors 88 | ? utils.createNotifierCallback() 89 | : undefined 90 | })) 91 | 92 | resolve(devWebpackConfig) 93 | } 94 | }) 95 | }) 96 | -------------------------------------------------------------------------------- /book_view/build/webpack.prod.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const utils = require('./utils') 4 | const webpack = require('webpack') 5 | const config = require('../config') 6 | const merge = require('webpack-merge') 7 | const baseWebpackConfig = require('./webpack.base.conf') 8 | const CopyWebpackPlugin = require('copy-webpack-plugin') 9 | const HtmlWebpackPlugin = require('html-webpack-plugin') 10 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 11 | const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') 12 | const UglifyJsPlugin = require('uglifyjs-webpack-plugin') 13 | 14 | const env = process.env.NODE_ENV === 'testing' 15 | ? require('../config/test.env') 16 | : require('../config/prod.env') 17 | 18 | const webpackConfig = merge(baseWebpackConfig, { 19 | module: { 20 | rules: utils.styleLoaders({ 21 | sourceMap: config.build.productionSourceMap, 22 | extract: true, 23 | usePostCSS: true 24 | }) 25 | }, 26 | devtool: config.build.productionSourceMap ? config.build.devtool : false, 27 | output: { 28 | path: config.build.assetsRoot, 29 | filename: utils.assetsPath('js/[name].[chunkhash].js'), 30 | chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') 31 | }, 32 | plugins: [ 33 | // http://vuejs.github.io/vue-loader/en/workflow/production.html 34 | new webpack.DefinePlugin({ 35 | 'process.env': env 36 | }), 37 | new UglifyJsPlugin({ 38 | uglifyOptions: { 39 | compress: { 40 | warnings: false 41 | } 42 | }, 43 | sourceMap: config.build.productionSourceMap, 44 | parallel: true 45 | }), 46 | // extract css into its own file 47 | new ExtractTextPlugin({ 48 | filename: utils.assetsPath('css/[name].[contenthash].css'), 49 | // Setting the following option to `false` will not extract CSS from codesplit chunks. 50 | // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack. 51 | // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`, 52 | // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110 53 | allChunks: true, 54 | }), 55 | // Compress extracted CSS. We are using this plugin so that possible 56 | // duplicated CSS from different components can be deduped. 57 | new OptimizeCSSPlugin({ 58 | cssProcessorOptions: config.build.productionSourceMap 59 | ? { safe: true, map: { inline: false } } 60 | : { safe: true } 61 | }), 62 | // generate dist index.html with correct asset hash for caching. 63 | // you can customize output by editing /index.html 64 | // see https://github.com/ampedandwired/html-webpack-plugin 65 | new HtmlWebpackPlugin({ 66 | filename: process.env.NODE_ENV === 'testing' 67 | ? 'index.html' 68 | : config.build.index, 69 | template: 'index.html', 70 | inject: true, 71 | minify: { 72 | removeComments: true, 73 | collapseWhitespace: true, 74 | removeAttributeQuotes: true 75 | // more options: 76 | // https://github.com/kangax/html-minifier#options-quick-reference 77 | }, 78 | // necessary to consistently work with multiple chunks via CommonsChunkPlugin 79 | chunksSortMode: 'dependency' 80 | }), 81 | // keep module.id stable when vendor modules does not change 82 | new webpack.HashedModuleIdsPlugin(), 83 | // enable scope hoisting 84 | new webpack.optimize.ModuleConcatenationPlugin(), 85 | // split vendor js into its own file 86 | new webpack.optimize.CommonsChunkPlugin({ 87 | name: 'vendor', 88 | minChunks (module) { 89 | // any required modules inside node_modules are extracted to vendor 90 | return ( 91 | module.resource && 92 | /\.js$/.test(module.resource) && 93 | module.resource.indexOf( 94 | path.join(__dirname, '../node_modules') 95 | ) === 0 96 | ) 97 | } 98 | }), 99 | // extract webpack runtime and module manifest to its own file in order to 100 | // prevent vendor hash from being updated whenever app bundle is updated 101 | new webpack.optimize.CommonsChunkPlugin({ 102 | name: 'manifest', 103 | minChunks: Infinity 104 | }), 105 | // This instance extracts shared chunks from code splitted chunks and bundles them 106 | // in a separate chunk, similar to the vendor chunk 107 | // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk 108 | new webpack.optimize.CommonsChunkPlugin({ 109 | name: 'app', 110 | async: 'vendor-async', 111 | children: true, 112 | minChunks: 3 113 | }), 114 | 115 | // copy custom static assets 116 | new CopyWebpackPlugin([ 117 | { 118 | from: path.resolve(__dirname, '../static'), 119 | to: config.build.assetsSubDirectory, 120 | ignore: ['.*'] 121 | } 122 | ]) 123 | ] 124 | }) 125 | 126 | if (config.build.productionGzip) { 127 | const CompressionWebpackPlugin = require('compression-webpack-plugin') 128 | 129 | webpackConfig.plugins.push( 130 | new CompressionWebpackPlugin({ 131 | asset: '[path].gz[query]', 132 | algorithm: 'gzip', 133 | test: new RegExp( 134 | '\\.(' + 135 | config.build.productionGzipExtensions.join('|') + 136 | ')$' 137 | ), 138 | threshold: 10240, 139 | minRatio: 0.8 140 | }) 141 | ) 142 | } 143 | 144 | if (config.build.bundleAnalyzerReport) { 145 | const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin 146 | webpackConfig.plugins.push(new BundleAnalyzerPlugin()) 147 | } 148 | 149 | module.exports = webpackConfig 150 | -------------------------------------------------------------------------------- /book_view/config/dev.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const merge = require('webpack-merge') 3 | const prodEnv = require('./prod.env') 4 | 5 | module.exports = merge(prodEnv, { 6 | NODE_ENV: '"development"' 7 | }) 8 | -------------------------------------------------------------------------------- /book_view/config/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | // Template version: 1.3.1 3 | // see http://vuejs-templates.github.io/webpack for documentation. 4 | 5 | const path = require('path') 6 | 7 | module.exports = { 8 | dev: { 9 | 10 | // Paths 11 | assetsSubDirectory: 'static', 12 | assetsPublicPath: '/', 13 | proxyTable: {}, 14 | 15 | // Various Dev Server settings 16 | host: 'localhost', // can be overwritten by process.env.HOST 17 | port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined 18 | autoOpenBrowser: false, 19 | errorOverlay: true, 20 | notifyOnErrors: true, 21 | poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- 22 | 23 | // Use Eslint Loader? 24 | // If true, your code will be linted during bundling and 25 | // linting errors and warnings will be shown in the console. 26 | useEslint: true, 27 | // If true, eslint errors and warnings will also be shown in the error overlay 28 | // in the browser. 29 | showEslintErrorsInOverlay: false, 30 | 31 | /** 32 | * Source Maps 33 | */ 34 | 35 | // https://webpack.js.org/configuration/devtool/#development 36 | devtool: 'cheap-module-eval-source-map', 37 | 38 | // If you have problems debugging vue-files in devtools, 39 | // set this to false - it *may* help 40 | // https://vue-loader.vuejs.org/en/options.html#cachebusting 41 | cacheBusting: true, 42 | 43 | cssSourceMap: true 44 | }, 45 | 46 | build: { 47 | // Template for index.html 48 | index: path.resolve(__dirname, '../dist/index.html'), 49 | 50 | // Paths 51 | assetsRoot: path.resolve(__dirname, '../dist'), 52 | assetsSubDirectory: 'static', 53 | assetsPublicPath: '/', 54 | 55 | /** 56 | * Source Maps 57 | */ 58 | 59 | productionSourceMap: true, 60 | // https://webpack.js.org/configuration/devtool/#production 61 | devtool: '#source-map', 62 | 63 | // Gzip off by default as many popular static hosts such as 64 | // Surge or Netlify already gzip all static assets for you. 65 | // Before setting to `true`, make sure to: 66 | // npm install --save-dev compression-webpack-plugin 67 | productionGzip: false, 68 | productionGzipExtensions: ['js', 'css'], 69 | 70 | // Run the build command with an extra argument to 71 | // View the bundle analyzer report after build finishes: 72 | // `npm run build --report` 73 | // Set to `true` or `false` to always turn it on or off 74 | bundleAnalyzerReport: process.env.npm_config_report 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /book_view/config/prod.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | module.exports = { 3 | NODE_ENV: '"production"' 4 | } 5 | -------------------------------------------------------------------------------- /book_view/config/test.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const merge = require('webpack-merge') 3 | const devEnv = require('./dev.env') 4 | 5 | module.exports = merge(devEnv, { 6 | NODE_ENV: '"testing"' 7 | }) 8 | -------------------------------------------------------------------------------- /book_view/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | book_view 7 | 8 | 9 |
10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /book_view/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "book_view", 3 | "version": "1.0.0", 4 | "description": "A Vue.js project", 5 | "author": "", 6 | "private": true, 7 | "scripts": { 8 | "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", 9 | "start": "npm run dev", 10 | "unit": "jest --config test/unit/jest.conf.js --coverage", 11 | "e2e": "node test/e2e/runner.js", 12 | "test": "npm run unit && npm run e2e", 13 | "lint": "eslint --ext .js,.vue src test/unit test/e2e/specs", 14 | "build": "node build/build.js" 15 | }, 16 | "dependencies": { 17 | "iview": "^3.4.2", 18 | "vue": "^2.5.2", 19 | "vue-resource": "^1.5.1", 20 | "vue-router": "^3.0.1" 21 | }, 22 | "devDependencies": { 23 | "autoprefixer": "^7.1.2", 24 | "babel-core": "^6.22.1", 25 | "babel-eslint": "^8.2.1", 26 | "babel-helper-vue-jsx-merge-props": "^2.0.3", 27 | "babel-jest": "^21.0.2", 28 | "babel-loader": "^7.1.1", 29 | "babel-plugin-dynamic-import-node": "^1.2.0", 30 | "babel-plugin-syntax-jsx": "^6.18.0", 31 | "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", 32 | "babel-plugin-transform-runtime": "^6.22.0", 33 | "babel-plugin-transform-vue-jsx": "^3.5.0", 34 | "babel-preset-env": "^1.3.2", 35 | "babel-preset-stage-2": "^6.22.0", 36 | "babel-register": "^6.22.0", 37 | "chalk": "^2.0.1", 38 | "chromedriver": "^2.27.2", 39 | "copy-webpack-plugin": "^4.0.1", 40 | "cross-spawn": "^5.0.1", 41 | "css-loader": "^0.28.0", 42 | "eslint": "^4.15.0", 43 | "eslint-config-standard": "^10.2.1", 44 | "eslint-friendly-formatter": "^3.0.0", 45 | "eslint-loader": "^1.7.1", 46 | "eslint-plugin-import": "^2.7.0", 47 | "eslint-plugin-node": "^5.2.0", 48 | "eslint-plugin-promise": "^3.4.0", 49 | "eslint-plugin-standard": "^3.0.1", 50 | "eslint-plugin-vue": "^4.0.0", 51 | "extract-text-webpack-plugin": "^3.0.0", 52 | "file-loader": "^1.1.4", 53 | "friendly-errors-webpack-plugin": "^1.6.1", 54 | "html-webpack-plugin": "^2.30.1", 55 | "jest": "^22.0.4", 56 | "jest-serializer-vue": "^0.3.0", 57 | "nightwatch": "^0.9.12", 58 | "node-notifier": "^5.1.2", 59 | "optimize-css-assets-webpack-plugin": "^3.2.0", 60 | "ora": "^1.2.0", 61 | "portfinder": "^1.0.13", 62 | "postcss-import": "^11.0.0", 63 | "postcss-loader": "^2.0.8", 64 | "postcss-url": "^7.2.1", 65 | "rimraf": "^2.6.0", 66 | "selenium-server": "^3.0.1", 67 | "semver": "^5.3.0", 68 | "shelljs": "^0.7.6", 69 | "uglifyjs-webpack-plugin": "^1.1.1", 70 | "url-loader": "^0.5.8", 71 | "vue-jest": "^1.0.2", 72 | "vue-loader": "^13.3.0", 73 | "vue-style-loader": "^3.0.1", 74 | "vue-template-compiler": "^2.5.2", 75 | "webpack": "^3.6.0", 76 | "webpack-bundle-analyzer": "^2.9.0", 77 | "webpack-dev-server": "^2.9.1", 78 | "webpack-merge": "^4.1.0" 79 | }, 80 | "engines": { 81 | "node": ">= 6.0.0", 82 | "npm": ">= 3.0.0" 83 | }, 84 | "browserslist": [ 85 | "> 1%", 86 | "last 2 versions", 87 | "not ie <= 8" 88 | ] 89 | } 90 | -------------------------------------------------------------------------------- /book_view/src/App.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | 14 | 24 | -------------------------------------------------------------------------------- /book_view/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangjun1996/VueMovieWebsite/31b11000a973ea36fd0e8b2b84af759534114a7f/book_view/src/assets/logo.png -------------------------------------------------------------------------------- /book_view/src/components/AdminMenu.vue: -------------------------------------------------------------------------------- 1 | 60 | 61 | 74 | 75 | 78 | -------------------------------------------------------------------------------- /book_view/src/components/Comment.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 74 | 75 | 80 | -------------------------------------------------------------------------------- /book_view/src/components/CommonFooter.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 20 | 21 | 38 | -------------------------------------------------------------------------------- /book_view/src/components/HelloWorld.vue: -------------------------------------------------------------------------------- 1 | 85 | 86 | 96 | 97 | 98 | 114 | -------------------------------------------------------------------------------- /book_view/src/components/IndexHeaderPic.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 19 | 20 | 39 | -------------------------------------------------------------------------------- /book_view/src/components/MovieIndexHeader.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 26 | -------------------------------------------------------------------------------- /book_view/src/components/MoviesList.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 25 | 26 | 33 | -------------------------------------------------------------------------------- /book_view/src/components/NewsList.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 24 | 25 | 32 | -------------------------------------------------------------------------------- /book_view/src/components/UserInfo.vue: -------------------------------------------------------------------------------- 1 | 33 | 34 | 78 | 79 | 87 | -------------------------------------------------------------------------------- /book_view/src/components/UserMessage.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 64 | 65 | 82 | -------------------------------------------------------------------------------- /book_view/src/main.js: -------------------------------------------------------------------------------- 1 | // The Vue build version to load with the `import` command 2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias. 3 | import Vue from 'vue' 4 | import App from './App' 5 | import router from './router' 6 | import iView from 'iview' 7 | import 'iview/dist/styles/iview.css' 8 | 9 | Vue.config.productionTip = false 10 | 11 | Vue.use(iView) 12 | 13 | /* eslint-disable no-new */ 14 | new Vue({ 15 | el: '#app', 16 | router, 17 | components: { App }, 18 | template: '' 19 | }) 20 | -------------------------------------------------------------------------------- /book_view/src/pages/admin.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 34 | 35 | 38 | -------------------------------------------------------------------------------- /book_view/src/pages/adminAddArticle.vue: -------------------------------------------------------------------------------- 1 | 57 | 58 | 109 | 110 | 122 | -------------------------------------------------------------------------------- /book_view/src/pages/adminAddMovie.vue: -------------------------------------------------------------------------------- 1 | 99 | 100 | 161 | 162 | 174 | -------------------------------------------------------------------------------- /book_view/src/pages/adminArticleList.vue: -------------------------------------------------------------------------------- 1 | 70 | 71 | 288 | 289 | 292 | -------------------------------------------------------------------------------- /book_view/src/pages/adminCommentList.vue: -------------------------------------------------------------------------------- 1 | 64 | 65 | 255 | 256 | 259 | -------------------------------------------------------------------------------- /book_view/src/pages/adminMovieList.vue: -------------------------------------------------------------------------------- 1 | 90 | 91 | 343 | 344 | 347 | -------------------------------------------------------------------------------- /book_view/src/pages/adminUserList.vue: -------------------------------------------------------------------------------- 1 | 88 | 89 | 420 | 421 | 424 | -------------------------------------------------------------------------------- /book_view/src/pages/forgetPassword.vue: -------------------------------------------------------------------------------- 1 | 46 | 47 | 101 | 102 | 110 | -------------------------------------------------------------------------------- /book_view/src/pages/index.vue: -------------------------------------------------------------------------------- 1 | 39 | 40 | 77 | 78 | 106 | -------------------------------------------------------------------------------- /book_view/src/pages/loginPage.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 83 | 84 | 96 | -------------------------------------------------------------------------------- /book_view/src/pages/movieDetail.vue: -------------------------------------------------------------------------------- 1 | 33 | 34 | 89 | 90 | 112 | -------------------------------------------------------------------------------- /book_view/src/pages/moviesList.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 45 | 46 | 59 | -------------------------------------------------------------------------------- /book_view/src/pages/newsDetail.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 43 | 44 | 58 | -------------------------------------------------------------------------------- /book_view/src/pages/newsList.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 45 | 46 | 59 | -------------------------------------------------------------------------------- /book_view/src/pages/registerPage.vue: -------------------------------------------------------------------------------- 1 | 45 | 46 | 97 | 98 | 110 | -------------------------------------------------------------------------------- /book_view/src/pages/userInfo.vue: -------------------------------------------------------------------------------- 1 | 41 | 42 | 83 | 84 | 94 | -------------------------------------------------------------------------------- /book_view/src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | import VueRource from 'vue-resource' 4 | // import IndexPage from '../pages/index.vue' 5 | // import HelloWorld from '@/components/HelloWorld' 6 | import MovieList from '../pages/moviesList.vue' 7 | import MovieDetail from '../pages/movieDetail.vue' 8 | import NewsDetail from '../pages/newsDetail.vue' 9 | import LoginPage from '../pages/loginPage.vue' 10 | import RegisterPage from '../pages/registerPage.vue' 11 | import ForgetPassword from '../pages/forgetPassword.vue' 12 | import UserInfo from '../pages/userInfo.vue' 13 | import NewsList from '../pages/newsList.vue' 14 | import Admin from '../pages/admin.vue' 15 | import AdminMovieList from '../pages/adminMovieList.vue' 16 | import AdminAddMovie from '../pages/adminAddMovie.vue' 17 | import AdminArticleList from '../pages/adminArticleList.vue' 18 | import AdminAddArticle from '../pages/adminAddArticle.vue' 19 | import AdminCommentList from '../pages/adminCommentList.vue' 20 | import AdminUserList from '../pages/adminUserList.vue' 21 | 22 | Vue.use(Router) 23 | Vue.use(VueRource) 24 | 25 | export default new Router({ 26 | routes: [ 27 | { 28 | path: '/', 29 | component: resolve => require(['../pages/index'], resolve), 30 | meta: { 31 | title: 'home' 32 | } 33 | }, 34 | { 35 | path: '/movieList', 36 | component: MovieList 37 | }, 38 | { 39 | path: '/movieDetail', 40 | component: MovieDetail 41 | }, 42 | { 43 | path: '/newsList', 44 | component: NewsList 45 | }, 46 | { 47 | path: '/newsDetail', 48 | component: NewsDetail 49 | }, 50 | { 51 | path: '/loginPage', 52 | component: LoginPage 53 | }, 54 | { 55 | path: '/registerPage', 56 | component: RegisterPage 57 | }, 58 | { 59 | path: '/forgetPassword', 60 | component: ForgetPassword 61 | }, 62 | { 63 | path: '/userInfo', 64 | component: UserInfo 65 | }, 66 | { 67 | path: '/admin', 68 | component: Admin 69 | }, 70 | { 71 | path: '/adminMovieList', 72 | component: AdminMovieList 73 | }, 74 | { 75 | path: '/adminAddMovie', 76 | component: AdminAddMovie 77 | }, 78 | { 79 | path: '/adminArticleList', 80 | component: AdminArticleList 81 | }, 82 | { 83 | path: '/adminAddArticle', 84 | component: AdminAddArticle 85 | }, 86 | { 87 | path: '/adminCommentList', 88 | component: AdminCommentList 89 | }, 90 | { 91 | path: '/adminUserList', 92 | component: AdminUserList 93 | } 94 | ] 95 | }) 96 | -------------------------------------------------------------------------------- /book_view/static/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangjun1996/VueMovieWebsite/31b11000a973ea36fd0e8b2b84af759534114a7f/book_view/static/.gitkeep -------------------------------------------------------------------------------- /book_view/test/e2e/custom-assertions/elementCount.js: -------------------------------------------------------------------------------- 1 | // A custom Nightwatch assertion. 2 | // The assertion name is the filename. 3 | // Example usage: 4 | // 5 | // browser.assert.elementCount(selector, count) 6 | // 7 | // For more information on custom assertions see: 8 | // http://nightwatchjs.org/guide#writing-custom-assertions 9 | 10 | exports.assertion = function (selector, count) { 11 | this.message = 'Testing if element <' + selector + '> has count: ' + count 12 | this.expected = count 13 | this.pass = function (val) { 14 | return val === this.expected 15 | } 16 | this.value = function (res) { 17 | return res.value 18 | } 19 | this.command = function (cb) { 20 | var self = this 21 | return this.api.execute(function (selector) { 22 | return document.querySelectorAll(selector).length 23 | }, [selector], function (res) { 24 | cb.call(self, res) 25 | }) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /book_view/test/e2e/nightwatch.conf.js: -------------------------------------------------------------------------------- 1 | require('babel-register') 2 | var config = require('../../config') 3 | 4 | // http://nightwatchjs.org/gettingstarted#settings-file 5 | module.exports = { 6 | src_folders: ['test/e2e/specs'], 7 | output_folder: 'test/e2e/reports', 8 | custom_assertions_path: ['test/e2e/custom-assertions'], 9 | 10 | selenium: { 11 | start_process: true, 12 | server_path: require('selenium-server').path, 13 | host: '127.0.0.1', 14 | port: 4444, 15 | cli_args: { 16 | 'webdriver.chrome.driver': require('chromedriver').path 17 | } 18 | }, 19 | 20 | test_settings: { 21 | default: { 22 | selenium_port: 4444, 23 | selenium_host: 'localhost', 24 | silent: true, 25 | globals: { 26 | devServerURL: 'http://localhost:' + (process.env.PORT || config.dev.port) 27 | } 28 | }, 29 | 30 | chrome: { 31 | desiredCapabilities: { 32 | browserName: 'chrome', 33 | javascriptEnabled: true, 34 | acceptSslCerts: true 35 | } 36 | }, 37 | 38 | firefox: { 39 | desiredCapabilities: { 40 | browserName: 'firefox', 41 | javascriptEnabled: true, 42 | acceptSslCerts: true 43 | } 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /book_view/test/e2e/runner.js: -------------------------------------------------------------------------------- 1 | // 1. start the dev server using production config 2 | process.env.NODE_ENV = 'testing' 3 | 4 | const webpack = require('webpack') 5 | const DevServer = require('webpack-dev-server') 6 | 7 | const webpackConfig = require('../../build/webpack.prod.conf') 8 | const devConfigPromise = require('../../build/webpack.dev.conf') 9 | 10 | let server 11 | 12 | devConfigPromise.then(devConfig => { 13 | const devServerOptions = devConfig.devServer 14 | const compiler = webpack(webpackConfig) 15 | server = new DevServer(compiler, devServerOptions) 16 | const port = devServerOptions.port 17 | const host = devServerOptions.host 18 | return server.listen(port, host) 19 | }) 20 | .then(() => { 21 | // 2. run the nightwatch test suite against it 22 | // to run in additional browsers: 23 | // 1. add an entry in test/e2e/nightwatch.conf.js under "test_settings" 24 | // 2. add it to the --env flag below 25 | // or override the environment flag, for example: `npm run e2e -- --env chrome,firefox` 26 | // For more information on Nightwatch's config file, see 27 | // http://nightwatchjs.org/guide#settings-file 28 | let opts = process.argv.slice(2) 29 | if (opts.indexOf('--config') === -1) { 30 | opts = opts.concat(['--config', 'test/e2e/nightwatch.conf.js']) 31 | } 32 | if (opts.indexOf('--env') === -1) { 33 | opts = opts.concat(['--env', 'chrome']) 34 | } 35 | 36 | const spawn = require('cross-spawn') 37 | const runner = spawn('./node_modules/.bin/nightwatch', opts, { stdio: 'inherit' }) 38 | 39 | runner.on('exit', function (code) { 40 | server.close() 41 | process.exit(code) 42 | }) 43 | 44 | runner.on('error', function (err) { 45 | server.close() 46 | throw err 47 | }) 48 | }) 49 | -------------------------------------------------------------------------------- /book_view/test/e2e/specs/test.js: -------------------------------------------------------------------------------- 1 | // For authoring Nightwatch tests, see 2 | // http://nightwatchjs.org/guide#usage 3 | 4 | module.exports = { 5 | 'default e2e tests': function (browser) { 6 | // automatically uses dev Server port from /config.index.js 7 | // default: http://localhost:8080 8 | // see nightwatch.conf.js 9 | const devServer = browser.globals.devServerURL 10 | 11 | browser 12 | .url(devServer) 13 | .waitForElementVisible('#app', 5000) 14 | .assert.elementPresent('.hello') 15 | .assert.containsText('h1', 'Welcome to Your Vue.js App') 16 | .assert.elementCount('img', 1) 17 | .end() 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /book_view/test/unit/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "jest": true 4 | }, 5 | "globals": { 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /book_view/test/unit/jest.conf.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | 3 | module.exports = { 4 | rootDir: path.resolve(__dirname, '../../'), 5 | moduleFileExtensions: [ 6 | 'js', 7 | 'json', 8 | 'vue' 9 | ], 10 | moduleNameMapper: { 11 | '^@/(.*)$': '/src/$1' 12 | }, 13 | transform: { 14 | '^.+\\.js$': '/node_modules/babel-jest', 15 | '.*\\.(vue)$': '/node_modules/vue-jest' 16 | }, 17 | testPathIgnorePatterns: [ 18 | '/test/e2e' 19 | ], 20 | snapshotSerializers: ['/node_modules/jest-serializer-vue'], 21 | setupFiles: ['/test/unit/setup'], 22 | mapCoverage: true, 23 | coverageDirectory: '/test/unit/coverage', 24 | collectCoverageFrom: [ 25 | 'src/**/*.{js,vue}', 26 | '!src/main.js', 27 | '!src/router/index.js', 28 | '!**/node_modules/**' 29 | ] 30 | } 31 | -------------------------------------------------------------------------------- /book_view/test/unit/setup.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | 3 | Vue.config.productionTip = false 4 | -------------------------------------------------------------------------------- /book_view/test/unit/specs/HelloWorld.spec.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import HelloWorld from '@/components/HelloWorld' 3 | 4 | describe('HelloWorld.vue', () => { 5 | it('should render correct contents', () => { 6 | const Constructor = Vue.extend(HelloWorld) 7 | const vm = new Constructor().$mount() 8 | expect(vm.$el.querySelector('.hello h1').textContent) 9 | .toEqual('Welcome to Your Vue.js App') 10 | }) 11 | }) 12 | -------------------------------------------------------------------------------- /database/json/comments.json: -------------------------------------------------------------------------------- 1 | { 2 | "_id" : ObjectId("5d0897e03364a61d1c8c0621"), 3 | "movie_id" : "5d09e9d3dfb8dc3494d45020", 4 | "username" : "匿名用户", 5 | "context" : "zhenhaokan", 6 | "check" : true, 7 | "__v" : NumberInt(0) 8 | } 9 | { 10 | "_id" : ObjectId("5d08985d548f9400cc3b699a"), 11 | "movie_id" : "5d09e9d3dfb8dc3494d45020", 12 | "username" : "wj", 13 | "context" : "zhenhaokan", 14 | "check" : false, 15 | "__v" : NumberInt(0) 16 | } 17 | { 18 | "_id" : ObjectId("5d103b13c4984f1f68e08839"), 19 | "movie_id" : "5d09e93cdfb8dc3494d4501e", 20 | "username" : "wj", 21 | "context" : "评论测试", 22 | "check" : false, 23 | "__v" : NumberInt(0) 24 | } 25 | { 26 | "_id" : ObjectId("5d10404699302109a07c4b6e"), 27 | "movie_id" : "5d09e9d3dfb8dc3494d45020", 28 | "username" : "匿名用户", 29 | "context" : "牛逼!!!好音乐真是颗幸福的原子弹!", 30 | "check" : true, 31 | "__v" : NumberInt(0) 32 | } 33 | { 34 | "_id" : ObjectId("5d10405099302109a07c4b6f"), 35 | "movie_id" : "5d09e9d3dfb8dc3494d45020", 36 | "username" : "匿名用户", 37 | "context" : "这是我今年最喜欢的电影,没有之一。", 38 | "check" : true, 39 | "__v" : NumberInt(0) 40 | } 41 | { 42 | "_id" : ObjectId("5d10425299302109a07c4b71"), 43 | "movie_id" : "5d09bb49b831750d82886ce5", 44 | "username" : "匿名用户", 45 | "context" : "雷洛加跛豪,王晶这回没有玩贱而是难得严肃了一回,整体制作非常老港片的味道,老派枭雄电影的感觉。刘德华果然是越来越有型了。", 46 | "check" : true, 47 | "__v" : NumberInt(0) 48 | } 49 | { 50 | "_id" : ObjectId("5d1043c999302109a07c4b72"), 51 | "movie_id" : "5d09bb49b831750d82886ce5", 52 | "username" : "匿名用户", 53 | "context" : "王晶开辟了一个新类型——民族主义黑帮片。此片可作为新世纪后殖民主义港片的代表作,与具有分裂倾向的港毒片近身肉搏。", 54 | "check" : true, 55 | "__v" : NumberInt(0) 56 | } 57 | { 58 | "_id" : ObjectId("5d10448f99302109a07c4b73"), 59 | "movie_id" : "5d09bb49b831750d82886ce5", 60 | "username" : "匿名用户", 61 | "context" : "江湖鱼龙混杂,如今尽是鱼虾。龙已飞天而去,任尔泥沙俱下。", 62 | "check" : false, 63 | "__v" : NumberInt(0) 64 | } 65 | { 66 | "_id" : ObjectId("5d104a164b22ce100847e887"), 67 | "movie_id" : "5d09c057b831750d82886d3b", 68 | "username" : "匿名用户", 69 | "context" : "黄渤是有追求的导演,之前真没敢报期望。中国式反乌托邦,以为会是麻花式的喜剧,会在老本行上偷懒,但远远挖掘了更深层次的东西,这对于处女作来说实属不易。体制内无法呈现的阴暗面,以巧妙的抉择呈现,效果惊艳。美术、音乐以及表演掌控自如,恭喜黄渤!", 70 | "check" : true, 71 | "__v" : NumberInt(0) 72 | } 73 | { 74 | "_id" : ObjectId("5d104a264b22ce100847e888"), 75 | "movie_id" : "5d09c057b831750d82886d3b", 76 | "username" : "匿名用户", 77 | "context" : "真·一出好戏。剧情表演俱佳,求生模式的暗黑剧情扣人心弦,群戏表演很见功力。最意外张艺兴表演,黑化得很酷了;舒淇一如既往美如画。船舱倒立视角印象深刻,表现力和寓言性十足", 78 | "check" : true, 79 | "__v" : NumberInt(0) 80 | } 81 | { 82 | "_id" : ObjectId("5d10a0afdc89001d9c6986a1"), 83 | "movie_id" : "5d09bb49b831750d82886ce5", 84 | "username" : "wj", 85 | "context" : "犹记得当年看雷洛传,王晶不拍贺岁尬喜剧的时候,成熟的功底,配乐就凸现了。甚至还玩起了长镜头。主角配角皆有演技,真的是太久太久没见这样纯正怀旧的港片了。", 86 | "check" : true, 87 | "__v" : NumberInt(0) 88 | } 89 | { 90 | "_id" : ObjectId("5d10a0e8dc89001d9c6986a2"), 91 | "movie_id" : "5d09e9d3dfb8dc3494d45020", 92 | "username" : "wj", 93 | "context" : "神!最后一场戏,基本还原了当年皇后乐队在live aid演唱会的盛况,曲目百分之八十保留,还有龅牙叔献给母亲的那个吻。", 94 | "check" : true, 95 | "__v" : NumberInt(0) 96 | } 97 | { 98 | "_id" : ObjectId("5d10a112dc89001d9c6986a3"), 99 | "movie_id" : "5d0a1b9414cd341520ce1885", 100 | "username" : "wj", 101 | "context" : "当熟悉的音符如电流般直抵高潮,纯粹的角色塑造显得无足轻重,对你,摇滚传奇Freddie Mercury而言,再没有比歌声更精确的人格注脚了。 一成不变的天空,偶尔会有燃烧的陨星击穿云层,即兴地闪耀,清脆地焚毁,散成光艳袭人的碎片,巡游在历史里,巡游在半空,被人呼吸,被不同的时代回忆。", 102 | "check" : true, 103 | "__v" : NumberInt(0) 104 | } 105 | { 106 | "_id" : ObjectId("5d10a138dc89001d9c6986a4"), 107 | "movie_id" : "5d09c102b831750d82886d46", 108 | "username" : "wj", 109 | "context" : "“如果再也不能见到你,祝你早安,午安和晚安。”", 110 | "check" : true, 111 | "__v" : NumberInt(0) 112 | } 113 | { 114 | "_id" : ObjectId("5d10e8b5e00958339483960b"), 115 | "movie_id" : "5d09e93cdfb8dc3494d4501e", 116 | "username" : "yjp", 117 | "context" : "666", 118 | "check" : true, 119 | "__v" : NumberInt(0) 120 | } 121 | { 122 | "_id" : ObjectId("5d11a7a57caf172090b85919"), 123 | "movie_id" : "5d09e9d3dfb8dc3494d45020", 124 | "username" : "匿名用户", 125 | "context" : "yjp", 126 | "check" : true, 127 | "__v" : NumberInt(0) 128 | } 129 | { 130 | "_id" : ObjectId("5d122d4f7b666626c08a9a80"), 131 | "movie_id" : "5d09e9d3dfb8dc3494d45020", 132 | "username" : "wj", 133 | "context" : "真好看!看的热血沸腾!", 134 | "check" : true, 135 | "__v" : NumberInt(0) 136 | } 137 | { 138 | "_id" : ObjectId("5d12ef2dc7a167206070256f"), 139 | "movie_id" : "5d09c102b831750d82886d46", 140 | "username" : "wj", 141 | "context" : "打开这道门,即便现实再最肮脏也请让我自己感受!关掉你的镜头,即使现实再无奈你也必须自己体验!", 142 | "check" : true, 143 | "__v" : NumberInt(0) 144 | } 145 | { 146 | "_id" : ObjectId("5d12f01ac7a1672060702571"), 147 | "movie_id" : "5d09c057b831750d82886d3b", 148 | "username" : "test", 149 | "context" : "荒诞中揭示人性,导演处女作应该说太用心了,简直就是想费力而不只是想讨好(巧)观众;场景和特效都非常认真,荒岛,破船的造型……电影就是高度文明的人再退回到猴子原始时代的现代寓言,这也足见一个酝酿多年的演而优则导的处女作的良苦『野心』,如果多一些这样的的导演,那么我们的国产電影好看了", 150 | "check" : true, 151 | "__v" : NumberInt(0) 152 | } 153 | { 154 | "_id" : ObjectId("5d12f0d1c7a1672060702575"), 155 | "movie_id" : "5d0a1b9414cd341520ce1885", 156 | "username" : "匿名用户", 157 | "context" : "666", 158 | "check" : true, 159 | "__v" : NumberInt(0) 160 | } 161 | { 162 | "_id" : ObjectId("5d138f896491ab2ea0f80efa"), 163 | "movie_id" : "5d12eaa582f1d1537b57e3f2", 164 | "username" : "匿名用户", 165 | "context" : "666", 166 | "check" : true, 167 | "__v" : NumberInt(0) 168 | } 169 | { 170 | "_id" : ObjectId("5d24610b33b1f42c9c1de628"), 171 | "movie_id" : "5d09e93cdfb8dc3494d4501e", 172 | "username" : "wj", 173 | "context" : "国产科幻巨作!", 174 | "check" : true, 175 | "__v" : NumberInt(0) 176 | } 177 | -------------------------------------------------------------------------------- /database/json/mails.json: -------------------------------------------------------------------------------- 1 | { 2 | "_id" : ObjectId("5d09a3a7405d8131cc61dc8a"), 3 | "fromUser" : "5d08883f78394b28d4b2c331", 4 | "toUser" : "5d08990b8fadcc259091fd5e", 5 | "title" : "站内信标题1", 6 | "context" : "站内信内容1", 7 | "date" : "2019-6-19 10:53:27 AM", 8 | "__v" : NumberInt(0) 9 | } 10 | { 11 | "_id" : ObjectId("5d09a3b1405d8131cc61dc8b"), 12 | "fromUser" : "5d08883f78394b28d4b2c331", 13 | "toUser" : "5d08990b8fadcc259091fd5e", 14 | "title" : "站内信标题2", 15 | "context" : "站内信内容2", 16 | "date" : "2019-6-19 10:53:37 AM", 17 | "__v" : NumberInt(0) 18 | } 19 | { 20 | "_id" : ObjectId("5d09a3d7405d8131cc61dc8c"), 21 | "fromUser" : "5d08883f78394b28d4b2c331", 22 | "toUser" : "5d08888e0fc324056011da74", 23 | "title" : "站内信标题3", 24 | "context" : "站内信内容3", 25 | "date" : "2019-6-19 10:54:15 AM", 26 | "__v" : NumberInt(0) 27 | } 28 | { 29 | "_id" : ObjectId("5d09a5d2405d8131cc61dc8d"), 30 | "fromUser" : "5d08883f78394b28d4b2c331", 31 | "toUser" : "5d08883f78394b28d4b2c331", 32 | "title" : "站内信标题4", 33 | "context" : "站内信内容4", 34 | "date" : "2019-6-19 11:02:42 AM", 35 | "__v" : NumberInt(0) 36 | } 37 | -------------------------------------------------------------------------------- /database/json/movies.json: -------------------------------------------------------------------------------- 1 | { 2 | "_id" : ObjectId("5d09bb49b831750d82886ce5"), 3 | "movieName" : "追龙", 4 | "movieImg" : "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1562675565641&di=7b170c5348b2083d5f75334edb2605d9&imgtype=0&src=http%3A%2F%2Fi1.wp.com%2Fimg.char.tw%2Fuploads%2F20181025172743_28.jpg%3Fresize%3D1600%2C905", 5 | "movieVideo" : "https://movie.douban.com/trailer/221961/#content", 6 | "movieDownload" : "https://www.iqiyi.com/v_19rr8ya20o.html", 7 | "movieTime" : "2019-06-19", 8 | "movieNumSuppose" : NumberInt(123), 9 | "movieNumDownload" : NumberInt(3276), 10 | "movieMainPage" : false 11 | } 12 | { 13 | "_id" : ObjectId("5d09e93cdfb8dc3494d4501e"), 14 | "movieName" : "流浪地球", 15 | "movieImg" : "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1561381917376&di=fa554b8ff198ebff910afb548dd5b50f&imgtype=0&src=http%3A%2F%2Fi1.hdslb.com%2Fbfs%2Farchive%2F095e7b89daf78e084d452e11f1695fb821eda0ab.jpg", 16 | "movieVideo" : "https://movie.douban.com/video/102604/", 17 | "movieDownload" : "https://www.iqiyi.com/v_19rrfe142o.html", 18 | "movieTime" : "2019-02-05", 19 | "movieNumSuppose" : NumberInt(1209), 20 | "movieNumDownload" : NumberInt(5767), 21 | "movieMainPage" : true, 22 | "__v" : NumberInt(0) 23 | } 24 | { 25 | "_id" : ObjectId("5d09e9d3dfb8dc3494d45020"), 26 | "movieName" : "波西米亚狂想曲 Bohemian Rhapsody", 27 | "movieImg" : "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1562675635155&di=f335823bbf1008f8f7feac7ddcd71da3&imgtype=0&src=http%3A%2F%2Fi0.hdslb.com%2Fbfs%2Farticle%2Ffd0dd653bec8c800c62d3e219dd3eaf512018d6b.jpg", 28 | "movieVideo" : "https://movie.douban.com/trailer/233799/#content", 29 | "movieDownload" : "https://www.douban.com/link2/?url=http%3A%2F%2Fwww.iqiyi.com%2Fv_19rqycwafc.html%3Fvfm%3Dm_331_dbdy%26fv%3D4904d94982104144a1548dd9040df241&subtype=9&type=online-video", 30 | "movieTime" : "2019-03-22", 31 | "movieNumSuppose" : NumberInt(207), 32 | "movieNumDownload" : NumberInt(187), 33 | "movieMainPage" : false, 34 | "__v" : NumberInt(0) 35 | } 36 | { 37 | "_id" : ObjectId("5d10a45d7f0a541b8d9b3a9e"), 38 | "movieName" : "霸王别姬", 39 | "movieImg" : "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1561381801142&di=515c7439d7a1a40be7587cad291b1b91&imgtype=0&src=http%3A%2F%2Fwww.fjsen.com%2Fimages%2Fattachement%2Fjpg%2Fsite1%2F2011-05-24%2F7775612759867346311.jpg", 40 | "movieVideo" : "https://movie.douban.com/trailer/239810/#content", 41 | "movieDownload" : "https://www.douban.com/link2/?url=http%3A%2F%2Fv.youku.com%2Fv_show%2Fid_XMzA1NTAzNjAwMA%3D%3D.html%3Ftpa%3DdW5pb25faWQ9MzAwMDA4XzEwMDAwMl8wMl8wMQ%26refer%3Ddoubanneirongshuchu_bd.xuyang01_douban_201122&subtype=3&type=online-video", 42 | "movieTime" : "1993-01-01", 43 | "movieNumSuppose" : NumberInt(1057), 44 | "movieNumDownload" : NumberInt(559), 45 | "movieMainPage" : false, 46 | "__v" : NumberInt(0) 47 | } 48 | { 49 | "_id" : ObjectId("5d122049518fc462f4d6b379"), 50 | "movieName" : "这个杀手不太冷 Léon (1994)", 51 | "movieImg" : "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1562675691797&di=2dfa4fdd44f0d9d9ef29c1057e4dfa4f&imgtype=0&src=http%3A%2F%2Fhbimg.b0.upaiyun.com%2Ff5a2b2bfde0775a727615963e2387d50d1f4e5b53c5c3-O5cdIq_fw658", 52 | "movieVideo" : "https://movie.douban.com/trailer/108757/#content", 53 | "movieDownload" : "https://www.douban.com/link2/?url=https%3A%2F%2Fwww.bilibili.com%2Fbangumi%2Fplay%2Fss10945%3Fbsource%3Ddouban&subtype=8&type=online-video&link2key=8ff2af5937", 54 | "movieTime" : "1994-09-14", 55 | "movieNumSuppose" : NumberInt(589), 56 | "movieNumDownload" : NumberInt(240), 57 | "movieMainPage" : false, 58 | "__v" : NumberInt(0) 59 | } 60 | { 61 | "_id" : ObjectId("5d122093518fc462f4d6b38d"), 62 | "movieName" : "阿甘正传 Forrest Gump (1994)", 63 | "movieImg" : "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1562675775405&di=a24753f4a0bdba7f46080830c6890a18&imgtype=0&src=http%3A%2F%2Fimg0.pconline.com.cn%2Fpconline%2F1205%2F07%2F2777169_13_thumb.jpg", 64 | "movieVideo" : "https://movie.douban.com/trailer/160000/#content", 65 | "movieDownload" : "https://www.douban.com/link2/?url=http%3A%2F%2Fv.qq.com%2Fx%2Fcover%2Fr6hc2kqgvnmiejn.html%3Fptag%3Ddouban.movie&subtype=1&type=online-video", 66 | "movieTime" : "1994-06-23", 67 | "movieNumSuppose" : NumberInt(1246), 68 | "movieNumDownload" : NumberInt(67), 69 | "movieMainPage" : false 70 | } 71 | { 72 | "_id" : ObjectId("5d12209b518fc462f4d6b38e"), 73 | "movieName" : "美丽人生 La vita è bella (1997)", 74 | "movieImg" : "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1563270529&di=57e1613dcc9fd4c2a1d720e3ee9106c2&imgtype=jpg&er=1&src=http%3A%2F%2Fimg1.doubanio.com%2Fview%2Fnote%2Flarge%2Fpublic%2Fp39919097.jpg", 75 | "movieVideo" : "https://movie.douban.com/trailer/108759/#content", 76 | "movieDownload" : "https://www.douban.com/link2/?url=http%3A%2F%2Fwww.iqiyi.com%2Fv_19rrjqfdbc.html%3Fvfm%3Dm_331_dbdy%26fv%3D4904d94982104144a1548dd9040df241&subtype=9&type=online-video", 77 | "movieTime" : "1997-12-20", 78 | "movieNumSuppose" : NumberInt(5189), 79 | "movieNumDownload" : NumberInt(234), 80 | "movieMainPage" : false 81 | } 82 | { 83 | "_id" : ObjectId("5d1220aa518fc462f4d6b39e"), 84 | "movieName" : "泰坦尼克号 Titanic (1997)", 85 | "movieImg" : "https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=4236395672,1233225696&fm=26&gp=0.jpg", 86 | "movieVideo" : "https://movie.douban.com/trailer/112229/#content", 87 | "movieDownload" : "https://www.douban.com/link2/?url=http%3A%2F%2Fv.qq.com%2Fx%2Fcover%2Ft5jqhgw8pix81mw.html%3Fptag%3Ddouban.movie&subtype=1&type=online-video", 88 | "movieTime" : "1998-04-03", 89 | "movieNumSuppose" : NumberInt(4567), 90 | "movieNumDownload" : NumberInt(1167), 91 | "movieMainPage" : false 92 | } 93 | { 94 | "_id" : ObjectId("5d1221b1518fc462f4d6b3e0"), 95 | "movieName" : "玩具总动员4 Toy Story 4 (2019)", 96 | "movieImg" : "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2557284230.webp", 97 | "movieVideo" : "https://movie.douban.com/trailer/247424/#content", 98 | "movieDownload" : "https://movie.douban.com/ticket/redirect/?url=https%3A%2F%2Fm.maoyan.com%2Fcinema%2Fmovie%2F246264%3F_v_%3Dyes%26merCode%3D1000011", 99 | "movieTime" : "2019-06-21", 100 | "movieNumSuppose" : NumberInt(345), 101 | "movieNumDownload" : NumberInt(34), 102 | "movieMainPage" : true 103 | } 104 | { 105 | "_id" : ObjectId("5d1221b4518fc462f4d6b3e1"), 106 | "movieName" : "哥斯拉2:怪兽之王 Godzilla: King of the Monsters (2019)", 107 | "movieImg" : "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2554370800.webp", 108 | "movieVideo" : "https://movie.douban.com/trailer/246166/#content", 109 | "movieDownload" : "https://movie.douban.com/ticket/redirect/?url=https%3A%2F%2Fm.maoyan.com%2Fcinema%2Fmovie%2F246061%3F_v_%3Dyes%26merCode%3D1000011", 110 | "movieTime" : "2019-05-31", 111 | "movieNumSuppose" : NumberInt(135), 112 | "movieNumDownload" : NumberInt(681), 113 | "movieMainPage" : true 114 | } 115 | { 116 | "_id" : ObjectId("5d1221b6518fc462f4d6b3e2"), 117 | "movieName" : "哆啦A梦:大雄的月球探险记 映画ドラえもん のび太の月面探査記 (2019)", 118 | "movieImg" : "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2557500825.webp", 119 | "movieVideo" : "https://movie.douban.com/trailer/247560/#content", 120 | "movieDownload" : "https://movie.douban.com/ticket/redirect/?url=https%3A%2F%2Fm.maoyan.com%2Fcinema%2Fmovie%2F1226516%3F_v_%3Dyes%26merCode%3D1000011", 121 | "movieTime" : "2019-06-01 ", 122 | "movieNumSuppose" : NumberInt(800), 123 | "movieNumDownload" : NumberInt(126), 124 | "movieMainPage" : true 125 | } 126 | { 127 | "_id" : ObjectId("5d1372c751f4d5138cb519f9"), 128 | "movieName" : "调音师 Andhadhun (2018)", 129 | "movieImg" : "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2551995207.webp", 130 | "movieVideo" : "https://movie.douban.com/trailer/244969/#content", 131 | "movieDownload" : "https://www.douban.com/link2/?url=https%3A%2F%2Fv.qq.com%2Fx%2Fcover%2F120m3xjxyr69vlz%2Fw0030ma4dhv.html&subtype=1&type=online-video", 132 | "movieTime" : "2019-04-03", 133 | "movieNumSuppose" : NumberInt(1214), 134 | "movieNumDownload" : NumberInt(115), 135 | "movieMainPage" : false, 136 | "__v" : NumberInt(0) 137 | } 138 | { 139 | "_id" : ObjectId("5d1376312c785a0ee8544818"), 140 | "movieName" : "大侦探皮卡丘 Pokémon Detective Pikachu (2019)", 141 | "movieImg" : "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2555538168.webp", 142 | "movieVideo" : "https://movie.douban.com/trailer/243768/#content", 143 | "movieDownload" : "https://movie.douban.com/ticket/redirect/?url=https%3A%2F%2Fm.maoyan.com%2Fcinema%2Fmovie%2F346629%3F_v_%3Dyes%26merCode%3D1000011", 144 | "movieTime" : "2019-05-10", 145 | "movieNumSuppose" : NumberInt(913), 146 | "movieNumDownload" : NumberInt(112), 147 | "movieMainPage" : false, 148 | "__v" : NumberInt(0) 149 | } 150 | { 151 | "_id" : ObjectId("5d1376d281c3ca3338e69ba0"), 152 | "movieName" : "阿丽塔:战斗天使 Alita: Battle Angel (2019)", 153 | "movieImg" : "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1562675893720&di=047a70b46a73271a7dc62046b8bd298c&imgtype=0&src=http%3A%2F%2Fi2.hexun.com%2F2019-02-14%2F196132192.jpg", 154 | "movieVideo" : "https://movie.douban.com/trailer/241829/#content", 155 | "movieDownload" : "https://movie.douban.com/ticket/redirect/?url=https%3A%2F%2Fm.maoyan.com%2Fcinema%2Fmovie%2F346629%3F_v_%3Dyes%26merCode%3D1000011", 156 | "movieTime" : "2019-02-22", 157 | "movieNumSuppose" : NumberInt(96), 158 | "movieNumDownload" : NumberInt(123), 159 | "movieMainPage" : false, 160 | "__v" : NumberInt(0) 161 | } 162 | { 163 | "_id" : ObjectId("5d22cb60ddc37a0570118bd4"), 164 | "movieName" : "蜘蛛侠:英雄远征 Spider-Man: Far From Home (2019)", 165 | "movieImg" : "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2558293106.webp", 166 | "movieVideo" : "https://movie.douban.com/trailer/248749/#content", 167 | "movieDownload" : "https://movie.douban.com/ticket/redirect/?url=https%3A%2F%2Fm.maoyan.com%2Fcinema%2Fmovie%2F1198925%3F_v_%3Dyes%26merCode%3D1000011", 168 | "movieTime" : "2019-06-28", 169 | "movieNumSuppose" : NumberInt(168), 170 | "movieNumDownload" : NumberInt(116), 171 | "movieMainPage" : true, 172 | "__v" : NumberInt(0) 173 | } 174 | { 175 | "_id" : ObjectId("5d22cb79ddc37a0570118bd5"), 176 | "movieName" : "扫毒2天地对决 (2019)", 177 | "movieImg" : "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2561172733.webp", 178 | "movieVideo" : "https://movie.douban.com/trailer/249286/#content", 179 | "movieDownload" : "https://movie.douban.com/subject/30171425/?from=showing", 180 | "movieTime" : "2019-07-05", 181 | "movieNumSuppose" : NumberInt(516), 182 | "movieNumDownload" : NumberInt(1121), 183 | "movieMainPage" : true, 184 | "__v" : NumberInt(0) 185 | } 186 | { 187 | "_id" : ObjectId("5d22cc145475453330a94b31"), 188 | "movieName" : "毒液:致命守护者 Venom (2018)", 189 | "movieImg" : "https://img3.doubanio.com/view/photo/l/public/p2537158013.webp", 190 | "movieVideo" : "https://movie.douban.com/trailer/238802/#content", 191 | "movieDownload" : "https://www.douban.com/link2/?url=http%3A%2F%2Fv.youku.com%2Fv_show%2Fid_XNDAwNDUxMzUyOA%3D%3D.html%3Ftpa%3DdW5pb25faWQ9MzAwMDA4XzEwMDAwMl8wMl8wMQ%26refer%3Desfhz_operation.xuka.xj_00003036_000000_FNZfau_19010900&subtype=3&type=online-video", 192 | "movieTime" : "2018-11-09", 193 | "movieNumSuppose" : NumberInt(131), 194 | "movieNumDownload" : NumberInt(121), 195 | "movieMainPage" : false, 196 | "__v" : NumberInt(0) 197 | } 198 | -------------------------------------------------------------------------------- /database/json/recommends.json: -------------------------------------------------------------------------------- 1 | { 2 | "_id" : ObjectId("5d121067518fc462f4d6b360"), 3 | "recommendImg" : "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1561381917376&di=fa554b8ff198ebff910afb548dd5b50f&imgtype=0&src=http%3A%2F%2Fi1.hdslb.com%2Fbfs%2Farchive%2F095e7b89daf78e084d452e11f1695fb821eda0ab.jpg", 4 | "recommendSrc" : "https://www.iqiyi.com/v_19rrfe142o.html", 5 | "recommendTitle" : "流浪地球", 6 | "__v" : NumberInt(0) 7 | } 8 | -------------------------------------------------------------------------------- /database/json/users.json: -------------------------------------------------------------------------------- 1 | { 2 | "_id" : ObjectId("5d108217d13cf511a850c171"), 3 | "username" : "aa", 4 | "password" : "aaa", 5 | "userMail" : "aa@qq.com", 6 | "userPhone" : "15904911111", 7 | "userAdmin" : false, 8 | "userPower" : NumberInt(0), 9 | "userStop" : true, 10 | "__v" : NumberInt(0) 11 | } 12 | { 13 | "_id" : ObjectId("5d10825ed13cf511a850c172"), 14 | "username" : "admin", 15 | "password" : "admin", 16 | "userMail" : "admin@163.com", 17 | "userPhone" : "13808086666", 18 | "userAdmin" : true, 19 | "userPower" : NumberInt(2), 20 | "userStop" : false, 21 | "__v" : NumberInt(0) 22 | } 23 | { 24 | "_id" : ObjectId("5d1082f8d13cf511a850c173"), 25 | "username" : "admin2", 26 | "password" : "admin2", 27 | "userMail" : "admin2@gmail.com", 28 | "userPhone" : "13923990666", 29 | "userAdmin" : true, 30 | "userPower" : NumberInt(1), 31 | "userStop" : false, 32 | "__v" : NumberInt(0) 33 | } 34 | { 35 | "_id" : ObjectId("5d10910d26e8f91ab0302d75"), 36 | "username" : "wj", 37 | "password" : "666", 38 | "userMail" : "wj@qq.com", 39 | "userPhone" : "13866660708", 40 | "userAdmin" : false, 41 | "userPower" : NumberInt(0), 42 | "userStop" : false, 43 | "__v" : NumberInt(0) 44 | } 45 | { 46 | "_id" : ObjectId("5d10a16bdc89001d9c6986a5"), 47 | "username" : "user1", 48 | "password" : "666", 49 | "userMail" : "user1@163.com", 50 | "userPhone" : "13811110001", 51 | "userAdmin" : false, 52 | "userPower" : NumberInt(0), 53 | "userStop" : true, 54 | "__v" : NumberInt(0) 55 | } 56 | { 57 | "_id" : ObjectId("5d11a76d7caf172090b85917"), 58 | "username" : "yjp", 59 | "password" : "123", 60 | "userMail" : "111@qq.com", 61 | "userPhone" : "15900001111", 62 | "userAdmin" : false, 63 | "userPower" : NumberInt(0), 64 | "userStop" : false, 65 | "__v" : NumberInt(0) 66 | } 67 | -------------------------------------------------------------------------------- /database/sql/movieServer.comments.sql: -------------------------------------------------------------------------------- 1 | /* 2 | This file was automatically generated by Studio 3T. 3 | 4 | MongoDB Source Collection: `movieServer.comments` 5 | 6 | Warnings about type conversion issues are stored as comments above the 7 | corresponding INSERT statement of each document. 8 | */ 9 | 10 | 11 | SET NAMES 'utf8' COLLATE 'utf8_general_ci'; 12 | 13 | DROP TABLE IF EXISTS `comments`; 14 | CREATE TABLE `comments` ( 15 | `__v` INTEGER, 16 | `_id` VARBINARY(12) NOT NULL, 17 | `check` BIT, 18 | `context` LONGTEXT, 19 | `movie_id` LONGTEXT, 20 | `username` LONGTEXT, 21 | PRIMARY KEY (`_id`) 22 | ) CHARSET=utf8; 23 | 24 | INSERT INTO `comments` (`__v`, `_id`, `check`, `context`, `movie_id`, `username`) 25 | VALUES 26 | (0, x'5D0897E03364A61D1C8C0621', TRUE, 'zhenhaokan', '5d09e9d3dfb8dc3494d45020', '匿名用户'); 27 | INSERT INTO `comments` (`__v`, `_id`, `check`, `context`, `movie_id`, `username`) 28 | VALUES 29 | (0, x'5D08985D548F9400CC3B699A', FALSE, 'zhenhaokan', '5d09e9d3dfb8dc3494d45020', 'wj'); 30 | INSERT INTO `comments` (`__v`, `_id`, `check`, `context`, `movie_id`, `username`) 31 | VALUES 32 | (0, x'5D103B13C4984F1F68E08839', FALSE, '评论测试', '5d09e93cdfb8dc3494d4501e', 'wj'); 33 | INSERT INTO `comments` (`__v`, `_id`, `check`, `context`, `movie_id`, `username`) 34 | VALUES 35 | (0, x'5D10404699302109A07C4B6E', TRUE, '牛逼!!!好音乐真是颗幸福的原子弹!', '5d09e9d3dfb8dc3494d45020', '匿名用户'); 36 | INSERT INTO `comments` (`__v`, `_id`, `check`, `context`, `movie_id`, `username`) 37 | VALUES 38 | (0, x'5D10405099302109A07C4B6F', TRUE, '这是我今年最喜欢的电影,没有之一。', '5d09e9d3dfb8dc3494d45020', '匿名用户'); 39 | INSERT INTO `comments` (`__v`, `_id`, `check`, `context`, `movie_id`, `username`) 40 | VALUES 41 | (0, x'5D10425299302109A07C4B71', TRUE, '雷洛加跛豪,王晶这回没有玩贱而是难得严肃了一回,整体制作非常老港片的味道,老派枭雄电影的感觉。刘德华果然是越来越有型了。', '5d09bb49b831750d82886ce5', '匿名用户'); 42 | INSERT INTO `comments` (`__v`, `_id`, `check`, `context`, `movie_id`, `username`) 43 | VALUES 44 | (0, x'5D1043C999302109A07C4B72', TRUE, '王晶开辟了一个新类型——民族主义黑帮片。此片可作为新世纪后殖民主义港片的代表作,与具有分裂倾向的港毒片近身肉搏。', '5d09bb49b831750d82886ce5', '匿名用户'); 45 | INSERT INTO `comments` (`__v`, `_id`, `check`, `context`, `movie_id`, `username`) 46 | VALUES 47 | (0, x'5D10448F99302109A07C4B73', FALSE, '江湖鱼龙混杂,如今尽是鱼虾。龙已飞天而去,任尔泥沙俱下。', '5d09bb49b831750d82886ce5', '匿名用户'); 48 | INSERT INTO `comments` (`__v`, `_id`, `check`, `context`, `movie_id`, `username`) 49 | VALUES 50 | (0, x'5D104A164B22CE100847E887', TRUE, '黄渤是有追求的导演,之前真没敢报期望。中国式反乌托邦,以为会是麻花式的喜剧,会在老本行上偷懒,但远远挖掘了更深层次的东西,这对于处女作来说实属不易。体制内无法呈现的阴暗面,以巧妙的抉择呈现,效果惊艳。美术、音乐以及表演掌控自如,恭喜黄渤!', '5d09c057b831750d82886d3b', '匿名用户'); 51 | INSERT INTO `comments` (`__v`, `_id`, `check`, `context`, `movie_id`, `username`) 52 | VALUES 53 | (0, x'5D104A264B22CE100847E888', TRUE, '真·一出好戏。剧情表演俱佳,求生模式的暗黑剧情扣人心弦,群戏表演很见功力。最意外张艺兴表演,黑化得很酷了;舒淇一如既往美如画。船舱倒立视角印象深刻,表现力和寓言性十足', '5d09c057b831750d82886d3b', '匿名用户'); 54 | INSERT INTO `comments` (`__v`, `_id`, `check`, `context`, `movie_id`, `username`) 55 | VALUES 56 | (0, x'5D10A0AFDC89001D9C6986A1', TRUE, '犹记得当年看雷洛传,王晶不拍贺岁尬喜剧的时候,成熟的功底,配乐就凸现了。甚至还玩起了长镜头。主角配角皆有演技,真的是太久太久没见这样纯正怀旧的港片了。', '5d09bb49b831750d82886ce5', 'wj'); 57 | INSERT INTO `comments` (`__v`, `_id`, `check`, `context`, `movie_id`, `username`) 58 | VALUES 59 | (0, x'5D10A0E8DC89001D9C6986A2', TRUE, '神!最后一场戏,基本还原了当年皇后乐队在live aid演唱会的盛况,曲目百分之八十保留,还有龅牙叔献给母亲的那个吻。', '5d09e9d3dfb8dc3494d45020', 'wj'); 60 | INSERT INTO `comments` (`__v`, `_id`, `check`, `context`, `movie_id`, `username`) 61 | VALUES 62 | (0, x'5D10A112DC89001D9C6986A3', TRUE, '当熟悉的音符如电流般直抵高潮,纯粹的角色塑造显得无足轻重,对你,摇滚传奇Freddie Mercury而言,再没有比歌声更精确的人格注脚了。 一成不变的天空,偶尔会有燃烧的陨星击穿云层,即兴地闪耀,清脆地焚毁,散成光艳袭人的碎片,巡游在历史里,巡游在半空,被人呼吸,被不同的时代回忆。', '5d0a1b9414cd341520ce1885', 'wj'); 63 | INSERT INTO `comments` (`__v`, `_id`, `check`, `context`, `movie_id`, `username`) 64 | VALUES 65 | (0, x'5D10A138DC89001D9C6986A4', TRUE, '“如果再也不能见到你,祝你早安,午安和晚安。”', '5d09c102b831750d82886d46', 'wj'); 66 | INSERT INTO `comments` (`__v`, `_id`, `check`, `context`, `movie_id`, `username`) 67 | VALUES 68 | (0, x'5D10E8B5E00958339483960B', TRUE, '666', '5d09e93cdfb8dc3494d4501e', 'yjp'); 69 | INSERT INTO `comments` (`__v`, `_id`, `check`, `context`, `movie_id`, `username`) 70 | VALUES 71 | (0, x'5D11A7A57CAF172090B85919', TRUE, 'yjp', '5d09e9d3dfb8dc3494d45020', '匿名用户'); 72 | INSERT INTO `comments` (`__v`, `_id`, `check`, `context`, `movie_id`, `username`) 73 | VALUES 74 | (0, x'5D122D4F7B666626C08A9A80', TRUE, '真好看!看的热血沸腾!', '5d09e9d3dfb8dc3494d45020', 'wj'); 75 | INSERT INTO `comments` (`__v`, `_id`, `check`, `context`, `movie_id`, `username`) 76 | VALUES 77 | (0, x'5D12EF2DC7A167206070256F', TRUE, '打开这道门,即便现实再最肮脏也请让我自己感受!关掉你的镜头,即使现实再无奈你也必须自己体验!', '5d09c102b831750d82886d46', 'wj'); 78 | INSERT INTO `comments` (`__v`, `_id`, `check`, `context`, `movie_id`, `username`) 79 | VALUES 80 | (0, x'5D12F01AC7A1672060702571', TRUE, '荒诞中揭示人性,导演处女作应该说太用心了,简直就是想费力而不只是想讨好(巧)观众;场景和特效都非常认真,荒岛,破船的造型……电影就是高度文明的人再退回到猴子原始时代的现代寓言,这也足见一个酝酿多年的演而优则导的处女作的良苦『野心』,如果多一些这样的的导演,那么我们的国产電影好看了', '5d09c057b831750d82886d3b', 'test'); 81 | INSERT INTO `comments` (`__v`, `_id`, `check`, `context`, `movie_id`, `username`) 82 | VALUES 83 | (0, x'5D12F0D1C7A1672060702575', TRUE, '666', '5d0a1b9414cd341520ce1885', '匿名用户'); 84 | INSERT INTO `comments` (`__v`, `_id`, `check`, `context`, `movie_id`, `username`) 85 | VALUES 86 | (0, x'5D138F896491AB2EA0F80EFA', TRUE, '666', '5d12eaa582f1d1537b57e3f2', '匿名用户'); 87 | INSERT INTO `comments` (`__v`, `_id`, `check`, `context`, `movie_id`, `username`) 88 | VALUES 89 | (0, x'5D24610B33B1F42C9C1DE628', TRUE, '国产科幻巨作!', '5d09e93cdfb8dc3494d4501e', 'wj'); 90 | -------------------------------------------------------------------------------- /database/sql/movieServer.mails.sql: -------------------------------------------------------------------------------- 1 | /* 2 | This file was automatically generated by Studio 3T. 3 | 4 | MongoDB Source Collection: `movieServer.mails` 5 | 6 | Warnings about type conversion issues are stored as comments above the 7 | corresponding INSERT statement of each document. 8 | */ 9 | 10 | 11 | SET NAMES 'utf8' COLLATE 'utf8_general_ci'; 12 | 13 | DROP TABLE IF EXISTS `mails`; 14 | CREATE TABLE `mails` ( 15 | `__v` INTEGER, 16 | `_id` VARBINARY(12) NOT NULL, 17 | `context` LONGTEXT, 18 | `date` LONGTEXT, 19 | `fromUser` LONGTEXT, 20 | `title` LONGTEXT, 21 | `toUser` LONGTEXT, 22 | PRIMARY KEY (`_id`) 23 | ) CHARSET=utf8; 24 | 25 | INSERT INTO `mails` (`__v`, `_id`, `context`, `date`, `fromUser`, `title`, `toUser`) 26 | VALUES 27 | (0, x'5D09A3A7405D8131CC61DC8A', '站内信内容1', '2019-6-19 10:53:27 AM', '5d08883f78394b28d4b2c331', '站内信标题1', '5d08990b8fadcc259091fd5e'); 28 | INSERT INTO `mails` (`__v`, `_id`, `context`, `date`, `fromUser`, `title`, `toUser`) 29 | VALUES 30 | (0, x'5D09A3B1405D8131CC61DC8B', '站内信内容2', '2019-6-19 10:53:37 AM', '5d08883f78394b28d4b2c331', '站内信标题2', '5d08990b8fadcc259091fd5e'); 31 | INSERT INTO `mails` (`__v`, `_id`, `context`, `date`, `fromUser`, `title`, `toUser`) 32 | VALUES 33 | (0, x'5D09A3D7405D8131CC61DC8C', '站内信内容3', '2019-6-19 10:54:15 AM', '5d08883f78394b28d4b2c331', '站内信标题3', '5d08888e0fc324056011da74'); 34 | INSERT INTO `mails` (`__v`, `_id`, `context`, `date`, `fromUser`, `title`, `toUser`) 35 | VALUES 36 | (0, x'5D09A5D2405D8131CC61DC8D', '站内信内容4', '2019-6-19 11:02:42 AM', '5d08883f78394b28d4b2c331', '站内信标题4', '5d08883f78394b28d4b2c331'); 37 | -------------------------------------------------------------------------------- /database/sql/movieServer.movies.sql: -------------------------------------------------------------------------------- 1 | /* 2 | This file was automatically generated by Studio 3T. 3 | 4 | MongoDB Source Collection: `movieServer.movies` 5 | 6 | Warnings about type conversion issues are stored as comments above the 7 | corresponding INSERT statement of each document. 8 | */ 9 | 10 | 11 | SET NAMES 'utf8' COLLATE 'utf8_general_ci'; 12 | 13 | DROP TABLE IF EXISTS `movies`; 14 | CREATE TABLE `movies` ( 15 | `__v` INTEGER, 16 | `_id` VARBINARY(12) NOT NULL, 17 | `movieDownload` LONGTEXT, 18 | `movieImg` LONGTEXT, 19 | `movieMainPage` BIT, 20 | `movieName` LONGTEXT, 21 | `movieNumDownload` INTEGER, 22 | `movieNumSuppose` INTEGER, 23 | `movieTime` LONGTEXT, 24 | `movieVideo` LONGTEXT, 25 | PRIMARY KEY (`_id`) 26 | ) CHARSET=utf8; 27 | 28 | INSERT INTO `movies` (`__v`, `_id`, `movieDownload`, `movieImg`, `movieMainPage`, `movieName`, `movieNumDownload`, `movieNumSuppose`, `movieTime`, `movieVideo`) 29 | VALUES 30 | (NULL, x'5D09BB49B831750D82886CE5', 'https://www.iqiyi.com/v_19rr8ya20o.html', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1562675565641&di=7b170c5348b2083d5f75334edb2605d9&imgtype=0&src=http%3A%2F%2Fi1.wp.com%2Fimg.char.tw%2Fuploads%2F20181025172743_28.jpg%3Fresize%3D1600%2C905', FALSE, '追龙', 3276, 123, '2019-06-19', 'https://movie.douban.com/trailer/221961/#content'); 31 | INSERT INTO `movies` (`__v`, `_id`, `movieDownload`, `movieImg`, `movieMainPage`, `movieName`, `movieNumDownload`, `movieNumSuppose`, `movieTime`, `movieVideo`) 32 | VALUES 33 | (0, x'5D09E93CDFB8DC3494D4501E', 'https://www.iqiyi.com/v_19rrfe142o.html', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1561381917376&di=fa554b8ff198ebff910afb548dd5b50f&imgtype=0&src=http%3A%2F%2Fi1.hdslb.com%2Fbfs%2Farchive%2F095e7b89daf78e084d452e11f1695fb821eda0ab.jpg', TRUE, '流浪地球', 5767, 1209, '2019-02-05', 'https://movie.douban.com/video/102604/'); 34 | INSERT INTO `movies` (`__v`, `_id`, `movieDownload`, `movieImg`, `movieMainPage`, `movieName`, `movieNumDownload`, `movieNumSuppose`, `movieTime`, `movieVideo`) 35 | VALUES 36 | (0, x'5D09E9D3DFB8DC3494D45020', 'https://www.douban.com/link2/?url=http%3A%2F%2Fwww.iqiyi.com%2Fv_19rqycwafc.html%3Fvfm%3Dm_331_dbdy%26fv%3D4904d94982104144a1548dd9040df241&subtype=9&type=online-video', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1562675635155&di=f335823bbf1008f8f7feac7ddcd71da3&imgtype=0&src=http%3A%2F%2Fi0.hdslb.com%2Fbfs%2Farticle%2Ffd0dd653bec8c800c62d3e219dd3eaf512018d6b.jpg', FALSE, '波西米亚狂想曲 Bohemian Rhapsody', 187, 207, '2019-03-22', 'https://movie.douban.com/trailer/233799/#content'); 37 | INSERT INTO `movies` (`__v`, `_id`, `movieDownload`, `movieImg`, `movieMainPage`, `movieName`, `movieNumDownload`, `movieNumSuppose`, `movieTime`, `movieVideo`) 38 | VALUES 39 | (0, x'5D10A45D7F0A541B8D9B3A9E', 'https://www.douban.com/link2/?url=http%3A%2F%2Fv.youku.com%2Fv_show%2Fid_XMzA1NTAzNjAwMA%3D%3D.html%3Ftpa%3DdW5pb25faWQ9MzAwMDA4XzEwMDAwMl8wMl8wMQ%26refer%3Ddoubanneirongshuchu_bd.xuyang01_douban_201122&subtype=3&type=online-video', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1561381801142&di=515c7439d7a1a40be7587cad291b1b91&imgtype=0&src=http%3A%2F%2Fwww.fjsen.com%2Fimages%2Fattachement%2Fjpg%2Fsite1%2F2011-05-24%2F7775612759867346311.jpg', FALSE, '霸王别姬', 559, 1057, '1993-01-01', 'https://movie.douban.com/trailer/239810/#content'); 40 | INSERT INTO `movies` (`__v`, `_id`, `movieDownload`, `movieImg`, `movieMainPage`, `movieName`, `movieNumDownload`, `movieNumSuppose`, `movieTime`, `movieVideo`) 41 | VALUES 42 | (0, x'5D122049518FC462F4D6B379', 'https://www.douban.com/link2/?url=https%3A%2F%2Fwww.bilibili.com%2Fbangumi%2Fplay%2Fss10945%3Fbsource%3Ddouban&subtype=8&type=online-video&link2key=8ff2af5937', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1562675691797&di=2dfa4fdd44f0d9d9ef29c1057e4dfa4f&imgtype=0&src=http%3A%2F%2Fhbimg.b0.upaiyun.com%2Ff5a2b2bfde0775a727615963e2387d50d1f4e5b53c5c3-O5cdIq_fw658', FALSE, '这个杀手不太冷 Léon (1994)', 240, 589, '1994-09-14', 'https://movie.douban.com/trailer/108757/#content'); 43 | INSERT INTO `movies` (`__v`, `_id`, `movieDownload`, `movieImg`, `movieMainPage`, `movieName`, `movieNumDownload`, `movieNumSuppose`, `movieTime`, `movieVideo`) 44 | VALUES 45 | (NULL, x'5D122093518FC462F4D6B38D', 'https://www.douban.com/link2/?url=http%3A%2F%2Fv.qq.com%2Fx%2Fcover%2Fr6hc2kqgvnmiejn.html%3Fptag%3Ddouban.movie&subtype=1&type=online-video', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1562675775405&di=a24753f4a0bdba7f46080830c6890a18&imgtype=0&src=http%3A%2F%2Fimg0.pconline.com.cn%2Fpconline%2F1205%2F07%2F2777169_13_thumb.jpg', FALSE, '阿甘正传 Forrest Gump (1994)', 67, 1246, '1994-06-23', 'https://movie.douban.com/trailer/160000/#content'); 46 | INSERT INTO `movies` (`__v`, `_id`, `movieDownload`, `movieImg`, `movieMainPage`, `movieName`, `movieNumDownload`, `movieNumSuppose`, `movieTime`, `movieVideo`) 47 | VALUES 48 | (NULL, x'5D12209B518FC462F4D6B38E', 'https://www.douban.com/link2/?url=http%3A%2F%2Fwww.iqiyi.com%2Fv_19rrjqfdbc.html%3Fvfm%3Dm_331_dbdy%26fv%3D4904d94982104144a1548dd9040df241&subtype=9&type=online-video', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1563270529&di=57e1613dcc9fd4c2a1d720e3ee9106c2&imgtype=jpg&er=1&src=http%3A%2F%2Fimg1.doubanio.com%2Fview%2Fnote%2Flarge%2Fpublic%2Fp39919097.jpg', FALSE, '美丽人生 La vita è bella (1997)', 234, 5189, '1997-12-20', 'https://movie.douban.com/trailer/108759/#content'); 49 | INSERT INTO `movies` (`__v`, `_id`, `movieDownload`, `movieImg`, `movieMainPage`, `movieName`, `movieNumDownload`, `movieNumSuppose`, `movieTime`, `movieVideo`) 50 | VALUES 51 | (NULL, x'5D1220AA518FC462F4D6B39E', 'https://www.douban.com/link2/?url=http%3A%2F%2Fv.qq.com%2Fx%2Fcover%2Ft5jqhgw8pix81mw.html%3Fptag%3Ddouban.movie&subtype=1&type=online-video', 'https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=4236395672,1233225696&fm=26&gp=0.jpg', FALSE, '泰坦尼克号 Titanic (1997)', 1167, 4567, '1998-04-03', 'https://movie.douban.com/trailer/112229/#content'); 52 | INSERT INTO `movies` (`__v`, `_id`, `movieDownload`, `movieImg`, `movieMainPage`, `movieName`, `movieNumDownload`, `movieNumSuppose`, `movieTime`, `movieVideo`) 53 | VALUES 54 | (NULL, x'5D1221B1518FC462F4D6B3E0', 'https://movie.douban.com/ticket/redirect/?url=https%3A%2F%2Fm.maoyan.com%2Fcinema%2Fmovie%2F246264%3F_v_%3Dyes%26merCode%3D1000011', 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2557284230.webp', TRUE, '玩具总动员4 Toy Story 4 (2019)', 34, 345, '2019-06-21', 'https://movie.douban.com/trailer/247424/#content'); 55 | INSERT INTO `movies` (`__v`, `_id`, `movieDownload`, `movieImg`, `movieMainPage`, `movieName`, `movieNumDownload`, `movieNumSuppose`, `movieTime`, `movieVideo`) 56 | VALUES 57 | (NULL, x'5D1221B4518FC462F4D6B3E1', 'https://movie.douban.com/ticket/redirect/?url=https%3A%2F%2Fm.maoyan.com%2Fcinema%2Fmovie%2F246061%3F_v_%3Dyes%26merCode%3D1000011', 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2554370800.webp', TRUE, '哥斯拉2:怪兽之王 Godzilla: King of the Monsters (2019)', 681, 135, '2019-05-31', 'https://movie.douban.com/trailer/246166/#content'); 58 | INSERT INTO `movies` (`__v`, `_id`, `movieDownload`, `movieImg`, `movieMainPage`, `movieName`, `movieNumDownload`, `movieNumSuppose`, `movieTime`, `movieVideo`) 59 | VALUES 60 | (NULL, x'5D1221B6518FC462F4D6B3E2', 'https://movie.douban.com/ticket/redirect/?url=https%3A%2F%2Fm.maoyan.com%2Fcinema%2Fmovie%2F1226516%3F_v_%3Dyes%26merCode%3D1000011', 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2557500825.webp', TRUE, '哆啦A梦:大雄的月球探险记 映画ドラえもん のび太の月面探査記 (2019)', 126, 800, '2019-06-01 ', 'https://movie.douban.com/trailer/247560/#content'); 61 | INSERT INTO `movies` (`__v`, `_id`, `movieDownload`, `movieImg`, `movieMainPage`, `movieName`, `movieNumDownload`, `movieNumSuppose`, `movieTime`, `movieVideo`) 62 | VALUES 63 | (0, x'5D1372C751F4D5138CB519F9', 'https://www.douban.com/link2/?url=https%3A%2F%2Fv.qq.com%2Fx%2Fcover%2F120m3xjxyr69vlz%2Fw0030ma4dhv.html&subtype=1&type=online-video', 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2551995207.webp', FALSE, '调音师 Andhadhun (2018)', 115, 1214, '2019-04-03', 'https://movie.douban.com/trailer/244969/#content'); 64 | INSERT INTO `movies` (`__v`, `_id`, `movieDownload`, `movieImg`, `movieMainPage`, `movieName`, `movieNumDownload`, `movieNumSuppose`, `movieTime`, `movieVideo`) 65 | VALUES 66 | (0, x'5D1376312C785A0EE8544818', 'https://movie.douban.com/ticket/redirect/?url=https%3A%2F%2Fm.maoyan.com%2Fcinema%2Fmovie%2F346629%3F_v_%3Dyes%26merCode%3D1000011', 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2555538168.webp', FALSE, '大侦探皮卡丘 Pokémon Detective Pikachu (2019)', 112, 913, '2019-05-10', 'https://movie.douban.com/trailer/243768/#content'); 67 | INSERT INTO `movies` (`__v`, `_id`, `movieDownload`, `movieImg`, `movieMainPage`, `movieName`, `movieNumDownload`, `movieNumSuppose`, `movieTime`, `movieVideo`) 68 | VALUES 69 | (0, x'5D1376D281C3CA3338E69BA0', 'https://movie.douban.com/ticket/redirect/?url=https%3A%2F%2Fm.maoyan.com%2Fcinema%2Fmovie%2F346629%3F_v_%3Dyes%26merCode%3D1000011', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1562675893720&di=047a70b46a73271a7dc62046b8bd298c&imgtype=0&src=http%3A%2F%2Fi2.hexun.com%2F2019-02-14%2F196132192.jpg', FALSE, '阿丽塔:战斗天使 Alita: Battle Angel (2019)', 123, 96, '2019-02-22', 'https://movie.douban.com/trailer/241829/#content'); 70 | INSERT INTO `movies` (`__v`, `_id`, `movieDownload`, `movieImg`, `movieMainPage`, `movieName`, `movieNumDownload`, `movieNumSuppose`, `movieTime`, `movieVideo`) 71 | VALUES 72 | (0, x'5D22CB60DDC37A0570118BD4', 'https://movie.douban.com/ticket/redirect/?url=https%3A%2F%2Fm.maoyan.com%2Fcinema%2Fmovie%2F1198925%3F_v_%3Dyes%26merCode%3D1000011', 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2558293106.webp', TRUE, '蜘蛛侠:英雄远征 Spider-Man: Far From Home (2019)', 116, 168, '2019-06-28', 'https://movie.douban.com/trailer/248749/#content'); 73 | INSERT INTO `movies` (`__v`, `_id`, `movieDownload`, `movieImg`, `movieMainPage`, `movieName`, `movieNumDownload`, `movieNumSuppose`, `movieTime`, `movieVideo`) 74 | VALUES 75 | (0, x'5D22CB79DDC37A0570118BD5', 'https://movie.douban.com/subject/30171425/?from=showing', 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2561172733.webp', TRUE, '扫毒2天地对决 (2019)', 1121, 516, '2019-07-05', 'https://movie.douban.com/trailer/249286/#content'); 76 | INSERT INTO `movies` (`__v`, `_id`, `movieDownload`, `movieImg`, `movieMainPage`, `movieName`, `movieNumDownload`, `movieNumSuppose`, `movieTime`, `movieVideo`) 77 | VALUES 78 | (0, x'5D22CC145475453330A94B31', 'https://www.douban.com/link2/?url=http%3A%2F%2Fv.youku.com%2Fv_show%2Fid_XNDAwNDUxMzUyOA%3D%3D.html%3Ftpa%3DdW5pb25faWQ9MzAwMDA4XzEwMDAwMl8wMl8wMQ%26refer%3Desfhz_operation.xuka.xj_00003036_000000_FNZfau_19010900&subtype=3&type=online-video', 'https://img3.doubanio.com/view/photo/l/public/p2537158013.webp', FALSE, '毒液:致命守护者 Venom (2018)', 121, 131, '2018-11-09', 'https://movie.douban.com/trailer/238802/#content'); 79 | -------------------------------------------------------------------------------- /database/sql/movieServer.recommends.sql: -------------------------------------------------------------------------------- 1 | /* 2 | This file was automatically generated by Studio 3T. 3 | 4 | MongoDB Source Collection: `movieServer.recommends` 5 | 6 | Warnings about type conversion issues are stored as comments above the 7 | corresponding INSERT statement of each document. 8 | */ 9 | 10 | 11 | SET NAMES 'utf8' COLLATE 'utf8_general_ci'; 12 | 13 | DROP TABLE IF EXISTS `recommends`; 14 | CREATE TABLE `recommends` ( 15 | `__v` INTEGER, 16 | `_id` VARBINARY(12) NOT NULL, 17 | `recommendImg` LONGTEXT, 18 | `recommendSrc` LONGTEXT, 19 | `recommendTitle` LONGTEXT, 20 | PRIMARY KEY (`_id`) 21 | ) CHARSET=utf8; 22 | 23 | INSERT INTO `recommends` (`__v`, `_id`, `recommendImg`, `recommendSrc`, `recommendTitle`) 24 | VALUES 25 | (0, x'5D121067518FC462F4D6B360', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1561381917376&di=fa554b8ff198ebff910afb548dd5b50f&imgtype=0&src=http%3A%2F%2Fi1.hdslb.com%2Fbfs%2Farchive%2F095e7b89daf78e084d452e11f1695fb821eda0ab.jpg', 'https://www.iqiyi.com/v_19rrfe142o.html', '流浪地球'); 26 | -------------------------------------------------------------------------------- /database/sql/movieServer.users.sql: -------------------------------------------------------------------------------- 1 | /* 2 | This file was automatically generated by Studio 3T. 3 | 4 | MongoDB Source Collection: `movieServer.users` 5 | 6 | Warnings about type conversion issues are stored as comments above the 7 | corresponding INSERT statement of each document. 8 | */ 9 | 10 | 11 | SET NAMES 'utf8' COLLATE 'utf8_general_ci'; 12 | 13 | DROP TABLE IF EXISTS `users`; 14 | CREATE TABLE `users` ( 15 | `__v` INTEGER, 16 | `_id` VARBINARY(12) NOT NULL, 17 | `password` LONGTEXT, 18 | `userAdmin` BIT, 19 | `userMail` LONGTEXT, 20 | `userPhone` LONGTEXT, 21 | `userPower` INTEGER, 22 | `userStop` BIT, 23 | `username` LONGTEXT, 24 | PRIMARY KEY (`_id`) 25 | ) CHARSET=utf8; 26 | 27 | INSERT INTO `users` (`__v`, `_id`, `password`, `userAdmin`, `userMail`, `userPhone`, `userPower`, `userStop`, `username`) 28 | VALUES 29 | (0, x'5D108217D13CF511A850C171', 'aaa', FALSE, 'aa@qq.com', '15904911111', 0, TRUE, 'aa'); 30 | INSERT INTO `users` (`__v`, `_id`, `password`, `userAdmin`, `userMail`, `userPhone`, `userPower`, `userStop`, `username`) 31 | VALUES 32 | (0, x'5D10825ED13CF511A850C172', 'admin', TRUE, 'admin@163.com', '13808086666', 2, FALSE, 'admin'); 33 | INSERT INTO `users` (`__v`, `_id`, `password`, `userAdmin`, `userMail`, `userPhone`, `userPower`, `userStop`, `username`) 34 | VALUES 35 | (0, x'5D1082F8D13CF511A850C173', 'admin2', TRUE, 'admin2@gmail.com', '13923990666', 1, FALSE, 'admin2'); 36 | INSERT INTO `users` (`__v`, `_id`, `password`, `userAdmin`, `userMail`, `userPhone`, `userPower`, `userStop`, `username`) 37 | VALUES 38 | (0, x'5D10910D26E8F91AB0302D75', '666', FALSE, 'wj@qq.com', '13866660708', 0, FALSE, 'wj'); 39 | INSERT INTO `users` (`__v`, `_id`, `password`, `userAdmin`, `userMail`, `userPhone`, `userPower`, `userStop`, `username`) 40 | VALUES 41 | (0, x'5D10A16BDC89001D9C6986A5', '666', FALSE, 'user1@163.com', '13811110001', 0, TRUE, 'user1'); 42 | INSERT INTO `users` (`__v`, `_id`, `password`, `userAdmin`, `userMail`, `userPhone`, `userPower`, `userStop`, `username`) 43 | VALUES 44 | (0, x'5D11A76D7CAF172090B85917', '123', FALSE, '111@qq.com', '15900001111', 0, FALSE, 'yjp'); 45 | -------------------------------------------------------------------------------- /screenshot/1.首页.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangjun1996/VueMovieWebsite/31b11000a973ea36fd0e8b2b84af759534114a7f/screenshot/1.首页.png -------------------------------------------------------------------------------- /screenshot/10.添加电影页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangjun1996/VueMovieWebsite/31b11000a973ea36fd0e8b2b84af759534114a7f/screenshot/10.添加电影页面.png -------------------------------------------------------------------------------- /screenshot/11.影评管理页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangjun1996/VueMovieWebsite/31b11000a973ea36fd0e8b2b84af759534114a7f/screenshot/11.影评管理页面.png -------------------------------------------------------------------------------- /screenshot/12.添加影评页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangjun1996/VueMovieWebsite/31b11000a973ea36fd0e8b2b84af759534114a7f/screenshot/12.添加影评页面.png -------------------------------------------------------------------------------- /screenshot/13.评论管理页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangjun1996/VueMovieWebsite/31b11000a973ea36fd0e8b2b84af759534114a7f/screenshot/13.评论管理页面.png -------------------------------------------------------------------------------- /screenshot/14.用户管理页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangjun1996/VueMovieWebsite/31b11000a973ea36fd0e8b2b84af759534114a7f/screenshot/14.用户管理页面.png -------------------------------------------------------------------------------- /screenshot/2.注册页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangjun1996/VueMovieWebsite/31b11000a973ea36fd0e8b2b84af759534114a7f/screenshot/2.注册页面.png -------------------------------------------------------------------------------- /screenshot/3.登录页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangjun1996/VueMovieWebsite/31b11000a973ea36fd0e8b2b84af759534114a7f/screenshot/3.登录页面.png -------------------------------------------------------------------------------- /screenshot/4.电影列表页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangjun1996/VueMovieWebsite/31b11000a973ea36fd0e8b2b84af759534114a7f/screenshot/4.电影列表页面.png -------------------------------------------------------------------------------- /screenshot/5.影评列表页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangjun1996/VueMovieWebsite/31b11000a973ea36fd0e8b2b84af759534114a7f/screenshot/5.影评列表页面.png -------------------------------------------------------------------------------- /screenshot/6.电影详情页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangjun1996/VueMovieWebsite/31b11000a973ea36fd0e8b2b84af759534114a7f/screenshot/6.电影详情页面.png -------------------------------------------------------------------------------- /screenshot/7.影评详情页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangjun1996/VueMovieWebsite/31b11000a973ea36fd0e8b2b84af759534114a7f/screenshot/7.影评详情页面.png -------------------------------------------------------------------------------- /screenshot/8.后台管理主页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangjun1996/VueMovieWebsite/31b11000a973ea36fd0e8b2b84af759534114a7f/screenshot/8.后台管理主页面.png -------------------------------------------------------------------------------- /screenshot/9.电影管理页面.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangjun1996/VueMovieWebsite/31b11000a973ea36fd0e8b2b84af759534114a7f/screenshot/9.电影管理页面.png --------------------------------------------------------------------------------