Browse Source

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

pixel 4 years ago
parent
commit
18e57b152d

+ 3 - 3
server/cmd/datas/authorities.go

@@ -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) {

+ 1 - 1
server/config.yaml

@@ -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

+ 1 - 0
server/model/sys_authority.go

@@ -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"`
 }

+ 1 - 1
server/resource/template/server/router.go.tpl

@@ -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}}

+ 11 - 11
server/resource/template/web/table.vue.tpl

@@ -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>
+</style>

+ 2 - 2
web/package.json

@@ -1,5 +1,5 @@
 {
-    "name": "qm-plus-vue-page",
+    "name": "gin-vue-admin",
     "version": "0.1.0",
     "private": true,
     "scripts": {
@@ -72,4 +72,4 @@
         "> 1%",
         "last 2 versions"
     ]
-}
+}

+ 4 - 2
web/src/components/chooseImg/index.vue

@@ -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: {

+ 2 - 2
web/src/permission.js

@@ -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']

+ 4 - 1
web/src/store/module/router.js

@@ -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
         }
     }
 }

+ 5 - 2
web/src/store/module/user.js

@@ -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
             }

+ 1 - 2
web/src/view/example/customer/customer.vue

@@ -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({

+ 19 - 9
web/src/view/layout/aside/historyComponent/history.vue

@@ -1,7 +1,7 @@
 <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 })

+ 25 - 2
web/src/view/superAdmin/authority/components/menus.vue

@@ -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
     },

+ 1 - 2
web/src/view/superAdmin/dictionary/sysDictionary.vue

@@ -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({

+ 1 - 2
web/src/view/superAdmin/dictionary/sysDictionaryDetail.vue

@@ -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({

+ 1 - 2
web/src/view/superAdmin/operation/sysOperationRecord.vue

@@ -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({

+ 0 - 1
web/src/view/systemTools/autoCode/component/fieldDialog.vue

@@ -121,7 +121,6 @@ export default {
   data() {
     return {
       dbfdOptions: [],
-      visible: false,
       dictOptions: [],
       typeSearchOptions: [
         {

+ 1 - 2
web/src/view/workflow/workflowProcess/workflowProcess.vue

@@ -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({