This commit is contained in:
sx1989827 2021-09-21 18:58:16 +08:00
parent 5fb4ca344f
commit 9e1d2a5420
15 changed files with 171 additions and 23 deletions

View File

@ -1,6 +1,8 @@
import { BaseModel } from "./base"
export interface ICommon_Model_Project { export interface ICommon_Model_Project {
id :string, id :string,
key :string, keyword :string,
name :string, name :string,
created_time :Date, created_time :Date,
modified_time :Date, modified_time :Date,
@ -8,4 +10,9 @@ export interface ICommon_Model_Project {
created_by :string , created_by :string ,
description :string, description :string,
} }
export const Table_Project="project" export const Table_Project="project"
export class ProjectModel extends BaseModel {
table=Table_Project
model=<ICommon_Model_Project>{}
}

View File

@ -13,8 +13,7 @@ const api={
projectId:string projectId:string
}>{}, }>{},
res:<ICommon_Model_Project>{}, res:<ICommon_Model_Project>{},
permission:[Permission_Types.Project.READ], permission:[Permission_Types.Project.READ]
ignoreValidate:true
}, },
} }
} }

View File

@ -45,10 +45,20 @@ export namespace Err {
msg:"over file size" 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"
},
}
} }

View File

@ -1,6 +1,9 @@
export namespace EServer_Common_Event_Types { export namespace EServer_Common_Event_Types {
export type Types= User export type Types= User|Project
export enum User { export enum User {
DELETE="delete user" //userId:string DELETE="delete user" //userId:string
} }
export enum Project {
DELETE="delete project" //userId:string
}
} }

View File

@ -30,10 +30,12 @@ export async function processPermission (arrPermission:Permission_Base[],objCont
if (!isExists) { if (!isExists) {
value = await objPermission.create(objContent) value = await objPermission.create(objContent)
if (value !== null) { if (value !== null) {
await getRedisInstance().set(key, value) await getRedisInstance().set(key, value,3600*6)
} else { } else {
return false return false
} }
} else {
value =await getRedisInstance().get(key,{})
} }
keyMap[key] = value; keyMap[key] = value;
} }
@ -50,6 +52,7 @@ export async function processPermission (arrPermission:Permission_Base[],objCont
} }
return true return true
} catch (err) { } catch (err) {
console.error(err)
return false return false
} }

View File

@ -31,7 +31,7 @@ export class PermissionProjectRead extends PermissionBase<IPermission_Project_Ca
let arr:string[]=[] let arr:string[]=[]
for(let obj of arrRolePermission) { for(let obj of arrRolePermission) {
let objPermission = await mysql.executeOne(generateQuerySql(new PermissionModel,[],{ let objPermission = await mysql.executeOne(generateQuerySql(new PermissionModel,[],{
id:obj.role_id id:obj.permission_id
})) }))
if(objPermission) { if(objPermission) {
arr.push(objPermission.value) arr.push(objPermission.value)
@ -40,7 +40,7 @@ export class PermissionProjectRead extends PermissionBase<IPermission_Project_Ca
return arr; return arr;
} }
check(obj:IPermission_Project_CacheValue):boolean { check(obj:IPermission_Project_CacheValue):boolean {
return obj.includes[Permission_Types.Project.READ.value]; return obj.includes(Permission_Types.Project.READ.value);
} }
getKey({userId,projectId}) { getKey({userId,projectId}) {
if(StringUtil.isEmpty(userId) || StringUtil.isEmpty(projectId)) { if(StringUtil.isEmpty(userId) || StringUtil.isEmpty(projectId)) {

View File

@ -0,0 +1,17 @@
import { DHttpApi, DHttpContext, DHttpReqParam, DHttpReqParamFile,DHttpContent, DHttpReqParamRequired, DHttpUser } from "../../common/http/http"
import * as projectApi from "../../../common/routes/project"
import HttpContext from "../../common/http/context"
import { Err } from "../../../common/status/error"
import { IUserSession } from "../../common/rpc/api/user"
import Project from "../service/project"
class UserController {
@DHttpApi(projectApi.routes.basic)
async projectBasicInfo(@DHttpReqParamRequired("projectId") projectId:string):Promise<typeof projectApi.routes.basic.res>{
let obj=await Project.getItemById(projectId);
return obj.getItem();
}
}
export default new UserController

View File

@ -1,5 +1,5 @@
import Cooperation from "./app/app"; import Cooperation from "./app/app";
import "./http/cooperation"
var application = new Cooperation() var application = new Cooperation()
application.start(); application.start();

View File

@ -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<void> {
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<ICommon_Model_Project> {
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<void> {
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<void> {
if(!id) {
throw Err.Project.userIdNotExists
}
var mysql=getMysqlInstance();
await mysql.execute(generateDeleteSql(new ProjectModel,{id}))
}
}

View File

@ -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<ICommon_Model_Project> {
async create():Promise<ICommon_Model_Project> {
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<ICommon_Model_Project>{
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<ICommon_Model_Project>{
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<InstanceType<typeof Project>>{
let obj = await projectMapper.getProjecById(id);
if(obj) {
let user = new Project;
user.setItem(obj);
return user;
} else {
return null;
}
}
}

View File

@ -8,6 +8,7 @@ import { getNacosInstance } from "../../common/nacos/nacos";
import { CacheService } from './../cache/service'; import { CacheService } from './../cache/service';
import {generateHttpErrorResponse} from "../../common/util/http" import {generateHttpErrorResponse} from "../../common/util/http"
import * as userApi from "../../../common/routes/user" import * as userApi from "../../../common/routes/user"
import * as projectApi from "../../../common/routes/project"
import { ICommon_HttpApi } from "../../../common/routes/types"; 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 { EServer_Common_Http_Body_Type, IServer_Common_Http_Proxy, IServer_Common_Http_Req_File } from "../../common/types/http";
import { parseFormData } from "../util/util"; import { parseFormData } from "../util/util";
@ -20,7 +21,7 @@ import {getComponent} from "../../common/decorate/component"
import { Permission_Base } from '../../../common/permission/permission'; import { Permission_Base } from '../../../common/permission/permission';
import { processPermission } from '../../common/permission/base'; import { processPermission } from '../../common/permission/base';
import { EServer_Common_User_Type } from '../../common/types/user'; 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 app = new Koa();
var pipe=function (from,to) :Promise<string>{ var pipe=function (from,to) :Promise<string>{
return new Promise(function (resolve) { return new Promise(function (resolve) {
@ -44,7 +45,7 @@ export default class GateWay extends Application {
override async config() { override async config() {
let cacheService=new CacheService() let cacheService=new CacheService()
cacheService.start() cacheService.start()
await initSystem() //await initSystem()
await this.initKoa(); await this.initKoa();
} }
async initKoa() { async initKoa() {
@ -160,9 +161,15 @@ export default class GateWay extends Application {
if (ctx.state.formData) { if (ctx.state.formData) {
obj.bodyType = EServer_Common_Http_Body_Type.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)) { if(permission && permission.length>0) {
let isCheck = processPermission(permission,Object.assign({},obj.data,{userId:ctx.state.user?ctx.state.user.userId:undefined})) if(ctx.state.user) {
if(!isCheck) { 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 throw Err.User.accessDenied
} }
} }

View File

@ -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_Role_Permission } from './../../../common/model/role_permission';
import { Table_Project_Role } from './../../../common/model/project_role'; import { Table_Project_Role } from './../../../common/model/project_role';
import { Table_Permission } from './../../../common/model/permission'; 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 { generateSnowId } from '../../common/util/sql';
import { OBTPConfig } from './obtp'; import { OBTPConfig } from './obtp';
import { getNacosInstance } from '../../common/nacos/nacos'; import { getNacosInstance } from '../../common/nacos/nacos';
import { Table_Project } from '../../../common/model/project';
export interface IServer_GateWay_FormData { export interface IServer_GateWay_FormData {
isFile:boolean, isFile:boolean,
name:string, name:string,
@ -53,6 +56,9 @@ async function resetSystem(){
await mysql.execute(`delete from ${Table_Permission}`) await mysql.execute(`delete from ${Table_Permission}`)
await mysql.execute(`delete from ${Table_Project_Role}`) await mysql.execute(`delete from ${Table_Project_Role}`)
await mysql.execute(`delete from ${Table_Role_Permission}`) 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() { export async function initSystem() {
@ -64,7 +70,11 @@ export async function initSystem() {
[param:number]:string [param:number]:string
}>{} }>{}
let adminId=await generateSnowId() 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_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) { for(let key in Permission_Types) {
let value=Permission_Types[key] let value=Permission_Types[key]
let type=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) { for(let key in objProjectRole) {
let obj=objProjectRole[key] let obj=objProjectRole[key]
let projectRoleId=await generateSnowId() let projectRoleId=await generateSnowId()
if(obj.name=="user") {
projectRoleUserId=projectRoleId
}
let name=obj.name let name=obj.name
let description=obj.description let description=obj.description
await mysql.execute(`insert into ${Table_Project_Role} (id,name,description) values ('${projectRoleId}','${name}','${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_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}')`) await mysql.execute(`insert into ${Table_Version} (version) values ('${getNacosInstance().version}')`)
} }
console.log("init finish") console.log("init finish")

View File

@ -7,7 +7,6 @@ import { Err } from "../../../common/status/error"
class UserController { class UserController {
@DHttpApi(userApi.routes.create) @DHttpApi(userApi.routes.create)
async create(@DHttpContent content:typeof userApi.routes.create.req,@DHttpUser userInfo:IUserSession):Promise<typeof userApi.routes.create.res>{ async create(@DHttpContent content:typeof userApi.routes.create.req,@DHttpUser userInfo:IUserSession):Promise<typeof userApi.routes.create.res>{
console.log(userInfo)
let user=new UserService() let user=new UserService()
user.assignItem(content); user.assignItem(content);
let obj=await user.create() let obj=await user.create()

View File

@ -1,7 +1,7 @@
import { Table_User, ICommon_Model_User, UserModel } from './../../../common/model/user'; import { Table_User, ICommon_Model_User, UserModel } from './../../../common/model/user';
import { getMysqlInstance } from "../../common/db/mysql" import { getMysqlInstance } from "../../common/db/mysql"
import {Err} from "../../../common/status/error" 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 namespace userMapper {
export async function checkUserValid(username:string):Promise<boolean> { export async function checkUserValid(username:string):Promise<boolean> {
if(!username){ if(!username){
@ -17,9 +17,10 @@ export namespace userMapper {
} }
export async function createUser(info:ICommon_Model_User):Promise<void> { export async function createUser(info:ICommon_Model_User):Promise<void> {
if(!info || !info.username || !info.password ||!info.id){ if(!info || !info.username || !info.password ||info.id){
throw Err.Common.paramError throw Err.Common.paramError
} }
info.id=await generateSnowId()
var mysql=getMysqlInstance() var mysql=getMysqlInstance()
await mysql.execute(generateCreateSql(new UserModel,info)) await mysql.execute(generateCreateSql(new UserModel,info))
} }

View File

@ -17,7 +17,6 @@ export default class User extends Entity<ICommon_Model_User> {
} else if(this.item.id) { } else if(this.item.id) {
throw Err.User.userExists; throw Err.User.userExists;
} }
this.item.id=await generateSnowId()
await userMapper.createUser(this.item) await userMapper.createUser(this.item)
await this.loadItem(); await this.loadItem();
return this.item; return this.item;