美文网首页
nest.js + vue实现用户组织权限系统

nest.js + vue实现用户组织权限系统

作者: 阿叔有话说 | 来源:发表于2020-05-05 19:10 被阅读0次

用户组织权限管理系统

技术栈:

  • 前端:Vue + ElementUi + TypeScript
  • 后端:nest.js + mysql + redis

演示地址

用户组织管理系统(演示地址)
github

功能设计

BSp-blog.png

数据库设计

用户实体

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ length: 500 })
  name: string;

  @Column({nullable: true, type: 'text'})
  desc: string;

  @Column({
    nullable: true,
    length: 100,
    select: false,
  })
  password: string;

  @Column( {select: false} )
  email: string;

  @Column({nullable: true})
  age: string;

  @Column({nullable: true})
  address: string;

  @Column({nullable: true})
  nick: string;

  @Column({default: 0})
  status: number;

  @ManyToOne(type => Role, role => role.users)
  role: Role;

  @ManyToMany( type => Organization, orientation => orientation.users)
  organizations: Organization[];

  @Column({default: 0})
  isDelete: number;

  @Column({default: '', nullable: true })
  crateTime: string;

  @Column({default: '', nullable: true })
  updateTime: string;

  @Column({default: '', nullable: true })
  deleteTime: string;
}

角色实体

@Entity()
export class Role {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ length: 500 })
  name: string;

  @Column('text', {nullable: true})
  desc: string;

  @Column()
  code: string;

  @ManyToMany(type => Authority, authority => authority.roles)
  @JoinTable()
  authority: Authority[];

  @OneToMany(type => User, user => user.role)
  users: User[];

  @Column({default: 0})
  isDelete: number;

  @Column({default: '', nullable: true })
  crateTime: string;

  @Column({default: '', nullable: true })
  updateTime: string;

  @Column({default: '', nullable: true })
  deleteTime: string;
}

资源实体

@Entity()
export class Authority {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ length: 500 })
  name: string;

  @Column('text', {nullable: true})
  desc: string;

  @Column()
  path: string;

  @Column()
  value: string;

  @Column()
  parentId: number;

  @Column({default: '', nullable: true })
  parentName: string;

  @Column({nullable: true})
  icon: string;

  @Column({nullable: false})
  system: string;

  @Column()
  code: string;

  @ManyToMany(type => Role, role => role.authority)
  roles: Role[];

  @Column({default: 0})
  isDelete: number;

  @Column({default: '', nullable: true })
  crateTime: string;

  @Column({default: '', nullable: true })
  updateTime: string;

  @Column({default: '', nullable: true })
  deleteTime: string;
}

API实现

数据库配置(main.module.ts)

TypeOrmModule.forRoot(
        {
          type: 'mysql',
          host: mysqlConfig.host,
          port: 3306,
          username: mysqlConfig.userName,
          password: mysqlConfig.password,
          database: 'b_simple_user_center',
          entities: [join(__dirname, '**/**.entity{.ts,.js}')],
          synchronize: true,
        },
    ),

全局缓存

CacheModule.register({
          store: redisStore,
          host: redisCacheConfig.host,
          port: redisCacheConfig.port,
          ttl: redisCacheConfig.ttl, // seconds
          max: redisCacheConfig.max, // seconds
      }),

业务层实现

该系统中使用typeorm操作数据库,常见的typeorm操作方式包Entity Manager 和Query Builder,结合系统多条件查询场景,因此采用Query Builder方式,控制层和服务层为一一对应关系,代码内参见src/controller、src/service

采坑点

nest多条件查询

...
const queryConditionList = ['c.isDelete = :isDelete'];
            if (query.name) {
                queryConditionList.push('c.name LIKE :name');
            }
            const queryCondition = queryConditionList.join(' AND ');
            const res = await this.productBrandRepository
                .createQueryBuilder('c')
                .where(queryCondition, {
                    name: `%${query.name}%`,
                    isDelete: 0,
                })
                .orderBy('c.name', 'ASC')
                .skip((query.page - 1) * query.pageSize)
                .take(query.pageSize)
                .getManyAndCount();
...

typeorm实体间任意联查

typeorm中联查任意实体(在实体关系间没有表关联)时,getManyAndCount无法查询关联字段,必须采用getRawAndEntities,typeorm文档书写有误。

...
            const res = await this.productAttributeRepository
                .createQueryBuilder('c')
                .leftJoinAndSelect(ProductAttributeCategoryEntity, 'a', 'a.id = c.product_attribute_category_id')
                .where(queryCondition, {
                    name: `%${query.name}%`,
                    isDelete: 0,
                    productAttributeCategoryId: Number(query.cateAttrId),
                    type: Number(query.type),
                })
                .orderBy('c.name', 'ASC')
                .skip((query.page - 1) * query.pageSize)
                .take(query.pageSize)
                .getRawAndEntities();


...

JWT用户认证拆分单独服务

用户系统中与身份认证拆分成单独的服务(网关服务)

原文地址:http://www.yongfeifeilove.xyz:3002/blog/nest/%E7%94%A8%E6%88%B7%E7%BB%84%E7%BB%87%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F

相关文章

  • nest.js + vue实现用户组织权限系统

    用户组织权限管理系统 技术栈: 前端:Vue + ElementUi + TypeScript 后端:nest.j...

  • 前端界面权限控制-React/Vue实现

    前端界面权限控制-React/Vue实现 前言 在所有管理系统中,都会包含权限模块,来进行用户的权限分配和控制,从...

  • 基于springboot的ERP系统

    一、项目简介 基于springboot的ERP系统 二、实现功能 用户与权限 职员与组织(职员管理、岗位管理、部门...

  • vue权限管控permission实现

    vue项目实现不同用户角色权限管控: 第一种方式:自定义指令实现用户角色权限控制v-permission: 实现方...

  • Vue2.0用户权限控制解决方案

    Vue-Access-Control是一套基于Vue/Vue-Router/axios 实现的前端用户权限控制解决...

  • 浅谈VueRouter之权限控制

    前言 在管理系统中最让人头疼的就是权限管理了,今天和大家一起讨论下在Vue技术栈中怎么实现简单实用用户的权限控制,...

  • 权限管理

    什么是权限管理 一般来说,只要有用户参与,那么该系统都会需要权限管理,权限管理实现了对用户访问系统指定功能的限制,...

  • vue配置相关

    一字一句的搞懂vue-cli之vue webpack template配置 基于Vue实现后台系统权限控制 手摸手...

  • 2021-12-07 之前的总结

    第一个Community博客的主要亮点在于实现了基本:vue+springboot基于用户权限实现不同用户登录后单...

  • 权限设计(下) - 细说权限设计

    什么是权限管理一般来说,只要有用户参与的系统,那么都要有权限管理,尤其是一些后台的管理系统,权限管理可以实现对用户...

网友评论

      本文标题:nest.js + vue实现用户组织权限系统

      本文链接:https://www.haomeiwen.com/subject/wsrvghtx.html