From 0ae696c2e872fa90feba0c5df9a92391c02d3e0b Mon Sep 17 00:00:00 2001 From: haoxr <1490493387@qq.com> Date: Tue, 8 Nov 2022 22:53:42 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20API=E7=B1=BB=E5=9E=8B=E5=A3=B0?= =?UTF-8?q?=E6=98=8E=E4=BC=98=E5=8C=96=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/{auth.ts => auth/index.ts} | 20 ++- src/api/auth/types.ts | 32 +++++ src/api/{dept.ts => dept/index.ts} | 15 +- .../api/dept.d.ts => api/dept/types.ts} | 15 +- src/api/{dict.ts => dict/index.ts} | 35 +++-- .../api/dict.d.ts => api/dict/types.ts} | 20 ++- src/api/{menu.ts => menu/index.ts} | 20 +-- .../api/menu.d.ts => api/menu/types.ts} | 8 +- src/api/{role.ts => role/index.ts} | 21 +-- .../api/role.d.ts => api/role/types.ts} | 24 ++-- src/api/{user.ts => user/index.ts} | 15 +- .../api/user.d.ts => api/user/types.ts} | 27 +--- src/store/modules/app.ts | 2 +- src/store/modules/permission.ts | 2 +- src/store/modules/settings.ts | 2 +- src/store/modules/tagsView.ts | 2 +- src/store/modules/types.ts | 41 ++++++ src/store/modules/user.ts | 18 ++- src/types/api/base.d.ts | 9 -- src/types/api/perm.d.ts | 37 ----- src/types/common.d.ts | 17 --- src/types/store/app.d.ts | 12 -- src/types/store/permission.d.ts | 7 - src/types/store/setting.d.ts | 10 -- src/types/store/tagsview.d.ts | 13 -- src/types/store/user.d.ts | 7 - src/utils/request.ts | 52 +++---- src/views/login/index.vue | 4 +- src/views/system/dept/index.vue | 55 ++++---- src/views/system/dict/components/DictItem.vue | 39 +++--- src/views/system/dict/components/DictType.vue | 28 ++-- src/views/system/menu/index.vue | 63 +++++---- src/views/system/role/index.vue | 125 +++++++++-------- src/views/system/user/index.vue | 132 ++++++++---------- types/components.d.ts | 9 ++ types/env.d.ts | 19 +++ types/global.d.ts | 13 ++ types/index.d.ts | 11 ++ 38 files changed, 468 insertions(+), 513 deletions(-) rename src/api/{auth.ts => auth/index.ts} (52%) create mode 100644 src/api/auth/types.ts rename src/api/{dept.ts => dept/index.ts} (67%) rename src/{types/api/dept.d.ts => api/dept/types.ts} (62%) rename src/api/{dict.ts => dict/index.ts} (81%) rename src/{types/api/dict.d.ts => api/dict/types.ts} (71%) rename src/api/{menu.ts => menu/index.ts} (77%) rename src/{types/api/menu.d.ts => api/menu/types.ts} (91%) rename src/api/{role.ts => role/index.ts} (82%) rename src/{types/api/role.d.ts => api/role/types.ts} (52%) rename src/api/{user.ts => user/index.ts} (88%) rename src/{types/api/user.d.ts => api/user/types.ts} (65%) create mode 100644 src/store/modules/types.ts delete mode 100644 src/types/api/base.d.ts delete mode 100644 src/types/api/perm.d.ts delete mode 100644 src/types/common.d.ts delete mode 100644 src/types/store/app.d.ts delete mode 100644 src/types/store/permission.d.ts delete mode 100644 src/types/store/setting.d.ts delete mode 100644 src/types/store/tagsview.d.ts delete mode 100644 src/types/store/user.d.ts create mode 100644 types/components.d.ts create mode 100644 types/env.d.ts create mode 100644 types/global.d.ts create mode 100644 types/index.d.ts diff --git a/src/api/auth.ts b/src/api/auth/index.ts similarity index 52% rename from src/api/auth.ts rename to src/api/auth/index.ts index f52d841..f859aa2 100644 --- a/src/api/auth.ts +++ b/src/api/auth/index.ts @@ -1,11 +1,13 @@ import request from '@/utils/request'; import { AxiosPromise } from 'axios'; -import { LoginFormData } from '@/types/api/user'; +import { LoginForm, VerifyCode } from './types'; /** - * 登录 + * + * @param data {LoginForm} + * @returns */ -export function login(data: LoginFormData): AxiosPromise { +export function loginApi(data: LoginForm): AxiosPromise { return request({ url: '/api/v1/auth/login', method: 'post', @@ -19,9 +21,19 @@ export function login(data: LoginFormData): AxiosPromise { /** * 注销 */ -export function logout() { +export function logoutApi() { return request({ url: '/api/v1/auth/logout', method: 'delete' }); } + +/** + * 获取图片验证码 + */ +export function getCaptcha(): AxiosPromise { + return request({ + url: '/captcha?t=' + new Date().getTime().toString(), + method: 'get' + }); +} diff --git a/src/api/auth/types.ts b/src/api/auth/types.ts new file mode 100644 index 0000000..16eba5a --- /dev/null +++ b/src/api/auth/types.ts @@ -0,0 +1,32 @@ +/** + * 登录表单类型声明 + */ +export interface LoginForm { + username: string; + password: string; + grant_type: string; + /** + * 验证码Code + */ + //verifyCode: string; + /** + * 验证码Code服务端缓存key(UUID) + */ + // verifyCodeKey: string; +} + +/** + * 登录响应类型声明 + */ +export interface LoginResult { + access_token: string; + token_type: string; +} + +/** + * 验证码类型声明 + */ +export interface VerifyCode { + verifyCodeImg: string; + verifyCodeKey: string; +} diff --git a/src/api/dept.ts b/src/api/dept/index.ts similarity index 67% rename from src/api/dept.ts rename to src/api/dept/index.ts index 0333789..510924e 100644 --- a/src/api/dept.ts +++ b/src/api/dept/index.ts @@ -1,16 +1,13 @@ -import { DeptFormData, DeptItem, DeptQueryParam } from '@/types/api/dept'; -import { Option } from '@/types/common'; import request from '@/utils/request'; import { AxiosPromise } from 'axios'; +import { DeptForm, DeptQuery, Dept } from './types'; /** * 部门树形表格 * * @param queryParams */ -export function listDepartments( - queryParams?: DeptQueryParam -): AxiosPromise { +export function listDepartments(queryParams?: DeptQuery): AxiosPromise { return request({ url: '/api/v1/dept', method: 'get', @@ -21,7 +18,7 @@ export function listDepartments( /** * 部门下拉列表 */ -export function listDeptOptions(): AxiosPromise { +export function listDeptOptions(): AxiosPromise { return request({ url: '/api/v1/dept/options', method: 'get' @@ -33,7 +30,7 @@ export function listDeptOptions(): AxiosPromise { * * @param id */ -export function getDeptForm(id: string): AxiosPromise { +export function getDeptForm(id: string): AxiosPromise { return request({ url: '/api/v1/dept/' + id + '/form', method: 'get' @@ -45,7 +42,7 @@ export function getDeptForm(id: string): AxiosPromise { * * @param data */ -export function addDept(data: DeptFormData) { +export function addDept(data: DeptForm) { return request({ url: '/api/v1/dept', method: 'post', @@ -59,7 +56,7 @@ export function addDept(data: DeptFormData) { * @param id * @param data */ -export function updateDept(id: string, data: DeptFormData) { +export function updateDept(id: string, data: DeptForm) { return request({ url: '/api/v1/dept/' + id, method: 'put', diff --git a/src/types/api/dept.d.ts b/src/api/dept/types.ts similarity index 62% rename from src/types/api/dept.d.ts rename to src/api/dept/types.ts index 82e7cd1..b99f819 100644 --- a/src/types/api/dept.d.ts +++ b/src/api/dept/types.ts @@ -1,16 +1,15 @@ /** - * 部门查询参数类型声明 + * 部门查询参数 */ -export interface DeptQueryParam { +export interface DeptQuery { keywords: string | undefined; status: number | undefined; } /** - * 部门列表项声明 + * 部门类型 */ - -export interface DeptItem { +export interface Dept { id: string; name: string; parentId: string; @@ -20,13 +19,13 @@ export interface DeptItem { leader?: string; mobile?: string; email?: string; - children: DeptItem[]; + children: Dept[]; } /** - * 部门表单类型声明 + * 部门表单类型 */ -export interface DeptFormData { +export interface DeptForm { id?: string; parentId: string; name: string; diff --git a/src/api/dict.ts b/src/api/dict/index.ts similarity index 81% rename from src/api/dict.ts rename to src/api/dict/index.ts index dbb999a..1e66dc3 100644 --- a/src/api/dict.ts +++ b/src/api/dict/index.ts @@ -1,14 +1,13 @@ -import { Option } from '@/types/common'; -import { - DictTypeFormData, - DictItemFormData, - DictItemPageResult, - DictItemQueryParam, - DictPageResult, - DictQueryParam -} from '@/types/api/dict'; import request from '@/utils/request'; import { AxiosPromise } from 'axios'; +import { + DictQuery, + DictPageResult, + DictTypeForm, + DictItemQuery, + DictItemPageResult, + DictItemForm +} from './types'; /** * 获取字典类型分页列表 @@ -16,7 +15,7 @@ import { AxiosPromise } from 'axios'; * @param queryParams */ export function listDictTypePages( - queryParams: DictQueryParam + queryParams: DictQuery ): AxiosPromise { return request({ url: '/api/v1/dict/types/pages', @@ -30,7 +29,7 @@ export function listDictTypePages( * * @param id */ -export function getDictTypeForm(id: number): AxiosPromise { +export function getDictTypeForm(id: number): AxiosPromise { return request({ url: '/api/v1/dict/types/' + id + '/form', method: 'get' @@ -42,7 +41,7 @@ export function getDictTypeForm(id: number): AxiosPromise { * * @param data */ -export function addDictType(data: DictTypeFormData) { +export function addDictType(data: DictTypeForm) { return request({ url: '/api/v1/dict/types', method: 'post', @@ -56,7 +55,7 @@ export function addDictType(data: DictTypeFormData) { * @param id * @param data */ -export function updateDictType(id: number, data: DictTypeFormData) { +export function updateDictType(id: number, data: DictTypeForm) { return request({ url: '/api/v1/dict/types/' + id, method: 'put', @@ -81,7 +80,7 @@ export function deleteDictTypes(ids: string) { */ export function listDictItemsByTypeCode( typeCode: string -): AxiosPromise { +): AxiosPromise { return request({ url: '/api/v1/dict/types/' + typeCode + '/items', method: 'get' @@ -92,7 +91,7 @@ export function listDictItemsByTypeCode( * 获取字典项分页列表 */ export function listDictItemPages( - queryParams: DictItemQueryParam + queryParams: DictItemQuery ): AxiosPromise { return request({ url: '/api/v1/dict/items/pages', @@ -106,7 +105,7 @@ export function listDictItemPages( * * @param id */ -export function getDictItemData(id: number): AxiosPromise { +export function getDictItemData(id: number): AxiosPromise { return request({ url: '/api/v1/dict/items/' + id + '/form', method: 'get' @@ -118,7 +117,7 @@ export function getDictItemData(id: number): AxiosPromise { * * @param data */ -export function saveDictItem(data: DictItemFormData) { +export function saveDictItem(data: DictItemForm) { return request({ url: '/api/v1/dict/items', method: 'post', @@ -132,7 +131,7 @@ export function saveDictItem(data: DictItemFormData) { * @param id * @param data */ -export function updateDictItem(id: number, data: DictItemFormData) { +export function updateDictItem(id: number, data: DictItemForm) { return request({ url: '/api/v1/dict/items/' + id, method: 'put', diff --git a/src/types/api/dict.d.ts b/src/api/dict/types.ts similarity index 71% rename from src/types/api/dict.d.ts rename to src/api/dict/types.ts index 3f781b6..3e301f2 100644 --- a/src/types/api/dict.d.ts +++ b/src/api/dict/types.ts @@ -1,17 +1,15 @@ -import { PageQueryParam, PageResult } from './base'; - /** - * 字典查询参数类型声明 + * 字典查询参数 */ -export interface DictQueryParam extends PageQueryParam { +export interface DictQuery extends PageQuery { /** * 字典名称 */ - name: string | undefined; + name?: string; } /** - * 字典分页列表项声明 + * 字典类型 */ export interface Dict { id: number; @@ -29,7 +27,7 @@ export type DictPageResult = PageResult; /** * 字典表单类型声明 */ -export interface DictTypeFormData { +export interface DictTypeForm { id: number | undefined; name: string; code: string; @@ -40,7 +38,7 @@ export interface DictTypeFormData { /** * 字典项查询参数类型声明 */ -export interface DictItemQueryParam extends PageQueryParam { +export interface DictItemQuery extends PageQuery { /** * 字典项名称 */ @@ -52,13 +50,13 @@ export interface DictItemQueryParam extends PageQueryParam { } /** - * 字典分页列表项声明 + * 字典数据项类型 */ export interface DictItem { id: number; name: string; value: string; - dictCode: string; + typeCode: string; sort: number; status: number; defaulted: number; @@ -73,7 +71,7 @@ export type DictItemPageResult = PageResult; /** * 字典表单类型声明 */ -export interface DictItemFormData { +export interface DictItemForm { id?: number; typeCode?: string; typeName?: string; diff --git a/src/api/menu.ts b/src/api/menu/index.ts similarity index 77% rename from src/api/menu.ts rename to src/api/menu/index.ts index 04eecaa..baffdc8 100644 --- a/src/api/menu.ts +++ b/src/api/menu/index.ts @@ -1,12 +1,6 @@ -import { - MenuFormData, - MenuItem, - MenuQueryParam, - Resource -} from '@/types/api/menu'; -import { Option } from '@/types/common'; import request from '@/utils/request'; import { AxiosPromise } from 'axios'; +import { MenuQuery, Menu, Resource, MenuForm } from './types'; /** * 获取路由列表 @@ -23,9 +17,7 @@ export function listRoutes() { * * @param queryParams */ -export function listMenus( - queryParams: MenuQueryParam -): AxiosPromise { +export function listMenus(queryParams: MenuQuery): AxiosPromise { return request({ url: '/api/v1/menus', method: 'get', @@ -36,7 +28,7 @@ export function listMenus( /** * 获取菜单下拉树形列表 */ -export function listMenuOptions(): AxiosPromise { +export function listMenuOptions(): AxiosPromise { return request({ url: '/api/v1/menus/options', method: 'get' @@ -57,7 +49,7 @@ export function listResources(): AxiosPromise { * 获取菜单详情 * @param id */ -export function getMenuDetail(id: string): AxiosPromise { +export function getMenuDetail(id: string): AxiosPromise { return request({ url: '/api/v1/menus/' + id, method: 'get' @@ -69,7 +61,7 @@ export function getMenuDetail(id: string): AxiosPromise { * * @param data */ -export function addMenu(data: MenuFormData) { +export function addMenu(data: MenuForm) { return request({ url: '/api/v1/menus', method: 'post', @@ -83,7 +75,7 @@ export function addMenu(data: MenuFormData) { * @param id * @param data */ -export function updateMenu(id: string, data: MenuFormData) { +export function updateMenu(id: string, data: MenuForm) { return request({ url: '/api/v1/menus/' + id, method: 'put', diff --git a/src/types/api/menu.d.ts b/src/api/menu/types.ts similarity index 91% rename from src/types/api/menu.d.ts rename to src/api/menu/types.ts index b31cbc4..8de7056 100644 --- a/src/types/api/menu.d.ts +++ b/src/api/menu/types.ts @@ -1,7 +1,7 @@ /** * 菜单查询参数类型声明 */ -export interface MenuQueryParam { +export interface MenuQuery { keywords?: string; } @@ -9,7 +9,7 @@ export interface MenuQueryParam { * 菜单分页列表项声明 */ -export interface MenuItem { +export interface Menu { id?: number; parentId: number; type?: string | 'CATEGORY' | 'MENU' | 'EXTLINK'; @@ -20,13 +20,13 @@ export interface MenuItem { component: string; sort: number; visible: number; - children: MenuItem[]; + children: Menu[]; } /** * 菜单表单类型声明 */ -export interface MenuFormData { +export interface MenuForm { /** * 菜单ID */ diff --git a/src/api/role.ts b/src/api/role/index.ts similarity index 82% rename from src/api/role.ts rename to src/api/role/index.ts index d4daca9..f900a7d 100644 --- a/src/api/role.ts +++ b/src/api/role/index.ts @@ -1,13 +1,6 @@ -import { - RoleFormData, - RolePageResult, - RoleQueryParam, - RoleResource -} from '@/types/api/role'; - -import { Option } from '@/types/common'; import request from '@/utils/request'; import { AxiosPromise } from 'axios'; +import { RoleQuery, RolePageResult, RoleForm } from './types'; /** * 获取角色分页数据 @@ -15,7 +8,7 @@ import { AxiosPromise } from 'axios'; * @param queryParams */ export function listRolePages( - queryParams?: RoleQueryParam + queryParams?: RoleQuery ): AxiosPromise { return request({ url: '/api/v1/roles/pages', @@ -30,8 +23,8 @@ export function listRolePages( * @param queryParams */ export function listRoleOptions( - queryParams?: RoleQueryParam -): AxiosPromise { + queryParams?: RoleQuery +): AxiosPromise { return request({ url: '/api/v1/roles/options', method: 'get', @@ -72,7 +65,7 @@ export function updateRoleMenus( * * @param id */ -export function getRoleFormDetail(id: number): AxiosPromise { +export function getRoleFormDetail(id: number): AxiosPromise { return request({ url: '/api/v1/roles/' + id, method: 'get' @@ -84,7 +77,7 @@ export function getRoleFormDetail(id: number): AxiosPromise { * * @param data */ -export function addRole(data: RoleFormData) { +export function addRole(data: RoleForm) { return request({ url: '/api/v1/roles', method: 'post', @@ -98,7 +91,7 @@ export function addRole(data: RoleFormData) { * @param id * @param data */ -export function updateRole(id: number, data: RoleFormData) { +export function updateRole(id: number, data: RoleForm) { return request({ url: '/api/v1/roles/' + id, method: 'put', diff --git a/src/types/api/role.d.ts b/src/api/role/types.ts similarity index 52% rename from src/types/api/role.d.ts rename to src/api/role/types.ts index 1eca5aa..c78f2fc 100644 --- a/src/types/api/role.d.ts +++ b/src/api/role/types.ts @@ -1,16 +1,14 @@ -import { PageQueryParam, PageResult } from './base'; - /** * 角色查询参数类型 */ -export interface RoleQueryParam extends PageQueryParam { +export interface RoleQuery extends PageQuery { keywords?: string; } /** * 角色分页列表项 */ -export interface RoleItem { +export interface Role { id: string; name: string; code: string; @@ -24,23 +22,19 @@ export interface RoleItem { /** * 角色分页项类型 */ -export type RolePageResult = PageResult; +export type RolePageResult = PageResult; /** * 角色表单类型 */ -export interface RoleFormData { - id: string | undefined; +export interface RoleForm { + id?: string; name: string; code: string; sort: number; status: number; -} - -/** - * - */ -export interface RoleResource { - menuIds: string[]; - permIds: string[]; + /** + * 数据权限 + */ + dataScope: number; } diff --git a/src/api/user.ts b/src/api/user/index.ts similarity index 88% rename from src/api/user.ts rename to src/api/user/index.ts index a71ed1f..7f4c48a 100644 --- a/src/api/user.ts +++ b/src/api/user/index.ts @@ -1,11 +1,6 @@ import request from '@/utils/request'; import { AxiosPromise } from 'axios'; -import { - UserFormData, - UserInfo, - UserPageResult, - UserQueryParam -} from '@/types/api/user'; +import { UserForm, UserInfo, UserPageResult, UserQuery } from './types'; /** * 登录成功后获取用户信息(昵称、头像、权限集合和角色集合) @@ -23,7 +18,7 @@ export function getUserInfo(): AxiosPromise { * @param queryParams */ export function listUserPages( - queryParams: UserQueryParam + queryParams: UserQuery ): AxiosPromise { return request({ url: '/api/v1/users/pages', @@ -37,7 +32,7 @@ export function listUserPages( * * @param userId */ -export function getUserFormData(userId: number): AxiosPromise { +export function getUserForm(userId: number): AxiosPromise { return request({ url: '/api/v1/users/' + userId + '/form', method: 'get' @@ -63,7 +58,7 @@ export function addUser(data: any) { * @param id * @param data */ -export function updateUser(id: number, data: UserFormData) { +export function updateUser(id: number, data: UserForm) { return request({ url: '/api/v1/users/' + id, method: 'put', @@ -130,7 +125,7 @@ export function downloadTemplate() { * @param queryParams * @returns */ -export function exportUser(queryParams: UserQueryParam) { +export function exportUser(queryParams: UserQuery) { return request({ url: '/api/v1/users/_export', method: 'get', diff --git a/src/types/api/user.d.ts b/src/api/user/types.ts similarity index 65% rename from src/types/api/user.d.ts rename to src/api/user/types.ts index dfab0ca..486244c 100644 --- a/src/types/api/user.d.ts +++ b/src/api/user/types.ts @@ -1,22 +1,3 @@ -import { PageQueryParam, PageResult } from './base'; - -/** - * 登录表单 - */ -export interface LoginFormData { - username: string; - password: string; - grant_type: string; -} - -/** - * 登录响应 - */ -export interface LoginResponseData { - access_token: string; - token_type: string; -} - /** * 登录用户信息 */ @@ -30,7 +11,7 @@ export interface UserInfo { /** * 用户查询参数 */ -export interface UserQueryParam extends PageQueryParam { +export interface UserQuery extends PageQuery { keywords: string; status: number; deptId: number; @@ -39,7 +20,7 @@ export interface UserQueryParam extends PageQueryParam { /** * 用户分页列表项声明 */ -export interface UserItem { +export interface UserType { id: string; username: string; nickname: string; @@ -56,12 +37,12 @@ export interface UserItem { /** * 用户分页项类型声明 */ -export type UserPageResult = PageResult; +export type UserPageResult = PageResult; /** * 用户表单类型声明 */ -export interface UserFormData { +export interface UserForm { id: number | undefined; deptId: number; username: string; diff --git a/src/store/modules/app.ts b/src/store/modules/app.ts index 064d386..05babc5 100644 --- a/src/store/modules/app.ts +++ b/src/store/modules/app.ts @@ -1,4 +1,4 @@ -import { AppState } from '@/types/store/app'; +import { AppState } from './types'; import { localStorage } from '@/utils/storage'; import { defineStore } from 'pinia'; import { getLanguage } from '@/lang/index'; diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts index e8ec2df..457dbf8 100644 --- a/src/store/modules/permission.ts +++ b/src/store/modules/permission.ts @@ -1,4 +1,4 @@ -import { PermissionState } from '@/types/store/permission'; +import { PermissionState } from './types'; import { RouteRecordRaw } from 'vue-router'; import { defineStore } from 'pinia'; import { constantRoutes } from '@/router'; diff --git a/src/store/modules/settings.ts b/src/store/modules/settings.ts index 43ffbe1..7c9acc6 100644 --- a/src/store/modules/settings.ts +++ b/src/store/modules/settings.ts @@ -1,5 +1,5 @@ import { defineStore } from 'pinia'; -import { SettingState } from '@/types/store/setting'; +import { SettingState } from './types'; import defaultSettings from '../../settings'; import { localStorage } from '@/utils/storage'; diff --git a/src/store/modules/tagsView.ts b/src/store/modules/tagsView.ts index 77c553e..cdd14e7 100644 --- a/src/store/modules/tagsView.ts +++ b/src/store/modules/tagsView.ts @@ -1,5 +1,5 @@ import { defineStore } from 'pinia'; -import { TagsViewState } from '@/types/store/tagsview'; +import { TagsViewState } from './types'; const useTagsViewStore = defineStore({ id: 'tagsView', diff --git a/src/store/modules/types.ts b/src/store/modules/types.ts new file mode 100644 index 0000000..a03d4cc --- /dev/null +++ b/src/store/modules/types.ts @@ -0,0 +1,41 @@ +import { RouteLocationNormalized, RouteRecordRaw } from 'vue-router'; + +export interface AppState { + device: string; + sidebar: { + opened: boolean; + withoutAnimation: boolean; + }; + language: string; + size: string; +} + +export interface PermissionState { + routes: RouteRecordRaw[]; + addRoutes: RouteRecordRaw[]; +} + +export interface SettingState { + theme: string; + tagsView: boolean; + fixedHeader: boolean; + showSettings: boolean; + sidebarLogo: boolean; +} + +export interface UserState { + token: string; + nickname: string; + avatar: string; + roles: string[]; + perms: string[]; +} + +export interface TagView extends Partial { + title?: string; +} + +export interface TagsViewState { + visitedViews: TagView[]; + cachedViews: string[]; +} diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts index 87674c1..cf22d04 100644 --- a/src/store/modules/user.ts +++ b/src/store/modules/user.ts @@ -1,12 +1,11 @@ import { defineStore } from 'pinia'; -import { LoginFormData } from '@/types/api/user'; -import { UserState } from '@/types/store/user'; +import { UserState } from './types'; import { localStorage } from '@/utils/storage'; -import { login, logout } from '@/api/auth'; +import { loginApi, logoutApi } from '@/api/auth'; import { getUserInfo } from '@/api/user'; - import { resetRouter } from '@/router'; +import { LoginForm } from '@/api/auth/types'; const useUserStore = defineStore({ id: 'user', @@ -22,12 +21,12 @@ const useUserStore = defineStore({ this.$reset(); }, /** - * 登录 login + * 登录 */ - login(loginData: LoginFormData) { - const { username, password } = loginData; + login(data: LoginForm) { + const { username, password } = data; return new Promise((resolve, reject) => { - login({ + loginApi({ grant_type: 'password', username: username.trim(), password: password @@ -65,7 +64,6 @@ const useUserStore = defineStore({ resolve(data); }) .catch(error => { - console.log('error', error); reject(error); }); }); @@ -76,7 +74,7 @@ const useUserStore = defineStore({ */ logout() { return new Promise((resolve, reject) => { - logout() + logoutApi() .then(() => { localStorage.remove('token'); this.RESET_STATE(); diff --git a/src/types/api/base.d.ts b/src/types/api/base.d.ts deleted file mode 100644 index 874d2d5..0000000 --- a/src/types/api/base.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface PageQueryParam { - pageNum: number; - pageSize: number; -} - -export interface PageResult { - list: T; - total: number; -} diff --git a/src/types/api/perm.d.ts b/src/types/api/perm.d.ts deleted file mode 100644 index d6ede34..0000000 --- a/src/types/api/perm.d.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { PageQueryParam, PageResult } from './base'; - -/** - * 权限查询参数类型声明 - */ -export interface PermQueryParam extends PageQueryParam { - menuId: any; - name: string | undefined; -} - -/** - * 权限分页列表项声明 - */ -export interface PermItem { - id: number; - name: string; - menuId: string; - urlPerm: string; - btnPerm: string; - roles?: string[]; -} - -/** - * 权限分页项类型声明 - */ -export type PermPageResult = PageResult; - -/** - * 权限表单类型声明 - */ -export interface PermFormData { - id: number | undefined; - name: string; - urlPerm: string; - btnPerm: string; - menuId: string; -} diff --git a/src/types/common.d.ts b/src/types/common.d.ts deleted file mode 100644 index c2c55b7..0000000 --- a/src/types/common.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * 弹窗类型 - */ -export interface Dialog { - title: string; - visible: boolean; -} - -/** - * 通用组件选择项类型 - */ -export interface Option { - value: string; - label: string; - checked?: boolean; - children?: Option[]; -} diff --git a/src/types/store/app.d.ts b/src/types/store/app.d.ts deleted file mode 100644 index 569fcf9..0000000 --- a/src/types/store/app.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * 系统类型声明 - */ - export interface AppState { - device: string; - sidebar: { - opened: boolean; - withoutAnimation: boolean; - }; - language: string; - size: string; -} diff --git a/src/types/store/permission.d.ts b/src/types/store/permission.d.ts deleted file mode 100644 index c0ec4dc..0000000 --- a/src/types/store/permission.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * 权限类型声明 - */ - export interface PermissionState { - routes: RouteRecordRaw[]; - addRoutes: RouteRecordRaw[]; -} diff --git a/src/types/store/setting.d.ts b/src/types/store/setting.d.ts deleted file mode 100644 index e83734d..0000000 --- a/src/types/store/setting.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * 设置状态类型声明 - */ - export interface SettingState { - theme: string; - tagsView: boolean; - fixedHeader: boolean; - showSettings: boolean; - sidebarLogo: boolean; -} diff --git a/src/types/store/tagsview.d.ts b/src/types/store/tagsview.d.ts deleted file mode 100644 index ce38807..0000000 --- a/src/types/store/tagsview.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { RouteLocationNormalized } from 'vue-router'; - -/** - * 标签状态类型声明 - */ -export interface TagView extends Partial { - title?: string; -} - -export interface TagsViewState { - visitedViews: TagView[]; - cachedViews: string[]; -} diff --git a/src/types/store/user.d.ts b/src/types/store/user.d.ts deleted file mode 100644 index 698c744..0000000 --- a/src/types/store/user.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface UserState { - token: string; - nickname: string; - avatar: string; - roles: string[]; - perms: string[]; -} diff --git a/src/utils/request.ts b/src/utils/request.ts index b2a9a39..ae1f1ce 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -7,7 +7,7 @@ import useStore from '@/store'; const service = axios.create({ baseURL: import.meta.env.VITE_APP_BASE_API, timeout: 50000, - headers: { 'Content-Type': 'application/json;charset=utf-8' } + headers: { 'Content-Type': 'application/json;charset=utf-8' }, }); // 请求拦截器 @@ -24,7 +24,7 @@ service.interceptors.request.use( } return config; }, - error => { + (error: any) => { return Promise.reject(error); } ); @@ -33,36 +33,36 @@ service.interceptors.request.use( service.interceptors.response.use( (response: AxiosResponse) => { const { code, msg } = response.data; - if (code) { - // 有状态码判断是否为00000,除此皆为异常响应 - if (code === '00000') { - return response.data; - } else { - ElMessage({ - message: response.data.msg || '系统出错', - type: 'error' - }); - return Promise.reject(new Error(msg || 'Error')); + if (code === '00000') { + return response.data; + } else { + // 响应数据为二进制流处理(Excel导出) + if (response.data instanceof ArrayBuffer) { + return response; } - } else { - // 无状态码响应直接返回 - console.log('response', response); - return response; - } - }, - error => { - const { code, msg } = error.response.data; - if (code === 'A0230') { - // token 过期 - localStorage.clear(); // 清除浏览器全部缓存 - ElMessageBox.alert('当前页面已失效,请重新登录', '提示', {}); - } else { + ElMessage({ message: msg || '系统出错', - type: 'error' + type: 'error', }); return Promise.reject(new Error(msg || 'Error')); } + }, + (error: any) => { + if (error.response.data) { + const { code } = error.response.data; + // token 过期,重新登录 + if (code === 'A0230') { + ElMessageBox.confirm('当前页面已失效,请重新登录', 'Warning', { + confirmButtonText: 'OK', + type: 'warning', + }).then(() => { + localStorage.clear(); + window.location.href = '/'; + }); + } + } + return Promise.reject(error.message); } ); diff --git a/src/views/login/index.vue b/src/views/login/index.vue index af75d52..1b3b214 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -99,7 +99,7 @@ import useStore from '@/store'; // API依赖 import { useRoute } from 'vue-router'; -import { LoginFormData } from '@/types/api/user'; +import { LoginForm } from '@/api/auth/types'; const { user } = useStore(); const route = useRoute(); @@ -112,7 +112,7 @@ const state = reactive({ loginForm: { username: 'admin', password: '123456' - } as LoginFormData, + } as LoginForm, loginRules: { username: [{ required: true, trigger: 'blur' }], password: [{ required: true, trigger: 'blur', validator: validatePassword }] diff --git a/src/views/system/dept/index.vue b/src/views/system/dept/index.vue index f534556..eb52ab8 100644 --- a/src/views/system/dept/index.vue +++ b/src/views/system/dept/index.vue @@ -1,6 +1,6 @@ @@ -13,13 +13,12 @@ import { updateDept, addDept, listDeptOptions, - listDepartments + listDepartments, } from '@/api/dept'; -import { Search, Plus, Edit, Refresh, Delete } from '@element-plus/icons-vue'; +import { Search, Plus, Refresh, Delete } from '@element-plus/icons-vue'; import { ElForm, ElMessage, ElMessageBox } from 'element-plus'; -import { DeptFormData, DeptItem, DeptQueryParam } from '@/types/api/dept'; -import { Dialog, Option } from '@/types/common'; +import { Dept, DeptForm, DeptQuery } from '@/api/dept/types'; const queryFormRef = ref(ElForm); const dataFormRef = ref(ElForm); @@ -29,21 +28,21 @@ const state = reactive({ // 选中ID数组 ids: [] as number[], // 表格树数据 - dataList: [] as DeptItem[], - deptOptions: [] as Option[], - dialog: { visible: false } as Dialog, - queryParams: {} as DeptQueryParam, + dataList: [] as Dept[], + deptOptions: [] as OptionType[], + dialog: { visible: false } as DialogType, + queryParams: {} as DeptQuery, formData: { sort: 1, - status: 1 - } as DeptFormData, + status: 1, + } as DeptForm, rules: { parentId: [ - { required: true, message: '上级部门不能为空', trigger: 'blur' } + { required: true, message: '上级部门不能为空', trigger: 'blur' }, ], name: [{ required: true, message: '部门名称不能为空', trigger: 'blur' }], - sort: [{ required: true, message: '显示排序不能为空', trigger: 'blur' }] - } + sort: [{ required: true, message: '显示排序不能为空', trigger: 'blur' }], + }, }); const { @@ -54,7 +53,7 @@ const { queryParams, formData, rules, - dialog + dialog, } = toRefs(state); /** @@ -85,11 +84,11 @@ function handleSelectionChange(selection: any) { */ async function getDeptOptions() { const deptOptions: any[] = []; - listDeptOptions().then(response => { + listDeptOptions().then((response) => { const rootDeptOption = { value: '0', label: '顶级部门', - children: response.data + children: response.data, }; deptOptions.push(rootDeptOption); state.deptOptions = deptOptions; @@ -105,7 +104,7 @@ function handleAdd(row: any) { formData.value.parentId = row.id; dialog.value = { title: '添加部门', - visible: true + visible: true, }; } @@ -117,7 +116,7 @@ async function handleUpdate(row: any) { const deptId = row.id || state.ids; state.dialog = { title: '修改部门', - visible: true + visible: true, }; getDeptForm(deptId).then((response: any) => { state.formData = response.data; @@ -160,7 +159,7 @@ function handleDelete(row: any) { ElMessageBox.confirm(`确认删除已选中的数据项?`, '警告', { confirmButtonText: '确定', cancelButtonText: '取消', - type: 'warning' + type: 'warning', }) .then(() => { deleteDept(ids) @@ -266,28 +265,24 @@ onMounted(() => { diff --git a/src/views/system/dict/components/DictItem.vue b/src/views/system/dict/components/DictItem.vue index 13ff3d9..fed33ca 100644 --- a/src/views/system/dict/components/DictItem.vue +++ b/src/views/system/dict/components/DictItem.vue @@ -1,46 +1,41 @@ @@ -135,13 +135,11 @@ import { getDictTypeForm, addDictType, updateDictType, - deleteDictTypes + deleteDictTypes, } from '@/api/dict'; import { Search, Plus, Edit, Refresh, Delete } from '@element-plus/icons-vue'; import { ElForm, ElMessage, ElMessageBox } from 'element-plus'; - -import { Dialog } from '@/types/common'; -import { Dict, DictTypeFormData, DictQueryParam } from '@/types/api/dict'; +import { Dict, DictQuery, DictTypeForm } from '@/api/dict/types'; const queryFormRef = ref(ElForm); const dataFormRef = ref(ElForm); @@ -158,18 +156,18 @@ const state = reactive({ multiple: true, queryParams: { pageNum: 1, - pageSize: 10 - } as DictQueryParam, + pageSize: 10, + } as DictQuery, dictList: [] as Dict[], total: 0, - dialog: { visible: false } as Dialog, + dialog: { visible: false } as DialogType, formData: { - status: 1 - } as DictTypeFormData, + status: 1, + } as DictTypeForm, rules: { name: [{ required: true, message: '请输入字典名称', trigger: 'blur' }], - code: [{ required: true, message: '请输入字典编码', trigger: 'blur' }] - } + code: [{ required: true, message: '请输入字典编码', trigger: 'blur' }], + }, }); const { total, dialog, loading, dictList, formData, rules, queryParams } = @@ -199,14 +197,14 @@ function handleSelectionChange(selection: any) { function handleAdd() { state.dialog = { title: '添加字典', - visible: true + visible: true, }; } function handleUpdate(row: any) { state.dialog = { title: '修改字典', - visible: true + visible: true, }; const id = row.id || state.ids; getDictTypeForm(id).then(({ data }) => { @@ -245,7 +243,7 @@ function handleDelete(row: any) { ElMessageBox.confirm('确认删除已选中的数据项?', '警告', { confirmButtonText: '确定', cancelButtonText: '取消', - type: 'warning' + type: 'warning', }) .then(() => { deleteDictTypes(ids).then(() => { diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue index 0d70814..9158e2c 100644 --- a/src/views/system/menu/index.vue +++ b/src/views/system/menu/index.vue @@ -100,25 +100,28 @@ @@ -276,9 +279,7 @@ import { reactive, ref, onMounted, toRefs } from 'vue'; import { Search, Plus, Edit, Refresh, Delete } from '@element-plus/icons-vue'; import { ElForm, ElMessage, ElMessageBox, ElPopover } from 'element-plus'; -import { Dialog, Option } from '@/types/common'; - -import { MenuFormData, MenuItem, MenuQueryParam } from '@/types/api/menu'; +import { MenuQuery, MenuForm, Menu } from '@/api/menu/types'; // API 依赖 import { listMenus, @@ -286,7 +287,7 @@ import { listMenuOptions, addMenu, deleteMenus, - updateMenu + updateMenu, } from '@/api/menu'; import SvgIcon from '@/components/SvgIcon/index.vue'; @@ -305,34 +306,34 @@ const state = reactive({ single: true, // 非多个禁用 multiple: true, - queryParams: {} as MenuQueryParam, - menuList: [] as MenuItem[], - dialog: { visible: false } as Dialog, + queryParams: {} as MenuQuery, + menuList: [] as Menu[], + dialog: { visible: false } as DialogType, formData: { parentId: '0', name: '', visible: 1, sort: 1, component: undefined, - type: 'MENU' - } as MenuFormData, + type: 'MENU', + } as MenuForm, rules: { parentId: [{ required: true, message: '请选择顶级菜单', trigger: 'blur' }], name: [{ required: true, message: '请输入菜单名称', trigger: 'blur' }], type: [{ required: true, message: '请选择菜单类型', trigger: 'blur' }], path: [{ required: true, message: '请输入路由路径', trigger: 'blur' }], component: [ - { required: true, message: '请输入组件完整路径', trigger: 'blur' } - ] + { required: true, message: '请输入组件完整路径', trigger: 'blur' }, + ], }, - menuOptions: [] as Option[], + menuOptions: [] as OptionType[], currentRow: undefined, // Icon选择器显示状态 iconSelectVisible: false, cacheData: { menuType: '', - menuPath: '' - } + menuPath: '', + }, }); const { @@ -344,7 +345,7 @@ const { rules, menuOptions, iconSelectVisible, - cacheData + cacheData, } = toRefs(state); /** @@ -393,7 +394,7 @@ async function handleAdd(row: any) { await loadMenuData(); dialog.value = { title: '添加菜单', - visible: true + visible: true, }; if (row.id) { @@ -416,11 +417,11 @@ async function handleAdd(row: any) { /** * 编辑菜单 */ -async function handleUpdate(row: MenuFormData) { +async function handleUpdate(row: MenuForm) { await loadMenuData(); state.dialog = { title: '编辑菜单', - visible: true + visible: true, }; const id = row.id as string; getMenuDetail(id).then(({ data }) => { @@ -474,7 +475,7 @@ function handleDelete(row: any) { ElMessageBox.confirm('确认删除已选中的数据项?', '警告', { confirmButtonText: '确定', cancelButtonText: '取消', - type: 'warning' + type: 'warning', }) .then(() => { deleteMenus(ids).then(() => { diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue index 75ec8d2..6bd6d23 100644 --- a/src/views/system/role/index.vue +++ b/src/views/system/role/index.vue @@ -1,6 +1,6 @@ @@ -13,15 +13,13 @@ import { addRole, deleteRoles, getRoleMenuIds, - updateRoleMenus + updateRoleMenus, } from '@/api/role'; import { listResources } from '@/api/menu'; import { ElForm, ElMessage, ElMessageBox, ElTree } from 'element-plus'; -import { Search, Plus, Edit, Refresh, Delete } from '@element-plus/icons-vue'; -import { RoleFormData, RoleItem, RoleQueryParam } from '@/types/api/role'; -import SvgIcon from '@/components/SvgIcon/index.vue'; -import { Option, Dialog } from '@/types/common'; +import { Search, Plus, Refresh, Delete } from '@element-plus/icons-vue'; +import { Role, RoleForm, RoleQuery } from '@/api/role/types'; const emit = defineEmits(['roleClick']); const queryFormRef = ref(ElForm); @@ -34,21 +32,23 @@ const state = reactive({ ids: [] as number[], queryParams: { pageNum: 1, - pageSize: 10 - } as RoleQueryParam, - roleList: [] as RoleItem[], + pageSize: 10, + } as RoleQuery, + roleList: [] as Role[], total: 0, dialog: { title: '', - visible: false - } as Dialog, - formData: {} as RoleFormData, + visible: false, + } as DialogType, + formData: {} as RoleForm, rules: { name: [{ required: true, message: '请输入角色名称', trigger: 'blur' }], - code: [{ required: true, message: '请输入角色编码', trigger: 'blur' }] + code: [{ required: true, message: '请输入角色编码', trigger: 'blur' }], + dataScope: [{ required: true, message: '请选择数据权限', trigger: 'blur' }], + status: [{ required: true, message: '请选择状态', trigger: 'blur' }], }, menuDialogVisible: false, - resourceOptions: [] as Option[], + resourceOptions: [] as OptionType[], btnPerms: {} as any, // 勾选的菜单ID checkedMenuIds: new Set([]), @@ -56,8 +56,8 @@ const state = reactive({ // 选中的角色 checkedRole: { id: '', - name: '' - } + name: '', + }, }); const { @@ -71,7 +71,7 @@ const { rules, menuDialogVisible, checkedRole, - resourceOptions + resourceOptions, } = toRefs(state); /** @@ -105,14 +105,14 @@ function handleRowClick(row: any) { function handleAdd() { dialog.value = { title: '添加角色', - visible: true + visible: true, }; } function handleUpdate(row: any) { dialog.value = { title: '修改角色', - visible: true + visible: true, }; const roleId = row.id || state.ids; getRoleFormDetail(roleId).then(({ data }) => { @@ -160,7 +160,7 @@ function handleDelete(row: any) { ElMessageBox.confirm('确认删除已选中的数据项?', '警告', { confirmButtonText: '确定', cancelButtonText: '取消', - type: 'warning' + type: 'warning', }) .then(() => { deleteRoles(ids).then(() => { @@ -174,24 +174,27 @@ function handleDelete(row: any) { /** * 资源分配 */ -function showRoleMenuDialog(row: RoleItem) { +function showRoleMenuDialog(row: Role) { menuDialogVisible.value = true; loading.value = true; const roleId: any = row.id; checkedRole.value = { id: roleId, - name: row.name + name: row.name, }; // 获取所有的资源 - listResources().then(response => { + listResources().then((response) => { resourceOptions.value = response.data; // 角色拥有的资源 getRoleMenuIds(roleId).then(({ data }) => { // 勾选回显 const checkedMenuIds = data; - resourceRef.value.setCheckedKeys(checkedMenuIds); + checkedMenuIds.forEach((menuId) => + resourceRef.value.setChecked(menuId, true) + ); + loading.value = false; }); }); @@ -204,7 +207,7 @@ function handleRoleResourceSubmit() { .getCheckedNodes(false, true) .map((node: any) => node.value); - updateRoleMenus(checkedRole.value.id, checkedMenuIds).then(res => { + updateRoleMenus(checkedRole.value.id, checkedMenuIds).then((res) => { ElMessage.success('分配权限成功'); menuDialogVisible.value = false; handleQuery(); @@ -258,7 +261,7 @@ onMounted(() => { >删除 - + { border > - - + +