周六、周日
因为身边朋友很多论文都在进行中,所以周末在构思自己的论文结构,考虑需要写的内容与可写的内容,书写了目录部分并交给老师审阅,进行了部分修改。
主要完成了关于论文的事宜:目录编写、摘要编写以及开启绪论背景编写。
周一与周二
进行用户模块的代码设计优化,上周主要做了用户的注册登录代码实现,本周完善剩下的用户模块:主要是用户管理,实现的五大功能:新增管理员,查找所有用户,查找所有管理员、查找具体某一个用户、删除用户。
新增管理员
请求地址:/user
请求方式:POST
参数解释 | 参数名称 | 数据类型 | 限制 |
---|---|---|---|
管理员名称 | user_name | string | 50个字符以内 |
管理员级别 | user_type | int | 2.3中的一个 |
邮箱 | string | 邮箱 | |
登录电话号码 | phonenumber | string | 11位电话号码 |
登录密码 | password | string | 密码:8-16位 |
查找所有用户
请求地址:/user/find/user?pageSize=10&pageNum=1
请求方式:GET
以下参数为可选 默认从config、page中获取
参数解释 | 参数名称 | 数据类型 | 限制 |
---|---|---|---|
第几页 | pageNo | string | int |
一页显示几条 | pageSize | string | int |
查找所有管理员
请求地址:/user/find/manager?pageSize=10&pageNum=1
请求方式:GET
以下参数为可选默认从config.page中获取
参数解释 | 参数名称 | 数据类型 | 限制 |
---|---|---|---|
第几页 | pageNo | string /int | |
一页显示几条 | pageSize | string /int |
查找具体某一个用户
请求地址:/user/findOne/{user_id}
请求方式:Get
参数解释 | 参数名称 | 数据类型 | 限制 |
---|---|---|---|
id | user_id | int |
删除用户
请求地址:/user/delete
请求方式:Post
参数解释 | 参数名称 | 数据类型 | 限制 |
---|---|---|---|
id | user_id | int |
主要工作
1.设计用户数据库表格,
在navicat上面显示如图:
2.数据传输对象设计,创建user.dto.ts,这是为管理员设置的DTO。有CreateUserDto与DeleteUserDto两个类组成。定义了账号格式、用户类型(2:普通职员–管理员;3:高级职员–超级管理员)
import { ApiProperty } from '@nestjs/swagger';
import {
IsIn,
IsNotEmpty,
IsNumber,
IsString,
Matches,
MaxLength,
MinLength,
} from 'class-validator';
/**
* 此DTO只为管理员
*/
export class CreateUserDto {
@ApiProperty({ example: 'admin' })
@MaxLength(30, { message: '账户不能超过30个字符' })
@IsNotEmpty({ message: '账户不能为空' })
readonly user_name: string;
@ApiProperty({ example: 2 })
@IsNumber()
@IsIn([2, 3], { message: '类型只能时2.3中的一个' })
readonly user_type: number;
@ApiProperty({ example: '123@qq.com' })
@MaxLength(50, { message: '邮箱不能超过50个字符' })
@IsNotEmpty({ message: '邮箱不能为空' })
@Matches(/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/, {
message: '请输入正确的邮箱账户',
})
readonly email: string;
@ApiProperty({ example: '18312341234' })
@MaxLength(11, { message: '电话号码不能超过11个字符' })
@IsNotEmpty({ message: '手机号不能为空' })
@Matches(
/^(0|86|17951)?(13[0-9]|15[012356789]|166|17[3678]|18[0-9]|14[57])[0-9]{8}$/,
{
message: '请输入正确的手机号',
},
)
readonly phonenumber: string;
@ApiProperty({ example: '12345678qwe' })
@MaxLength(16, { message: '密码不能超过16个字符' })
@MinLength(8, { message: '密码不能少于8位' })
@IsNotEmpty({ message: '密码不能为空' })
readonly password: string;
}
export class DeleteUserDto {
@ApiProperty({ example: '2' })
@IsNumber({}, { message: 'user_id需要时数字' })
@IsNotEmpty({ message: 'user_id不能为空' })
user_id: number;
}
3.定义实体类,user.entity.ts
import {
Column,
PrimaryGeneratedColumn,
Entity,
CreateDateColumn,
UpdateDateColumn,
} from 'typeorm';
@Entity('user')
export class UserEntity {
@PrimaryGeneratedColumn({ comment: '用户ID' })
user_id: number; // COMMENT '用户ID',
@Column('varchar', { length: 30, nullable: false, comment: '用户名称' })
user_name: string; // COMMENT '用户名称',
@Column('int', {
default: 1,
comment: '用户类型:3 超管 2 普通管理员 1普通用户',
})
user_type: number; // 用户类型:3 超管2 普通管理员 1普通用户,
@Column('varchar', {
length: 50,
nullable: false,
default: '123@qq.com',
comment: '用户邮箱',
})
email: string;
@Column('varchar', {
length: 11,
default: '18312341234',
comment: '手机号码',
nullable: false,
})
phonenumber: string;
@Column('varchar', {
comment: '密码',
nullable: false,
select: false,// 查询时,不返回
})
password: string;
@Column('varchar', {
length: 1,
default: '0',
comment: '删除标志:0代表存在 2代表删除)',
})
del_flag: string;
@CreateDateColumn()
create_time: number;
@UpdateDateColumn()
update_time: number;
}
4.编写user.service.ts文件
import { HttpException, Injectable } from '@nestjs/common';
import { CreateUserDto } from '../dto/userDto';
import { UserEntity } from '../entity/user.entity';
import { In, Repository } from 'typeorm';
import { InjectRepository } from '@nestjs/typeorm';
import config from 'src/config';
@Injectable()
export class UserService {
constructor(
@InjectRepository(UserEntity)
private user: Repository<UserEntity>,
) {}
/**
* 创建管理员
* @param createUserDto
* @returns
*/
async create(createUserDto: CreateUserDto) {
try {
const isExist = await this.user.findOne({
phonenumber: createUserDto.phonenumber,
});
if (isExist) {
throw new HttpException('管理员已注册', 400);
}
await this.user.insert(createUserDto);
// 插入成功没有返回数据,
return null; // 这里的null和失败的null是有区别的
} catch (error) {
throw new HttpException(
error.message ?? '数据插入失败',
error.status ?? 500,
);
}
}
/**
* 查找所有管理员或者用户
* @param pageNo 可选第几页 config中配置默认
* @param pageSize 可选一页显示几条 config中配置默认
* @param user_type 可选是否查询普通用户:默认位true 普通用户
* @returns
*/
async findAll(
pageNo = config.page.pageNumber,
pageSize = config.page.pageSize,
user_type = true,
) {
try {
const where = user_type ? { user_type: 1 } : { user_type: In([2, 3]) };
const res = await this.user.findAndCount({
// 查询没有被删除的,即del_flag为0
where: {
del_flag: '0',
...where,
},
// 那些字段返回
select: [
'user_id',
'user_name',
'user_type',
'phonenumber',
'create_time',
],
// 分页
skip: (pageNo - 1) * pageSize,
take: pageSize,
});
// findAndCount 返回的是数组,第一个书数据,第二是总条数
return res[0];
} catch (error) {
throw new HttpException('查询所有失败', 500);
}
}
/**
*
* @param user_id 根据user_id 查找一个
* @returns
*/
async findOne(user_id: number): Promise<any> {
try {
const user = await this.user.find({
where: { user_id },
select: [
'user_id',
'user_name',
'user_type',
'phonenumber',
'create_time',
],
});
if (!user || user.length <= 0) {
throw new HttpException('用户id不正确', 404);
}
return user;
} catch (error) {
// 如果未找到用户,报错
throw new HttpException(
error.message ?? '数据查询失败',
error.status ?? 500,
);
}
}
/**
* 根据user_id 删除用户
* @param user_id
* @returns
*/
async remove(user_id: number) {
// 用户是软删除:数据还在,只是del_flag 为2 :无法登录
try {
const update = await this.user.findOne({
where: {
user_id,
},
});
if (!update) {
// 这里的错误会被catch里捕获
throw new HttpException('数据不存在,请重新提交', 400);
}
update.del_flag = '2';
await this.user.save(update);
} catch (error) {
// 如果未找到用户,报错
throw new HttpException(
error.message ?? '数据更新失败',
error.status ?? 500,
);
}
}
}
5.编写user.controller.ts文件
import {
Controller,
Get,
Post,
Body,
Param,
Delete,
Query,
} from '@nestjs/common';
import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
import { UserService } from '../service/user.service';
import { CreateUserDto, DeleteUserDto } from '../dto/userDto';
import { Roles } from 'src/decorator/roles.decorator';
@ApiTags('人员管理')
@Controller('user')
@ApiBearerAuth()
export class UserController {
constructor(private readonly userService: UserService) {}
/**
* 只创建管理员 只有超管可以操作
* @param createUserDto
* @returns
*/
@ApiOperation({ description: '创建管理员' })
@Post()
@Roles('super')
create(@Body() createUserDto: CreateUserDto) {
return this.userService.create(createUserDto);
}
/**
* 查找所有用户
* admin super 可以操作
* @returns
*/
@ApiOperation({ description: '查找所有用户' })
@Get('/find/user')
@Roles('admin', 'super')
findAllUser(
// 带有问号参数的请求方式,
// ? 可选
@Query('pageNo') pageNo?: string,
@Query('pageSize') pageSize?: string,
) {
return this.userService.findAll(parseInt(pageNo), parseInt(pageSize));
}
/**
* 查找所有管理员或者人员
* admin super 可以操作
* @returns
*/
@ApiOperation({ description: '查找所有管理员' })
@Get("/find/manager")
@Roles('super')
findAllManager(
// 带有问号参数的请求方式,
// ? 可选
@Query('pageNo') pageNo?: string,
@Query('pageSize') pageSize?: string,
) {
return this.userService.findAll(
parseInt(pageNo),
parseInt(pageSize),
false,
);
}
/**
* 根据ID查找一个用户
* @param user_id
* @returns
*/
@ApiOperation({ description: '根据ID查找一个用户' })
@Get('/findOne/:user_id')
findOne(@Param('user_id') user_id: string) {
return this.userService.findOne(+user_id);
}
/**
* 删除用户:设置del-flag为2
* 根据user_id 删除用户
* @param user_id
* @returns
*/
@ApiOperation({ description: '根据id删除一个用户' })
@Post('/delete')
@Roles('admin', 'super')
async remove(@Body() body: DeleteUserDto) {
return await this.userService.remove(body.user_id);
}
}
实现:
周三与周四
与搭档发送的前端代码进行联调,在此基础上实现一些代码优化以及问题解决。
这部分主要通过问题描述与解决来记录这两天毕业设计工作内容。
问题1
下载前端代码后,运行ng失败,显示ng不是内部或者外部运行命令
解决方法:
之前在安装Angular环境的时候有个问题,就是通过命令成功安装了angular cl脚手架工具,但是在终端(win+r cmd)中输入ng version一直提元的是ng不是内部或外部命令,也不是可运行的程序或批处理文件,然后重复删除安装了多次都是一样,最后发现原来没有添加到系统盘的环境变量中去。
1.通过命令成功安装了Angular脚手架工具
npm install -g @angular/cli
下载好了可以在cmd里面查看是否下载或者版本信息,下载好了之后会显示下图内容:
2.运行命令查看node和npm环境是否正常:
node -v
npm -v
3.再次运行:
ng serve --open
在终端输入:ng serve --open启动运行,
这个问题我始终没有解决,刚开始以为是vscode的权限问题,后面用了cmd输入这些命令也是这样的报错。实在没有办法。
然后转换了思路,搭档将前端代码打包,
我利用nginx 再本地创建好一个网站。意思是在本地电脑上建立网站,这种方式相当于就是发布网站,只是服务器是本地的
1.启动nginx
2.建立网站
填写域名:
将代码存储至网站根目录,
点击重启,
打开浏览器,在地址栏输入abc.com
前端代码运行成功,
问题2
后端代码打包后,将打包的后端代码重新下载,运行npm install命令无法将需要的包全部下载,而是需要逐个下载引用包
后端代码打包后,将打包的后端代码重新下载,将需要的包全部下载后,运行
npm run dev
解决方法:检查代码,,,发现脚本文件里有两个package.json文件
这里是纯粹的大乌龙事件,然后就是把后端的该删的删了,然后重新下载代码。
得到教训:进入正确的目录!!!!!
src文件在哪里 就去哪儿
运行
npm run dev
联调测试
1.注册
2.登录
3.刷新数据库列表
4.提交贷款信息
5.查看得分
6.查看评分数据列表
但是不知道是不是这种前端采用这种方式的原因,就是会有时候无法响应或者显示404的状态。
本周总结与下周计划
本周开启了文论的编写,因为抽检期中检查做的内容较少,主要是实现了用户管理模块的解决,实现增删查改等功能以及代码编写。其次是开启了前端的联调,实现完整系统测试运行,并且用到了angular相关知识,在配置环境时遇到了不少的问题,虽然闹了一些乌龙。但也搜集相关资料去解决了这些问题。还需要慢慢探索
下周计划搜集相关资料、整理一些资料然后搞论文,想把目录第二章和第三章完结。主要是介绍所用的工具、系统设计的思想、需求分析。
需要整理的东西有:
1.在写代码的基础上更深入的了解框架结构以及所用工具、语言。
2.完成业务流程图更复杂的设计,学习关于金融方面专有名词与理解。
3.整理各模块功能需求与设计图。
4.设计后端框图,