소스 검색

feat:应用授权增加设备管理

Zhenghanjv 2 달 전
부모
커밋
2b8d083bcc

+ 2 - 2
admin.ui.plus-master/.env.development

@@ -4,8 +4,8 @@ ENV = 'development'
 # 本地环境接口地址
 # VITE_API_URL = 'http://ipos.biz:8070'
 #  VITE_API_URL = 'http://192.168.0.202:8003'
-VITE_API_URL = 'http://localhost:8003'
-# VITE_API_URL = 'http://dev.hsfuel.com:8070'
+# VITE_API_URL = 'http://localhost:8003'
+VITE_API_URL = 'http://dev.hsfuel.com:8070'
 # VITE_API_URL = 'http://47.101.220.106:8070'
 # VITE_API_URL = 'http://ipos.biz:8070'
 

+ 2 - 2
admin.ui.plus-master/.env.production

@@ -10,7 +10,7 @@ VITE_PUBLIC_PATH = '/'
 # 线上环境接口地址
 # VITE_API_URL = 'http://ipos.biz:8070'
 # VITE_API_URL = 'http://localhost:8000'
-VITE_API_URL = 'http://localhost:8003'
-# VITE_API_URL = 'http://dev.hsfuel.com:8070'
+# VITE_API_URL = 'http://localhost:8003'
+VITE_API_URL = 'http://dev.hsfuel.com:8070'
 # VITE_API_URL = 'http://47.101.220.106:8070'
 # VITE_API_URL = 'http://ipos.biz:8070'

+ 800 - 740
admin.ui.plus-master/src/api/admin/Permission.ts

