Merge branch 'gin-vue-admin_v2_dev' of

https://github.com/flipped-aurora/gin-vue-admin into
gin-vue-admin_v2_dev
This commit is contained in:
klausY 2020-05-20 17:44:50 +08:00
commit 1d38214fe5
63 changed files with 367 additions and 349 deletions

View File

@ -3,7 +3,6 @@ package v1
import ( import (
"fmt" "fmt"
"gin-vue-admin/global/response" "gin-vue-admin/global/response"
_ "gin-vue-admin/model/response"
resp "gin-vue-admin/model/response" resp "gin-vue-admin/model/response"
"gin-vue-admin/service" "gin-vue-admin/service"
"gin-vue-admin/utils" "gin-vue-admin/utils"
@ -29,35 +28,35 @@ func BreakpointContinue(c *gin.Context) {
_, FileHeader, err := c.Request.FormFile("file") _, FileHeader, err := c.Request.FormFile("file")
if err != nil { if err != nil {
response.FailWithMessage(err.Error(), c) response.FailWithMessage(err.Error(), c)
} else { return
}
f, err := FileHeader.Open() f, err := FileHeader.Open()
if err != nil { if err != nil {
response.FailWithMessage(err.Error(), c) response.FailWithMessage(err.Error(), c)
} else { return
cen, _ := ioutil.ReadAll(f) }
defer f.Close() defer f.Close()
if flag := utils.CheckMd5(cen, chunkMd5); flag { cen, _ := ioutil.ReadAll(f)
if flag := utils.CheckMd5(cen, chunkMd5); !flag {
return
}
err, file := service.FindOrCreateFile(fileMd5, fileName, chunkTotal) err, file := service.FindOrCreateFile(fileMd5, fileName, chunkTotal)
if err != nil { if err != nil {
response.FailWithMessage(err.Error(), c) response.FailWithMessage(err.Error(), c)
} else { return
}
err, pathc := utils.BreakPointContinue(cen, fileName, chunkNumber, chunkTotal, fileMd5) err, pathc := utils.BreakPointContinue(cen, fileName, chunkNumber, chunkTotal, fileMd5)
if err != nil { if err != nil {
response.FailWithMessage(err.Error(), c) response.FailWithMessage(err.Error(), c)
} else { return
err = service.CreateFileChunk(file.ID, pathc, chunkNumber) }
if err != nil {
if err = service.CreateFileChunk(file.ID, pathc, chunkNumber); err != nil {
response.FailWithMessage(err.Error(), c) response.FailWithMessage(err.Error(), c)
} else { return
}
response.OkWithMessage("切片创建成功", c) response.OkWithMessage("切片创建成功", c)
} }
}
}
} else {
}
}
}
}
// @Tags ExaFileUploadAndDownload // @Tags ExaFileUploadAndDownload
// @Summary 查找文件 // @Summary 查找文件

View File

@ -127,7 +127,7 @@ func UpdateAuthority(c *gin.Context) {
if err != nil { if err != nil {
response.FailWithMessage(fmt.Sprintf("更新失败,%v", err), c) response.FailWithMessage(fmt.Sprintf("更新失败,%v", err), c)
} else { } else {
response.OkWithData(resp.SysAuthorityResponse{authority}, c) response.OkWithData(resp.SysAuthorityResponse{Authority: authority}, c)
} }
} }

View File

