3.配置mongoose,实现登录和退登

一、nest配置mongoose

详情可参考我的另一篇文章:https://blog.csdn.net/u012570307/article/details/114539342

1.安装mongoose

参考:https://nestjs.bootcss.com/techniques/mongo

$ npm install --save @nestjs/mongoose mongoose

2.配置数据库连接地址

import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { AdminModule } from './module/admin/admin.module';
import { DefaultModule } from './module/default/default.module';
import { ApiModule } from './module/api/api.module';
import { MongooseModule } from '@nestjs/mongoose';
import { AdminauthMiddleware } from './middleware/adminauth.middleware';

@Module({
    imports: [AdminModule, DefaultModule, ApiModule,
        // mongoose连接数据库
        MongooseModule.forRoot("mongodb://127.0.0.1:27017/dadi")
    ],
    controllers: [],
    providers: [],
})
export class AppModule implements NestModule {
    configure(consumer: MiddlewareConsumer) {
        consumer
            .apply(AdminauthMiddleware)
            // 访问admin下的东西时才用中间件
            .forRoutes('admin/*');
    }
}

3.配置schema

import * as mongoose from 'mongoose';
const Schema = mongoose.Schema;
const d = new Date();

export const AdminSchema = new mongoose.Schema({
    username: { type: String },
    password: { type: String },
    mobile: { type: String },
    email: { type: String },
    status: { type: String },
    role_id: { type: String },
    add_time: { 
        type: Number,
        default: d.getTime() 
    },
    is_super: { type: Number },
})

4.在控制器对应的module中定义modal

import { Module } from '@nestjs/common';
import { MainController } from './main/main.controller';
import { LoginController } from './login/login.controller';
import { ManagerController } from './manager/manager.controller';
import { ToolsService } from '../../service/tools/tools.service';
// 配置schema1
import { MongooseModule } from '@nestjs/mongoose';
import { AdminSchema } from '../../schema/admin.schema'

// 引入服务
import { AdminService } from '../../service/admin/admin.service'

@Module({
  imports: [
    // 配置schema2
    MongooseModule.forFeature([
      {
        name: "Admin",
        schema: AdminSchema,
        collection: 'admin'
      }
    ])
  ],
  controllers: [MainController, LoginController, ManagerController],
  providers: [ToolsService, AdminService]
})
export class AdminModule { }

5.创建admin service

import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';

@Injectable()
export class AdminService {
    // 2.引入module中的Admin schema
    constructor(@InjectModel('Admin') private adminModel) { }
    async find() {
        let result = await this.adminModel.find().exec();
        return result;
    }
} 

:写完后需要在使用它的controller对应的module中引入此服务。

6.在控制器里实验是否能获取到数据库的数据

1.实验是否能从数据库获取数据

**2.**配置doLogin接口

import { Controller, Get, Render, Request, Response, Post, Body } from '@nestjs/common';
import { ToolsService } from '../../../service/tools/tools.service';
import { AdminService } from '../../../service/admin/admin.service'
@Controller('admin/login')
export class LoginController {
    constructor(
        private ToolsService: ToolsService,
        private adminService: AdminService
    ) { }

    @Get()
    @Render('admin/login')
    async index() {
        // 测试是否能取到数据库的数据
        // console.log('xxx', await this.adminService.find());
        return {}
    }

    // 获取验证码
    @Get('code')
    getCode(@Request() req, @Response() res) {
        let svgCaptcha = this.ToolsService.captcha(); // 服务里面的方法
        req.session.code = svgCaptcha.text;
        res.type('image/svg+xml'); /*指定返回的类型*/
        res.send(svgCaptcha.data); /*给页面返回一张图片*/
    }

    // 登录
    @Post('doLogin')
    doLogin(@Body() body ) {
        console.log('body: ', body);
        return "登录成功";
    }   
}

7.在login.ejs中使用doLogin

二、md5的使用

1.安装md5

npm i md5 --save

2.在service中封装md5

@filename(tools.service)

// md5
import * as md5 from 'md5'

@Injectable()
export class ToolsService {
    // ....

    // 获取md5
    // 使用方法:let password = this.ToolsService.getMd5('123456');
    getMd5(str:string) {
        return md5(str);
    }   
}

