Merge remote-tracking branch 'origin/master'

This commit is contained in:
H0nGzA1
2023-02-11 16:00:43 +08:00
18 changed files with 186 additions and 200 deletions

View File

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

View File

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

View File

@@ -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();

View 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)
}
}
}

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

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

View 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,
},
});

View File

@@ -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();
}

View File

@@ -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',
});
}
}

View File

@@ -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;
// 登录成功,跳到转首页

View File

@@ -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="用于判断前端按钮权限或接口权限"/>
)
}
}

View File

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