ソースを参照

!1874 菜单管理支持在列表直接修改状态
Merge pull request !1874 from Lzh666/v2

zuohuaijun 8 ヶ月 前
コミット
454fac410a

+ 4 - 0
Admin.NET/Admin.NET.Core/Service/Menu/Dto/MenuInput.cs

@@ -44,4 +44,8 @@ public class UpdateMenuInput : AddMenuInput
 
 public class DeleteMenuInput : BaseIdInput
 {
+}
+
+public class MenuStatusInput : BaseStatusInput
+{
 }

+ 18 - 0
Admin.NET/Admin.NET.Core/Service/Menu/SysMenuService.cs

@@ -181,6 +181,24 @@ public class SysMenuService : IDynamicApiController, ITransient
         DeleteMenuCache();
     }
 
+    /// <summary>
+    /// 设置菜单状态 🔖
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [UnitOfWork]
+    [DisplayName("设置菜单状态")]
+    public virtual async Task<int> SetStatus(MenuStatusInput input)
+    {
+        if (_userManager.UserId == input.Id)
+            throw Oops.Oh(ErrorCodeEnum.D1026);
+
+        var menu = await _sysMenuRep.GetByIdAsync(input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
+        menu.Status = input.Status;
+        var rows = await _sysMenuRep.AsUpdateable(menu).UpdateColumns(u => new { u.Status }).ExecuteCommandAsync();
+        return rows;
+    }
+
     /// <summary>
     /// 增加和编辑时检查菜单数据
     /// </summary>

+ 85 - 0
Web/src/api-services/apis/sys-menu-api.ts

@@ -18,11 +18,13 @@ import { Configuration } from '../configuration';
 // @ts-ignore
 import { BASE_PATH, COLLECTION_FORMATS, RequestArgs, BaseAPI, RequiredError } from '../base';
 import { AddMenuInput } from '../models';
+import { AdminResultInt32 } from '../models';
 import { AdminResultInt64 } from '../models';
 import { AdminResultListMenuOutput } from '../models';
 import { AdminResultListString } from '../models';
 import { AdminResultListSysMenu } from '../models';
 import { DeleteMenuInput } from '../models';
+import { MenuStatusInput } from '../models';
 import { MenuTypeEnum } from '../models';
 import { UpdateMenuInput } from '../models';
 /**
@@ -271,6 +273,54 @@ export const SysMenuApiAxiosParamCreator = function (configuration?: Configurati
                 options: localVarRequestOptions,
             };
         },
+        /**
+         * 
+         * @summary 设置菜单状态 🔖
+         * @param {MenuStatusInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysMenuSetStatusPost: async (body?: MenuStatusInput, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/api/sysMenu/setStatus`;
+            // use dummy base URL string because the URL constructor only accepts absolute URLs.
+            const localVarUrlObj = new URL(localVarPath, 'https://example.com');
+            let baseOptions;
+            if (configuration) {
+                baseOptions = configuration.baseOptions;
+            }
+            const localVarRequestOptions :AxiosRequestConfig = { method: 'POST', ...baseOptions, ...options};
+            const localVarHeaderParameter = {} as any;
+            const localVarQueryParameter = {} as any;
+
+            // authentication Bearer required
+            // http bearer authentication required
+            if (configuration && configuration.accessToken) {
+                const accessToken = typeof configuration.accessToken === 'function'
+                    ? await configuration.accessToken()
+                    : await configuration.accessToken;
+                localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
+            }
+
+            localVarHeaderParameter['Content-Type'] = 'application/json-patch+json';
+
+            const query = new URLSearchParams(localVarUrlObj.search);
+            for (const key in localVarQueryParameter) {
+                query.set(key, localVarQueryParameter[key]);
+            }
+            for (const key in options.params) {
+                query.set(key, options.params[key]);
+            }
+            localVarUrlObj.search = (new URLSearchParams(query)).toString();
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
+            const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json';
+            localVarRequestOptions.data =  needsSerialization ? JSON.stringify(body !== undefined ? body : {}) : (body || "");
+
+            return {
+                url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
+                options: localVarRequestOptions,
+            };
+        },
         /**
          * 
          * @summary 更新菜单 🔖
@@ -398,6 +448,20 @@ export const SysMenuApiFp = function(configuration?: Configuration) {
                 return axios.request(axiosRequestArgs);
             };
         },
+        /**
+         * 
+         * @summary 设置菜单状态 🔖
+         * @param {MenuStatusInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysMenuSetStatusPost(body?: MenuStatusInput, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultInt32>>> {
+            const localVarAxiosArgs = await SysMenuApiAxiosParamCreator(configuration).apiSysMenuSetStatusPost(body, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
         /**
          * 
          * @summary 更新菜单 🔖
@@ -471,6 +535,16 @@ export const SysMenuApiFactory = function (configuration?: Configuration, basePa
         async apiSysMenuOwnBtnPermListGet(options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultListString>> {
             return SysMenuApiFp(configuration).apiSysMenuOwnBtnPermListGet(options).then((request) => request(axios, basePath));
         },
+        /**
+         * 
+         * @summary 设置菜单状态 🔖
+         * @param {MenuStatusInput} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysMenuSetStatusPost(body?: MenuStatusInput, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultInt32>> {
+            return SysMenuApiFp(configuration).apiSysMenuSetStatusPost(body, options).then((request) => request(axios, basePath));
+        },
         /**
          * 
          * @summary 更新菜单 🔖
@@ -546,6 +620,17 @@ export class SysMenuApi extends BaseAPI {
     public async apiSysMenuOwnBtnPermListGet(options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultListString>> {
         return SysMenuApiFp(this.configuration).apiSysMenuOwnBtnPermListGet(options).then((request) => request(this.axios, this.basePath));
     }
+    /**
+     * 
+     * @summary 设置菜单状态 🔖
+     * @param {MenuStatusInput} [body] 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysMenuApi
+     */
+    public async apiSysMenuSetStatusPost(body?: MenuStatusInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultInt32>> {
+        return SysMenuApiFp(this.configuration).apiSysMenuSetStatusPost(body, options).then((request) => request(this.axios, this.basePath));
+    }
     /**
      * 
      * @summary 更新菜单 🔖

+ 1 - 0
Web/src/api-services/models/index.ts

@@ -243,6 +243,7 @@ export * from './mapping-type';
 export * from './member-info';
 export * from './member-types';
 export * from './menu-output';
+export * from './menu-status-input';
 export * from './menu-type-enum';
 export * from './message-input';
 export * from './message-template-send-input';

+ 37 - 0
Web/src/api-services/models/menu-status-input.ts

@@ -0,0 +1,37 @@
+/* tslint:disable */
+/* eslint-disable */
+/**
+ * Admin.NET 通用权限开发平台
+ * 让 .NET 开发更简单、更通用、更流行。整合最新技术,模块插件式开发,前后端分离,开箱即用。<br/><u><b><font color='FF0000'> 👮不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!</font></b></u>
+ *
+ * OpenAPI spec version: 1.0.0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+
+import { StatusEnum } from './status-enum';
+ /**
+ * 
+ *
+ * @export
+ * @interface MenuStatusInput
+ */
+export interface MenuStatusInput {
+
+    /**
+     * 主键Id
+     *
+     * @type {number}
+     * @memberof MenuStatusInput
+     */
+    id: number;
+
+    /**
+     * @type {StatusEnum}
+     * @memberof MenuStatusInput
+     */
+    status?: StatusEnum;
+}

+ 36 - 14
Web/src/views/system/menu/index.vue

@@ -4,29 +4,34 @@
 			<el-form :model="state.queryParams" ref="queryForm" :inline="true">
 				<el-form-item label="租户" v-if="userStore.userInfos.accountType == 999">
 					<el-select v-model="state.queryParams.tenantId" placeholder="租户" style="width: 100%">
-						<el-option :value="item.value" :label="`${item.label} (${item.host})`" v-for="(item, index) in state.tenantList" :key="index" />
+						<el-option :value="item.value" :label="`${item.label} (${item.host})`"
+							v-for="(item, index) in state.tenantList" :key="index" />
 					</el-select>
 				</el-form-item>
 				<el-form-item label="菜单名称">
 					<el-input v-model="state.queryParams.title" placeholder="菜单名称" clearable />
 				</el-form-item>
 				<el-form-item label="类型">
-          <g-sys-dict v-model="state.queryParams.type" code="MenuTypeEnum" render-as="select" placeholder="类型" clearable />
+					<g-sys-dict v-model="state.queryParams.type" code="MenuTypeEnum" render-as="select" placeholder="类型"
+						clearable />
 				</el-form-item>
 				<el-form-item>
 					<el-button-group>
-						<el-button type="primary" icon="ele-Search" @click="handleQuery" v-auth="'sysMenu:list'"> 查询 </el-button>
+						<el-button type="primary" icon="ele-Search" @click="handleQuery" v-auth="'sysMenu:list'"> 查询
+						</el-button>
 						<el-button icon="ele-Refresh" @click="resetQuery"> 重置 </el-button>
 					</el-button-group>
 				</el-form-item>
 				<el-form-item>
-					<el-button type="primary" icon="ele-Plus" @click="openAddMenu" v-auth="'sysMenu:add'"> 新增 </el-button>
+					<el-button type="primary" icon="ele-Plus" @click="openAddMenu" v-auth="'sysMenu:add'"> 新增
+					</el-button>
 				</el-form-item>
 			</el-form>
 		</el-card>
 
 		<el-card class="full-table" shadow="hover" style="margin-top: 5px">
-			<el-table :data="state.menuData" v-loading="state.loading" row-key="id" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" border>
+			<el-table :data="state.menuData" v-loading="state.loading" row-key="id"
+				:tree-props="{ children: 'children', hasChildren: 'hasChildren' }" border>
 				<el-table-column label="菜单名称" header-align="center" show-overflow-tooltip>
 					<template #default="scope">
 						<SvgIcon :name="scope.row.icon" />
@@ -35,7 +40,7 @@
 				</el-table-column>
 				<el-table-column label="类型" width="70" align="center" show-overflow-tooltip>
 					<template #default="scope">
-            <g-sys-dict v-model="scope.row.type" code="MenuTypeEnum" />
+						<g-sys-dict v-model="scope.row.type" code="MenuTypeEnum" />
 					</template>
 				</el-table-column>
 				<el-table-column prop="path" label="路由路径" header-align="center" show-overflow-tooltip />
@@ -44,7 +49,8 @@
 				<el-table-column prop="orderNo" label="排序" width="70" align="center" show-overflow-tooltip />
 				<el-table-column label="状态" width="80" align="center" show-overflow-tooltip>
 					<template #default="scope">
-            <g-sys-dict v-model="scope.row.status" code="StatusEnum" />
+						<el-switch v-model="scope.row.status" :active-value="1" :inactive-value="2" size="small"
+							@change="changeStatus(scope.row)" v-auth="'sysUser:setStatus'" />
 					</template>
 				</el-table-column>
 				<el-table-column label="修改记录" width="100" align="center" show-overflow-tooltip>
@@ -54,15 +60,19 @@
 				</el-table-column>
 				<el-table-column label="操作" width="210" fixed="right" align="center" show-overflow-tooltip>
 					<template #default="scope">
-						<el-button icon="ele-Edit" text type="primary" @click="openEditMenu(scope.row)" v-auth="'sysMenu:update'"> 编辑 </el-button>
-						<el-button icon="ele-Delete" text type="danger" @click="delMenu(scope.row)" v-auth="'sysMenu:delete'"> 删除 </el-button>
-						<el-button icon="ele-CopyDocument" text type="primary" @click="openCopyMenu(scope.row)" v-auth="'sysMenu:add'"> 复制 </el-button>
+						<el-button icon="ele-Edit" text type="primary" @click="openEditMenu(scope.row)"
+							v-auth="'sysMenu:update'"> 编辑 </el-button>
+						<el-button icon="ele-Delete" text type="danger" @click="delMenu(scope.row)"
+							v-auth="'sysMenu:delete'"> 删除 </el-button>
+						<el-button icon="ele-CopyDocument" text type="primary" @click="openCopyMenu(scope.row)"
+							v-auth="'sysMenu:add'"> 复制 </el-button>
 					</template>
 				</el-table-column>
 			</el-table>
 		</el-card>
 
-		<EditMenu ref="editMenuRef" :title="state.editMenuTitle" :menuData="state.allMenuData" @handleQuery="handleQuery" />
+		<EditMenu ref="editMenuRef" :title="state.editMenuTitle" :menuData="state.allMenuData"
+			@handleQuery="handleQuery" />
 	</div>
 </template>
 
@@ -73,9 +83,9 @@ import EditMenu from '/@/views/system/menu/component/editMenu.vue';
 import ModifyRecord from '/@/components/table/modifyRecord.vue';
 
 import { getAPI } from '/@/utils/axios-utils';
-import {SysMenuApi, SysTenantApi} from '/@/api-services/api';
+import { SysMenuApi, SysTenantApi } from '/@/api-services/api';
 import { SysMenu, UpdateMenuInput } from '/@/api-services/models';
-import {useUserInfo} from "/@/stores/userInfo";
+import { useUserInfo } from "/@/stores/userInfo";
 
 const userStore = useUserInfo();
 const editMenuRef = ref<InstanceType<typeof EditMenu>>();
@@ -159,6 +169,18 @@ const delMenu = (row: any) => {
 			handleQuery();
 			ElMessage.success('删除成功');
 		})
-		.catch(() => {});
+		.catch(() => { });
+};
+
+// 修改状态
+const changeStatus = async (row: any) => {
+	await getAPI(SysMenuApi)
+		.apiSysMenuSetStatusPost({ id: row.id, status: row.status })
+		.then(() => {
+			ElMessage.success('菜单状态设置成功');
+		})
+		.catch(() => {
+			row.status = row.status == 1 ? 2 : 1;
+		});
 };
 </script>