爬虫项目(期末大作业)

项目要求

基于第一个项目爬虫爬取的数据(3-5个数据源),完成数据展示网站。
基本要求:
1、用户可注册登录网站,非注册用户不可登录查看数据
2、用户注册、登录、查询等操作记入数据库中的日志
3、实现查询词支持布尔表达式 (比如“新冠 AND 肺炎”或者“新冠 OR 肺炎”)
4、爬虫数据查询结果列表支持分页和排序
5、用Echarts或者D3实现3个以上的数据分析图表展示在网站中
 

实现注册与登录

对登录与注册提出的要求:

1、对用户要有适当提示

2、登录

(1)提示用户名或密码输错

(2)用户不存在

3、注册

(1)两次密码不一致

(2)用户已存在

(3)注册成功跳转登陆页面

创建用户信息数据表

CREATE TABLE `crawl`.`user`(
 `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
 `username` VARCHAR(45) NOT NULL,
 `password` VARCHAR(45) NOT NULL,
 `registertime` datetime DEFAULT CURRENT_TIMESTAMP,
 PRIMARY KEY(`id`),
 UNIQUE KEY `username_UNIQUE`(`username`))
 ENGINE=InnoDB DEFAULT CHARSET=utf8;

记录用户的登陆,查询(具体查询语句)操作

CREATE TABLE `crawl`.`user_action`(
 `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
 `username` VARCHAR(45) NOT NULL,
 `request_time` VARCHAR(45) NOT NULL,
 `request_method` VARCHAR(20) NOT NULL,
 `request_url` VARCHAR(300) NOT NULL,
 `status` int(4),
 `remote_addr` VARCHAR(1000) NOT NULL,
 PRIMARY KEY(`id`))
 ENGINE=InnoDB DEFAULT CHARSET=utf8;

建立连接mysql配置文件

module.exports = {
    mysql: {
        host: 'localhost',
        user: 'root',
        password: 'root'
        database: 'crawl'
        connectionLimit: 10//最大连接数,默认为10
    }
};

登录页的实现

检查用户所输入的账户密码是否与数据库中的相匹配,如果一致则登陆成功,页面跳转至news.html,否则无法跳转。

 <link rel="stylesheet" type="text/css" href="stylesheets/index.css">
    <script type="text/javascript" src="javascripts/index.js"></script>
    <script>
        var app = angular.module('login', []);
        app.controller('loginCtrl', function ($scope, $http, $timeout) {

            // 登录时,检查用户输入的账户密码是否与数据库中的一致
            $scope.check_pwd = function () {
                var data = JSON.stringify({
                    username: $scope.username,
                    password: $scope.password
                });
                $http.post("/users/login", data)
                    .then(
                    function (res) {
                        if(res.data.msg=='ok') {
                            window.location.href='/news.html';//如果登陆成功则页面跳转
                        }else{
                            $scope.msg=res.data.msg;
                        }
                    },
                        function (err) {
                        $scope.msg = err.data;
                    });

            };

接着设置登陆页面的信息 

<form id="login-form" method="post" role="form" style="display: block;">
<!--                                登陆部分-->
    <div class="form-group">
         <input ng-model="username" tabindex="1" class="form-control" placeholder="Username" value=""/>
    </div>
    <div class="form-group">
         <input type="password" ng-model="password" tabindex="2" class="form-control" placeholder="Password">
    </div>
         <!--     <div class="form-group text-center">-->
         <!--          <input type="checkbox" tabindex="3" class="" name="remember" id="remember">-->
         <!--          <label for="remember"> Remember Me</label>-->
         <!--     </div>-->

    <div class="form-group">
         <div class="row">
              <div class="col-sm-6 col-sm-offset-3">
                   <button id="login-submit" tabindex="4" class="form-control btn btn-login" ng-click="check_pwd()">LOG IN</button>
              </div>
         </div>
     </div>
</form>


再设置登录页的路由

var express = require('express');
var router = express.Router();
var userDAO = require('../dao/userDAO');

router.post('/login', function(req, res) {
  var username = req.body.username;
  var password = req.body.password;
  // var sess = req.session;

  userDAO.getByUsername(username, function (user) {
    if(user.length==0){
      res.json({msg:'用户不存在!请检查后输入'});

    }else {
      if(password===user[0].password){
        req.session['username'] = username;
        res.cookie('username', username);
        res.json({msg: 'ok'});
        // res.json({msg:'ok'});
      }else{
        res.json({msg:'用户名或密码错误!请检查后输入'});
      }
    }
  });
});

设置session信息,以确保知晓是哪个用户正在对日志进行操作

//设置session
app.use(session({
  secret: 'sessiontest',//与cookieParser中的一致
  resave: true,
  saveUninitialized: false, // 是否保存未初始化的会话
  cookie : {
    maxAge : 1000 * 60 * 60, // 设置 session 的有效时间,单位毫秒
  },
}));

其中调用的userDAO

var mysql = require('mysql');
var mysqlConf = require('../conf/mysqlConf');
var userSqlMap = require('./userSqlMap');
var pool = mysql.createPool(mysqlConf.mysql);
// 使用了连接池,重复使用数据库连接,而不必每执行一次CRUD操作就获取、释放一次数据库连接,从而提高了对数据库操作的性能。

module.exports = {
    add: function (user, callback) {
        pool.query(userSqlMap.add, [user.username, user.password], function (error, result) {
            if (error) throw error;
            callback(result.affectedRows > 0);
        });
    },
    getByUsername: function (username, callback) 
  • 5
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值