毕业设计第十一周记录

周六、周日

因为身边朋友很多论文都在进行中,所以周末在构思自己的论文结构,考虑需要写的内容与可写的内容,书写了目录部分并交给老师审阅,进行了部分修改。
主要完成了关于论文的事宜:目录编写、摘要编写以及开启绪论背景编写。

周一与周二

进行用户模块的代码设计优化,上周主要做了用户的注册登录代码实现,本周完善剩下的用户模块:主要是用户管理,实现的五大功能:新增管理员,查找所有用户,查找所有管理员、查找具体某一个用户、删除用户。

新增管理员

请求地址:/user
请求方式:POST

参数解释参数名称数据类型限制
管理员名称user_namestring50个字符以内
管理员级别user_typeint2.3中的一个
邮箱emailstring邮箱
登录电话号码phonenumberstring11位电话号码
登录密码passwordstring密码:8-16位

查找所有用户

请求地址:/user/find/user?pageSize=10&pageNum=1

请求方式:GET

以下参数为可选 默认从config、page中获取

参数解释参数名称数据类型限制
第几页pageNostringint
一页显示几条pageSizestringint

查找所有管理员

请求地址:/user/find/manager?pageSize=10&pageNum=1
请求方式:GET
以下参数为可选默认从config.page中获取

参数解释参数名称数据类型限制
第几页pageNostring /int
一页显示几条pageSizestring /int

查找具体某一个用户

请求地址:/user/findOne/{user_id}

请求方式:Get

参数解释参数名称数据类型限制
iduser_idint

删除用户

请求地址:/user/delete

请求方式:Post

参数解释参数名称数据类型限制
iduser_idint

主要工作

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.设计后端框图,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值