Browse Source

菜单编辑完成

v1
超级管理员 3 years ago
parent
commit
1cca8cb3f9
  1. 2
      .env.development
  2. 4
      .env.production
  3. 9
      src/api/auth/index.ts
  4. 63
      src/api/menu/index.ts
  5. 7
      src/api/menu/types.ts
  6. 2
      src/api/user/index.ts
  7. 5
      src/layout/components/Sidebar/index.vue
  8. 5
      src/store/modules/permission.ts
  9. 9
      src/types/auto-imports.d.ts
  10. 31
      src/types/components.d.ts
  11. 27
      src/utils/request.ts
  12. 25
      src/views/system/menu/index.vue

2
.env.development

@ -5,5 +5,5 @@ NODE_ENV='development'
VITE_APP_TITLE = '恒信高科'
VITE_APP_PORT = 16666
VITE_APP_BASE_API = '/dev-api'
VITE_APP_BASE_API = ''
VITE_APP_BASE_URL ='http://myvuetest.net'

4
.env.production

@ -2,5 +2,5 @@
VITE_APP_TITLE = '恒信高科'
VITE_APP_PORT = 16666
VITE_APP_BASE_API = '/prod-api'
VITE_APP_BASE_URL ='http://ginadmin.hxgk.group'
VITE_APP_BASE_API = ''
VITE_APP_BASE_URL ='http://myvuetest.net'

9
src/api/auth/index.ts

