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:
commit
1d38214fe5
|
|
@ -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 查找文件
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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()},
|
||||||
|
|
|
||||||
|
|
@ -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 用户修改密码
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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">
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue