Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -2,4 +2,7 @@
|
||||
ENV = 'development'
|
||||
|
||||
# 本地环境接口地址
|
||||
VITE_API_URL = 'http://127.0.0.1:8000/'
|
||||
VITE_API_URL = 'http://127.0.0.1:8000/'
|
||||
|
||||
# 是否启用按钮权限
|
||||
VITE_PM_ENABLED = true
|
||||
|
||||
@@ -2,4 +2,7 @@
|
||||
ENV = 'production'
|
||||
|
||||
# 线上环境接口地址
|
||||
VITE_API_URL = 'https://lyt-top.gitee.io/vue-next-admin-preview/'
|
||||
VITE_API_URL = 'https://lyt-top.gitee.io/vue-next-admin-preview/'
|
||||
|
||||
# 是否启用按钮权限
|
||||
VITE_PM_ENABLED = true
|
||||
|
||||
@@ -13,13 +13,12 @@ import piniaPersist from 'pinia-plugin-persist'
|
||||
// @ts-ignore
|
||||
import fastCrud from './settings.ts'
|
||||
import pinia from './stores';
|
||||
|
||||
import permission from "/@/plugin/permission/index";
|
||||
const app = createApp(App);
|
||||
pinia.use(piniaPersist)
|
||||
|
||||
directive(app);
|
||||
other.elSvg(app);
|
||||
|
||||
app.use(permission)
|
||||
app.use(pinia).use(router).use(ElementPlus, { i18n: i18n.global.t }).use(i18n).use(VueGridLayout).use(fastCrud).mount('#app');
|
||||
|
||||
app.config.globalProperties.mittBus = mitt();
|
||||
|
||||
10
web/src/plugin/permission/directive.permission.ts
Normal file
10
web/src/plugin/permission/directive.permission.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import permissionUtil from './func.permission'
|
||||
export default {
|
||||
mounted (el:any, binding:any) {
|
||||
const { value } = binding
|
||||
const hasPermission = permissionUtil.hasPermissions(value)
|
||||
if (!hasPermission) {
|
||||
el.parentNode && el.parentNode.removeChild(el)
|
||||
}
|
||||
}
|
||||
}
|
||||
17
web/src/plugin/permission/func.permission.ts
Normal file
17
web/src/plugin/permission/func.permission.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
import XEUtils from 'xe-utils'
|
||||
import {BtnPermissionStore} from "/@/plugin/permission/store.permission";
|
||||
|
||||
export default {
|
||||
hasPermissions (value:string | string[]) {
|
||||
const BtnPermission = BtnPermissionStore().data
|
||||
if (import.meta.env.VITE_PM_ENABLED) {
|
||||
if(value instanceof Array){
|
||||
return XEUtils.includeArrays(BtnPermission, value)
|
||||
}else if(typeof value === 'string'){
|
||||
const index = XEUtils.arrayIndexOf(BtnPermission, value)
|
||||
return index>0?true:false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
}
|
||||
10
web/src/plugin/permission/index.ts
Normal file
10
web/src/plugin/permission/index.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import permissionDirective from './directive.permission'
|
||||
import permissionFunc from './func.permission'
|
||||
const install = function (app:any) {
|
||||
app.directive('permission', permissionDirective)
|
||||
app.provide('$hasPermissions',permissionFunc.hasPermissions)
|
||||
}
|
||||
|
||||
export default {
|
||||
install
|
||||
}
|
||||
26
web/src/plugin/permission/store.permission.ts
Normal file
26
web/src/plugin/permission/store.permission.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
import {defineStore} from "pinia";
|
||||
import {DictionaryStates} from "/@/stores/interface";
|
||||
import {request} from "/@/utils/service";
|
||||
|
||||
export const BtnPermissionStore = defineStore('BtnPermission', {
|
||||
state: (): DictionaryStates => ({
|
||||
data: []
|
||||
}),
|
||||
actions: {
|
||||
async getBtnPermissionStore() {
|
||||
request({
|
||||
url: '/api/system/menu_button/menu_button_all_permission/',
|
||||
method: 'get',
|
||||
}).then((ret: {
|
||||
data: []
|
||||
}) => {
|
||||
// 转换数据格式并保存到pinia
|
||||
let dataList = ret.data
|
||||
this.data=dataList
|
||||
})
|
||||
},
|
||||
},
|
||||
persist: {
|
||||
enabled: true,
|
||||
},
|
||||
});
|
||||
@@ -11,6 +11,7 @@ import { useRoutesList } from '/@/stores/routesList';
|
||||
import { useTagsViewRoutes } from '/@/stores/tagsViewRoutes';
|
||||
import { useMenuApi } from '/@/api/menu/index';
|
||||
import { handleMenu } from '../utils/menu';
|
||||
import {BtnPermissionStore} from "/@/plugin/permission/store.permission";
|
||||
|
||||
const menuApi = useMenuApi();
|
||||
|
||||
@@ -102,6 +103,8 @@ export async function setAddRoute() {
|
||||
* @returns 返回后端路由菜单数据
|
||||
*/
|
||||
export function getBackEndControlRoutes() {
|
||||
//获取所有的按钮权限
|
||||
BtnPermissionStore().getBtnPermissionStore();
|
||||
return menuApi.getSystemMenu();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import { request } from "/@/utils/service";
|
||||
// import request from "/@/utils/request";
|
||||
|
||||
export function getCaptcha() {
|
||||
return request({
|
||||
@@ -19,4 +18,4 @@ export function getUserInfo() {
|
||||
url: '/api/system/user/user_info/',
|
||||
method: 'get',
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,6 +74,7 @@ import { NextLoading } from '/@/utils/loading';
|
||||
import * as loginApi from '/@/views/system/login/api';
|
||||
import { useUserInfo } from '/@/stores/userInfo';
|
||||
import { DictionaryStore } from '/@/stores/dictionary';
|
||||
import {BtnPermissionStore} from "/@/plugin/permission/store.permission";
|
||||
import { Md5 } from 'ts-md5';
|
||||
|
||||
export default defineComponent({
|
||||
@@ -139,8 +140,8 @@ export default defineComponent({
|
||||
const loginSuccess = () => {
|
||||
//登录成功获取用户信息,获取系统字典数据
|
||||
getUserInfo();
|
||||
//获取所有字典
|
||||
DictionaryStore().getSystemDictionarys();
|
||||
|
||||
// 初始化登录成功时间问候语
|
||||
let currentTimeInfo = currentTime.value;
|
||||
// 登录成功,跳到转首页
|
||||
|
||||
@@ -81,11 +81,8 @@ export const createCrudOptions = function ({
|
||||
},
|
||||
name: {
|
||||
title: '权限名称',
|
||||
type: 'dict-select',
|
||||
type: 'text',
|
||||
search: {show: true},
|
||||
dict: dict({
|
||||
data: dictionary('system_button')
|
||||
}),
|
||||
column: {
|
||||
minWidth: 120,
|
||||
sortable: true,
|
||||
@@ -103,7 +100,7 @@ export const createCrudOptions = function ({
|
||||
},
|
||||
helper: {
|
||||
render (h) {
|
||||
return (< el-alert title="可手动输入不在列表中的新值" type="warning" description="比较常用的建议放在字典管理中"/>
|
||||
return (< el-alert title="手动输入" type="warning" description="页面中按钮的名称或者自定义一个名称"/>
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -122,7 +119,7 @@ export const createCrudOptions = function ({
|
||||
placeholder: '输入权限标识',
|
||||
helper: {
|
||||
render (h) {
|
||||
return (< el-alert title="用于前端按钮权限的判断展示" type="warning" description="使用方法:vm.hasPermissions(权限值)"/>
|
||||
return (< el-alert title="唯一值" type="warning" description="用于判断前端按钮权限或接口权限"/>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,12 +3,14 @@ import { dict, PageQuery, AddReq, DelReq, EditReq, CrudExpose, CrudOptions, } fr
|
||||
import { dictionary } from "/@/utils/dictionary";
|
||||
import iconSelector from '/@/components/iconSelector/index.vue'
|
||||
import {useCompute} from '@fast-crud/fast-crud'
|
||||
import {inject} from 'vue'
|
||||
const {compute} = useCompute()
|
||||
interface CreateCrudOptionsTypes {
|
||||
crudOptions: CrudOptions;
|
||||
}
|
||||
|
||||
export const createCrudOptions = function ({ crudExpose,menuButtonRef }: { crudExpose: CrudExpose,menuButtonRef:any }): CreateCrudOptionsTypes {
|
||||
const hasPermissions = inject('$hasPermissions')
|
||||
//验证路由地址
|
||||
const validateWebPath = (rule: string, value: string, callback: Function) => {
|
||||
const isLink = crudExpose.getFormData().is_link
|
||||
@@ -67,6 +69,13 @@ export const createCrudOptions = function ({ crudExpose,menuButtonRef }: { crudE
|
||||
load:loadContentMethod,
|
||||
treeProps:{children: 'children', hasChildren: 'hasChild'}
|
||||
},
|
||||
actionbar: {
|
||||
buttons: {
|
||||
add: {
|
||||
show: hasPermissions('Menu:Create')
|
||||
}
|
||||
}
|
||||
},
|
||||
rowHandle: {
|
||||
buttons: {
|
||||
custom: {
|
||||
@@ -77,10 +86,11 @@ export const createCrudOptions = function ({ crudExpose,menuButtonRef }: { crudE
|
||||
content: "按钮配置"
|
||||
},
|
||||
show:compute(({row}:any)=>{
|
||||
if (row.web_path && !row.is_link) {
|
||||
return true
|
||||
if (row.web_path && !row.is_link) {
|
||||
return true && hasPermissions()
|
||||
}
|
||||
return false
|
||||
|
||||
}),
|
||||
click:(context:any):void => {
|
||||
const {row} = context
|
||||
|
||||
Reference in New Issue
Block a user