NestJS-角色模块

NestJS-角色模块

1、角色模块

接下来我们新建一个角色模块,实现对于角色部分的管理功能接口

👉生成角色文件

javascript 复制代码
nest g controller modules/role --no-spec
nest g module modules/role --no-spec
nest g service modules/role --no-spec

创建完成以后的目录如下图所示

javascript 复制代码
src\modules\role
  src\modules\role\role.controller.ts
  src\modules\role\role.module.ts
  src\modules\role\role.service.ts

//手动添加实体
  src\modules\role\role.entity.ts

👉role.entity.ts实体搭建

javascript 复制代码
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity('sys_role')
export class Role {
  @PrimaryGeneratedColumn({ name: 'role_id', type: 'bigint' })
  roleId: number;

  @Column({ name: 'role_name', length: 30 })
  roleName: string;

  @Column({ name: 'role_key', length: 100 })
  roleKey: string;

  @Column({ name: 'role_sort', type: 'int' })
  roleSort: number;

  @Column({ 
    name: 'data_scope', 
    type: 'char', 
    length: 1, 
    default: '1',
    comment: '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)'
  })
  dataScope: string;

  @Column({ 
    name: 'role_check_strictly', 
    type: 'tinyint', 
    default: 1,
    comment: '菜单树选择项是否关联显示'
  })
  roleCheckStrictly: number;

  @Column({ 
    name: 'dept_check_strictly', 
    type: 'tinyint', 
    default: 1,
    comment: '部门树选择项是否关联显示'
  })
  deptCheckStrictly: number;

  @Column({ 
    name: 'status', 
    type: 'char', 
    length: 1,
    comment: '角色状态(0正常 1停用)'
  })
  status: string;

  @Column({ 
    name: 'del_flag', 
    type: 'char', 
    length: 1, 
    default: '0',
    comment: '删除标志(0代表存在 2代表删除)'
  })
  delFlag: string;

  @Column({ 
    name: 'create_by', 
    length: 64, 
    default: '',
    nullable: true,
    comment: '创建者'
  })
  createBy: string;

  @Column({ 
    name: 'create_time', 
    type: 'datetime',
    nullable: true,
    comment: '创建时间'
  })
  createTime: Date;

  @Column({ 
    name: 'update_by', 
    length: 64, 
    default: '',
    nullable: true,
    comment: '更新者'
  })
  updateBy: string;

  @Column({ 
    name: 'update_time', 
    type: 'datetime',
    nullable: true,
    comment: '更新时间'
  })
  updateTime: Date;

  @Column({ 
    name: 'remark', 
    length: 500,
    nullable: true,
    comment: '备注'
  })
  remark: string;
}

略微完善和调整

javascript 复制代码

👉实体映射

在我们的src\common\entity\index.ts文件之中导入实体并进行映射

javascript 复制代码
import { Role } from '../../modules/role/role.entity'; // 角色实体

export const typeOrmConfig: TypeOrmModuleOptions = {
  type: 'mysql', // 可以选择其他数据库,如 MySQL
  host: 'localhost',
  port: 3306,
  username: 'root',
  password: 'XXXXX',
  database: 'nexusnest',
  entities: [Role], 
  synchronize: true, // 自动同步实体到数据库(开发时可以启用,生产环境应谨慎使用)
  logging: false,  // 启用日志记录
  timezone: '+08:00', // 设置时区
};

这个时候刷新我们数据库可以发现,数据库的表已经对应上我们对应的实体了

👉插入数据库数据

javascript 复制代码
SET FOREIGN_KEY_CHECKS = 0;
INSERT INTO `sys_role` (
    `role_id`, `role_name`, `role_key`, `role_sort`, `data_scope`, 
    `menu_check_strictly`, `dept_check_strictly`, `status`, `del_flag`, 
    `create_by`, `create_time`, `update_by`, `update_time`, `remark`
) VALUES 
(1, '超级管理员', 'admin', 1, '1', 1, 1, '0', '0', 'admin', '2024-05-28 13:43:38', '', NULL, '超级管理员'),
(2, '普通角色', 'common', 2, '2', 1, 1, '0', '0', 'admin', '2024-05-28 13:43:38', '', NULL, '普通角色'),
(100, '新角色', 'new_role', 3, '1', 1, 1, '0', '0', 'admin', '2024-06-06 17:54:43', '', NULL, '这是一个新角色'),
(102, 'cerole', '12', 0, '1', 1, 1, '0', '0', NULL, '1969-12-31 08:00:00', '', NULL, '备注');

SET FOREIGN_KEY_CHECKS = 1;

2、搜索

接下来我们就根据对应的实体帮助我们生成一下我们的角色功能部分的api接口

实现角色功能其实跟我们其他管理的部分差不多

角色功能主要是我们在pc端用户进行登陆以后可以对于角色角色权限进行控制,然后可以通过角色对用户进行权限的统一管理

👉 role.module.ts

在角色模块之中导入其他的模块部分

javascript 复制代码
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

import { roleService } from './role.service';
import { roleController } from './role.controller';
import { role } from './role.entity';

@Module({
  imports: [TypeOrmModule.forFeature([role])],    // 导入实体
  controllers: [roleController],                  // 注册控制器
  providers: [roleService],                       // 注册服务
  exports: [roleService]                          // 导出服务
})
export class roleModule {}

👉role.controller.ts 控制器