@@ -1,740 +1,800 @@
-/* eslint-disable */
-/* tslint:disable */
-/*
- * ---------------------------------------------------------------
- * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API        ##
- * ##                                                           ##
- * ## AUTHOR: acacode                                           ##
- * ## SOURCE: https://github.com/acacode/swagger-typescript-api ##
- * ---------------------------------------------------------------
- */
-
-import { AxiosResponse } from 'axios'
-import {
-  PermissionAddApiInput,
-  PermissionAddDotInput,
-  PermissionAddGroupInput,
-  PermissionAddMenuInput,
-  PermissionAssignInput,
-  PermissionSaveTenantPermissionsInput,
-  PermissionUpdateApiInput,
-  PermissionUpdateDotInput,
-  PermissionUpdateGroupInput,
-  PermissionUpdateMenuInput,
-  ResultOutputIEnumerableObject,
-  ResultOutputInt64,
-  ResultOutputListInt64,
-  ResultOutputListPermissionListOutput,
-  ResultOutputPermissionGetApiOutput,
-  ResultOutputPermissionGetDotOutput,
-  ResultOutputPermissionGetGroupOutput,
-  ResultOutputPermissionGetMenuOutput,
-  oauthPermissionDto,
-  OauthApplyDto,
-  OauthViewDto,
-  OauthRoleDto
-} from './data-contracts'
-import { ContentType, HttpClient, RequestParams } from './http-client'
-
-export class PermissionApi<SecurityDataType = unknown> extends HttpClient<SecurityDataType> {
-  /**
-   * No description
-   *
-   * @tags permission
-   * @name GetGroup
-   * @summary 查询分组
-   * @request GET:/api/admin/permission/get-group
-   * @secure
-   */
-  getGroup = (
-    query?: {
-      /** @format int64 */
-      id?: number
-    },
-    params: RequestParams = {}
-  ) =>
-    this.request<ResultOutputPermissionGetGroupOutput, any>({
-      path: `/api/admin/permission/get-group`,
-      method: 'GET',
-      query: query,
-      secure: true,
-      format: 'json',
-      ...params,
-    })
-  /**
-   * No description
-   *
-   * @tags permission
-   * @name GetMenu
-   * @summary 查询菜单
-   * @request GET:/api/admin/permission/get-menu
-   * @secure
-   */
-  getMenu = (
-    query?: {
-      /** @format int64 */
-      id?: number
-    },
-    params: RequestParams = {}
-  ) =>
-    this.request<ResultOutputPermissionGetMenuOutput, any>({
-      path: `/api/admin/permission/get-menu`,
-      method: 'GET',
-      query: query,
-      secure: true,
-      format: 'json',
-      ...params,
-    })
-  /**
-   * No description
-   *
-   * @tags permission
-   * @name GetApi
-   * @summary 查询接口
-   * @request GET:/api/admin/permission/get-api
-   * @secure
-   */
-  getApi = (
-    query?: {
-      /** @format int64 */
-      id?: number
-    },
-    params: RequestParams = {}
-  ) =>
-    this.request<ResultOutputPermissionGetApiOutput, any>({
-      path: `/api/admin/permission/get-api`,
-      method: 'GET',
-      query: query,
-      secure: true,
-      format: 'json',
-      ...params,
-    })
-  /**
-   * No description
-   *
-   * @tags permission
-   * @name GetDot
-   * @summary 查询权限点
-   * @request GET:/api/admin/permission/get-dot
-   * @secure
-   */
-  getDot = (
-    query?: {
-      /** @format int64 */
-      id?: number
-    },
-    params: RequestParams = {}
-  ) =>
-    this.request<ResultOutputPermissionGetDotOutput, any>({
-      path: `/api/admin/permission/get-dot`,
-      method: 'GET',
-      query: query,
-      secure: true,
-      format: 'json',
-      ...params,
-    })
-  /**
-   * No description
-   *
-   * @tags permission
-   * @name GetList
-   * @summary 查询权限列表
-   * @request GET:/api/admin/permission/get-list
-   * @secure
-   */
-  getList = (
-    query?: {
-      key?: string
-      /** @format date-time */
-      start?: string
-      /** @format date-time */
-      end?: string
-    },
-    params: RequestParams = {}
-  ) =>
-    this.request<ResultOutputListPermissionListOutput, any>({
-      path: `/api/admin/permission/get-list`,
-      method: 'GET',
-      query: query,
-      secure: true,
-      format: 'json',
-      ...params,
-    })
-  /**
-   * No description
-   *
-   * @tags permission
-   * @name GetPermissionList
-   * @summary 查询授权权限列表
-   * @request GET:/api/admin/permission/get-permission-list
-   * @secure
-   */
-  getPermissionList = (params: RequestParams = {}) =>
-    this.request<ResultOutputIEnumerableObject, any>({
-      path: `/api/admin/permission/get-permission-list`,
-      method: 'GET',
-      secure: true,
-      format: 'json',
-      ...params,
-    })
-  /**
-   * No description
-   *
-   * @tags permission
-   * @name GetRolePermissionList
-   * @summary 查询角色权限列表
-   * @request GET:/api/admin/permission/get-role-permission-list
-   * @secure
-   */
-  getRolePermissionList = (
-    query?: {
-      /**
-       * @format int64
-       * @default 0
-       */
-      roleId?: number
-    },
-    params: RequestParams = {}
-  ) =>
-    this.request<ResultOutputListInt64, any>({
-      path: `/api/admin/permission/get-role-permission-list`,
-      method: 'GET',
-      query: query,
-      secure: true,
-      format: 'json',
-      ...params,
-    })
-  /**
-   * No description
-   *
-   * @tags permission
-   * @name GetTenantPermissionList
-   * @summary 查询租户权限列表
-   * @request GET:/api/admin/permission/get-tenant-permission-list
-   * @deprecated
-   * @secure
-   */
-  getTenantPermissionList = (
-    query?: {
-      /** @format int64 */
-      tenantId?: number
-    },
-    params: RequestParams = {}
-  ) =>
-    this.request<ResultOutputListInt64, any>({
-      path: `/api/admin/permission/get-tenant-permission-list`,
-      method: 'GET',
-      query: query,
-      secure: true,
-      format: 'json',
-      ...params,
-    })
-  /**
-   * No description
-   *
-   * @tags permission
-   * @name AddGroup
-   * @summary 新增分组
-   * @request POST:/api/admin/permission/add-group
-   * @secure
-   */
-  addGroup = (data: PermissionAddGroupInput, params: RequestParams = {}) =>
-    this.request<ResultOutputInt64, any>({
-      path: `/api/admin/permission/add-group`,
-      method: 'POST',
-      body: data,
-      secure: true,
-      type: ContentType.Json,
-      format: 'json',
-      ...params,
-    })
-  /**
-   * No description
-   *
-   * @tags permission
-   * @name AddMenu
-   * @summary 新增菜单
-   * @request POST:/api/admin/permission/add-menu
-   * @secure
-   */
-  addMenu = (data: PermissionAddMenuInput, params: RequestParams = {}) =>
-    this.request<ResultOutputInt64, any>({
-      path: `/api/admin/permission/add-menu`,
-      method: 'POST',
-      body: data,
-      secure: true,
-      type: ContentType.Json,
-      format: 'json',
-      ...params,
-    })
-  /**
-   * No description
-   *
-   * @tags permission
-   * @name AddApi
-   * @summary 新增接口
-   * @request POST:/api/admin/permission/add-api
-   * @secure
-   */
-  addApi = (data: PermissionAddApiInput, params: RequestParams = {}) =>
-    this.request<ResultOutputInt64, any>({
-      path: `/api/admin/permission/add-api`,
-      method: 'POST',
-      body: data,
-      secure: true,
-      type: ContentType.Json,
-      format: 'json',
-      ...params,
-    })
-  /**
-   * No description
-   *
-   * @tags permission
-   * @name AddDot
-   * @summary 新增权限点
-   * @request POST:/api/admin/permission/add-dot
-   * @secure
-   */
-  addDot = (data: PermissionAddDotInput, params: RequestParams = {}) =>
-    this.request<ResultOutputInt64, any>({
-      path: `/api/admin/permission/add-dot`,
-      method: 'POST',
-      body: data,
-      secure: true,
-      type: ContentType.Json,
-      format: 'json',
-      ...params,
-    })
-  /**
-   * No description
-   *
-   * @tags permission
-   * @name UpdateGroup
-   * @summary 修改分组
-   * @request PUT:/api/admin/permission/update-group
-   * @secure
-   */
-  updateGroup = (data: PermissionUpdateGroupInput, params: RequestParams = {}) =>
-    this.request<AxiosResponse, any>({
-      path: `/api/admin/permission/update-group`,
-      method: 'PUT',
-      body: data,
-      secure: true,
-      type: ContentType.Json,
-      ...params,
-    })
-  /**
-   * No description
-   *
-   * @tags permission
-   * @name UpdateMenu
-   * @summary 修改菜单
-   * @request PUT:/api/admin/permission/update-menu
-   * @secure
-   */
-  updateMenu = (data: PermissionUpdateMenuInput, params: RequestParams = {}) =>
-    this.request<AxiosResponse, any>({
-      path: `/api/admin/permission/update-menu`,
-      method: 'PUT',
-      body: data,
-      secure: true,
-      type: ContentType.Json,
-      ...params,
-    })
-  /**
-   * No description
-   *
-   * @tags permission
-   * @name UpdateApi
-   * @summary 修改接口
-   * @request PUT:/api/admin/permission/update-api
-   * @secure
-   */
-  updateApi = (data: PermissionUpdateApiInput, params: RequestParams = {}) =>
-    this.request<AxiosResponse, any>({
-      path: `/api/admin/permission/update-api`,
-      method: 'PUT',
-      body: data,
-      secure: true,
-      type: ContentType.Json,
-      ...params,
-    })
-  /**
-   * No description
-   *
-   * @tags permission
-   * @name UpdateDot
-   * @summary 修改权限点
-   * @request PUT:/api/admin/permission/update-dot
-   * @secure
-   */
-  updateDot = (data: PermissionUpdateDotInput, params: RequestParams = {}) =>
-    this.request<AxiosResponse, any>({
-      path: `/api/admin/permission/update-dot`,
-      method: 'PUT',
-      body: data,
-      secure: true,
-      type: ContentType.Json,
-      ...params,
-    })
-  /**
-   * No description
-   *
-   * @tags permission
-   * @name Delete
-   * @summary 彻底删除
-   * @request DELETE:/api/admin/permission/delete
-   * @secure
-   */
-  delete = (
-    query?: {
-      /** @format int64 */
-      id?: number
-    },
-    params: RequestParams = {}
-  ) =>
-    this.request<AxiosResponse, any>({
-      path: `/api/admin/permission/delete`,
-      method: 'DELETE',
-      query: query,
-      secure: true,
-      ...params,
-    })
-  /**
-   * No description
-   *
-   * @tags permission
-   * @name SoftDelete
-   * @summary 删除
-   * @request DELETE:/api/admin/permission/soft-delete
-   * @secure
-   */
-  softDelete = (
-    query?: {
-      /** @format int64 */
-      id?: number
-    },
-    params: RequestParams = {}
-  ) =>
-    this.request<AxiosResponse, any>({
-      path: `/api/admin/permission/soft-delete`,
-      method: 'DELETE',
-      query: query,
-      secure: true,
-      ...params,
-    })
-  /**
-   * No description
-   *
-   * @tags permission
-   * @name Assign
-   * @summary 保存角色权限
-   * @request POST:/api/admin/permission/assign
-   * @secure
-   */
-  assign = (data: PermissionAssignInput, params: RequestParams = {}) =>
-    this.request<AxiosResponse, any>({
-      path: `/api/admin/permission/assign`,
-      method: 'POST',
-      body: data,
-      secure: true,
-      type: ContentType.Json,
-      ...params,
-    })
-  /**
-   * No description
-   *
-   * @tags permission
-   * @name SaveTenantPermissions
-   * @summary 保存租户权限
-   * @request POST:/api/admin/permission/save-tenant-permissions
-   * @deprecated
-   * @secure
-   */
-  saveTenantPermissions = (data: PermissionSaveTenantPermissionsInput, params: RequestParams = {}) =>
-    this.request<AxiosResponse, any>({
-      path: `/api/admin/permission/save-tenant-permissions`,
-      method: 'POST',
-      body: data,
-      secure: true,
-      type: ContentType.Json,
-      ...params,
-    })
-  /**
-  * No description
-  *
-  * @tags permission
-  * @name addAppPermission
-  * @summary 应用权限-新增分组、菜单、权限点
-  * @request POST:/api/app/permission/upload-permission
-  * @secure
-  */
-  addAppPermission = (data: oauthPermissionDto, params: RequestParams = {}) =>
-    this.request<AxiosResponse, any>({
-      path: `/api/app/permission/upload-permission`,
-      method: 'POST',
-      body: data,
-      secure: true,
-      type: ContentType.Json,
-      ...params,
-    })
-  /**
-  * No description
-  *
-  * @tags data
-  * @name getPermissionInfo
-  * @summary  获取应用权限信息
-  * @request GET:/api/app/permission/get-permission
-  * @secure
-  */
-  getPermissionInfo = (query:any ,params: RequestParams = {}) : any  =>
-    this.request<AxiosResponse,any>({
-      path:'/api/app/permission/get-permission',
-      method: 'GET',
-      secure: true,
-      type: ContentType.Json,
-      format: 'json',
-      query:query,
-      ...params
-    })
-  /**
-  * No description
-  *
-  * @tags permission
-  * @name permissionDelete
-  * @summary 彻底删除应用权限
-  * @request POST:/api/app/permission/delete-permission
-  * @secure
-  */
-  permissionDelete = ( query:oauthPermissionDto,params: RequestParams = {}):any =>
-    this.request<AxiosResponse, any>({
-      path: `/api/app/permission/delete-permission`,
-      method: 'POST',
-      body: query,
-      secure: true,
-      type: ContentType.Json,
-      ...params,
-    })
-  /**
-  * No description
-  *
-  * @tags data
-  * @name getApplyInfo
-  * @summary  获取应用信息
-  * @request GET:/api/app/apply/get-apply
-  * @secure
-  */
-  getApplyInfo = (query:any ,params: RequestParams = {}) : any  =>
-    this.request<AxiosResponse,any>({
-      path:'/api/app/apply/get-apply',
-      method: 'GET',
-      secure: true,
-      type: ContentType.Json,
-      format: 'json',
-      query:query,
-      ...params
-    })
-   /**
-   * No description
-   *
-   * @tags apply
-   * @name addApply
-   * @summary 新增、编辑应用
-   * @request POST:/api/app/permission/upload-permission
-   * @secure
-   */
-  addApply = (data: OauthApplyDto, params: RequestParams = {}) =>
-    this.request<AxiosResponse, any>({
-      path: `/api/app/apply/upload-apply`,
-      method: 'POST',
-      body: data,
-      secure: true,
-      type: ContentType.Json,
-      ...params,
-    })
- /**
-  * No description
-  *
-  * @tags apply
-  * @name applyDelete
-  * @summary 删除应用
-  * @request POST:/api/app/permission/delete-permission
-  * @secure
-  */
-  applyDelete = ( query:any,params: RequestParams = {}):any =>
-    this.request<AxiosResponse, any>({
-      path: `/api/app/apply/delete-apply`,
-      method: 'POST',
-      body: query,
-      secure: true,
-      type: ContentType.Json,
-      ...params,
-    })
-  /**
-  * No description
-  *
-  * @tags data
-  * @name getViewInfo
-  * @summary  获取视图信息
-  * @request GET:/api/app/view/get-permission
-  * @secure
-  */
-  getViewInfo = (query:any ,params: RequestParams = {}) : any  =>
-    this.request<AxiosResponse,any>({
-      path:'/api/app/view/get-permission',
-      method: 'GET',
-      secure: true,
-      type: ContentType.Json,
-      format: 'json',
-      query:query,
-      ...params
-    })
-  /**
-  * No description
-  *
-  * @tags view
-  * @name addView
-  * @summary 新增、编辑视图
-  * @request POST:/api/app/view/upload-view
-  * @secure
-  */
-  addView = (data: OauthViewDto, params: RequestParams = {}) =>
-    this.request<AxiosResponse, any>({
-      path: `/api/app/view/upload-view`,
-      method: 'POST',
-      body: data,
-      secure: true,
-      type: ContentType.Json,
-      ...params,
-    })
-  /**
-  * No description
-  *
-  * @tags view
-  * @name viewDelete
-  * @summary 删除视图
-  * @request POST:/api/app/view/delete-permission
-  * @secure
-  */
-  viewDelete = ( query:any,params: RequestParams = {}):any =>
-    this.request<AxiosResponse, any>({
-      path: `/api/app/view/delete-permission`,
-      method: 'POST',
-      body: query,
-      secure: true,
-      type: ContentType.Json,
-      ...params,
-    })
-  /**
-  * No description
-  *
-  * @tags data
-  * @name getRoleInfo
-  * @summary  获取角色信息
-  * @request GET:/api/app/role/get-role
-  * @secure
-  */
-  getRoleInfo = (query:any ,params: RequestParams = {}) : any  =>
-    this.request<AxiosResponse,any>({
-      path:'/api/app/role/get-role',
-      method: 'GET',
-      secure: true,
-      type: ContentType.Json,
-      format: 'json',
-      query:query,
-      ...params
-    })
-  /**
-  * No description
-  *
-  * @tags role
-  * @name addRole
-  * @summary 新增、编辑角色
-  * @request POST:/api/app/role/upload-role
-  * @secure
-  */
-  addRole = (data: OauthRoleDto, params: RequestParams = {}) =>
-    this.request<AxiosResponse, any>({
-      path: `/api/app/role/upload-role`,
-      method: 'POST',
-      body: data,
-      secure: true,
-      type: ContentType.Json,
-      ...params,
-    })
-  /**
-  * No description
-  *
-  * @tags role
-  * @name roleDelete
-  * @summary 删除角色
-  * @request POST:/api/app/role/delete-role
-  * @secure
-  */
-  roleDelete = ( query:any,params: RequestParams = {}):any =>
-    this.request<AxiosResponse, any>({
-      path: `/api/app/role/delete-role`,
-      method: 'POST',
-      body: query,
-      secure: true,
-      type: ContentType.Json,
-      ...params,
-  })
-  /**
-  * No description
-  *
-  * @tags role
-  * @name roleMenuAssign
-  * @summary 角色菜单权限
-  * @request POST:/api/app/role/assign
-  * @secure
-  */
-  roleMenuAssign = (data: any,query:any, params: RequestParams = {}) =>
-    this.request<AxiosResponse, any>({
-      path: `/api/app/role/assign`,
-      method: 'POST',
-      body: data,
-      query:query,
-      secure: true,
-      type: ContentType.Json,
-      ...params,
-    })
-  /**
-  * No description
-  *
-  * @tags data
-  * @name getOperationInfo
-  * @summary  获取操作日志信息
-  * @request POST:/api/app/operation-record/get-page
-  * @secure
-  */
-  getOperationInfo = (query:any ,params: RequestParams = {}) : any  =>
-  this.request<AxiosResponse,any>({
-    path:'/api/app/operation-record/get-page',
-    method: 'POST',
-    secure: true,
-    type: ContentType.Json,
-    format: 'json',
-    body:query,
-    ...params
-  })
-  /**
-  * No description
-  *
-  * @tags data
-  * @name getMenuInfo
-  * @summary  获取角色应用权限菜单信息
-  * @request GET:/api/app/role/get-role
-  * @secure
-  */
-  getMenuInfo = (query:any ,params: RequestParams = {}) : any  =>
-    this.request<AxiosResponse,any>({
-      path:'/api/app/role/get-permission',
-      method: 'GET',
-      secure: true,
-      type: ContentType.Json,
-      format: 'json',
-      query:query,
-      ...params
-    })
-}
+/* eslint-disable */
+/* tslint:disable */
+/*
+ * ---------------------------------------------------------------
+ * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API        ##
+ * ##                                                           ##
+ * ## AUTHOR: acacode                                           ##
+ * ## SOURCE: https://github.com/acacode/swagger-typescript-api ##
+ * ---------------------------------------------------------------
+ */
+
+import { AxiosResponse } from 'axios'
+import {
+  PermissionAddApiInput,
+  PermissionAddDotInput,
+  PermissionAddGroupInput,
+  PermissionAddMenuInput,
+  PermissionAssignInput,
+  PermissionSaveTenantPermissionsInput,
+  PermissionUpdateApiInput,
+  PermissionUpdateDotInput,
+  PermissionUpdateGroupInput,
+  PermissionUpdateMenuInput,
+  ResultOutputIEnumerableObject,
+  ResultOutputInt64,
+  ResultOutputListInt64,
+  ResultOutputListPermissionListOutput,
+  ResultOutputPermissionGetApiOutput,
+  ResultOutputPermissionGetDotOutput,
+  ResultOutputPermissionGetGroupOutput,
+  ResultOutputPermissionGetMenuOutput,
+  oauthPermissionDto,
+  OauthApplyDto,
+  OauthViewDto,
+  OauthRoleDto
+} from './data-contracts'
+import { ContentType, HttpClient, RequestParams } from './http-client'
+
+export class PermissionApi<SecurityDataType = unknown> extends HttpClient<SecurityDataType> {
+  /**
+   * No description
+   *
+   * @tags permission
+   * @name GetGroup
+   * @summary 查询分组
+   * @request GET:/api/admin/permission/get-group
+   * @secure
+   */
+  getGroup = (
+    query?: {
+      /** @format int64 */
+      id?: number
+    },
+    params: RequestParams = {}
+  ) =>
+    this.request<ResultOutputPermissionGetGroupOutput, any>({
+      path: `/api/admin/permission/get-group`,
+      method: 'GET',
+      query: query,
+      secure: true,
+      format: 'json',
+      ...params,
+    })
+  /**
+   * No description
+   *
+   * @tags permission
+   * @name GetMenu
+   * @summary 查询菜单
+   * @request GET:/api/admin/permission/get-menu
+   * @secure
+   */
+  getMenu = (
+    query?: {
+      /** @format int64 */
+      id?: number
+    },
+    params: RequestParams = {}
+  ) =>
+    this.request<ResultOutputPermissionGetMenuOutput, any>({
+      path: `/api/admin/permission/get-menu`,
+      method: 'GET',
+      query: query,
+      secure: true,
+      format: 'json',
+      ...params,
+    })
+  /**
+   * No description
+   *
+   * @tags permission
+   * @name GetApi
+   * @summary 查询接口
+   * @request GET:/api/admin/permission/get-api
+   * @secure
+   */
+  getApi = (
+    query?: {
+      /** @format int64 */
+      id?: number
+    },
+    params: RequestParams = {}
+  ) =>
+    this.request<ResultOutputPermissionGetApiOutput, any>({
+      path: `/api/admin/permission/get-api`,
+      method: 'GET',
+      query: query,
+      secure: true,
+      format: 'json',
+      ...params,
+    })
+  /**
+   * No description
+   *
+   * @tags permission
+   * @name GetDot
+   * @summary 查询权限点
+   * @request GET:/api/admin/permission/get-dot
+   * @secure
+   */
+  getDot = (
+    query?: {
+      /** @format int64 */
+      id?: number
+    },
+    params: RequestParams = {}
+  ) =>
+    this.request<ResultOutputPermissionGetDotOutput, any>({
+      path: `/api/admin/permission/get-dot`,
+      method: 'GET',
+      query: query,
+      secure: true,
+      format: 'json',
+      ...params,
+    })
+  /**
+   * No description
+   *
+   * @tags permission
+   * @name GetList
+   * @summary 查询权限列表
+   * @request GET:/api/admin/permission/get-list
+   * @secure
+   */
+  getList = (
+    query?: {
+      key?: string
+      /** @format date-time */
+      start?: string
+      /** @format date-time */
+      end?: string
+    },
+    params: RequestParams = {}
+  ) =>
+    this.request<ResultOutputListPermissionListOutput, any>({
+      path: `/api/admin/permission/get-list`,
+      method: 'GET',
+      query: query,
+      secure: true,
+      format: 'json',
+      ...params,
+    })
+  /**
+   * No description
+   *
+   * @tags permission
+   * @name GetPermissionList
+   * @summary 查询授权权限列表
+   * @request GET:/api/admin/permission/get-permission-list
+   * @secure
+   */
+  getPermissionList = (params: RequestParams = {}) =>
+    this.request<ResultOutputIEnumerableObject, any>({
+      path: `/api/admin/permission/get-permission-list`,
+      method: 'GET',
+      secure: true,
+      format: 'json',
+      ...params,
+    })
+  /**
+   * No description
+   *
+   * @tags permission
+   * @name GetRolePermissionList
+   * @summary 查询角色权限列表
+   * @request GET:/api/admin/permission/get-role-permission-list
+   * @secure
+   */
+  getRolePermissionList = (
+    query?: {
+      /**
+       * @format int64
+       * @default 0
+       */
+      roleId?: number
+    },
+    params: RequestParams = {}
+  ) =>
+    this.request<ResultOutputListInt64, any>({
+      path: `/api/admin/permission/get-role-permission-list`,
+      method: 'GET',
+      query: query,
+      secure: true,
+      format: 'json',
+      ...params,
+    })
+  /**
+   * No description
+   *
+   * @tags permission
+   * @name GetTenantPermissionList
+   * @summary 查询租户权限列表
+   * @request GET:/api/admin/permission/get-tenant-permission-list
+   * @deprecated
+   * @secure
+   */
+  getTenantPermissionList = (
+    query?: {
+      /** @format int64 */
+      tenantId?: number
+    },
+    params: RequestParams = {}
+  ) =>
+    this.request<ResultOutputListInt64, any>({
+      path: `/api/admin/permission/get-tenant-permission-list`,
+      method: 'GET',
+      query: query,
+      secure: true,
+      format: 'json',
+      ...params,
+    })
+  /**
+   * No description
+   *
+   * @tags permission
+   * @name AddGroup
+   * @summary 新增分组
+   * @request POST:/api/admin/permission/add-group
+   * @secure
+   */
+  addGroup = (data: PermissionAddGroupInput, params: RequestParams = {}) =>
+    this.request<ResultOutputInt64, any>({
+      path: `/api/admin/permission/add-group`,
+      method: 'POST',
+      body: data,
+      secure: true,
+      type: ContentType.Json,
+      format: 'json',
+      ...params,
+    })
+  /**
+   * No description
+   *
+   * @tags permission
+   * @name AddMenu
+   * @summary 新增菜单
+   * @request POST:/api/admin/permission/add-menu
+   * @secure
+   */
+  addMenu = (data: PermissionAddMenuInput, params: RequestParams = {}) =>
+    this.request<ResultOutputInt64, any>({
+      path: `/api/admin/permission/add-menu`,
+      method: 'POST',
+      body: data,
+      secure: true,
+      type: ContentType.Json,
+      format: 'json',
+      ...params,
+    })
+  /**
+   * No description
+   *
+   * @tags permission
+   * @name AddApi
+   * @summary 新增接口
+   * @request POST:/api/admin/permission/add-api
+   * @secure
+   */
+  addApi = (data: PermissionAddApiInput, params: RequestParams = {}) =>
+    this.request<ResultOutputInt64, any>({
+      path: `/api/admin/permission/add-api`,
+      method: 'POST',
+      body: data,
+      secure: true,
+      type: ContentType.Json,
+      format: 'json',
+      ...params,
+    })
+  /**
+   * No description
+   *
+   * @tags permission
+   * @name AddDot
+   * @summary 新增权限点
+   * @request POST:/api/admin/permission/add-dot
+   * @secure
+   */
+  addDot = (data: PermissionAddDotInput, params: RequestParams = {}) =>
+    this.request<ResultOutputInt64, any>({
+      path: `/api/admin/permission/add-dot`,
+      method: 'POST',
+      body: data,
+      secure: true,
+      type: ContentType.Json,
+      format: 'json',
+      ...params,
+    })
+  /**
+   * No description
+   *
+   * @tags permission
+   * @name UpdateGroup
+   * @summary 修改分组
+   * @request PUT:/api/admin/permission/update-group
+   * @secure
+   */
+  updateGroup = (data: PermissionUpdateGroupInput, params: RequestParams = {}) =>
+    this.request<AxiosResponse, any>({
+      path: `/api/admin/permission/update-group`,
+      method: 'PUT',
+      body: data,
+      secure: true,
+      type: ContentType.Json,
+      ...params,
+    })
+  /**
+   * No description
+   *
+   * @tags permission
+   * @name UpdateMenu
+   * @summary 修改菜单
+   * @request PUT:/api/admin/permission/update-menu
+   * @secure
+   */
+  updateMenu = (data: PermissionUpdateMenuInput, params: RequestParams = {}) =>
+    this.request<AxiosResponse, any>({
+      path: `/api/admin/permission/update-menu`,
+      method: 'PUT',
+      body: data,
+      secure: true,
+      type: ContentType.Json,
+      ...params,
+    })
+  /**
+   * No description
+   *
+   * @tags permission
+   * @name UpdateApi
+   * @summary 修改接口
+   * @request PUT:/api/admin/permission/update-api
+   * @secure
+   */
+  updateApi = (data: PermissionUpdateApiInput, params: RequestParams = {}) =>
+    this.request<AxiosResponse, any>({
+      path: `/api/admin/permission/update-api`,
+      method: 'PUT',
+      body: data,
+      secure: true,
+      type: ContentType.Json,
+      ...params,
+    })
+  /**
+   * No description
+   *
+   * @tags permission
+   * @name UpdateDot
+   * @summary 修改权限点
+   * @request PUT:/api/admin/permission/update-dot
+   * @secure
+   */
+  updateDot = (data: PermissionUpdateDotInput, params: RequestParams = {}) =>
+    this.request<AxiosResponse, any>({
+      path: `/api/admin/permission/update-dot`,
+      method: 'PUT',
+      body: data,
+      secure: true,
+      type: ContentType.Json,
+      ...params,
+    })
+  /**
+   * No description
+   *
+   * @tags permission
+   * @name Delete
+   * @summary 彻底删除
+   * @request DELETE:/api/admin/permission/delete
+   * @secure
+   */
+  delete = (
+    query?: {
+      /** @format int64 */
+      id?: number
+    },
+    params: RequestParams = {}
+  ) =>
+    this.request<AxiosResponse, any>({
+      path: `/api/admin/permission/delete`,
+      method: 'DELETE',
+      query: query,
+      secure: true,
+      ...params,
+    })
+  /**
+   * No description
+   *
+   * @tags permission
+   * @name SoftDelete
+   * @summary 删除
+   * @request DELETE:/api/admin/permission/soft-delete
+   * @secure
+   */
+  softDelete = (
+    query?: {
+      /** @format int64 */
+      id?: number
+    },
+    params: RequestParams = {}
+  ) =>
+    this.request<AxiosResponse, any>({
+      path: `/api/admin/permission/soft-delete`,
+      method: 'DELETE',
+      query: query,
+      secure: true,
+      ...params,
+    })
+  /**
+   * No description
+   *
+   * @tags permission
+   * @name Assign
+   * @summary 保存角色权限
+   * @request POST:/api/admin/permission/assign
+   * @secure
+   */
+  assign = (data: PermissionAssignInput, params: RequestParams = {}) =>
+    this.request<AxiosResponse, any>({
+      path: `/api/admin/permission/assign`,
+      method: 'POST',
+      body: data,
+      secure: true,
+      type: ContentType.Json,
+      ...params,
+    })
+  /**
+   * No description
+   *
+   * @tags permission
+   * @name SaveTenantPermissions
+   * @summary 保存租户权限
+   * @request POST:/api/admin/permission/save-tenant-permissions
+   * @deprecated
+   * @secure
+   */
+  saveTenantPermissions = (data: PermissionSaveTenantPermissionsInput, params: RequestParams = {}) =>
+    this.request<AxiosResponse, any>({
+      path: `/api/admin/permission/save-tenant-permissions`,
+      method: 'POST',
+      body: data,
+      secure: true,
+      type: ContentType.Json,
+      ...params,
+    })
+  /**
+  * No description
+  *
+  * @tags permission
+  * @name addAppPermission
+  * @summary 应用权限-新增分组、菜单、权限点
+  * @request POST:/api/app/permission/upload-permission
+  * @secure
+  */
+  addAppPermission = (data: oauthPermissionDto, params: RequestParams = {}) =>
+    this.request<AxiosResponse, any>({
+      path: `/api/app/permission/upload-permission`,
+      method: 'POST',
+      body: data,
+      secure: true,
+      type: ContentType.Json,
+      ...params,
+    })
+  /**
+  * No description
+  *
+  * @tags data
+  * @name getPermissionInfo
+  * @summary  获取应用权限信息
+  * @request GET:/api/app/permission/get-permission
+  * @secure
+  */
+  getPermissionInfo = (query: any, params: RequestParams = {}): any =>
+    this.request<AxiosResponse, any>({
+      path: '/api/app/permission/get-permission',
+      method: 'GET',
+      secure: true,
+      type: ContentType.Json,
+      format: 'json',
+      query: query,
+      ...params
+    })
+  /**
+  * No description
+  *
+  * @tags permission
+  * @name permissionDelete
+  * @summary 彻底删除应用权限
+  * @request POST:/api/app/permission/delete-permission
+  * @secure
+  */
+  permissionDelete = (query: oauthPermissionDto, params: RequestParams = {}): any =>
+    this.request<AxiosResponse, any>({
+      path: `/api/app/permission/delete-permission`,
+      method: 'POST',
+      body: query,
+      secure: true,
+      type: ContentType.Json,
+      ...params,
+    })
+  /**
+  * No description
+  *
+  * @tags data
+  * @name getApplyInfo
+  * @summary  获取应用信息
+  * @request GET:/api/app/apply/get-apply
+  * @secure
+  */
+  getApplyInfo = (query: any, params: RequestParams = {}): any =>
+    this.request<AxiosResponse, any>({
+      path: '/api/app/apply/get-apply',
+      method: 'GET',
+      secure: true,
+      type: ContentType.Json,
+      format: 'json',
+      query: query,
+      ...params
+    })
+  /**
+  * No description
+  *
+  * @tags apply
+  * @name addApply
+  * @summary 新增、编辑应用
+  * @request POST:/api/app/permission/upload-permission
+  * @secure
+  */
+  addApply = (data: OauthApplyDto, params: RequestParams = {}) =>
+    this.request<AxiosResponse, any>({
+      path: `/api/app/apply/upload-apply`,
+      method: 'POST',
+      body: data,
+      secure: true,
+      type: ContentType.Json,
+      ...params,
+    })
+  /**
+   * No description
+   *
+   * @tags apply
+   * @name applyDelete
+   * @summary 删除应用
+   * @request POST:/api/app/permission/delete-permission
+   * @secure
+   */
+  applyDelete = (query: any, params: RequestParams = {}): any =>
+    this.request<AxiosResponse, any>({
+      path: `/api/app/apply/delete-apply`,
+      method: 'POST',
+      body: query,
+      secure: true,
+      type: ContentType.Json,
+      ...params,
+    })
+  /**
+  * No description
+  *
+  * @tags data
+  * @name getViewInfo
+  * @summary  获取视图信息
+  * @request GET:/api/app/view/get-permission
+  * @secure
+  */
+  getViewInfo = (query: any, params: RequestParams = {}): any =>
+    this.request<AxiosResponse, any>({
+      path: '/api/app/view/get-permission',
+      method: 'GET',
+      secure: true,
+      type: ContentType.Json,
+      format: 'json',
+      query: query,
+      ...params
+    })
+  /**
+  * No description
+  *
+  * @tags view
+  * @name addView
+  * @summary 新增、编辑视图
+  * @request POST:/api/app/view/upload-view
+  * @secure
+  */
+  addView = (data: OauthViewDto, params: RequestParams = {}) =>
+    this.request<AxiosResponse, any>({
+      path: `/api/app/view/upload-view`,
+      method: 'POST',
+      body: data,
+      secure: true,
+      type: ContentType.Json,
+      ...params,
+    })
+  /**
+  * No description
+  *
+  * @tags view
+  * @name viewDelete
+  * @summary 删除视图
+  * @request POST:/api/app/view/delete-permission
+  * @secure
+  */
+  viewDelete = (query: any, params: RequestParams = {}): any =>
+    this.request<AxiosResponse, any>({
+      path: `/api/app/view/delete-permission`,
+      method: 'POST',
+      body: query,
+      secure: true,
+      type: ContentType.Json,
+      ...params,
+    })
+  /**
+  * No description
+  *
+  * @tags data
+  * @name getRoleInfo
+  * @summary  获取角色信息
+  * @request GET:/api/app/role/get-role
+  * @secure
+  */
+  getRoleInfo = (query: any, params: RequestParams = {}): any =>
+    this.request<AxiosResponse, any>({
+      path: '/api/app/role/get-role',
+      method: 'GET',
+      secure: true,
+      type: ContentType.Json,
+      format: 'json',
+      query: query,
+      ...params
+    })
+  /**
+  * No description
+  *
+  * @tags role
+  * @name addRole
+  * @summary 新增、编辑角色
+  * @request POST:/api/app/role/upload-role
+  * @secure
+  */
+  addRole = (data: OauthRoleDto, params: RequestParams = {}) =>
+    this.request<AxiosResponse, any>({
+      path: `/api/app/role/upload-role`,
+      method: 'POST',
+      body: data,
+      secure: true,
+      type: ContentType.Json,
+      ...params,
+    })
+  /**
+  * No description
+  *
+  * @tags role
+  * @name roleDelete
+  * @summary 删除角色
+  * @request POST:/api/app/role/delete-role
+  * @secure
+  */
+  roleDelete = (query: any, params: RequestParams = {}): any =>
+    this.request<AxiosResponse, any>({
+      path: `/api/app/role/delete-role`,
+      method: 'POST',
+      body: query,
+      secure: true,
+      type: ContentType.Json,
+      ...params,
+    })
+  /**
+  * No description
+  *
+  * @tags role
+  * @name roleMenuAssign
+  * @summary 角色菜单权限
+  * @request POST:/api/app/role/assign
+  * @secure
+  */
+  roleMenuAssign = (data: any, query: any, params: RequestParams = {}) =>
+    this.request<AxiosResponse, any>({
+      path: `/api/app/role/assign`,
+      method: 'POST',
+      body: data,
+      query: query,
+      secure: true,
+      type: ContentType.Json,
+      ...params,
+    })
+  /**
+  * No description
+  *
+  * @tags data
+  * @name getOperationInfo
+  * @summary  获取操作日志信息
+  * @request POST:/api/app/operation-record/get-page
+  * @secure
+  */
+  getOperationInfo = (query: any, params: RequestParams = {}): any =>
+    this.request<AxiosResponse, any>({
+      path: '/api/app/operation-record/get-page',
+      method: 'POST',
+      secure: true,
+      type: ContentType.Json,
+      format: 'json',
+      body: query,
+      ...params
+    })
+  /**
+  * No description
+  *
+  * @tags data
+  * @name getMenuInfo
+  * @summary  获取角色应用权限菜单信息
+  * @request GET:/api/app/role/get-role
+  * @secure
+  */
+  getMenuInfo = (query: any, params: RequestParams = {}): any =>
+    this.request<AxiosResponse, any>({
+      path: '/api/app/role/get-permission',
+      method: 'GET',
+      secure: true,
+      type: ContentType.Json,
+      format: 'json',
+      query: query,
+      ...params
+    })
+
+
+  /**
+  * No description
+  *
+  * @tags
+  * @name GetList
+  * @summary 查询设备列表
+  * @request GET:'/api/app/equipment/get-list-page'
+  * @secure
+  */
+  getEquipmentList = (query: any, params: RequestParams = {}): any =>
+    this.request<AxiosResponse, any>({
+      path: '/api/app/equipment/get-list-page',
+      method: 'GET',
+      query: query,
+      secure: true,
+      format: 'json',
+      ...params
+    })
+
+    /**
+  * No description
+  *
+  * @tags
+  * @name GetList
+  * @summary 添加或修改设备
+  * @request POST:'/api/app/equipment/upload'
+  * @secure
+  */
+  uploadEquipment = (query: any, params: RequestParams = {}): any =>
+    this.request<AxiosResponse, any>({
+      path: '/api/app/equipment/upload',
+      method: 'POST',
+      secure: true,
+      type: ContentType.Json,
+      format: 'json',
+      body: query,
+      ...params
+    })
+
+    /**
+  * No description
+  *
+  * @tags
+  * @name GetList
+  * @summary 删除设备
+  * @request POST:'/api/app/equipment/delete'
+  * @secure
+  */
+  deleteEquipment = (query: any, params: RequestParams = {}): any =>
+    this.request<AxiosResponse, any>({
+      path: '/api/app/equipment/delete',
+      method: 'POST',
+      secure: true,
+      type: ContentType.Json,
+      format: 'json',
+      body: query,
+      ...params
+    })
+}

