提交 18e57b15 编写于 作者: Mr.奇淼('s avatar Mr.奇淼(

Merge branch 'master' of https://github.com/flipped-aurora/gin-vue-admin into gva_gormv2_dev

......@@ -10,9 +10,9 @@ import (
)
var Authorities = []model.SysAuthority{
{CreatedAt: time.Now(), UpdatedAt: time.Now(), AuthorityId: "888", AuthorityName: "普通用户", ParentId: "0"},
{CreatedAt: time.Now(), UpdatedAt: time.Now(), AuthorityId: "8881", AuthorityName: "普通用户子角色", ParentId: "888"},
{CreatedAt: time.Now(), UpdatedAt: time.Now(), AuthorityId: "9528", AuthorityName: "测试角色", ParentId: "0"},
{CreatedAt: time.Now(), UpdatedAt: time.Now(), AuthorityId: "888", AuthorityName: "普通用户", ParentId: "0", DefaultRouter: "dashboard"},
{CreatedAt: time.Now(), UpdatedAt: time.Now(), AuthorityId: "8881", AuthorityName: "普通用户子角色", ParentId: "888", DefaultRouter: "dashboard"},
{CreatedAt: time.Now(), UpdatedAt: time.Now(), AuthorityId: "9528", AuthorityName: "测试角色", ParentId: "0", DefaultRouter: "dashboard"},
}
func InitSysAuthority(db *gorm.DB) {
......
......@@ -43,7 +43,7 @@ system:
env: 'public' # Change to "develop" to skip authentication for development mode
addr: 8888
db-type: 'mysql'
oss-type: 'local'
oss-type: 'local' # 控制oss选择走本期还是 七牛等其他仓 自行增加其他oss仓可以在 server/utils/upload/upload.go 中 NewOss函数配置
use-multipoint: false
# captcha configuration
......
......@@ -14,4 +14,5 @@ type SysAuthority struct {
DataAuthorityId []SysAuthority `json:"dataAuthorityId" gorm:"many2many:sys_data_authority_id"`
Children []SysAuthority `json:"children" gorm:"-"`
SysBaseMenus []SysBaseMenu `json:"menus" gorm:"many2many:sys_authority_menus;"`
DefaultRouter string `json:"defaultRouter" gorm:"comment:默认菜单;default:dashboard"`
}
......@@ -7,7 +7,7 @@ import (
)
func Init{{.StructName}}Router(Router *gin.RouterGroup) {
{{.StructName}}Router := Router.Group("{{.Abbreviation}}").Use(middleware.JWTAuth()).Use(middleware.CasbinHandler()).Use(middleware.OperationRecord())
{{.StructName}}Router := Router.Group("{{.Abbreviation}}").Use(middleware.OperationRecord())
{
{{.StructName}}Router.POST("create{{.StructName}}", v1.Create{{.StructName}}) // 新建{{.StructName}}
{{.StructName}}Router.DELETE("delete{{.StructName}}", v1.Delete{{.StructName}}) // 删除{{.StructName}}
......
......@@ -68,14 +68,7 @@
<el-table-column label="按钮组">
<template slot-scope="scope">
<el-button class="table-button" @click="update{{.StructName}}(scope.row)" size="small" type="primary" icon="el-icon-edit">变更</el-button>
<el-popover placement="top" width="160" v-model="scope.row.visible">
<p>确定要删除吗?</p>
<div style="text-align: right; margin: 0">
<el-button size="mini" type="text" @click="scope.row.visible = false">取消</el-button>
<el-button type="primary" size="mini" @click="delete{{.StructName}}(scope.row)">确定</el-button>
</div>
<el-button type="danger" icon="el-icon-delete" size="mini" slot="reference">删除</el-button>
</el-popover>
<el-button type="danger" icon="el-icon-delete" size="mini" @click="deleteRow(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
......@@ -145,7 +138,6 @@ export default {
return {
listApi: get{{ .StructName }}List,
dialogFormVisible: false,
visible: false,
type: "",
deleteVisible: false,
multipleSelection: [],
......@@ -208,6 +200,15 @@ export default {
handleSelectionChange(val) {
this.multipleSelection = val
},
deleteRow(row){
this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.delete{{.StructName}}(row);
});
},
async onDelete() {
const ids = []
if(this.multipleSelection.length == 0){
......@@ -265,7 +266,6 @@ export default {
};
},
async delete{{.StructName}}(row) {
this.visible = false;
const res = await delete{{.StructName}}({ ID: row.ID });
if (res.code == 0) {
this.$message({
......@@ -317,4 +317,4 @@ export default {
</script>
<style>
</style>
\ No newline at end of file
</style>
{
"name": "qm-plus-vue-page",
"name": "gin-vue-admin",
"version": "0.1.0",
"private": true,
"scripts": {
......@@ -72,4 +72,4 @@
"> 1%",
"last 2 versions"
]
}
}
\ No newline at end of file
......@@ -3,7 +3,7 @@
<div style="display:flex;justify-content:space-around;flex-wrap:wrap;padding-top:40px">
<el-image
class="header-img-box-list"
:src="item.url"
:src="(item.url && item.url.slice(0, 4) !== 'http')?path+item.url:item.url"
v-for="(item,key) in picList"
:key="key"
@click.native="chooseImg(item.url,target,targetKey)"
......@@ -17,6 +17,7 @@
</template>
<script>
const path = process.env.VUE_APP_BASE_API
import { getFileList } from "@/api/fileUploadAndDownload";
export default {
props: {
......@@ -26,7 +27,8 @@ export default {
data() {
return {
drawer: false,
picList: []
picList: [],
path:path
};
},
methods: {
......
......@@ -13,7 +13,7 @@ router.beforeEach(async(to, from, next) => {
document.title = getPageTitle(to.meta.title)
if (whiteList.indexOf(to.name) > -1) {
if (token) {
next({ path: '/layout/dashboard' })
next({ name: store.getters["user/userInfo"].authority.defaultRouter })
} else {
next()
}
......@@ -21,7 +21,7 @@ router.beforeEach(async(to, from, next) => {
// 不在白名单中并且已经登陆的时候
if (token) {
// 添加flag防止多次获取动态路由和栈溢出
if (!asyncRouterFlag) {
if (!asyncRouterFlag && store.getters['router/asyncRouters'].length == 0) {
asyncRouterFlag++
await store.dispatch('router/SetAsyncRouter')
const asyncRouters = store.getters['router/asyncRouters']
......
......@@ -28,7 +28,7 @@ export const router = {
// 设置动态路由
setAsyncRouter(state, asyncRouters) {
state.asyncRouters = asyncRouters
}
},
},
actions: {
// 从后台获取动态路由
......@@ -73,6 +73,9 @@ export const router = {
},
routerList(state) {
return state.routerList
},
defaultRouter(state) {
return state.defaultRouter
}
}
}
\ No newline at end of file
......@@ -35,16 +35,19 @@ export const user = {
}
},
actions: {
async LoginIn({ commit }, loginInfo) {
async LoginIn({ commit, dispatch, rootGetters, getters }, loginInfo) {
const res = await login(loginInfo)
if (res.code == 0) {
commit('setUserInfo', res.data.user)
commit('setToken', res.data.token)
await dispatch('router/SetAsyncRouter', {}, { root: true })
const asyncRouters = rootGetters['router/asyncRouters']
router.addRoutes(asyncRouters)
const redirect = router.history.current.query.redirect
if (redirect) {
router.push({ path: redirect })
} else {
router.push({ path: '/layout/dashboard' })
router.push({ name: getters["userInfo"].authority.defaultRouter })
}
return true
}
......
......@@ -84,7 +84,6 @@ export default {
return {
listApi: getExaCustomerList,
dialogFormVisible: false,
visible: false,
type: "",
form: {
customerName: "",
......@@ -119,7 +118,7 @@ export default {
};
},
async deleteCustomer(row) {
this.visible = false;
row.visible = false;
const res = await deleteExaCustomer({ ID: row.ID });
if (res.code == 0) {
this.$message({
......
<template>
<div class="router-history">
<el-tabs
:closable="!(historys.length==1&&this.$route.name=='dashboard')"
:closable="!(historys.length==1&&this.$route.name==defaultRouter)"
@contextmenu.prevent.native="openContextMenu($event)"
@tab-click="changeTab"
@tab-remove="removeTab"
......@@ -27,12 +27,14 @@
</div>
</template>
<script>
import {mapGetters} from "vuex"
export default {
name: 'HistoryComponent',
data() {
return {
historys: [],
activeValue: 'dashboard',
activeValue: '',
contextMenuVisible: false,
left: 0,
top: 0,
......@@ -41,7 +43,15 @@ export default {
rightActive: ''
}
},
computed:{
...mapGetters("user",["userInfo"]),
defaultRouter(){
return this.userInfo.authority.defaultRouter
}
},
created() {
this.activeValue = this.defaultRouter
this.$bus.on('mobile', isMobile => {
this.isMobile = isMobile
})
......@@ -50,9 +60,9 @@ export default {
})
const initHistorys = [
{
name: 'dashboard',
name: this.defaultRouter,
meta: {
title: '仪表盘'
title: '首页'
}
}
]
......@@ -67,7 +77,7 @@ export default {
},
methods: {
openContextMenu(e) {
if (this.historys.length == 1 && this.$route.name == 'dashboard') {
if (this.historys.length == 1 && this.$route.name == this.defaultRouter) {
return false
}
if (e.srcElement.id) {
......@@ -89,13 +99,13 @@ export default {
closeAll() {
this.historys = [
{
name: 'dashboard',
name: this.defaultRouter,
meta: {
title: '仪表盘'
title: '首页'
}
}
]
this.$router.push({ name: 'dashboard' })
this.$router.push({ name: this.defaultRouter })
this.contextMenuVisible = false
sessionStorage.setItem('historys', JSON.stringify(this.historys))
},
......@@ -169,7 +179,7 @@ export default {
const index = this.historys.findIndex(item => item.name == tab)
if (this.$route.name == tab) {
if (this.historys.length == 1) {
this.$router.push({ name: 'dashboard' })
this.$router.push({ name: this.defaultRouter })
} else {
if (index < this.historys.length - 1) {
this.$router.push({ name: this.historys[index + 1].name,query:this.historys[index + 1].query,params:this.historys[index + 1].params })
......
......@@ -13,12 +13,28 @@
node-key="ID"
ref="menuTree"
show-checkbox
></el-tree>
>
<span class="custom-tree-node" slot-scope="{ node , data }">
<span>{{ node.label }}</span>
<span>
<el-button
type="text"
size="mini"
:style="{color:row.defaultRouter == data.name?'#E6A23C':'#85ce61'}"
:disabled="!node.checked"
@click="() => setDefault(data)">
{{row.defaultRouter == data.name?"首页":"设为首页"}}
</el-button>
</span>
</span>
</el-tree>
</div>
</template>
<script>
import { getBaseMenuTree, getMenuAuthority, addMenuAuthority } from '@/api/menu'
import {
updateAuthority,
} from "@/api/authority";
export default {
name: 'Menus',
props: {
......@@ -43,6 +59,13 @@ export default {
}
},
methods: {
async setDefault(data){
const res = await updateAuthority({authorityId: this.row.authorityId,AuthorityName: this.row.authorityName,parentId: this.row.parentId,defaultRouter:data.name})
if(res.code == 0){
this.$message({type:"success",message:"设置成功"})
this.row.defaultRouter = res.data.authority.defaultRouter
}
},
nodeChange(){
this.needConfirm = true
},
......
......@@ -128,7 +128,6 @@ export default {
return {
listApi: getSysDictionaryList,
dialogFormVisible: false,
visible: false,
type: "",
formData: {
name: null,
......@@ -214,7 +213,7 @@ export default {
};
},
async deleteSysDictionary(row) {
this.visible = false;
row.visible = false;
const res = await deleteSysDictionary({ ID: row.ID });
if (res.code == 0) {
this.$message({
......
......@@ -124,7 +124,6 @@ export default {
return {
listApi: getSysDictionaryDetailList,
dialogFormVisible: false,
visible: false,
type: "",
formData: {
label: null,
......@@ -203,7 +202,7 @@ export default {
};
},
async deleteSysDictionaryDetail(row) {
this.visible = false;
row.visible = false;
const res = await deleteSysDictionaryDetail({ ID: row.ID });
if (res.code == 0) {
this.$message({
......
......@@ -123,7 +123,6 @@ export default {
return {
listApi: getSysOperationRecordList,
dialogFormVisible: false,
visible: false,
type: "",
deleteVisible: false,
multipleSelection: [],
......@@ -186,7 +185,7 @@ export default {
}
},
async deleteSysOperationRecord(row) {
this.visible = false;
row.visible = false;
const res = await deleteSysOperationRecord({ ID: row.ID });
if (res.code == 0) {
this.$message({
......
......@@ -121,7 +121,6 @@ export default {
data() {
return {
dbfdOptions: [],
visible: false,
dictOptions: [],
typeSearchOptions: [
{
......
......@@ -110,7 +110,6 @@ export default {
return {
listApi: getWorkflowProcessList,
dialogFormVisible: false,
visible: false,
deleteVisible: false,
multipleSelection: []
};
......@@ -191,7 +190,7 @@ export default {
});
},
async deleteWorkflowProcess(row) {
this.visible = false;
row.visible = false;
const res = await deleteWorkflowProcess({ id: row.id });
if (res.code == 0) {
this.$message({
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册