feat: 增加后端权限控制

This commit is contained in:
meilin.huang
2021-06-09 16:58:57 +08:00
parent 9074e7637e
commit 3ebc3ee14d
39 changed files with 4463 additions and 3913 deletions

View File

@@ -71,6 +71,12 @@ func (c *timedcache) Add(k string, x interface{}, d time.Duration) error {
return nil
}
func (c *timedcache) Put(k string, x interface{}) {
c.mu.Lock()
defer c.mu.Unlock()
c.set(k, x, c.defaultExpiration)
}
func (c *timedcache) AddIfAbsent(k string, x interface{}) {
c.mu.Lock()
defer c.mu.Unlock()
@@ -409,7 +415,7 @@ func NewTimedCache(defaultExpiration, cleanupInterval time.Duration) *TimedCache
}
// 调用删除函数时,会回调该剔除函数
func (c *timedcache) OnEvicted(f func(string, interface{})) *timedcache {
func (c *TimedCache) OnEvicted(f func(string, interface{})) *TimedCache {
c.mu.Lock()
c.onEvicted = f
c.mu.Unlock()
@@ -418,7 +424,7 @@ func (c *timedcache) OnEvicted(f func(string, interface{})) *timedcache {
// 是否更新最后访问时间,是则会更新最后访问时间
// 即只要在指定缓存时间内都没有访问该缓存,则会失效,反之失效开始时间点为最后访问时间
func (c *timedcache) WithUpdateAccessTime(update bool) *timedcache {
func (c *TimedCache) WithUpdateAccessTime(update bool) *TimedCache {
c.mu.Lock()
c.updateAccessTime = update
c.mu.Unlock()

View File

@@ -1,21 +1,95 @@
package ctx
import (
"fmt"
"mayfly-go/base/biz"
"mayfly-go/base/cache"
"time"
)
type Permission struct {
Code string // 权限code
Description string // 请求描述
NeedToken bool // 是否需要token
Code string // 权限code
}
var permissionError = biz.NewBizErrCode(biz.TokenErrorCode, biz.TokenErrorMsg)
func NewPermission(code string) *Permission {
return &Permission{NeedToken: true, Code: code}
}
func (p *Permission) WithNeedToken(needToken bool) *Permission {
p.NeedToken = needToken
return p
}
type PermissionCodeRegistry interface {
// 保存用户权限code
SaveCodes(userId uint64, codes []string)
// 判断用户是否拥有该code的权限
HasCode(userId uint64, code string) bool
Remove(userId uint64)
}
type DefaultPermissionCodeRegistry struct {
cache *cache.TimedCache
}
func (r *DefaultPermissionCodeRegistry) SaveCodes(userId uint64, codes []string) {
if r.cache == nil {
r.cache = cache.NewTimedCache(30*time.Minute, 5*time.Second).WithUpdateAccessTime(true)
}
r.cache.Put(fmt.Sprintf("%v", userId), codes)
}
func (r *DefaultPermissionCodeRegistry) HasCode(userId uint64, code string) bool {
if r.cache == nil {
return false
}
codes, found := r.cache.Get(fmt.Sprintf("%v", userId))
if !found {
return false
}
for _, v := range codes.([]string) {
if v == code {
return true
}
}
return false
}
func (r *DefaultPermissionCodeRegistry) Remove(userId uint64) {
r.cache.Delete(fmt.Sprintf("%v", userId))
}
// 保存用户权限code
func SavePermissionCodes(userId uint64, codes []string) {
permissionCodeRegistry.SaveCodes(userId, codes)
}
// 删除用户权限code
func DeletePermissionCodes(userId uint64) {
permissionCodeRegistry.Remove(userId)
}
// 设置权限code注册器
func SetPermissionCodeRegistery(pcr PermissionCodeRegistry) {
permissionCodeRegistry = pcr
}
var (
permissionCodeRegistry PermissionCodeRegistry = &DefaultPermissionCodeRegistry{}
permissionError = biz.NewBizErrCode(biz.TokenErrorCode, biz.TokenErrorMsg)
)
func PermissionHandler(rc *ReqCtx) error {
if !rc.NeedToken {
permission := rc.RequiredPermission
// 如果需要的权限信息不为空并且不需要token则不返回错误继续后续逻辑
if permission != nil && !permission.NeedToken {
return nil
}
tokenStr := rc.GinCtx.Request.Header.Get("Authorization")
// header不存在则从查询参数token中获取
if tokenStr == "" {
tokenStr = rc.GinCtx.Query("token")
}
@@ -26,6 +100,13 @@ func PermissionHandler(rc *ReqCtx) error {
if err != nil || loginAccount == nil {
return permissionError
}
// 权限不为nil并且permission code不为空则校验是否有权限code
if permission != nil && permission.Code != "" {
if !permissionCodeRegistry.HasCode(loginAccount.Id, permission.Code) {
return permissionError
}
}
rc.LoginAccount = loginAccount
return nil
}

View File

@@ -14,15 +14,17 @@ type HandlerFunc func(*ReqCtx)
type ReqCtx struct {
GinCtx *gin.Context // gin context
NeedToken bool // 是否需要token
LoginAccount *model.LoginAccount // 登录账号信息,只有校验token后才会有值
// NeedToken bool // 是否需要token
RequiredPermission *Permission // 需要的权限信息默认为nil需要校验token
LoginAccount *model.LoginAccount // 登录账号信息只有校验token后才会有值
LogInfo *LogInfo // 日志相关信息
ReqParam interface{} // 请求参数,主要用于记录日志
ResData interface{} // 响应结果
Err interface{} // 请求错误
timed int64 // 执行时间
noRes bool // 无需返回结果,即文件下载等
timed int64 // 执行时间
noRes bool // 无需返回结果,即文件下载等
}
func (rc *ReqCtx) Handle(handler HandlerFunc) {
@@ -65,11 +67,11 @@ func (rc *ReqCtx) Download(data []byte, filename string) {
// 新建请求上下文默认需要校验token
func NewReqCtx() *ReqCtx {
return &ReqCtx{NeedToken: true}
return &ReqCtx{}
}
func NewReqCtxWithGin(g *gin.Context) *ReqCtx {
return &ReqCtx{NeedToken: true, GinCtx: g}
return &ReqCtx{GinCtx: g}
}
// 调用该方法设置请求描述,则默认记录日志,并不记录响应结果
@@ -78,9 +80,15 @@ func (r *ReqCtx) WithLog(li *LogInfo) *ReqCtx {
return r
}
// 设置请求上下文需要的权限信息
func (r *ReqCtx) WithRequiredPermission(permission *Permission) *ReqCtx {
r.RequiredPermission = permission
return r
}
// 是否需要token
func (r *ReqCtx) WithNeedToken(needToken bool) *ReqCtx {
r.NeedToken = needToken
r.RequiredPermission = &Permission{NeedToken: false}
return r
}

View File

@@ -29,7 +29,7 @@ func GormMysql() *gorm.DB {
SingularTable: true,
}, Logger: logger.Default.LogMode(logger.Silent)}
if db, err := gorm.Open(mysql.New(mysqlConfig), ormConfig); err != nil {
global.Log.Panic("连接mysql失败! [%s]")
global.Log.Panicf("连接mysql失败! [%s]", err.Error())
return nil
} else {
sqlDB, _ := db.DB()

View File

@@ -0,0 +1,13 @@
package utils
import (
"crypto/md5"
"encoding/hex"
)
// md5
func Md5(str string) string {
h := md5.New()
h.Write([]byte(str))
return hex.EncodeToString(h.Sum(nil))
}

View File

@@ -62,14 +62,9 @@ service.interceptors.response.use(
const data: Result = response.data;
// 如果提示没有权限则移除token使其重新登录
if (data.code === ResultEnum.NO_PERMISSION) {
removeSession('token')
notifyErrorMsg('登录超时')
setTimeout(() => {
router.push({
path: '/login',
});
}, 1000)
return;
router.push({
path: '/401',
});
}
if (data.code === ResultEnum.SUCCESS) {
return data.data;

View File

@@ -16,57 +16,7 @@ export function templateResolve(template: string, param: any) {
});
}
// export function textToImg(str: string) {
// var name, fsize;
// if (str.length < 2) {
// name = str;
// fsize = 60
// } else {
// if (str.length == 2) {
// name = str.substring(0, str.length);
// fsize = 45
// } else {
// if (str.length == 3) {
// name = str.substring(0, str.length);
// fsize = 30
// } else {
// if (str.length == 4) {
// name = str.substring(0, str.length);
// fsize = 25
// } else {
// if (str.length > 4) {
// name = str.substring(0, 2);
// fsize = 45
// }
// }
// }
// }
// }
// var fontSize = 60;
// var fontWeight = "bold";
// var canvas: any = document.getElementById("head_canvas_default");
// var img1 = document.getElementById("head_canvas_default");
// canvas.width = 120;
// canvas.height = 120;
// var context = canvas.getContext("2d");
// context.fillStyle = getBG();
// context.fillRect(0, 0, canvas.width, canvas.height);
// context.fillStyle = "#FFF";
// context.font = fontWeight + " " + fsize + "px sans-serif";
// context.textAlign = "center";
// context.textBaseline = "middle";
// context.fillText(name, fontSize, fontSize);
// return canvas.toDataURL("image/png")
// }
// function getBG() {
// var bgArray = ["#1abc9c", "#2ecc71", "#3498db", "#9b59b6", "#34495e",
// "#16a085", "#27ae60", "#2980b9", "#8e44ad", "#2c3e50", "#f1c40f",
// "#e67e22", "#e74c3c", "#eca0f1", "#95a5a6", "#f39c12", "#d35400",
// "#c0392b", "#bdc3c7", "#7f8c8d"];
// var color = bgArray[Math.floor(Math.random() * bgArray.length)];
// return color
// };
// 首字符头像
export function letterAvatar(name: string, size = 60, color = '') {
name = name || '';
size = size || 60;
@@ -76,6 +26,7 @@ export function letterAvatar(name: string, size = 60, color = '') {
],
nameSplit = String(name).split(' '),
initials, charIndex, colourIndex, canvas, context, dataURI;
if (nameSplit.length == 1) {
initials = nameSplit[0] ? nameSplit[0].charAt(0) : '?';
} else {

View File

@@ -26,6 +26,7 @@
v-model="loginForm.code"
clearable
autocomplete="off"
@keyup.enter="onSignIn"
></el-input>
</el-col>
<el-col :span="8">
@@ -61,7 +62,7 @@ export default defineComponent({
const router = useRouter();
const state = reactive({
loginForm: {
username: 'admin',
username: 'test',
password: '123456',
code: '1234',
},

View File

@@ -3,7 +3,7 @@
<el-dialog :title="title" v-model="visible" :show-close="true" :before-close="handleClose" width="800px">
<div class="toolbar">
<div style="float: right">
<el-button type="primary" @click="add" icon="el-icon-plus" size="mini" plain>添加</el-button>
<el-button v-auth="'machine:file:add'" type="primary" @click="add" icon="el-icon-plus" size="mini" plain>添加</el-button>
</div>
</div>
<!-- <div style="float: right;">
@@ -35,7 +35,15 @@
<el-button v-if="scope.row.id != null" @click="getConf(scope.row)" type="primary" icon="el-icon-tickets" size="mini" plain
>查看</el-button
>
<el-button type="danger" @click="deleteRow(scope.$index, scope.row)" icon="el-icon-delete" size="mini" plain>删除</el-button>
<el-button
v-auth="'machine:file:del'"
type="danger"
@click="deleteRow(scope.$index, scope.row)"
icon="el-icon-delete"
size="mini"
plain
>删除</el-button
>
</template>
</el-table-column>
</el-table>
@@ -85,10 +93,17 @@
:limit="100"
style="display: inline-block; margin-left: 2px"
>
<el-link v-if="data.type == 'd'" @click.prevent icon="el-icon-upload" :underline="false" />
<el-link
v-auth="'machine:file:upload'"
v-if="data.type == 'd'"
@click.prevent
icon="el-icon-upload"
:underline="false"
/>
</el-upload>
<el-link
v-auth="'machine:file:write'"
v-if="data.type == '-'"
@click.prevent="downloadFile(node, data)"
type="danger"
@@ -98,6 +113,7 @@
/>
<el-link
v-auth="'machine:file:rm'"
v-if="!dontOperate(data)"
@click.prevent="deleteFile(node, data)"
type="danger"
@@ -126,7 +142,7 @@
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="updateContent" size="mini"> </el-button>
<el-button v-auth="'machine:file:write'" type="primary" @click="updateContent" size="mini"> </el-button>
<el-button @click="fileContent.contentVisible = false" size="mini"> </el-button>
</div>
</template>

View File

@@ -31,7 +31,7 @@
<template #footer>
<div class="dialog-footer">
<el-button type="primary" :loading="btnLoading" @click="btnOk" size="mini" :disabled="submitDisabled"> </el-button>
<el-button v-auth="'machine:script:save'" type="primary" :loading="btnLoading" @click="btnOk" size="mini" :disabled="submitDisabled"> </el-button>
<el-button @click="cancel()" :disabled="submitDisabled" size="mini"> </el-button>
</div>
</template>

View File

@@ -12,8 +12,17 @@
<el-button @click="editScript(currentData)" :disabled="currentId == null" type="primary" icon="el-icon-tickets" size="mini" plain
>查看</el-button
>
<el-button type="primary" @click="editScript(null)" icon="el-icon-plus" size="mini" plain>添加</el-button>
<el-button :disabled="currentId == null" type="danger" @click="deleteRow(currentData)" icon="el-icon-delete" size="mini" plain
<el-button v-auth="'machine:script:save'" type="primary" @click="editScript(null)" icon="el-icon-plus" size="mini" plain
>添加</el-button
>
<el-button
v-auth="'machine:script:del'"
:disabled="currentId == null"
type="danger"
@click="deleteRow(currentData)"
icon="el-icon-delete"
size="mini"
plain
>删除</el-button
>
</div>
@@ -40,7 +49,14 @@
>确定</el-button
>
<el-button v-if="scope.row.id != null" @click="runScript(scope.row)" type="primary" icon="el-icon-tickets" size="mini" plain
<el-button
v-auth="'machine:script:run'"
v-if="scope.row.id != null"
@click="runScript(scope.row)"
type="primary"
icon="el-icon-tickets"
size="mini"
plain
>执行</el-button
>
</template>
@@ -78,7 +94,7 @@
</template>
<script lang="ts">
import { ref, toRefs, reactive, watch, onMounted, defineComponent } from 'vue';
import { toRefs, reactive, watch, defineComponent } from 'vue';
import { ElMessage, ElMessageBox } from 'element-plus';
import SshTerminal from './SshTerminal.vue';
import { machineApi } from './api';

View File

@@ -202,6 +202,7 @@ export default defineComponent({
id: data.id,
})
.then((res) => {
console.log(res)
ElMessage.success('删除成功!');
search();
});

BIN
server/__debug_bin Executable file

Binary file not shown.

View File

@@ -63,7 +63,8 @@ func (m *Machine) WsSSH(g *gin.Context) {
panic(biz.NewBizErr("升级websocket失败"))
}
// 权限校验
if err = ctx.PermissionHandler(ctx.NewReqCtxWithGin(g)); err != nil {
rc := ctx.NewReqCtxWithGin(g).WithRequiredPermission(ctx.NewPermission("machine:terminal"))
if err = ctx.PermissionHandler(rc); err != nil {
panic(biz.NewBizErr("没有权限"))
}

View File

@@ -22,14 +22,20 @@ func InitMachineFileRouter(router *gin.RouterGroup) {
// 新增修改机器文件
addFileConf := ctx.NewLogInfo("新增机器文件配置")
afcP := ctx.NewPermission("machine:file:add")
machineFile.POST(":machineId/files", func(c *gin.Context) {
ctx.NewReqCtxWithGin(c).WithLog(addFileConf).Handle(mf.SaveMachineFiles)
ctx.NewReqCtxWithGin(c).WithLog(addFileConf).
WithRequiredPermission(afcP).
Handle(mf.SaveMachineFiles)
})
// 删除机器文件
delFileConf := ctx.NewLogInfo("新增机器文件配置")
delFileConf := ctx.NewLogInfo("删除机器文件配置")
dfcP := ctx.NewPermission("machine:file:del")
machineFile.DELETE(":machineId/files/:fileId", func(c *gin.Context) {
ctx.NewReqCtxWithGin(c).WithLog(delFileConf).Handle(mf.DeleteFile)
ctx.NewReqCtxWithGin(c).WithLog(delFileConf).
WithRequiredPermission(dfcP).
Handle(mf.DeleteFile)
})
getContent := ctx.NewLogInfo("读取机器文件内容")
@@ -45,21 +51,27 @@ func InitMachineFileRouter(router *gin.RouterGroup) {
})
writeFile := ctx.NewLogInfo("写入or下载文件内容")
wfP := ctx.NewPermission("machine:file:write")
machineFile.POST(":machineId/files/:fileId/write", func(c *gin.Context) {
rc := ctx.NewReqCtxWithGin(c).WithLog(writeFile)
rc.Handle(mf.WriteFileContent)
ctx.NewReqCtxWithGin(c).WithLog(writeFile).
WithRequiredPermission(wfP).
Handle(mf.WriteFileContent)
})
uploadFile := ctx.NewLogInfo("文件上传")
ufP := ctx.NewPermission("machine:file:upload")
machineFile.POST(":machineId/files/:fileId/upload", func(c *gin.Context) {
rc := ctx.NewReqCtxWithGin(c).WithLog(uploadFile)
rc.Handle(mf.UploadFile)
ctx.NewReqCtxWithGin(c).WithLog(uploadFile).
WithRequiredPermission(ufP).
Handle(mf.UploadFile)
})
removeFile := ctx.NewLogInfo("删除文件or文件夹")
rfP := ctx.NewPermission("machine:file:rm")
machineFile.DELETE(":machineId/files/:fileId/remove", func(c *gin.Context) {
rc := ctx.NewReqCtxWithGin(c).WithLog(removeFile)
rc.Handle(mf.RemoveFile)
ctx.NewReqCtxWithGin(c).WithLog(removeFile).
WithRequiredPermission(rfP).
Handle(mf.RemoveFile)
})
}
}

View File

@@ -21,24 +21,30 @@ func InitMachineScriptRouter(router *gin.RouterGroup) {
})
saveMachienScriptLog := ctx.NewLogInfo("保存脚本")
smsP := ctx.NewPermission("machine:script:save")
// 保存脚本
machines.POST(":machineId/scripts", func(c *gin.Context) {
rc := ctx.NewReqCtxWithGin(c).WithLog(saveMachienScriptLog)
rc.Handle(ms.SaveMachineScript)
ctx.NewReqCtxWithGin(c).WithLog(saveMachienScriptLog).
WithRequiredPermission(smsP).
Handle(ms.SaveMachineScript)
})
deleteLog := ctx.NewLogInfo("删除脚本")
dP := ctx.NewPermission("machine:script:del")
// 保存脚本
machines.DELETE(":machineId/scripts/:scriptId", func(c *gin.Context) {
rc := ctx.NewReqCtxWithGin(c).WithLog(deleteLog)
rc.Handle(ms.DeleteMachineScript)
ctx.NewReqCtxWithGin(c).WithLog(deleteLog).
WithRequiredPermission(dP).
Handle(ms.DeleteMachineScript)
})
runLog := ctx.NewLogInfo("执行机器脚本")
rP := ctx.NewPermission("machine:script:run")
// 运行脚本
machines.GET(":machineId/scripts/:scriptId/run", func(c *gin.Context) {
rc := ctx.NewReqCtxWithGin(c).WithLog(runLog)
rc.Handle(ms.RunMachineScript)
ctx.NewReqCtxWithGin(c).WithLog(runLog).
WithRequiredPermission(rP).
Handle(ms.RunMachineScript)
})
}
}

BIN
server/mayfly-go Executable file

Binary file not shown.

417
server/mayfly-go.sql Normal file
View File

@@ -0,0 +1,417 @@
/*
Navicat Premium Data Transfer
Source Server : self
Source Server Type : MySQL
Source Server Version : 80018
Source Host : localhost:3306
Source Schema : mayfly-go
Target Server Type : MySQL
Target Server Version : 80018
File Encoding : 65001
Date: 08/06/2021 14:52:42
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_account
-- ----------------------------
DROP TABLE IF EXISTS `t_account`;
CREATE TABLE `t_account` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(12) NOT NULL,
`password` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`status` tinyint(4) DEFAULT NULL,
`create_time` datetime NOT NULL,
`creator_id` bigint(255) NOT NULL,
`creator` varchar(12) NOT NULL,
`update_time` datetime NOT NULL,
`modifier_id` bigint(255) NOT NULL,
`modifier` varchar(12) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of t_account
-- ----------------------------
BEGIN;
INSERT INTO `t_account` VALUES (1, 'admin', '7b116d117002fad3f6dde6c718b885b9', 1, '2020-01-01 19:00:00', 1, 'admin', '2020-01-01 19:00:00', 1, 'admin');
INSERT INTO `t_account` VALUES (2, 'admin2', 'e10adc3949ba59abbe56e057f20f883e', -1, '2020-09-09 12:00:09', 2, 'haha', '2020-09-09 12:00:09', 2, 'haha');
COMMIT;
-- ----------------------------
-- Table structure for t_account_role
-- ----------------------------
DROP TABLE IF EXISTS `t_account_role`;
CREATE TABLE `t_account_role` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Id',
`account_id` bigint(20) NOT NULL COMMENT '账号id',
`role_id` bigint(20) NOT NULL COMMENT '角色id',
`creator` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`creator_id` bigint(20) unsigned DEFAULT NULL,
`create_time` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of t_account_role
-- ----------------------------
BEGIN;
INSERT INTO `t_account_role` VALUES (23, 3, 6, 'admin', 1, '2021-05-28 16:19:21');
INSERT INTO `t_account_role` VALUES (24, 2, 1, 'admin', 1, '2021-05-28 16:21:38');
INSERT INTO `t_account_role` VALUES (25, 1, 1, 'admin', 1, '2021-05-28 16:21:45');
INSERT INTO `t_account_role` VALUES (26, 4, 6, 'admin', 1, '2021-05-28 17:04:48');
INSERT INTO `t_account_role` VALUES (29, 1, 6, 'admin', 1, '2021-06-02 16:07:44');
COMMIT;
-- ----------------------------
-- Table structure for t_db
-- ----------------------------
DROP TABLE IF EXISTS `t_db`;
CREATE TABLE `t_db` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(32) DEFAULT NULL COMMENT '数据库名称',
`host` varchar(20) NOT NULL,
`port` int(8) NOT NULL,
`username` varchar(255) NOT NULL,
`password` varchar(255) DEFAULT NULL,
`type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '数据库类型(mysql...)',
`database` varchar(32) DEFAULT NULL,
`network` varchar(8) DEFAULT NULL,
`remark` varchar(125) DEFAULT NULL COMMENT '备注,描述等',
`create_time` datetime DEFAULT NULL,
`creator_id` bigint(20) DEFAULT NULL,
`creator` varchar(32) DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
`modifier_id` bigint(20) DEFAULT NULL,
`modifier` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='数据库信息表';
-- ----------------------------
-- Records of t_db
-- ----------------------------
BEGIN;
INSERT INTO `t_db` VALUES (1, 'mayfly-go', 'localhost', 3306, 'root', '******', 'mysql', 'mayfly-job', 'tcp', NULL, '2020-12-14 15:04:43', NULL, NULL, '2020-12-14 15:04:48', NULL, NULL);
INSERT INTO `t_db` VALUES (2, 'maylfy', '114.67.67.10', 3306, 'root', '******', 'mysql', 'mayfly', 'tcp', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `t_db` VALUES (3, 'mayfly-oracle', 'localhost', 1521, 'TEST', '******', 'godror', 'xe', 'tcp', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
COMMIT;
-- ----------------------------
-- Table structure for t_db_sql
-- ----------------------------
DROP TABLE IF EXISTS `t_db_sql`;
CREATE TABLE `t_db_sql` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`db_id` bigint(20) NOT NULL COMMENT '数据库id',
`sql` text,
`type` tinyint(8) NOT NULL,
`creator_id` bigint(20) NOT NULL,
`creator` varchar(32) DEFAULT NULL,
`create_time` datetime NOT NULL,
`update_time` datetime NOT NULL,
`modifier_id` bigint(20) DEFAULT NULL,
`modifier` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of t_db_sql
-- ----------------------------
BEGIN;
INSERT INTO `t_db_sql` VALUES (2, 1, 'SELECT\n *\nFROM\n t_account\n \nSELECT\n *\nFROM\n t_db\n \nSELECT\n *\nFROM\n t_db_sql', 1, 1, 'admin', '2020-12-18 15:27:53', '2021-04-25 11:09:04', 1, 'admin');
INSERT INTO `t_db_sql` VALUES (3, 2, 'SELECT\n *\nFROM\n t_account\n \nSELECT\n *\nFROM\n t_resource\n \nSELECT\n *\nFROM\n t_sys_operation_log\nORDER BY\n id DESC\nLIMIT\n 20', 1, 1, 'admin', '2020-12-18 17:13:36', '2021-04-21 10:16:21', 1, 'admin');
COMMIT;
-- ----------------------------
-- Table structure for t_machine
-- ----------------------------
DROP TABLE IF EXISTS `t_machine`;
CREATE TABLE `t_machine` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(32) DEFAULT NULL,
`ip` varchar(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`port` int(12) NOT NULL,
`username` varchar(12) NOT NULL,
`password` varchar(32) DEFAULT NULL,
`need_monitor` tinyint(2) DEFAULT NULL,
`create_time` datetime NOT NULL,
`creator` varchar(16) DEFAULT NULL,
`creator_id` bigint(32) DEFAULT NULL,
`update_time` datetime NOT NULL,
`modifier` varchar(12) DEFAULT NULL,
`modifier_id` bigint(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of t_machine
-- ----------------------------
BEGIN;
INSERT INTO `t_machine` VALUES (1, 'eatlife', '148.70.36.197', 22, 'root', '******', 1, '2020-01-01 10:10:10', NULL, NULL, '2020-01-01 10:10:10', NULL, NULL);
INSERT INTO `t_machine` VALUES (2, 'JD云', '114.67.67.10', 22, 'root', '******', 1, '2020-08-18 10:00:00', NULL, NULL, '2020-08-18 10:00:00', NULL, NULL);
INSERT INTO `t_machine` VALUES (4, '腾讯云', '118.24.26.101', 22, 'root', '******', NULL, '2021-05-10 15:57:49', 'admin', 1, '2021-05-10 15:57:49', 'admin', 1);
COMMIT;
-- ----------------------------
-- Table structure for t_machine_file
-- ----------------------------
DROP TABLE IF EXISTS `t_machine_file`;
CREATE TABLE `t_machine_file` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '机器文件配置linux一切皆文件故也可以表示目录',
`machine_id` bigint(20) NOT NULL,
`name` varchar(45) NOT NULL,
`path` varchar(45) NOT NULL,
`type` varchar(45) NOT NULL COMMENT '1目录2文件',
`creator_id` bigint(20) unsigned DEFAULT NULL,
`creator` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`modifier_id` bigint(20) unsigned DEFAULT NULL,
`modifier` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`create_time` datetime NOT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8 COMMENT='机器文件';
-- ----------------------------
-- Records of t_machine_file
-- ----------------------------
BEGIN;
INSERT INTO `t_machine_file` VALUES (1, 1, 'redis配置文件', '/etc/my.cnf', '2', 1, 'admin', NULL, NULL, '2019-08-21 11:30:33', NULL);
INSERT INTO `t_machine_file` VALUES (10, 2, 'java-dockerfile', '/usr/local/java/Dockerfile', '2', 1, 'admin', NULL, NULL, '2019-11-06 15:16:12', NULL);
INSERT INTO `t_machine_file` VALUES (11, 1, 'usr', '/usr', '1', 1, 'admin', NULL, NULL, '2019-11-06 15:16:12', NULL);
INSERT INTO `t_machine_file` VALUES (12, 1, 'opt', '/opt', '1', 1, 'admin', NULL, NULL, '2019-11-06 15:16:12', NULL);
INSERT INTO `t_machine_file` VALUES (13, 3, '根目录', '/', '1', 1, 'admin', NULL, NULL, '2019-11-18 05:19:28', NULL);
INSERT INTO `t_machine_file` VALUES (14, 1, 'usr', '/usr/local', '1', 1, 'admin', NULL, NULL, '2019-11-19 05:52:28', NULL);
INSERT INTO `t_machine_file` VALUES (15, 2, 'usr', '/usr/', '1', 1, 'admin', NULL, NULL, '2019-11-19 08:35:19', NULL);
INSERT INTO `t_machine_file` VALUES (16, 3, '软件安装目录', '/usr/local', '1', 1, 'admin', NULL, NULL, '2019-11-19 08:40:55', NULL);
INSERT INTO `t_machine_file` VALUES (23, 4, '根目录', '/', '1', 1, 'admin', NULL, NULL, '2019-12-11 07:54:04', NULL);
INSERT INTO `t_machine_file` VALUES (24, 4, '项目目录', '/usr/local/java', '1', 1, 'admin', NULL, NULL, '2020-03-07 07:12:20', NULL);
INSERT INTO `t_machine_file` VALUES (25, 8, '软件安装位置', '/usr/local', '1', 1, 'admin', NULL, NULL, '2020-08-28 09:41:56', NULL);
INSERT INTO `t_machine_file` VALUES (28, 2, 'java目录', '/usr/local/java', '1', 1, 'admin', 1, 'admin', '2021-05-08 17:32:25', '2021-05-08 17:32:25');
COMMIT;
-- ----------------------------
-- Table structure for t_machine_monitor
-- ----------------------------
DROP TABLE IF EXISTS `t_machine_monitor`;
CREATE TABLE `t_machine_monitor` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`machine_id` bigint(20) unsigned NOT NULL COMMENT '机器id',
`cpu_rate` float(255,2) DEFAULT NULL,
`mem_rate` float(255,2) DEFAULT NULL,
`sys_load` varchar(32) DEFAULT NULL,
`create_time` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6345 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of t_machine_monitor
-- ----------------------------
-- ----------------------------
-- Table structure for t_machine_script
-- ----------------------------
DROP TABLE IF EXISTS `t_machine_script`;
CREATE TABLE `t_machine_script` (
`id` bigint(64) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL COMMENT '脚本名',
`machine_id` bigint(64) NOT NULL COMMENT '机器id[0:公共]',
`script` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '脚本内容',
`description` varchar(255) DEFAULT NULL COMMENT '脚本描述',
`type` tinyint(8) DEFAULT NULL COMMENT '脚本类型[1: 有结果2无结果3实时交互]',
`creator_id` bigint(20) DEFAULT NULL,
`creator` varchar(32) DEFAULT NULL,
`modifier_id` bigint(20) DEFAULT NULL,
`modifier` varchar(255) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of t_machine_script
-- ----------------------------
BEGIN;
INSERT INTO `t_machine_script` VALUES (1, 'sys_info', 9999999, '# 获取系统cpu信息\nfunction get_cpu_info() {\n Physical_CPUs=$(grep \"physical id\" /proc/cpuinfo | sort | uniq | wc -l)\n Virt_CPUs=$(grep \"processor\" /proc/cpuinfo | wc -l)\n CPU_Kernels=$(grep \"cores\" /proc/cpuinfo | uniq | awk -F \': \' \'{print $2}\')\n CPU_Type=$(grep \"model name\" /proc/cpuinfo | awk -F \': \' \'{print $2}\' | sort | uniq)\n CPU_Arch=$(uname -m)\n echo -e \'\\n-------------------------- CPU信息 --------------------------\'\n cat <<EOF | column -t\n物理CPU个数: $Physical_CPUs\n逻辑CPU个数: $Virt_CPUs\n每CPU核心数: $CPU_Kernels\nCPU型号: $CPU_Type\nCPU架构: $CPU_Arch\nEOF\n}\n\n# 获取系统信息\nfunction get_systatus_info() {\n sys_os=$(uname -o)\n sys_release=$(cat /etc/redhat-release)\n sys_kernel=$(uname -r)\n sys_hostname=$(hostname)\n sys_selinux=$(getenforce)\n sys_lang=$(echo $LANG)\n sys_lastreboot=$(who -b | awk \'{print $3,$4}\')\n echo -e \'-------------------------- 系统信息 --------------------------\'\n cat <<EOF | column -t\n系统: ${sys_os}\n发行版本: ${sys_release}\n系统内核: ${sys_kernel}\n主机名: ${sys_hostname}\nselinux状态: ${sys_selinux}\n系统语言: ${sys_lang}\n系统最后重启时间: ${sys_lastreboot}\nEOF\n}\n\nget_systatus_info\n#echo -e \"\\n\"\nget_cpu_info', '获取系统信息', 1, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `t_machine_script` VALUES (2, 'get_process_by_name', 9999999, '#! /bin/bash\n# Function: 根据输入的程序的名字过滤出所对应的PID并显示出详细信息如果有几个PID则全部显示\nNAME=java\nN=`ps -aux | grep $NAME | grep -v grep | wc -l` ##统计进程总数\nif [ $N -le 0 ];then\n echo \"无该进程!\"\nfi\ni=1\nwhile [ $N -gt 0 ]\ndo\n echo \"进程PID: `ps -aux | grep $NAME | grep -v grep | awk \'NR==\'$i\'{print $0}\'| awk \'{print $2}\'`\"\n echo \"进程命令:`ps -aux | grep $NAME | grep -v grep | awk \'NR==\'$i\'{print $0}\'| awk \'{print $11}\'`\"\n echo \"进程所属用户: `ps -aux | grep $NAME | grep -v grep | awk \'NR==\'$i\'{print $0}\'| awk \'{print $1}\'`\"\n echo \"CPU占用率`ps -aux | grep $NAME | grep -v grep | awk \'NR==\'$i\'{print $0}\'| awk \'{print $3}\'`%\"\n echo \"内存占用率:`ps -aux | grep $NAME | grep -v grep | awk \'NR==\'$i\'{print $0}\'| awk \'{print $4}\'`%\"\n echo \"进程开始运行的时刻:`ps -aux | grep $NAME | grep -v grep | awk \'NR==\'$i\'{print $0}\'| awk \'{print $9}\'`\"\n echo \"进程运行的时间:` ps -aux | grep $NAME | grep -v grep | awk \'NR==\'$i\'{print $0}\'| awk \'{print $11}\'`\"\n echo \"进程状态:`ps -aux | grep $NAME | grep -v grep | awk \'NR==\'$i\'{print $0}\'| awk \'{print $8}\'`\"\n echo \"进程虚拟内存:`ps -aux | grep $NAME | grep -v grep | awk \'NR==\'$i\'{print $0}\'| awk \'{print $5}\'`\"\n echo \"进程共享内存:`ps -aux | grep $NAME | grep -v grep | awk \'NR==\'$i\'{print $0}\'| awk \'{print $6}\'`\"\n echo \"***************************************************************\"\n let N-- i++\ndone', '获取进程运行状态', 1, NULL, NULL, 1, 'admin', NULL, '2021-05-05 16:52:54');
INSERT INTO `t_machine_script` VALUES (3, 'sys_run_info', 9999999, '#!/bin/bash\n# 获取要监控的本地服务器IP地址\nIP=`ifconfig | grep inet | grep -vE \'inet6|127.0.0.1\' | awk \'{print $2}\'`\necho \"IP地址\"$IP\n \n# 获取cpu总核数\ncpu_num=`grep -c \"model name\" /proc/cpuinfo`\necho \"cpu总核数\"$cpu_num\n \n# 1、获取CPU利用率\n################################################\n#us 用户空间占用CPU百分比\n#sy 内核空间占用CPU百分比\n#ni 用户进程空间内改变过优先级的进程占用CPU百分比\n#id 空闲CPU百分比\n#wa 等待输入输出的CPU时间百分比\n#hi 硬件中断\n#si 软件中断\n#################################################\n# 获取用户空间占用CPU百分比\ncpu_user=`top -b -n 1 | grep Cpu | awk \'{print $2}\' | cut -f 1 -d \"%\"`\necho \"用户空间占用CPU百分比\"$cpu_user\n \n# 获取内核空间占用CPU百分比\ncpu_system=`top -b -n 1 | grep Cpu | awk \'{print $4}\' | cut -f 1 -d \"%\"`\necho \"内核空间占用CPU百分比\"$cpu_system\n \n# 获取空闲CPU百分比\ncpu_idle=`top -b -n 1 | grep Cpu | awk \'{print $8}\' | cut -f 1 -d \"%\"`\necho \"空闲CPU百分比\"$cpu_idle\n \n# 获取等待输入输出占CPU百分比\ncpu_iowait=`top -b -n 1 | grep Cpu | awk \'{print $10}\' | cut -f 1 -d \"%\"`\necho \"等待输入输出占CPU百分比\"$cpu_iowait\n \n#2、获取CPU上下文切换和中断次数\n# 获取CPU中断次数\ncpu_interrupt=`vmstat -n 1 1 | sed -n 3p | awk \'{print $11}\'`\necho \"CPU中断次数\"$cpu_interrupt\n \n# 获取CPU上下文切换次数\ncpu_context_switch=`vmstat -n 1 1 | sed -n 3p | awk \'{print $12}\'`\necho \"CPU上下文切换次数\"$cpu_context_switch\n \n#3、获取CPU负载信息\n# 获取CPU15分钟前到现在的负载平均值\ncpu_load_15min=`uptime | awk \'{print $11}\' | cut -f 1 -d \',\'`\necho \"CPU 15分钟前到现在的负载平均值\"$cpu_load_15min\n \n# 获取CPU5分钟前到现在的负载平均值\ncpu_load_5min=`uptime | awk \'{print $10}\' | cut -f 1 -d \',\'`\necho \"CPU 5分钟前到现在的负载平均值\"$cpu_load_5min\n \n# 获取CPU1分钟前到现在的负载平均值\ncpu_load_1min=`uptime | awk \'{print $9}\' | cut -f 1 -d \',\'`\necho \"CPU 1分钟前到现在的负载平均值\"$cpu_load_1min\n \n# 获取任务队列(就绪状态等待的进程数)\ncpu_task_length=`vmstat -n 1 1 | sed -n 3p | awk \'{print $1}\'`\necho \"CPU任务队列长度\"$cpu_task_length\n \n#4、获取内存信息\n# 获取物理内存总量\nmem_total=`free -h | grep Mem | awk \'{print $2}\'`\necho \"物理内存总量:\"$mem_total\n \n# 获取操作系统已使用内存总量\nmem_sys_used=`free -h | grep Mem | awk \'{print $3}\'`\necho \"已使用内存总量(操作系统)\"$mem_sys_used\n \n# 获取操作系统未使用内存总量\nmem_sys_free=`free -h | grep Mem | awk \'{print $4}\'`\necho \"剩余内存总量(操作系统)\"$mem_sys_free\n \n# 获取应用程序已使用的内存总量\nmem_user_used=`free | sed -n 3p | awk \'{print $3}\'`\necho \"已使用内存总量(应用程序)\"$mem_user_used\n \n# 获取应用程序未使用内存总量\nmem_user_free=`free | sed -n 3p | awk \'{print $4}\'`\necho \"剩余内存总量(应用程序)\"$mem_user_free\n \n# 获取交换分区总大小\nmem_swap_total=`free | grep Swap | awk \'{print $2}\'`\necho \"交换分区总大小:\"$mem_swap_total\n \n# 获取已使用交换分区大小\nmem_swap_used=`free | grep Swap | awk \'{print $3}\'`\necho \"已使用交换分区大小:\"$mem_swap_used\n \n# 获取剩余交换分区大小\nmem_swap_free=`free | grep Swap | awk \'{print $4}\'`\necho \"剩余交换分区大小:\"$mem_swap_free', '获取cpu、内存等系统运行状态', 1, NULL, NULL, NULL, NULL, NULL, '2021-04-25 15:07:16');
INSERT INTO `t_machine_script` VALUES (4, 'top', 9999999, 'top', '实时获取系统运行状态', 3, NULL, NULL, 1, 'admin', NULL, '2021-05-24 15:58:20');
INSERT INTO `t_machine_script` VALUES (9, 'fasf', 0, 'fafsd', 'fasdfa', 2, 1, 'admin', 1, 'admin', '2021-04-25 15:55:25', '2021-04-25 15:55:25');
INSERT INTO `t_machine_script` VALUES (10, 'fas', 0, 'd', 'f', 2, 1, 'admin', 1, 'admin', '2021-04-25 15:58:14', '2021-04-25 15:58:14');
INSERT INTO `t_machine_script` VALUES (11, 'tests', 0, 'fsfsdf', 'fsdfs', 2, 1, 'admin', 1, 'admin', '2021-04-25 16:13:06', '2021-04-25 16:13:06');
INSERT INTO `t_machine_script` VALUES (12, 'fafas', 0, 'sdsd', 'fsfsd', 2, 1, 'admin', 1, 'admin', '2021-04-25 16:14:41', '2021-04-25 16:14:41');
INSERT INTO `t_machine_script` VALUES (15, 'mvn_install', 4, 'mvn clean -Dmaven.test.skip=true install', 'mvn打包', 3, 1, 'admin', 1, 'admin', '2021-05-10 15:58:34', '2021-06-03 11:12:25');
COMMIT;
-- ----------------------------
-- Table structure for t_resource
-- ----------------------------
DROP TABLE IF EXISTS `t_resource`;
CREATE TABLE `t_resource` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`pid` int(11) NOT NULL,
`type` tinyint(255) NOT NULL COMMENT '1菜单路由2资源按钮等',
`status` int(255) NOT NULL,
`name` varchar(255) NOT NULL,
`code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '主要用于按钮等资源',
`weight` int(11) DEFAULT NULL,
`meta` varchar(255) DEFAULT NULL COMMENT '原数据',
`creator_id` bigint(20) NOT NULL,
`creator` varchar(255) NOT NULL,
`modifier_id` bigint(20) NOT NULL,
`modifier` varchar(255) NOT NULL,
`create_time` datetime NOT NULL,
`update_time` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=48 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of t_resource
-- ----------------------------
BEGIN;
INSERT INTO `t_resource` VALUES (1, 0, 1, 1, '首页', '/home', 1, '{\"component\":\"Home\",\"icon\":\"el-icon-s-home\",\"isAffix\":true,\"isKeepAlive\":true,\"routeName\":\"Home\"}', 1, 'admin', 1, 'admin', '2021-05-25 16:44:41', '2021-05-27 09:12:56');
INSERT INTO `t_resource` VALUES (2, 0, 1, 1, '运维', '/ops', 3, '{\"icon\":\"el-icon-monitor\",\"isKeepAlive\":true,\"redirect\":\"machine/list\",\"routeName\":\"Ops\"}', 1, 'admin', 1, 'admin', '2021-05-25 16:48:16', '2021-06-08 14:20:24');
INSERT INTO `t_resource` VALUES (3, 2, 1, 1, '机器列表', 'machines', 1, '{\"component\":\"MachineList\",\"icon\":\"el-icon-menu\",\"isKeepAlive\":true,\"routeName\":\"MachineList\"}', 2, 'admin', 1, 'admin', '2021-05-25 16:50:04', '2021-06-03 10:03:29');
INSERT INTO `t_resource` VALUES (4, 0, 1, 1, '系统管理', '/sys', 4, '{\"icon\":\"el-icon-setting\",\"isKeepAlive\":true,\"redirect\":\"/sys/resources\",\"routeName\":\"sys\"}', 1, 'admin', 1, 'admin', '2021-05-26 15:20:20', '2021-06-08 14:20:34');
INSERT INTO `t_resource` VALUES (5, 4, 1, 1, '资源管理', 'resources', 3, '{\"component\":\"ResourceList\",\"icon\":\"el-icon-menu\",\"isKeepAlive\":true,\"routeName\":\"ResourceList\"}', 1, 'admin', 1, 'admin', '2021-05-26 15:23:07', '2021-06-08 11:27:55');
INSERT INTO `t_resource` VALUES (9, 0, 1, 1, 'iframes', '/iframes', 4, '{\"component\":\"RouterParent\",\"icon\":\"el-icon-pear\",\"isIframe\":true,\"isKeepAlive\":true,\"link\":\"https://www.baidu.com\",\"routeName\":\"Iframe\"}', 1, 'admin', 1, 'admin', '2021-05-27 09:58:37', '2021-06-02 11:23:23');
INSERT INTO `t_resource` VALUES (11, 4, 1, 1, '角色管理', 'roles', 2, '{\"component\":\"RoleList\",\"icon\":\"el-icon-menu\",\"isKeepAlive\":true,\"routeName\":\"RoleList\"}', 1, 'admin', 1, 'admin', '2021-05-27 11:15:35', '2021-06-03 09:59:41');
INSERT INTO `t_resource` VALUES (12, 3, 2, 1, '机器终端按钮', 'machine:terminal', 4, '', 1, 'admin', 1, 'admin', '2021-05-28 14:06:02', '2021-05-31 17:47:59');
INSERT INTO `t_resource` VALUES (14, 4, 1, 1, '账号管理', 'accounts', 1, '{\"component\":\"AccountList\",\"icon\":\"el-icon-menu\",\"isKeepAlive\":true,\"routeName\":\"AccountList\"}', 1, 'admin', 1, 'admin', '2021-05-28 14:56:25', '2021-06-03 09:39:22');
INSERT INTO `t_resource` VALUES (15, 3, 2, 1, '文件管理按钮', 'machine:file', 5, NULL, 1, 'admin', 1, 'admin', '2021-05-31 17:44:37', '2021-05-31 17:48:07');
INSERT INTO `t_resource` VALUES (16, 3, 2, 1, '机器添加按钮', 'machine:add', 1, NULL, 1, 'admin', 1, 'admin', '2021-05-31 17:46:11', '2021-05-31 19:34:15');
INSERT INTO `t_resource` VALUES (17, 3, 2, 1, '机器编辑按钮', 'machine:update', 2, NULL, 1, 'admin', 1, 'admin', '2021-05-31 17:46:23', '2021-05-31 19:34:18');
INSERT INTO `t_resource` VALUES (18, 3, 2, 1, '机器删除按钮', 'machine:del', 3, NULL, 1, 'admin', 1, 'admin', '2021-05-31 17:46:36', '2021-05-31 19:34:17');
INSERT INTO `t_resource` VALUES (19, 14, 2, 1, '角色分配按钮', 'account:saveRoles', 1, NULL, 1, 'admin', 1, 'admin', '2021-05-31 17:50:51', '2021-05-31 19:19:30');
INSERT INTO `t_resource` VALUES (20, 11, 2, 1, '分配菜单&权限按钮', 'role:saveResources', 1, NULL, 1, 'admin', 1, 'admin', '2021-05-31 17:51:41', '2021-05-31 19:33:37');
INSERT INTO `t_resource` VALUES (21, 14, 2, 1, '账号删除按钮', 'account:del', 2, NULL, 1, 'admin', 1, 'admin', '2021-05-31 18:02:01', '2021-05-31 18:02:01');
INSERT INTO `t_resource` VALUES (22, 11, 2, 1, '角色删除按钮', 'role:del', 2, NULL, 1, 'admin', 1, 'admin', '2021-05-31 18:02:29', '2021-05-31 19:33:38');
INSERT INTO `t_resource` VALUES (23, 11, 2, 1, '角色新增按钮', 'role:add', 3, NULL, 1, 'admin', 1, 'admin', '2021-05-31 18:02:44', '2021-05-31 19:33:39');
INSERT INTO `t_resource` VALUES (24, 11, 2, 1, '角色编辑按钮', 'role:update', 4, NULL, 1, 'admin', 1, 'admin', '2021-05-31 18:02:57', '2021-05-31 19:33:40');
INSERT INTO `t_resource` VALUES (25, 5, 2, 1, '资源新增按钮', 'resource:add', 1, NULL, 1, 'admin', 1, 'admin', '2021-05-31 18:03:33', '2021-05-31 19:31:47');
INSERT INTO `t_resource` VALUES (26, 5, 2, 1, '资源删除按钮', 'resource:del', 2, NULL, 1, 'admin', 1, 'admin', '2021-05-31 18:03:47', '2021-05-31 19:29:40');
INSERT INTO `t_resource` VALUES (27, 5, 2, 1, '资源编辑按钮', 'resource:update', 3, NULL, 1, 'admin', 1, 'admin', '2021-05-31 18:04:03', '2021-05-31 19:29:40');
INSERT INTO `t_resource` VALUES (28, 5, 2, 1, '资源禁用启用按钮', 'resource:changeStatus', 4, NULL, 1, 'admin', 1, 'admin', '2021-05-31 18:04:33', '2021-05-31 18:04:33');
INSERT INTO `t_resource` VALUES (29, 14, 2, 1, '账号添加按钮', 'account:add', 3, NULL, 1, 'admin', 1, 'admin', '2021-05-31 19:23:42', '2021-05-31 19:23:42');
INSERT INTO `t_resource` VALUES (30, 14, 2, 1, '账号编辑修改按钮', 'account:update', 4, NULL, 1, 'admin', 1, 'admin', '2021-05-31 19:23:58', '2021-05-31 19:23:58');
INSERT INTO `t_resource` VALUES (31, 14, 2, 1, '账号管理基本权限', 'account', 0, NULL, 1, 'admin', 1, 'admin', '2021-05-31 21:25:06', '2021-05-31 21:25:06');
INSERT INTO `t_resource` VALUES (32, 5, 2, 1, '资源管理基本权限', 'resource', 0, NULL, 1, 'admin', 1, 'admin', '2021-05-31 21:25:25', '2021-05-31 21:25:25');
INSERT INTO `t_resource` VALUES (33, 11, 2, 1, '角色管理基本权限', 'role', 0, NULL, 1, 'admin', 1, 'admin', '2021-05-31 21:25:40', '2021-05-31 21:25:40');
INSERT INTO `t_resource` VALUES (34, 14, 2, 1, '账号启用禁用按钮', 'account:changeStatus', 5, NULL, 1, 'admin', 1, 'admin', '2021-05-31 21:29:48', '2021-05-31 21:29:48');
INSERT INTO `t_resource` VALUES (36, 2, 1, 1, 'DBMS', 'dbms', 2, '{\"icon\":\"el-icon-date\",\"isKeepAlive\":true,\"routeName\":\"DBMS\"}', 1, 'admin', 1, 'admin', '2021-06-01 14:01:33', '2021-06-03 09:58:54');
INSERT INTO `t_resource` VALUES (37, 3, 2, 1, '添加文件配置', 'machine:addFile', 6, 'null', 1, 'admin', 1, 'admin', '2021-06-01 19:54:23', '2021-06-01 19:54:23');
INSERT INTO `t_resource` VALUES (38, 36, 1, 1, '数据查询', 'select-data', 1, '{\"component\":\"SelectData\",\"icon\":\"el-icon-search\",\"isKeepAlive\":true,\"routeName\":\"SelectData\"}', 1, 'admin', 1, 'admin', '2021-06-03 09:09:29', '2021-06-03 14:34:01');
INSERT INTO `t_resource` VALUES (39, 0, 1, 1, '个人中心', '/personal', 2, '{\"component\":\"Personal\",\"icon\":\"el-icon-menu\",\"isHide\":true,\"isKeepAlive\":true,\"routeName\":\"Personal\"}', 1, 'admin', 1, 'admin', '2021-06-03 14:25:35', '2021-06-03 14:26:03');
INSERT INTO `t_resource` VALUES (40, 3, 2, 1, '文件管理-新增按钮', 'machine:file:add', 7, 'null', 1, 'admin', 1, 'admin', '2021-06-08 11:06:26', '2021-06-08 11:12:28');
INSERT INTO `t_resource` VALUES (41, 3, 2, 1, '文件管理-删除按钮', 'machine:file:del', 8, 'null', 1, 'admin', 1, 'admin', '2021-06-08 11:06:49', '2021-06-08 11:06:49');
INSERT INTO `t_resource` VALUES (42, 3, 2, 1, '文件管理-写入or下载文件权限', 'machine:file:write', 9, 'null', 1, 'admin', 1, 'admin', '2021-06-08 11:07:27', '2021-06-08 11:07:27');
INSERT INTO `t_resource` VALUES (43, 3, 2, 1, '文件管理-文件上传按钮', 'machine:file:upload', 10, 'null', 1, 'admin', 1, 'admin', '2021-06-08 11:07:42', '2021-06-08 11:07:42');
INSERT INTO `t_resource` VALUES (44, 3, 2, 1, '文件管理-删除文件按钮', 'machine:file:rm', 11, 'null', 1, 'admin', 1, 'admin', '2021-06-08 11:08:12', '2021-06-08 11:08:12');
INSERT INTO `t_resource` VALUES (45, 3, 2, 1, '脚本管理-保存脚本按钮', 'machine:script:save', 12, 'null', 1, 'admin', 1, 'admin', '2021-06-08 11:09:01', '2021-06-08 11:09:01');
INSERT INTO `t_resource` VALUES (46, 3, 2, 1, '脚本管理-删除按钮', 'machine:script:del', 13, 'null', 1, 'admin', 1, 'admin', '2021-06-08 11:09:27', '2021-06-08 11:09:27');
INSERT INTO `t_resource` VALUES (47, 3, 2, 1, '脚本管理-执行按钮', 'machine:script:run', 14, 'null', 1, 'admin', 1, 'admin', '2021-06-08 11:09:50', '2021-06-08 11:09:50');
COMMIT;
-- ----------------------------
-- Table structure for t_role
-- ----------------------------
DROP TABLE IF EXISTS `t_role`;
CREATE TABLE `t_role` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(16) NOT NULL,
`status` tinyint(255) DEFAULT NULL,
`remark` varchar(255) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`creator_id` bigint(20) DEFAULT NULL,
`creator` varchar(16) DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
`modifier_id` bigint(20) DEFAULT NULL,
`modifier` varchar(16) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of t_role
-- ----------------------------
BEGIN;
INSERT INTO `t_role` VALUES (1, '超级管理员', 1, '权限超级大,拥有所有权限', '2021-05-27 14:09:50', 1, 'admin', '2021-05-28 10:26:28', 1, 'admin');
INSERT INTO `t_role` VALUES (6, '普通管理员', 1, '只拥有部分管理权限', '2021-05-28 15:55:36', 1, 'admin', '2021-05-28 15:55:36', 1, 'admin');
COMMIT;
-- ----------------------------
-- Table structure for t_role_resource
-- ----------------------------
DROP TABLE IF EXISTS `t_role_resource`;
CREATE TABLE `t_role_resource` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`role_id` bigint(20) NOT NULL,
`resource_id` bigint(20) NOT NULL,
`creator_id` bigint(20) unsigned DEFAULT NULL,
`creator` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=391 DEFAULT CHARSET=utf8 COMMENT='角色资源表';
-- ----------------------------
-- Records of t_role_resource
-- ----------------------------
BEGIN;
INSERT INTO `t_role_resource` VALUES (1, 1, 1, 1, 'admin', '2021-05-27 15:07:39');
INSERT INTO `t_role_resource` VALUES (323, 1, 2, 1, 'admin', '2021-05-28 09:04:50');
INSERT INTO `t_role_resource` VALUES (326, 1, 4, 1, 'admin', '2021-05-28 09:04:50');
INSERT INTO `t_role_resource` VALUES (327, 1, 5, 1, 'admin', '2021-05-28 09:04:50');
INSERT INTO `t_role_resource` VALUES (328, 1, 11, 1, 'admin', '2021-05-28 09:04:50');
INSERT INTO `t_role_resource` VALUES (335, 1, 14, 1, 'admin', '2021-05-28 17:42:21');
INSERT INTO `t_role_resource` VALUES (336, 1, 3, 1, 'admin', '2021-05-28 17:42:43');
INSERT INTO `t_role_resource` VALUES (337, 1, 12, 1, 'admin', '2021-05-28 17:42:43');
INSERT INTO `t_role_resource` VALUES (338, 6, 2, 1, 'admin', '2021-05-28 19:19:38');
INSERT INTO `t_role_resource` VALUES (339, 6, 3, 1, 'admin', '2021-05-28 19:19:38');
INSERT INTO `t_role_resource` VALUES (340, 6, 12, 1, 'admin', '2021-05-28 19:19:38');
INSERT INTO `t_role_resource` VALUES (342, 6, 1, 1, 'admin', '2021-05-29 01:31:22');
INSERT INTO `t_role_resource` VALUES (343, 5, 1, 1, 'admin', '2021-05-31 14:05:23');
INSERT INTO `t_role_resource` VALUES (344, 5, 4, 1, 'admin', '2021-05-31 14:05:23');
INSERT INTO `t_role_resource` VALUES (345, 5, 14, 1, 'admin', '2021-05-31 14:05:23');
INSERT INTO `t_role_resource` VALUES (346, 5, 5, 1, 'admin', '2021-05-31 14:05:23');
INSERT INTO `t_role_resource` VALUES (347, 5, 11, 1, 'admin', '2021-05-31 14:05:23');
INSERT INTO `t_role_resource` VALUES (348, 5, 3, 1, 'admin', '2021-05-31 16:33:14');
INSERT INTO `t_role_resource` VALUES (349, 5, 12, 1, 'admin', '2021-05-31 16:33:14');
INSERT INTO `t_role_resource` VALUES (350, 5, 2, 1, 'admin', '2021-05-31 16:33:14');
INSERT INTO `t_role_resource` VALUES (353, 1, 15, 1, 'admin', '2021-05-31 17:48:33');
INSERT INTO `t_role_resource` VALUES (354, 1, 16, 1, 'admin', '2021-05-31 17:48:33');
INSERT INTO `t_role_resource` VALUES (355, 1, 17, 1, 'admin', '2021-05-31 17:48:33');
INSERT INTO `t_role_resource` VALUES (356, 1, 18, 1, 'admin', '2021-05-31 17:48:33');
INSERT INTO `t_role_resource` VALUES (358, 1, 20, 1, 'admin', '2021-05-31 17:52:08');
INSERT INTO `t_role_resource` VALUES (360, 1, 22, 1, 'admin', '2021-05-31 18:05:04');
INSERT INTO `t_role_resource` VALUES (361, 1, 23, 1, 'admin', '2021-05-31 18:05:04');
INSERT INTO `t_role_resource` VALUES (362, 1, 24, 1, 'admin', '2021-05-31 18:05:04');
INSERT INTO `t_role_resource` VALUES (363, 1, 25, 1, 'admin', '2021-05-31 18:05:04');
INSERT INTO `t_role_resource` VALUES (364, 1, 26, 1, 'admin', '2021-05-31 18:05:04');
INSERT INTO `t_role_resource` VALUES (365, 1, 27, 1, 'admin', '2021-05-31 18:05:04');
INSERT INTO `t_role_resource` VALUES (366, 1, 28, 1, 'admin', '2021-05-31 18:05:04');
INSERT INTO `t_role_resource` VALUES (369, 1, 31, 1, 'admin', '2021-05-31 21:25:56');
INSERT INTO `t_role_resource` VALUES (370, 1, 32, 1, 'admin', '2021-05-31 21:25:56');
INSERT INTO `t_role_resource` VALUES (371, 1, 33, 1, 'admin', '2021-05-31 21:25:56');
INSERT INTO `t_role_resource` VALUES (374, 1, 36, 1, 'admin', '2021-06-01 14:01:57');
INSERT INTO `t_role_resource` VALUES (375, 1, 19, 1, 'admin', '2021-06-01 17:34:03');
INSERT INTO `t_role_resource` VALUES (376, 1, 21, 1, 'admin', '2021-06-01 17:34:03');
INSERT INTO `t_role_resource` VALUES (377, 1, 29, 1, 'admin', '2021-06-01 17:34:03');
INSERT INTO `t_role_resource` VALUES (378, 1, 30, 1, 'admin', '2021-06-01 17:34:03');
INSERT INTO `t_role_resource` VALUES (379, 1, 34, 1, 'admin', '2021-06-01 17:34:03');
INSERT INTO `t_role_resource` VALUES (380, 1, 37, 1, 'admin', '2021-06-03 09:09:42');
INSERT INTO `t_role_resource` VALUES (381, 1, 38, 1, 'admin', '2021-06-03 09:09:42');
INSERT INTO `t_role_resource` VALUES (382, 1, 39, 1, 'admin', '2021-06-03 14:26:42');
INSERT INTO `t_role_resource` VALUES (383, 1, 40, 1, 'admin', '2021-06-08 11:21:52');
INSERT INTO `t_role_resource` VALUES (384, 1, 41, 1, 'admin', '2021-06-08 11:21:52');
INSERT INTO `t_role_resource` VALUES (385, 1, 42, 1, 'admin', '2021-06-08 11:21:52');
INSERT INTO `t_role_resource` VALUES (386, 1, 43, 1, 'admin', '2021-06-08 11:21:52');
INSERT INTO `t_role_resource` VALUES (387, 1, 44, 1, 'admin', '2021-06-08 11:21:52');
INSERT INTO `t_role_resource` VALUES (388, 1, 45, 1, 'admin', '2021-06-08 11:21:52');
INSERT INTO `t_role_resource` VALUES (389, 1, 46, 1, 'admin', '2021-06-08 11:21:52');
INSERT INTO `t_role_resource` VALUES (390, 1, 47, 1, 'admin', '2021-06-08 11:21:52');
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -1,4 +1,4 @@
import{J as s,p as l,d,e as c,f as m,h as f,i as e,q as _,k as p}from"./vendor.42638b6b.js";import{a as h}from"./index.935df406.js";var t={name:"401",setup(){const n=s();return{onSetAuth:()=>{h(),n.push("/login")}}}},v="assets/401.4efb7617.png",V=`.error[data-v-68c65e35] {
import{J as s,p as l,d as c,e as d,f as m,h as f,i as e,q as _,k as p}from"./vendor.42638b6b.js";import{a as h}from"./index.99723322.js";var t={name:"401",setup(){const n=s();return{onSetAuth:()=>{h(),n.push("/login")}}}},v="assets/401.4efb7617.png",V=`.error[data-v-68c65e35] {
height: 100%;
background-color: white;
display: flex;
@@ -50,4 +50,4 @@ import{J as s,p as l,d,e as c,f as m,h as f,i as e,q as _,k as p}from"./vendor.4
.error .error-flex .right img[data-v-68c65e35] {
width: 100%;
height: 100%;
}`;const o=_();l("data-v-68c65e35");const x={class:"error"},u={class:"error-flex"},g={class:"left"},y={class:"left-item"},b=e("div",{class:"left-item-animation left-item-num"},"401",-1),w=e("div",{class:"left-item-animation left-item-title"},"\u60A8\u672A\u88AB\u6388\u6743\uFF0C\u6CA1\u6709\u64CD\u4F5C\u6743\u9650",-1),S=e("div",{class:"left-item-animation left-item-msg"},null,-1),k={class:"left-item-animation left-item-btn"},I=p("\u91CD\u65B0\u6388\u6743"),z=e("div",{class:"right"},[e("img",{src:v})],-1);d();const A=o((n,r,C,i,$,j)=>{const a=c("el-button");return m(),f("div",x,[e("div",u,[e("div",g,[e("div",y,[b,w,S,e("div",k,[e(a,{type:"primary",round:"",onClick:i.onSetAuth},{default:o(()=>[I]),_:1},8,["onClick"])])])]),z])])});t.render=A,t.__scopeId="data-v-68c65e35";export default t;
}`;const o=_();l("data-v-68c65e35");const x={class:"error"},u={class:"error-flex"},g={class:"left"},y={class:"left-item"},b=e("div",{class:"left-item-animation left-item-num"},"401",-1),w=e("div",{class:"left-item-animation left-item-title"},"\u60A8\u672A\u88AB\u6388\u6743\uFF0C\u6CA1\u6709\u64CD\u4F5C\u6743\u9650",-1),S=e("div",{class:"left-item-animation left-item-msg"},null,-1),k={class:"left-item-animation left-item-btn"},I=p("\u91CD\u65B0\u6388\u6743"),z=e("div",{class:"right"},[e("img",{src:v})],-1);c();const A=o((n,r,C,i,$,j)=>{const a=d("el-button");return m(),f("div",x,[e("div",u,[e("div",g,[e("div",y,[b,w,S,e("div",k,[e(a,{type:"primary",round:"",onClick:i.onSetAuth},{default:o(()=>[I]),_:1},8,["onClick"])])])]),z])])});t.render=A,t.__scopeId="data-v-68c65e35";export default t;

View File

@@ -1 +1 @@
import{r}from"./index.935df406.js";class s{constructor(t,e){this.url=t,this.method=e}setUrl(t){return this.url=t,this}setMethod(t){return this.method=t,this}getUrl(){return r.getApiUrl(this.url)}request(t){return r.send(this,t)}requestWithHeaders(t,e){return r.sendWithHeaders(this,t,e)}static create(t,e){return new s(t,e)}}export{s as A};
import{r}from"./index.99723322.js";class s{constructor(t,e){this.url=t,this.method=e}setUrl(t){return this.url=t,this}setMethod(t){return this.method=t,this}getUrl(){return r.getApiUrl(this.url)}request(t){return r.send(this,t)}requestWithHeaders(t,e){return r.sendWithHeaders(this,t,e)}static create(t,e){return new s(t,e)}}export{s as A};

View File

@@ -1,4 +1,4 @@
import{g as ne}from"./index.935df406.js";import{f as oe,h as se}from"./vendor.42638b6b.js";var he=`/**
import{g as ne}from"./index.99723322.js";import{f as oe,h as se}from"./vendor.42638b6b.js";var he=`/**
* Copyright (c) 2014 The xterm.js authors. All rights reserved.
* Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
* https://github.com/chjj/term.js

View File

@@ -1 +1 @@
var m=Object.defineProperty;var s=Object.getOwnPropertySymbols;var h=Object.prototype.hasOwnProperty,c=Object.prototype.propertyIsEnumerable;var t=(n,e,a)=>e in n?m(n,e,{enumerable:!0,configurable:!0,writable:!0,value:a}):n[e]=a,r=(n,e)=>{for(var a in e||(e={}))h.call(e,a)&&t(n,a,e[a]);if(s)for(var a of s(e))c.call(e,a)&&t(n,a,e[a]);return n};import{_ as d}from"./SshTerminal.4ac062e9.js";import{x as p,B as _,a as l,z as u,t as f,e as g,f as v,h as I,i as $}from"./vendor.42638b6b.js";import"./index.935df406.js";var i=p({name:"SshTerminalPage",components:{SshTerminal:d},props:{machineId:{type:Number}},setup(){const n=_(),e=l({machineId:0,height:700});return u(()=>{e.height=window.innerHeight,e.machineId=Number.parseInt(n.query.id)}),r({},f(e))}}),w="";const b={class:"file-manage"};function x(n,e,a,y,B,S){const o=g("ssh-terminal");return v(),I("div",b,[$(o,{ref:"terminal",machineId:n.machineId,height:n.height+"px"},null,8,["machineId","height"])])}i.render=x;export default i;
var m=Object.defineProperty;var s=Object.getOwnPropertySymbols;var h=Object.prototype.hasOwnProperty,c=Object.prototype.propertyIsEnumerable;var t=(n,e,a)=>e in n?m(n,e,{enumerable:!0,configurable:!0,writable:!0,value:a}):n[e]=a,r=(n,e)=>{for(var a in e||(e={}))h.call(e,a)&&t(n,a,e[a]);if(s)for(var a of s(e))c.call(e,a)&&t(n,a,e[a]);return n};import{_ as p}from"./SshTerminal.88463733.js";import{x as d,B as _,a as l,z as u,t as f,e as g,f as v,h as I,i as $}from"./vendor.42638b6b.js";import"./index.99723322.js";var i=d({name:"SshTerminalPage",components:{SshTerminal:p},props:{machineId:{type:Number}},setup(){const n=_(),e=l({machineId:0,height:700});return u(()=>{e.height=window.innerHeight,e.machineId=Number.parseInt(n.query.id)}),r({},f(e))}}),w="";const b={class:"file-manage"};function x(n,e,a,y,B,S){const o=g("ssh-terminal");return v(),I("div",b,[$(o,{ref:"terminal",machineId:n.machineId,height:n.height+"px"},null,8,["machineId","height"])])}i.render=x;export default i;

View File

@@ -1 +1 @@
import{A as e}from"./Api.a078cb94.js";import{E as s}from"./Enum.2b540114.js";const t={list:e.create("/sys/resources","get"),detail:e.create("/sys/resources/{id}","get"),save:e.create("/sys/resources","post"),update:e.create("/sys/resources/{id}","put"),del:e.create("/sys/resources/{id}","delete"),changeStatus:e.create("/sys/resources/{id}/{status}","put")},r={list:e.create("/sys/roles","get"),save:e.create("/sys/roles","post"),update:e.create("/sys/roles/{id}","put"),del:e.create("/sys/roles/{id}","delete"),roleResourceIds:e.create("/sys/roles/{id}/resourceIds","get"),roleResources:e.create("/sys/roles/{id}/resources","get"),saveResources:e.create("/sys/roles/{id}/resources","post")},a={list:e.create("/sys/accounts","get"),save:e.create("/sys/accounts","post"),update:e.create("/sys/accounts/{id}","put"),del:e.create("/sys/accounts/{id}","delete"),changeStatus:e.create("/sys/accounts/{id}/{status}","put"),roleIds:e.create("/sys/accounts/{id}/roleIds","get"),roles:e.create("/sys/accounts/{id}/roles","get"),resources:e.create("/sys/accounts/{id}/resources","get"),saveRoles:e.create("/sys/accounts/roles","post")};e.create("/sys/logs","get");var c={ResourceTypeEnum:new s().add("MENU","\u83DC\u5355",1).add("PERMISSION","\u6743\u9650",2),accountStatus:new s().add("ENABLE","\u6B63\u5E38",1).add("DISABLE","\u7981\u7528",-1),logType:new s().add("UPDATE","\u4FEE\u6539",2).add("DELETE","\u5220\u9664",3).add("SYS_LOG","\u7CFB\u7EDF",4).add("ERR_LOG","\u5F02\u5E38",5)};export{r as a,a as b,c as e,t as r};
import{A as e}from"./Api.a196f191.js";import{E as s}from"./Enum.2b540114.js";const t={list:e.create("/sys/resources","get"),detail:e.create("/sys/resources/{id}","get"),save:e.create("/sys/resources","post"),update:e.create("/sys/resources/{id}","put"),del:e.create("/sys/resources/{id}","delete"),changeStatus:e.create("/sys/resources/{id}/{status}","put")},r={list:e.create("/sys/roles","get"),save:e.create("/sys/roles","post"),update:e.create("/sys/roles/{id}","put"),del:e.create("/sys/roles/{id}","delete"),roleResourceIds:e.create("/sys/roles/{id}/resourceIds","get"),roleResources:e.create("/sys/roles/{id}/resources","get"),saveResources:e.create("/sys/roles/{id}/resources","post")},a={list:e.create("/sys/accounts","get"),save:e.create("/sys/accounts","post"),update:e.create("/sys/accounts/{id}","put"),del:e.create("/sys/accounts/{id}","delete"),changeStatus:e.create("/sys/accounts/{id}/{status}","put"),roleIds:e.create("/sys/accounts/{id}/roleIds","get"),roles:e.create("/sys/accounts/{id}/roles","get"),resources:e.create("/sys/accounts/{id}/resources","get"),saveRoles:e.create("/sys/accounts/roles","post")};e.create("/sys/logs","get");var c={ResourceTypeEnum:new s().add("MENU","\u83DC\u5355",1).add("PERMISSION","\u6743\u9650",2),accountStatus:new s().add("ENABLE","\u6B63\u5E38",1).add("DISABLE","\u7981\u7528",-1),logType:new s().add("UPDATE","\u4FEE\u6539",2).add("DELETE","\u5220\u9664",3).add("SYS_LOG","\u7CFB\u7EDF",4).add("ERR_LOG","\u5F02\u5E38",5)};export{r as a,a as b,c as e,t as r};

View File

@@ -1,4 +1,4 @@
var Ae=Object.defineProperty,pe=Object.defineProperties;var Le=Object.getOwnPropertyDescriptors;var X=Object.getOwnPropertySymbols;var ue=Object.prototype.hasOwnProperty,me=Object.prototype.propertyIsEnumerable;var z=(e,t,E)=>t in e?Ae(e,t,{enumerable:!0,configurable:!0,writable:!0,value:E}):e[t]=E,j=(e,t)=>{for(var E in t||(t={}))ue.call(t,E)&&z(e,E,t[E]);if(X)for(var E of X(t))me.call(t,E)&&z(e,E,t[E]);return e},$=(e,t)=>pe(e,Le(t));import{A as m}from"./Api.a078cb94.js";import{_ as he}from"./codemirror.415b9f22.js";import{a1 as Me,a2 as y,a3 as Ue,a4 as fe,a5 as ge,a6 as ee,a7 as b,a8 as De,a9 as Pe,aa as ke,ab as Fe,ac as ye,ad as be,ae as We,af as ve,ag as Ge,ah as Ke,ai as Be,aj as Ve,ak as He,x as Je,r as we,a as Ye,y as Qe,o as xe,t as _e,s as Ze,p as qe,d as Xe,e as M,f as U,h as f,i as u,F as W,E as v,q as ze,k as G}from"./vendor.42638b6b.js";import{n as F}from"./assert.dbc0392f.js";import"./index.935df406.js";const g={dbs:m.create("/dbs","get"),tableMetadata:m.create("/dbs/{id}/t-metadata","get"),columnMetadata:m.create("/dbs/{id}/c-metadata","get"),hintTables:m.create("/dbs/{id}/hint-tables","get"),selectData:m.create("/dbs/{id}/select","get"),saveSql:m.create("/dbs/{id}/sql","post"),getSql:m.create("/dbs/{id}/sql","get"),lsFile:m.create("/devops/machines/files/{fileId}/ls","get"),rmFile:m.create("/devops/machines/files/{fileId}/rm","delete"),uploadFile:m.create("/devops/machines/files/upload","post"),fileContent:m.create("/devops/machines/files/{fileId}/cat","get"),updateFileContent:m.create("/devops/machines/files/{id}","put"),addConf:m.create("/devops/machines/{machineId}/files","post"),delConf:m.create("/devops/machines/files/{id}","delete")};var pE=`/* ambiance theme for codemirror */
var Ae=Object.defineProperty,pe=Object.defineProperties;var Le=Object.getOwnPropertyDescriptors;var X=Object.getOwnPropertySymbols;var ue=Object.prototype.hasOwnProperty,me=Object.prototype.propertyIsEnumerable;var z=(e,t,E)=>t in e?Ae(e,t,{enumerable:!0,configurable:!0,writable:!0,value:E}):e[t]=E,j=(e,t)=>{for(var E in t||(t={}))ue.call(t,E)&&z(e,E,t[E]);if(X)for(var E of X(t))me.call(t,E)&&z(e,E,t[E]);return e},$=(e,t)=>pe(e,Le(t));import{A as m}from"./Api.a196f191.js";import{_ as he}from"./codemirror.415b9f22.js";import{a1 as Me,a2 as y,a3 as Ue,a4 as fe,a5 as ge,a6 as ee,a7 as b,a8 as De,a9 as Pe,aa as ke,ab as Fe,ac as ye,ad as be,ae as We,af as ve,ag as Ge,ah as Ke,ai as Be,aj as Ve,ak as He,x as Je,r as we,a as Ye,y as Qe,o as xe,t as _e,s as Ze,p as qe,d as Xe,e as M,f as U,h as f,i as u,F as W,E as v,q as ze,k as G}from"./vendor.42638b6b.js";import{n as F}from"./assert.dbc0392f.js";import"./index.99723322.js";const g={dbs:m.create("/dbs","get"),tableMetadata:m.create("/dbs/{id}/t-metadata","get"),columnMetadata:m.create("/dbs/{id}/c-metadata","get"),hintTables:m.create("/dbs/{id}/hint-tables","get"),selectData:m.create("/dbs/{id}/select","get"),saveSql:m.create("/dbs/{id}/sql","post"),getSql:m.create("/dbs/{id}/sql","get"),lsFile:m.create("/devops/machines/files/{fileId}/ls","get"),rmFile:m.create("/devops/machines/files/{fileId}/rm","delete"),uploadFile:m.create("/devops/machines/files/upload","post"),fileContent:m.create("/devops/machines/files/{fileId}/cat","get"),updateFileContent:m.create("/devops/machines/files/{id}","put"),addConf:m.create("/devops/machines/{machineId}/files","post"),delConf:m.create("/devops/machines/files/{id}","delete")};var pE=`/* ambiance theme for codemirror */
/* Color scheme */

View File

@@ -1,4 +1,4 @@
var I=Object.defineProperty;var F=Object.getOwnPropertySymbols;var B=Object.prototype.hasOwnProperty,U=Object.prototype.propertyIsEnumerable;var k=(l,n,t)=>n in l?I(l,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):l[n]=t,y=(l,n)=>{for(var t in n||(n={}))B.call(n,t)&&k(l,t,n[t]);if(F)for(var t of F(n))U.call(n,t)&&k(l,t,n[t]);return l};import{u as z,f as L}from"./index.935df406.js";import{J as S,a as j,y as E,t as Q,p as T,d as N,e as r,f as c,h as f,i as e,k as p,l as h,F as C,E as D,q as R}from"./vendor.42638b6b.js";const $=[{title:"[\u53D1\u5E03] 2021\u5E7402\u670828\u65E5\u53D1\u5E03\u57FA\u4E8E vue3.x + vite v1.0.0 \u7248\u672C",date:"02/28",link:"https://gitee.com/lyt-top/vue-next-admin"},{title:"[\u53D1\u5E03] 2021\u5E7404\u670815\u65E5\u53D1\u5E03 vue2.x + webpack \u91CD\u6784\u7248\u672C",date:"04/15",link:"https://gitee.com/lyt-top/vue-next-admin/tree/vue-prev-admin/"},{title:"[\u91CD\u6784] 2021\u5E7404\u670810\u65E5 \u91CD\u6784 vue2.x + webpack v1.0.0 \u7248\u672C",date:"04/10",link:"https://gitee.com/lyt-top/vue-next-admin/tree/vue-prev-admin/"},{title:"[\u9884\u89C8] 2020\u5E7412\u670808\u65E5\uFF0C\u57FA\u4E8E vue3.x \u7248\u672C\u540E\u53F0\u6A21\u677F\u7684\u9884\u89C8",date:"12/08",link:"http://lyt-top.gitee.io/vue-next-admin-preview/#/login"},{title:"[\u9884\u89C8] 2020\u5E7411\u670815\u65E5\uFF0C\u57FA\u4E8E vue2.x \u7248\u672C\u540E\u53F0\u6A21\u677F\u7684\u9884\u89C8",date:"11/15",link:"https://lyt-top.gitee.io/vue-prev-admin-preview/#/login"}],q=[{title:"\u4F18\u60E0\u5238",msg:"\u73B0\u91D1\u5238\u3001\u6298\u6263\u5238\u3001\u8425\u9500\u5FC5\u5907",icon:"el-icon-food",bg:"#48D18D",iconColor:"#64d89d"},{title:"\u591A\u4EBA\u62FC\u56E2",msg:"\u793E\u4EA4\u7535\u5546\u3001\u5F00\u8F9F\u6D41\u91CF",icon:"el-icon-shopping-bag-1",bg:"#F95959",iconColor:"#F86C6B"},{title:"\u5206\u9500\u4E2D\u5FC3",msg:"\u8F7B\u677E\u62DB\u52DF\u5206\u9500\u5458\uFF0C\u6210\u529F\u63A8\u5E7F\u5956\u52B1",icon:"el-icon-school",bg:"#8595F4",iconColor:"#92A1F4"},{title:"\u79D2\u6740",msg:"\u8D85\u4F4E\u4EF7\u62A2\u8D2D\u5F15\u5BFC\u66F4\u591A\u9500\u91CF",icon:"el-icon-alarm-clock",bg:"#FEBB50",iconColor:"#FDC566"}];var g={name:"personal",setup(){const l=z();S();const n=j({newsInfoList:$,recommendList:q,personalForm:{name:"",email:"",autograph:"",occupation:"",phone:"",sex:""}}),t=E(()=>L(new Date)),b=E(()=>l.state.userInfos.userInfos);return y({getUserInfos:b,currentTime:t},Q(n))}},je=`@charset "UTF-8";
var I=Object.defineProperty;var F=Object.getOwnPropertySymbols;var B=Object.prototype.hasOwnProperty,U=Object.prototype.propertyIsEnumerable;var k=(l,n,t)=>n in l?I(l,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):l[n]=t,y=(l,n)=>{for(var t in n||(n={}))B.call(n,t)&&k(l,t,n[t]);if(F)for(var t of F(n))U.call(n,t)&&k(l,t,n[t]);return l};import{u as z,f as L}from"./index.99723322.js";import{J as S,a as j,y as E,t as Q,p as T,d as N,e as r,f as c,h as f,i as e,k as p,l as h,F as C,E as D,q as R}from"./vendor.42638b6b.js";const $=[{title:"[\u53D1\u5E03] 2021\u5E7402\u670828\u65E5\u53D1\u5E03\u57FA\u4E8E vue3.x + vite v1.0.0 \u7248\u672C",date:"02/28",link:"https://gitee.com/lyt-top/vue-next-admin"},{title:"[\u53D1\u5E03] 2021\u5E7404\u670815\u65E5\u53D1\u5E03 vue2.x + webpack \u91CD\u6784\u7248\u672C",date:"04/15",link:"https://gitee.com/lyt-top/vue-next-admin/tree/vue-prev-admin/"},{title:"[\u91CD\u6784] 2021\u5E7404\u670810\u65E5 \u91CD\u6784 vue2.x + webpack v1.0.0 \u7248\u672C",date:"04/10",link:"https://gitee.com/lyt-top/vue-next-admin/tree/vue-prev-admin/"},{title:"[\u9884\u89C8] 2020\u5E7412\u670808\u65E5\uFF0C\u57FA\u4E8E vue3.x \u7248\u672C\u540E\u53F0\u6A21\u677F\u7684\u9884\u89C8",date:"12/08",link:"http://lyt-top.gitee.io/vue-next-admin-preview/#/login"},{title:"[\u9884\u89C8] 2020\u5E7411\u670815\u65E5\uFF0C\u57FA\u4E8E vue2.x \u7248\u672C\u540E\u53F0\u6A21\u677F\u7684\u9884\u89C8",date:"11/15",link:"https://lyt-top.gitee.io/vue-prev-admin-preview/#/login"}],q=[{title:"\u4F18\u60E0\u5238",msg:"\u73B0\u91D1\u5238\u3001\u6298\u6263\u5238\u3001\u8425\u9500\u5FC5\u5907",icon:"el-icon-food",bg:"#48D18D",iconColor:"#64d89d"},{title:"\u591A\u4EBA\u62FC\u56E2",msg:"\u793E\u4EA4\u7535\u5546\u3001\u5F00\u8F9F\u6D41\u91CF",icon:"el-icon-shopping-bag-1",bg:"#F95959",iconColor:"#F86C6B"},{title:"\u5206\u9500\u4E2D\u5FC3",msg:"\u8F7B\u677E\u62DB\u52DF\u5206\u9500\u5458\uFF0C\u6210\u529F\u63A8\u5E7F\u5956\u52B1",icon:"el-icon-school",bg:"#8595F4",iconColor:"#92A1F4"},{title:"\u79D2\u6740",msg:"\u8D85\u4F4E\u4EF7\u62A2\u8D2D\u5F15\u5BFC\u66F4\u591A\u9500\u91CF",icon:"el-icon-alarm-clock",bg:"#FEBB50",iconColor:"#FDC566"}];var g={name:"personal",setup(){const l=z();S();const n=j({newsInfoList:$,recommendList:q,personalForm:{name:"",email:"",autograph:"",occupation:"",phone:"",sex:""}}),t=E(()=>L(new Date)),b=E(()=>l.state.userInfos.userInfos);return y({getUserInfos:b,currentTime:t},Q(n))}},je=`@charset "UTF-8";
/* \u6587\u672C\u4E0D\u6362\u884C
------------------------------- */
/* \u591A\u884C\u6587\u672C\u6EA2\u51FA

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,4 +1,4 @@
var BD=Object.defineProperty;var ry=Object.getOwnPropertySymbols;var VD=Object.prototype.hasOwnProperty,zD=Object.prototype.propertyIsEnumerable;var ay=(r,e,t)=>e in r?BD(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,iy=(r,e)=>{for(var t in e||(e={}))VD.call(e,t)&&ay(r,t,e[t]);if(ry)for(var t of ry(e))zD.call(e,t)&&ay(r,t,e[t]);return r};import{u as FD,f as GD}from"./index.935df406.js";import{a as HD,y as ny,o as WD,t as UD,n as YD,g as XD,p as $D,d as ZD,e as tn,f as Fa,h as Ga,i as rt,l as zr,F as lf,E as uf,q as qD}from"./vendor.42638b6b.js";/*! *****************************************************************************
var BD=Object.defineProperty;var ry=Object.getOwnPropertySymbols;var VD=Object.prototype.hasOwnProperty,zD=Object.prototype.propertyIsEnumerable;var ay=(r,e,t)=>e in r?BD(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,iy=(r,e)=>{for(var t in e||(e={}))VD.call(e,t)&&ay(r,t,e[t]);if(ry)for(var t of ry(e))zD.call(e,t)&&ay(r,t,e[t]);return r};import{u as FD,f as GD}from"./index.99723322.js";import{a as HD,y as ny,o as WD,t as UD,n as YD,g as XD,p as $D,d as ZD,e as tn,f as Fa,h as Ga,i as rt,l as zr,F as lf,E as uf,q as qD}from"./vendor.42638b6b.js";/*! *****************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,4 +1,4 @@
var q=Object.defineProperty;var A=Object.getOwnPropertySymbols;var j=Object.prototype.hasOwnProperty,M=Object.prototype.propertyIsEnumerable;var N=(e,o,t)=>o in e?q(e,o,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[o]=t,h=(e,o)=>{for(var t in o||(o={}))j.call(o,t)&&N(e,t,o[t]);if(A)for(var t of A(o))M.call(o,t)&&N(e,t,o[t]);return e};import{x as z,B as X,J,a as v,y as R,t as w,s as G,p as y,d as x,e as l,f as I,h as T,i as n,q as V,k as F,l as H,T as U,w as B,v as D}from"./vendor.42638b6b.js";import{u as E,o as K,s as $,l as L,i as P,f as O}from"./index.935df406.js";var k=z({name:"Account",setup(){const e=E(),o=X(),t=J(),i=v({loginForm:{username:"admin",password:"123456",code:"1234"},loading:{signIn:!1}}),_=R(()=>O(new Date)),b=async()=>{i.loading.signIn=!0;let a;try{a=await K.login(i.loginForm),$("token",a.token),$("menus",a.menus)}catch(m){i.loading.signIn=!1;return}const s={username:i.loginForm.username,photo:L(i.loginForm.username),time:new Date().getTime(),permissions:a.permissions};$("userInfo",s),e.dispatch("userInfos/setUserInfos",s),e.state.themeConfig.themeConfig.isRequestRoutes?(await P(),r()):(await P(),r())},r=()=>{var s;let a=_.value;((s=o.query)==null?void 0:s.redirect)?t.push(o.query.redirect):t.push("/"),setTimeout(()=>{i.loading.signIn=!0,G.success(`${a}\uFF0C\u6B22\u8FCE\u56DE\u6765\uFF01`)},300)};return h({currentTime:_,onSignIn:b},w(i))}}),_n=`.login-content-form[data-v-decab76e] {
var q=Object.defineProperty;var A=Object.getOwnPropertySymbols;var j=Object.prototype.hasOwnProperty,M=Object.prototype.propertyIsEnumerable;var N=(e,o,t)=>o in e?q(e,o,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[o]=t,h=(e,o)=>{for(var t in o||(o={}))j.call(o,t)&&N(e,t,o[t]);if(A)for(var t of A(o))M.call(o,t)&&N(e,t,o[t]);return e};import{x as z,B as X,J,a as v,y as R,t as w,s as G,p as y,d as x,e as l,f as I,h as T,i as n,q as V,k as F,l as H,T as U,w as B,v as D}from"./vendor.42638b6b.js";import{u as E,o as K,s as $,l as L,i as P,f as O}from"./index.99723322.js";var k=z({name:"Account",setup(){const e=E(),o=X(),t=J(),i=v({loginForm:{username:"admin",password:"123456",code:"1234"},loading:{signIn:!1}}),_=R(()=>O(new Date)),b=async()=>{i.loading.signIn=!0;let a;try{a=await K.login(i.loginForm),$("token",a.token),$("menus",a.menus)}catch(m){i.loading.signIn=!1;return}const s={username:i.loginForm.username,photo:L(i.loginForm.username),time:new Date().getTime(),permissions:a.permissions};$("userInfo",s),e.dispatch("userInfos/setUserInfos",s),e.state.themeConfig.themeConfig.isRequestRoutes?(await P(),r()):(await P(),r())},r=()=>{var s;let a=_.value;((s=o.query)==null?void 0:s.redirect)?t.push(o.query.redirect):t.push("/"),setTimeout(()=>{i.loading.signIn=!0,G.success(`${a}\uFF0C\u6B22\u8FCE\u56DE\u6765\uFF01`)},300)};return h({currentTime:_,onSignIn:b},w(i))}}),_n=`.login-content-form[data-v-decab76e] {
margin-top: 20px;
}
.login-content-form .login-content-code[data-v-decab76e] {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -15,7 +15,7 @@
<link type="favicon" rel="shortcut icon" href="favicon.ico" />
<title>mayfly</title>
<script type="module" crossorigin src="assets/index.935df406.js"></script>
<script type="module" crossorigin src="assets/index.99723322.js"></script>
<link rel="modulepreload" href="assets/vendor.42638b6b.js">
<link rel="stylesheet" href="assets/index.c0529850.css">
</head>

View File

@@ -26,7 +26,7 @@ func (a *Account) Login(rc *ctx.ReqCtx) {
ginx.BindJsonAndValid(rc.GinCtx, loginForm)
rc.ReqParam = loginForm.Username
account := &entity.Account{Username: loginForm.Username, Password: loginForm.Password}
account := &entity.Account{Username: loginForm.Username, Password: utils.Md5(loginForm.Password)}
biz.ErrIsNil(a.AccountApp.GetAccount(account, "Id", "Username", "Password", "Status"), "用户名或密码错误")
biz.IsTrue(account.IsEnable(), "该账号不可用")
@@ -43,6 +43,8 @@ func (a *Account) Login(rc *ctx.ReqCtx) {
permissions = append(permissions, *v.Code)
}
}
// 保存该账号的权限codes
ctx.SavePermissionCodes(account.Id, permissions)
rc.ResData = map[string]interface{}{
"token": ctx.CreateToken(account.Id, account.Username),

View File

@@ -33,9 +33,12 @@ func InitAccountRouter(router *gin.RouterGroup) {
})
saveAccountRole := ctx.NewLogInfo("保存用户角色")
sarPermission := ctx.NewPermission("account:saveRoles")
// 保存用户角色
account.POST("/roles", func(c *gin.Context) {
ctx.NewReqCtxWithGin(c).WithLog(saveAccountRole).Handle(a.SaveRoles)
ctx.NewReqCtxWithGin(c).WithLog(saveAccountRole).
WithRequiredPermission(sarPermission).
Handle(a.SaveRoles)
})
// 获取用户角色

View File

@@ -25,18 +25,30 @@ func InitResourceRouter(router *gin.RouterGroup) {
})
saveResource := ctx.NewLogInfo("保存资源")
srPermission := ctx.NewPermission("resource:add")
db.POST("", func(c *gin.Context) {
ctx.NewReqCtxWithGin(c).WithLog(saveResource).Handle(r.SaveResource)
ctx.NewReqCtxWithGin(c).
WithLog(saveResource).
WithRequiredPermission(srPermission).
Handle(r.SaveResource)
})
changeStatus := ctx.NewLogInfo("修改资源状态")
csPermission := ctx.NewPermission("resource:changeStatus")
db.PUT(":id/:status", func(c *gin.Context) {
ctx.NewReqCtxWithGin(c).WithLog(changeStatus).Handle(r.ChangeStatus)
ctx.NewReqCtxWithGin(c).
WithLog(changeStatus).
WithRequiredPermission(csPermission).
Handle(r.ChangeStatus)
})
delResource := ctx.NewLogInfo("删除资源")
dePermission := ctx.NewPermission("resource:delete")
db.DELETE(":id", func(c *gin.Context) {
ctx.NewReqCtxWithGin(c).WithLog(delResource).Handle(r.DelResource)
ctx.NewReqCtxWithGin(c).
WithLog(delResource).
WithRequiredPermission(dePermission).
Handle(r.DelResource)
})
}
}

View File

@@ -21,13 +21,19 @@ func InitRoleRouter(router *gin.RouterGroup) {
})
saveRole := ctx.NewLogInfo("保存角色")
sPermission := ctx.NewPermission("role:save")
db.POST("", func(c *gin.Context) {
ctx.NewReqCtxWithGin(c).WithLog(saveRole).Handle(r.SaveRole)
ctx.NewReqCtxWithGin(c).WithLog(saveRole).
WithRequiredPermission(sPermission).
Handle(r.SaveRole)
})
delRole := ctx.NewLogInfo("删除角色")
drPermission := ctx.NewPermission("role:del")
db.DELETE(":id", func(c *gin.Context) {
ctx.NewReqCtxWithGin(c).WithLog(delRole).Handle(r.DelRole)
ctx.NewReqCtxWithGin(c).WithLog(delRole).
WithRequiredPermission(drPermission).
Handle(r.DelRole)
})
db.GET(":id/resourceIds", func(c *gin.Context) {
@@ -39,8 +45,11 @@ func InitRoleRouter(router *gin.RouterGroup) {
})
saveResource := ctx.NewLogInfo("保存角色资源")
srPermission := ctx.NewPermission("role:saveResources")
db.POST(":id/resources", func(c *gin.Context) {
ctx.NewReqCtxWithGin(c).WithLog(saveResource).Handle(r.SaveResource)
ctx.NewReqCtxWithGin(c).WithLog(saveResource).
WithRequiredPermission(srPermission).
Handle(r.SaveResource)
})
}
}