diff --git a/frontend/src/api/__tests__/sysEnums.spec.ts b/frontend/src/api/__tests__/sysEnums.spec.ts new file mode 100644 index 0000000..efc5df6 --- /dev/null +++ b/frontend/src/api/__tests__/sysEnums.spec.ts @@ -0,0 +1,63 @@ +import { describe, expect, it, vi } from 'vitest'; + +import { batchSave, deleteById, listForManagement, saveOrUpdate } from '../sysEnums'; +import { del, post } from '../request'; + +vi.mock('../request', () => ({ + del: vi.fn(), + post: vi.fn(), +})); + +describe('sys enum api', () => { + it('queries system enums with management filters', () => { + listForManagement({ catalog: 'common', keyword: '启用' }); + + expect(post).toHaveBeenCalledWith('/sys-enums/manage/query', { + catalog: 'common', + keyword: '启用', + }); + }); + + it('saves and deletes system enums', () => { + saveOrUpdate({ catalog: 'common', type: 'status', name: '启用', value: 1 }); + deleteById('123'); + + expect(post).toHaveBeenCalledWith('/sys-enums', { + catalog: 'common', + type: 'status', + name: '启用', + value: 1, + }); + expect(del).toHaveBeenCalledWith('/sys-enums/123'); + }); + + it('batch saves enum groups', () => { + batchSave({ + catalog: 'common', + type: 'enable_status', + items: [ + { + name: '启用', + value: 1, + strvalue: 'enabled', + sort: 1, + remark: '通用启用状态', + }, + ], + }); + + expect(post).toHaveBeenCalledWith('/sys-enums/batch', { + catalog: 'common', + type: 'enable_status', + items: [ + { + name: '启用', + value: 1, + strvalue: 'enabled', + sort: 1, + remark: '通用启用状态', + }, + ], + }); + }); +}); diff --git a/frontend/src/api/request.ts b/frontend/src/api/request.ts index 45e09fd..f0fde00 100644 --- a/frontend/src/api/request.ts +++ b/frontend/src/api/request.ts @@ -2,8 +2,8 @@ import axios from 'axios'; import type { AxiosRequestConfig } from 'axios'; export interface RequestResult { - code: number; - message: string; + resultcode: string; + message: string | null; data: T; } @@ -19,3 +19,7 @@ export function get(url: string, config?: AxiosRequestConfig) { export function post(url: string, data?: D, config?: AxiosRequestConfig) { return request.post>(url, data, config).then((response) => response.data); } + +export function del(url: string, config?: AxiosRequestConfig) { + return request.delete>(url, config).then((response) => response.data); +} diff --git a/frontend/src/api/sysEnums.ts b/frontend/src/api/sysEnums.ts new file mode 100644 index 0000000..c245e5c --- /dev/null +++ b/frontend/src/api/sysEnums.ts @@ -0,0 +1,54 @@ +import { del, get, post } from './request'; + +export interface SysEnum { + id?: string; + catalog: string; + type: string; + name: string; + value?: number | null; + strvalue?: string | null; + sort?: number | null; + remark?: string | null; +} + +export interface SysEnumManageQuery { + catalog?: string; + type?: string; + keyword?: string; +} + +export type SysEnumSaveRequest = SysEnum; + +export interface SysEnumBatchSaveItem { + name: string; + value?: number | null; + strvalue?: string | null; + sort?: number | null; + remark?: string | null; +} + +export interface SysEnumBatchSaveRequest { + catalog: string; + type: string; + items: SysEnumBatchSaveItem[]; +} + +export function listForManagement(query: SysEnumManageQuery) { + return post('/sys-enums/manage/query', query); +} + +export function getById(id: string) { + return get(`/sys-enums/${id}`); +} + +export function saveOrUpdate(data: SysEnumSaveRequest) { + return post('/sys-enums', data); +} + +export function batchSave(data: SysEnumBatchSaveRequest) { + return post('/sys-enums/batch', data); +} + +export function deleteById(id: string) { + return del(`/sys-enums/${id}`); +} diff --git a/frontend/src/pages/SystemEnumsPage.vue b/frontend/src/pages/SystemEnumsPage.vue index b70e848..06e3d27 100644 --- a/frontend/src/pages/SystemEnumsPage.vue +++ b/frontend/src/pages/SystemEnumsPage.vue @@ -1,8 +1,404 @@ + + + + diff --git a/frontend/src/pages/__tests__/SystemEnumsPage.spec.ts b/frontend/src/pages/__tests__/SystemEnumsPage.spec.ts new file mode 100644 index 0000000..da55f71 --- /dev/null +++ b/frontend/src/pages/__tests__/SystemEnumsPage.spec.ts @@ -0,0 +1,72 @@ +import { mount, flushPromises } from '@vue/test-utils'; +import ElementPlus from 'element-plus'; +import { describe, expect, it, vi } from 'vitest'; + +import SystemEnumsPage from '../SystemEnumsPage.vue'; +import { listForManagement } from '@/api/sysEnums'; + +vi.mock('@/api/sysEnums', () => ({ + listForManagement: vi.fn(() => + Promise.resolve({ + resultcode: '0', + message: null, + data: [ + { + id: '1', + catalog: 'common', + type: 'enable_status', + name: '启用', + value: 1, + strvalue: 'enabled', + sort: 1, + remark: '通用启用状态', + }, + ], + }), + ), + saveOrUpdate: vi.fn(), + batchSave: vi.fn(), + deleteById: vi.fn(), +})); + +describe('SystemEnumsPage', () => { + it('renders enum rows and sends search filters', async () => { + const wrapper = mount(SystemEnumsPage, { + global: { + plugins: [ElementPlus], + }, + }); + + await flushPromises(); + + expect(wrapper.text()).toContain('模块目录'); + expect(wrapper.text()).toContain('枚举类型'); + expect(wrapper.text()).toContain('common'); + expect(wrapper.text()).toContain('enable_status'); + expect(wrapper.text()).toContain('启用'); + expect(wrapper.text()).toContain('通用启用状态'); + + await wrapper.get('[data-test="catalog-input"]').setValue('rag'); + await wrapper.get('[data-test="enum-search"]').trigger('click'); + + expect(listForManagement).toHaveBeenLastCalledWith({ + catalog: 'rag', + type: '', + keyword: '', + }); + }); + + it('opens a separate batch create dialog', async () => { + const wrapper = mount(SystemEnumsPage, { + global: { + plugins: [ElementPlus], + }, + }); + + await flushPromises(); + await wrapper.get('[data-test="enum-batch-create"]').trigger('click'); + + expect(wrapper.text()).toContain('批量新增枚举'); + expect(wrapper.text()).toContain('枚举项'); + }); +});