文章目录
一、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>