@ -26,13 +26,18 @@ export function loginApiIng(data: LoginData): AxiosPromise<LoginResult> {
/**
* API
*/
export function logoutApi() {
export function logoutApiOld() {
return request({
url: "/api/v1/auth/logout",
method: "delete",
});
}
export function logoutApi() {
return request({
url: "/kpiapi/base/signout",
method: "post",
});
}
/**
*
*/

63
src/api/menu/index.ts

@ -1,6 +1,6 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { MenuQuery, MenuVO, MenuForm } from './types';
import { MenuQuery, MenuVO, MenuForm,menuInfo } from './types';
/**
*
@ -13,7 +13,7 @@ export function listRoutes() {
}
export function listRoutesIng() {
return request({
url: '/menus/get_menus_three',
url: '/systemapi/menus/get_routers_three',
method: 'get'
});
}
@ -22,56 +22,79 @@ export function listRoutesIng() {
*
* @param queryParams
*/
export function listMenus(queryParams: MenuQuery): AxiosPromise<MenuVO[]> {
export function listMenusOld(queryParams: MenuQuery): AxiosPromise<MenuVO[]> {
return request({
url: '/api/v1/menus',
method: 'get',
params: queryParams
});
}
export function listMenus(queryParams: MenuQuery): AxiosPromise<MenuVO[]> {
return request({
url: '/systemapi/menus/get_menus_three',
method: 'get',
params: queryParams
});
}
/**
*
*/
export function listMenuOptions(): AxiosPromise<OptionType[]> {
export function listMenuOptionsOld(): AxiosPromise<OptionType[]> {
return request({
url: '/api/v1/menus/options',
method: 'get'
});
}
export function listMenuOptions(): AxiosPromise<OptionType[]> {
return request({
url: '/systemapi/menus/menu_options',
method: 'get'
});
}
/**
*
*
* @param id
*/
export function getMenuForm(id: number): AxiosPromise<MenuForm> {
export function getMenuFormOld(id: number): AxiosPromise<MenuForm> {
return request({
url: '/api/v1/menus/' + id + '/form',
method: 'get'
});
}
export function getMenuForm(data: menuInfo): AxiosPromise<MenuForm> {
return request({
url: '/systemapi/menus/get_one_menu_cont',
method: 'post',
data:data
});
}
/**
*
*
* @param data
*/
export function addMenu(data: MenuForm) {
export function addMenuOld(data: MenuForm) {
return request({
url: '/api/v1/menus',
method: 'post',
data: data
});
}
export function addMenu(data: MenuForm) {
return request({
url: '/systemapi/menus/add_new_menu',
method: 'post',
data: data
});
}
/**
*
*
* @param id
* @param data
*/
export function updateMenu(id: string, data: MenuForm) {
export function updateMenuOld(id: string, data: MenuForm) {
return request({
url: '/api/v1/menus/' + id,
method: 'put',
@ -79,14 +102,30 @@ export function updateMenu(id: string, data: MenuForm) {
});
}
export function updateMenu(data: MenuForm) {
return request({
url: '/systemapi/menus/edit_menus_cont',
method: 'post',
data: data
});
}
/**
*
*
* @param id ID
*/
export function deleteMenu(id: number) {
export function deleteMenuOld(id: number) {
return request({
url: '/api/v1/menus/' + id,
method: 'delete'
});
}
export function deleteMenu(data: menuInfo) {
return request({
url: '/systemapi/menus/delt_menus_cont',
method: 'post',
data:data
});
}

7
src/api/menu/types.ts

@ -113,3 +113,10 @@ export interface MenuForm {
*/
perm?: string;
}
/**
*
*/
export interface menuInfo {
id:string;
}

2
src/api/user/index.ts

@ -13,7 +13,7 @@ export function getUserInfo(): AxiosPromise<UserInfo> {
}
export function getUserInfoIng(): AxiosPromise<UserInfo> {
return request({
url: '/user/get_user_cont',
url: '/systemapi/user/get_user_cont',
method: 'get'
});
}

5
src/layout/components/Sidebar/index.vue

@ -14,6 +14,11 @@ const permissionStore = usePermissionStore();
const appStore = useAppStore();
const currRoute = useRoute();
const { sidebarLogo } = storeToRefs(settingsStore);
// console.log("------>",permissionStore.routes)
</script>
<template>

5
src/store/modules/permission.ts

@ -44,6 +44,7 @@ const filterAsyncRoutes = (routes: RouteRecordRaw[], roles: string[]) => {
// 判断用户(角色)是否有该路由的访问权限
if (hasPermission(roles, tmpRoute)) {
// console.log("判断用户(角色)是否有该路由的访问权限----->",roles, tmpRoute)
if (tmpRoute.component?.toString() == "Layout") {
tmpRoute.component = Layout;
console.log();
@ -63,7 +64,7 @@ const filterAsyncRoutes = (routes: RouteRecordRaw[], roles: string[]) => {
asyncRoutes.push(tmpRoute);
}
});
// console.log("判断用户(角色)是否有该路由的访问权限---111-->",asyncRoutes)
return asyncRoutes;
};
@ -74,6 +75,7 @@ export const usePermissionStore = defineStore("permission", () => {
// actions
function setRoutes(newRoutes: RouteRecordRaw[]) {
// console.log('setRoutes--->',newRoutes)
routes.value = constantRoutes.concat(newRoutes);
}
/**
@ -99,6 +101,7 @@ export const usePermissionStore = defineStore("permission", () => {
.then(({ data: asyncRoutes }) => {
// 根据角色获取有访问权限的路由
const accessedRoutes = filterAsyncRoutes(asyncRoutes, roles);
// console.log('根据角色获取有访问权限的路由',accessedRoutes,asyncRoutes, roles)
setRoutes(accessedRoutes);
resolve(accessedRoutes);
})

9
src/types/auto-imports.d.ts

@ -5,9 +5,10 @@
export {}
declare global {
const EffectScope: typeof import('vue')['EffectScope']
const ElForm: typeof import('element-plus/es')['ElForm']
const ElForm: typeof import('element-plus/es')['ElForm']
const ElMessage: typeof import('element-plus/es')['ElMessage']
const ElMessageBox: typeof import('element-plus/es')['ElMessageBox']
const ElTree: typeof import('element-plus/es')['ElTree']
const asyncComputed: typeof import('@vueuse/core')['asyncComputed']
const autoResetRef: typeof import('@vueuse/core')['autoResetRef']
const computed: typeof import('vue')['computed']
@ -288,9 +289,6 @@ import { UnwrapRef } from 'vue'
declare module 'vue' {
interface ComponentCustomProperties {
readonly EffectScope: UnwrapRef<typeof import('vue')['EffectScope']>
readonly ElForm: UnwrapRef<typeof import('element-plus/es')['ElForm']>
readonly ElMessage: UnwrapRef<typeof import('element-plus/es')['ElMessage']>
readonly ElMessageBox: UnwrapRef<typeof import('element-plus/es')['ElMessageBox']>
readonly asyncComputed: UnwrapRef<typeof import('@vueuse/core')['asyncComputed']>
readonly autoResetRef: UnwrapRef<typeof import('@vueuse/core')['autoResetRef']>
readonly computed: UnwrapRef<typeof import('vue')['computed']>
@ -565,9 +563,6 @@ declare module 'vue' {
declare module '@vue/runtime-core' {
interface ComponentCustomProperties {
readonly EffectScope: UnwrapRef<typeof import('vue')['EffectScope']>
readonly ElForm: UnwrapRef<typeof import('element-plus/es')['ElForm']>
readonly ElMessage: UnwrapRef<typeof import('element-plus/es')['ElMessage']>
readonly ElMessageBox: UnwrapRef<typeof import('element-plus/es')['ElMessageBox']>
readonly asyncComputed: UnwrapRef<typeof import('@vueuse/core')['asyncComputed']>
readonly autoResetRef: UnwrapRef<typeof import('@vueuse/core')['autoResetRef']>
readonly computed: UnwrapRef<typeof import('vue')['computed']>

31
src/types/components.d.ts

@ -10,32 +10,60 @@ export {}
declare module '@vue/runtime-core' {
export interface GlobalComponents {
Breadcrumb: typeof import('./../components/Breadcrumb/index.vue')['default']
ElAlert: typeof import('element-plus/es')['ElAlert']
ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem']
ElButton: typeof import('element-plus/es')['ElButton']
ElCard: typeof import('element-plus/es')['ElCard']
ElCol: typeof import('element-plus/es')['ElCol']
ElDialog: typeof import('element-plus/es')['ElDialog']
ElDivider: typeof import('element-plus/es')['ElDivider']
ElDropdown: typeof import('element-plus/es')['ElDropdown']
ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem']
ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu']
ElForm: typeof import('element-plus/es')['ElForm']
ElFormItem: typeof import('element-plus/es')['ElFormItem']
ElIcon: typeof import('element-plus/es')['ElIcon']
ElInput: typeof import('element-plus/es')['ElInput']
ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
ElLink: typeof import('element-plus/es')['ElLink']
ElMenu: typeof import('element-plus/es')['ElMenu']
ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
ElOption: typeof import('element-plus/es')['ElOption']
ElPagination: typeof import('element-plus/es')['ElPagination']
ElPopover: typeof import('element-plus/es')['ElPopover']
ElRadio: typeof import('element-plus/es')['ElRadio']
ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
ElRow: typeof import('element-plus/es')['ElRow']
ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
ElSelect: typeof import('element-plus/es')['ElSelect']
ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
ElSwitch: typeof import('element-plus/es')['ElSwitch']
ElTable: typeof import('element-plus/es')['ElTable']
ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
ElTag: typeof import('element-plus/es')['ElTag']
ElTooltip: typeof import('element-plus/es')['ElTooltip']
ElTree: typeof import('element-plus/es')['ElTree']
ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
ElUpload: typeof import('element-plus/es')['ElUpload']
GithubCorner: typeof import('./../components/GithubCorner/index.vue')['default']
Hamburger: typeof import('./../components/Hamburger/index.vue')['default']
IconSelect: typeof import('./../components/IconSelect/index.vue')['default']
IEpCaretBottom: typeof import('~icons/ep/caret-bottom')['default']
IEpCaretTop: typeof import('~icons/ep/caret-top')['default']
IEpClose: typeof import('~icons/ep/close')['default']
IEpCollection: typeof import('~icons/ep/collection')['default']
IEpDelete: typeof import('~icons/ep/delete')['default']
IEpDownload: typeof import('~icons/ep/download')['default']
IEpEdit: typeof import('~icons/ep/edit')['default']
IEpPlus: typeof import('~icons/ep/plus')['default']
IEpPosition: typeof import('~icons/ep/position')['default']
IEpRefresh: typeof import('~icons/ep/refresh')['default']
IEpRefreshLeft: typeof import('~icons/ep/refresh-left')['default']
IEpSearch: typeof import('~icons/ep/search')['default']
IEpSetting: typeof import('~icons/ep/setting')['default']
IEpTop: typeof import('~icons/ep/top')['default']
IEpUploadFilled: typeof import('~icons/ep/upload-filled')['default']
LangSelect: typeof import('./../components/LangSelect/index.vue')['default']
MultiUpload: typeof import('./../components/Upload/MultiUpload.vue')['default']
Pagination: typeof import('./../components/Pagination/index.vue')['default']
@ -47,4 +75,7 @@ declare module '@vue/runtime-core' {
SvgIcon: typeof import('./../components/SvgIcon/index.vue')['default']
WangEditor: typeof import('./../components/WangEditor/index.vue')['default']
}
export interface ComponentCustomProperties {
vLoading: typeof import('element-plus/es')['ElLoadingDirective']
}
}

27
src/utils/request.ts

@ -32,15 +32,26 @@ service.interceptors.request.use(
service.interceptors.response.use(
(response: AxiosResponse) => {
const { code, msg } = response.data;
// console.log("响应拦截器111",code, msg)
if (code === 0) {
return response.data;
}
if (code === 7 || code === 300 || code === 301 || code === 302){
ElMessageBox.confirm("身份令牌已失效!请重新登录!", "提示", {
confirmButtonText: "确定",
type: "warning",
}).then(() => {
localStorage.clear();
window.location.href = "/";
});
return response.data;
}
// 响应数据为二进制流处理(Excel导出)
if (response.data instanceof ArrayBuffer) {
return response;
}
ElMessage.error(msg || "系统出错111");
ElMessage.error(msg || "系统出错!");
return Promise.reject(new Error(msg || "Error"));
},
(error: any) => {
@ -56,8 +67,16 @@ service.interceptors.response.use(
localStorage.clear();
window.location.href = "/";
});
} else {
ElMessage.error(msg || "系统出错222");
}else if(code === 7 || code === 300 || code === 301 || code === 302){
ElMessageBox.confirm("身份令牌已失效!请重新登录!", "提示", {
confirmButtonText: "确定",
type: "warning",
}).then(() => {
localStorage.clear();
window.location.href = "/";
});
} else {
ElMessage.error(msg || "系统出错!!");
}
}
return Promise.reject(error.message);

25
src/views/system/menu/index.vue

@ -36,7 +36,7 @@ const menuOptions = ref<OptionType[]>([]);
const formData = reactive<MenuForm>({
parentId: 0,
visible: 1,
sort: 1,
sort: 50,
type: MenuTypeEnum.MENU,
});
@ -105,7 +105,7 @@ function openDialog(parentId?: number, menuId?: number) {
dialog.visible = true;
if (menuId) {
dialog.title = "编辑菜单";
getMenuForm(menuId).then(({ data }) => {
getMenuForm({id:menuId.toString()}).then(({ data }) => {
Object.assign(formData, data);
menuCacheData.type = data.type;
menuCacheData.path = data.path ?? "";
@ -136,8 +136,9 @@ function submitForm() {
menuFormRef.value.validate((isValid: boolean) => {
if (isValid) {
const menuId = formData.id;
console.log("菜单提交",formData,menuId,formData.id)
if (menuId) {
updateMenu(menuId, formData).then(() => {
updateMenu(formData).then(() => {
ElMessage.success("修改成功");
closeDialog();
handleQuery();
@ -168,7 +169,7 @@ function handleDelete(menuId: number) {
type: "warning",
})
.then(() => {
deleteMenu(menuId).then(() => {
deleteMenu({id:menuId.toString()}).then(() => {
ElMessage.success("删除成功");
handleQuery();
});
@ -194,7 +195,7 @@ function resetForm() {
formData.id = undefined;
formData.parentId = 0;
formData.visible = 1;
formData.sort = 1;
formData.sort = 50;
formData.perm = undefined;
}
@ -269,17 +270,17 @@ onMounted(() => {
<el-table-column label="类型" align="center" width="80">
<template #default="scope">
<el-tag
v-if="scope.row.type === MenuTypeEnum.CATALOG"
v-if="scope.row.class === MenuTypeEnum.CATALOG"
type="warning"
>目录</el-tag
>
<el-tag v-if="scope.row.type === MenuTypeEnum.MENU" type="success"
<el-tag v-if="scope.row.class === MenuTypeEnum.MENU" type="success"
>菜单</el-tag
>
<el-tag v-if="scope.row.type === MenuTypeEnum.BUTTON" type="danger"
<el-tag v-if="scope.row.class === MenuTypeEnum.BUTTON" type="danger"
>按钮</el-tag
>
<el-tag v-if="scope.row.type === MenuTypeEnum.EXTLINK" type="info"
<el-tag v-if="scope.row.class === MenuTypeEnum.EXTLINK" type="info"
>外链</el-tag
>
</template>
@ -434,13 +435,13 @@ onMounted(() => {
</el-form-item>
<!-- 权限标识 -->
<el-form-item
<!-- <el-form-item
v-if="formData.type == 'BUTTON'"
label="权限标识"
prop="perm"
>
<el-input v-model="formData.perm" placeholder="sys:user:add" />
</el-form-item>
</el-form-item> -->
<el-form-item
v-if="formData.type !== 'BUTTON'"
@ -461,7 +462,7 @@ onMounted(() => {
<el-form-item v-if="formData.type !== 'BUTTON'" label="状态">
<el-radio-group v-model="formData.visible">
<el-radio :label="1">显示</el-radio>
<el-radio :label="0">隐藏</el-radio>
<el-radio :label="2">隐藏</el-radio>
</el-radio-group>
</el-form-item>

Loading…
Cancel
Save