+ 83 - 36
admin.ui.plus-master/src/api/admin/data-contracts.ts

@@ -4411,13 +4411,13 @@ export interface oauthPermissionDto {
   /** 图标 */
   icon?: string | null
   /** 排序 */
-  sort?: string|null
+  sort?: string | null
   /** 应用id */
   appID?: number
   /** 视图id */
-  viewId?: number|null
-   /** 视图地址 */
-  viewPath?: string|null
+  viewId?: number | null
+  /** 视图地址 */
+  viewPath?: string | null
   /** 说明 */
   // description?: string | null
 }
@@ -4452,20 +4452,20 @@ export interface OauthPermission {
   /** 图标 */
   icon?: string | null
   /** 排序 */
-  sort?: string|null
+  sort?: string | null
   /** 应用id */
   appID?: number
   /** 视图id */
-  viewId?: string|null
+  viewId?: string | null
   /** 视图地址 */
-  viewPath?: string|null
+  viewPath?: string | null
   /** 展开 */
   opened?: boolean
   /** 说明 */
   // description?: string | null
 }
 /** 应用权限信息输出 */
-export interface ResultOutputListOauthPermission{
+export interface ResultOutputListOauthPermission {
   /** 是否成功标记 */
   success?: boolean
   /** 编码 */
@@ -4476,7 +4476,7 @@ export interface ResultOutputListOauthPermission{
   data?: OauthPermission[] | null
 }
 /** 应用请求参数 */
-export interface OauthApplyDto{
+export interface OauthApplyDto {
   id: number
   /** 应用id */
   appid?: string
@@ -4485,12 +4485,12 @@ export interface OauthApplyDto{
   /** 编码 */
   code?: string | null
   /** 排序 */
-  sort?: string|null
+  sort?: string | null
   /** 最小可用版本 */
-  minVersion?: string|null
+  minVersion?: string | null
 }
 /** 应用 */
-export interface OauthApply{
+export interface OauthApply {
   /** 主键id */
   id: number
   /** 创建者id */
@@ -4518,10 +4518,10 @@ export interface OauthApply{
   /** 编码 */
   code?: string | null
   /** 排序 */
-  sort?: string|null
+  sort?: string | null
 }
 /** 应用信息输出 */
-export interface ResultOutputListOauthApply{
+export interface ResultOutputListOauthApply {
   /** 是否成功标记 */
   success?: boolean
   /** 编码 */
@@ -4532,7 +4532,7 @@ export interface ResultOutputListOauthApply{
   data?: OauthApply[] | null
 }
 /** 应用视图 */
-export interface OauthView{
+export interface OauthView {
   /** 主键id */
   id: number
   /** 创建者id */
@@ -4558,12 +4558,12 @@ export interface OauthView{
   /** 视图地址 */
   path?: string | null
   /** 排序 */
-  sort?: string|null
+  sort?: string | null
   /** 应用id */
   appID?: number
 }
 /** 应用视图信息输出 */
-export interface ResultOutputListOauthView{
+export interface ResultOutputListOauthView {
   /** 是否成功标记 */
   success?: boolean
   /** 编码 */
@@ -4574,7 +4574,7 @@ export interface ResultOutputListOauthView{
   data?: OauthView[] | null
 }
 /** 视图请求参数 */
-export interface OauthViewDto{
+export interface OauthViewDto {
   id: number
   /** 上一级分组 */
   parentId?: string | null
@@ -4583,13 +4583,13 @@ export interface OauthViewDto{
   /** 视图地址 */
   path?: string | null
   /** 排序 */
-  sort?: string|null
+  sort?: string | null
   /** 应用id */
   appID?: string
 }
 /** 角色请求参数 */
-export interface OauthRoleDto{
-  id:number,
+export interface OauthRoleDto {
+  id: number,
   /** 上一级分组 */
   parentId?: string | null
   /** 角色名称 */
@@ -4597,14 +4597,14 @@ export interface OauthRoleDto{
   /** 编码 */
   code?: string | null
   /** 类型 */
-  type?:RoleType
+  type?: RoleType
   /** 说明 */
-  description?:string|null
+  description?: string | null
   /** 排序 */
-  sort?: string|null
+  sort?: string | null
 }
 /** 应用角色 */
-export interface OauthRole{
+export interface OauthRole {
   /** 主键id */
   id: number
   /** 创建者id */
@@ -4630,15 +4630,15 @@ export interface OauthRole{
   /** 编码 */
   code?: string | null
   /** 类型 */
-  type?:RoleType
+  type?: RoleType
   /** 说明 */
-  description?:string|null
+  description?: string | null
   /** 排序 */
-  sort?: string|null
+  sort?: string | null
   appid: number
 }
 /** 应用角色信息输出 */
-export interface ResultOutputListOauthRole{
+export interface ResultOutputListOauthRole {
   /** 是否成功标记 */
   success?: boolean
   /** 编码 */
@@ -4649,9 +4649,9 @@ export interface ResultOutputListOauthRole{
   data?: OauthRole[] | null
 }
 /** 操作日志信息 */
-export interface OauthOperationRecordGetPageOutPut{
+export interface OauthOperationRecordGetPageOutPut {
   /** 操作类型 */
-  operationType?: string |null
+  operationType?: string | null
   /** 模块名称 */
   moduleName?: string | null
   /** 描述 */
@@ -4668,14 +4668,14 @@ export interface OauthOperationRecordGetPageOutPut{
   createdTime?: string | null
 }
 /** 操作日志输出信息 */
-export interface PageOutputOauthOperationRecordGetPageOutPut{
+export interface PageOutputOauthOperationRecordGetPageOutPut {
   /** 数据总数 */
-  total?: number |null
+  total?: number | null
   /** 数据 */
   list?: OauthOperationRecordGetPageOutPut[] | null
 }
 /** 操作日志信息输出 */
-export interface ResultOutputPageOutputOauthOperationRecordGetPageOutPut{
+export interface ResultOutputPageOutputOauthOperationRecordGetPageOutPut {
   /** 是否成功标记 */
   success?: boolean
   /** 编码 */
@@ -4688,7 +4688,7 @@ export interface ResultOutputPageOutputOauthOperationRecordGetPageOutPut{
 
 export interface Filter {
   /** 操作类型 */
-  operationType?: string |null
+  operationType?: string | null
   /** 模块名称 */
   moduleName?: string | null
   /** 操作人 */
@@ -4742,7 +4742,54 @@ export interface ResultOutputListUserDto {
   /** 数据 */
   data?: UserDto[] | null
 }
-
+/** 设备管理查询信息输出基本格式 */
+export interface ResultOutputPageOutputEquipmentGetPageOutput {
+  /** 是否成功标记 */
+  success?: boolean
+  /** 编码 */
+  code?: string | null
+  /** 消息 */
+  msg?: string | null
+  /** 数据 */
+  data?: PageOutputEquipmentGetPageOutput[] | null
+}
+/** 设备管理分页查询信息输出 */
+export interface PageOutputEquipmentGetPageOutput {
+  /**
+  * 数据总数
+  * @format int64
+  */
+  total?: number
+  /** 数据 */
+  list?: EquipmentGetPageOutput[] | null
+}
+/** 设备管理查询信息输出 */
+export interface EquipmentGetPageOutput {
+  /** id */
+  id?: number
+  /** appid */
+  appid:string,
+  /** 设备sn */
+  sn?: string
+  /** 登录账户 */
+  account?: string
+  /** 设备状态 */
+  status?: number
+  /** 最近一次登录时间 */
+  loginTime?: string
+  /** 登录有效期 */
+  validityTime?: string
+  /** 备注 */
+  remark?: string
+
+}
+/** 设备管理分页 */
+export interface pageInput {
+  /**当前页数 */
+  CurrentPage: number | any
+  /**展示页数 */
+  PageSize: number | any
+}
 
 
 

+ 4 - 1
admin.ui.plus-master/src/views/example/application/applicationManage/index.vue

@@ -30,7 +30,7 @@
                 <el-col :span="8"><el-button style="width: 100%;height: 38px;border-radius: 0" type="primary" @click="toPermissPage(v)">权限</el-button></el-col>
                 <el-col :span="8"><el-button style="width: 98%;height: 38px;border-radius: 0;" type="primary" @click="toRolePage(v)">角色</el-button></el-col>
                 <el-col :span="8"><el-button style="width: 100%;height: 38px;border-radius: 0;" type="primary" @click="toViewPage(v)">视图</el-button></el-col>
-                <el-col :span="8"><el-button style="width: 100%;height: 38px;border-radius: 0;margin-top: 1%;" type="primary" @click="toViewPage(v)">设备管理</el-button></el-col>
+                <el-col :span="8"><el-button style="width: 100%;height: 38px;border-radius: 0;margin-top: 1%;" type="primary" @click="toEquipmentPage(v)">设备管理</el-button></el-col>
                 <el-col :span="8"><el-button style="width: 98%;height: 38px;border-radius: 0;margin-top: 1%;" type="primary" @click="onEdit(v)">修改</el-button></el-col>
               </el-row>
             </div>
@@ -116,6 +116,9 @@ const toViewPage = (row: OauthApply) => {
 const toPermissPage = (row: OauthApply) => {
   router.push({path:`/platform/application/permissionManage/${row.name}`})
 }
+const toEquipmentPage = (row: OauthApply) => {
+  router.push({path:`/platform/application/equipment/${row.name}`})
+}
 </script>
 
 <style scoped lang="scss">

+ 136 - 0
admin.ui.plus-master/src/views/example/application/equipment/components/equipment-edit.vue

@@ -0,0 +1,136 @@
+<template>
+    <div class="admin-authorize-editInfo">
+      <el-dialog :title="formData.titleText" v-model="formData.isShowing" draggable width="769px">
+        <el-form :model="formData.editData"
+                 :rules="rules"
+                 ref="formRef"
+                 v-loading="formData.loading"
+                 size="default"
+                 label-width="80px">
+          <el-row :gutter="35">
+            <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+              <el-form-item label="SN" prop="sn">
+                <el-input v-model="formData.editData.sn" :disabled="formData.opration != 'add'" placeholder="请输入sn"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+              <el-form-item label="账号" prop="account">
+                <el-input v-model="formData.editData.account" :disabled="formData.opration != 'add'" placeholder="请输入登录账号" clearable></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="状态" prop="status">
+              <el-select :disabled="formData.opration == 'delete'" v-model="formData.editData.status" placeholder="请设置设备状态" >
+                <el-option v-for="(value, key) in statusType" :key="key" :label="value.name"  :value="value.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+            <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+              <el-form-item  label="有效期" prop="validityTime">
+                <el-date-picker :disabled="formData.opration == 'delete'" v-model="formData.editData.validityTime" type="datetime"
+                                        value-format="YYYY-MM-DD HH:mm:ss" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+        <template #footer>
+          <span class="dialog-footer">
+            <el-button @click="onCancel" icon="ele-CircleClose" size="default">取 消</el-button>
+            <el-button type="primary" @click="onSubmit" size="default">确 认</el-button>
+          </span>
+        </template>
+      </el-dialog>
+    </div>
+  </template>
+  
+  <script setup lang="ts">
+  import {defineAsyncComponent, reactive, ref, watch, inject, computed} from "vue";
+  import {FormRules} from "element-plus";
+  import eventBus from "/@/utils/mitt";
+import { EquipmentGetPageOutput } from "/@/api/admin/data-contracts";
+import { PermissionApi } from "/@/api/admin/Permission";
+
+  /**数据对象 */
+  const formData = reactive({
+    isShowing:false,
+    loading: false,
+    opration:"add",
+    titleText:'',
+    editData:{} as EquipmentGetPageOutput
+  })
+
+  /**表单校验*/
+  const rules = reactive<FormRules>({
+    sn: [
+      { required: true, message: '请输入sn', trigger: 'blur' },
+    ],
+    account: [
+      { required: true, message: '请输入登录账户', trigger: 'blur' },
+    ],
+    status: [
+      { required: true, message: '请选择状态', trigger: 'blur' },
+    ],
+    validityTime: [
+      { required: true, message: '请确认有效期', trigger: 'blur' },
+    ]
+  })
+  
+  const statusType = reactive([
+    { name: "关闭", value: 0 }, // 红色表示关闭
+    { name: "开启", value: 1 }, // 绿色表示开启
+  ])
+  /**
+   * 表单对象
+   */
+  const formRef = ref()
+  
+  const openDialog = (opration:string,val:EquipmentGetPageOutput) => {
+    formData.isShowing = true
+    formData.opration = opration
+    if(opration == "edit"){
+      formData.editData = val
+      formData.titleText = '编辑设备'
+    } else if (opration == "delete") {
+      formData.editData = val
+      formData.titleText = '是否删除设备'
+    } else {
+      formData.editData = {} as EquipmentGetPageOutput
+      formData.titleText = '添加设备'
+      formData.editData.status = 1
+      formData.editData.appid = val.appid
+    }
+  }
+  
+  const onCancel = () => {
+    formData.editData = {} as EquipmentGetPageOutput
+  }
+
+  const onSubmit =  () => {
+    formRef.value.validate(async (valid: boolean) =>{
+      if(!valid) return
+
+      formData.loading = true
+
+      if(formData.opration == 'delete') {
+        let res = await new PermissionApi().deleteEquipment({id:formData.editData.id})
+      } else {
+        let request = JSON.parse(JSON.stringify(formData.editData)) 
+        let res = await new PermissionApi().uploadEquipment(request as EquipmentGetPageOutput)
+      }
+      
+      eventBus.emit('refreshView')
+
+      formData.editData = {} as EquipmentGetPageOutput
+      formData.loading = false
+      formData.isShowing = false
+    })
+  }
+  
+  defineExpose({
+    openDialog,
+  })
+  </script>
+  <style scoped lang="scss">
+  
+  </style>
+  

+ 194 - 0
admin.ui.plus-master/src/views/example/application/equipment/index.vue

@@ -0,0 +1,194 @@
+<template>
+  <div class="layout-pd">
+    <el-row>
+      <!--操作-->
+      <el-col :xs="24">
+        <el-card class="mt8" shadow="hover">
+          <el-form :model="state.filter" :inline="true" @submit.stop.prevent>
+            <el-form-item label="应用">
+              <el-input v-model="state.appName" disabled placeholder="请选择应用" @keyup.enter="onQuery" />
+            </el-form-item>
+            <el-form-item prop="name" style="width: 100%">
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
+                <el-form-item label="设备sn">
+                  <el-input v-model="state.filter.SN" placeholder="单行输入" clearable></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
+                <el-form-item label="登录账户">
+                  <el-input v-model="state.filter.Account" placeholder="单行输入" clearable></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
+                <el-form-item label="设备状态">
+                  <el-input v-model="state.filter.Status" placeholder="单行输入" clearable></el-input>
+                </el-form-item>
+              </el-col>
+            </el-form-item>
+          </el-form>
+          <div class="my-flex my-flex-start">
+            <el-button type="primary" icon="ele-CirclePlus" @click="onQuery"> 查询 </el-button>
+            <el-button type="primary" icon="ele-CirclePlus" @click="onAdd"> 添加 </el-button>
+            <el-button type="primary" icon="ele-CirclePlus" @click="onReset"> 重置 </el-button>
+          </div>
+        </el-card>
+      </el-col>
+      <!--表格-->
+      <el-col :xs="24">
+        <el-card style="height: 70vh" class="my-fill mt8" shadow="hover">
+          <el-table v-loading="state.loading" stripe :data="state.tableModel" row-key="id" style="width: 100%">
+            <el-table-column v-for="column in state.dynamicColumns" :key="column.prop" :prop="column.prop"
+              :label="column.label">
+              <template #default="{ row }">
+                                <!-- 如果是状态列,使用 StatusBox 组件 -->
+                                <StatusBox 
+                                    v-if="column.prop === 'status'" 
+                                    :status="getStatusInfo(row[column.prop]).name"  />
+                                <!-- 其他列保持原有逻辑 -->
+                                <span v-else>
+                                    {{ row[column.prop] }}
+                                </span>
+                            </template>
+            </el-table-column>
+            <el-table-column label="操作" fixed="right" header-align="center" align="center" class="right-operation"
+              width="140">
+              <template #default="{ row }">
+                <el-link class="my-el-link mr12 ml12" type="primary" icon="ele-Upload" @click="onDateUpdate(row)"
+                  :underline="false" target="_blank">编辑</el-link>
+                <el-link class="my-el-link mr12 ml12" type="primary" icon="ele-Upload" @click="onDataDelete(row)"
+                  :underline="false" target="_blank">删除</el-link>
+              </template>
+            </el-table-column>
+          </el-table>
+          <div class="my-flex my-flex-end" style="margin-top: 20px">
+            <el-pagination v-model:currentPage="state.pageInput.CurrentPage"
+                            v-model:page-size="state.pageInput.PageSize" :total="state.total"
+                            :page-sizes="[10, 15, 20, 50, 100]" small background @size-change="onSizeChange"
+                            @current-change="onCurrentChange" layout="total, sizes, prev, pager, next, jumper" />
+
+          </div>
+        </el-card>
+      </el-col>
+    </el-row>
+
+    <EquipmentEditDialog ref="equipmentEditRef"></EquipmentEditDialog>
+  </div>
+</template>
+<script setup lang="ts">
+import { defineAsyncComponent, onBeforeMount, onMounted, reactive, ref, watch } from "vue";
+import eventBus from "/@/utils/mitt";
+import { pageInput, EquipmentGetPageOutput } from "/@/api/admin/data-contracts";
+import { PermissionApi } from "/@/api/admin/Permission";
+import router from "/@/router";
+import StatusBox from "/@/components/StatusBox.vue";
+
+/**引入组件*/
+const EquipmentEditDialog = defineAsyncComponent(() => import('./components/equipment-edit.vue'))
+const equipmentEditRef = ref()
+
+/**数据对象*/
+const state = reactive({
+  /**加载显示 */
+  loading: false,
+  appName:"",
+  /**条件查询模块 */
+  filter: {
+    /** appid */
+    Appid:"",
+    /**设备sn */
+    SN: null,
+    /**登录账户 */
+    Account: null,
+    /**设备状态 */
+    Status: null,
+  },
+  /**表格信息 */
+  tableModel: [] as EquipmentGetPageOutput,
+  /**动态表头 */
+  dynamicColumns: [
+    { prop: 'sn', label: '设备sn' },
+    { prop: 'account', label: '登录账户' },
+    { prop: 'status', label: '设备状态' },
+    { prop: 'loginTime', label: '最近一次登录时间' },
+    { prop: 'validityTime', label: '登录有效期' },],
+  /**分页标识 */
+  pageInput: {
+    CurrentPage: 1,
+    PageSize: 10,
+  } as pageInput,
+  /**分页总数 */
+  total: 0,
+})
+
+// 状态映射表
+const statusMap = {
+  0: { name: "关闭", color: "#F56C6C" }, // 红色表示关闭
+  1: { name: "开启", color: "#67C23A" }, // 绿色表示开启
+};
+
+// 根据 status 值获取映射后的对象
+const getStatusInfo = (status: number) => {
+  return statusMap[status] || { name: "未知状态", color: "#000" };
+};
+
+onMounted(() => {
+  init()
+  eventBus.off('refreshView')
+  eventBus.on('refreshView', async () => {
+    await init()
+  })
+  console.log()
+})
+onBeforeMount(() => {
+  eventBus.off('refreshView')
+})
+/**
+* 监听变换
+*/
+// watch(() => { })
+/**条件查询 */
+const onQuery = async () => {
+  state.loading = true
+  const res: any = await new PermissionApi().getEquipmentList({ 
+    ...state.pageInput, 
+    "Filter.Appid":state.filter.Appid,
+    "Filter.SN":state.filter.SN,
+    "Filter.Account":state.filter.Account,
+    "Filter.Status":state.filter.Status,
+  })
+  state.total = res?.data?.total ?? 0
+  state.tableModel = res?.data?.list ?? []
+  state.loading = false
+}
+/**初始化 */
+const init = async () => {
+  state.loading = true
+  const name = router.currentRoute.value.params.id
+  const appData=await new PermissionApi().getApplyInfo({Name:name})
+  state.appName = appData.data[0].name
+  state.filter.Appid = appData.data[0].appid
+  state.loading = false
+  onQuery()
+}
+/**添加 */
+const onAdd = () => {
+  equipmentEditRef.value.openDialog('add',{appid:state.filter.Appid})
+}
+/**重置 */
+const onReset = () => { }
+/**编辑 */
+const onDateUpdate = (row) => {
+  equipmentEditRef.value.openDialog('edit',row)
+ }
+/**删除 */
+const onDataDelete = (row) => {
+  equipmentEditRef.value.openDialog('delete',row)
+ }
+
+const onSizeChange = () => {
+}
+
+const onCurrentChange = () => {
+}
+</script>
+<style scoped lang="scss"></style>

+ 373 - 373
admin.ui.plus-master/src/views/example/application/roleManage/index.vue

@@ -1,373 +1,373 @@
-<template>
-  <my-layout>
-    <pane size="50" min-size="30" max-size="70">
-      <div class="my-flex-column w100 h100">
-        <el-card class="mt8" shadow="never" :body-style="{ paddingBottom: '0' }">
-          <el-form :inline="true" @submit.stop.prevent>
-            <el-form-item label="应用">
-              <el-input v-model="state.filter.app" disabled placeholder="请选择应用" @keyup.enter="onQuery" />
-            </el-form-item>
-            <el-form-item label="角色名称">
-              <el-input v-model="state.filter.roleName" placeholder="角色名称" @keyup.enter="onQuery" />
-            </el-form-item>
-            <el-form-item>
-              <el-button type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
-              <el-dropdown v-auth="'api:admin:role:add'" style="margin-left: 12px">
-                <el-button type="primary"
-                  >新增<el-icon class="el-icon--right"><ele-ArrowDown /></el-icon
-                ></el-button>
-                <template #dropdown>
-                  <el-dropdown-menu>
-                    <el-dropdown-item @click="onAdd(1)">新增分组</el-dropdown-item>
-                    <el-dropdown-item @click="onAdd(2)">新增角色</el-dropdown-item>
-                  </el-dropdown-menu>
-                </template>
-              </el-dropdown>
-            </el-form-item>
-          </el-form>
-        </el-card>
-
-        <el-card class="my-fill mt8" shadow="never">
-          <el-table
-            ref="roleTableRef"
-            v-loading="state.loading"
-            :data="state.roleTreeData"
-            row-key="id"
-            default-expand-all
-            :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
-            highlight-current-row
-            style="width: 100%"
-            @current-change="onCurrentChange"
-          >
-            <el-table-column prop="name" label="角色名称" min-width="120" show-overflow-tooltip />
-            <el-table-column prop="sort" label="排序" width="80" align="center" show-overflow-tooltip />
-            <el-table-column label="操作" width="100" fixed="right" header-align="center" align="right">
-              <template #default="{ row }">
-                <el-button
-                  v-if="row.type === 1"
-                  v-auth="'api:admin:role:add'"
-                  icon="ele-Plus"
-                  text
-                  type="primary"
-                  @click="onAdd(2, row)"
-                ></el-button>
-                <my-dropdown-more icon-only v-auths="['api:admin:permission:assign', 'api:admin:role:update', 'api:admin:role:delete']">
-                  <template #dropdown>
-                    <el-dropdown-menu>
-                      <el-dropdown-item v-if="row.type === 2 && auth('api:admin:permission:assign')" @click="onSetAppMenu(row)"
-                        >菜单权限</el-dropdown-item
-                      >
-                      <!-- <el-dropdown-item v-if="row.type === 2" @click="onSetRoleDataScope(row)">数据权限</el-dropdown-item> -->
-                      <el-dropdown-item v-if="auth('api:admin:role:update')" @click="onEdit(row)"
-                        >编辑{{ row.type === 1 ? '分组' : '角色' }}</el-dropdown-item
-                      >
-                      <el-dropdown-item v-if="auth('api:admin:role:delete')" @click="onDelete(row)"
-                        >删除{{ row.type === 1 ? '分组' : '角色' }}</el-dropdown-item
-                      >
-                    </el-dropdown-menu>
-                  </template>
-                </my-dropdown-more>
-              </template>
-            </el-table-column>
-          </el-table>
-        </el-card>
-      </div>
-    </pane>
-    <pane>
-      <div class="my-flex-column w100 h100">
-        <el-card class="mt8" shadow="never" :body-style="{ paddingBottom: '0' }">
-          <el-form :inline="true" @submit.stop.prevent>
-            <el-form-item label="姓名">
-              <el-input v-model="state.filter.name" placeholder="姓名" @keyup.enter="onGetRoleUserList" />
-            </el-form-item>
-            <el-form-item>
-              <el-button type="primary" icon="ele-Search" @click="onGetRoleUserList"> 查询 </el-button>
-              <el-button v-auth="'api:admin:role:add-role-user'" type="primary" icon="ele-Plus" @click="onAddUser"> 添加用户 </el-button>
-              <el-button v-auth="'api:admin:role:remove-role-user'" type="danger" icon="ele-Delete" @click="onRemoveUser"> 移除用户 </el-button>
-            </el-form-item>
-          </el-form>
-        </el-card>
-
-        <el-card class="my-fill mt8" shadow="never">
-          <el-table
-            ref="userTableRef"
-            v-loading="state.userListLoading"
-            :data="state.userListData"
-            row-key="id"
-            style="width: 100%"
-            @row-click="onUserRowClick"
-          >
-            <el-table-column type="selection" width="55" />
-            <el-table-column prop="name" label="姓名" min-width="120" show-overflow-tooltip />
-            <el-table-column prop="mobile" label="手机号" min-width="120" show-overflow-tooltip />
-            <!-- <el-table-column prop="email" label="邮箱" min-width="120" show-overflow-tooltip /> -->
-          </el-table>
-        </el-card>
-      </div>
-    </pane>
-
-    <role-form ref="roleFormRef" :title="state.roleFormTitle" :role-tree-data="state.roleFormTreeData"></role-form>
-    <user-select
-      ref="userSelectRef"
-      :title="`添加【${state.roleName}】用户`"
-      multiple
-      :sure-loading="state.sureLoading"
-      @sure="onSureUser"
-    ></user-select>
-    <set-app-menu ref="setAppMenuRef"></set-app-menu>
-    <set-role-menu ref="setRoleMenuRef"></set-role-menu>
-    <set-role-data-scope ref="setRoleDataScopeRef"></set-role-data-scope>
-  </my-layout>
-</template>
-
-<script lang="ts" setup name="admin/role">
-import router from "/@/router";
-import { ref, reactive, onMounted, getCurrentInstance, onBeforeMount, nextTick, defineAsyncComponent } from 'vue'
-import { OauthRole,RoleGetListOutput, RoleType,UserDto } from '/@/api/admin/data-contracts'
-import { RoleApi } from '/@/api/admin/Role'
-import { PermissionApi } from '/@/api/admin/Permission'
-import { listToTree, filterTree } from '/@/utils/tree'
-import { ElTable } from 'element-plus'
-import { cloneDeep } from 'lodash-es'
-import eventBus from '/@/utils/mitt'
-import { auth } from '/@/utils/authFunction'
-import { Pane } from 'splitpanes'
-
-// 引入组件
-const RoleForm = defineAsyncComponent(() => import('./components/role-form.vue'))
-const SetAppMenu = defineAsyncComponent(() => import('./components/set-app-menu.vue'))
-const UserSelect = defineAsyncComponent(() => import('./components/user-select.vue'))
-const MyDropdownMore = defineAsyncComponent(() => import('/@/components/my-dropdown-more/index.vue'))
-const MyLayout = defineAsyncComponent(() => import('/@/components/my-layout/index.vue'))
-const SetRoleMenu = defineAsyncComponent(() => import('./components/set-role-menu.vue'))
-const { proxy } = getCurrentInstance() as any
-
-const roleTableRef = ref()
-const roleFormRef = ref()
-const userTableRef = ref<InstanceType<typeof ElTable>>()
-const userSelectRef = ref()
-const setAppMenuRef = ref()
-const setRoleMenuRef = ref()
-const setRoleDataScopeRef = ref()
-
-const state = reactive({
-  loading: false,
-  userListLoading: false,
-  sureLoading: false,
-  roleFormTitle: '',
-  filter: {
-    name: '',
-    roleName: '',
-    app:''
-  },
-  roleTreeData: [] as any,
-  roleFormTreeData: [] as any,
-  userListData: [] as UserDto[],
-  roleId: undefined as number | undefined,
-  roleName: '' as string | null | undefined,
-  appid:undefined as number | undefined
-})
-
-onMounted(() => {
-  onQuery()
-  eventBus.off('refreshRole')
-  eventBus.on('refreshRole', async () => {
-    onQuery()
-  })
-})
-
-onBeforeMount(() => {
-  eventBus.off('refreshRole')
-})
-
-const onQuery = async () => {
-  state.loading = true
-  const name = router.currentRoute.value.params.id
-  const appData=await new PermissionApi().getApplyInfo({Name:name})
-  state.filter.app=appData.data[0].name
-  debugger
-  state.appid = appData.data[0].id
-  const res = await new PermissionApi().getRoleInfo({name:state.filter.roleName,AppID:appData.data[0].id}).catch(() => {
-    state.loading = false
-  })
-  res.data=res.data.map((item)=>{
-    item.parentId=Number(item.parentId)
-    if(item.parentId===0||item.parentId===null){
-      //item.parentId=Number('0')
-      item.type=1
-    }
-    // if(item.parentId===0){
-    //   //item.parentId=Number(item.parentId)
-    //   item.type=2
-    // }
-    // if(item.parentId!==0){
-    //   //item.parentId=Number(item.parentId)
-    //   item.type=3
-    // }
-    return item
-  })
-  if (res && res.data && res.data.length > 0) {
-    state.roleTreeData = filterTree(listToTree(cloneDeep(res.data)), state.filter.roleName)
-    state.roleFormTreeData = listToTree(cloneDeep(res.data).filter((a) => a.parentId === 0))
-    if (state.roleTreeData.length > 0 && state.roleTreeData[0].children?.length > 0) {
-      nextTick(() => {
-        roleTableRef.value!?.setCurrentRow(state.roleTreeData[0].children[0])
-      })
-    }
-  } else {
-    state.roleTreeData = []
-    state.roleFormTreeData = []
-  }
-
-  state.loading = false
-}
-
-const onAdd = (type: RoleType, row: OauthRole | undefined = undefined) => {
-  switch (type) {
-    case 1:
-      debugger
-      state.roleFormTitle = '新增分组'
-      roleFormRef.value.open({ type: 1 ,appid:state.appid})
-      break
-    case 2:
-      state.roleFormTitle = '新增角色'
-      roleFormRef.value.open({ type: 2, parentId: row?.id, dataScope: 1,appid:state.appid })
-      break
-  }
-}
-
-const onEdit = (row: OauthRole) => {
-  switch (row.type) {
-    case 1:
-      state.roleFormTitle = '编辑分组'
-      break
-    case 2:
-      state.roleFormTitle = '编辑角色'
-      break
-  }
-  roleFormRef.value.open(row)
-}
-
-const onDelete = (row: OauthRole) => {
-  proxy.$modal
-    .confirmDelete(`确定要删除角色【${row.name}】?`)
-    .then(async () => {
-      await new PermissionApi().roleDelete({ id: row.id }, { loading: true })
-      onQuery()
-    })
-    .catch(() => {})
-}
-
-const onGetRoleUserList = async () => {
-  state.userListLoading = true
-  const res = await new RoleApi().getApplyRoseUserInfo({ roleid: state.roleId, name: state.filter.name }).catch(() => {
-    state.userListLoading = false
-  })
-  state.userListLoading = false
-  if (res?.success) {
-    if (res.data && res.data.length > 0) {
-      state.userListData = res.data
-    } else {
-      state.userListData = []
-    }
-  }
-}
-
-const onCurrentChange = (currentRow: RoleGetListOutput, oldCurrentRow: RoleGetListOutput) => {
-  if (!currentRow) {
-    return
-  }
-
-  if (currentRow?.id !== oldCurrentRow?.id && (oldCurrentRow?.id as number) > 0) {
-    if ((currentRow?.parentId as number) === 0) {
-      roleTableRef.value!.setCurrentRow(oldCurrentRow)
-    }
-  } else {
-    if ((currentRow?.parentId as number) === 0) {
-      roleTableRef.value!.setCurrentRow()
-    }
-  }
-
-  if ((currentRow?.parentId as number) !== 0 && (oldCurrentRow?.parentId as number) !== 0 && (currentRow?.id as number) > 0) {
-    state.roleId = currentRow.id
-    state.roleName = currentRow.name
-    onGetRoleUserList()
-  }
-}
-
-const onUserRowClick = (row: UserDto) => {
-  // TODO: improvement typing when refactor table
-  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
-  // @ts-expect-error
-  userTableRef.value!.toggleRowSelection(row, undefined)
-}
-
-const onAddUser = () => {
-  if (!((state.roleId as number) > 0)) {
-    proxy.$modal.msgWarning('请选择角色')
-    return
-  }
-  userSelectRef.value.open({ roleId: state.roleId })
-}
-
-const onRemoveUser = () => {
-  if (!((state.roleId as number) > 0)) {
-    proxy.$modal.msgWarning('请选择角色')
-    return
-  }
-
-  const selectionRows = userTableRef.value!.getSelectionRows() as UserDto[]
-
-  if (!((selectionRows.length as number) > 0)) {
-    proxy.$modal.msgWarning('请选择用户')
-    return
-  }
-
-  proxy.$modal
-    .confirm(`确定要移除吗?`)
-    .then(async () => {
-      const userIds = selectionRows?.map((a) => ({id:a.id,name:a.name,mobile:a.mobile}))
-      await new RoleApi().deleteApplyRoseUser(userIds,{roleid:state.roleId} ,{ showSuccessMessage: true })
-      onGetRoleUserList()
-    })
-    .catch(() => {})
-}
-
-const onSureUser = async (users: UserDto[]) => {
-  if (!(users?.length > 0)) {
-    userSelectRef.value.close()
-    return
-  }
-
-  state.sureLoading = true
-  const userIds = users?.map((a) => ({id:a.id,name:a.name,mobile:a.mobile}))
-  await new RoleApi().addApplyRoseUser(userIds,{roleid:state.roleId} ,{ showSuccessMessage: true }).catch(() => {
-    state.sureLoading = false
-  })
-  state.sureLoading = false
-  userSelectRef.value.close()
-  onGetRoleUserList()
-}
-
-const onSetAppMenu = async (role: RoleGetListOutput) => {
-  if (!((role?.id as number) > 0)) {
-    proxy.$modal.msgWarning('请选择角色')
-    return
-  }
-  const input = { id: role.id, name:role.name }
-  const name = router.currentRoute.value.params.id
-  const appData=await new PermissionApi().getApplyInfo({Name:name})
-  console.log(appData.data)
-  setRoleMenuRef.value.open(input,appData.data[0].id)
-}
-
-const onSetRoleDataScope = (role: RoleGetListOutput) => {
-  if (!((role?.id as number) > 0)) {
-    proxy.$modal.msgWarning('请选择角色')
-    return
-  }
-  setRoleDataScopeRef.value.open(role)
-}
-</script>
-
-<style scoped lang="scss"></style>
+<template>
+  <my-layout>
+    <pane size="50" min-size="30" max-size="70">
+      <div class="my-flex-column w100 h100">
+        <el-card class="mt8" shadow="never" :body-style="{ paddingBottom: '0' }">
+          <el-form :inline="true" @submit.stop.prevent>
+            <el-form-item label="应用">
+              <el-input v-model="state.filter.app" disabled placeholder="请选择应用" @keyup.enter="onQuery" />
+            </el-form-item>
+            <el-form-item label="角色名称">
+              <el-input v-model="state.filter.roleName" placeholder="角色名称" @keyup.enter="onQuery" />
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
+              <el-dropdown v-auth="'api:admin:role:add'" style="margin-left: 12px">
+                <el-button type="primary"
+                  >新增<el-icon class="el-icon--right"><ele-ArrowDown /></el-icon
+                ></el-button>
+                <template #dropdown>
+                  <el-dropdown-menu>
+                    <el-dropdown-item @click="onAdd(1)">新增分组</el-dropdown-item>
+                    <el-dropdown-item @click="onAdd(2)">新增角色</el-dropdown-item>
+                  </el-dropdown-menu>
+                </template>
+              </el-dropdown>
+            </el-form-item>
+          </el-form>
+        </el-card>
+
+        <el-card class="my-fill mt8" shadow="never">
+          <el-table
+            ref="roleTableRef"
+            v-loading="state.loading"
+            :data="state.roleTreeData"
+            row-key="id"
+            default-expand-all
+            :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
+            highlight-current-row
+            style="width: 100%"
+            @current-change="onCurrentChange"
+          >
+            <el-table-column prop="name" label="角色名称" min-width="120" show-overflow-tooltip />
+            <el-table-column prop="sort" label="排序" width="80" align="center" show-overflow-tooltip />
+            <el-table-column label="操作" width="100" fixed="right" header-align="center" align="right">
+              <template #default="{ row }">
+                <el-button
+                  v-if="row.type === 1"
+                  v-auth="'api:admin:role:add'"
+                  icon="ele-Plus"
+                  text
+                  type="primary"
+                  @click="onAdd(2, row)"
+                ></el-button>
+                <my-dropdown-more icon-only v-auths="['api:admin:permission:assign', 'api:admin:role:update', 'api:admin:role:delete']">
+                  <template #dropdown>
+                    <el-dropdown-menu>
+                      <el-dropdown-item v-if="row.type === 2 && auth('api:admin:permission:assign')" @click="onSetAppMenu(row)"
+                        >菜单权限</el-dropdown-item
+                      >
+                      <!-- <el-dropdown-item v-if="row.type === 2" @click="onSetRoleDataScope(row)">数据权限</el-dropdown-item> -->
+                      <el-dropdown-item v-if="auth('api:admin:role:update')" @click="onEdit(row)"
+                        >编辑{{ row.type === 1 ? '分组' : '角色' }}</el-dropdown-item
+                      >
+                      <el-dropdown-item v-if="auth('api:admin:role:delete')" @click="onDelete(row)"
+                        >删除{{ row.type === 1 ? '分组' : '角色' }}</el-dropdown-item
+                      >
+                    </el-dropdown-menu>
+                  </template>
+                </my-dropdown-more>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-card>
+      </div>
+    </pane>
+    <pane>
+      <div class="my-flex-column w100 h100">
+        <el-card class="mt8" shadow="never" :body-style="{ paddingBottom: '0' }">
+          <el-form :inline="true" @submit.stop.prevent>
+            <el-form-item label="姓名">
+              <el-input v-model="state.filter.name" placeholder="姓名" @keyup.enter="onGetRoleUserList" />
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" icon="ele-Search" @click="onGetRoleUserList"> 查询 </el-button>
+              <el-button v-auth="'api:admin:role:add-role-user'" type="primary" icon="ele-Plus" @click="onAddUser"> 添加用户 </el-button>
+              <el-button v-auth="'api:admin:role:remove-role-user'" type="danger" icon="ele-Delete" @click="onRemoveUser"> 移除用户 </el-button>
+            </el-form-item>
+          </el-form>
+        </el-card>
+
+        <el-card class="my-fill mt8" shadow="never">
+          <el-table
+            ref="userTableRef"
+            v-loading="state.userListLoading"
+            :data="state.userListData"
+            row-key="id"
+            style="width: 100%"
+            @row-click="onUserRowClick"
+          >
+            <el-table-column type="selection" width="55" />
+            <el-table-column prop="name" label="姓名" min-width="120" show-overflow-tooltip />
+            <el-table-column prop="mobile" label="手机号" min-width="120" show-overflow-tooltip />
+            <!-- <el-table-column prop="email" label="邮箱" min-width="120" show-overflow-tooltip /> -->
+          </el-table>
+        </el-card>
+      </div>
+    </pane>
+
+    <role-form ref="roleFormRef" :title="state.roleFormTitle" :role-tree-data="state.roleFormTreeData"></role-form>
+    <user-select
+      ref="userSelectRef"
+      :title="`添加【${state.roleName}】用户`"
+      multiple
+      :sure-loading="state.sureLoading"
+      @sure="onSureUser"
+    ></user-select>
+    <set-app-menu ref="setAppMenuRef"></set-app-menu>
+    <set-role-menu ref="setRoleMenuRef"></set-role-menu>
+    <set-role-data-scope ref="setRoleDataScopeRef"></set-role-data-scope>
+  </my-layout>
+</template>
+
+<script lang="ts" setup name="admin/role">
+import router from "/@/router";
+import { ref, reactive, onMounted, getCurrentInstance, onBeforeMount, nextTick, defineAsyncComponent } from 'vue'
+import { OauthRole,RoleGetListOutput, RoleType,UserDto } from '/@/api/admin/data-contracts'
+import { RoleApi } from '/@/api/admin/Role'
+import { PermissionApi } from '/@/api/admin/Permission'
+import { listToTree, filterTree } from '/@/utils/tree'
+import { ElTable } from 'element-plus'
+import { cloneDeep } from 'lodash-es'
+import eventBus from '/@/utils/mitt'
+import { auth } from '/@/utils/authFunction'
+import { Pane } from 'splitpanes'
+
+// 引入组件
+const RoleForm = defineAsyncComponent(() => import('./components/role-form.vue'))
+const SetAppMenu = defineAsyncComponent(() => import('./components/set-app-menu.vue'))
+const UserSelect = defineAsyncComponent(() => import('./components/user-select.vue'))
+const MyDropdownMore = defineAsyncComponent(() => import('/@/components/my-dropdown-more/index.vue'))
+const MyLayout = defineAsyncComponent(() => import('/@/components/my-layout/index.vue'))
+const SetRoleMenu = defineAsyncComponent(() => import('./components/set-role-menu.vue'))
+const { proxy } = getCurrentInstance() as any
+
+const roleTableRef = ref()
+const roleFormRef = ref()
+const userTableRef = ref<InstanceType<typeof ElTable>>()
+const userSelectRef = ref()
+const setAppMenuRef = ref()
+const setRoleMenuRef = ref()
+const setRoleDataScopeRef = ref()
+
+const state = reactive({
+  loading: false,
+  userListLoading: false,
+  sureLoading: false,
+  roleFormTitle: '',
+  filter: {
+    name: '',
+    roleName: '',
+    app:''
+  },
+  roleTreeData: [] as any,
+  roleFormTreeData: [] as any,
+  userListData: [] as UserDto[],
+  roleId: undefined as number | undefined,
+  roleName: '' as string | null | undefined,
+  appid:undefined as number | undefined
+})
+
+onMounted(() => {
+  onQuery()
+  eventBus.off('refreshRole')
+  eventBus.on('refreshRole', async () => {
+    onQuery()
+  })
+})
+
+onBeforeMount(() => {
+  eventBus.off('refreshRole')
+})
+
+const onQuery = async () => {
+  state.loading = true
+  const name = router.currentRoute.value.params.id
+  const appData=await new PermissionApi().getApplyInfo({Name:name})
+  state.filter.app=appData.data[0].name
+  debugger
+  state.appid = appData.data[0].id
+  const res = await new PermissionApi().getRoleInfo({name:state.filter.roleName,AppID:appData.data[0].id}).catch(() => {
+    state.loading = false
+  })
+  res.data=res.data.map((item)=>{
+    item.parentId=Number(item.parentId)
+    if(item.parentId===0||item.parentId===null){
+      //item.parentId=Number('0')
+      item.type=1
+    }
+    // if(item.parentId===0){
+    //   //item.parentId=Number(item.parentId)
+    //   item.type=2
+    // }
+    // if(item.parentId!==0){
+    //   //item.parentId=Number(item.parentId)
+    //   item.type=3
+    // }
+    return item
+  })
+  if (res && res.data && res.data.length > 0) {
+    state.roleTreeData = filterTree(listToTree(cloneDeep(res.data)), state.filter.roleName)
+    state.roleFormTreeData = listToTree(cloneDeep(res.data).filter((a) => a.parentId === 0))
+    if (state.roleTreeData.length > 0 && state.roleTreeData[0].children?.length > 0) {
+      nextTick(() => {
+        roleTableRef.value!?.setCurrentRow(state.roleTreeData[0].children[0])
+      })
+    }
+  } else {
+    state.roleTreeData = []
+    state.roleFormTreeData = []
+  }
+
+  state.loading = false
+}
+
+const onAdd = (type: RoleType, row: OauthRole | undefined = undefined) => {
+  switch (type) {
+    case 1:
+      debugger
+      state.roleFormTitle = '新增分组'
+      roleFormRef.value.open({ type: 1 ,appid:state.appid})
+      break
+    case 2:
+      state.roleFormTitle = '新增角色'
+      roleFormRef.value.open({ type: 2, parentId: row?.id, dataScope: 1,appid:state.appid })
+      break
+  }
+}
+
+const onEdit = (row: OauthRole) => {
+  switch (row.type) {
+    case 1:
+      state.roleFormTitle = '编辑分组'
+      break
+    case 2:
+      state.roleFormTitle = '编辑角色'
+      break
+  }
+  roleFormRef.value.open(row)
+}
+
+const onDelete = (row: OauthRole) => {
+  proxy.$modal
+    .confirmDelete(`确定要删除角色【${row.name}】?`)
+    .then(async () => {
+      await new PermissionApi().roleDelete({ id: row.id }, { loading: true })
+      onQuery()
+    })
+    .catch(() => {})
+}
+
+const onGetRoleUserList = async () => {
+  state.userListLoading = true
+  const res = await new RoleApi().getApplyRoseUserInfo({ roleid: state.roleId, name: state.filter.name }).catch(() => {
+    state.userListLoading = false
+  })
+  state.userListLoading = false
+  if (res?.success) {
+    if (res.data && res.data.length > 0) {
+      state.userListData = res.data
+    } else {
+      state.userListData = []
+    }
+  }
+}
+
+const onCurrentChange = (currentRow: RoleGetListOutput, oldCurrentRow: RoleGetListOutput) => {
+  if (!currentRow) {
+    return
+  }
+
+  if (currentRow?.id !== oldCurrentRow?.id && (oldCurrentRow?.id as number) > 0) {
+    if ((currentRow?.parentId as number) === 0) {
+      roleTableRef.value!.setCurrentRow(oldCurrentRow)
+    }
+  } else {
+    if ((currentRow?.parentId as number) === 0) {
+      roleTableRef.value!.setCurrentRow()
+    }
+  }
+
+  if ((currentRow?.parentId as number) !== 0 && (oldCurrentRow?.parentId as number) !== 0 && (currentRow?.id as number) > 0) {
+    state.roleId = currentRow.id
+    state.roleName = currentRow.name
+    onGetRoleUserList()
+  }
+}
+
+const onUserRowClick = (row: UserDto) => {
+  // TODO: improvement typing when refactor table
+  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+  // @ts-expect-error
+  userTableRef.value!.toggleRowSelection(row, undefined)
+}
+
+const onAddUser = () => {
+  if (!((state.roleId as number) > 0)) {
+    proxy.$modal.msgWarning('请选择角色')
+    return
+  }
+  userSelectRef.value.open({ roleId: state.roleId })
+}
+
+const onRemoveUser = () => {
+  if (!((state.roleId as number) > 0)) {
+    proxy.$modal.msgWarning('请选择角色')
+    return
+  }
+
+  const selectionRows = userTableRef.value!.getSelectionRows() as UserDto[]
+
+  if (!((selectionRows.length as number) > 0)) {
+    proxy.$modal.msgWarning('请选择用户')
+    return
+  }
+
+  proxy.$modal
+    .confirm(`确定要移除吗?`)
+    .then(async () => {
+      const userIds = selectionRows?.map((a) => ({id:a.id,name:a.name,mobile:a.mobile}))
+      await new RoleApi().deleteApplyRoseUser(userIds,{roleid:state.roleId} ,{ showSuccessMessage: true })
+      onGetRoleUserList()
+    })
+    .catch(() => {})
+}
+
+const onSureUser = async (users: UserDto[]) => {
+  if (!(users?.length > 0)) {
+    userSelectRef.value.close()
+    return
+  }
+
+  state.sureLoading = true
+  const userIds = users?.map((a) => ({id:a.id,name:a.name,mobile:a.mobile}))
+  await new RoleApi().addApplyRoseUser(userIds,{roleid:state.roleId} ,{ showSuccessMessage: true }).catch(() => {
+    state.sureLoading = false
+  })
+  state.sureLoading = false
+  userSelectRef.value.close()
+  onGetRoleUserList()
+}
+
+const onSetAppMenu = async (role: RoleGetListOutput) => {
+  if (!((role?.id as number) > 0)) {
+    proxy.$modal.msgWarning('请选择角色')
+    return
+  }
+  const input = { id: role.id, name:role.name }
+  const name = router.currentRoute.value.params.id
+  const appData=await new PermissionApi().getApplyInfo({Name:name})
+  console.log(appData.data)
+  setRoleMenuRef.value.open(input,appData.data[0].id)
+}
+
+const onSetRoleDataScope = (role: RoleGetListOutput) => {
+  if (!((role?.id as number) > 0)) {
+    proxy.$modal.msgWarning('请选择角色')
+    return
+  }
+  setRoleDataScopeRef.value.open(role)
+}
+</script>
+
+<style scoped lang="scss"></style>

+ 140 - 140
admin.ui.plus-master/src/views/example/application/viewManage/index.vue

@@ -1,140 +1,140 @@
-<template>
-  <div class="my-layout">
-    <el-card class="mt8" shadow="never" :body-style="{ paddingBottom: '0' }">
-      <el-form :model="state.filter" :inline="true" @submit.stop.prevent>
-        <el-form-item label="应用">
-          <el-input v-model="state.filter.app" disabled placeholder="请选择应用" @keyup.enter="onQuery" />
-        </el-form-item>
-        <el-form-item label="视图名称">
-          <el-input v-model="state.filter.name" placeholder="视图名称" @keyup.enter="onQuery" />
-        </el-form-item>
-        <el-form-item>
-          <el-button type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
-          <el-button v-auth="'api:admin:view:add'" type="primary" icon="ele-Plus" @click="onAdd"> 新增 </el-button>
-        </el-form-item>
-      </el-form>
-    </el-card>
-
-    <el-card class="my-fill mt8" shadow="never">
-      <el-table
-        :data="state.viewTreeData"
-        style="width: 100%"
-        v-loading="state.loading"
-        row-key="id"
-        default-expand-all
-        :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
-      >
-        <el-table-column prop="label" label="视图名称" min-width="120" show-overflow-tooltip />
-        <!-- <el-table-column prop="name" label="视图命名" min-width="120" show-overflow-tooltip /> -->
-        <el-table-column prop="path" label="视图地址" min-width="120" show-overflow-tooltip />
-        <el-table-column prop="sort" label="排序" width="80" align="center" show-overflow-tooltip />
-        <!-- <el-table-column prop="description" label="视图描述" min-width="120" show-overflow-tooltip /> -->
-        <!-- <el-table-column label="状态" width="80" align="center" show-overflow-tooltip>
-          <template #default="{ row }">
-            <el-tag type="success" v-if="row.enabled">启用</el-tag>
-            <el-tag type="danger" v-else>禁用</el-tag>
-          </template>
-        </el-table-column> -->
-        <el-table-column label="操作" width="160" fixed="right" header-align="center" align="center">
-          <template #default="{ row }">
-            <el-button v-auth="'api:admin:view:update'" icon="ele-EditPen" text type="primary" @click="onEdit(row)">编辑</el-button>
-            <el-button v-auth="'api:admin:view:delete'" icon="ele-Delete" text type="danger" @click="onDelete(row)">删除</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-    </el-card>
-
-    <view-form ref="viewFormRef" :title="state.viewFormTitle" :view-tree-data="state.viewTreeData"></view-form>
-  </div>
-</template>
-
-<script lang="ts" setup name="admin/view">
-import router from "/@/router";
-import { ref, reactive, onMounted, getCurrentInstance, onBeforeMount, defineAsyncComponent } from 'vue'
-import { OauthView,OauthApply } from '/@/api/admin/data-contracts'
-import { ViewApi } from '/@/api/admin/View'
-import { listToTree, filterTree } from '/@/utils/tree'
-import { cloneDeep } from 'lodash-es'
-import { PermissionApi } from '/@/api/admin/Permission'
-import eventBus from '/@/utils/mitt'
-
-// 引入组件
-const ViewForm = defineAsyncComponent(() => import('./components/view-form.vue'))
-
-const viewFormRef = ref()
-const { proxy } = getCurrentInstance() as any
-
-const state = reactive({
-  loading: false,
-  viewFormTitle: '',
-  filter: {
-    name: '',
-    app:''
-  },
-  viewTreeData: [] as Array<OauthView>,
-  formViewTreeData: [] as Array<OauthView>
-})
-
-onMounted(() => {
-  onQuery()
-  eventBus.off('refreshView')
-  eventBus.on('refreshView', async () => {
-    onQuery()
-  })
-})
-
-onBeforeMount(() => {
-  eventBus.off('refreshView')
-})
-
-const onQuery = async () => {
-  state.loading = true
-  const name = router.currentRoute.value.params.id
-  const appData=await new PermissionApi().getApplyInfo({Name:name})
-  state.filter.app=appData.data[0].name
-  const res = await new PermissionApi().getViewInfo({appid:appData.data[0].id,label:state.filter.name}).catch(() => {
-    state.loading = false
-  })
-  res.data=res.data.map((item)=>{
-    if(item.parentId===''||item.parentId===null){
-      item.parentId=Number('0')
-      item.type=1
-    }
-    item.parentId=Number(item.parentId)
-    return item
-  })
-  if (res && res.data && res.data.length > 0) {
-    state.viewTreeData = filterTree(listToTree(cloneDeep(res.data)), state.filter.name, {
-      filterWhere: (item: any, keyword: string) => {
-        return item.label?.toLocaleLowerCase().indexOf(keyword) > -1 || item.path?.toLocaleLowerCase().indexOf(keyword) > -1
-      },
-    })
-  } else {
-    state.viewTreeData = []
-    state.formViewTreeData = []
-  }
-  state.loading = false
-}
-
-const onAdd = () => {
-  state.viewFormTitle = '新增视图'
-  viewFormRef.value.open(state.filter.app)
-}
-
-const onEdit = (row: OauthView) => {
-  state.viewFormTitle = '编辑视图'
-  viewFormRef.value.open(state.filter.app,row)
-}
-
-const onDelete = (row: OauthView) => {
-  proxy.$modal
-    .confirmDelete(`确定要删除视图【${row.label}】?`)
-    .then(async () => {
-      await new PermissionApi().viewDelete({ id: row.id }, { loading: true })
-      onQuery()
-    })
-    .catch(() => {})
-}
-</script>
-
-<style scoped lang="scss"></style>
+<template>
+  <div class="my-layout">
+    <el-card class="mt8" shadow="never" :body-style="{ paddingBottom: '0' }">
+      <el-form :model="state.filter" :inline="true" @submit.stop.prevent>
+        <el-form-item label="应用">
+          <el-input v-model="state.filter.app" disabled placeholder="请选择应用" @keyup.enter="onQuery" />
+        </el-form-item>
+        <el-form-item label="视图名称">
+          <el-input v-model="state.filter.name" placeholder="视图名称" @keyup.enter="onQuery" />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
+          <el-button v-auth="'api:admin:view:add'" type="primary" icon="ele-Plus" @click="onAdd"> 新增 </el-button>
+        </el-form-item>
+      </el-form>
+    </el-card>
+
+    <el-card class="my-fill mt8" shadow="never">
+      <el-table
+        :data="state.viewTreeData"
+        style="width: 100%"
+        v-loading="state.loading"
+        row-key="id"
+        default-expand-all
+        :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
+      >
+        <el-table-column prop="label" label="视图名称" min-width="120" show-overflow-tooltip />
+        <!-- <el-table-column prop="name" label="视图命名" min-width="120" show-overflow-tooltip /> -->
+        <el-table-column prop="path" label="视图地址" min-width="120" show-overflow-tooltip />
+        <el-table-column prop="sort" label="排序" width="80" align="center" show-overflow-tooltip />
+        <!-- <el-table-column prop="description" label="视图描述" min-width="120" show-overflow-tooltip /> -->
+        <!-- <el-table-column label="状态" width="80" align="center" show-overflow-tooltip>
+          <template #default="{ row }">
+            <el-tag type="success" v-if="row.enabled">启用</el-tag>
+            <el-tag type="danger" v-else>禁用</el-tag>
+          </template>
+        </el-table-column> -->
+        <el-table-column label="操作" width="160" fixed="right" header-align="center" align="center">
+          <template #default="{ row }">
+            <el-button v-auth="'api:admin:view:update'" icon="ele-EditPen" text type="primary" @click="onEdit(row)">编辑</el-button>
+            <el-button v-auth="'api:admin:view:delete'" icon="ele-Delete" text type="danger" @click="onDelete(row)">删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-card>
+
+    <view-form ref="viewFormRef" :title="state.viewFormTitle" :view-tree-data="state.viewTreeData"></view-form>
+  </div>
+</template>
+
+<script lang="ts" setup name="admin/view">
+import router from "/@/router";
+import { ref, reactive, onMounted, getCurrentInstance, onBeforeMount, defineAsyncComponent } from 'vue'
+import { OauthView,OauthApply } from '/@/api/admin/data-contracts'
+import { ViewApi } from '/@/api/admin/View'
+import { listToTree, filterTree } from '/@/utils/tree'
+import { cloneDeep } from 'lodash-es'
+import { PermissionApi } from '/@/api/admin/Permission'
+import eventBus from '/@/utils/mitt'
+
+// 引入组件
+const ViewForm = defineAsyncComponent(() => import('./components/view-form.vue'))
+
+const viewFormRef = ref()
+const { proxy } = getCurrentInstance() as any
+
+const state = reactive({
+  loading: false,
+  viewFormTitle: '',
+  filter: {
+    name: '',
+    app:''
+  },
+  viewTreeData: [] as Array<OauthView>,
+  formViewTreeData: [] as Array<OauthView>
+})
+
+onMounted(() => {
+  onQuery()
+  eventBus.off('refreshView')
+  eventBus.on('refreshView', async () => {
+    onQuery()
+  })
+})
+
+onBeforeMount(() => {
+  eventBus.off('refreshView')
+})
+
+const onQuery = async () => {
+  state.loading = true
+  const name = router.currentRoute.value.params.id
+  const appData=await new PermissionApi().getApplyInfo({Name:name})
+  state.filter.app=appData.data[0].name
+  const res = await new PermissionApi().getViewInfo({appid:appData.data[0].id,label:state.filter.name}).catch(() => {
+    state.loading = false
+  })
+  res.data=res.data.map((item)=>{
+    if(item.parentId===''||item.parentId===null){
+      item.parentId=Number('0')
+      item.type=1
+    }
+    item.parentId=Number(item.parentId)
+    return item
+  })
+  if (res && res.data && res.data.length > 0) {
+    state.viewTreeData = filterTree(listToTree(cloneDeep(res.data)), state.filter.name, {
+      filterWhere: (item: any, keyword: string) => {
+        return item.label?.toLocaleLowerCase().indexOf(keyword) > -1 || item.path?.toLocaleLowerCase().indexOf(keyword) > -1
+      },
+    })
+  } else {
+    state.viewTreeData = []
+    state.formViewTreeData = []
+  }
+  state.loading = false
+}
+
+const onAdd = () => {
+  state.viewFormTitle = '新增视图'
+  viewFormRef.value.open(state.filter.app)
+}
+
+const onEdit = (row: OauthView) => {
+  state.viewFormTitle = '编辑视图'
+  viewFormRef.value.open(state.filter.app,row)
+}
+
+const onDelete = (row: OauthView) => {
+  proxy.$modal
+    .confirmDelete(`确定要删除视图【${row.label}】?`)
+    .then(async () => {
+      await new PermissionApi().viewDelete({ id: row.id }, { loading: true })
+      onQuery()
+    })
+    .catch(() => {})
+}
+</script>
+
+<style scoped lang="scss"></style>