refactor: 确立独立子工程架构 (backend, admin, mpuniapp) 并同步更新 AGENTS.md 规范
这个提交包含在:
@@ -0,0 +1,29 @@
|
||||
import { CoolController, BaseController } from '@cool-midway/core';
|
||||
import { Body, Get, Inject, Post } from '@midwayjs/core';
|
||||
import { BaseCodingService } from '../../service/coding';
|
||||
|
||||
/**
|
||||
* Ai编码
|
||||
*/
|
||||
@CoolController()
|
||||
export class AdminCodingController extends BaseController {
|
||||
@Inject()
|
||||
baseCodingService: BaseCodingService;
|
||||
|
||||
@Get('/getModuleTree', { summary: '获取模块目录结构' })
|
||||
async getModuleTree() {
|
||||
return this.ok(await this.baseCodingService.getModuleTree());
|
||||
}
|
||||
|
||||
@Post('/createCode', { summary: '创建代码' })
|
||||
async createCode(
|
||||
@Body('codes')
|
||||
codes: {
|
||||
path: string;
|
||||
content: string;
|
||||
}[]
|
||||
) {
|
||||
this.baseCodingService.createCode(codes);
|
||||
return this.ok();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
import {
|
||||
BaseController,
|
||||
CoolController,
|
||||
CoolTag,
|
||||
CoolUrlTag,
|
||||
TagTypes,
|
||||
} from '@cool-midway/core';
|
||||
import { ALL, Body, Get, Inject, Post, Provide } from '@midwayjs/core';
|
||||
import { Context } from '@midwayjs/koa';
|
||||
import { PluginService } from '../../../plugin/service/info';
|
||||
import { BaseSysUserEntity } from '../../entity/sys/user';
|
||||
import { BaseSysLoginService } from '../../service/sys/login';
|
||||
import { BaseSysPermsService } from '../../service/sys/perms';
|
||||
import { BaseSysUserService } from '../../service/sys/user';
|
||||
|
||||
/**
|
||||
* Base 通用接口 一般写不需要权限过滤的接口
|
||||
*/
|
||||
@CoolUrlTag()
|
||||
@Provide()
|
||||
@CoolController()
|
||||
export class BaseCommController extends BaseController {
|
||||
@Inject()
|
||||
baseSysUserService: BaseSysUserService;
|
||||
|
||||
@Inject()
|
||||
baseSysPermsService: BaseSysPermsService;
|
||||
|
||||
@Inject()
|
||||
baseSysLoginService: BaseSysLoginService;
|
||||
|
||||
@Inject()
|
||||
ctx: Context;
|
||||
|
||||
@Inject()
|
||||
pluginService: PluginService;
|
||||
|
||||
/**
|
||||
* 获得个人信息
|
||||
*/
|
||||
@Get('/person', { summary: '个人信息' })
|
||||
async person() {
|
||||
return this.ok(
|
||||
await this.baseSysUserService.person(this.ctx.admin?.userId)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改个人信息
|
||||
*/
|
||||
@Post('/personUpdate', { summary: '修改个人信息' })
|
||||
async personUpdate(@Body(ALL) user: BaseSysUserEntity) {
|
||||
await this.baseSysUserService.personUpdate(user);
|
||||
return this.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* 权限菜单
|
||||
*/
|
||||
@Get('/permmenu', { summary: '权限与菜单' })
|
||||
async permmenu() {
|
||||
return this.ok(
|
||||
await this.baseSysPermsService.permmenu(this.ctx.admin.roleIds)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 文件上传
|
||||
*/
|
||||
@Post('/upload', { summary: '文件上传' })
|
||||
async upload() {
|
||||
const file = await this.pluginService.getInstance('upload');
|
||||
return this.ok(await file.upload(this.ctx));
|
||||
}
|
||||
|
||||
/**
|
||||
* 文件上传模式,本地或者云存储
|
||||
*/
|
||||
@Get('/uploadMode', { summary: '文件上传模式' })
|
||||
async uploadMode() {
|
||||
const file = await this.pluginService.getInstance('upload');
|
||||
return this.ok(await file.getMode());
|
||||
}
|
||||
|
||||
/**
|
||||
* 退出
|
||||
*/
|
||||
@Post('/logout', { summary: '退出' })
|
||||
async logout() {
|
||||
await this.baseSysLoginService.logout();
|
||||
return this.ok();
|
||||
}
|
||||
|
||||
@CoolTag(TagTypes.IGNORE_TOKEN)
|
||||
@Get('/program', { summary: '编程' })
|
||||
async program() {
|
||||
return this.ok('Node');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
import { Provide, Body, Inject, Post, Get, Query } from '@midwayjs/core';
|
||||
import {
|
||||
CoolController,
|
||||
BaseController,
|
||||
CoolEps,
|
||||
CoolUrlTag,
|
||||
CoolTag,
|
||||
TagTypes,
|
||||
RESCODE,
|
||||
} from '@cool-midway/core';
|
||||
import { LoginDTO } from '../../dto/login';
|
||||
import { BaseSysLoginService } from '../../service/sys/login';
|
||||
import { BaseSysParamService } from '../../service/sys/param';
|
||||
import { Context } from '@midwayjs/koa';
|
||||
import { Validate } from '@midwayjs/validate';
|
||||
|
||||
/**
|
||||
* 不需要登录的后台接口
|
||||
*/
|
||||
@Provide()
|
||||
@CoolController({ description: '开放接口' })
|
||||
@CoolUrlTag()
|
||||
export class BaseOpenController extends BaseController {
|
||||
@Inject()
|
||||
baseSysLoginService: BaseSysLoginService;
|
||||
|
||||
@Inject()
|
||||
baseSysParamService: BaseSysParamService;
|
||||
|
||||
@Inject()
|
||||
ctx: Context;
|
||||
|
||||
@Inject()
|
||||
eps: CoolEps;
|
||||
|
||||
/**
|
||||
* 实体信息与路径
|
||||
* @returns
|
||||
*/
|
||||
@CoolTag(TagTypes.IGNORE_TOKEN)
|
||||
@Get('/eps', { summary: '实体信息与路径' })
|
||||
public async getEps() {
|
||||
return this.ok(this.eps.admin);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据配置参数key获得网页内容(富文本)
|
||||
*/
|
||||
@CoolTag(TagTypes.IGNORE_TOKEN)
|
||||
@Get('/html', { summary: '获得网页内容的参数值' })
|
||||
async htmlByKey(@Query('key') key: string) {
|
||||
this.ctx.body = await this.baseSysParamService.htmlByKey(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* 登录
|
||||
* @param login
|
||||
*/
|
||||
@CoolTag(TagTypes.IGNORE_TOKEN)
|
||||
@Post('/login', { summary: '登录' })
|
||||
@Validate()
|
||||
async login(@Body() login: LoginDTO) {
|
||||
return this.ok(await this.baseSysLoginService.login(login));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获得验证码
|
||||
*/
|
||||
@CoolTag(TagTypes.IGNORE_TOKEN)
|
||||
@Get('/captcha', { summary: '验证码' })
|
||||
async captcha(
|
||||
@Query('width') width: number,
|
||||
@Query('height') height: number,
|
||||
@Query('color') color: string
|
||||
) {
|
||||
return this.ok(
|
||||
await this.baseSysLoginService.captcha(width, height, color)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 刷新token
|
||||
*/
|
||||
@CoolTag(TagTypes.IGNORE_TOKEN)
|
||||
@Get('/refreshToken', { summary: '刷新token' })
|
||||
async refreshToken(@Query('refreshToken') refreshToken: string) {
|
||||
try {
|
||||
const token = await this.baseSysLoginService.refreshToken(refreshToken);
|
||||
return this.ok(token);
|
||||
} catch (e) {
|
||||
this.ctx.status = 401;
|
||||
this.ctx.body = {
|
||||
code: RESCODE.COMMFAIL,
|
||||
message: '登录失效~',
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
import { ALL, Body, Inject, Post, Provide } from '@midwayjs/core';
|
||||
import { CoolController, BaseController } from '@cool-midway/core';
|
||||
import { BaseSysDepartmentEntity } from '../../../entity/sys/department';
|
||||
import { BaseSysDepartmentService } from '../../../service/sys/department';
|
||||
|
||||
/**
|
||||
* 部门
|
||||
*/
|
||||
@Provide()
|
||||
@CoolController({
|
||||
api: ['add', 'delete', 'update', 'list'],
|
||||
entity: BaseSysDepartmentEntity,
|
||||
service: BaseSysDepartmentService,
|
||||
insertParam: ctx => {
|
||||
return {
|
||||
userId: ctx.admin.userId,
|
||||
};
|
||||
},
|
||||
})
|
||||
export class BaseDepartmentController extends BaseController {
|
||||
@Inject()
|
||||
baseDepartmentService: BaseSysDepartmentService;
|
||||
|
||||
/**
|
||||
* 部门排序
|
||||
*/
|
||||
@Post('/order', { summary: '排序' })
|
||||
async order(@Body(ALL) params: any) {
|
||||
await this.baseDepartmentService.order(params);
|
||||
return this.ok();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
import { Provide, Post, Inject, Body, Get } from '@midwayjs/core';
|
||||
import { CoolController, BaseController } from '@cool-midway/core';
|
||||
import { BaseSysLogEntity } from '../../../entity/sys/log';
|
||||
import { BaseSysUserEntity } from '../../../entity/sys/user';
|
||||
import { BaseSysConfService } from '../../../service/sys/conf';
|
||||
import { BaseSysLogService } from '../../../service/sys/log';
|
||||
|
||||
/**
|
||||
* 系统日志
|
||||
*/
|
||||
@Provide()
|
||||
@CoolController({
|
||||
api: ['page'],
|
||||
entity: BaseSysLogEntity,
|
||||
urlTag: {
|
||||
name: 'a',
|
||||
url: ['add'],
|
||||
},
|
||||
pageQueryOp: {
|
||||
keyWordLikeFields: ['b.name', 'a.action', 'a.ip'],
|
||||
select: ['a.*', 'b.name'],
|
||||
join: [
|
||||
{
|
||||
entity: BaseSysUserEntity,
|
||||
alias: 'b',
|
||||
condition: 'a.userId = b.id',
|
||||
type: 'leftJoin',
|
||||
},
|
||||
],
|
||||
},
|
||||
})
|
||||
export class BaseSysLogController extends BaseController {
|
||||
@Inject()
|
||||
baseSysLogService: BaseSysLogService;
|
||||
|
||||
@Inject()
|
||||
baseSysConfService: BaseSysConfService;
|
||||
|
||||
/**
|
||||
* 清空日志
|
||||
*/
|
||||
@Post('/clear', { summary: '清理' })
|
||||
public async clear() {
|
||||
await this.baseSysLogService.clear(true);
|
||||
return this.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置日志保存时间
|
||||
*/
|
||||
@Post('/setKeep', { summary: '日志保存时间' })
|
||||
public async setKeep(@Body('value') value: number) {
|
||||
await this.baseSysConfService.updateVaule('logKeep', value);
|
||||
return this.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获得日志保存时间
|
||||
*/
|
||||
@Get('/getKeep', { summary: '获得日志保存时间' })
|
||||
public async getKeep() {
|
||||
return this.ok(await this.baseSysConfService.getValue('logKeep'));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
import { Body, Inject, Post, Provide } from '@midwayjs/core';
|
||||
import { CoolController, BaseController } from '@cool-midway/core';
|
||||
import { BaseSysMenuEntity } from '../../../entity/sys/menu';
|
||||
import { BaseSysMenuService } from '../../../service/sys/menu';
|
||||
|
||||
/**
|
||||
* 菜单
|
||||
*/
|
||||
@Provide()
|
||||
@CoolController({
|
||||
api: ['add', 'delete', 'update', 'info', 'list', 'page'],
|
||||
entity: BaseSysMenuEntity,
|
||||
service: BaseSysMenuService,
|
||||
})
|
||||
export class BaseSysMenuController extends BaseController {
|
||||
@Inject()
|
||||
baseSysMenuService: BaseSysMenuService;
|
||||
|
||||
@Post('/parse', { summary: '解析' })
|
||||
async parse(
|
||||
@Body('entity') entity: string,
|
||||
@Body('controller') controller: string,
|
||||
@Body('module') module: string
|
||||
) {
|
||||
return this.ok(
|
||||
await this.baseSysMenuService.parse(entity, controller, module)
|
||||
);
|
||||
}
|
||||
|
||||
@Post('/create', { summary: '创建代码' })
|
||||
async create(@Body() body) {
|
||||
await this.baseSysMenuService.create(body);
|
||||
return this.ok();
|
||||
}
|
||||
|
||||
@Post('/export', { summary: '导出' })
|
||||
async export(@Body('ids') ids: number[]) {
|
||||
return this.ok(await this.baseSysMenuService.export(ids));
|
||||
}
|
||||
|
||||
@Post('/import', { summary: '导入' })
|
||||
async import(@Body('menus') menus: any[]) {
|
||||
await this.baseSysMenuService.import(menus);
|
||||
return this.ok();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
import { Get, Inject, Provide, Query } from '@midwayjs/core';
|
||||
import { CoolController, BaseController } from '@cool-midway/core';
|
||||
import { BaseSysParamEntity } from '../../../entity/sys/param';
|
||||
import { BaseSysParamService } from '../../../service/sys/param';
|
||||
import { Context } from '@midwayjs/koa';
|
||||
|
||||
/**
|
||||
* 参数配置
|
||||
*/
|
||||
@Provide()
|
||||
@CoolController({
|
||||
api: ['add', 'delete', 'update', 'info', 'page'],
|
||||
entity: BaseSysParamEntity,
|
||||
service: BaseSysParamService,
|
||||
pageQueryOp: {
|
||||
keyWordLikeFields: ['name', 'keyName'],
|
||||
fieldEq: ['dataType'],
|
||||
},
|
||||
})
|
||||
export class BaseSysParamController extends BaseController {
|
||||
@Inject()
|
||||
baseSysParamService: BaseSysParamService;
|
||||
|
||||
@Inject()
|
||||
ctx: Context;
|
||||
|
||||
/**
|
||||
* 根据配置参数key获得网页内容(富文本)
|
||||
*/
|
||||
@Get('/html', { summary: '获得网页内容的参数值' })
|
||||
async htmlByKey(@Query('key') key: string) {
|
||||
this.ctx.body = await this.baseSysParamService.htmlByKey(key);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
import { Provide } from '@midwayjs/core';
|
||||
import { CoolController, BaseController } from '@cool-midway/core';
|
||||
import { Context } from 'vm';
|
||||
import { BaseSysRoleEntity } from '../../../entity/sys/role';
|
||||
import { BaseSysRoleService } from '../../../service/sys/role';
|
||||
|
||||
/**
|
||||
* 系统角色
|
||||
*/
|
||||
@Provide()
|
||||
@CoolController({
|
||||
api: ['add', 'delete', 'update', 'info', 'list', 'page'],
|
||||
entity: BaseSysRoleEntity,
|
||||
service: BaseSysRoleService,
|
||||
// 新增的时候插入当前用户ID
|
||||
insertParam: async (ctx: Context) => {
|
||||
return {
|
||||
userId: ctx.admin.userId,
|
||||
};
|
||||
},
|
||||
pageQueryOp: {
|
||||
keyWordLikeFields: ['a.name', 'a.label'],
|
||||
where: async (ctx: Context) => {
|
||||
const { userId, roleIds, username } = ctx.admin;
|
||||
return [
|
||||
// 超级管理员的角色不展示
|
||||
['a.label != :label', { label: 'admin' }],
|
||||
// 如果不是超管,只能看到自己新建的或者自己有的角色
|
||||
[
|
||||
`(a.userId=:userId or a.id in (${roleIds.join(',')}))`,
|
||||
{ userId },
|
||||
username !== 'admin',
|
||||
],
|
||||
];
|
||||
},
|
||||
},
|
||||
})
|
||||
export class BaseSysRoleController extends BaseController {}
|
||||
@@ -0,0 +1,35 @@
|
||||
import { Body, Inject, Post, Provide } from '@midwayjs/core';
|
||||
import { CoolController, BaseController } from '@cool-midway/core';
|
||||
import { BaseSysUserEntity } from '../../../entity/sys/user';
|
||||
import { BaseSysUserService } from '../../../service/sys/user';
|
||||
|
||||
/**
|
||||
* 系统用户
|
||||
*/
|
||||
@Provide()
|
||||
@CoolController({
|
||||
api: ['add', 'delete', 'update', 'info', 'list', 'page'],
|
||||
entity: BaseSysUserEntity,
|
||||
service: BaseSysUserService,
|
||||
insertParam: ctx => {
|
||||
return {
|
||||
userId: ctx.admin.userId,
|
||||
};
|
||||
},
|
||||
})
|
||||
export class BaseSysUserController extends BaseController {
|
||||
@Inject()
|
||||
baseSysUserService: BaseSysUserService;
|
||||
|
||||
/**
|
||||
* 移动部门
|
||||
*/
|
||||
@Post('/move', { summary: '移动部门' })
|
||||
async move(
|
||||
@Body('departmentId') departmentId: number,
|
||||
@Body('userIds') userIds: []
|
||||
) {
|
||||
await this.baseSysUserService.move(departmentId, userIds);
|
||||
return this.ok();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
这里写对外的api接口
|
||||
@@ -0,0 +1,72 @@
|
||||
import { Provide, Inject, Get, Post, Query, Config } from '@midwayjs/core';
|
||||
import {
|
||||
CoolController,
|
||||
BaseController,
|
||||
CoolEps,
|
||||
TagTypes,
|
||||
CoolUrlTag,
|
||||
CoolTag,
|
||||
} from '@cool-midway/core';
|
||||
import { Context } from '@midwayjs/koa';
|
||||
import { BaseSysParamService } from '../../service/sys/param';
|
||||
import { PluginService } from '../../../plugin/service/info';
|
||||
|
||||
/**
|
||||
* 不需要登录的后台接口
|
||||
*/
|
||||
@CoolUrlTag()
|
||||
@Provide()
|
||||
@CoolController()
|
||||
export class BaseAppCommController extends BaseController {
|
||||
@Inject()
|
||||
pluginService: PluginService;
|
||||
|
||||
@Inject()
|
||||
ctx: Context;
|
||||
|
||||
@Config('module.base.allowKeys')
|
||||
allowKeys: string[];
|
||||
|
||||
@Inject()
|
||||
eps: CoolEps;
|
||||
|
||||
@Inject()
|
||||
baseSysParamService: BaseSysParamService;
|
||||
|
||||
@CoolTag(TagTypes.IGNORE_TOKEN)
|
||||
@Get('/param', { summary: '参数配置' })
|
||||
async param(@Query('key') key: string) {
|
||||
if (!this.allowKeys.includes(key)) {
|
||||
return this.fail('非法操作');
|
||||
}
|
||||
return this.ok(await this.baseSysParamService.dataByKey(key));
|
||||
}
|
||||
|
||||
/**
|
||||
* 实体信息与路径
|
||||
* @returns
|
||||
*/
|
||||
@CoolTag(TagTypes.IGNORE_TOKEN)
|
||||
@Get('/eps', { summary: '实体信息与路径' })
|
||||
public async getEps() {
|
||||
return this.ok(this.eps.app);
|
||||
}
|
||||
|
||||
/**
|
||||
* 文件上传
|
||||
*/
|
||||
@Post('/upload', { summary: '文件上传' })
|
||||
async upload() {
|
||||
const file = await this.pluginService.getInstance('upload');
|
||||
return this.ok(await file.upload(this.ctx));
|
||||
}
|
||||
|
||||
/**
|
||||
* 文件上传模式,本地或者云存储
|
||||
*/
|
||||
@Get('/uploadMode', { summary: '文件上传模式' })
|
||||
async uploadMode() {
|
||||
const file = await this.pluginService.getInstance('upload');
|
||||
return this.ok(await file.getMode());
|
||||
}
|
||||
}
|
||||
在新工单中引用
屏蔽一个用户