@ -70,7 +70,7 @@ func AddBaseMenu(c *gin.Context) {
var menu model.SysBaseMenu var menu model.SysBaseMenu
_ = c.ShouldBindJSON(&menu) _ = c.ShouldBindJSON(&menu)
MenuVerify := utils.Rules{ MenuVerify := utils.Rules{
"Path": {"notEmpty"}, "Path": {utils.NotEmpty()},
"ParentId": {utils.NotEmpty()}, "ParentId": {utils.NotEmpty()},
"Name": {utils.NotEmpty()}, "Name": {utils.NotEmpty()},
"Component": {utils.NotEmpty()}, "Component": {utils.NotEmpty()},

View File

@ -83,7 +83,7 @@ func Login(c *gin.Context) {
// 登录以后签发jwt // 登录以后签发jwt
func tokenNext(c *gin.Context, user model.SysUser) { func tokenNext(c *gin.Context, user model.SysUser) {
j := &middleware.JWT{ j := &middleware.JWT{
[]byte(global.GVA_CONFIG.JWT.SigningKey), // 唯一签名 SigningKey: []byte(global.GVA_CONFIG.JWT.SigningKey), // 唯一签名
} }
clams := request.CustomClaims{ clams := request.CustomClaims{
UUID: user.UUID, UUID: user.UUID,
@ -91,43 +91,50 @@ func tokenNext(c *gin.Context, user model.SysUser) {
NickName: user.NickName, NickName: user.NickName,
AuthorityId: user.AuthorityId, AuthorityId: user.AuthorityId,
StandardClaims: jwt.StandardClaims{ StandardClaims: jwt.StandardClaims{
NotBefore: int64(time.Now().Unix() - 1000), // 签名生效时间 NotBefore: time.Now().Unix() - 1000, // 签名生效时间
ExpiresAt: int64(time.Now().Unix() + 60*60*24*7), // 过期时间 一周 ExpiresAt: time.Now().Unix() + 60*60*24*7, // 过期时间 一周
Issuer: "qmPlus", // 签名的发行者 Issuer: "qmPlus", // 签名的发行者
}, },
} }
token, err := j.CreateToken(clams) token, err := j.CreateToken(clams)
if err != nil { if err != nil {
response.FailWithMessage("获取token失败", c) response.FailWithMessage("获取token失败", c)
} else { return
if global.GVA_CONFIG.System.UseMultipoint { }
var loginJwt model.JwtBlacklist if !global.GVA_CONFIG.System.UseMultipoint {
loginJwt.Jwt = token
err, jwtStr := service.GetRedisJWT(user.Username)
if err == redis.Nil {
err2 := service.SetRedisJWT(loginJwt, user.Username)
if err2 != nil {
response.FailWithMessage("设置登录状态失败", c)
} else {
response.OkWithData(resp.LoginResponse{ response.OkWithData(resp.LoginResponse{
User: user, User: user,
Token: token, Token: token,
ExpiresAt: clams.StandardClaims.ExpiresAt * 1000, ExpiresAt: clams.StandardClaims.ExpiresAt * 1000,
}, c) }, c)
return
} }
var loginJwt model.JwtBlacklist
loginJwt.Jwt = token
err, jwtStr := service.GetRedisJWT(user.Username)
if err == redis.Nil {
if err := service.SetRedisJWT(loginJwt, user.Username); err != nil {
response.FailWithMessage("设置登录状态失败", c)
return
}
response.OkWithData(resp.LoginResponse{
User: user,
Token: token,
ExpiresAt: clams.StandardClaims.ExpiresAt * 1000,
}, c)
} else if err != nil { } else if err != nil {
response.FailWithMessage(fmt.Sprintf("%v", err), c) response.FailWithMessage(fmt.Sprintf("%v", err), c)
} else { } else {
var blackJWT model.JwtBlacklist var blackJWT model.JwtBlacklist
blackJWT.Jwt = jwtStr blackJWT.Jwt = jwtStr
err3 := service.JsonInBlacklist(blackJWT) if err := service.JsonInBlacklist(blackJWT); err != nil {
if err3 != nil {
response.FailWithMessage("jwt作废失败", c) response.FailWithMessage("jwt作废失败", c)
} else { return
err2 := service.SetRedisJWT(loginJwt, user.Username) }
if err2 != nil { if err := service.SetRedisJWT(loginJwt, user.Username); err != nil {
response.FailWithMessage("设置登录状态失败", c) response.FailWithMessage("设置登录状态失败", c)
} else { return
}
response.OkWithData(resp.LoginResponse{ response.OkWithData(resp.LoginResponse{
User: user, User: user,
Token: token, Token: token,
@ -135,16 +142,6 @@ func tokenNext(c *gin.Context, user model.SysUser) {
}, c) }, c)
} }
} }
}
} else {
response.OkWithData(resp.LoginResponse{
User: user,
Token: token,
ExpiresAt: clams.StandardClaims.ExpiresAt * 1000,
}, c)
}
}
}
// @Tags SysUser // @Tags SysUser
// @Summary 用户修改密码 // @Summary 用户修改密码

View File

@ -60,10 +60,10 @@ type JWT struct {
} }
var ( var (
TokenExpired error = errors.New("Token is expired") TokenExpired = errors.New("Token is expired")
TokenNotValidYet error = errors.New("Token not active yet") TokenNotValidYet = errors.New("Token not active yet")
TokenMalformed error = errors.New("That's not even a token") TokenMalformed = errors.New("That's not even a token")
TokenInvalid error = errors.New("Couldn't handle this token:") TokenInvalid = errors.New("Couldn't handle this token:")
) )
func NewJWT() *JWT { func NewJWT() *JWT {

View File

@ -16,7 +16,7 @@ func LoadTls() gin.HandlerFunc {
}) })
err := middleware.Process(c.Writer, c.Request) err := middleware.Process(c.Writer, c.Request)
if err != nil { if err != nil {
//如果出现错误,请不要继续 // 如果出现错误,请不要继续
fmt.Println(err) fmt.Println(err)
return return
} }

View File

@ -112,7 +112,7 @@ func GetAuthorityInfoList(info request.PageInfo) (err error, list interface{}, t
var authority []model.SysAuthority var authority []model.SysAuthority
err = db.Limit(limit).Offset(offset).Preload("DataAuthorityId").Where("parent_id = 0").Find(&authority).Error err = db.Limit(limit).Offset(offset).Preload("DataAuthorityId").Where("parent_id = 0").Find(&authority).Error
if len(authority) > 0 { if len(authority) > 0 {
for k, _ := range authority { for k := range authority {
err = findChildrenAuthority(&authority[k]) err = findChildrenAuthority(&authority[k])
} }
} }
@ -166,7 +166,7 @@ func SetMenuAuthority(auth *model.SysAuthority) error {
func findChildrenAuthority(authority *model.SysAuthority) (err error) { func findChildrenAuthority(authority *model.SysAuthority) (err error) {
err = global.GVA_DB.Preload("DataAuthorityId").Where("parent_id = ?", authority.AuthorityId).Find(&authority.Children).Error err = global.GVA_DB.Preload("DataAuthorityId").Where("parent_id = ?", authority.AuthorityId).Find(&authority.Children).Error
if len(authority.Children) > 0 { if len(authority.Children) > 0 {
for k, _ := range authority.Children { for k := range authority.Children {
err = findChildrenAuthority(&authority.Children[k]) err = findChildrenAuthority(&authority.Children[k])
} }
} }

View File

@ -132,5 +132,5 @@ func ParamsMatchFunc(args ...interface{}) (interface{}, error) {
name1 := args[0].(string) name1 := args[0].(string)
name2 := args[1].(string) name2 := args[1].(string)
return (bool)(ParamsMatch(name1, name2)), nil return ParamsMatch(name1, name2), nil
} }

View File

@ -60,7 +60,7 @@ func Login(u *model.SysUser) (err error, userInter *model.SysUser) {
func ChangePassword(u *model.SysUser, newPassword string) (err error, userInter *model.SysUser) { func ChangePassword(u *model.SysUser, newPassword string) (err error, userInter *model.SysUser) {
var user model.SysUser var user model.SysUser
//后期修改jwt+password模式 // TODO:后期修改jwt+password模式
u.Password = utils.MD5V([]byte(u.Password)) u.Password = utils.MD5V([]byte(u.Password))
err = global.GVA_DB.Where("username = ? AND password = ?", u.Username, u.Password).First(&user).Update("password", utils.MD5V([]byte(newPassword))).Error err = global.GVA_DB.Where("username = ? AND password = ?", u.Username, u.Password).First(&user).Update("password", utils.MD5V([]byte(newPassword))).Error
return err, u return err, u

View File

@ -56,7 +56,7 @@ func MakeFile(fileName string, FileMd5 string) (error, string) {
} }
_ = os.MkdirAll(finishDir, os.ModePerm) _ = os.MkdirAll(finishDir, os.ModePerm)
fd, _ := os.OpenFile(finishDir+fileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644) fd, _ := os.OpenFile(finishDir+fileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644)
for k, _ := range rd { for k := range rd {
content, _ := ioutil.ReadFile(breakpointDir + FileMd5 + "/" + fileName + "_" + strconv.Itoa(k)) content, _ := ioutil.ReadFile(breakpointDir + FileMd5 + "/" + fileName + "_" + strconv.Itoa(k))
_, err = fd.Write(content) _, err = fd.Write(content)
if err != nil { if err != nil {

View File

@ -37,5 +37,4 @@ func DecryptDES(src []byte) []byte {
blockmode.CryptBlocks(src, src) blockmode.CryptBlocks(src, src)
src = unpadding(src) src = unpadding(src)
return src return src
} }

View File

@ -2,23 +2,23 @@
<div class="hello"> <div class="hello">
<el-divider content-position="left">大文件上传</el-divider> <el-divider content-position="left">大文件上传</el-divider>
<form id="fromCont" method="post" > <form id="fromCont" method="post" >
<div class="fileUpload"> <div class="fileUpload" @click="inputChange">
选择文件<input @change="choseFile" id="file" multiple="multiple" type="file" /> 选择文件
<input v-show="false" @change="choseFile" id="file" multiple="multiple" type="file" ref="Input" />
</div> </div>
</form> </form>
<el-button @click="getFile" :disabled="limitFileSize" type="primary" size="medium" class="uploadBtn">上传文件</el-button> <el-button @click="getFile" :disabled="limitFileSize" type="primary" size="medium" class="uploadBtn">上传文件</el-button>
<div class="el-upload__tip">请上传不超过5MB的文件</div> <div class="el-upload__tip">请上传不超过5MB的文件</div>
<div class="list"> <div class="list">
<transition-group name="list" tag="p"> <transition name="list" tag="p">
<div class="list-item" v-for="item in uploadList" :key="item.name" > <div class="list-item" v-if="file" >
<i class="el-icon-document"></i> <i class="el-icon-document"></i>
<span>{{ item.name }}</span> <span>{{ file.name }}</span>
<span v-if="file" class="percentage" >{{percentage}}%</span> <span class="percentage" >{{percentage}}%</span>
<el-progress :show-text='false' :text-inside="false" :stroke-width="2" :percentage="percentage"></el-progress> <el-progress :show-text='false' :text-inside="false" :stroke-width="2" :percentage="percentage"></el-progress>
</div> </div>
</transition-group> </transition>
</div> </div>
<!-- <span <!-- <span
v-if="this.file" v-if="this.file"
>{{Math.floor(((this.formDataList.length-this.waitNum)/this.formDataList.length)*100)}}%</span> --> >{{Math.floor(((this.formDataList.length-this.waitNum)/this.formDataList.length)*100)}}%</span> -->
@ -45,8 +45,7 @@ export default {
limitFileSize: false, limitFileSize: false,
percentage:0, percentage:0,
percentageFlage: true, percentageFlage: true,
customColor: '#409eff', customColor: '#409eff'
uploadList:[]
} }
}, },
created(){ created(){
@ -59,6 +58,7 @@ export default {
const file = e.target.files[0] // const file = e.target.files[0] //
const maxSize = 5*1024*1024 const maxSize = 5*1024*1024
this.file = file // file 便 func this.file = file // file 便 func
this.percentage = 0
if(file.size<maxSize){ if(file.size<maxSize){
fileR.readAsArrayBuffer(file) // ArrayBuffer fileR.readAsArrayBuffer(file) // ArrayBuffer
fileR.onload = async e => { fileR.onload = async e => {
@ -123,9 +123,6 @@ export default {
this.percentageFlage = false this.percentageFlage = false
} }
this.sliceFile() // this.sliceFile() //
if(this.percentage == 100){
this.uploadList.push(this.file)
}
}, },
sliceFile() { sliceFile() {
this.waitUpLoad && this.waitUpLoad &&
@ -164,6 +161,9 @@ export default {
await removeChunk(params) await removeChunk(params)
} }
} }
},
inputChange(){
this.$refs.Input.dispatchEvent(new MouseEvent('click'))
} }
} }
} }
@ -206,7 +206,6 @@ a {
opacity: 0; opacity: 0;
cursor: pointer; cursor: pointer;
} }
} }
.fileName{ .fileName{
display: inline-block; display: inline-block;

View File

@ -22,7 +22,7 @@
<el-table-column label="姓名" prop="customerName" width="120"></el-table-column> <el-table-column label="姓名" prop="customerName" width="120"></el-table-column>
<el-table-column label="电话" prop="customerPhoneData" width="120"></el-table-column> <el-table-column label="电话" prop="customerPhoneData" width="120"></el-table-column>
<el-table-column label="接入人ID" prop="sysUserId" width="120"></el-table-column> <el-table-column label="接入人ID" prop="sysUserId" width="120"></el-table-column>
<el-table-column label="按钮组"> <el-table-column label="按钮组" min-width="160">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button @click="updateCustomer(scope.row)" size="small" type="text">变更</el-button> <el-button @click="updateCustomer(scope.row)" size="small" type="text">变更</el-button>
<el-popover placement="top" width="160" v-model="scope.row.visible"> <el-popover placement="top" width="160" v-model="scope.row.visible">

View File

@ -16,13 +16,13 @@
</el-table-column> </el-table-column>
<el-table-column label="姓名" prop="name" width="120"></el-table-column> <el-table-column label="姓名" prop="name" width="120"></el-table-column>
<el-table-column label="年龄" prop="age" width="120"></el-table-column> <el-table-column label="年龄" prop="age" width="120"></el-table-column>
<el-table-column label="住址" prop="address" show-overflow-tooltip></el-table-column> <el-table-column label="住址" prop="address" min-width="200" show-overflow-tooltip></el-table-column>
<el-table-column label="是否禁用" prop="switch"> <el-table-column label="是否禁用" prop="switch" width="180">
<template slot-scope="scope"> <template slot-scope="scope">
<el-switch active-text="开启" inactive-text="禁用" v-model="scope.row.switch"></el-switch> <el-switch active-text="开启" inactive-text="禁用" v-model="scope.row.switch"></el-switch>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="按钮组"> <el-table-column label="按钮组" width="200">
<template slot-scope="scope" > <template slot-scope="scope" >
<el-button type="text" size="small" @click="toggleSelection([scope.row])">按钮1</el-button> <el-button type="text" size="small" @click="toggleSelection([scope.row])">按钮1</el-button>
<el-button type="text" size="small" @click="toggleSelection([scope.row])">按钮2</el-button> <el-button type="text" size="small" @click="toggleSelection([scope.row])">按钮2</el-button>

View File

@ -35,7 +35,7 @@
prop="name" prop="name"
width="180" width="180"
></el-table-column> ></el-table-column>
<el-table-column label="链接" prop="url"></el-table-column> <el-table-column label="链接" prop="url" min-width="300"></el-table-column>
<el-table-column label="标签" prop="tag" width="100"> <el-table-column label="标签" prop="tag" width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag <el-tag
@ -45,7 +45,7 @@
> >
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" width="100"> <el-table-column label="操作" width="160">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button @click="downloadFile(scope.row)" size="small" type="text" <el-button @click="downloadFile(scope.row)" size="small" type="text"
>下载</el-button >下载</el-button

View File

@ -13,7 +13,7 @@
> >
<el-table-column label="角色id" min-width="180" prop="authorityId"></el-table-column> <el-table-column label="角色id" min-width="180" prop="authorityId"></el-table-column>
<el-table-column label="角色名称" min-width="180" prop="authorityName"></el-table-column> <el-table-column label="角色名称" min-width="180" prop="authorityName"></el-table-column>
<el-table-column fixed="right" label="操作" min-width="300"> <el-table-column fixed="right" label="操作" width="460">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button @click="opdendrawer(scope.row)" size="small" type="text">设置权限</el-button> <el-button @click="opdendrawer(scope.row)" size="small" type="text">设置权限</el-button>
<el-button @click="addAuthority(scope.row.authorityId)" size="small" type="text">新增子角色</el-button> <el-button @click="addAuthority(scope.row.authorityId)" size="small" type="text">新增子角色</el-button>

View File

@ -8,6 +8,7 @@
<el-table :data="tableData" border row-key="ID" stripe> <el-table :data="tableData" border row-key="ID" stripe>
<el-table-column label="ID" min-width="100" prop="ID"></el-table-column> <el-table-column label="ID" min-width="100" prop="ID"></el-table-column>
<el-table-column label="路由Name" min-width="160" prop="name"></el-table-column> <el-table-column label="路由Name" min-width="160" prop="name"></el-table-column>
<el-table-column label="路由Path" min-width="160" prop="path"></el-table-column>
<el-table-column label="是否隐藏" min-width="100" prop="hidden"> <el-table-column label="是否隐藏" min-width="100" prop="hidden">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{scope.row.hidden?"隐藏":"显示"}}</span> <span>{{scope.row.hidden?"隐藏":"显示"}}</span>
@ -36,17 +37,36 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
<el-dialog :before-close="handleClose" :visible.sync="dialogFormVisible" :title="dialogTitle"> <el-dialog :before-close="handleClose" :title="dialogTitle" :visible.sync="dialogFormVisible">
<el-form <el-form
:inline="true" :inline="true"
:model="form" :model="form"
:rules="rules" :rules="rules"
label-position="top"
label-width="85px" label-width="85px"
ref="menuForm" ref="menuForm"
label-position="top"
> >
<el-form-item label="路由name" prop="path" style="width:30%"> <el-form-item label="路由name" prop="path" style="width:30%">
<el-input autocomplete="off" placeholder="唯一英文字符串" v-model="form.path"></el-input> <el-input
@change="changeName"
autocomplete="off"
placeholder="唯一英文字符串"
v-model="form.name"
></el-input>
</el-form-item>
<el-form-item prop="path" style="width:30%">
<div style="display:inline-block" slot="label">
路由path
<el-checkbox style="float:right;margin-left:20px;" v-model="checkFlag">添加参数</el-checkbox>
</div>
<el-input
:disabled="!checkFlag"
autocomplete="off"
placeholder="建议只在后方拼接参数"
v-model="form.path"
></el-input>
</el-form-item> </el-form-item>
<el-form-item label="是否隐藏" style="width:30%"> <el-form-item label="是否隐藏" style="width:30%">
<el-select placeholder="是否在列表隐藏" v-model="form.hidden"> <el-select placeholder="是否在列表隐藏" v-model="form.hidden">
@ -57,11 +77,11 @@
<el-form-item label="父节点Id" style="width:30%"> <el-form-item label="父节点Id" style="width:30%">
<el-cascader <el-cascader
:disabled="!this.isEdit" :disabled="!this.isEdit"
v-model="form.parentId"
:options="menuOption" :options="menuOption"
:show-all-levels="false"
:props="{ checkStrictly: true,label:'title',value:'ID',disabled:'disabled',emitPath:false}" :props="{ checkStrictly: true,label:'title',value:'ID',disabled:'disabled',emitPath:false}"
:show-all-levels="false"
filterable filterable
v-model="form.parentId"
></el-cascader> ></el-cascader>
</el-form-item> </el-form-item>
<el-form-item label="文件路径" prop="component" style="width:30%"> <el-form-item label="文件路径" prop="component" style="width:30%">
@ -103,62 +123,66 @@ import {
addBaseMenu, addBaseMenu,
deleteBaseMenu, deleteBaseMenu,
getBaseMenuById getBaseMenuById
} from "@/api/menu"; } from '@/api/menu'
import infoList from "@/components/mixins/infoList"; import infoList from '@/components/mixins/infoList'
import icon from '@/view/superAdmin/menu/icon'; import icon from '@/view/superAdmin/menu/icon'
export default { export default {
name: "Menus", name: 'Menus',
mixins: [infoList], mixins: [infoList],
data() { data() {
return { return {
checkFlag: false,
listApi: getMenuList, listApi: getMenuList,
dialogFormVisible: false, dialogFormVisible: false,
dialogTitle: "新增菜单", dialogTitle: '新增菜单',
menuOption: [ menuOption: [
{ {
ID: "0", ID: '0',
title: "根菜单" title: '根菜单'
} }
], ],
form: { form: {
ID: 0, ID: 0,
path: "", path: '',
name: "", name: '',
hidden: "", hidden: '',
parentId: "", parentId: '',
component: "", component: '',
meta: { meta: {
title: "", title: '',
icon: "", icon: '',
defaultMenu: false, defaultMenu: false,
keepAlive: false keepAlive: false
} }
}, },
rules: { rules: {
path: [{ required: true, message: "请输入菜单name", trigger: "blur" }], path: [{ required: true, message: '请输入菜单name', trigger: 'blur' }],
component: [ component: [
{ required: true, message: "请输入文件路径", trigger: "blur" } { required: true, message: '请输入文件路径', trigger: 'blur' }
], ],
"meta.title": [ 'meta.title': [
{ required: true, message: "请输入菜单展示名称", trigger: "blur" } { required: true, message: '请输入菜单展示名称', trigger: 'blur' }
] ]
}, },
isEdit: false, isEdit: false,
test: '' test: ''
}; }
}, },
components: { components: {
icon icon
}, },
methods: { methods: {
changeName() {
this.form.path = this.form.name
},
setOptions() { setOptions() {
this.menuOption = [ this.menuOption = [
{ {
ID: "0", ID: '0',
title: "根目录" title: '根目录'
} }
]; ]
this.setMenuOptions(this.tableData, this.menuOption, false); this.setMenuOptions(this.tableData, this.menuOption, false)
}, },
setMenuOptions(menuData, optionsData, disabled) { setMenuOptions(menuData, optionsData, disabled) {
menuData && menuData &&
@ -169,137 +193,137 @@ export default {
ID: String(item.ID), ID: String(item.ID),
disabled: disabled || item.ID == this.form.ID, disabled: disabled || item.ID == this.form.ID,
children: [] children: []
}; }
this.setMenuOptions( this.setMenuOptions(
item.children, item.children,
option.children, option.children,
disabled || item.ID == this.form.ID disabled || item.ID == this.form.ID
); )
optionsData.push(option); optionsData.push(option)
} else { } else {
const option = { const option = {
title: item.meta.title, title: item.meta.title,
ID: String(item.ID), ID: String(item.ID),
disabled: disabled || item.ID == this.form.ID disabled: disabled || item.ID == this.form.ID
};
optionsData.push(option);
} }
}); optionsData.push(option)
}
})
}, },
handleClose(done) { handleClose(done) {
this.initForm(); this.initForm()
done(); done()
}, },
// //
load(tree, treeNode, resolve) { load(tree, treeNode, resolve) {
resolve([ resolve([
{ {
id: 31, id: 31,
date: "2016-05-01", date: '2016-05-01',
name: "王小虎", name: '王小虎',
address: "上海市普陀区金沙江路 1519 弄" address: '上海市普陀区金沙江路 1519 弄'
}, },
{ {
id: 32, id: 32,
date: "2016-05-01", date: '2016-05-01',
name: "王小虎", name: '王小虎',
address: "上海市普陀区金沙江路 1519 弄" address: '上海市普陀区金沙江路 1519 弄'
} }
]); ])
}, },
// //
deleteMenu(ID) { deleteMenu(ID) {
this.$confirm("此操作将永久删除所有角色下该菜单, 是否继续?", "提示", { this.$confirm('此操作将永久删除所有角色下该菜单, 是否继续?', '提示', {
confirmButtonText: "确定", confirmButtonText: '确定',
cancelButtonText: "取消", cancelButtonText: '取消',
type: "warning" type: 'warning'
}) })
.then(async () => { .then(async () => {
const res = await deleteBaseMenu({ ID }); const res = await deleteBaseMenu({ ID })
if (res.code == 0) { if (res.code == 0) {
this.$message({ this.$message({
type: "success", type: 'success',
message: "删除成功!" message: '删除成功!'
}); })
this.getTableData(); this.getTableData()
} }
}) })
.catch(() => { .catch(() => {
this.$message({ this.$message({
type: "info", type: 'info',
message: "已取消删除" message: '已取消删除'
}); })
}); })
}, },
// //
initForm() { initForm() {
this.$refs.menuForm.resetFields(); this.checkFlag = false
this.$refs.menuForm.resetFields()
this.form = { this.form = {
ID: 0, ID: 0,
path: "", path: '',
name: "", name: '',
hidden: "", hidden: '',
parentId: "", parentId: '',
component: "", component: '',
meta: { meta: {
title: "", title: '',
icon: "", icon: '',
defaultMenu: false, defaultMenu: false,
keepAlive: "" keepAlive: ''
}
} }
};
}, },
// //
closeDialog() { closeDialog() {
this.initForm(); this.initForm()
this.dialogFormVisible = false; this.dialogFormVisible = false
}, },
// menu // menu
async enterDialog() { async enterDialog() {
this.$refs.menuForm.validate(async valid => { this.$refs.menuForm.validate(async valid => {
if (valid) { if (valid) {
let res; let res
this.form.name = this.form.path;
if (this.isEdit) { if (this.isEdit) {
res = await updateBaseMenu(this.form); res = await updateBaseMenu(this.form)
} else { } else {
res = await addBaseMenu(this.form); res = await addBaseMenu(this.form)
} }
if (res.code == 0) { if (res.code == 0) {
this.$message({ this.$message({
type: "success", type: 'success',
message: this.isEdit ? "编辑成功" : "添加成功!" message: this.isEdit ? '编辑成功' : '添加成功!'
}); })
this.getTableData(); this.getTableData()
} }
this.initForm(); this.initForm()
this.dialogFormVisible = false; this.dialogFormVisible = false
} }
}); })
}, },
// id 0 // id 0
addMenu(id) { addMenu(id) {
this.dialogTitle = "新增菜单"; this.dialogTitle = '新增菜单'
this.form.parentId = String(id); this.form.parentId = String(id)
this.isEdit = false; this.isEdit = false
this.setOptions(); this.setOptions()
this.dialogFormVisible = true; this.dialogFormVisible = true
}, },
// //
async editMenu(id) { async editMenu(id) {
this.dialogTitle = "编辑菜单"; this.dialogTitle = '编辑菜单'
const res = await getBaseMenuById({ id }); const res = await getBaseMenuById({ id })
this.form = res.data.menu; this.form = res.data.menu
this.isEdit = true; this.isEdit = true
this.setOptions(); this.setOptions()
this.dialogFormVisible = true; this.dialogFormVisible = true
} }
}, },
async created() { async created() {
this.pageSize = 999; this.pageSize = 999
await this.getTableData(); await this.getTableData()
}
} }
};
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.button-box { .button-box {