egg.js 单表通用增删改查接口编写

1,718 阅读1分钟

controller

import { BaseController } from '../../../lib/base/controller';
import routerDecorator from '../../../lib/router';
import { Context } from 'egg';

/**
 * 系统-用户
 */
@routerDecorator.prefix('/admin/sys/user', [ 'add', 'delete', 'update', 'info', 'list', 'page' ])
export default class SysUserController extends BaseController {
    constructor (ctx: Context) {
        super(ctx);
        this.setEntity(this.ctx.repo.sys.User);
        const option = {
            keyWordLikeFields: [ 'name' ],
        };
        this.setPageOption(option);
        this.setService(this.service.sys.user);
    }
}

entity

import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm';
import { BaseEntity } from '../../lib/base/entity';

/**
 * 系统用户
 */
@Entity({ name: 'sys_user' })
export default class SysUser extends BaseEntity {
    // ID
    @PrimaryGeneratedColumn({ type: 'bigint' })
    id: number;
    // 姓名
    @Column({ nullable: true })
    name: string;
    // 用户名
    @Index({ unique: true })
    @Column()
    username: string;
    // 密码
    @Column()
    password: string;
    // 密码版本
    @Column({ default: 1 })
    passwordV: number;
    // 昵称
    @Column({ nullable: true })
    nickName: string;
    // 头像
    @Column({ nullable: true })
    headImg: string;
    // 手机
    @Index()
    @Column({ nullable: true })
    phone: string;
    // 邮箱
    @Column({ nullable: true })
    email: string;
    // 备注
    @Column({ nullable: true, length: 500 })
    remark: string;
    // 状态 0:禁用 1:启用
    @Column({ default: 1, type: 'tinyint' })
    status: number;
}

service

import { BaseService } from '../../lib/base/service';
import * as _ from 'lodash';
import * as md5 from 'md5';

/**
 * 系统-用户
 */
export default class SysUserService extends BaseService {
    /**
     * 分页查询
     * @param param
     */
    async page (param) {
        const { keyWord } = param;
        const sql = `
        SELECT
            a.*,
            GROUP_CONCAT(c.name) AS roleName
        FROM
            sys_user a
            LEFT JOIN sys_user_role b ON a.id = b.userId
            LEFT JOIN sys_role c ON b.roleId = c.id
        WHERE 1 = 1
            ${ this.setSql(keyWord, 'and (a.name LIKE ? or a.username LIKE ?)', [ `%${ keyWord }%`, `%${ keyWord }%` ]) }
        GROUP BY a.id
        `;
        return this.sqlRenderPage(sql, param);
    }

    /**
     *
     * @param param
     */
    async add (param) {
        const exists = await this.getRepo().sys.User.findOne({ username: param.username });
        if (!_.isEmpty(exists)) {
            throw new Error('business 用户名已经存在~');
        }
        param.password = md5('123456'); // 默认密码  建议未改密码不能登陆
        await this.getRepo().sys.User.save(param);
        await this.updateUserRole(param);
    }

    /**
     * 更新用户角色关系
     * @param user
     */
    async updateUserRole (user) {
        await this.getRepo().sys.User_role.delete({ userId: user.id });
        if (user.roleIdList) {
            for (const roleId of user.roleIdList) {
                await this.getRepo().sys.User_role.save({ userId: user.id, roleId });
            }
        }
        await this.service.sys.perms.refreshPerms(user.id);
    }
}