javascript 复制代码
 // 列表 
  @Get('/system/role')
  @ApiOperation({ summary: '列表带分页' }) // 操作描述
  @ApiQuery({ name: 'pageNum', required: false, description: 'Page number', example: 1 })  // pageNum参数
  @ApiQuery({ name: 'pageSize', required: false, description: 'Number of items per page', example: 10 })  // pageSize参数
  // 获取列表所有
  async getAll(
    @Query('isDeleted') isDeleted: boolean,
    @Query('pageNum') pageNum = 1,  // 默认第1页
    @Query('pageSize') pageSize= 10, // 默认每页10条
  ) {
    // const queryParams: QueryParams = { name, phone, age, sex };
    const queryParams = { isDeleted: false};
    console.log(queryParams, 'queryParams--查询');
    const ResponseData = await this.roleService.getAll(pageNum, pageSize, queryParams);
    return ResponseData;
  }

👉role.service.ts 服务层

javascript 复制代码
async getAll(pageNum: number, pageSize: number, queryParams: any): Promise<ResponseDto<Role[]>> {
  console.log(queryParams, 'queryParams');
  // 新版本完善-通用分页查询
  const where = await getListApi(this.RoleRepository, pageNum, pageSize, queryParams);
  return where;
}

查询一下,接口ok

👉getListAllApi通用方法

getListAllApi接口是通用的

javascript 复制代码
// 通用查询所有
export const getListAllApi = async (Repository,queryParams: any) => {
  const where = await buildQueryParams(queryParams);
  const [data, total] = await Repository.findAndCount(
    {
      where,
    }
  );
  if (data) {
    return {
      message: '查询成功!',
      code: 200,
      data: data, // 返回查询到的用户数据
      total: total,
    };
  } else {
    return {
      message: '查询失败!',
      code: 500,
      data: [], // 返回查询到的用户数据
      total: 0,
    }
  }
}

3、增加

👉role.controller.ts 控制器

javascript 复制代码
// 新增
@ApiOperation({ summary: '新增' }) // 操作描述
@Post('/system/role')
async create(@Body() addFormData) {
  console.log(addFormData, 'addFormData--添加参数');
  return this.roleService.addOne(addFormData);
}

👉role.service.ts 服务层

javascript 复制代码
async addOne(addFormData) {
  const resdata = await addApi(this.RoleRepository, addFormData);
  return resdata;
}

尝试一下我们的新增接口

增加功能ok,并且能正确返回我们想要的东西

4、详情

详情,通过id然后查到对应的内容

👉role.controller.ts 控制器

javascript 复制代码
// 查询单个
@Get('/system/role/:id')
@ApiOperation({ summary: '查询单个' }) // 操作描述
async getOne(@Param('id') id: string) {
  return this.roleService.getOne(id);
}

👉role.service.ts 服务层

javascript 复制代码
// 通用详情
async getOne(id) {
  const resdata = await getOneApi(this.roleRepository,{roleId:id});
  return resdata;
}

简单测试一下,详情接口没问题,我们采用的也是通过ID的方式进行获取的

5、修改

接下来我们完善一下我们的修改接口:

👉role.controller.ts 控制器

javascript 复制代码
  @Put('/system/role')
  @ApiOperation({ summary: '更新' }) // 操作描述
  async updateOne(
    @Body() updateFormData
  ) {
    console.log(updateFormData, 'updateFormData');
    // console.log(updateFormData, 'updateFormData');
    return this.roleService.updateOne(updateFormData.roleId, updateFormData);
  }

👉role.service.ts 服务层

javascript 复制代码
 // 通用更新
  async updateOne(id, updateFormData) {
    const resdata = await updateOneApi(this.RoleRepository, updateFormData, { roleId: id });
    return resdata;
  }

简单测试一下,修改接口没问题

5、删除

👉role.controller.ts 控制器

javascript 复制代码
// 删除
@Delete('/system/role/:id')
@ApiOperation({ summary: '删除' }) // 操作描述
async deleteOne(@Param('id') id: number) {
  return this.roleService.deleteOne(id);
}

👉role.service.ts 服务层

javascript 复制代码
async deleteOne(id) {
  // const resdata = await deleteOneApi(this.RoleRepository,{RoleId:id});
  const resdata = await delOneApiPermanent(this.RoleRepository, { roleId: id });
  return resdata;
}

测试可以发现,我们的删除功能已经好了!

相关推荐
无名客023 分钟前
npm run dev 启动项目 报Error: listen EACCES: permission denied 0.0.0.0:80 解决方法
前端·javascript·vue.js
零点七九24 分钟前
vue npm install卡住没反应
前端·vue.js·npm
墨菲安全29 分钟前
NPM组件 @0xme5war/apicli 等窃取主机敏感信息
前端·npm·node.js·主机信息窃取·npm恶意包·npm投毒
Komorebi_999929 分钟前
vue create 项目名 和 npm init vue@latest 创建vue项目的不同
前端·vue.js·npm
好好研究3 小时前
使用JavaScript实现轮播图的自动切换和左右箭头切换效果
开发语言·前端·javascript·css·html
伍哥的传说7 小时前
Radash.js 现代化JavaScript实用工具库详解 – 轻量级Lodash替代方案
开发语言·javascript·ecmascript·tree-shaking·radash.js·debounce·throttle
程序视点7 小时前
IObit Uninstaller Pro专业卸载,免激活版本,卸载清理注册表,彻底告别软件残留
前端·windows·后端
前端程序媛-Tian8 小时前
【dropdown组件填坑指南】—怎么实现下拉框的位置计算
前端·javascript·vue
iamlujingtao8 小时前
js多边形算法:获取多边形中心点,且必定在多边形内部
javascript·算法
嘉琪0018 小时前
实现视频实时马赛克
linux·前端·javascript