From 9e1d2a542000b3177848e5ffc40c2efe98b2e088 Mon Sep 17 00:00:00 2001 From: sx1989827 <395414574@qq.com> Date: Tue, 21 Sep 2021 18:58:16 +0800 Subject: [PATCH] add --- code/common/model/project.ts | 11 ++++- code/common/routes/project.ts | 3 +- code/common/status/error.ts | 18 +++++-- code/server/common/event/types.ts | 5 +- code/server/common/permission/base.ts | 5 +- .../common/permission/project/relation.ts | 4 +- code/server/cooperation/http/cooperation.ts | 17 +++++++ code/server/cooperation/index.ts | 2 +- code/server/cooperation/mapper/project.ts | 42 +++++++++++++++++ code/server/cooperation/service/project.ts | 47 +++++++++++++++++++ code/server/gateway/app/app.ts | 17 +++++-- code/server/gateway/util/util.ts | 16 ++++++- code/server/user/http/user.ts | 1 - code/server/user/mapper/user.ts | 5 +- code/server/user/service/user.ts | 1 - 15 files changed, 171 insertions(+), 23 deletions(-) create mode 100644 code/server/cooperation/http/cooperation.ts create mode 100644 code/server/cooperation/mapper/project.ts create mode 100644 code/server/cooperation/service/project.ts diff --git a/code/common/model/project.ts b/code/common/model/project.ts index 15e897d..2a3d442 100644 --- a/code/common/model/project.ts +++ b/code/common/model/project.ts @@ -1,6 +1,8 @@ +import { BaseModel } from "./base" + export interface ICommon_Model_Project { id :string, - key :string, + keyword :string, name :string, created_time :Date, modified_time :Date, @@ -8,4 +10,9 @@ export interface ICommon_Model_Project { created_by :string , description :string, } -export const Table_Project="project" \ No newline at end of file +export const Table_Project="project" + +export class ProjectModel extends BaseModel { + table=Table_Project + model={} +} \ No newline at end of file diff --git a/code/common/routes/project.ts b/code/common/routes/project.ts index d2ef52e..6e12340 100644 --- a/code/common/routes/project.ts +++ b/code/common/routes/project.ts @@ -13,8 +13,7 @@ const api={ projectId:string }>{}, res:{}, - permission:[Permission_Types.Project.READ], - ignoreValidate:true + permission:[Permission_Types.Project.READ] }, } } diff --git a/code/common/status/error.ts b/code/common/status/error.ts index c4bddc1..d7c82b1 100644 --- a/code/common/status/error.ts +++ b/code/common/status/error.ts @@ -45,10 +45,20 @@ export namespace Err { msg:"over file size" } } - - - - + export let Project = { + userIdNotExists:{ + code:3000, + msg:"project id not exists" + }, + projectNotFound:{ + code:3001, + msg:"project not found" + }, + projectExists:{ + code:3002, + msg:"project exists" + }, + } } diff --git a/code/server/common/event/types.ts b/code/server/common/event/types.ts index 699445f..00be56e 100644 --- a/code/server/common/event/types.ts +++ b/code/server/common/event/types.ts @@ -1,6 +1,9 @@ export namespace EServer_Common_Event_Types { - export type Types= User + export type Types= User|Project export enum User { DELETE="delete user" //userId:string } + export enum Project { + DELETE="delete project" //userId:string + } } \ No newline at end of file diff --git a/code/server/common/permission/base.ts b/code/server/common/permission/base.ts index 3f899ca..dc6efc7 100644 --- a/code/server/common/permission/base.ts +++ b/code/server/common/permission/base.ts @@ -30,10 +30,12 @@ export async function processPermission (arrPermission:Permission_Base[],objCont if (!isExists) { value = await objPermission.create(objContent) if (value !== null) { - await getRedisInstance().set(key, value) + await getRedisInstance().set(key, value,3600*6) } else { return false } + } else { + value =await getRedisInstance().get(key,{}) } keyMap[key] = value; } @@ -50,6 +52,7 @@ export async function processPermission (arrPermission:Permission_Base[],objCont } return true } catch (err) { + console.error(err) return false } diff --git a/code/server/common/permission/project/relation.ts b/code/server/common/permission/project/relation.ts index 8427ce7..5208477 100644 --- a/code/server/common/permission/project/relation.ts +++ b/code/server/common/permission/project/relation.ts @@ -31,7 +31,7 @@ export class PermissionProjectRead extends PermissionBase{ + let obj=await Project.getItemById(projectId); + return obj.getItem(); + } + +} +export default new UserController \ No newline at end of file diff --git a/code/server/cooperation/index.ts b/code/server/cooperation/index.ts index d4cf0fb..8690a19 100644 --- a/code/server/cooperation/index.ts +++ b/code/server/cooperation/index.ts @@ -1,5 +1,5 @@ import Cooperation from "./app/app"; - +import "./http/cooperation" var application = new Cooperation() application.start(); diff --git a/code/server/cooperation/mapper/project.ts b/code/server/cooperation/mapper/project.ts new file mode 100644 index 0000000..6579deb --- /dev/null +++ b/code/server/cooperation/mapper/project.ts @@ -0,0 +1,42 @@ +import { Table_Project, ICommon_Model_Project, ProjectModel } from '../../../common/model/project'; +import { getMysqlInstance } from "../../common/db/mysql" +import {Err} from "../../../common/status/error" +import {generateCreateSql, generateDeleteSql, generateQuerySql, generateSnowId, generateUpdateSql} from "../../common/util/sql" +export namespace projectMapper { + + export async function createProject(info:ICommon_Model_Project):Promise { + if(!info || !info.name || !info.keyword || info.id){ + throw Err.Common.paramError + } + info.id=await generateSnowId(); + var mysql=getMysqlInstance() + await mysql.execute(generateCreateSql(new ProjectModel,info)) + } + + export async function getProjecById(id:string):Promise { + if(!id) { + throw Err.Project.userIdNotExists + } + var mysql=getMysqlInstance(); + let ret=await mysql.executeOne(generateQuerySql(new ProjectModel,[],{id})) + return ret + } + + export async function updateProject(info:ICommon_Model_Project):Promise { + if(!info.id) { + throw Err.Project.userIdNotExists + } + var mysql=getMysqlInstance(); + let id=info.id; + delete info.id,info.created_time,info.modified_time + await mysql.execute(generateUpdateSql(new ProjectModel,info,{id})) + } + + export async function deleteProject(id):Promise { + if(!id) { + throw Err.Project.userIdNotExists + } + var mysql=getMysqlInstance(); + await mysql.execute(generateDeleteSql(new ProjectModel,{id})) + } +} \ No newline at end of file diff --git a/code/server/cooperation/service/project.ts b/code/server/cooperation/service/project.ts new file mode 100644 index 0000000..4cafaaa --- /dev/null +++ b/code/server/cooperation/service/project.ts @@ -0,0 +1,47 @@ +import { projectMapper } from '../mapper/project'; +import { ICommon_Model_Project } from '../../../common/model/project'; +import { Err } from '../../../common/status/error'; +import {Entity} from "../../common/entity/entity" +import { EServer_Common_Event_Types } from '../../common/event/types'; +import { emitServiceEvent } from '../../common/rpc/rpc'; +export default class Project extends Entity { + async create():Promise { + if(!this.item) { + throw Err.Project.projectNotFound; + } else if(this.item.id) { + throw Err.Project.projectExists; + } + await projectMapper.createProject(this.item) + await this.loadItem(); + return this.item; + } + async update():Promise{ + if(!this.item || !this.item.id) { + throw Err.Project.projectNotFound; + } + await projectMapper.updateProject(this.item) + return this.item; + } + async delete(){ + await projectMapper.deleteProject(this.item.id); + emitServiceEvent(EServer_Common_Event_Types.Project.DELETE,this.item.id); + } + async loadItem():Promise{ + if(!this.item || !this.item.id) { + throw Err.Project.projectNotFound; + } + let obj = await projectMapper.getProjecById(this.item.id); + this.item=obj; + return this.item; + } + static async getItemById(id:string):Promise>{ + let obj = await projectMapper.getProjecById(id); + if(obj) { + let user = new Project; + user.setItem(obj); + return user; + } else { + return null; + } + } +} \ No newline at end of file diff --git a/code/server/gateway/app/app.ts b/code/server/gateway/app/app.ts index ff7f124..5879a44 100644 --- a/code/server/gateway/app/app.ts +++ b/code/server/gateway/app/app.ts @@ -8,6 +8,7 @@ import { getNacosInstance } from "../../common/nacos/nacos"; import { CacheService } from './../cache/service'; import {generateHttpErrorResponse} from "../../common/util/http" import * as userApi from "../../../common/routes/user" +import * as projectApi from "../../../common/routes/project" import { ICommon_HttpApi } from "../../../common/routes/types"; import { EServer_Common_Http_Body_Type, IServer_Common_Http_Proxy, IServer_Common_Http_Req_File } from "../../common/types/http"; import { parseFormData } from "../util/util"; @@ -20,7 +21,7 @@ import {getComponent} from "../../common/decorate/component" import { Permission_Base } from '../../../common/permission/permission'; import { processPermission } from '../../common/permission/base'; import { EServer_Common_User_Type } from '../../common/types/user'; -var apis:ICommon_HttpApi[]=[userApi]; +var apis:ICommon_HttpApi[]=[userApi,projectApi]; var app = new Koa(); var pipe=function (from,to) :Promise{ return new Promise(function (resolve) { @@ -44,7 +45,7 @@ export default class GateWay extends Application { override async config() { let cacheService=new CacheService() cacheService.start() - await initSystem() + //await initSystem() await this.initKoa(); } async initKoa() { @@ -160,9 +161,15 @@ export default class GateWay extends Application { if (ctx.state.formData) { obj.bodyType = EServer_Common_Http_Body_Type.FORMDATA } - if(permission && permission.length>0 && (ctx.state.user && ctx.state.user.type==EServer_Common_User_Type.USER)) { - let isCheck = processPermission(permission,Object.assign({},obj.data,{userId:ctx.state.user?ctx.state.user.userId:undefined})) - if(!isCheck) { + if(permission && permission.length>0) { + if(ctx.state.user) { + if(ctx.state.user.type==EServer_Common_User_Type.USER) { + let isCheck =await processPermission(permission,Object.assign({},obj.data,{userId:ctx.state.user?ctx.state.user.userId:undefined})) + if(!isCheck) { + throw Err.User.accessDenied + } + } + } else { throw Err.User.accessDenied } } diff --git a/code/server/gateway/util/util.ts b/code/server/gateway/util/util.ts index 0ae58d5..fc411f4 100644 --- a/code/server/gateway/util/util.ts +++ b/code/server/gateway/util/util.ts @@ -1,3 +1,5 @@ +import { Table_Project_User } from './../../../common/model/project_user'; +import { Table_User } from './../../../common/model/user'; import { Table_Role_Permission } from './../../../common/model/role_permission'; import { Table_Project_Role } from './../../../common/model/project_role'; import { Table_Permission } from './../../../common/model/permission'; @@ -8,6 +10,7 @@ import { Permission_Base, Permission_Types } from '../../../common/permission/pe import { generateSnowId } from '../../common/util/sql'; import { OBTPConfig } from './obtp'; import { getNacosInstance } from '../../common/nacos/nacos'; +import { Table_Project } from '../../../common/model/project'; export interface IServer_GateWay_FormData { isFile:boolean, name:string, @@ -53,6 +56,9 @@ async function resetSystem(){ await mysql.execute(`delete from ${Table_Permission}`) await mysql.execute(`delete from ${Table_Project_Role}`) await mysql.execute(`delete from ${Table_Role_Permission}`) + await mysql.execute(`delete from ${Table_User}`) + await mysql.execute(`delete from ${Table_Project}`) + await mysql.execute(`delete from ${Table_Project_User}`) } export async function initSystem() { @@ -64,7 +70,11 @@ export async function initSystem() { [param:number]:string }>{} let adminId=await generateSnowId() + let userId=await generateSnowId() + let projectId=await generateSnowId() await mysql.execute(`insert into ${Table_Admin} (id,name,password) values ('${adminId}','teamlinker','teamlinker')`) + await mysql.execute(`insert into ${Table_User} (id,username,password) values ('${userId}','sx','sx')`) + await mysql.execute(`insert into ${Table_Project} (id,name,keyword,created_by) values ('${projectId}','test','test','${userId}')`) for(let key in Permission_Types) { let value=Permission_Types[key] let type=key @@ -80,10 +90,13 @@ export async function initSystem() { } } } - let objProjectRole=OBTPConfig.Role.Project_Role + let objProjectRole=OBTPConfig.Role.Project_Role,projectRoleUserId; for(let key in objProjectRole) { let obj=objProjectRole[key] let projectRoleId=await generateSnowId() + if(obj.name=="user") { + projectRoleUserId=projectRoleId + } let name=obj.name let description=obj.description await mysql.execute(`insert into ${Table_Project_Role} (id,name,description) values ('${projectRoleId}','${name}','${description}')`) @@ -92,6 +105,7 @@ export async function initSystem() { await mysql.execute(`insert into ${Table_Role_Permission} (id,role_id,permission_id) values ('${id}','${projectRoleId}','${objPermission[o.value]}')`) } } + await mysql.execute(`insert into ${Table_Project_User} (id,role,project_id,user_id) values ('${await generateSnowId()}','${projectRoleUserId}','${projectId}','${userId}')`) await mysql.execute(`insert into ${Table_Version} (version) values ('${getNacosInstance().version}')`) } console.log("init finish") diff --git a/code/server/user/http/user.ts b/code/server/user/http/user.ts index d74b869..eaf25d3 100644 --- a/code/server/user/http/user.ts +++ b/code/server/user/http/user.ts @@ -7,7 +7,6 @@ import { Err } from "../../../common/status/error" class UserController { @DHttpApi(userApi.routes.create) async create(@DHttpContent content:typeof userApi.routes.create.req,@DHttpUser userInfo:IUserSession):Promise{ - console.log(userInfo) let user=new UserService() user.assignItem(content); let obj=await user.create() diff --git a/code/server/user/mapper/user.ts b/code/server/user/mapper/user.ts index 3af6d49..1be2a49 100644 --- a/code/server/user/mapper/user.ts +++ b/code/server/user/mapper/user.ts @@ -1,7 +1,7 @@ import { Table_User, ICommon_Model_User, UserModel } from './../../../common/model/user'; import { getMysqlInstance } from "../../common/db/mysql" import {Err} from "../../../common/status/error" -import {generateCreateSql, generateDeleteSql, generateQuerySql, generateUpdateSql} from "../../common/util/sql" +import {generateCreateSql, generateDeleteSql, generateQuerySql, generateSnowId, generateUpdateSql} from "../../common/util/sql" export namespace userMapper { export async function checkUserValid(username:string):Promise { if(!username){ @@ -17,9 +17,10 @@ export namespace userMapper { } export async function createUser(info:ICommon_Model_User):Promise { - if(!info || !info.username || !info.password ||!info.id){ + if(!info || !info.username || !info.password ||info.id){ throw Err.Common.paramError } + info.id=await generateSnowId() var mysql=getMysqlInstance() await mysql.execute(generateCreateSql(new UserModel,info)) } diff --git a/code/server/user/service/user.ts b/code/server/user/service/user.ts index 10b295f..4222769 100644 --- a/code/server/user/service/user.ts +++ b/code/server/user/service/user.ts @@ -17,7 +17,6 @@ export default class User extends Entity { } else if(this.item.id) { throw Err.User.userExists; } - this.item.id=await generateSnowId() await userMapper.createUser(this.item) await this.loadItem(); return this.item;