重点:使用方法let password = this.ToolsService.getMd5('123456');

3.在controller中使用md5

注:制作简单的演示

@filename(login.controller)

import { ToolsService } from '../../../service/tools/tools.service';


let password = this.ToolsService.getMd5('123456');

三、详细的登录功能

@filename(login.controller

    // ...
		// 登录
    @Post('doLogin')
    async doLogin(@Body() body, @Request() req, @Response() res ) {
        console.log('body: ', body);
        console.log('session: ', req.session);
        try{
            let code: string = body.code;
            let username: string = body.username;
            let password: string = body.password;
            if (username == "" || password.length < 6) {
                await this.ToolsService.error(res, '用户名或密码不合法', '/admin/login');
            } else {
                // 注:验证码转化为大写方便比较
                if (code.toUpperCase() == req.session.code.toUpperCase()) {
                    password = this.ToolsService.getMd5(password); // 使用md5加密
                    // 去数据库查是否有这个用户
                    let userResult = await this.adminService.find({ 'username': username, 'password': password });
                    console.log('userResult:', userResult);
                    if (userResult.length > 0) {
                        req.session.userinfo = userResult[0];
                        res.redirect('/admin/main');
                        await this.ToolsService.success(res, '登录成功');
                    } else {
                        await this.ToolsService.error(res, '用户名或密码不正确', '/admin/login');
                    }
                } else {
                    await this.ToolsService.error(res, '验证码不正确', '/admin/login');
                }
            }   
        } catch(error) {
            console.log('error',error);
            res.redirect('/admin/login');
        }
    }  

封装提示成功,失败的service

@filename(tools.service)

import { Injectable } from '@nestjs/common';
import * as svgCaptcha from 'svg-captcha'
import * as md5 from 'md5'
@Injectable()
export class ToolsService {
    // ....
    
    async success(res, redirectUrl) {
        await res.render('admin/public/success', {
            redirectUrl: redirectUrl
        })
    }

    async error(res, message, redirectUrl) {
        await res.render('admin/public/error', {
            message: message,
            redirectUrl: redirectUrl
        });   
    }

}

注:具体的模板页面可以看第五条

四、退出登录

路由

@filename(login.controller)

		@Get('loginOut')
    loginOut(@Request() req, @Response() res) {
        req.session.userinfo = null;
        res.redirect('/admin/login');
    }

使用

@filename(page_nav.ejs)

<nav class="navbar navbar-inverse" role="navigation">
    <div class="container-fluid">
        <div class="navbar-header">
            <img src="/admin/images/node.jpg" height="44px;" />
        </div>
        <div class="collapse navbar-collapse" id="example-navbar-collapse">           
            <ul class="nav navbar-nav navbar-right">
                <li><a>欢迎您,admin</a>
                </li>
                <li><a href="/admin/login/loginOut">安全退出</a>
                </li>
            </ul>
        </div>
    </div>
</nav>

重点<a href="/admin/login/loginOut">安全退出</a>

五、公共的成功失败页面

成功页面

@filename(success.ejs)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <meta http-equiv="refresh" content="3;url=<%=redirectUrl%>">
    <title>提示信息</title>
    <link rel="stylesheet" href="/admin/bootstrap/css/bootstrap.css">
</head>
<body>
    <div class="container-fluid">
        <div class="container" style="width: 480px;margin-top:100px;">
            <div class="alert alert-success">
                <h2>操作成功!</h2>
                <br />
                <p>如果您不做出选择,将在 3秒后跳转到上一个链接地址</p>                
                <br />

            </div>
        </div>
    </div>
</body>
</html>

失败页面

@filename(error.ejs)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <meta http-equiv="refresh" content="3;url=<%=redirectUrl%>">
    <title>提示信息</title>
    <link rel="stylesheet" href="/admin/bootstrap/css/bootstrap.css">
</head>
<body>
    <div class="container-fluid">
        <div class="container" style="width: 480px;margin-top:100px;">
            <div class="alert alert-danger">
                <h2>操作失败-<%=message%>!</h2><br />
                <p>如果您不做出选择,3秒后将自动返回上一个页面</p><br />
            </div>
        </div>
    </div>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值