5.x
This commit is contained in:
commit
ee67ced629
|
@ -0,0 +1,11 @@
|
|||
# 🎨 editorconfig.org
|
||||
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
|
@ -0,0 +1,28 @@
|
|||
{
|
||||
"extends": "./node_modules/mwts/",
|
||||
"ignorePatterns": [
|
||||
"node_modules",
|
||||
"dist",
|
||||
"test",
|
||||
"jest.config.js",
|
||||
"typings",
|
||||
"public/**/**",
|
||||
"view/**/**"
|
||||
],
|
||||
"env": {
|
||||
"jest": true
|
||||
},
|
||||
"rules": {
|
||||
"@typescript-eslint/explicit-module-boundary-types": "off",
|
||||
"@typescript-eslint/no-unused-vars": "off",
|
||||
"@typescript-eslint/ban-ts-comment": "off",
|
||||
"node/no-extraneous-import": "off",
|
||||
"no-empty": "off",
|
||||
"node/no-extraneous-require": "off",
|
||||
"eqeqeq": "off",
|
||||
"node/no-unsupported-features/node-builtins": "off",
|
||||
"@typescript-eslint/ban-types": "off",
|
||||
"no-control-regex": "off",
|
||||
"prefer-const": "off"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
*.js text eol=lf
|
||||
*.json text eol=lf
|
||||
*.ts text eol=lf
|
||||
*.code-snippets text eol=lf
|
|
@ -0,0 +1,20 @@
|
|||
logs/
|
||||
npm-debug.log
|
||||
yarn-error.log
|
||||
node_modules/
|
||||
package-lock.json
|
||||
yarn.lock
|
||||
coverage/
|
||||
dist/
|
||||
.idea/
|
||||
run/
|
||||
.DS_Store
|
||||
*.sw*
|
||||
*.un~
|
||||
.tsbuildinfo
|
||||
.tsbuildinfo.*
|
||||
.audit
|
||||
typings/
|
||||
lock/
|
||||
public/uploads/
|
||||
cache/
|
|
@ -0,0 +1,3 @@
|
|||
module.exports = {
|
||||
...require('mwts/.prettierrc.json')
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
{
|
||||
"config": {
|
||||
"prefix": "config",
|
||||
"body": [
|
||||
"import { ModuleConfig } from '@cool-midway/core';",
|
||||
"",
|
||||
"/**",
|
||||
" * 模块配置",
|
||||
" */",
|
||||
"export default () => {",
|
||||
" return {",
|
||||
" // 模块名称",
|
||||
" name: 'xxx',",
|
||||
" // 模块描述",
|
||||
" description: 'xxx',",
|
||||
" // 中间件,只对本模块有效",
|
||||
" middlewares: [],",
|
||||
" // 中间件,全局有效",
|
||||
" globalMiddlewares: [],",
|
||||
" // 模块加载顺序,默认为0,值越大越优先加载",
|
||||
" order: 0,",
|
||||
" } as ModuleConfig;",
|
||||
"};",
|
||||
""
|
||||
],
|
||||
"description": "cool-admin config代码片段"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
"controller": {
|
||||
"prefix": "controller",
|
||||
"body": [
|
||||
"import { Provide } from '@midwayjs/decorator';",
|
||||
"import { CoolController, BaseController } from '@cool-midway/core';",
|
||||
"",
|
||||
"/**",
|
||||
" * 描述",
|
||||
" */",
|
||||
"@Provide()",
|
||||
"@CoolController({",
|
||||
" api: ['add', 'delete', 'update', 'info', 'list', 'page'],",
|
||||
" entity: 实体,",
|
||||
"})",
|
||||
"export class XxxController extends BaseController {}",
|
||||
""
|
||||
],
|
||||
"description": "cool-admin controller代码片段"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
"entity": {
|
||||
"prefix": "entity",
|
||||
"body": [
|
||||
"import { EntityModel } from '@midwayjs/orm';",
|
||||
"import { BaseEntity } from '@cool-midway/core';",
|
||||
"import { Column } from 'typeorm';",
|
||||
"",
|
||||
"/**",
|
||||
" * 描述",
|
||||
" */",
|
||||
"@EntityModel('xxx_xxx_xxx')",
|
||||
"export class XxxEntity extends BaseEntity {",
|
||||
" @Column({ comment: '描述' })",
|
||||
" xxx: string;",
|
||||
"}",
|
||||
""
|
||||
],
|
||||
"description": "cool-admin entity代码片段"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"event": {
|
||||
"prefix": "event",
|
||||
"body": [
|
||||
"import { Provide, Scope, ScopeEnum } from '@midwayjs/decorator';",
|
||||
"import { CoolEvent, Event } from '@cool-midway/core';",
|
||||
"",
|
||||
"/**",
|
||||
" * 接收事件",
|
||||
" */",
|
||||
"@Provide()",
|
||||
"@Scope(ScopeEnum.Singleton)",
|
||||
"@CoolEvent()",
|
||||
"export class xxxEvent {",
|
||||
" @Event('updateUser')",
|
||||
" async updateUser(msg, a) {",
|
||||
" console.log('ImEvent', 'updateUser', msg, a);",
|
||||
" }",
|
||||
"}",
|
||||
""
|
||||
],
|
||||
"description": "cool-admin event代码片段"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
// 使用 IntelliSense 了解相关属性。
|
||||
// 悬停以查看现有属性的描述。
|
||||
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"type": "pwa-node",
|
||||
"request": "launch",
|
||||
"name": "Launch Program",
|
||||
"skipFiles": [
|
||||
"<node_internals>/**"
|
||||
],
|
||||
"program": "${workspaceFolder}/bootstrap.js",
|
||||
"preLaunchTask": "tsc: build - tsconfig.json",
|
||||
"outFiles": [
|
||||
"${workspaceFolder}/dist/**/*.js"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
{
|
||||
"middleware": {
|
||||
"prefix": "middleware",
|
||||
"body": [
|
||||
"import { Middleware } from '@midwayjs/decorator';",
|
||||
"import { NextFunction, Context } from '@midwayjs/koa';",
|
||||
"import { IMiddleware } from '@midwayjs/core';",
|
||||
"",
|
||||
"/**",
|
||||
" * 描述",
|
||||
" */",
|
||||
"@Middleware()",
|
||||
"export class XxxMiddleware implements IMiddleware<Context, NextFunction> {",
|
||||
" resolve() {",
|
||||
" return async (ctx: Context, next: NextFunction) => {",
|
||||
" // 控制器前执行的逻辑",
|
||||
" const startTime = Date.now();",
|
||||
" // 执行下一个 Web 中间件,最后执行到控制器",
|
||||
" await next();",
|
||||
" // 控制器之后执行的逻辑",
|
||||
" console.log(Date.now() - startTime);",
|
||||
" };",
|
||||
" }",
|
||||
"}",
|
||||
""
|
||||
],
|
||||
"description": "cool-admin middleware代码片段"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
"queue": {
|
||||
"prefix": "queue",
|
||||
"body": [
|
||||
"import { BaseCoolQueue, CoolQueue } from '@cool-midway/task';",
|
||||
"",
|
||||
"/**",
|
||||
" * 队列",
|
||||
" */",
|
||||
"@CoolQueue()",
|
||||
"export abstract class xxxQueue extends BaseCoolQueue {",
|
||||
" async data(job: any, done: any) {",
|
||||
" console.log('收到的数据', job.data);",
|
||||
" done();",
|
||||
" }",
|
||||
"}",
|
||||
""
|
||||
],
|
||||
"description": "cool-admin service代码片段"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
{
|
||||
"service": {
|
||||
"prefix": "service",
|
||||
"body": [
|
||||
"import { Provide } from '@midwayjs/decorator';",
|
||||
"import { BaseService } from '@cool-midway/core';",
|
||||
"import { InjectEntityModel } from '@midwayjs/orm';",
|
||||
"import { Repository } from 'typeorm';",
|
||||
"",
|
||||
"/**",
|
||||
" * 描述",
|
||||
" */",
|
||||
"@Provide()",
|
||||
"export class XxxService extends BaseService {",
|
||||
" @InjectEntityModel(实体)",
|
||||
" xxxEntity: Repository<实体>;",
|
||||
"",
|
||||
" /**",
|
||||
" * 描述",
|
||||
" */",
|
||||
" async xxx() {}",
|
||||
"}",
|
||||
""
|
||||
],
|
||||
"description": "cool-admin service代码片段"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
{
|
||||
"service": {
|
||||
"prefix": "service",
|
||||
"body": [
|
||||
"import { Provide } from '@midwayjs/decorator';",
|
||||
"import { BaseService } from '@cool-midway/core';",
|
||||
"import { InjectEntityModel } from '@midwayjs/orm';",
|
||||
"import { Repository } from 'typeorm';",
|
||||
"",
|
||||
"/**",
|
||||
" * 描述",
|
||||
" */",
|
||||
"@Provide()",
|
||||
"export class XxxService extends BaseService {",
|
||||
" @InjectEntityModel(实体)",
|
||||
" xxxEntity: Repository<实体>;",
|
||||
"",
|
||||
" /**",
|
||||
" * 描述",
|
||||
" */",
|
||||
" async xxx() {}",
|
||||
"}",
|
||||
""
|
||||
],
|
||||
"description": "cool-admin service代码片段"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
# my_midway_project
|
||||
|
||||
## QuickStart
|
||||
|
||||
<!-- add docs here for user -->
|
||||
|
||||
see [midway docs][midway] for more detail.
|
||||
|
||||
### Development
|
||||
|
||||
```bash
|
||||
$ npm i
|
||||
$ npm run dev
|
||||
$ open http://localhost:7001/
|
||||
```
|
||||
|
||||
### Deploy
|
||||
|
||||
```bash
|
||||
$ npm start
|
||||
```
|
||||
|
||||
### npm scripts
|
||||
|
||||
- Use `npm run lint` to check code style.
|
||||
- Use `npm test` to run unit test.
|
||||
|
||||
|
||||
[midway]: https://midwayjs.org
|
|
@ -0,0 +1,29 @@
|
|||
# my_midway_project
|
||||
|
||||
## 快速入门
|
||||
|
||||
<!-- 在此次添加使用文档 -->
|
||||
|
||||
如需进一步了解,参见 [midway 文档][midway]。
|
||||
|
||||
### 本地开发
|
||||
|
||||
```bash
|
||||
$ npm i
|
||||
$ npm run dev
|
||||
$ open http://localhost:7001/
|
||||
```
|
||||
|
||||
### 部署
|
||||
|
||||
```bash
|
||||
$ npm start
|
||||
```
|
||||
|
||||
### 内置指令
|
||||
|
||||
- 使用 `npm run lint` 来做代码风格检查。
|
||||
- 使用 `npm test` 来执行单元测试。
|
||||
|
||||
|
||||
[midway]: https://midwayjs.org
|
|
@ -0,0 +1,2 @@
|
|||
const { Bootstrap } = require('@midwayjs/bootstrap');
|
||||
Bootstrap.run();
|
|
@ -0,0 +1 @@
|
|||
{"expireTime":1646900815600,"key":"d751713988987e9331980363e24189ce","val":"{\"a\":1,\"b\":2}"}
|
|
@ -0,0 +1,6 @@
|
|||
module.exports = {
|
||||
preset: 'ts-jest',
|
||||
testEnvironment: 'node',
|
||||
testPathIgnorePatterns: ['<rootDir>/test/fixtures'],
|
||||
coveragePathIgnorePatterns: ['<rootDir>/test/'],
|
||||
};
|
|
@ -0,0 +1,69 @@
|
|||
{
|
||||
"name": "cool-admin",
|
||||
"version": "5.0.0",
|
||||
"description": "",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@cool-midway/core": "^5.0.2",
|
||||
"@cool-midway/es": "^5.0.0",
|
||||
"@cool-midway/file": "^5.0.1",
|
||||
"@cool-midway/pay": "^5.0.0",
|
||||
"@cool-midway/rpc": "^5.0.0",
|
||||
"@cool-midway/task": "^5.0.1",
|
||||
"@midwayjs/bootstrap": "^3.1.1",
|
||||
"@midwayjs/cache": "^3.1.1",
|
||||
"@midwayjs/core": "^3.1.1",
|
||||
"@midwayjs/decorator": "^3.0.0",
|
||||
"@midwayjs/info": "^3.1.1",
|
||||
"@midwayjs/koa": "^3.1.1",
|
||||
"@midwayjs/logger": "^2.16.3",
|
||||
"@midwayjs/orm": "^3.1.1",
|
||||
"@midwayjs/static-file": "^3.1.1",
|
||||
"@midwayjs/validate": "^3.1.1",
|
||||
"@midwayjs/view-ejs": "^3.1.1",
|
||||
"cache-manager-fs-hash": "^1.0.0",
|
||||
"ipip-ipdb": "^0.6.0",
|
||||
"jsonwebtoken": "^8.5.1",
|
||||
"midway-custom-component": "D:\\src\\cool\\admin\\midway-core\\pay\\",
|
||||
"mini-svg-data-uri": "^1.4.4",
|
||||
"mysql2": "^2.3.3",
|
||||
"svg-captcha": "^1.4.0",
|
||||
"typeorm": "^0.2.45"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@midwayjs/cli": "^1.3.0",
|
||||
"@midwayjs/mock": "^3.1.1",
|
||||
"@types/jest": "^27.4.1",
|
||||
"@types/koa": "^2.13.4",
|
||||
"@types/node": "17",
|
||||
"cross-env": "^7.0.3",
|
||||
"jest": "^27.5.1",
|
||||
"mwts": "^1.3.0",
|
||||
"swagger-ui-dist": "^4.6.1",
|
||||
"ts-jest": "^27.1.3",
|
||||
"typescript": "^4.6.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12.0.0"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "NODE_ENV=prod node ./bootstrap.js",
|
||||
"dev": "cross-env && cross-env NODE_ENV=local TS_NODE_TYPE_CHECK=false TS_NODE_TRANSPILE_ONLY=true midway-bin dev --ts",
|
||||
"test": "midway-bin test --ts",
|
||||
"cov": "midway-bin cov --ts",
|
||||
"lint": "mwts check",
|
||||
"lint:fix": "mwts fix",
|
||||
"ci": "npm run cov",
|
||||
"build": "midway-bin build -c"
|
||||
},
|
||||
"midway-bin-clean": [
|
||||
".vscode/.tsbuildinfo",
|
||||
"dist"
|
||||
],
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": ""
|
||||
},
|
||||
"author": "anonymous",
|
||||
"license": "MIT"
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
body {
|
||||
display: flex;
|
||||
height: 100vh;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
background: #222;
|
||||
}
|
||||
|
||||
.reveal {
|
||||
position: relative;
|
||||
display: flex;
|
||||
color: #6ee1f5;
|
||||
font-size: 2em;
|
||||
font-family: Raleway, sans-serif;
|
||||
letter-spacing: 3px;
|
||||
text-transform: uppercase;
|
||||
white-space: pre;
|
||||
}
|
||||
.reveal span {
|
||||
opacity: 0;
|
||||
transform: scale(0);
|
||||
animation: fadeIn 2.4s forwards;
|
||||
}
|
||||
.reveal::before, .reveal::after {
|
||||
position: absolute;
|
||||
content: "";
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
width: 2px;
|
||||
height: 100%;
|
||||
background: white;
|
||||
opacity: 0;
|
||||
transform: scale(0);
|
||||
}
|
||||
.reveal::before {
|
||||
left: 50%;
|
||||
animation: slideLeft 1.5s cubic-bezier(0.7, -0.6, 0.3, 1.5) forwards;
|
||||
}
|
||||
.reveal::after {
|
||||
right: 50%;
|
||||
animation: slideRight 1.5s cubic-bezier(0.7, -0.6, 0.3, 1.5) forwards;
|
||||
}
|
||||
|
||||
@keyframes fadeIn {
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: scale(1);
|
||||
}
|
||||
}
|
||||
@keyframes slideLeft {
|
||||
to {
|
||||
left: -6%;
|
||||
opacity: 1;
|
||||
transform: scale(0.9);
|
||||
}
|
||||
}
|
||||
@keyframes slideRight {
|
||||
to {
|
||||
right: -6%;
|
||||
opacity: 1;
|
||||
transform: scale(0.9);
|
||||
}
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 4.2 KiB |
|
@ -0,0 +1,14 @@
|
|||
const duration = 0.8;
|
||||
const delay = 0.3;
|
||||
// eslint-disable-next-line no-undef
|
||||
const revealText = document.querySelector('.reveal');
|
||||
const letters = revealText.textContent.split('');
|
||||
revealText.textContent = '';
|
||||
const middle = letters.filter(e => e !== ' ').length / 2;
|
||||
letters.forEach((letter, i) => {
|
||||
// eslint-disable-next-line no-undef
|
||||
const span = document.createElement('span');
|
||||
span.textContent = letter;
|
||||
span.style.animationDelay = `${delay + Math.abs(i - middle) * 0.1}s`;
|
||||
revealText.append(span);
|
||||
});
|
|
@ -0,0 +1 @@
|
|||
文件上传目录
|
Binary file not shown.
|
@ -0,0 +1,69 @@
|
|||
import { Inject, Provide } from '@midwayjs/decorator';
|
||||
import { Context } from '@midwayjs/koa';
|
||||
import * as ipdb from 'ipip-ipdb';
|
||||
import * as _ from 'lodash';
|
||||
|
||||
/**
|
||||
* 帮助类
|
||||
*/
|
||||
@Provide()
|
||||
export class Utils {
|
||||
@Inject()
|
||||
baseDir;
|
||||
|
||||
/**
|
||||
* 获得请求IP
|
||||
*/
|
||||
async getReqIP(ctx: Context) {
|
||||
const req = ctx.req;
|
||||
return (
|
||||
req.headers['x-forwarded-for'] ||
|
||||
req.socket.remoteAddress.replace('::ffff:', '')
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据IP获得请求地址
|
||||
* @param ip 为空时则为当前请求的IP地址
|
||||
*/
|
||||
async getIpAddr(ctx: Context, ip?: string | string[]) {
|
||||
try {
|
||||
if (!ip) {
|
||||
ip = await this.getReqIP(ctx);
|
||||
}
|
||||
const bst = new ipdb.BaseStation(
|
||||
`${this.baseDir}/app/comm/ipipfree.ipdb`
|
||||
);
|
||||
const result = bst.findInfo(ip, 'CN');
|
||||
const addArr: any = [];
|
||||
if (result) {
|
||||
addArr.push(result.countryName);
|
||||
addArr.push(result.regionName);
|
||||
addArr.push(result.cityName);
|
||||
return _.uniq(addArr).join('');
|
||||
}
|
||||
} catch (err) {
|
||||
return '无法获取地址信息';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 去除对象的空值属性
|
||||
* @param obj
|
||||
*/
|
||||
async removeEmptyP(obj) {
|
||||
Object.keys(obj).forEach(key => {
|
||||
if (obj[key] === null || obj[key] === '' || obj[key] === 'undefined') {
|
||||
delete obj[key];
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 线程阻塞毫秒数
|
||||
* @param ms
|
||||
*/
|
||||
sleep(ms) {
|
||||
return new Promise(resolve => setTimeout(resolve, ms));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
import { CoolFileConfig, MODETYPE } from '@cool-midway/file';
|
||||
import { MidwayConfig } from '@midwayjs/core';
|
||||
import * as fsStore from 'cache-manager-fs-hash';
|
||||
|
||||
export default {
|
||||
// 修改成你自己独有的key
|
||||
keys: 'cool-admin for node',
|
||||
koa: {
|
||||
port: 8001,
|
||||
},
|
||||
// 模板渲染
|
||||
view: {
|
||||
mapping: {
|
||||
'.html': 'ejs',
|
||||
},
|
||||
},
|
||||
// 缓存 可切换成其他缓存如:redis http://midwayjs.org/docs/extensions/cache
|
||||
cache: {
|
||||
store: fsStore,
|
||||
options: {
|
||||
path: 'cache',
|
||||
ttl: -1,
|
||||
},
|
||||
},
|
||||
// cool配置
|
||||
cool: {
|
||||
file: {
|
||||
// 上传模式 本地上传或云存储
|
||||
mode: MODETYPE.LOCAL,
|
||||
// 本地上传 文件地址前缀
|
||||
domain: 'http://127.0.0.1:8001',
|
||||
} as CoolFileConfig,
|
||||
},
|
||||
} as unknown as MidwayConfig;
|
|
@ -0,0 +1,21 @@
|
|||
import { MidwayConfig } from '@midwayjs/core';
|
||||
|
||||
/**
|
||||
* 本地开发 npm run dev 读取的配置文件
|
||||
*/
|
||||
export default {
|
||||
orm: {
|
||||
type: 'mysql',
|
||||
host: '127.0.0.1',
|
||||
port: 3306,
|
||||
username: 'root',
|
||||
password: '123456',
|
||||
database: 'cool',
|
||||
// 自动建表 注意:线上部署的时候不要使用,有可能导致数据丢失
|
||||
synchronize: true,
|
||||
// 打印日志
|
||||
logging: true,
|
||||
// 字符集
|
||||
charset: 'utf8mb4',
|
||||
},
|
||||
} as MidwayConfig;
|
|
@ -0,0 +1,21 @@
|
|||
import { MidwayConfig } from '@midwayjs/core';
|
||||
|
||||
/**
|
||||
* 本地开发 npm run dev 读取的配置文件
|
||||
*/
|
||||
export default {
|
||||
orm: {
|
||||
type: 'mysql',
|
||||
host: '127.0.0.1',
|
||||
port: 3306,
|
||||
username: 'root',
|
||||
password: '123456',
|
||||
database: 'cool',
|
||||
// 自动建表 注意:线上部署的时候不要使用,有可能导致数据丢失
|
||||
synchronize: false,
|
||||
// 打印日志
|
||||
logging: true,
|
||||
// 字符集
|
||||
charset: 'utf8mb4',
|
||||
},
|
||||
} as MidwayConfig;
|
|
@ -0,0 +1,60 @@
|
|||
import { Configuration, App } from '@midwayjs/decorator';
|
||||
import * as koa from '@midwayjs/koa';
|
||||
import * as validate from '@midwayjs/validate';
|
||||
import * as info from '@midwayjs/info';
|
||||
import { join } from 'path';
|
||||
import * as staticFile from '@midwayjs/static-file';
|
||||
import * as view from '@midwayjs/view-ejs';
|
||||
import * as orm from '@midwayjs/orm';
|
||||
import * as cache from '@midwayjs/cache';
|
||||
import * as cool from '@cool-midway/core';
|
||||
import * as file from '@cool-midway/file';
|
||||
// import * as task from '@cool-midway/task';
|
||||
// import * as pay from '@cool-midway/pay';
|
||||
// import * as es from '@cool-midway/es';
|
||||
// import * as rpc from '@cool-midway/rpc';
|
||||
|
||||
@Configuration({
|
||||
imports: [
|
||||
// http://koajs.cn/
|
||||
koa,
|
||||
// 参数验证 http://midwayjs.org/docs/extensions/validate
|
||||
validate,
|
||||
// 模板渲染 http://midwayjs.org/docs/extensions/render
|
||||
view,
|
||||
// 静态文件托管 http://midwayjs.org/docs/extensions/static_file
|
||||
staticFile,
|
||||
// typeorm https://typeorm.io 打不开? https://typeorm.biunav.com/zh/
|
||||
orm,
|
||||
// 缓存 http://midwayjs.org/docs/extensions/cache
|
||||
cache,
|
||||
// cool-admin 官方组件 https://www.cool-js.com
|
||||
cool,
|
||||
// 文件上传 阿里云存储 腾讯云存储 七牛云存储
|
||||
file,
|
||||
// 任务与队列
|
||||
// task,
|
||||
// 支付 微信与支付宝
|
||||
// pay,
|
||||
// elasticsearch
|
||||
// es,
|
||||
// rpc 微服务 远程调用
|
||||
// rpc,
|
||||
{
|
||||
component: info,
|
||||
enabledEnvironment: ['local'],
|
||||
},
|
||||
],
|
||||
importConfigs: [join(__dirname, './config')],
|
||||
})
|
||||
export class ContainerLifeCycle {
|
||||
@App()
|
||||
app: koa.Application;
|
||||
|
||||
async onReady() {
|
||||
// add middleware
|
||||
// this.app.useMiddleware([ReportMiddleware]);
|
||||
// add filter
|
||||
// this.app.useFilter([NotFoundFilter, DefaultErrorFilter]);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
/**
|
||||
* @description User-Service parameters
|
||||
*/
|
||||
export interface IUserOptions {
|
||||
uid: number;
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
import { BaseLogMiddleware } from './middleware/log';
|
||||
import { BaseAuthorityMiddleware } from './middleware/authority';
|
||||
import { ModuleConfig } from '@cool-midway/core';
|
||||
|
||||
/**
|
||||
* 模块的配置
|
||||
*/
|
||||
export default () => {
|
||||
return {
|
||||
// 模块名称
|
||||
name: '权限管理',
|
||||
// 模块描述
|
||||
description: '基础的权限管理功能,包括登录,权限校验',
|
||||
// 中间件
|
||||
globalMiddlewares: [BaseAuthorityMiddleware, BaseLogMiddleware],
|
||||
// jwt 生成解密token的
|
||||
jwt: {
|
||||
// 单点登录
|
||||
sso: false,
|
||||
// 注意: 最好重新修改,防止破解
|
||||
secret: 'FOAPOFALOEQIPNNLQ',
|
||||
// token
|
||||
token: {
|
||||
// 2小时过期,需要用刷新token
|
||||
expire: 2 * 3600,
|
||||
// 15天内,如果没操作过就需要重新登录
|
||||
refreshExpire: 24 * 3600 * 15,
|
||||
},
|
||||
},
|
||||
} as ModuleConfig;
|
||||
};
|
|
@ -0,0 +1,94 @@
|
|||
import { Provide, Inject, Get, Post, Body, ALL } from '@midwayjs/decorator';
|
||||
import { CoolController, BaseController, CoolEps } from '@cool-midway/core';
|
||||
import { BaseSysUserEntity } from '../../entity/sys/user';
|
||||
import { BaseSysLoginService } from '../../service/sys/login';
|
||||
import { BaseSysPermsService } from '../../service/sys/perms';
|
||||
import { BaseSysUserService } from '../../service/sys/user';
|
||||
import { Context } from '@midwayjs/koa';
|
||||
import { CoolFile } from '@cool-midway/file';
|
||||
|
||||
/**
|
||||
* Base 通用接口 一般写不需要权限过滤的接口
|
||||
*/
|
||||
@Provide()
|
||||
@CoolController()
|
||||
export class BaseCommController extends BaseController {
|
||||
@Inject()
|
||||
baseSysUserService: BaseSysUserService;
|
||||
|
||||
@Inject()
|
||||
baseSysPermsService: BaseSysPermsService;
|
||||
|
||||
@Inject()
|
||||
baseSysLoginService: BaseSysLoginService;
|
||||
|
||||
@Inject()
|
||||
ctx: Context;
|
||||
|
||||
@Inject()
|
||||
coolFile: CoolFile;
|
||||
|
||||
@Inject()
|
||||
eps: CoolEps;
|
||||
|
||||
/**
|
||||
* 实体信息与路径
|
||||
* @returns
|
||||
*/
|
||||
@Get('/eps', { summary: '实体信息与路径' })
|
||||
public async getEps() {
|
||||
return this.ok(this.eps.admin);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获得个人信息
|
||||
*/
|
||||
@Get('/person', { summary: '个人信息' })
|
||||
async person() {
|
||||
return this.ok(await this.baseSysUserService.person());
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改个人信息
|
||||
*/
|
||||
@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() {
|
||||
return this.ok(await this.coolFile.upload(this.ctx));
|
||||
}
|
||||
|
||||
/**
|
||||
* 文件上传模式,本地或者云存储
|
||||
*/
|
||||
@Get('/uploadMode', { summary: '文件上传模式' })
|
||||
async uploadMode() {
|
||||
return this.ok(await this.coolFile.getMode());
|
||||
}
|
||||
|
||||
/**
|
||||
* 退出
|
||||
*/
|
||||
@Post('/logout', { summary: '退出' })
|
||||
async logout() {
|
||||
await this.baseSysLoginService.logout();
|
||||
return this.ok();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,79 @@
|
|||
import {
|
||||
Provide,
|
||||
Body,
|
||||
ALL,
|
||||
Inject,
|
||||
Post,
|
||||
Get,
|
||||
Query,
|
||||
} from '@midwayjs/decorator';
|
||||
import { CoolController, BaseController, CoolEps } 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';
|
||||
|
||||
/**
|
||||
* 不需要登录的后台接口
|
||||
*/
|
||||
@Provide()
|
||||
@CoolController()
|
||||
export class BaseOpenController extends BaseController {
|
||||
@Inject()
|
||||
baseSysLoginService: BaseSysLoginService;
|
||||
|
||||
@Inject()
|
||||
baseSysParamService: BaseSysParamService;
|
||||
|
||||
@Inject()
|
||||
ctx: Context;
|
||||
|
||||
@Inject()
|
||||
eps: CoolEps;
|
||||
|
||||
/**
|
||||
* 实体信息与路径
|
||||
* @returns
|
||||
*/
|
||||
@Get('/eps', { summary: '实体信息与路径' })
|
||||
public async getEps() {
|
||||
return this.ok(this.eps.app);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据配置参数key获得网页内容(富文本)
|
||||
*/
|
||||
@Get('/html', { summary: '获得网页内容的参数值' })
|
||||
async htmlByKey(@Query('key') key: string) {
|
||||
this.ctx.body = await this.baseSysParamService.htmlByKey(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* 登录
|
||||
* @param login
|
||||
*/
|
||||
@Post('/login', { summary: '登录' })
|
||||
async login(@Body(ALL) login: LoginDTO) {
|
||||
return this.ok(await this.baseSysLoginService.login(login));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获得验证码
|
||||
*/
|
||||
@Get('/captcha', { summary: '验证码' })
|
||||
async captcha(
|
||||
@Query('type') type: string,
|
||||
@Query('width') width: number,
|
||||
@Query('height') height: number
|
||||
) {
|
||||
return this.ok(await this.baseSysLoginService.captcha(type, width, height));
|
||||
}
|
||||
|
||||
/**
|
||||
* 刷新token
|
||||
*/
|
||||
@Get('/refreshToken', { summary: '刷新token' })
|
||||
async refreshToken(@Query() refreshToken: string) {
|
||||
return this.ok(await this.baseSysLoginService.refreshToken(refreshToken));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
import { ALL, Body, Inject, Post, Provide } from '@midwayjs/decorator';
|
||||
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,
|
||||
})
|
||||
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/decorator';
|
||||
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.params', 'a.ipAddr'],
|
||||
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,18 @@
|
|||
import { Inject, Provide } from '@midwayjs/decorator';
|
||||
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;
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
import { Get, Inject, Provide, Query } from '@midwayjs/decorator';
|
||||
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,
|
||||
pageQueryOp: {
|
||||
keyWordLikeFields: ['name', 'keyName'],
|
||||
},
|
||||
})
|
||||
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/decorator';
|
||||
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: ['name', 'label'],
|
||||
where: async (ctx: Context) => {
|
||||
const { userId, roleIds, role } = ctx.admin;
|
||||
return [
|
||||
// 超级管理员的角色不展示
|
||||
['label != :label', { label: 'admin' }],
|
||||
// 如果不是超管,只能看到自己新建的或者自己有的角色
|
||||
[
|
||||
'(userId=:userId or id in (:roleIds))',
|
||||
{ userId, roleIds },
|
||||
role !== 'admin',
|
||||
],
|
||||
];
|
||||
},
|
||||
},
|
||||
})
|
||||
export class BaseSysRoleController extends BaseController {}
|
|
@ -0,0 +1,30 @@
|
|||
import { Body, Inject, Post, Provide } from '@midwayjs/decorator';
|
||||
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,
|
||||
})
|
||||
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,45 @@
|
|||
import { Provide, Inject, Get, Post } from '@midwayjs/decorator';
|
||||
import { CoolController, BaseController, CoolEps } from '@cool-midway/core';
|
||||
import { Context } from '@midwayjs/koa';
|
||||
import { CoolFile } from '@cool-midway/file';
|
||||
|
||||
/**
|
||||
* 不需要登录的后台接口
|
||||
*/
|
||||
@Provide()
|
||||
@CoolController()
|
||||
export class BaseAppCommController extends BaseController {
|
||||
@Inject()
|
||||
coolFile: CoolFile;
|
||||
|
||||
@Inject()
|
||||
ctx: Context;
|
||||
|
||||
@Inject()
|
||||
eps: CoolEps;
|
||||
|
||||
/**
|
||||
* 实体信息与路径
|
||||
* @returns
|
||||
*/
|
||||
@Get('/eps', { summary: '实体信息与路径' })
|
||||
public async getEps() {
|
||||
return this.ok(this.eps.app);
|
||||
}
|
||||
|
||||
/**
|
||||
* 文件上传
|
||||
*/
|
||||
@Post('/upload', { summary: '文件上传' })
|
||||
async upload() {
|
||||
return this.ok(await this.coolFile.upload(this.ctx));
|
||||
}
|
||||
|
||||
/**
|
||||
* 文件上传模式,本地或者云存储
|
||||
*/
|
||||
@Get('/uploadMode', { summary: '文件上传模式' })
|
||||
async uploadMode() {
|
||||
return this.ok(await this.coolFile.getMode());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
import { Rule, RuleType } from '@midwayjs/validate';
|
||||
/**
|
||||
* 登录参数校验
|
||||
*/
|
||||
export class LoginDTO {
|
||||
// 用户名
|
||||
@Rule(RuleType.string().required())
|
||||
username: string;
|
||||
|
||||
// 密码
|
||||
@Rule(RuleType.string().required())
|
||||
password: string;
|
||||
|
||||
// 验证码ID
|
||||
@Rule(RuleType.string().required())
|
||||
captchaId: string;
|
||||
|
||||
// 验证码
|
||||
@Rule(RuleType.string().required())
|
||||
verifyCode: number;
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
import { Column, Index } from 'typeorm';
|
||||
import { EntityModel } from '@midwayjs/orm';
|
||||
import { BaseEntity } from '@cool-midway/core';
|
||||
|
||||
/**
|
||||
* 系统配置
|
||||
*/
|
||||
@EntityModel('base_sys_conf')
|
||||
export class BaseSysConfEntity extends BaseEntity {
|
||||
@Index({ unique: true })
|
||||
@Column({ comment: '配置键' })
|
||||
cKey: string;
|
||||
|
||||
@Column({ comment: '配置值' })
|
||||
cValue: string;
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
import { EntityModel } from '@midwayjs/orm';
|
||||
import { BaseEntity } from '@cool-midway/core';
|
||||
import { Column } from 'typeorm';
|
||||
|
||||
/**
|
||||
* 部门
|
||||
*/
|
||||
@EntityModel('base_sys_department')
|
||||
export class BaseSysDepartmentEntity extends BaseEntity {
|
||||
@Column({ comment: '部门名称' })
|
||||
name: string;
|
||||
|
||||
@Column({ comment: '上级部门ID', type: 'bigint', nullable: true })
|
||||
parentId: number;
|
||||
|
||||
@Column({ comment: '排序', default: 0 })
|
||||
orderNum: number;
|
||||
// 父菜单名称
|
||||
parentName: string;
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
import { EntityModel } from '@midwayjs/orm';
|
||||
import { BaseEntity } from '@cool-midway/core';
|
||||
import { Column, Index } from 'typeorm';
|
||||
|
||||
/**
|
||||
* 系统日志
|
||||
*/
|
||||
@EntityModel('base_sys_log')
|
||||
export class BaseSysLogEntity extends BaseEntity {
|
||||
@Index()
|
||||
@Column({ comment: '用户ID', nullable: true, type: 'bigint' })
|
||||
userId: number;
|
||||
|
||||
@Index()
|
||||
@Column({ comment: '行为', length: 100 })
|
||||
action: string;
|
||||
|
||||
@Index()
|
||||
@Column({ comment: 'ip', nullable: true, length: 50 })
|
||||
ip: string;
|
||||
|
||||
@Index()
|
||||
@Column({ comment: 'ip地址', nullable: true, length: 50 })
|
||||
ipAddr: string;
|
||||
|
||||
@Column({ comment: '参数', nullable: true, type: 'text' })
|
||||
params: string;
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
import { EntityModel } from '@midwayjs/orm';
|
||||
import { BaseEntity } from '@cool-midway/core';
|
||||
import { Column } from 'typeorm';
|
||||
|
||||
/**
|
||||
* 菜单
|
||||
*/
|
||||
@EntityModel('base_sys_menu')
|
||||
export class BaseSysMenuEntity extends BaseEntity {
|
||||
@Column({ comment: '父菜单ID', type: 'bigint', nullable: true })
|
||||
parentId: number;
|
||||
|
||||
@Column({ comment: '菜单名称' })
|
||||
name: string;
|
||||
|
||||
@Column({ comment: '菜单地址', nullable: true })
|
||||
router: string;
|
||||
|
||||
@Column({ comment: '权限标识', nullable: true })
|
||||
perms: string;
|
||||
|
||||
@Column({
|
||||
comment: '类型 0:目录 1:菜单 2:按钮',
|
||||
default: 0,
|
||||
type: 'tinyint',
|
||||
})
|
||||
type: number;
|
||||
|
||||
@Column({ comment: '图标', nullable: true })
|
||||
icon: string;
|
||||
|
||||
@Column({ comment: '排序', default: 0 })
|
||||
orderNum: number;
|
||||
|
||||
@Column({ comment: '视图地址', nullable: true })
|
||||
viewPath: string;
|
||||
|
||||
@Column({ comment: '路由缓存', default: true })
|
||||
keepAlive: boolean;
|
||||
|
||||
// 父菜单名称
|
||||
parentName: string;
|
||||
|
||||
@Column({ comment: '是否显示', default: true })
|
||||
isShow: boolean;
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
import { EntityModel } from '@midwayjs/orm';
|
||||
import { BaseEntity } from '@cool-midway/core';
|
||||
import { Column, Index } from 'typeorm';
|
||||
|
||||
/**
|
||||
* 参数配置
|
||||
*/
|
||||
@EntityModel('base_sys_param')
|
||||
export class BaseSysParamEntity extends BaseEntity {
|
||||
@Index()
|
||||
@Column({ comment: '键位' })
|
||||
keyName: string;
|
||||
|
||||
@Column({ comment: '名称' })
|
||||
name: string;
|
||||
|
||||
@Column({ comment: '数据', type: 'text' })
|
||||
data: string;
|
||||
|
||||
@Column({
|
||||
comment: '数据类型 0:字符串 1:数组 2:键值对',
|
||||
default: 0,
|
||||
type: 'tinyint',
|
||||
})
|
||||
dataType: number;
|
||||
|
||||
@Column({ comment: '备注', nullable: true })
|
||||
remark: string;
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
import { EntityModel } from '@midwayjs/orm';
|
||||
import { BaseEntity } from '@cool-midway/core';
|
||||
import { Column, Index } from 'typeorm';
|
||||
|
||||
/**
|
||||
* 角色
|
||||
*/
|
||||
@EntityModel('base_sys_role')
|
||||
export class BaseSysRoleEntity extends BaseEntity {
|
||||
@Column({ comment: '用户ID' })
|
||||
userId: string;
|
||||
|
||||
@Index({ unique: true })
|
||||
@Column({ comment: '名称' })
|
||||
name: string;
|
||||
|
||||
@Index({ unique: true })
|
||||
@Column({ comment: '角色标签', nullable: true, length: 50 })
|
||||
label: string;
|
||||
|
||||
@Column({ comment: '备注', nullable: true })
|
||||
remark: string;
|
||||
|
||||
@Column({ comment: '数据权限是否关联上下级', default: 1 })
|
||||
relevance: number;
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
import { EntityModel } from '@midwayjs/orm';
|
||||
import { BaseEntity } from '@cool-midway/core';
|
||||
import { Column } from 'typeorm';
|
||||
|
||||
/**
|
||||
* 角色部门
|
||||
*/
|
||||
@EntityModel('base_sys_role_department')
|
||||
export class BaseSysRoleDepartmentEntity extends BaseEntity {
|
||||
@Column({ comment: '角色ID', type: 'bigint' })
|
||||
roleId: number;
|
||||
|
||||
@Column({ comment: '部门ID', type: 'bigint' })
|
||||
departmentId: number;
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
import { EntityModel } from '@midwayjs/orm';
|
||||
import { BaseEntity } from '@cool-midway/core';
|
||||
import { Column } from 'typeorm';
|
||||
|
||||
/**
|
||||
* 角色菜单
|
||||
*/
|
||||
@EntityModel('base_sys_role_menu')
|
||||
export class BaseSysRoleMenuEntity extends BaseEntity {
|
||||
@Column({ comment: '角色ID', type: 'bigint' })
|
||||
roleId: number;
|
||||
|
||||
@Column({ comment: '菜单ID', type: 'bigint' })
|
||||
menuId: number;
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
import { EntityModel } from '@midwayjs/orm';
|
||||
import { BaseEntity } from '@cool-midway/core';
|
||||
import { Column, Index } from 'typeorm';
|
||||
|
||||
/**
|
||||
* 系统用户
|
||||
*/
|
||||
@EntityModel('base_sys_user')
|
||||
export class BaseSysUserEntity extends BaseEntity {
|
||||
@Index()
|
||||
@Column({ comment: '部门ID', type: 'bigint', nullable: true })
|
||||
departmentId: number;
|
||||
|
||||
@Column({ comment: '姓名', nullable: true })
|
||||
name: string;
|
||||
|
||||
@Index({ unique: true })
|
||||
@Column({ comment: '用户名', length: 100 })
|
||||
username: string;
|
||||
|
||||
@Column({ comment: '密码' })
|
||||
password: string;
|
||||
|
||||
@Column({
|
||||
comment: '密码版本, 作用是改完密码,让原来的token失效',
|
||||
default: 1,
|
||||
})
|
||||
passwordV: number;
|
||||
|
||||
@Column({ comment: '昵称', nullable: true })
|
||||
nickName: string;
|
||||
|
||||
@Column({ comment: '头像', nullable: true })
|
||||
headImg: string;
|
||||
|
||||
@Index()
|
||||
@Column({ comment: '手机', nullable: true, length: 20 })
|
||||
phone: string;
|
||||
|
||||
@Column({ comment: '邮箱', nullable: true })
|
||||
email: string;
|
||||
|
||||
@Column({ comment: '备注', nullable: true })
|
||||
remark: string;
|
||||
|
||||
@Column({ comment: '状态 0:禁用 1:启用', default: 1, type: 'tinyint' })
|
||||
status: number;
|
||||
// 部门名称
|
||||
departmentName: string;
|
||||
// 角色ID列表
|
||||
roleIdList: number[];
|
||||
|
||||
@Column({ comment: 'socketId', nullable: true })
|
||||
socketId: string;
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
import { EntityModel } from '@midwayjs/orm';
|
||||
import { BaseEntity } from '@cool-midway/core';
|
||||
import { Column } from 'typeorm';
|
||||
|
||||
/**
|
||||
* 用户角色
|
||||
*/
|
||||
@EntityModel('base_sys_user_role')
|
||||
export class BaseSysUserRoleEntity extends BaseEntity {
|
||||
@Column({ comment: '用户ID', type: 'bigint' })
|
||||
userId: number;
|
||||
|
||||
@Column({ comment: '角色ID', type: 'bigint' })
|
||||
roleId: number;
|
||||
}
|
|
@ -0,0 +1,717 @@
|
|||
/*
|
||||
Navicat Premium Data Transfer
|
||||
|
||||
Source Server : cool-admin-next
|
||||
Source Server Type : MySQL
|
||||
Source Server Version : 50727
|
||||
Source Host : 139.196.196.203:3306
|
||||
Source Schema : cooladmin
|
||||
|
||||
Target Server Type : MySQL
|
||||
Target Server Version : 50727
|
||||
File Encoding : 65001
|
||||
|
||||
Date: 10/03/2021 14:04:34
|
||||
*/
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for base_app_space_info
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `base_app_space_info`;
|
||||
CREATE TABLE `base_app_space_info` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
|
||||
`createTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',
|
||||
`updateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',
|
||||
`url` varchar(255) NOT NULL COMMENT '地址',
|
||||
`type` varchar(255) NOT NULL COMMENT '类型',
|
||||
`classifyId` bigint(20) DEFAULT NULL COMMENT '分类ID',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `IDX_4aed04cbfa2ecdc01485b86e51` (`createTime`),
|
||||
KEY `IDX_abd5de4a4895eb253a5cabb20f` (`updateTime`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for base_app_space_type
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `base_app_space_type`;
|
||||
CREATE TABLE `base_app_space_type` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
|
||||
`createTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',
|
||||
`updateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',
|
||||
`name` varchar(255) NOT NULL COMMENT '类别名称',
|
||||
`parentId` tinyint(4) DEFAULT NULL COMMENT '父分类ID',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `IDX_5e8376603f89fdf3e7bb05103a` (`createTime`),
|
||||
KEY `IDX_500ea9e8b2c5c08c9b86a0667e` (`updateTime`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of base_app_space_type
|
||||
-- ----------------------------
|
||||
BEGIN;
|
||||
INSERT INTO `base_app_space_type` VALUES (1, '2021-02-26 14:07:48.867045', '2021-02-26 14:07:48.867045', 'a', NULL);
|
||||
INSERT INTO `base_app_space_type` VALUES (2, '2021-02-26 14:07:52.285531', '2021-02-26 14:07:52.285531', 'b', NULL);
|
||||
COMMIT;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for base_sys_conf
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `base_sys_conf`;
|
||||
CREATE TABLE `base_sys_conf` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
|
||||
`createTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',
|
||||
`updateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',
|
||||
`cKey` varchar(255) NOT NULL COMMENT '配置键',
|
||||
`cValue` varchar(255) NOT NULL COMMENT '配置值',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `IDX_9be195d27767b4485417869c3a` (`cKey`),
|
||||
KEY `IDX_905208f206a3ff9fd513421971` (`createTime`),
|
||||
KEY `IDX_4c6f27f6ecefe51a5a196a047a` (`updateTime`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of base_sys_conf
|
||||
-- ----------------------------
|
||||
BEGIN;
|
||||
INSERT INTO `base_sys_conf` VALUES (1, '2021-02-25 14:23:26.810981', '2021-02-25 14:23:26.810981', 'logKeep', '31');
|
||||
COMMIT;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for base_sys_department
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `base_sys_department`;
|
||||
CREATE TABLE `base_sys_department` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
|
||||
`createTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',
|
||||
`updateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',
|
||||
`name` varchar(255) NOT NULL COMMENT '部门名称',
|
||||
`parentId` bigint(20) DEFAULT NULL COMMENT '上级部门ID',
|
||||
`orderNum` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `IDX_be4c53cd671384fa588ca9470a` (`createTime`),
|
||||
KEY `IDX_ca1473a793961ec55bc0c8d268` (`updateTime`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of base_sys_department
|
||||
-- ----------------------------
|
||||
BEGIN;
|
||||
INSERT INTO `base_sys_department` VALUES (1, '2021-02-24 21:17:11.971397', '2021-02-24 21:17:15.697917', 'COOL', NULL, 0);
|
||||
INSERT INTO `base_sys_department` VALUES (11, '2021-02-26 14:17:06.690613', '2021-02-26 14:17:06.690613', '开发', 1, 0);
|
||||
INSERT INTO `base_sys_department` VALUES (12, '2021-02-26 14:17:11.576369', '2021-02-26 14:17:11.576369', '测试', 1, 0);
|
||||
INSERT INTO `base_sys_department` VALUES (13, '2021-02-26 14:28:59.685177', '2021-02-26 14:28:59.685177', '游客', 1, 0);
|
||||
COMMIT;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for base_sys_log
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `base_sys_log`;
|
||||
CREATE TABLE `base_sys_log` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
|
||||
`createTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',
|
||||
`updateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',
|
||||
`userId` bigint(20) DEFAULT NULL COMMENT '用户ID',
|
||||
`action` varchar(100) NOT NULL COMMENT '行为',
|
||||
`ip` varchar(50) DEFAULT NULL COMMENT 'ip',
|
||||
`ipAddr` varchar(50) DEFAULT NULL COMMENT 'ip地址',
|
||||
`params` text COMMENT '参数',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `IDX_51a2caeb5713efdfcb343a8772` (`userId`),
|
||||
KEY `IDX_938f886fb40e163db174b7f6c3` (`action`),
|
||||
KEY `IDX_24e18767659f8c7142580893f2` (`ip`),
|
||||
KEY `IDX_a03a27f75cf8d502b3060823e1` (`ipAddr`),
|
||||
KEY `IDX_c9382b76219a1011f7b8e7bcd1` (`createTime`),
|
||||
KEY `IDX_bfd44e885b470da43bcc39aaa7` (`updateTime`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=4844 DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for base_sys_menu
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `base_sys_menu`;
|
||||
CREATE TABLE `base_sys_menu` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
|
||||
`createTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',
|
||||
`updateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',
|
||||
`parentId` bigint(20) DEFAULT NULL COMMENT '父菜单ID',
|
||||
`name` varchar(255) NOT NULL COMMENT '菜单名称',
|
||||
`router` varchar(255) DEFAULT NULL COMMENT '菜单地址',
|
||||
`perms` varchar(255) DEFAULT NULL COMMENT '权限标识',
|
||||
`type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '类型 0:目录 1:菜单 2:按钮',
|
||||
`icon` varchar(255) DEFAULT NULL COMMENT '图标',
|
||||
`orderNum` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
|
||||
`viewPath` varchar(255) DEFAULT NULL COMMENT '视图地址',
|
||||
`keepAlive` tinyint(4) NOT NULL DEFAULT '1' COMMENT '路由缓存',
|
||||
`isShow` tinyint(4) NOT NULL DEFAULT '1' COMMENT '父菜单名称',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `IDX_05e3d6a56604771a6da47ebf8e` (`createTime`),
|
||||
KEY `IDX_d5203f18daaf7c3fe0ab34497f` (`updateTime`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=120 DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of base_sys_menu
|
||||
-- ----------------------------
|
||||
BEGIN;
|
||||
INSERT INTO `base_sys_menu` VALUES (1, '2019-09-11 11:14:44.000000', '2019-11-18 15:56:36.000000', NULL, '工作台', '/', NULL, 0, 'icon-workbench', 1, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (2, '2019-09-11 11:14:47.000000', '2021-02-27 17:16:05.000000', NULL, '系统管理', '/sys', NULL, 0, 'icon-system', 2, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (8, '1900-01-20 23:19:57.000000', '2021-03-08 22:59:12.000000', 27, '菜单列表', '/sys/menu', NULL, 1, 'icon-menu', 2, 'cool/modules/base/views/menu.vue', 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (10, '1900-01-20 00:19:27.325000', '1900-01-20 00:19:27.325000', 8, '新增', NULL, 'base:sys:menu:add', 2, NULL, 1, NULL, 0, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (11, '1900-01-20 00:19:51.101000', '1900-01-20 00:19:51.101000', 8, '删除', NULL, 'base:sys:menu:delete', 2, NULL, 2, NULL, 0, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (12, '1900-01-20 00:20:05.150000', '1900-01-20 00:20:05.150000', 8, '修改', NULL, 'base:sys:menu:update', 2, NULL, 3, NULL, 0, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (13, '1900-01-20 00:20:19.341000', '1900-01-20 00:20:19.341000', 8, '查询', NULL, 'base:sys:menu:page,base:sys:menu:list,base:sys:menu:info', 2, NULL, 4, NULL, 0, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (22, '2019-09-12 00:34:01.000000', '2021-03-08 22:59:23.000000', 27, '角色列表', '/sys/role', NULL, 1, 'icon-common', 3, 'cool/modules/base/views/role.vue', 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (23, '1900-01-20 00:34:23.459000', '1900-01-20 00:34:23.459000', 22, '新增', NULL, 'base:sys:role:add', 2, NULL, 1, NULL, 0, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (24, '1900-01-20 00:34:40.523000', '1900-01-20 00:34:40.523000', 22, '删除', NULL, 'base:sys:role:delete', 2, NULL, 2, NULL, 0, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (25, '1900-01-20 00:34:53.306000', '1900-01-20 00:34:53.306000', 22, '修改', NULL, 'base:sys:role:update', 2, NULL, 3, NULL, 0, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (26, '1900-01-20 00:35:05.024000', '1900-01-20 00:35:05.024000', 22, '查询', NULL, 'base:sys:role:page,base:sys:role:list,base:sys:role:info', 2, NULL, 4, NULL, 0, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (27, '2019-09-12 15:52:44.000000', '2019-09-15 22:11:56.000000', 2, '权限管理', NULL, NULL, 0, 'icon-auth', 1, NULL, 0, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (29, '2019-09-12 17:35:51.000000', '2021-03-08 23:01:39.000000', 105, '请求日志', '/sys/log', NULL, 1, 'icon-log', 1, 'cool/modules/base/views/log.vue', 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (30, '2019-09-12 17:37:03.000000', '2021-03-03 10:16:26.000000', 29, '权限', NULL, 'base:sys:log:page,base:sys:log:clear,base:sys:log:getKeep,base:sys:log:setKeep', 2, NULL, 1, NULL, 0, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (43, '2019-11-07 14:22:34.000000', '2021-03-08 23:02:51.000000', 45, 'crud 示例', '/crud', NULL, 1, 'icon-favor', 1, 'cool/modules/demo/views/crud.vue', 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (45, '2019-11-07 22:36:57.000000', '2019-11-11 15:21:10.000000', 1, '组件库', '/ui-lib', NULL, 0, 'icon-common', 2, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (47, '2019-11-08 09:35:08.000000', '2021-02-27 17:16:35.000000', NULL, '框架教程', '/tutorial', NULL, 0, 'icon-task', 4, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (48, '2019-11-08 09:35:53.000000', '2021-03-03 11:03:21.000000', 47, '文档', '/tutorial/doc', NULL, 1, 'icon-log', 0, 'https://admin.cool-js.com', 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (49, '2019-11-09 22:11:13.000000', '2021-03-09 09:50:46.000000', 45, 'quill 富文本编辑器', '/editor-quill', NULL, 1, 'icon-favor', 2, 'cool/modules/demo/views/editor-quill.vue', 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (59, '2019-11-18 16:50:27.000000', '2019-11-18 16:50:27.000000', 97, '部门列表', NULL, 'base:sys:department:list', 2, NULL, 0, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (60, '2019-11-18 16:50:45.000000', '2019-11-18 16:50:45.000000', 97, '新增部门', NULL, 'base:sys:department:add', 2, NULL, 0, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (61, '2019-11-18 16:50:59.000000', '2019-11-18 16:50:59.000000', 97, '更新部门', NULL, 'base:sys:department:update', 2, NULL, 0, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (62, '2019-11-18 16:51:13.000000', '2019-11-18 16:51:13.000000', 97, '删除部门', NULL, 'base:sys:department:delete', 2, NULL, 0, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (63, '2019-11-18 17:49:35.000000', '2019-11-18 17:49:35.000000', 97, '部门排序', NULL, 'base:sys:department:order', 2, NULL, 0, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (65, '2019-11-18 23:59:21.000000', '2019-11-18 23:59:21.000000', 97, '用户转移', NULL, 'base:sys:user:move', 2, NULL, 0, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (78, '2019-12-10 13:27:56.000000', '2021-02-27 17:08:53.000000', 2, '参数配置', NULL, NULL, 0, 'icon-common', 4, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (79, '1900-01-20 13:29:33.000000', '2021-03-08 23:01:48.000000', 78, '参数列表', '/sys/param', NULL, 1, 'icon-menu', 0, 'cool/modules/base/views/param.vue', 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (80, '1900-01-20 13:29:50.146000', '1900-01-20 13:29:50.146000', 79, '新增', NULL, 'base:sys:param:add', 2, NULL, 0, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (81, '1900-01-20 13:30:10.030000', '1900-01-20 13:30:10.030000', 79, '修改', NULL, 'base:sys:param:info,base:sys:param:update', 2, NULL, 0, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (82, '1900-01-20 13:30:25.791000', '1900-01-20 13:30:25.791000', 79, '删除', NULL, 'base:sys:param:delete', 2, NULL, 0, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (83, '1900-01-20 13:30:40.469000', '1900-01-20 13:30:40.469000', 79, '查看', NULL, 'base:sys:param:page,base:sys:param:list,base:sys:param:info', 2, NULL, 0, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (84, '2020-07-25 16:21:30.000000', '2020-07-25 16:21:30.000000', NULL, '通用', NULL, NULL, 0, 'icon-radioboxfill', 99, NULL, 1, 0);
|
||||
INSERT INTO `base_sys_menu` VALUES (85, '2020-07-25 16:22:14.000000', '2021-03-03 10:36:00.000000', 84, '图片上传', NULL, 'space:info:page,space:info:list,space:info:info,space:info:add,space:info:delete,space:info:update,space:type:page,space:type:list,space:type:info,space:type:add,space:type:delete,space:type:update', 2, NULL, 1, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (86, '2020-08-12 09:56:27.000000', '2021-03-08 23:03:03.000000', 45, '文件上传', '/upload', NULL, 1, 'icon-favor', 3, 'cool/modules/demo/views/upload.vue', 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (90, '1900-01-20 10:26:58.615000', '1900-01-20 10:26:58.615000', 84, '客服聊天', NULL, 'base:app:im:message:read,base:app:im:message:page,base:app:im:session:page,base:app:im:session:list,base:app:im:session:unreadCount,base:app:im:session:delete', 2, NULL, 0, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (96, '2021-01-12 14:12:20.000000', '2021-03-08 23:02:40.000000', 1, '组件预览', '/demo', NULL, 1, 'icon-favor', 0, 'cool/modules/demo/views/demo.vue', 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (97, '1900-01-20 14:14:02.000000', '2021-03-09 11:03:09.000000', 27, '用户列表', '/sys/user', NULL, 1, 'icon-user', 0, 'cool/modules/base/views/user.vue', 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (98, '1900-01-20 14:14:13.528000', '1900-01-20 14:14:13.528000', 97, '新增', NULL, 'base:sys:user:add', 2, NULL, 0, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (99, '1900-01-20 14:14:22.823000', '1900-01-20 14:14:22.823000', 97, '删除', NULL, 'base:sys:user:delete', 2, NULL, 0, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (100, '1900-01-20 14:14:33.973000', '1900-01-20 14:14:33.973000', 97, '修改', NULL, 'base:sys:user:delete,base:sys:user:update', 2, NULL, 0, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (101, '2021-01-12 14:14:51.000000', '2021-01-12 14:14:51.000000', 97, '查询', NULL, 'base:sys:user:page,base:sys:user:list,base:sys:user:info', 2, NULL, 0, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (105, '2021-01-21 10:42:55.000000', '2021-01-21 10:42:55.000000', 2, '监控管理', NULL, NULL, 0, 'icon-rank', 6, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (109, '2021-02-27 14:13:56.000000', '2021-02-27 17:09:19.000000', NULL, '插件管理', NULL, NULL, 0, 'icon-menu', 3, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (110, '2021-02-27 14:14:13.000000', '2021-03-08 23:01:30.000000', 109, '插件列表', '/plugin', NULL, 1, 'icon-menu', 0, 'cool/modules/base/views/plugin.vue', 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (111, '2021-02-27 14:24:41.877000', '2021-02-27 14:24:41.877000', 110, '编辑', NULL, 'base:plugin:info:info,base:plugin:info:update', 2, NULL, 0, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (112, '2021-02-27 14:24:52.159000', '2021-02-27 14:24:52.159000', 110, '列表', NULL, 'base:plugin:info:list', 2, NULL, 0, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (113, '2021-02-27 14:25:02.066000', '2021-02-27 14:25:02.066000', 110, '删除', NULL, 'base:plugin:info:delete', 2, NULL, 0, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (114, '2021-02-27 16:36:59.322000', '2021-02-27 16:36:59.322000', 110, '保存配置', NULL, 'base:plugin:info:config', 2, NULL, 0, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (115, '2021-02-27 16:38:21.000000', '2021-02-27 18:18:22.000000', 110, '获取配置', NULL, 'base:plugin:info:getConfig', 2, NULL, 0, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (116, '2021-02-27 17:57:42.000000', '2021-02-27 18:19:35.000000', 110, '开启、关闭', NULL, 'base:plugin:info:enable', 2, NULL, 0, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (117, '2021-03-05 10:58:25.000000', '2021-03-05 10:58:25.000000', NULL, '任务管理', NULL, NULL, 0, 'icon-activity', 5, NULL, 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (118, '2021-03-05 10:59:42.000000', '2021-03-05 10:59:42.000000', 117, '任务列表', '/task', NULL, 1, 'icon-menu', 0, 'cool/modules/task/views/task.vue', 1, 1);
|
||||
INSERT INTO `base_sys_menu` VALUES (119, '2021-03-05 11:00:00.000000', '2021-03-05 11:00:00.000000', 118, '权限', NULL, 'task:info:page,task:info:list,task:info:info,task:info:add,task:info:delete,task:info:update,task:info:stop,task:info:start,task:info:once,task:info:log', 2, NULL, 0, NULL, 1, 1);
|
||||
COMMIT;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for base_sys_param
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `base_sys_param`;
|
||||
CREATE TABLE `base_sys_param` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
|
||||
`createTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',
|
||||
`updateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',
|
||||
`keyName` varchar(255) NOT NULL COMMENT '键位',
|
||||
`name` varchar(255) NOT NULL COMMENT '名称',
|
||||
`data` text NOT NULL COMMENT '数据',
|
||||
`dataType` tinyint(4) NOT NULL DEFAULT '0' COMMENT '数据类型 0:字符串 1:数组 2:键值对',
|
||||
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `IDX_cf19b5e52d8c71caa9c4534454` (`keyName`),
|
||||
KEY `IDX_7bcb57371b481d8e2d66ddeaea` (`createTime`),
|
||||
KEY `IDX_479122e3bf464112f7a7253dac` (`updateTime`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of base_sys_param
|
||||
-- ----------------------------
|
||||
BEGIN;
|
||||
INSERT INTO `base_sys_param` VALUES (1, '2021-02-26 13:53:05.000000', '2021-03-03 17:50:04.000000', 'text', '富文本参数', '<p><strong class=\"ql-size-huge\">111xxxxx2222<span class=\"ql-cursor\"></span></strong></p>', 0, NULL);
|
||||
INSERT INTO `base_sys_param` VALUES (2, '2021-02-26 13:53:18.000000', '2021-02-26 13:53:18.000000', 'json', 'JSON参数', '{\n code: 111\n}', 0, NULL);
|
||||
COMMIT;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for base_sys_role
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `base_sys_role`;
|
||||
CREATE TABLE `base_sys_role` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
|
||||
`createTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',
|
||||
`updateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',
|
||||
`userId` varchar(255) NOT NULL COMMENT '用户ID',
|
||||
`name` varchar(255) NOT NULL COMMENT '名称',
|
||||
`label` varchar(50) DEFAULT NULL COMMENT '角色标签',
|
||||
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
|
||||
`relevance` int(11) NOT NULL DEFAULT '1' COMMENT '数据权限是否关联上下级',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `IDX_469d49a5998170e9550cf113da` (`name`),
|
||||
UNIQUE KEY `IDX_f3f24fbbccf00192b076e549a7` (`label`),
|
||||
KEY `IDX_6f01184441dec49207b41bfd92` (`createTime`),
|
||||
KEY `IDX_d64ca209f3fc52128d9b20e97b` (`updateTime`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of base_sys_role
|
||||
-- ----------------------------
|
||||
BEGIN;
|
||||
INSERT INTO `base_sys_role` VALUES (1, '2021-02-24 21:18:39.682358', '2021-02-24 21:18:39.682358', '1', '超管', 'admin', '最高权限的角色', 1);
|
||||
INSERT INTO `base_sys_role` VALUES (10, '2021-02-26 14:15:38.000000', '2021-02-26 14:15:38.000000', '1', '系统管理员', 'admin-sys', NULL, 1);
|
||||
INSERT INTO `base_sys_role` VALUES (11, '2021-02-26 14:16:49.044744', '2021-02-26 14:16:49.044744', '1', '游客', 'visitor', NULL, 0);
|
||||
INSERT INTO `base_sys_role` VALUES (12, '2021-02-26 14:26:51.000000', '2021-02-26 14:32:35.000000', '1', '开发', 'dev', NULL, 0);
|
||||
INSERT INTO `base_sys_role` VALUES (13, '2021-02-26 14:27:58.000000', '2021-02-26 14:33:49.000000', '1', '测试', 'test', NULL, 0);
|
||||
COMMIT;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for base_sys_role_department
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `base_sys_role_department`;
|
||||
CREATE TABLE `base_sys_role_department` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
|
||||
`createTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',
|
||||
`updateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',
|
||||
`roleId` bigint(20) NOT NULL COMMENT '角色ID',
|
||||
`departmentId` bigint(20) NOT NULL COMMENT '部门ID',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `IDX_e881a66f7cce83ba431cf20194` (`createTime`),
|
||||
KEY `IDX_cbf48031efee5d0de262965e53` (`updateTime`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of base_sys_role_department
|
||||
-- ----------------------------
|
||||
BEGIN;
|
||||
INSERT INTO `base_sys_role_department` VALUES (1, '2021-02-26 12:00:23.787939', '2021-02-26 12:00:23.787939', 8, 4);
|
||||
INSERT INTO `base_sys_role_department` VALUES (2, '2021-02-26 12:01:11.525205', '2021-02-26 12:01:11.525205', 9, 1);
|
||||
INSERT INTO `base_sys_role_department` VALUES (3, '2021-02-26 12:01:11.624266', '2021-02-26 12:01:11.624266', 9, 4);
|
||||
INSERT INTO `base_sys_role_department` VALUES (4, '2021-02-26 12:01:11.721894', '2021-02-26 12:01:11.721894', 9, 5);
|
||||
INSERT INTO `base_sys_role_department` VALUES (5, '2021-02-26 12:01:11.823342', '2021-02-26 12:01:11.823342', 9, 8);
|
||||
INSERT INTO `base_sys_role_department` VALUES (6, '2021-02-26 12:01:11.922873', '2021-02-26 12:01:11.922873', 9, 9);
|
||||
INSERT INTO `base_sys_role_department` VALUES (23, '2021-02-26 14:32:40.354669', '2021-02-26 14:32:40.354669', 12, 11);
|
||||
INSERT INTO `base_sys_role_department` VALUES (25, '2021-02-26 14:32:59.726608', '2021-02-26 14:32:59.726608', 10, 1);
|
||||
INSERT INTO `base_sys_role_department` VALUES (27, '2021-02-26 14:33:54.579947', '2021-02-26 14:33:54.579947', 13, 12);
|
||||
COMMIT;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for base_sys_role_menu
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `base_sys_role_menu`;
|
||||
CREATE TABLE `base_sys_role_menu` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
|
||||
`createTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',
|
||||
`updateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',
|
||||
`roleId` bigint(20) NOT NULL COMMENT '角色ID',
|
||||
`menuId` bigint(20) NOT NULL COMMENT '菜单ID',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `IDX_3641f81d4201c524a57ce2aa54` (`createTime`),
|
||||
KEY `IDX_f860298298b26e7a697be36e5b` (`updateTime`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=517 DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of base_sys_role_menu
|
||||
-- ----------------------------
|
||||
BEGIN;
|
||||
INSERT INTO `base_sys_role_menu` VALUES (1, '2021-02-26 12:00:18.240154', '2021-02-26 12:00:18.240154', 8, 1);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (2, '2021-02-26 12:00:18.342131', '2021-02-26 12:00:18.342131', 8, 96);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (3, '2021-02-26 12:00:18.444143', '2021-02-26 12:00:18.444143', 8, 45);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (4, '2021-02-26 12:00:18.545490', '2021-02-26 12:00:18.545490', 8, 43);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (5, '2021-02-26 12:00:18.649626', '2021-02-26 12:00:18.649626', 8, 49);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (6, '2021-02-26 12:00:18.752369', '2021-02-26 12:00:18.752369', 8, 86);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (7, '2021-02-26 12:00:18.856023', '2021-02-26 12:00:18.856023', 8, 2);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (8, '2021-02-26 12:00:18.956131', '2021-02-26 12:00:18.956131', 8, 27);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (9, '2021-02-26 12:00:19.071490', '2021-02-26 12:00:19.071490', 8, 97);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (10, '2021-02-26 12:00:19.171745', '2021-02-26 12:00:19.171745', 8, 59);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (11, '2021-02-26 12:00:19.274495', '2021-02-26 12:00:19.274495', 8, 60);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (12, '2021-02-26 12:00:19.374610', '2021-02-26 12:00:19.374610', 8, 61);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (13, '2021-02-26 12:00:19.474750', '2021-02-26 12:00:19.474750', 8, 62);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (14, '2021-02-26 12:00:19.573369', '2021-02-26 12:00:19.573369', 8, 63);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (15, '2021-02-26 12:00:19.674242', '2021-02-26 12:00:19.674242', 8, 65);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (16, '2021-02-26 12:00:19.772886', '2021-02-26 12:00:19.772886', 8, 98);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (17, '2021-02-26 12:00:19.874134', '2021-02-26 12:00:19.874134', 8, 99);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (18, '2021-02-26 12:00:19.972728', '2021-02-26 12:00:19.972728', 8, 100);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (19, '2021-02-26 12:00:20.085877', '2021-02-26 12:00:20.085877', 8, 101);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (20, '2021-02-26 12:00:20.192887', '2021-02-26 12:00:20.192887', 8, 8);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (21, '2021-02-26 12:00:20.293747', '2021-02-26 12:00:20.293747', 8, 10);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (22, '2021-02-26 12:00:20.393491', '2021-02-26 12:00:20.393491', 8, 11);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (23, '2021-02-26 12:00:20.495110', '2021-02-26 12:00:20.495110', 8, 12);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (24, '2021-02-26 12:00:20.594083', '2021-02-26 12:00:20.594083', 8, 13);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (25, '2021-02-26 12:00:20.695727', '2021-02-26 12:00:20.695727', 8, 22);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (26, '2021-02-26 12:00:20.794729', '2021-02-26 12:00:20.794729', 8, 23);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (27, '2021-02-26 12:00:20.895601', '2021-02-26 12:00:20.895601', 8, 24);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (28, '2021-02-26 12:00:20.994972', '2021-02-26 12:00:20.994972', 8, 25);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (29, '2021-02-26 12:00:21.110384', '2021-02-26 12:00:21.110384', 8, 26);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (30, '2021-02-26 12:00:21.210970', '2021-02-26 12:00:21.210970', 8, 69);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (31, '2021-02-26 12:00:21.311852', '2021-02-26 12:00:21.311852', 8, 70);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (32, '2021-02-26 12:00:21.411591', '2021-02-26 12:00:21.411591', 8, 71);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (33, '2021-02-26 12:00:21.513584', '2021-02-26 12:00:21.513584', 8, 72);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (34, '2021-02-26 12:00:21.612212', '2021-02-26 12:00:21.612212', 8, 73);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (35, '2021-02-26 12:00:21.712720', '2021-02-26 12:00:21.712720', 8, 74);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (36, '2021-02-26 12:00:21.812839', '2021-02-26 12:00:21.812839', 8, 75);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (37, '2021-02-26 12:00:21.913321', '2021-02-26 12:00:21.913321', 8, 76);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (38, '2021-02-26 12:00:22.013970', '2021-02-26 12:00:22.013970', 8, 77);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (39, '2021-02-26 12:00:22.144879', '2021-02-26 12:00:22.144879', 8, 78);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (40, '2021-02-26 12:00:22.246707', '2021-02-26 12:00:22.246707', 8, 79);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (41, '2021-02-26 12:00:22.347579', '2021-02-26 12:00:22.347579', 8, 80);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (42, '2021-02-26 12:00:22.446947', '2021-02-26 12:00:22.446947', 8, 81);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (43, '2021-02-26 12:00:22.547082', '2021-02-26 12:00:22.547082', 8, 82);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (44, '2021-02-26 12:00:22.647197', '2021-02-26 12:00:22.647197', 8, 83);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (45, '2021-02-26 12:00:22.748089', '2021-02-26 12:00:22.748089', 8, 105);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (46, '2021-02-26 12:00:22.847814', '2021-02-26 12:00:22.847814', 8, 102);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (47, '2021-02-26 12:00:22.949071', '2021-02-26 12:00:22.949071', 8, 103);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (48, '2021-02-26 12:00:23.047353', '2021-02-26 12:00:23.047353', 8, 29);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (49, '2021-02-26 12:00:23.147826', '2021-02-26 12:00:23.147826', 8, 30);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (50, '2021-02-26 12:00:23.246800', '2021-02-26 12:00:23.246800', 8, 47);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (51, '2021-02-26 12:00:23.349541', '2021-02-26 12:00:23.349541', 8, 48);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (52, '2021-02-26 12:00:23.463177', '2021-02-26 12:00:23.463177', 8, 84);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (53, '2021-02-26 12:00:23.564096', '2021-02-26 12:00:23.564096', 8, 90);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (54, '2021-02-26 12:00:23.663815', '2021-02-26 12:00:23.663815', 8, 85);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (55, '2021-02-26 12:01:05.971978', '2021-02-26 12:01:05.971978', 9, 1);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (56, '2021-02-26 12:01:06.085568', '2021-02-26 12:01:06.085568', 9, 96);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (57, '2021-02-26 12:01:06.198271', '2021-02-26 12:01:06.198271', 9, 45);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (58, '2021-02-26 12:01:06.309736', '2021-02-26 12:01:06.309736', 9, 43);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (59, '2021-02-26 12:01:06.410785', '2021-02-26 12:01:06.410785', 9, 49);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (60, '2021-02-26 12:01:06.510712', '2021-02-26 12:01:06.510712', 9, 86);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (61, '2021-02-26 12:01:06.612457', '2021-02-26 12:01:06.612457', 9, 2);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (62, '2021-02-26 12:01:06.710397', '2021-02-26 12:01:06.710397', 9, 27);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (63, '2021-02-26 12:01:06.809104', '2021-02-26 12:01:06.809104', 9, 97);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (64, '2021-02-26 12:01:06.907088', '2021-02-26 12:01:06.907088', 9, 59);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (65, '2021-02-26 12:01:07.009988', '2021-02-26 12:01:07.009988', 9, 60);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (66, '2021-02-26 12:01:07.122372', '2021-02-26 12:01:07.122372', 9, 61);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (67, '2021-02-26 12:01:07.223694', '2021-02-26 12:01:07.223694', 9, 62);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (68, '2021-02-26 12:01:07.325022', '2021-02-26 12:01:07.325022', 9, 63);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (69, '2021-02-26 12:01:07.425209', '2021-02-26 12:01:07.425209', 9, 65);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (70, '2021-02-26 12:01:07.522081', '2021-02-26 12:01:07.522081', 9, 98);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (71, '2021-02-26 12:01:07.622775', '2021-02-26 12:01:07.622775', 9, 99);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (72, '2021-02-26 12:01:07.721181', '2021-02-26 12:01:07.721181', 9, 100);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (73, '2021-02-26 12:01:07.819589', '2021-02-26 12:01:07.819589', 9, 101);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (74, '2021-02-26 12:01:07.920497', '2021-02-26 12:01:07.920497', 9, 8);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (75, '2021-02-26 12:01:08.018875', '2021-02-26 12:01:08.018875', 9, 10);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (76, '2021-02-26 12:01:08.135192', '2021-02-26 12:01:08.135192', 9, 11);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (77, '2021-02-26 12:01:08.246405', '2021-02-26 12:01:08.246405', 9, 12);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (78, '2021-02-26 12:01:08.346661', '2021-02-26 12:01:08.346661', 9, 13);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (79, '2021-02-26 12:01:08.448436', '2021-02-26 12:01:08.448436', 9, 22);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (80, '2021-02-26 12:01:08.547496', '2021-02-26 12:01:08.547496', 9, 23);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (81, '2021-02-26 12:01:08.648457', '2021-02-26 12:01:08.648457', 9, 24);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (82, '2021-02-26 12:01:08.750564', '2021-02-26 12:01:08.750564', 9, 25);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (83, '2021-02-26 12:01:08.851783', '2021-02-26 12:01:08.851783', 9, 26);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (84, '2021-02-26 12:01:08.950898', '2021-02-26 12:01:08.950898', 9, 69);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (85, '2021-02-26 12:01:09.061982', '2021-02-26 12:01:09.061982', 9, 70);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (86, '2021-02-26 12:01:09.165258', '2021-02-26 12:01:09.165258', 9, 71);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (87, '2021-02-26 12:01:09.266177', '2021-02-26 12:01:09.266177', 9, 72);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (88, '2021-02-26 12:01:09.366427', '2021-02-26 12:01:09.366427', 9, 73);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (89, '2021-02-26 12:01:09.467877', '2021-02-26 12:01:09.467877', 9, 74);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (90, '2021-02-26 12:01:09.568526', '2021-02-26 12:01:09.568526', 9, 75);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (91, '2021-02-26 12:01:09.668052', '2021-02-26 12:01:09.668052', 9, 76);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (92, '2021-02-26 12:01:09.766367', '2021-02-26 12:01:09.766367', 9, 77);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (93, '2021-02-26 12:01:09.866170', '2021-02-26 12:01:09.866170', 9, 78);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (94, '2021-02-26 12:01:09.963037', '2021-02-26 12:01:09.963037', 9, 79);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (95, '2021-02-26 12:01:10.082046', '2021-02-26 12:01:10.082046', 9, 80);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (96, '2021-02-26 12:01:10.185024', '2021-02-26 12:01:10.185024', 9, 81);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (97, '2021-02-26 12:01:10.283787', '2021-02-26 12:01:10.283787', 9, 82);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (98, '2021-02-26 12:01:10.382883', '2021-02-26 12:01:10.382883', 9, 83);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (99, '2021-02-26 12:01:10.481150', '2021-02-26 12:01:10.481150', 9, 105);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (100, '2021-02-26 12:01:10.579579', '2021-02-26 12:01:10.579579', 9, 102);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (101, '2021-02-26 12:01:10.679489', '2021-02-26 12:01:10.679489', 9, 103);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (102, '2021-02-26 12:01:10.777496', '2021-02-26 12:01:10.777496', 9, 29);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (103, '2021-02-26 12:01:10.878292', '2021-02-26 12:01:10.878292', 9, 30);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (104, '2021-02-26 12:01:10.977354', '2021-02-26 12:01:10.977354', 9, 47);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (105, '2021-02-26 12:01:11.097786', '2021-02-26 12:01:11.097786', 9, 48);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (106, '2021-02-26 12:01:11.201390', '2021-02-26 12:01:11.201390', 9, 84);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (107, '2021-02-26 12:01:11.302120', '2021-02-26 12:01:11.302120', 9, 90);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (108, '2021-02-26 12:01:11.402751', '2021-02-26 12:01:11.402751', 9, 85);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (161, '2021-02-26 14:16:49.162546', '2021-02-26 14:16:49.162546', 11, 1);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (162, '2021-02-26 14:16:49.257677', '2021-02-26 14:16:49.257677', 11, 96);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (163, '2021-02-26 14:16:49.356225', '2021-02-26 14:16:49.356225', 11, 45);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (164, '2021-02-26 14:16:49.450708', '2021-02-26 14:16:49.450708', 11, 43);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (165, '2021-02-26 14:16:49.543794', '2021-02-26 14:16:49.543794', 11, 49);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (166, '2021-02-26 14:16:49.636496', '2021-02-26 14:16:49.636496', 11, 86);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (167, '2021-02-26 14:16:49.728634', '2021-02-26 14:16:49.728634', 11, 47);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (168, '2021-02-26 14:16:49.824754', '2021-02-26 14:16:49.824754', 11, 48);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (169, '2021-02-26 14:16:49.919329', '2021-02-26 14:16:49.919329', 11, 85);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (170, '2021-02-26 14:16:50.015239', '2021-02-26 14:16:50.015239', 11, 84);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (290, '2021-02-26 14:32:35.143867', '2021-02-26 14:32:35.143867', 12, 1);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (291, '2021-02-26 14:32:35.239965', '2021-02-26 14:32:35.239965', 12, 96);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (292, '2021-02-26 14:32:35.336398', '2021-02-26 14:32:35.336398', 12, 45);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (293, '2021-02-26 14:32:35.435180', '2021-02-26 14:32:35.435180', 12, 43);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (294, '2021-02-26 14:32:35.528631', '2021-02-26 14:32:35.528631', 12, 49);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (295, '2021-02-26 14:32:35.623123', '2021-02-26 14:32:35.623123', 12, 86);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (296, '2021-02-26 14:32:35.718831', '2021-02-26 14:32:35.718831', 12, 2);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (297, '2021-02-26 14:32:35.812975', '2021-02-26 14:32:35.812975', 12, 27);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (298, '2021-02-26 14:32:35.904487', '2021-02-26 14:32:35.904487', 12, 97);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (299, '2021-02-26 14:32:35.998773', '2021-02-26 14:32:35.998773', 12, 59);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (300, '2021-02-26 14:32:36.107749', '2021-02-26 14:32:36.107749', 12, 60);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (301, '2021-02-26 14:32:36.213069', '2021-02-26 14:32:36.213069', 12, 61);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (302, '2021-02-26 14:32:36.308985', '2021-02-26 14:32:36.308985', 12, 62);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (303, '2021-02-26 14:32:36.404237', '2021-02-26 14:32:36.404237', 12, 63);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (304, '2021-02-26 14:32:36.499569', '2021-02-26 14:32:36.499569', 12, 65);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (305, '2021-02-26 14:32:36.593710', '2021-02-26 14:32:36.593710', 12, 98);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (306, '2021-02-26 14:32:36.685988', '2021-02-26 14:32:36.685988', 12, 99);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (307, '2021-02-26 14:32:36.778733', '2021-02-26 14:32:36.778733', 12, 100);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (308, '2021-02-26 14:32:36.874715', '2021-02-26 14:32:36.874715', 12, 101);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (309, '2021-02-26 14:32:36.973153', '2021-02-26 14:32:36.973153', 12, 8);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (310, '2021-02-26 14:32:37.082734', '2021-02-26 14:32:37.082734', 12, 10);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (311, '2021-02-26 14:32:37.176859', '2021-02-26 14:32:37.176859', 12, 11);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (312, '2021-02-26 14:32:37.271440', '2021-02-26 14:32:37.271440', 12, 12);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (313, '2021-02-26 14:32:37.365206', '2021-02-26 14:32:37.365206', 12, 13);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (314, '2021-02-26 14:32:37.457092', '2021-02-26 14:32:37.457092', 12, 22);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (315, '2021-02-26 14:32:37.549860', '2021-02-26 14:32:37.549860', 12, 23);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (316, '2021-02-26 14:32:37.645684', '2021-02-26 14:32:37.645684', 12, 24);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (317, '2021-02-26 14:32:37.743370', '2021-02-26 14:32:37.743370', 12, 25);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (318, '2021-02-26 14:32:37.837218', '2021-02-26 14:32:37.837218', 12, 26);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (319, '2021-02-26 14:32:37.930953', '2021-02-26 14:32:37.930953', 12, 69);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (320, '2021-02-26 14:32:38.031191', '2021-02-26 14:32:38.031191', 12, 70);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (321, '2021-02-26 14:32:38.130839', '2021-02-26 14:32:38.130839', 12, 71);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (322, '2021-02-26 14:32:38.229359', '2021-02-26 14:32:38.229359', 12, 72);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (323, '2021-02-26 14:32:38.323868', '2021-02-26 14:32:38.323868', 12, 73);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (324, '2021-02-26 14:32:38.415194', '2021-02-26 14:32:38.415194', 12, 74);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (325, '2021-02-26 14:32:38.505597', '2021-02-26 14:32:38.505597', 12, 75);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (326, '2021-02-26 14:32:38.600426', '2021-02-26 14:32:38.600426', 12, 76);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (327, '2021-02-26 14:32:38.698676', '2021-02-26 14:32:38.698676', 12, 77);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (328, '2021-02-26 14:32:38.793832', '2021-02-26 14:32:38.793832', 12, 78);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (329, '2021-02-26 14:32:38.889203', '2021-02-26 14:32:38.889203', 12, 79);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (330, '2021-02-26 14:32:38.985851', '2021-02-26 14:32:38.985851', 12, 80);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (331, '2021-02-26 14:32:39.092110', '2021-02-26 14:32:39.092110', 12, 81);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (332, '2021-02-26 14:32:39.188945', '2021-02-26 14:32:39.188945', 12, 82);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (333, '2021-02-26 14:32:39.280043', '2021-02-26 14:32:39.280043', 12, 83);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (334, '2021-02-26 14:32:39.374899', '2021-02-26 14:32:39.374899', 12, 105);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (335, '2021-02-26 14:32:39.473563', '2021-02-26 14:32:39.473563', 12, 102);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (336, '2021-02-26 14:32:39.570921', '2021-02-26 14:32:39.570921', 12, 103);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (337, '2021-02-26 14:32:39.665052', '2021-02-26 14:32:39.665052', 12, 29);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (338, '2021-02-26 14:32:39.760189', '2021-02-26 14:32:39.760189', 12, 30);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (339, '2021-02-26 14:32:39.852856', '2021-02-26 14:32:39.852856', 12, 47);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (340, '2021-02-26 14:32:39.944180', '2021-02-26 14:32:39.944180', 12, 48);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (341, '2021-02-26 14:32:40.038086', '2021-02-26 14:32:40.038086', 12, 84);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (342, '2021-02-26 14:32:40.135874', '2021-02-26 14:32:40.135874', 12, 90);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (343, '2021-02-26 14:32:40.234015', '2021-02-26 14:32:40.234015', 12, 85);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (355, '2021-02-26 14:32:54.538822', '2021-02-26 14:32:54.538822', 10, 1);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (356, '2021-02-26 14:32:54.634784', '2021-02-26 14:32:54.634784', 10, 96);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (357, '2021-02-26 14:32:54.732878', '2021-02-26 14:32:54.732878', 10, 45);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (358, '2021-02-26 14:32:54.826023', '2021-02-26 14:32:54.826023', 10, 43);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (359, '2021-02-26 14:32:54.920173', '2021-02-26 14:32:54.920173', 10, 49);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (360, '2021-02-26 14:32:55.019141', '2021-02-26 14:32:55.019141', 10, 86);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (361, '2021-02-26 14:32:55.119438', '2021-02-26 14:32:55.119438', 10, 2);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (362, '2021-02-26 14:32:55.211471', '2021-02-26 14:32:55.211471', 10, 27);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (363, '2021-02-26 14:32:55.304855', '2021-02-26 14:32:55.304855', 10, 97);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (364, '2021-02-26 14:32:55.397939', '2021-02-26 14:32:55.397939', 10, 59);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (365, '2021-02-26 14:32:55.491674', '2021-02-26 14:32:55.491674', 10, 60);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (366, '2021-02-26 14:32:55.584051', '2021-02-26 14:32:55.584051', 10, 61);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (367, '2021-02-26 14:32:55.676449', '2021-02-26 14:32:55.676449', 10, 62);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (368, '2021-02-26 14:32:55.774524', '2021-02-26 14:32:55.774524', 10, 63);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (369, '2021-02-26 14:32:55.871634', '2021-02-26 14:32:55.871634', 10, 65);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (370, '2021-02-26 14:32:55.964611', '2021-02-26 14:32:55.964611', 10, 98);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (371, '2021-02-26 14:32:56.074043', '2021-02-26 14:32:56.074043', 10, 99);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (372, '2021-02-26 14:32:56.169316', '2021-02-26 14:32:56.169316', 10, 100);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (373, '2021-02-26 14:32:56.263408', '2021-02-26 14:32:56.263408', 10, 101);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (374, '2021-02-26 14:32:56.356537', '2021-02-26 14:32:56.356537', 10, 8);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (375, '2021-02-26 14:32:56.448195', '2021-02-26 14:32:56.448195', 10, 10);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (376, '2021-02-26 14:32:56.544394', '2021-02-26 14:32:56.544394', 10, 11);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (377, '2021-02-26 14:32:56.641515', '2021-02-26 14:32:56.641515', 10, 12);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (378, '2021-02-26 14:32:56.735242', '2021-02-26 14:32:56.735242', 10, 13);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (379, '2021-02-26 14:32:56.828811', '2021-02-26 14:32:56.828811', 10, 22);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (380, '2021-02-26 14:32:56.922664', '2021-02-26 14:32:56.922664', 10, 23);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (381, '2021-02-26 14:32:57.016873', '2021-02-26 14:32:57.016873', 10, 24);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (382, '2021-02-26 14:32:57.123800', '2021-02-26 14:32:57.123800', 10, 25);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (383, '2021-02-26 14:32:57.223306', '2021-02-26 14:32:57.223306', 10, 26);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (384, '2021-02-26 14:32:57.328482', '2021-02-26 14:32:57.328482', 10, 69);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (385, '2021-02-26 14:32:57.430006', '2021-02-26 14:32:57.430006', 10, 70);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (386, '2021-02-26 14:32:57.521664', '2021-02-26 14:32:57.521664', 10, 71);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (387, '2021-02-26 14:32:57.612399', '2021-02-26 14:32:57.612399', 10, 72);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (388, '2021-02-26 14:32:57.705553', '2021-02-26 14:32:57.705553', 10, 73);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (389, '2021-02-26 14:32:57.799288', '2021-02-26 14:32:57.799288', 10, 74);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (390, '2021-02-26 14:32:57.893894', '2021-02-26 14:32:57.893894', 10, 75);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (391, '2021-02-26 14:32:57.988856', '2021-02-26 14:32:57.988856', 10, 76);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (392, '2021-02-26 14:32:58.090250', '2021-02-26 14:32:58.090250', 10, 77);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (393, '2021-02-26 14:32:58.196616', '2021-02-26 14:32:58.196616', 10, 78);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (394, '2021-02-26 14:32:58.288151', '2021-02-26 14:32:58.288151', 10, 79);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (395, '2021-02-26 14:32:58.378493', '2021-02-26 14:32:58.378493', 10, 80);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (396, '2021-02-26 14:32:58.471283', '2021-02-26 14:32:58.471283', 10, 81);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (397, '2021-02-26 14:32:58.564666', '2021-02-26 14:32:58.564666', 10, 82);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (398, '2021-02-26 14:32:58.658511', '2021-02-26 14:32:58.658511', 10, 83);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (399, '2021-02-26 14:32:58.752713', '2021-02-26 14:32:58.752713', 10, 105);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (400, '2021-02-26 14:32:58.849472', '2021-02-26 14:32:58.849472', 10, 102);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (401, '2021-02-26 14:32:58.948387', '2021-02-26 14:32:58.948387', 10, 103);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (402, '2021-02-26 14:32:59.042410', '2021-02-26 14:32:59.042410', 10, 29);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (403, '2021-02-26 14:32:59.132594', '2021-02-26 14:32:59.132594', 10, 30);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (404, '2021-02-26 14:32:59.226150', '2021-02-26 14:32:59.226150', 10, 47);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (405, '2021-02-26 14:32:59.319494', '2021-02-26 14:32:59.319494', 10, 48);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (406, '2021-02-26 14:32:59.413370', '2021-02-26 14:32:59.413370', 10, 84);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (407, '2021-02-26 14:32:59.507584', '2021-02-26 14:32:59.507584', 10, 90);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (408, '2021-02-26 14:32:59.604332', '2021-02-26 14:32:59.604332', 10, 85);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (463, '2021-02-26 14:33:49.310315', '2021-02-26 14:33:49.310315', 13, 1);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (464, '2021-02-26 14:33:49.403445', '2021-02-26 14:33:49.403445', 13, 96);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (465, '2021-02-26 14:33:49.496802', '2021-02-26 14:33:49.496802', 13, 45);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (466, '2021-02-26 14:33:49.595210', '2021-02-26 14:33:49.595210', 13, 43);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (467, '2021-02-26 14:33:49.688024', '2021-02-26 14:33:49.688024', 13, 49);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (468, '2021-02-26 14:33:49.781292', '2021-02-26 14:33:49.781292', 13, 86);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (469, '2021-02-26 14:33:49.874061', '2021-02-26 14:33:49.874061', 13, 2);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (470, '2021-02-26 14:33:49.965534', '2021-02-26 14:33:49.965534', 13, 27);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (471, '2021-02-26 14:33:50.072373', '2021-02-26 14:33:50.072373', 13, 97);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (472, '2021-02-26 14:33:50.176473', '2021-02-26 14:33:50.176473', 13, 59);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (473, '2021-02-26 14:33:50.272264', '2021-02-26 14:33:50.272264', 13, 60);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (474, '2021-02-26 14:33:50.370328', '2021-02-26 14:33:50.370328', 13, 61);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (475, '2021-02-26 14:33:50.463159', '2021-02-26 14:33:50.463159', 13, 62);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (476, '2021-02-26 14:33:50.557911', '2021-02-26 14:33:50.557911', 13, 63);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (477, '2021-02-26 14:33:50.650669', '2021-02-26 14:33:50.650669', 13, 65);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (478, '2021-02-26 14:33:50.742871', '2021-02-26 14:33:50.742871', 13, 98);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (479, '2021-02-26 14:33:50.838052', '2021-02-26 14:33:50.838052', 13, 99);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (480, '2021-02-26 14:33:50.932201', '2021-02-26 14:33:50.932201', 13, 100);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (481, '2021-02-26 14:33:51.030973', '2021-02-26 14:33:51.030973', 13, 101);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (482, '2021-02-26 14:33:51.168873', '2021-02-26 14:33:51.168873', 13, 8);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (483, '2021-02-26 14:33:51.265779', '2021-02-26 14:33:51.265779', 13, 10);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (484, '2021-02-26 14:33:51.379934', '2021-02-26 14:33:51.379934', 13, 11);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (485, '2021-02-26 14:33:51.473016', '2021-02-26 14:33:51.473016', 13, 12);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (486, '2021-02-26 14:33:51.568753', '2021-02-26 14:33:51.568753', 13, 13);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (487, '2021-02-26 14:33:51.667262', '2021-02-26 14:33:51.667262', 13, 22);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (488, '2021-02-26 14:33:51.761865', '2021-02-26 14:33:51.761865', 13, 23);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (489, '2021-02-26 14:33:51.857295', '2021-02-26 14:33:51.857295', 13, 24);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (490, '2021-02-26 14:33:51.951231', '2021-02-26 14:33:51.951231', 13, 25);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (491, '2021-02-26 14:33:52.047431', '2021-02-26 14:33:52.047431', 13, 26);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (492, '2021-02-26 14:33:52.141210', '2021-02-26 14:33:52.141210', 13, 69);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (493, '2021-02-26 14:33:52.236892', '2021-02-26 14:33:52.236892', 13, 70);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (494, '2021-02-26 14:33:52.332986', '2021-02-26 14:33:52.332986', 13, 71);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (495, '2021-02-26 14:33:52.432629', '2021-02-26 14:33:52.432629', 13, 72);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (496, '2021-02-26 14:33:52.529105', '2021-02-26 14:33:52.529105', 13, 73);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (497, '2021-02-26 14:33:52.625291', '2021-02-26 14:33:52.625291', 13, 74);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (498, '2021-02-26 14:33:52.721109', '2021-02-26 14:33:52.721109', 13, 75);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (499, '2021-02-26 14:33:52.813753', '2021-02-26 14:33:52.813753', 13, 76);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (500, '2021-02-26 14:33:52.905436', '2021-02-26 14:33:52.905436', 13, 77);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (501, '2021-02-26 14:33:52.998499', '2021-02-26 14:33:52.998499', 13, 78);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (502, '2021-02-26 14:33:53.100975', '2021-02-26 14:33:53.100975', 13, 79);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (503, '2021-02-26 14:33:53.199493', '2021-02-26 14:33:53.199493', 13, 80);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (504, '2021-02-26 14:33:53.294088', '2021-02-26 14:33:53.294088', 13, 81);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (505, '2021-02-26 14:33:53.391390', '2021-02-26 14:33:53.391390', 13, 82);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (506, '2021-02-26 14:33:53.486104', '2021-02-26 14:33:53.486104', 13, 83);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (507, '2021-02-26 14:33:53.578385', '2021-02-26 14:33:53.578385', 13, 105);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (508, '2021-02-26 14:33:53.670073', '2021-02-26 14:33:53.670073', 13, 102);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (509, '2021-02-26 14:33:53.763868', '2021-02-26 14:33:53.763868', 13, 103);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (510, '2021-02-26 14:33:53.860706', '2021-02-26 14:33:53.860706', 13, 29);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (511, '2021-02-26 14:33:53.959262', '2021-02-26 14:33:53.959262', 13, 30);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (512, '2021-02-26 14:33:54.064932', '2021-02-26 14:33:54.064932', 13, 47);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (513, '2021-02-26 14:33:54.168918', '2021-02-26 14:33:54.168918', 13, 48);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (514, '2021-02-26 14:33:54.273982', '2021-02-26 14:33:54.273982', 13, 84);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (515, '2021-02-26 14:33:54.366992', '2021-02-26 14:33:54.366992', 13, 90);
|
||||
INSERT INTO `base_sys_role_menu` VALUES (516, '2021-02-26 14:33:54.458682', '2021-02-26 14:33:54.458682', 13, 85);
|
||||
COMMIT;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for base_sys_user
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `base_sys_user`;
|
||||
CREATE TABLE `base_sys_user` (
|
||||
`id` int NOT NULL AUTO_INCREMENT COMMENT 'ID',
|
||||
`createTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',
|
||||
`updateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',
|
||||
`departmentId` bigint DEFAULT NULL COMMENT '部门ID',
|
||||
`name` varchar(255) DEFAULT NULL COMMENT '姓名',
|
||||
`username` varchar(100) NOT NULL COMMENT '用户名',
|
||||
`password` varchar(255) NOT NULL COMMENT '密码',
|
||||
`passwordV` int NOT NULL DEFAULT '1' COMMENT '密码版本, 作用是改完密码,让原来的token失效',
|
||||
`nickName` varchar(255) DEFAULT NULL COMMENT '昵称',
|
||||
`headImg` varchar(255) DEFAULT NULL COMMENT '头像',
|
||||
`phone` varchar(20) DEFAULT NULL COMMENT '手机',
|
||||
`email` varchar(255) DEFAULT NULL COMMENT '邮箱',
|
||||
`status` tinyint NOT NULL DEFAULT '1' COMMENT '状态 0:禁用 1:启用',
|
||||
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
|
||||
`socketId` varchar(255) DEFAULT NULL COMMENT 'socketId',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `IDX_469ad55973f5b98930f6ad627b` (`username`),
|
||||
KEY `IDX_0cf944da378d70a94f5fefd803` (`departmentId`),
|
||||
KEY `IDX_9ec6d7ac6337eafb070e4881a8` (`phone`),
|
||||
KEY `IDX_ca8611d15a63d52aa4e292e46a` (`createTime`),
|
||||
KEY `IDX_a0f2f19cee18445998ece93ddd` (`updateTime`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of base_sys_user
|
||||
-- ----------------------------
|
||||
BEGIN;
|
||||
INSERT INTO `base_sys_user` VALUES (1, '2021-02-24 21:16:41.525157', '2021-02-27 18:21:16.000000', 1, '超级管理员', 'admin', 'e10adc3949ba59abbe56e057f20f883e', 3, '管理员', 'https://cool-admin-pro.oss-cn-shanghai.aliyuncs.com/app/c8128c24-d0e9-4e07-9c0d-6f65446e105b.png', '18000000000', 'team@cool-js.com', 1, '拥有最高权限的用户', NULL);
|
||||
INSERT INTO `base_sys_user` VALUES (24, '2021-02-26 14:17:38.000000', '2021-02-26 14:17:38.000000', 11, '小白', 'xiaobai', 'e10adc3949ba59abbe56e057f20f883e', 1, '小白', NULL, NULL, NULL, 1, NULL, NULL);
|
||||
INSERT INTO `base_sys_user` VALUES (25, '2021-02-26 14:28:25.000000', '2021-02-26 14:28:25.000000', 12, '小黑', 'xiaohei', 'e10adc3949ba59abbe56e057f20f883e', 1, '小黑', NULL, NULL, NULL, 1, NULL, NULL);
|
||||
INSERT INTO `base_sys_user` VALUES (26, '2021-02-26 14:28:49.000000', '2021-02-26 14:28:49.000000', 12, '小绿', 'xiaolv', 'e10adc3949ba59abbe56e057f20f883e', 1, '小绿', NULL, NULL, NULL, 1, NULL, NULL);
|
||||
INSERT INTO `base_sys_user` VALUES (27, '2021-02-26 14:29:23.000000', '2021-02-26 14:29:23.000000', 13, '小青', 'xiaoqin', 'e10adc3949ba59abbe56e057f20f883e', 1, '小青', NULL, NULL, NULL, 1, NULL, NULL);
|
||||
INSERT INTO `base_sys_user` VALUES (28, '2021-02-26 14:29:52.000000', '2021-02-26 14:29:52.000000', 11, '神仙都没用', 'icssoa', 'e10adc3949ba59abbe56e057f20f883e', 1, '神仙都没用', 'https://cool-admin.cn.utools.club/uploads//20210226/0eeab9a0-77fc-11eb-b64f-674cd46b6601.jpg', NULL, NULL, 1, NULL, NULL);
|
||||
COMMIT;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for base_sys_user_role
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `base_sys_user_role`;
|
||||
CREATE TABLE `base_sys_user_role` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
|
||||
`createTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',
|
||||
`updateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',
|
||||
`userId` bigint(20) NOT NULL COMMENT '用户ID',
|
||||
`roleId` bigint(20) NOT NULL COMMENT '角色ID',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `IDX_fa9555e03e42fce748c9046b1c` (`createTime`),
|
||||
KEY `IDX_3e36c0d2b1a4c659c6b4fc64b3` (`updateTime`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=45 DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of base_sys_user_role
|
||||
-- ----------------------------
|
||||
BEGIN;
|
||||
INSERT INTO `base_sys_user_role` VALUES (1, '2021-02-24 22:03:11.665805', '2021-02-24 22:03:11.665805', 1, 1);
|
||||
INSERT INTO `base_sys_user_role` VALUES (2, '2021-02-25 11:03:55.325988', '2021-02-25 11:03:55.325988', 2, 1);
|
||||
INSERT INTO `base_sys_user_role` VALUES (3, '2021-02-25 14:30:57.295150', '2021-02-25 14:30:57.295150', 3, 1);
|
||||
INSERT INTO `base_sys_user_role` VALUES (4, '2021-02-25 14:39:32.975014', '2021-02-25 14:39:32.975014', 4, 1);
|
||||
INSERT INTO `base_sys_user_role` VALUES (5, '2021-02-25 14:40:56.812948', '2021-02-25 14:40:56.812948', 5, 1);
|
||||
INSERT INTO `base_sys_user_role` VALUES (6, '2021-02-25 14:44:08.436555', '2021-02-25 14:44:08.436555', 6, 1);
|
||||
INSERT INTO `base_sys_user_role` VALUES (7, '2021-02-25 14:46:17.409232', '2021-02-25 14:46:17.409232', 7, 1);
|
||||
INSERT INTO `base_sys_user_role` VALUES (8, '2021-02-25 14:47:47.211749', '2021-02-25 14:47:47.211749', 8, 1);
|
||||
INSERT INTO `base_sys_user_role` VALUES (9, '2021-02-25 14:48:11.734024', '2021-02-25 14:48:11.734024', 9, 1);
|
||||
INSERT INTO `base_sys_user_role` VALUES (10, '2021-02-25 14:50:48.288616', '2021-02-25 14:50:48.288616', 10, 1);
|
||||
INSERT INTO `base_sys_user_role` VALUES (11, '2021-02-25 14:51:32.123884', '2021-02-25 14:51:32.123884', 11, 1);
|
||||
INSERT INTO `base_sys_user_role` VALUES (12, '2021-02-25 15:46:26.356943', '2021-02-25 15:46:26.356943', 12, 1);
|
||||
INSERT INTO `base_sys_user_role` VALUES (13, '2021-02-25 15:56:43.475155', '2021-02-25 15:56:43.475155', 13, 1);
|
||||
INSERT INTO `base_sys_user_role` VALUES (14, '2021-02-25 16:03:14.417784', '2021-02-25 16:03:14.417784', 14, 1);
|
||||
INSERT INTO `base_sys_user_role` VALUES (16, '2021-02-25 16:22:11.200152', '2021-02-25 16:22:11.200152', 16, 1);
|
||||
INSERT INTO `base_sys_user_role` VALUES (17, '2021-02-25 17:44:37.635550', '2021-02-25 17:44:37.635550', 15, 1);
|
||||
INSERT INTO `base_sys_user_role` VALUES (19, '2021-02-25 17:51:00.554812', '2021-02-25 17:51:00.554812', 18, 1);
|
||||
INSERT INTO `base_sys_user_role` VALUES (21, '2021-02-25 17:54:41.375113', '2021-02-25 17:54:41.375113', 17, 1);
|
||||
INSERT INTO `base_sys_user_role` VALUES (22, '2021-02-25 17:55:49.385301', '2021-02-25 17:55:49.385301', 20, 1);
|
||||
INSERT INTO `base_sys_user_role` VALUES (24, '2021-02-25 17:58:35.452363', '2021-02-25 17:58:35.452363', 22, 1);
|
||||
INSERT INTO `base_sys_user_role` VALUES (27, '2021-02-25 21:25:55.005236', '2021-02-25 21:25:55.005236', 19, 1);
|
||||
INSERT INTO `base_sys_user_role` VALUES (28, '2021-02-26 13:50:05.633242', '2021-02-26 13:50:05.633242', 21, 8);
|
||||
INSERT INTO `base_sys_user_role` VALUES (29, '2021-02-26 13:50:17.836990', '2021-02-26 13:50:17.836990', 23, 8);
|
||||
INSERT INTO `base_sys_user_role` VALUES (38, '2021-02-26 14:36:08.899046', '2021-02-26 14:36:08.899046', 26, 13);
|
||||
INSERT INTO `base_sys_user_role` VALUES (39, '2021-02-26 14:36:13.149510', '2021-02-26 14:36:13.149510', 25, 13);
|
||||
INSERT INTO `base_sys_user_role` VALUES (40, '2021-02-26 14:36:20.737073', '2021-02-26 14:36:20.737073', 27, 11);
|
||||
INSERT INTO `base_sys_user_role` VALUES (42, '2021-02-26 14:36:53.481478', '2021-02-26 14:36:53.481478', 24, 12);
|
||||
INSERT INTO `base_sys_user_role` VALUES (43, '2021-02-26 14:36:58.477817', '2021-02-26 14:36:58.477817', 28, 12);
|
||||
INSERT INTO `base_sys_user_role` VALUES (44, '2021-02-26 14:36:58.577114', '2021-02-26 14:36:58.577114', 28, 10);
|
||||
COMMIT;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for demo_app_goods
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `demo_app_goods`;
|
||||
CREATE TABLE `demo_app_goods` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
|
||||
`createTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',
|
||||
`updateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',
|
||||
`title` varchar(255) NOT NULL COMMENT '标题',
|
||||
`pic` varchar(255) NOT NULL COMMENT '图片',
|
||||
`price` decimal(5,2) NOT NULL COMMENT '价格',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `IDX_de2b99b64158bb4030487d7475` (`createTime`),
|
||||
KEY `IDX_f84cff6dc28b1a5dcc53856e66` (`updateTime`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of demo_app_goods
|
||||
-- ----------------------------
|
||||
BEGIN;
|
||||
INSERT INTO `demo_app_goods` VALUES (1, '2021-03-02 17:22:10.687462', '2021-03-02 17:22:10.687462', 'cool-mall商城', 'https://docs.cool-js.com/mall/show05.jpeg', 20.00);
|
||||
COMMIT;
|
||||
|
||||
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
|
@ -0,0 +1,120 @@
|
|||
import { App, Config, Middleware } from '@midwayjs/decorator';
|
||||
import * as _ from 'lodash';
|
||||
import { RESCODE } from '@cool-midway/core';
|
||||
import * as jwt from 'jsonwebtoken';
|
||||
import { NextFunction, Context } from '@midwayjs/koa';
|
||||
import { IMiddleware, IMidwayApplication } from '@midwayjs/core';
|
||||
|
||||
/**
|
||||
* 权限校验
|
||||
*/
|
||||
@Middleware()
|
||||
export class BaseAuthorityMiddleware
|
||||
implements IMiddleware<Context, NextFunction>
|
||||
{
|
||||
@Config('koa.globalPrefix')
|
||||
prefix;
|
||||
|
||||
@Config('module.base')
|
||||
jwtConfig;
|
||||
|
||||
coolCache;
|
||||
|
||||
@App()
|
||||
app: IMidwayApplication;
|
||||
|
||||
resolve() {
|
||||
return async (ctx: Context, next: NextFunction) => {
|
||||
let statusCode = 200;
|
||||
let { url } = ctx;
|
||||
url = url.replace(this.prefix, '');
|
||||
const token = ctx.get('Authorization');
|
||||
const adminUrl = '/admin/';
|
||||
// 路由地址为 admin前缀的 需要权限校验
|
||||
if (_.startsWith(url, adminUrl)) {
|
||||
try {
|
||||
ctx.admin = jwt.verify(token, this.jwtConfig.jwt.secret);
|
||||
} catch (err) {}
|
||||
// 不需要登录 无需权限校验
|
||||
if (new RegExp(`^${adminUrl}?.*/open/`).test(url)) {
|
||||
await next();
|
||||
return;
|
||||
}
|
||||
if (ctx.admin) {
|
||||
// 超管拥有所有权限
|
||||
if (ctx.admin.username == 'admin' && !ctx.admin.isRefresh) {
|
||||
await next();
|
||||
return;
|
||||
}
|
||||
// 要登录每个人都有权限的接口
|
||||
if (new RegExp(`^${adminUrl}?.*/comm/`).test(url)) {
|
||||
await next();
|
||||
return;
|
||||
}
|
||||
// 如果传的token是refreshToken则校验失败
|
||||
if (ctx.admin.isRefresh) {
|
||||
ctx.status = 401;
|
||||
ctx.body = {
|
||||
code: RESCODE.COMMFAIL,
|
||||
message: '登录失效~',
|
||||
};
|
||||
return;
|
||||
}
|
||||
// 需要动态获得缓存
|
||||
this.coolCache = await ctx.requestContext.getAsync('cool:cache');
|
||||
// 判断密码版本是否正确
|
||||
const passwordV = await this.coolCache.get(
|
||||
`admin:passwordVersion:${ctx.admin.userId}`
|
||||
);
|
||||
if (passwordV != ctx.admin.passwordVersion) {
|
||||
ctx.status = 401;
|
||||
ctx.body = {
|
||||
code: RESCODE.COMMFAIL,
|
||||
message: '登录失效~',
|
||||
};
|
||||
return;
|
||||
}
|
||||
const rToken = await this.coolCache.get(
|
||||
`admin:token:${ctx.admin.userId}`
|
||||
);
|
||||
if (!rToken) {
|
||||
ctx.status = 401;
|
||||
ctx.body = {
|
||||
code: RESCODE.COMMFAIL,
|
||||
message: '登录失效或无权限访问~',
|
||||
};
|
||||
return;
|
||||
}
|
||||
if (rToken !== token && this.jwtConfig.sso) {
|
||||
statusCode = 401;
|
||||
} else {
|
||||
let perms = await this.coolCache.get(
|
||||
`admin:perms:${ctx.admin.userId}`
|
||||
);
|
||||
if (!_.isEmpty(perms)) {
|
||||
perms = JSON.parse(perms).map(e => {
|
||||
return e.replace(/:/g, '/');
|
||||
});
|
||||
if (!perms.includes(url.split('?')[0].replace('/admin/', ''))) {
|
||||
statusCode = 403;
|
||||
}
|
||||
} else {
|
||||
statusCode = 403;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
statusCode = 401;
|
||||
}
|
||||
if (statusCode > 200) {
|
||||
ctx.status = statusCode;
|
||||
ctx.body = {
|
||||
code: RESCODE.COMMFAIL,
|
||||
message: '登录失效或无权限访问~',
|
||||
};
|
||||
return;
|
||||
}
|
||||
}
|
||||
await next();
|
||||
};
|
||||
}
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
import { Middleware } from '@midwayjs/decorator';
|
||||
import * as _ from 'lodash';
|
||||
import { NextFunction, Context } from '@midwayjs/koa';
|
||||
import { IMiddleware } from '@midwayjs/core';
|
||||
import { BaseSysLogService } from '../service/sys/log';
|
||||
|
||||
/**
|
||||
* 日志中间件
|
||||
*/
|
||||
@Middleware()
|
||||
export class BaseLogMiddleware implements IMiddleware<Context, NextFunction> {
|
||||
resolve() {
|
||||
return async (ctx: Context, next: NextFunction) => {
|
||||
const baseSysLogService = await ctx.requestContext.getAsync(
|
||||
BaseSysLogService
|
||||
);
|
||||
baseSysLogService.record(
|
||||
ctx,
|
||||
ctx.url.split('?')[0],
|
||||
ctx.req.method === 'GET' ? ctx.request.query : ctx.request.body,
|
||||
ctx.admin ? ctx.admin.userId : null
|
||||
);
|
||||
await next();
|
||||
};
|
||||
}
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
import {
|
||||
Provide,
|
||||
Inject,
|
||||
CommonSchedule,
|
||||
TaskLocal,
|
||||
FORMAT,
|
||||
} from '@midwayjs/decorator';
|
||||
import { BaseSysLogService } from '../service/sys/log';
|
||||
import { ILogger } from '@midwayjs/logger';
|
||||
|
||||
/**
|
||||
* 日志定时任务
|
||||
*/
|
||||
@Provide()
|
||||
export class BaseLogSchedule implements CommonSchedule {
|
||||
@Inject()
|
||||
baseSysLogService: BaseSysLogService;
|
||||
|
||||
@Inject()
|
||||
logger: ILogger;
|
||||
|
||||
// 定时执行的具体任务
|
||||
@TaskLocal(FORMAT.CRONTAB.EVERY_DAY)
|
||||
async exec() {
|
||||
this.logger.info('清除日志定时任务开始执行');
|
||||
const startTime = Date.now();
|
||||
await this.baseSysLogService.clear();
|
||||
this.logger.info(`清除日志定时任务结束,耗时:${Date.now() - startTime}ms`);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
import { Provide } from '@midwayjs/decorator';
|
||||
import { BaseService } from '@cool-midway/core';
|
||||
import { InjectEntityModel } from '@midwayjs/orm';
|
||||
import { Repository } from 'typeorm';
|
||||
import { BaseSysConfEntity } from '../../entity/sys/conf';
|
||||
|
||||
/**
|
||||
* 系统配置
|
||||
*/
|
||||
@Provide()
|
||||
export class BaseSysConfService extends BaseService {
|
||||
@InjectEntityModel(BaseSysConfEntity)
|
||||
baseSysConfEntity: Repository<BaseSysConfEntity>;
|
||||
|
||||
/**
|
||||
* 获得配置参数值
|
||||
* @param key
|
||||
*/
|
||||
async getValue(key) {
|
||||
const conf = await this.baseSysConfEntity.findOne({ cKey: key });
|
||||
if (conf) {
|
||||
return conf.cValue;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新配置参数
|
||||
* @param cKey
|
||||
* @param cValue
|
||||
*/
|
||||
async updateVaule(cKey, cValue) {
|
||||
await this.baseSysConfEntity
|
||||
.createQueryBuilder()
|
||||
.update()
|
||||
.where({ cKey })
|
||||
.set({ cKey, cValue })
|
||||
.execute();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,123 @@
|
|||
import { Inject, Provide } from '@midwayjs/decorator';
|
||||
import { BaseService } from '@cool-midway/core';
|
||||
import { InjectEntityModel } from '@midwayjs/orm';
|
||||
import { Repository } from 'typeorm';
|
||||
import { BaseSysDepartmentEntity } from '../../entity/sys/department';
|
||||
import * as _ from 'lodash';
|
||||
import { BaseSysRoleDepartmentEntity } from '../../entity/sys/role_department';
|
||||
import { BaseSysPermsService } from './perms';
|
||||
|
||||
/**
|
||||
* 描述
|
||||
*/
|
||||
@Provide()
|
||||
export class BaseSysDepartmentService extends BaseService {
|
||||
@InjectEntityModel(BaseSysDepartmentEntity)
|
||||
baseSysDepartmentEntity: Repository<BaseSysDepartmentEntity>;
|
||||
|
||||
@InjectEntityModel(BaseSysRoleDepartmentEntity)
|
||||
baseSysRoleDepartmentEntity: Repository<BaseSysRoleDepartmentEntity>;
|
||||
|
||||
@Inject()
|
||||
baseSysPermsService: BaseSysPermsService;
|
||||
|
||||
@Inject()
|
||||
ctx;
|
||||
|
||||
/**
|
||||
* 获得部门菜单
|
||||
*/
|
||||
async list() {
|
||||
// 部门权限
|
||||
const permsDepartmentArr = await this.baseSysPermsService.departmentIds(
|
||||
this.ctx.admin.userId
|
||||
);
|
||||
|
||||
// 过滤部门权限
|
||||
const find = this.baseSysDepartmentEntity.createQueryBuilder();
|
||||
if (this.ctx.admin.username !== 'admin')
|
||||
find.andWhere('id in (:ids)', {
|
||||
ids: !_.isEmpty(permsDepartmentArr) ? permsDepartmentArr : [null],
|
||||
});
|
||||
find.addOrderBy('orderNum', 'ASC');
|
||||
const departments: BaseSysDepartmentEntity[] = await find.getMany();
|
||||
|
||||
if (!_.isEmpty(departments)) {
|
||||
departments.forEach(e => {
|
||||
const parentMenu = departments.filter(m => {
|
||||
e.parentId = parseInt(e.parentId + '');
|
||||
if (e.parentId == m.id) {
|
||||
return m.name;
|
||||
}
|
||||
});
|
||||
if (!_.isEmpty(parentMenu)) {
|
||||
e.parentName = parentMenu[0].name;
|
||||
}
|
||||
});
|
||||
}
|
||||
return departments;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据多个ID获得部门权限信息
|
||||
* @param {[]} roleIds 数组
|
||||
* @param isAdmin 是否超管
|
||||
*/
|
||||
async getByRoleIds(roleIds: number[], isAdmin) {
|
||||
if (!_.isEmpty(roleIds)) {
|
||||
if (isAdmin) {
|
||||
const result = await this.baseSysDepartmentEntity.find();
|
||||
return result.map(e => {
|
||||
return e.id;
|
||||
});
|
||||
}
|
||||
const result = await this.baseSysRoleDepartmentEntity
|
||||
.createQueryBuilder()
|
||||
.where('roleId in (:roleIds)', { roleIds })
|
||||
.getMany();
|
||||
if (!_.isEmpty(result)) {
|
||||
return _.uniq(
|
||||
result.map(e => {
|
||||
return e.departmentId;
|
||||
})
|
||||
);
|
||||
}
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* 部门排序
|
||||
* @param params
|
||||
*/
|
||||
async order(params) {
|
||||
for (const e of params) {
|
||||
await this.baseSysDepartmentEntity.update(e.id, e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除
|
||||
*/
|
||||
async delete(ids: number[]) {
|
||||
const { deleteUser } = this.ctx.request.body;
|
||||
await this.baseSysDepartmentEntity.delete(ids);
|
||||
if (deleteUser) {
|
||||
await this.nativeQuery(
|
||||
'delete from base_sys_user where departmentId in (?)',
|
||||
[ids]
|
||||
);
|
||||
} else {
|
||||
const topDepartment = await this.baseSysDepartmentEntity
|
||||
.createQueryBuilder()
|
||||
.where('parentId is null')
|
||||
.getOne();
|
||||
if (topDepartment) {
|
||||
await this.nativeQuery(
|
||||
'update base_sys_user a set a.departmentId = ? where a.departmentId in (?)',
|
||||
[topDepartment.id, ids]
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
import { Inject, Provide } from '@midwayjs/decorator';
|
||||
import { BaseService } from '@cool-midway/core';
|
||||
import { InjectEntityModel } from '@midwayjs/orm';
|
||||
import { Repository } from 'typeorm';
|
||||
import * as _ from 'lodash';
|
||||
import { BaseSysLogEntity } from '../../entity/sys/log';
|
||||
import * as moment from 'moment';
|
||||
import { Utils } from '../../../../comm/utils';
|
||||
import { BaseSysConfService } from './conf';
|
||||
import { Context } from '@midwayjs/koa';
|
||||
|
||||
/**
|
||||
* 描述
|
||||
*/
|
||||
@Provide()
|
||||
export class BaseSysLogService extends BaseService {
|
||||
@Inject()
|
||||
ctx;
|
||||
|
||||
@Inject()
|
||||
utils: Utils;
|
||||
|
||||
@InjectEntityModel(BaseSysLogEntity)
|
||||
baseSysLogEntity: Repository<BaseSysLogEntity>;
|
||||
|
||||
@Inject()
|
||||
baseSysConfService: BaseSysConfService;
|
||||
|
||||
/**
|
||||
* 记录
|
||||
* @param url URL地址
|
||||
* @param params 参数
|
||||
* @param userId 用户ID
|
||||
*/
|
||||
async record(context: Context, url, params, userId) {
|
||||
const ip = await this.utils.getReqIP(context);
|
||||
const sysLog = new BaseSysLogEntity();
|
||||
sysLog.userId = userId;
|
||||
sysLog.ip = typeof ip === 'string' ? ip : ip.join(',');
|
||||
const ipAddrArr = [];
|
||||
for (const e of sysLog.ip.split(','))
|
||||
ipAddrArr.push(await await this.utils.getIpAddr(context, e));
|
||||
sysLog.ipAddr = ipAddrArr.join(',');
|
||||
sysLog.action = url;
|
||||
if (!_.isEmpty(params)) {
|
||||
sysLog.params = JSON.stringify(params);
|
||||
}
|
||||
await this.baseSysLogEntity.insert(sysLog);
|
||||
}
|
||||
|
||||
/**
|
||||
* 日志
|
||||
* @param isAll 是否清除全部
|
||||
*/
|
||||
async clear(isAll?) {
|
||||
if (isAll) {
|
||||
await this.baseSysLogEntity.clear();
|
||||
return;
|
||||
}
|
||||
const keepDay = await this.baseSysConfService.getValue('logKeep');
|
||||
if (keepDay) {
|
||||
const beforeDate = `${moment()
|
||||
.add(-keepDay, 'days')
|
||||
.format('YYYY-MM-DD')} 00:00:00`;
|
||||
await this.baseSysLogEntity
|
||||
.createQueryBuilder()
|
||||
.delete()
|
||||
.where('createTime < :createTime', { createTime: beforeDate })
|
||||
.execute();
|
||||
} else {
|
||||
await this.baseSysLogEntity.clear();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,247 @@
|
|||
import { Inject, Provide, Config } from '@midwayjs/decorator';
|
||||
import { BaseService, CoolCommException, RESCODE } from '@cool-midway/core';
|
||||
import { LoginDTO } from '../../dto/login';
|
||||
import * as svgCaptcha from 'svg-captcha';
|
||||
import { v1 as uuid } from 'uuid';
|
||||
import { BaseSysUserEntity } from '../../entity/sys/user';
|
||||
import { Repository } from 'typeorm';
|
||||
import { InjectEntityModel } from '@midwayjs/orm';
|
||||
import * as md5 from 'md5';
|
||||
import { BaseSysRoleService } from './role';
|
||||
import * as _ from 'lodash';
|
||||
import { BaseSysMenuService } from './menu';
|
||||
import { BaseSysDepartmentService } from './department';
|
||||
import * as jwt from 'jsonwebtoken';
|
||||
import * as svgToDataURL from 'mini-svg-data-uri';
|
||||
import { Context } from '@midwayjs/koa';
|
||||
import { CacheManager } from '@midwayjs/cache';
|
||||
|
||||
/**
|
||||
* 登录
|
||||
*/
|
||||
@Provide()
|
||||
export class BaseSysLoginService extends BaseService {
|
||||
@Inject()
|
||||
cacheManager: CacheManager;
|
||||
|
||||
@InjectEntityModel(BaseSysUserEntity)
|
||||
baseSysUserEntity: Repository<BaseSysUserEntity>;
|
||||
|
||||
@Inject()
|
||||
baseSysRoleService: BaseSysRoleService;
|
||||
|
||||
@Inject()
|
||||
baseSysMenuService: BaseSysMenuService;
|
||||
|
||||
@Inject()
|
||||
baseSysDepartmentService: BaseSysDepartmentService;
|
||||
|
||||
@Inject()
|
||||
ctx: Context;
|
||||
|
||||
@Config('module.base')
|
||||
coolConfig;
|
||||
|
||||
/**
|
||||
* 登录
|
||||
* @param login
|
||||
*/
|
||||
async login(login: LoginDTO) {
|
||||
const { username, captchaId, verifyCode, password } = login;
|
||||
// 校验验证码
|
||||
const checkV = await this.captchaCheck(captchaId, verifyCode);
|
||||
if (checkV) {
|
||||
const user = await this.baseSysUserEntity.findOne({ username });
|
||||
// 校验用户
|
||||
if (user) {
|
||||
// 校验用户状态及密码
|
||||
if (user.status === 0 || user.password !== md5(password)) {
|
||||
throw new CoolCommException('账户或密码不正确~');
|
||||
}
|
||||
} else {
|
||||
throw new CoolCommException('账户或密码不正确~');
|
||||
}
|
||||
// 校验角色
|
||||
const roleIds = await this.baseSysRoleService.getByUser(user.id);
|
||||
if (_.isEmpty(roleIds)) {
|
||||
throw new CoolCommException('该用户未设置任何角色,无法登录~');
|
||||
}
|
||||
|
||||
// 生成token
|
||||
const { expire, refreshExpire } = this.coolConfig.jwt.token;
|
||||
const result = {
|
||||
expire,
|
||||
token: await this.generateToken(user, roleIds, expire),
|
||||
refreshExpire,
|
||||
refreshToken: await this.generateToken(
|
||||
user,
|
||||
roleIds,
|
||||
refreshExpire,
|
||||
true
|
||||
),
|
||||
};
|
||||
|
||||
// 将用户相关信息保存到缓存
|
||||
const perms = await this.baseSysMenuService.getPerms(roleIds);
|
||||
const departments = await this.baseSysDepartmentService.getByRoleIds(
|
||||
roleIds,
|
||||
user.username === 'admin'
|
||||
);
|
||||
await this.cacheManager.set(
|
||||
`admin:department:${user.id}`,
|
||||
JSON.stringify(departments)
|
||||
);
|
||||
await this.cacheManager.set(
|
||||
`admin:perms:${user.id}`,
|
||||
JSON.stringify(perms)
|
||||
);
|
||||
await this.cacheManager.set(`admin:token:${user.id}`, result.token);
|
||||
await this.cacheManager.set(
|
||||
`admin:token:refresh:${user.id}`,
|
||||
result.token
|
||||
);
|
||||
|
||||
return result;
|
||||
} else {
|
||||
throw new CoolCommException('验证码不正确');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证码
|
||||
* @param type 图片验证码类型 svg
|
||||
* @param width 宽
|
||||
* @param height 高
|
||||
*/
|
||||
async captcha(type: string, width = 150, height = 50) {
|
||||
const svg = svgCaptcha.create({
|
||||
ignoreChars: 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM',
|
||||
width,
|
||||
height,
|
||||
});
|
||||
const result = {
|
||||
captchaId: uuid(),
|
||||
data: svg.data.replace(/"/g, "'"),
|
||||
};
|
||||
// 文字变白
|
||||
const rpList = [
|
||||
'#111',
|
||||
'#222',
|
||||
'#333',
|
||||
'#444',
|
||||
'#555',
|
||||
'#666',
|
||||
'#777',
|
||||
'#888',
|
||||
'#999',
|
||||
];
|
||||
rpList.forEach(rp => {
|
||||
result.data = result.data['replaceAll'](rp, '#fff');
|
||||
});
|
||||
if (type === 'base64') {
|
||||
result.data = svgToDataURL(result.data);
|
||||
}
|
||||
// 半小时过期
|
||||
await this.cacheManager.set(
|
||||
`verify:img:${result.captchaId}`,
|
||||
svg.text.toLowerCase(),
|
||||
{ ttl: 1800 }
|
||||
);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 退出登录
|
||||
*/
|
||||
async logout() {
|
||||
const { userId } = this.ctx.admin;
|
||||
await this.cacheManager.del(`admin:department:${userId}`);
|
||||
await this.cacheManager.del(`admin:perms:${userId}`);
|
||||
await this.cacheManager.del(`admin:token:${userId}`);
|
||||
await this.cacheManager.del(`admin:token:refresh:${userId}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检验图片验证码
|
||||
* @param captchaId 验证码ID
|
||||
* @param value 验证码
|
||||
*/
|
||||
async captchaCheck(captchaId, value) {
|
||||
const rv = await this.cacheManager.get(`verify:img:${captchaId}`);
|
||||
if (!rv || !value || value.toLowerCase() !== rv) {
|
||||
return false;
|
||||
} else {
|
||||
this.cacheManager.del(`verify:img:${captchaId}`);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成token
|
||||
* @param user 用户对象
|
||||
* @param roleIds 角色集合
|
||||
* @param expire 过期
|
||||
* @param isRefresh 是否是刷新
|
||||
*/
|
||||
async generateToken(user, roleIds, expire, isRefresh?) {
|
||||
await this.cacheManager.set(
|
||||
`admin:passwordVersion:${user.id}`,
|
||||
user.passwordV
|
||||
);
|
||||
const tokenInfo = {
|
||||
isRefresh: false,
|
||||
roleIds,
|
||||
username: user.username,
|
||||
userId: user.id,
|
||||
passwordVersion: user.passwordV,
|
||||
};
|
||||
if (isRefresh) {
|
||||
tokenInfo.isRefresh = true;
|
||||
}
|
||||
return jwt.sign(tokenInfo, this.coolConfig.jwt.secret, {
|
||||
expiresIn: expire,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 刷新token
|
||||
* @param token
|
||||
*/
|
||||
async refreshToken(token: string) {
|
||||
try {
|
||||
const decoded = jwt.verify(token, this.coolConfig.jwt.secret);
|
||||
if (decoded && decoded['isRefresh']) {
|
||||
delete decoded['exp'];
|
||||
delete decoded['iat'];
|
||||
|
||||
const { expire, refreshExpire } = this.coolConfig.jwt.token;
|
||||
decoded['isRefresh'] = false;
|
||||
const result = {
|
||||
expire,
|
||||
token: jwt.sign(decoded, this.coolConfig.jwt.secret, {
|
||||
expiresIn: expire,
|
||||
}),
|
||||
refreshExpire,
|
||||
refreshToken: '',
|
||||
};
|
||||
decoded['isRefresh'] = true;
|
||||
result.refreshToken = jwt.sign(decoded, this.coolConfig.jwt.secret, {
|
||||
expiresIn: refreshExpire,
|
||||
});
|
||||
await this.cacheManager.set(
|
||||
`admin:passwordVersion:${decoded['userId']}`,
|
||||
decoded['passwordVersion']
|
||||
);
|
||||
return result;
|
||||
}
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
this.ctx.status = 401;
|
||||
this.ctx.body = {
|
||||
code: RESCODE.COMMFAIL,
|
||||
message: '登录失效~',
|
||||
};
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,165 @@
|
|||
import { Inject, Provide } from '@midwayjs/decorator';
|
||||
import { BaseService } from '@cool-midway/core';
|
||||
import { InjectEntityModel } from '@midwayjs/orm';
|
||||
import { Repository } from 'typeorm';
|
||||
import { BaseSysMenuEntity } from '../../entity/sys/menu';
|
||||
import * as _ from 'lodash';
|
||||
import { BaseSysPermsService } from './perms';
|
||||
import { Context } from '@midwayjs/koa';
|
||||
|
||||
/**
|
||||
* 菜单
|
||||
*/
|
||||
@Provide()
|
||||
export class BaseSysMenuService extends BaseService {
|
||||
@Inject()
|
||||
ctx: Context;
|
||||
|
||||
@InjectEntityModel(BaseSysMenuEntity)
|
||||
baseSysMenuEntity: Repository<BaseSysMenuEntity>;
|
||||
|
||||
@Inject()
|
||||
baseSysPermsService: BaseSysPermsService;
|
||||
|
||||
/**
|
||||
* 获得所有菜单
|
||||
*/
|
||||
async list() {
|
||||
const menus = await this.getMenus(
|
||||
this.ctx.admin.roleIds,
|
||||
this.ctx.admin.username === 'admin'
|
||||
);
|
||||
if (!_.isEmpty(menus)) {
|
||||
menus.forEach(e => {
|
||||
const parentMenu = menus.filter(m => {
|
||||
e.parentId = parseInt(e.parentId);
|
||||
if (e.parentId == m.id) {
|
||||
return m.name;
|
||||
}
|
||||
});
|
||||
if (!_.isEmpty(parentMenu)) {
|
||||
e.parentName = parentMenu[0].name;
|
||||
}
|
||||
});
|
||||
}
|
||||
return menus;
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改之后
|
||||
* @param param
|
||||
*/
|
||||
async modifyAfter(param) {
|
||||
if (param.id) {
|
||||
await this.refreshPerms(param.id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据角色获得权限信息
|
||||
* @param {[]} roleIds 数组
|
||||
*/
|
||||
async getPerms(roleIds) {
|
||||
let perms = [];
|
||||
if (!_.isEmpty(roleIds)) {
|
||||
const result = await this.nativeQuery(
|
||||
`SELECT a.perms FROM base_sys_menu a ${this.setSql(
|
||||
!roleIds.includes('1'),
|
||||
'JOIN base_sys_role_menu b on a.id = b.menuId AND b.roleId in (?)',
|
||||
[roleIds]
|
||||
)}
|
||||
where 1=1 and a.perms is not NULL
|
||||
`,
|
||||
[roleIds]
|
||||
);
|
||||
if (result) {
|
||||
result.forEach(d => {
|
||||
if (d.perms) {
|
||||
perms = perms.concat(d.perms.split(','));
|
||||
}
|
||||
});
|
||||
}
|
||||
perms = _.uniq(perms);
|
||||
perms = _.remove(perms, n => {
|
||||
return !_.isEmpty(n);
|
||||
});
|
||||
}
|
||||
return _.uniq(perms);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获得用户菜单信息
|
||||
* @param roleIds
|
||||
* @param isAdmin 是否是超管
|
||||
*/
|
||||
async getMenus(roleIds, isAdmin) {
|
||||
return await this.nativeQuery(`
|
||||
SELECT
|
||||
a.*
|
||||
FROM
|
||||
base_sys_menu a
|
||||
${this.setSql(
|
||||
!isAdmin,
|
||||
'JOIN base_sys_role_menu b on a.id = b.menuId AND b.roleId in (?)',
|
||||
[roleIds]
|
||||
)}
|
||||
GROUP BY a.id
|
||||
ORDER BY
|
||||
orderNum ASC`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除
|
||||
* @param ids
|
||||
*/
|
||||
async delete(ids) {
|
||||
let idArr;
|
||||
if (ids instanceof Array) {
|
||||
idArr = ids;
|
||||
} else {
|
||||
idArr = ids.split(',');
|
||||
}
|
||||
for (const id of idArr) {
|
||||
await this.baseSysMenuEntity.delete({ id });
|
||||
await this.delChildMenu(id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除子菜单
|
||||
* @param id
|
||||
*/
|
||||
private async delChildMenu(id) {
|
||||
await this.refreshPerms(id);
|
||||
const delMenu = await this.baseSysMenuEntity.find({ parentId: id });
|
||||
if (_.isEmpty(delMenu)) {
|
||||
return;
|
||||
}
|
||||
const delMenuIds = delMenu.map(e => {
|
||||
return e.id;
|
||||
});
|
||||
await this.baseSysMenuEntity.delete(delMenuIds);
|
||||
for (const menuId of delMenuIds) {
|
||||
await this.delChildMenu(menuId);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新权限
|
||||
* @param menuId
|
||||
*/
|
||||
async refreshPerms(menuId) {
|
||||
const users = await this.nativeQuery(
|
||||
'select b.userId from base_sys_role_menu a left join base_sys_user_role b on a.roleId = b.roleId where a.menuId = ? group by b.userId',
|
||||
[menuId]
|
||||
);
|
||||
// 刷新admin权限
|
||||
await this.baseSysPermsService.refreshPerms(1);
|
||||
if (!_.isEmpty(users)) {
|
||||
// 刷新其他权限
|
||||
for (const user of users) {
|
||||
await this.baseSysPermsService.refreshPerms(user.userId);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,69 @@
|
|||
import { Inject, Provide } from '@midwayjs/decorator';
|
||||
import { BaseService } from '@cool-midway/core';
|
||||
import { InjectEntityModel } from '@midwayjs/orm';
|
||||
import { Repository } from 'typeorm';
|
||||
import { BaseSysParamEntity } from '../../entity/sys/param';
|
||||
import { CacheManager } from '@midwayjs/cache';
|
||||
|
||||
/**
|
||||
* 参数配置
|
||||
*/
|
||||
@Provide()
|
||||
export class BaseSysParamService extends BaseService {
|
||||
@InjectEntityModel(BaseSysParamEntity)
|
||||
baseSysParamEntity: Repository<BaseSysParamEntity>;
|
||||
|
||||
@Inject()
|
||||
cacheManager: CacheManager;
|
||||
|
||||
/**
|
||||
* 根据key获得对应的参数
|
||||
* @param key
|
||||
*/
|
||||
async dataByKey(key) {
|
||||
let result: any = await this.cacheManager.get(`param:${key}`);
|
||||
if (!result) {
|
||||
result = await this.baseSysParamEntity.findOne({ keyName: key });
|
||||
}
|
||||
if (result) {
|
||||
if (typeof result == 'string') {
|
||||
result = JSON.parse(result);
|
||||
}
|
||||
if (result.dataType !== 0) {
|
||||
return JSON.parse(result.data);
|
||||
} else {
|
||||
return result.data;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据key获得对应的网页数据
|
||||
* @param key
|
||||
*/
|
||||
async htmlByKey(key) {
|
||||
let html = '<html><body>@content</body></html>';
|
||||
let result: any = await this.cacheManager.get(`param:${key}`);
|
||||
if (result) {
|
||||
result = JSON.parse(result);
|
||||
html = html.replace('@content', result.data);
|
||||
} else {
|
||||
html = html.replace('@content', 'key notfound');
|
||||
}
|
||||
return html;
|
||||
}
|
||||
|
||||
/**
|
||||
* 重新初始化缓存
|
||||
*/
|
||||
async modifyAfter() {
|
||||
const params = await this.baseSysParamEntity.find();
|
||||
for (const param of params) {
|
||||
await this.cacheManager.set(
|
||||
`param:${param.keyName}`,
|
||||
JSON.stringify(param)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,76 @@
|
|||
import { Inject, Provide } from '@midwayjs/decorator';
|
||||
import { BaseService } from '@cool-midway/core';
|
||||
import { BaseSysMenuService } from './menu';
|
||||
import { BaseSysRoleService } from './role';
|
||||
import { BaseSysDepartmentService } from './department';
|
||||
import { Context } from '@midwayjs/koa';
|
||||
import { CacheManager } from '@midwayjs/cache';
|
||||
|
||||
/**
|
||||
* 权限
|
||||
*/
|
||||
@Provide()
|
||||
export class BaseSysPermsService extends BaseService {
|
||||
@Inject()
|
||||
cacheManager: CacheManager;
|
||||
|
||||
@Inject()
|
||||
baseSysMenuService: BaseSysMenuService;
|
||||
|
||||
@Inject()
|
||||
baseSysRoleService: BaseSysRoleService;
|
||||
|
||||
@Inject()
|
||||
baseSysDepartmentService: BaseSysDepartmentService;
|
||||
|
||||
@Inject()
|
||||
ctx: Context;
|
||||
|
||||
/**
|
||||
* 刷新权限
|
||||
* @param userId 用户ID
|
||||
*/
|
||||
async refreshPerms(userId) {
|
||||
const roleIds = await this.baseSysRoleService.getByUser(userId);
|
||||
const perms = await this.baseSysMenuService.getPerms(roleIds);
|
||||
await this.cacheManager.set(`admin:perms:${userId}`, JSON.stringify(perms));
|
||||
// 更新部门权限
|
||||
const departments = await this.baseSysDepartmentService.getByRoleIds(
|
||||
roleIds,
|
||||
this.ctx.admin.username === 'admin'
|
||||
);
|
||||
await this.cacheManager.set(
|
||||
`admin:department:${userId}`,
|
||||
JSON.stringify(departments)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获得权限菜单
|
||||
* @param roleIds
|
||||
*/
|
||||
async permmenu(roleIds: number[]) {
|
||||
const perms = await this.baseSysMenuService.getPerms(roleIds);
|
||||
const menus = await this.baseSysMenuService.getMenus(
|
||||
roleIds,
|
||||
this.ctx.admin.username === 'admin'
|
||||
);
|
||||
return { perms, menus };
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据用户ID获得部门权限
|
||||
* @param userId
|
||||
* @return 部门ID数组
|
||||
*/
|
||||
async departmentIds(userId: number) {
|
||||
const department: any = await this.cacheManager.get(
|
||||
`admin:department:${userId}`
|
||||
);
|
||||
if (department) {
|
||||
return JSON.parse(department);
|
||||
} else {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,126 @@
|
|||
import { Inject, Provide } from '@midwayjs/decorator';
|
||||
import { BaseService } from '@cool-midway/core';
|
||||
import { InjectEntityModel } from '@midwayjs/orm';
|
||||
import { Repository } from 'typeorm';
|
||||
import { BaseSysRoleEntity } from '../../entity/sys/role';
|
||||
import { BaseSysUserRoleEntity } from '../../entity/sys/user_role';
|
||||
import * as _ from 'lodash';
|
||||
import { BaseSysRoleMenuEntity } from '../../entity/sys/role_menu';
|
||||
import { BaseSysRoleDepartmentEntity } from '../../entity/sys/role_department';
|
||||
import { BaseSysPermsService } from './perms';
|
||||
import { Brackets } from 'typeorm';
|
||||
|
||||
/**
|
||||
* 角色
|
||||
*/
|
||||
@Provide()
|
||||
export class BaseSysRoleService extends BaseService {
|
||||
@InjectEntityModel(BaseSysRoleEntity)
|
||||
baseSysRoleEntity: Repository<BaseSysRoleEntity>;
|
||||
|
||||
@InjectEntityModel(BaseSysUserRoleEntity)
|
||||
baseSysUserRoleEntity: Repository<BaseSysUserRoleEntity>;
|
||||
|
||||
@InjectEntityModel(BaseSysRoleMenuEntity)
|
||||
baseSysRoleMenuEntity: Repository<BaseSysRoleMenuEntity>;
|
||||
|
||||
@InjectEntityModel(BaseSysRoleDepartmentEntity)
|
||||
baseSysRoleDepartmentEntity: Repository<BaseSysRoleDepartmentEntity>;
|
||||
|
||||
@Inject()
|
||||
baseSysPermsService: BaseSysPermsService;
|
||||
|
||||
/**
|
||||
* 根据用户ID获得所有用户角色
|
||||
* @param userId
|
||||
*/
|
||||
async getByUser(userId: number): Promise<number[]> {
|
||||
const userRole = await this.baseSysUserRoleEntity.find({ userId });
|
||||
if (!_.isEmpty(userRole)) {
|
||||
return userRole.map(e => {
|
||||
return e.roleId;
|
||||
});
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param param
|
||||
*/
|
||||
async modifyAfter(param) {
|
||||
if (param.id) {
|
||||
this.updatePerms(param.id, param.menuIdList, param.departmentIdList);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新权限
|
||||
* @param roleId
|
||||
* @param menuIdList
|
||||
* @param departmentIds
|
||||
*/
|
||||
async updatePerms(roleId, menuIdList?, departmentIds = []) {
|
||||
// 更新菜单权限
|
||||
await this.baseSysRoleMenuEntity.delete({ roleId });
|
||||
for (const e of menuIdList) {
|
||||
await this.baseSysRoleMenuEntity.save({ roleId, menuId: e });
|
||||
}
|
||||
// 更新部门权限
|
||||
await this.baseSysRoleDepartmentEntity.delete({ roleId });
|
||||
for (const departmentId of departmentIds) {
|
||||
await this.baseSysRoleDepartmentEntity.save({ roleId, departmentId });
|
||||
}
|
||||
// 刷新权限
|
||||
const userRoles = await this.baseSysUserRoleEntity.find({ roleId });
|
||||
for (const userRole of userRoles) {
|
||||
await this.baseSysPermsService.refreshPerms(userRole.userId);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 角色信息
|
||||
* @param id
|
||||
*/
|
||||
async info(id) {
|
||||
const info = await this.baseSysRoleEntity.findOne({ id });
|
||||
if (info) {
|
||||
const menus = await this.baseSysRoleMenuEntity.find(
|
||||
id !== 1 ? { roleId: id } : {}
|
||||
);
|
||||
const menuIdList = menus.map(e => {
|
||||
return parseInt(e.menuId + '');
|
||||
});
|
||||
const departments = await this.baseSysRoleDepartmentEntity.find(
|
||||
id !== 1 ? { roleId: id } : {}
|
||||
);
|
||||
const departmentIdList = departments.map(e => {
|
||||
return parseInt(e.departmentId + '');
|
||||
});
|
||||
return {
|
||||
...info,
|
||||
menuIdList,
|
||||
departmentIdList,
|
||||
};
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
||||
async list() {
|
||||
return this.baseSysRoleEntity
|
||||
.createQueryBuilder()
|
||||
.where(
|
||||
new Brackets(qb => {
|
||||
qb.where('id !=:id', { id: 1 }); // 超级管理员的角色不展示
|
||||
// 如果不是超管,只能看到自己新建的或者自己有的角色
|
||||
if (this.ctx.admin.username !== 'admin') {
|
||||
qb.andWhere('(userId=:userId or id in (:roleId))', {
|
||||
userId: this.ctx.admin.userId,
|
||||
roleId: this.ctx.admin.roleIds,
|
||||
});
|
||||
}
|
||||
})
|
||||
)
|
||||
.getMany();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,223 @@
|
|||
import { Inject, Provide } from '@midwayjs/decorator';
|
||||
import { BaseService, CoolCommException } from '@cool-midway/core';
|
||||
import { InjectEntityModel } from '@midwayjs/orm';
|
||||
import { Repository } from 'typeorm';
|
||||
import { BaseSysUserEntity } from '../../entity/sys/user';
|
||||
import { BaseSysPermsService } from './perms';
|
||||
import * as _ from 'lodash';
|
||||
import { BaseSysUserRoleEntity } from '../../entity/sys/user_role';
|
||||
import * as md5 from 'md5';
|
||||
import { BaseSysDepartmentEntity } from '../../entity/sys/department';
|
||||
import { CacheManager } from '@midwayjs/cache';
|
||||
|
||||
/**
|
||||
* 系统用户
|
||||
*/
|
||||
@Provide()
|
||||
export class BaseSysUserService extends BaseService {
|
||||
@InjectEntityModel(BaseSysUserEntity)
|
||||
baseSysUserEntity: Repository<BaseSysUserEntity>;
|
||||
|
||||
@InjectEntityModel(BaseSysUserRoleEntity)
|
||||
baseSysUserRoleEntity: Repository<BaseSysUserRoleEntity>;
|
||||
|
||||
@InjectEntityModel(BaseSysDepartmentEntity)
|
||||
baseSysDepartmentEntity: Repository<BaseSysDepartmentEntity>;
|
||||
|
||||
@Inject()
|
||||
cacheManager: CacheManager;
|
||||
|
||||
@Inject()
|
||||
baseSysPermsService: BaseSysPermsService;
|
||||
|
||||
@Inject()
|
||||
ctx;
|
||||
|
||||
/**
|
||||
* 分页查询
|
||||
* @param query
|
||||
*/
|
||||
async page(query) {
|
||||
const { keyWord, status, departmentIds = [] } = query;
|
||||
const permsDepartmentArr = await this.baseSysPermsService.departmentIds(
|
||||
this.ctx.admin.userId
|
||||
); // 部门权限
|
||||
const sql = `
|
||||
SELECT
|
||||
a.id,a.name,a.nickName,a.headImg,a.email,a.remark,a.status,a.createTime,a.updateTime,a.username,a.phone,a.departmentId,
|
||||
GROUP_CONCAT(c.name) AS roleName,
|
||||
d.name as departmentName
|
||||
FROM
|
||||
base_sys_user a
|
||||
LEFT JOIN base_sys_user_role b ON a.id = b.userId
|
||||
LEFT JOIN base_sys_role c ON b.roleId = c.id
|
||||
LEFT JOIN base_sys_department d on a.departmentId = d.id
|
||||
WHERE 1 = 1
|
||||
${this.setSql(
|
||||
!_.isEmpty(departmentIds),
|
||||
'and a.departmentId in (?)',
|
||||
[departmentIds]
|
||||
)}
|
||||
${this.setSql(status, 'and a.status = ?', [status])}
|
||||
${this.setSql(keyWord, 'and (a.name LIKE ? or a.username LIKE ?)', [
|
||||
`%${keyWord}%`,
|
||||
`%${keyWord}%`,
|
||||
])}
|
||||
${this.setSql(true, 'and a.username != ?', ['admin'])}
|
||||
${this.setSql(
|
||||
this.ctx.admin.username !== 'admin',
|
||||
'and a.departmentId in (?)',
|
||||
[!_.isEmpty(permsDepartmentArr) ? permsDepartmentArr : [null]]
|
||||
)}
|
||||
GROUP BY a.id
|
||||
`;
|
||||
return this.sqlRenderPage(sql, query);
|
||||
}
|
||||
|
||||
/**
|
||||
* 移动部门
|
||||
* @param departmentId
|
||||
* @param userIds
|
||||
*/
|
||||
async move(departmentId, userIds) {
|
||||
await this.baseSysUserEntity
|
||||
.createQueryBuilder()
|
||||
.update()
|
||||
.set({ departmentId })
|
||||
.where('id in (:userIds)', { userIds })
|
||||
.execute();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获得个人信息
|
||||
*/
|
||||
async person() {
|
||||
const info = await this.baseSysUserEntity.findOne({
|
||||
id: this.ctx.admin?.userId,
|
||||
});
|
||||
delete info?.password;
|
||||
return info;
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新用户角色关系
|
||||
* @param user
|
||||
*/
|
||||
async updateUserRole(user) {
|
||||
if (user.username === 'admin') {
|
||||
throw new CoolCommException('非法操作~');
|
||||
}
|
||||
await this.baseSysUserRoleEntity.delete({ userId: user.id });
|
||||
if (user.roleIdList) {
|
||||
for (const roleId of user.roleIdList) {
|
||||
await this.baseSysUserRoleEntity.save({ userId: user.id, roleId });
|
||||
}
|
||||
}
|
||||
await this.baseSysPermsService.refreshPerms(user.id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增
|
||||
* @param param
|
||||
*/
|
||||
async add(param) {
|
||||
const exists = await this.baseSysUserEntity.findOne({
|
||||
username: param.username,
|
||||
});
|
||||
if (!_.isEmpty(exists)) {
|
||||
throw new CoolCommException('用户名已经存在~');
|
||||
}
|
||||
param.password = md5(param.password);
|
||||
await this.baseSysUserEntity.save(param);
|
||||
await this.updateUserRole(param);
|
||||
return param.id;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据ID获得信息
|
||||
* @param id
|
||||
*/
|
||||
public async info(id) {
|
||||
const info = await this.baseSysUserEntity.findOne({ id });
|
||||
const userRoles = await this.nativeQuery(
|
||||
'select a.roleId from base_sys_user_role a where a.userId = ?',
|
||||
[id]
|
||||
);
|
||||
const department = await this.baseSysDepartmentEntity.findOne({
|
||||
id: info.departmentId,
|
||||
});
|
||||
if (info) {
|
||||
delete info.password;
|
||||
if (userRoles) {
|
||||
info.roleIdList = userRoles.map(e => {
|
||||
return parseInt(e.roleId);
|
||||
});
|
||||
}
|
||||
}
|
||||
delete info.password;
|
||||
if (department) {
|
||||
info.departmentName = department.name;
|
||||
}
|
||||
return info;
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改个人信息
|
||||
* @param param
|
||||
*/
|
||||
public async personUpdate(param) {
|
||||
param.id = this.ctx.admin.userId;
|
||||
if (!_.isEmpty(param.password)) {
|
||||
param.password = md5(param.password);
|
||||
const userInfo = await this.baseSysUserEntity.findOne({ id: param.id });
|
||||
if (!userInfo) {
|
||||
throw new CoolCommException('用户不存在');
|
||||
}
|
||||
param.passwordV = userInfo.passwordV + 1;
|
||||
await this.cacheManager.set(
|
||||
`admin:passwordVersion:${param.id}`,
|
||||
param.passwordV
|
||||
);
|
||||
} else {
|
||||
delete param.password;
|
||||
}
|
||||
await this.baseSysUserEntity.save(param);
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改
|
||||
* @param param 数据
|
||||
*/
|
||||
async update(param) {
|
||||
if (param.id && param.username === 'admin') {
|
||||
throw new CoolCommException('非法操作~');
|
||||
}
|
||||
if (!_.isEmpty(param.password)) {
|
||||
param.password = md5(param.password);
|
||||
const userInfo = await this.baseSysUserEntity.findOne({ id: param.id });
|
||||
if (!userInfo) {
|
||||
throw new CoolCommException('用户不存在');
|
||||
}
|
||||
param.passwordV = userInfo.passwordV + 1;
|
||||
await this.cacheManager.set(
|
||||
`admin:passwordVersion:${param.id}`,
|
||||
param.passwordV
|
||||
);
|
||||
} else {
|
||||
delete param.password;
|
||||
}
|
||||
if (param.status === 0) {
|
||||
await this.forbidden(param.id);
|
||||
}
|
||||
await this.baseSysUserEntity.save(param);
|
||||
await this.updateUserRole(param);
|
||||
}
|
||||
|
||||
/**
|
||||
* 禁用用户
|
||||
* @param userId
|
||||
*/
|
||||
async forbidden(userId) {
|
||||
await this.cacheManager.del(`admin:token:${userId}`);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
import { ModuleConfig } from '@cool-midway/core';
|
||||
import { DemoMiddleware } from './middleware/demo';
|
||||
|
||||
/**
|
||||
* 模块配置
|
||||
*/
|
||||
export default () => {
|
||||
return {
|
||||
// 模块名称
|
||||
name: 'xxx',
|
||||
// 模块描述
|
||||
description: 'xxx',
|
||||
// 中间件,只对本模块有效
|
||||
middlewares: [DemoMiddleware],
|
||||
// 中间件,全局有效
|
||||
globalMiddlewares: [],
|
||||
// 模块加载顺序,默认为0,值越大越优先加载
|
||||
order: 0,
|
||||
// 其他配置
|
||||
a: 1,
|
||||
} as ModuleConfig;
|
||||
};
|
|
@ -0,0 +1,11 @@
|
|||
import { DemoGoodsEntity } from '../../entity/goods';
|
||||
import { BaseController, CoolController } from '@cool-midway/core';
|
||||
|
||||
/**
|
||||
* 测试
|
||||
*/
|
||||
@CoolController({
|
||||
api: ['add', 'delete', 'update', 'info', 'page', 'list'],
|
||||
entity: DemoGoodsEntity,
|
||||
})
|
||||
export class CoolGoodsController extends BaseController {}
|
|
@ -0,0 +1,28 @@
|
|||
import { DemoCacheService } from './../../service/cache';
|
||||
import { Inject, Post, Provide, Get } from '@midwayjs/decorator';
|
||||
import { CoolController, BaseController } from '@cool-midway/core';
|
||||
import { CacheManager } from '@midwayjs/cache';
|
||||
|
||||
/**
|
||||
* 缓存
|
||||
*/
|
||||
@Provide()
|
||||
@CoolController()
|
||||
export class AppDemoCacheController extends BaseController {
|
||||
@Inject()
|
||||
cacheManager: CacheManager;
|
||||
|
||||
@Inject()
|
||||
demoCacheService: DemoCacheService;
|
||||
|
||||
@Post('/set')
|
||||
async set() {
|
||||
this.cacheManager.set('a', 1);
|
||||
return this.ok(await this.cacheManager.get('a'));
|
||||
}
|
||||
|
||||
@Get('/get')
|
||||
async get() {
|
||||
return this.ok(await this.demoCacheService.get());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
import { Config, Get, Provide } from '@midwayjs/decorator';
|
||||
import { CoolController, BaseController } from '@cool-midway/core';
|
||||
|
||||
/**
|
||||
* 配置
|
||||
*/
|
||||
@Provide()
|
||||
@CoolController()
|
||||
export class DemoConfigController extends BaseController {
|
||||
//获得模块配置,格式: module.模块名,模块文件夹名称,如demo
|
||||
@Config('module.demo')
|
||||
demoConfig;
|
||||
|
||||
@Get('/get')
|
||||
async get() {
|
||||
return this.ok(this.demoConfig);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
import { Inject, Post, Provide } from '@midwayjs/decorator';
|
||||
import { CoolController, BaseController } from '@cool-midway/core';
|
||||
import { TestEsIndex } from '../../es/test';
|
||||
|
||||
/**
|
||||
* elasticsearch
|
||||
*/
|
||||
@Provide()
|
||||
@CoolController()
|
||||
export class AppDemoEsController extends BaseController {
|
||||
@Inject()
|
||||
testEsIndex: TestEsIndex;
|
||||
|
||||
@Post('/test')
|
||||
async test() {
|
||||
// 新增与修改
|
||||
await this.testEsIndex.upsert({
|
||||
name: '啊平',
|
||||
age: 18,
|
||||
});
|
||||
return this.ok(await this.testEsIndex.find());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
import { Inject, Post, Provide } from '@midwayjs/decorator';
|
||||
import {
|
||||
CoolController,
|
||||
BaseController,
|
||||
CoolEventManager,
|
||||
} from '@cool-midway/core';
|
||||
|
||||
/**
|
||||
* 事件
|
||||
*/
|
||||
@Provide()
|
||||
@CoolController()
|
||||
export class AppDemoEventController extends BaseController {
|
||||
@Inject()
|
||||
coolEventManager: CoolEventManager;
|
||||
|
||||
@Post('/send')
|
||||
async send() {
|
||||
await this.coolEventManager.emit('demo', { a: 1 }, 1);
|
||||
return this.ok();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
import { Get, Inject, Post, Provide } from '@midwayjs/decorator';
|
||||
import { CoolController, BaseController } from '@cool-midway/core';
|
||||
import { Context } from 'koa';
|
||||
import { CoolFile } from '@cool-midway/file';
|
||||
|
||||
/**
|
||||
* 文件上传
|
||||
*/
|
||||
@Provide()
|
||||
@CoolController()
|
||||
export class AppDemoFileController extends BaseController {
|
||||
@Inject()
|
||||
ctx: Context;
|
||||
|
||||
@Inject()
|
||||
file: CoolFile;
|
||||
|
||||
@Post('/upload', { summary: '文件上传' })
|
||||
async uplod() {
|
||||
return this.ok(await this.file.upload(this.ctx));
|
||||
}
|
||||
|
||||
@Get('/uploadMode', { summary: '获得上传模式' })
|
||||
async uploadMode() {
|
||||
return this.ok(await this.file.getMode());
|
||||
}
|
||||
|
||||
@Post('/downAndUpload', { summary: '下载并上传' })
|
||||
async downAndUpload() {
|
||||
return this.ok(
|
||||
await this.file.downAndUpload('https://cool-js.com/notice.png')
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
import { DemoGoodsEntity } from '../../entity/goods';
|
||||
import { BaseController, CoolController } from '@cool-midway/core';
|
||||
import { DemoGoodsService } from '../../service/goods';
|
||||
|
||||
/**
|
||||
* 测试
|
||||
*/
|
||||
@CoolController({
|
||||
api: ['add', 'delete', 'update', 'info', 'page', 'list'],
|
||||
entity: DemoGoodsEntity,
|
||||
service: DemoGoodsService,
|
||||
})
|
||||
export class CoolGoodsController extends BaseController {}
|
|
@ -0,0 +1,108 @@
|
|||
import { ALL, App, Body, Inject, Post, Provide } from '@midwayjs/decorator';
|
||||
import { CoolController, BaseController } from '@cool-midway/core';
|
||||
import { CoolWxPay, CoolAliPay } from '@cool-midway/pay';
|
||||
import { parseString } from 'xml2js';
|
||||
import { Context } from '@midwayjs/koa';
|
||||
import { IMidwayApplication } from '@midwayjs/core';
|
||||
|
||||
/**
|
||||
* 支付示例
|
||||
*/
|
||||
@Provide()
|
||||
@CoolController()
|
||||
export class DemoPayController extends BaseController {
|
||||
// 微信支付
|
||||
@Inject()
|
||||
wxPay: CoolWxPay;
|
||||
|
||||
// 支付宝支付
|
||||
@Inject()
|
||||
aliPay: CoolAliPay;
|
||||
|
||||
@Inject()
|
||||
ctx: Context;
|
||||
|
||||
@App()
|
||||
app: IMidwayApplication;
|
||||
|
||||
/**
|
||||
* 微信扫码支付
|
||||
*/
|
||||
@Post('/wx')
|
||||
async wx() {
|
||||
const orderNum = await this.wxPay.createOrderNum();
|
||||
const data = await this.wxPay.getInstance().unifiedOrder({
|
||||
out_trade_no: orderNum,
|
||||
body: '测试微信支付',
|
||||
total_fee: 1,
|
||||
trade_type: 'NATIVE',
|
||||
product_id: 'test001',
|
||||
});
|
||||
return this.ok(data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 微信支付通知回调
|
||||
*/
|
||||
@Post('/wxNotify')
|
||||
async wxNotify() {
|
||||
let data = '';
|
||||
this.ctx.req.setEncoding('utf8');
|
||||
this.ctx.req.on('data', chunk => {
|
||||
data += chunk;
|
||||
});
|
||||
const results = await new Promise((resolve, reject) => {
|
||||
this.ctx.req.on('end', () => {
|
||||
parseString(data, { explicitArray: false }, async (err, json) => {
|
||||
if (err) {
|
||||
return reject('success');
|
||||
}
|
||||
const checkSign = await this.wxPay.signVerify(json.xml);
|
||||
if (checkSign && json.xml.result_code === 'SUCCESS') {
|
||||
// 处理业务逻辑
|
||||
console.log('微信支付成功', json.xml);
|
||||
return resolve(true);
|
||||
}
|
||||
return resolve(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
if (results) {
|
||||
this.ctx.body =
|
||||
'<xml><return_msg>OK</return_msg><return_code>SUCCESS</return_code></xml>';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 支付宝app支付
|
||||
* @returns
|
||||
*/
|
||||
@Post('/alipay')
|
||||
async alipay() {
|
||||
const orderNum = await this.aliPay.createOrderNum();
|
||||
// app支付
|
||||
const params = await this.aliPay.getInstance().appPay({
|
||||
subject: '测试商品',
|
||||
body: '测试商品描述',
|
||||
outTradeId: orderNum,
|
||||
timeout: '10m',
|
||||
amount: '10.00',
|
||||
goodsType: '0',
|
||||
});
|
||||
return this.ok(params);
|
||||
}
|
||||
|
||||
/**
|
||||
* 支付宝支付回调
|
||||
*/
|
||||
@Post('/aliNotify')
|
||||
async aliNotify(@Body(ALL) body: any) {
|
||||
const { trade_status, out_trade_no } = body;
|
||||
const check = await this.aliPay.signVerify(body);
|
||||
if (check && trade_status === 'TRADE_SUCCESS') {
|
||||
// 处理逻辑
|
||||
console.log('支付宝支付成功', out_trade_no);
|
||||
}
|
||||
this.ctx.body = 'success';
|
||||
}
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
import { Get, Inject, Post, Provide } from '@midwayjs/decorator';
|
||||
import { CoolController, BaseController } from '@cool-midway/core';
|
||||
import { DemoCommQueue } from '../../queue/comm';
|
||||
import { DemoGetterQueue } from '../../queue/getter';
|
||||
|
||||
/**
|
||||
* 队列
|
||||
*/
|
||||
@Provide()
|
||||
@CoolController()
|
||||
export class DemoQueueController extends BaseController {
|
||||
// 普通队列
|
||||
@Inject()
|
||||
demoCommQueue: DemoCommQueue;
|
||||
|
||||
// 主动消费队列
|
||||
@Inject()
|
||||
demoGetterQueue: DemoGetterQueue;
|
||||
|
||||
/**
|
||||
* 发送数据到队列
|
||||
*/
|
||||
@Post('/add', { summary: '发送队列数据' })
|
||||
async queue() {
|
||||
this.demoCommQueue.add({ a: 2 });
|
||||
return this.ok();
|
||||
}
|
||||
|
||||
@Post('/addGetter')
|
||||
async addGetter() {
|
||||
await this.demoGetterQueue.add({ a: new Date() });
|
||||
return this.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获得队列中的数据,只有当队列类型为getter时有效
|
||||
*/
|
||||
@Get('/getter')
|
||||
async getter() {
|
||||
const job = await this.demoGetterQueue.getters.getJobs(
|
||||
['wait'],
|
||||
0,
|
||||
0,
|
||||
true
|
||||
);
|
||||
// 获得完将数据从队列移除
|
||||
await job[0]?.remove();
|
||||
return this.ok(job[0]?.data);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
import { Param, Post, Provide } from '@midwayjs/decorator';
|
||||
import { CoolController, BaseController } from '@cool-midway/core';
|
||||
|
||||
/**
|
||||
* swagger 文档
|
||||
*/
|
||||
@Provide()
|
||||
@CoolController(null, {
|
||||
tagName: 'swagger demo',
|
||||
})
|
||||
export class AppSwaggerController extends BaseController {
|
||||
@Post('/create', { summary: '创建' })
|
||||
async create(@Param('id') id: number) {
|
||||
return this.ok(id);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
import { EntityModel } from '@midwayjs/orm';
|
||||
import { BaseEntity } from '@cool-midway/core';
|
||||
import { Column } from 'typeorm';
|
||||
|
||||
/**
|
||||
* 商品
|
||||
*/
|
||||
@EntityModel('demo_goods')
|
||||
export class DemoGoodsEntity extends BaseEntity {
|
||||
@Column({ comment: '标题' })
|
||||
title: string;
|
||||
|
||||
@Column({ comment: '图片' })
|
||||
pic: string;
|
||||
|
||||
@Column({ comment: '价格', type: 'decimal', precision: 5, scale: 2 })
|
||||
price: number;
|
||||
|
||||
@Column({ comment: '分类', type: 'tinyint', default: 0 })
|
||||
type: number;
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
import { CoolEsIndex, ICoolEs, BaseEsIndex } from '@cool-midway/es';
|
||||
|
||||
/**
|
||||
* 测试索引
|
||||
*/
|
||||
@CoolEsIndex('test')
|
||||
export class TestEsIndex extends BaseEsIndex implements ICoolEs {
|
||||
indexInfo() {
|
||||
return {
|
||||
name: {
|
||||
type: 'text',
|
||||
},
|
||||
age: {
|
||||
type: 'long',
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
import { Provide, Scope, ScopeEnum } from '@midwayjs/decorator';
|
||||
import { CoolEvent, Event } from '@cool-midway/core';
|
||||
|
||||
/**
|
||||
* 接收事件
|
||||
*/
|
||||
@Provide()
|
||||
@Scope(ScopeEnum.Singleton)
|
||||
@CoolEvent()
|
||||
export class DemoEvent {
|
||||
/**
|
||||
* 根据事件名接收事件
|
||||
* @param msg
|
||||
* @param a
|
||||
*/
|
||||
@Event('demo')
|
||||
async updatdemoeUser(msg, a) {
|
||||
console.log('收到消息', msg, a);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
import { IMiddleware } from '@midwayjs/core';
|
||||
import { Middleware } from '@midwayjs/decorator';
|
||||
import { NextFunction, Context } from '@midwayjs/koa';
|
||||
|
||||
@Middleware()
|
||||
export class DemoMiddleware implements IMiddleware<Context, NextFunction> {
|
||||
resolve() {
|
||||
return async (ctx: Context, next: NextFunction) => {
|
||||
// 控制器前执行的逻辑
|
||||
const startTime = Date.now();
|
||||
// 执行下一个 Web 中间件,最后执行到控制器
|
||||
// 这里可以拿到下一个中间件或者控制器的返回值
|
||||
const result = await next();
|
||||
// 控制器之后执行的逻辑
|
||||
console.log(Date.now() - startTime);
|
||||
// 返回给上一个中间件的结果
|
||||
return result;
|
||||
};
|
||||
}
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
import { BaseCoolQueue, CoolQueue } from '@cool-midway/task';
|
||||
import { IMidwayApplication } from '@midwayjs/core';
|
||||
import { App } from '@midwayjs/decorator';
|
||||
|
||||
/**
|
||||
* 普通队列
|
||||
*/
|
||||
@CoolQueue()
|
||||
export class DemoCommQueue extends BaseCoolQueue {
|
||||
@App()
|
||||
app: IMidwayApplication;
|
||||
|
||||
async data(job: any, done: any): Promise<void> {
|
||||
// 这边可以执行定时任务具体的业务或队列的业务
|
||||
console.log('数据', job.data);
|
||||
// 抛出错误 可以让队列重试,默认重试5次
|
||||
//throw new Error('错误');
|
||||
done();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
import { BaseCoolQueue, CoolQueue } from '@cool-midway/task';
|
||||
|
||||
/**
|
||||
* 主动消费队列
|
||||
*/
|
||||
@CoolQueue({ type: 'getter' })
|
||||
export class DemoGetterQueue extends BaseCoolQueue {}
|
|
@ -0,0 +1,18 @@
|
|||
import { Provide } from '@midwayjs/decorator';
|
||||
import { CoolCache } from '@cool-midway/core';
|
||||
|
||||
/**
|
||||
* 缓存
|
||||
*/
|
||||
@Provide()
|
||||
export class DemoCacheService {
|
||||
// 数据缓存5秒
|
||||
@CoolCache(5)
|
||||
async get() {
|
||||
console.log('执行方法');
|
||||
return {
|
||||
a: 1,
|
||||
b: 2,
|
||||
};
|
||||
}
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
import { Provide } from '@midwayjs/decorator';
|
||||
import { BaseService } from '@cool-midway/core';
|
||||
|
||||
/**
|
||||
* 缓存
|
||||
*/
|
||||
@Provide()
|
||||
export class DemoGoodsService extends BaseService {}
|
|
@ -0,0 +1,26 @@
|
|||
import { App, Provide } from '@midwayjs/decorator';
|
||||
import { DemoGoodsEntity } from '../entity/goods';
|
||||
import { IMidwayApplication } from '@midwayjs/core';
|
||||
import { BaseRpcService, CoolRpcService } from '@cool-midway/rpc';
|
||||
|
||||
@Provide()
|
||||
@CoolRpcService({
|
||||
entity: DemoGoodsEntity,
|
||||
method: ['info', 'add', 'page'],
|
||||
})
|
||||
export class DemoRpcService extends BaseRpcService {
|
||||
@App()
|
||||
app: IMidwayApplication;
|
||||
|
||||
async info(params) {
|
||||
return params;
|
||||
}
|
||||
async getUser() {
|
||||
return {
|
||||
uid: '123',
|
||||
username: 'mockedName',
|
||||
phone: '12345678901',
|
||||
email: 'xxx.xxx@xxx.com',
|
||||
};
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
import { ModuleConfig } from '@cool-midway/core';
|
||||
|
||||
/**
|
||||
* 模块配置
|
||||
*/
|
||||
export default () => {
|
||||
return {
|
||||
// 模块名称
|
||||
name: '文件空间',
|
||||
// 模块描述
|
||||
description: '上传和管理文件资源',
|
||||
// 中间件,只对本模块有效
|
||||
middlewares: [],
|
||||
// 中间件,全局有效
|
||||
globalMiddlewares: [],
|
||||
// 模块加载顺序,默认为0,值越大越优先加载
|
||||
order: 0,
|
||||
} as ModuleConfig;
|
||||
};
|
|
@ -0,0 +1,16 @@
|
|||
import { Provide } from '@midwayjs/decorator';
|
||||
import { CoolController, BaseController } from '@cool-midway/core';
|
||||
import { BaseAppSpaceInfoEntity } from '../../entity/info';
|
||||
|
||||
/**
|
||||
* 图片空间信息
|
||||
*/
|
||||
@Provide()
|
||||
@CoolController({
|
||||
api: ['add', 'delete', 'update', 'info', 'list', 'page'],
|
||||
entity: BaseAppSpaceInfoEntity,
|
||||
pageQueryOp: {
|
||||
fieldEq: ['type', 'classifyId'],
|
||||
},
|
||||
})
|
||||
export class BaseAppSpaceInfoController extends BaseController {}
|
|
@ -0,0 +1,13 @@
|
|||
import { Provide } from '@midwayjs/decorator';
|
||||
import { CoolController, BaseController } from '@cool-midway/core';
|
||||
import { BaseAppSpaceTypeEntity } from '../../entity/type';
|
||||
|
||||
/**
|
||||
* 空间分类
|
||||
*/
|
||||
@Provide()
|
||||
@CoolController({
|
||||
api: ['add', 'delete', 'update', 'info', 'list', 'page'],
|
||||
entity: BaseAppSpaceTypeEntity,
|
||||
})
|
||||
export class BaseAppSpaceTypeController extends BaseController {}
|
|
@ -0,0 +1 @@
|
|||
编写接口
|
|
@ -0,0 +1,18 @@
|
|||
import { EntityModel } from '@midwayjs/orm';
|
||||
import { BaseEntity } from '@cool-midway/core';
|
||||
import { Column } from 'typeorm';
|
||||
|
||||
/**
|
||||
* 文件空间信息
|
||||
*/
|
||||
@EntityModel('base_app_space_info')
|
||||
export class BaseAppSpaceInfoEntity extends BaseEntity {
|
||||
@Column({ comment: '地址' })
|
||||
url: string;
|
||||
|
||||
@Column({ comment: '类型' })
|
||||
type: string;
|
||||
|
||||
@Column({ comment: '分类ID', type: 'bigint', nullable: true })
|
||||
classifyId: number;
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
import { EntityModel } from '@midwayjs/orm';
|
||||
import { BaseEntity } from '@cool-midway/core';
|
||||
import { Column } from 'typeorm';
|
||||
|
||||
/**
|
||||
* 图片空间信息分类
|
||||
*/
|
||||
@EntityModel('base_app_space_type')
|
||||
export class BaseAppSpaceTypeEntity extends BaseEntity {
|
||||
@Column({ comment: '类别名称' })
|
||||
name: string;
|
||||
|
||||
@Column({ comment: '父分类ID', type: 'tinyint', nullable: true })
|
||||
parentId: number;
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
import { ModuleConfig } from '@cool-midway/core';
|
||||
|
||||
/**
|
||||
* 模块配置
|
||||
*/
|
||||
export default () => {
|
||||
return {
|
||||
// 模块名称
|
||||
name: '任务调度',
|
||||
// 模块描述
|
||||
description: '任务调度模块,支持分布式任务,由redis整个集群的任务',
|
||||
// 中间件
|
||||
middlewares: [],
|
||||
} as ModuleConfig;
|
||||
};
|
|
@ -0,0 +1,67 @@
|
|||
import {
|
||||
ALL,
|
||||
Body,
|
||||
Get,
|
||||
Inject,
|
||||
Post,
|
||||
Provide,
|
||||
Query,
|
||||
} from '@midwayjs/decorator';
|
||||
import { CoolController, BaseController } from '@cool-midway/core';
|
||||
import { TaskInfoEntity } from '../../entity/info';
|
||||
import { TaskInfoService } from '../../service/info';
|
||||
|
||||
/**
|
||||
* 任务
|
||||
*/
|
||||
@Provide()
|
||||
@CoolController({
|
||||
api: ['add', 'delete', 'update', 'info', 'page'],
|
||||
entity: TaskInfoEntity,
|
||||
service: TaskInfoService,
|
||||
before: ctx => {
|
||||
ctx.request.body.limit = ctx.request.body.repeatCount;
|
||||
},
|
||||
pageQueryOp: {
|
||||
fieldEq: ['status', 'type'],
|
||||
},
|
||||
})
|
||||
export class TaskInfoController extends BaseController {
|
||||
@Inject()
|
||||
taskInfoService: TaskInfoService;
|
||||
|
||||
/**
|
||||
* 手动执行一次
|
||||
*/
|
||||
@Post('/once', { summary: '执行一次' })
|
||||
async once(@Body('id') id: number) {
|
||||
await this.taskInfoService.once(id);
|
||||
this.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* 暂停任务
|
||||
*/
|
||||
@Post('/stop', { summary: '停止' })
|
||||
async stop(@Body('id') id: number) {
|
||||
await this.taskInfoService.stop(id);
|
||||
this.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* 开始任务
|
||||
*/
|
||||
@Post('/start', { summary: '开始' })
|
||||
async start(@Body('id') id: number, @Body('type') type: number) {
|
||||
await this.taskInfoService.start(id, type);
|
||||
this.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* 日志
|
||||
*/
|
||||
@Get('/log', { summary: '日志' })
|
||||
async log(@Query(ALL) params: any) {
|
||||
return this.ok(await this.taskInfoService.log(params));
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
编写接口
|
|
@ -0,0 +1,57 @@
|
|||
import { EntityModel } from '@midwayjs/orm';
|
||||
import { BaseEntity } from '@cool-midway/core';
|
||||
import { Column } from 'typeorm';
|
||||
|
||||
/**
|
||||
* 任务信息
|
||||
*/
|
||||
@EntityModel('task_info')
|
||||
export class TaskInfoEntity extends BaseEntity {
|
||||
@Column({ comment: '任务ID', nullable: true })
|
||||
jobId: string;
|
||||
|
||||
@Column({ comment: '任务配置', nullable: true, length: 1000 })
|
||||
repeatConf: string;
|
||||
|
||||
@Column({ comment: '名称' })
|
||||
name: string;
|
||||
|
||||
@Column({ comment: 'cron', nullable: true })
|
||||
cron: string;
|
||||
|
||||
@Column({ comment: '最大执行次数 不传为无限次', nullable: true })
|
||||
limit: number;
|
||||
|
||||
@Column({
|
||||
comment: '每间隔多少毫秒执行一次 如果cron设置了 这项设置就无效',
|
||||
nullable: true,
|
||||
})
|
||||
every: number;
|
||||
|
||||
@Column({ comment: '备注', nullable: true })
|
||||
remark: string;
|
||||
|
||||
@Column({ comment: '状态 0:停止 1:运行', default: 1, type: 'tinyint' })
|
||||
status: number;
|
||||
|
||||
@Column({ comment: '开始时间', nullable: true })
|
||||
startDate: Date;
|
||||
|
||||
@Column({ comment: '结束时间', nullable: true })
|
||||
endDate: Date;
|
||||
|
||||
@Column({ comment: '数据', nullable: true })
|
||||
data: string;
|
||||
|
||||
@Column({ comment: '执行的service实例ID', nullable: true })
|
||||
service: string;
|
||||
|
||||
@Column({ comment: '状态 0:系统 1:用户', default: 0, type: 'tinyint' })
|
||||
type: number;
|
||||
|
||||
@Column({ comment: '下一次执行时间', nullable: true })
|
||||
nextRunTime: Date;
|
||||
|
||||
@Column({ comment: '状态 0:cron 1:时间间隔', default: 0, type: 'tinyint' })
|
||||
taskType: number;
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
import { EntityModel } from '@midwayjs/orm';
|
||||
import { BaseEntity } from '@cool-midway/core';
|
||||
import { Column, Index } from 'typeorm';
|
||||
|
||||
/**
|
||||
* 任务日志
|
||||
*/
|
||||
@EntityModel('task_log')
|
||||
export class TaskLogEntity extends BaseEntity {
|
||||
@Index()
|
||||
@Column({ comment: '任务ID', nullable: true, type: 'bigint' })
|
||||
taskId: number;
|
||||
|
||||
@Column({ comment: '状态 0:失败 1:成功', default: 0, type: 'tinyint' })
|
||||
status: number;
|
||||
|
||||
@Column({ comment: '详情描述', nullable: true, type: 'text' })
|
||||
detail: string;
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
BEGIN;
|
||||
INSERT INTO `task_info` VALUES (1, '2021-03-10 14:25:13.381172', '2021-03-10 14:25:19.011000', NULL, '{\"count\":1,\"type\":1,\"limit\":5,\"name\":\"每秒执行,总共5次\",\"taskType\":1,\"every\":1000,\"service\":\"taskDemoService.test()\",\"status\":1,\"id\":1,\"createTime\":\"2021-03-10 14:25:13\",\"updateTime\":\"2021-03-10 14:25:13\",\"jobId\":1}', '每秒执行,总共5次', NULL, 5, 1000, NULL, 0, NULL, NULL, NULL, 'taskDemoService.test()', 1, '2021-03-10 14:25:18', 1);
|
||||
INSERT INTO `task_info` VALUES (2, '2021-03-10 14:25:53.000000', '2021-03-10 14:26:18.209202', NULL, '{\"count\":1,\"id\":2,\"createTime\":\"2021-03-10 14:25:53\",\"updateTime\":\"2021-03-10 14:25:55\",\"name\":\"cron任务,5秒执行一次\",\"cron\":\"0/5 * * * * ? \",\"status\":1,\"service\":\"taskDemoService.test()\",\"type\":1,\"nextRunTime\":\"2021-03-10 14:26:00\",\"taskType\":0,\"jobId\":2}', 'cron任务,5秒执行一次', '0/5 * * * * ? ', NULL, NULL, NULL, 0, NULL, NULL, NULL, 'taskDemoService.test()', 1, NULL, 0);
|
||||
COMMIT;
|
||||
|
||||
BEGIN;
|
||||
INSERT INTO `task_log` VALUES (1, '2021-03-10 14:25:14.020930', '2021-03-10 14:25:14.020930', 1, 1, '\"任务执行成功\"');
|
||||
INSERT INTO `task_log` VALUES (2, '2021-03-10 14:25:15.012030', '2021-03-10 14:25:15.012030', 1, 1, '\"任务执行成功\"');
|
||||
INSERT INTO `task_log` VALUES (3, '2021-03-10 14:25:16.011443', '2021-03-10 14:25:16.011443', 1, 1, '\"任务执行成功\"');
|
||||
INSERT INTO `task_log` VALUES (4, '2021-03-10 14:25:17.009939', '2021-03-10 14:25:17.009939', 1, 1, '\"任务执行成功\"');
|
||||
INSERT INTO `task_log` VALUES (5, '2021-03-10 14:25:18.010410', '2021-03-10 14:25:18.010410', 1, 1, '\"任务执行成功\"');
|
||||
INSERT INTO `task_log` VALUES (6, '2021-03-10 14:25:55.012816', '2021-03-10 14:25:55.012816', 2, 1, '');
|
||||
INSERT INTO `task_log` VALUES (7, '2021-03-10 14:26:00.011880', '2021-03-10 14:26:00.011880', 2, 1, '');
|
||||
INSERT INTO `task_log` VALUES (8, '2021-03-10 14:26:05.016832', '2021-03-10 14:26:05.016832', 2, 1, '\"任务执行成功\"');
|
||||
INSERT INTO `task_log` VALUES (9, '2021-03-10 14:26:10.011763', '2021-03-10 14:26:10.011763', 2, 1, '\"任务执行成功\"');
|
||||
INSERT INTO `task_log` VALUES (10, '2021-03-10 14:26:15.010246', '2021-03-10 14:26:15.010246', 2, 1, '\"任务执行成功\"');
|
||||
COMMIT;
|
|
@ -0,0 +1,31 @@
|
|||
import { App, Inject } from '@midwayjs/decorator';
|
||||
import { BaseCoolQueue, CoolQueue } from '@cool-midway/task';
|
||||
import { TaskInfoService } from '../service/info';
|
||||
import { Job } from 'bullmq';
|
||||
import { IMidwayApplication } from '@midwayjs/core';
|
||||
|
||||
/**
|
||||
* 任务
|
||||
*/
|
||||
@CoolQueue()
|
||||
export abstract class TaskInfoQueue extends BaseCoolQueue {
|
||||
@App()
|
||||
app: IMidwayApplication;
|
||||
|
||||
@Inject()
|
||||
taskInfoService: TaskInfoService;
|
||||
|
||||
async data(job: Job, done: any): Promise<void> {
|
||||
try {
|
||||
const result = await this.taskInfoService.invokeService(job.data.service);
|
||||
this.taskInfoService.record(job.data, 1, JSON.stringify(result));
|
||||
} catch (error) {
|
||||
this.taskInfoService.record(job.data, 0, error.message);
|
||||
}
|
||||
if (!job.data.isOnce) {
|
||||
this.taskInfoService.updateNextRunTime(job.data.id);
|
||||
this.taskInfoService.updateStatus(job.data.id);
|
||||
}
|
||||
done();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
import { Logger, Provide } from '@midwayjs/decorator';
|
||||
import { BaseService } from '@cool-midway/core';
|
||||
import { ILogger } from '@midwayjs/logger';
|
||||
|
||||
/**
|
||||
* 描述
|
||||
*/
|
||||
@Provide()
|
||||
export class TaskDemoService extends BaseService {
|
||||
@Logger()
|
||||
logger: ILogger;
|
||||
/**
|
||||
* 描述
|
||||
*/
|
||||
async test() {
|
||||
this.logger.info('我被调用了');
|
||||
return '任务执行成功';
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue