Browse Source

🎟 优化

master
wangxiang 3 years ago
parent
commit
b07e8ac8f3
  1. 22
      kicc-ui/src/api/gateway/api.ts
  2. 22
      kicc-ui/src/api/gateway/blacklist.ts
  3. 29
      kicc-ui/src/api/gateway/model/apiModel.ts
  4. 24
      kicc-ui/src/api/gateway/model/blacklistModel.ts
  5. 24
      kicc-ui/src/api/gateway/model/routeModel.ts
  6. 22
      kicc-ui/src/api/gateway/route.ts
  7. 67
      kicc-ui/src/utils/helper/treeHelper.ts
  8. 54
      kicc-ui/src/views/gateway/api/ApiDrawer.vue
  9. 45
      kicc-ui/src/views/gateway/api/RouteTree.vue
  10. 136
      kicc-ui/src/views/gateway/api/api.data.ts
  11. 94
      kicc-ui/src/views/gateway/api/index.vue
  12. 58
      kicc-ui/src/views/gateway/blacklist/BlacklistDrawer.vue
  13. 128
      kicc-ui/src/views/gateway/blacklist/blacklist.data.ts
  14. 85
      kicc-ui/src/views/gateway/blacklist/index.vue
  15. 54
      kicc-ui/src/views/gateway/route/RouteDrawer.vue
  16. 85
      kicc-ui/src/views/gateway/route/index.vue
  17. 109
      kicc-ui/src/views/gateway/route/route.data.ts

22
kicc-ui/src/api/gateway/api.ts

@ -1,22 +0,0 @@ @@ -1,22 +0,0 @@
import { ApiVO, ApiDTO, Api as SysApi } from './model/apiModel';
import { defHttp } from '/@/utils/http/axios';
enum Api {
Page = '/mate-system/api/page',
Set = '/mate-system/api/set',
Del = '/mate-system/api/del',
Sync = '/mate-system/api/sync',
}
// 分页查询
export const page = (params: ApiVO) => defHttp.get<ApiDTO>({ url: Api.Page, params });
// 保存
export const set = (params: SysApi) => defHttp.post<SysApi>({ url: Api.Set, params });
// 同步
export const sync = () => defHttp.post({ url: Api.Sync });
// 删除
export const del = (params: { ids: String }) =>
defHttp.post<boolean>({ url: Api.Del + `?ids=${params.ids}` });

22
kicc-ui/src/api/gateway/blacklist.ts

@ -1,22 +0,0 @@ @@ -1,22 +0,0 @@
import { BlacklistVO, BlacklistDTO, Blacklist } from './model/blacklistModel';
import { defHttp } from '/@/utils/http/axios';
enum Api {
Page = '/mate-system/blacklist/page',
Set = '/mate-system/blacklist/set',
Del = '/mate-system/blacklist/del',
Tree = '/mate-system/blacklist/list-item',
}
// 分页查询
export const page = (params: BlacklistVO) => defHttp.get<BlacklistDTO>({ url: Api.Page, params });
// 树
export const tree = () => defHttp.get({ url: Api.Tree });
// 保存
export const set = (params: Blacklist) => defHttp.post<Blacklist>({ url: Api.Set, params });
// 删除
export const del = (params: { ids: String }) =>
defHttp.post<boolean>({ url: Api.Del + `?ids=${params.ids}` });

29
kicc-ui/src/api/gateway/model/apiModel.ts

@ -1,29 +0,0 @@ @@ -1,29 +0,0 @@
// 引入基础包
import { BasicPageParams, BasicFetchResult } from '/@/api/model/baseModel';
// 定义查询参数
export type ApiVO = BasicPageParams & {
keyword?: string;
startDate?: string;
endDate?: string;
};
// 定义系统接口对象
export interface Api {
id: string;
code: string;
name: string;
notes: string;
method: string;
className: string;
methodName: string;
path: string;
contentType: string;
serviceId: string;
status: string;
auth: string;
createTime: string;
}
// 根据字典对象生成响应模型
export type ApiDTO = BasicFetchResult<ApiVO>;

24
kicc-ui/src/api/gateway/model/blacklistModel.ts

@ -1,24 +0,0 @@ @@ -1,24 +0,0 @@
// 引入基础包
import { BasicPageParams, BasicFetchResult } from '/@/api/model/baseModel';
// 定义查询参数
export type BlacklistVO = BasicPageParams & {
keyword?: string;
startDate?: string;
endDate?: string;
};
// 定义黑名单对象
export interface Blacklist {
id: string;
ip: string;
requestUri: string;
requestMethod: string;
startTime: string;
endTime: string;
status: string;
createTime: string;
}
// 根据字典对象生成响应模型
export type BlacklistDTO = BasicFetchResult<BlacklistVO>;

24
kicc-ui/src/api/gateway/model/routeModel.ts

@ -1,24 +0,0 @@ @@ -1,24 +0,0 @@
// 引入基础包
import { BasicPageParams, BasicFetchResult } from '/@/api/model/baseModel';
// 定义查询参数
export type RouteVO = BasicPageParams & {
keyword?: string;
startDate?: string;
endDate?: string;
};
// 定义路由对象
export interface Route {
id: string;
name: string;
path: string;
url: string;
serviceId: string;
status: string;
tenantId: string;
createTime: string;
}
// 根据字典对象生成响应模型
export type RouteDTO = BasicFetchResult<RouteVO>;

22
kicc-ui/src/api/gateway/route.ts

@ -1,22 +0,0 @@ @@ -1,22 +0,0 @@
import { RouteVO, RouteDTO, Route } from './model/routeModel';
import { defHttp } from '/@/utils/http/axios';
enum Api {
Page = '/mate-system/route/page',
Set = '/mate-system/route/set',
Del = '/mate-system/route/del',
Tree = '/mate-system/route/list-item',
}
// 分页查询
export const page = (params: RouteVO) => defHttp.get<RouteDTO>({ url: Api.Page, params });
// 树
export const tree = () => defHttp.get({ url: Api.Tree });
// 保存
export const set = (params: Route) => defHttp.post<Route>({ url: Api.Set, params });
// 删除
export const del = (params: { ids: String }) =>
defHttp.post<boolean>({ url: Api.Del + `?ids=${params.ids}` });

67
kicc-ui/src/utils/helper/treeHelper.ts

@ -18,7 +18,7 @@ const DEFAULT_CONFIG: TreeHelperConfig = { @@ -18,7 +18,7 @@ const DEFAULT_CONFIG: TreeHelperConfig = {
const getConfig = (config: Partial<TreeHelperConfig>) => Object.assign({}, DEFAULT_CONFIG, config);
// 列表中的树
/** 集合转换树形 */
export function listToTree<T = any>(list: any[], config: Partial<TreeHelperConfig> = {}): T[] {
const conf = getConfig(config) as TreeHelperConfig;
const nodeMap = new Map();
@ -36,6 +36,7 @@ export function listToTree<T = any>(list: any[], config: Partial<TreeHelperConfi @@ -36,6 +36,7 @@ export function listToTree<T = any>(list: any[], config: Partial<TreeHelperConfi
return result;
}
/** 树形转换集合 */
export function treeToList<T = any>(tree: any, config: Partial<TreeHelperConfig> = {}): T {
config = getConfig(config);
const { children } = config;
@ -47,11 +48,8 @@ export function treeToList<T = any>(tree: any, config: Partial<TreeHelperConfig> @@ -47,11 +48,8 @@ export function treeToList<T = any>(tree: any, config: Partial<TreeHelperConfig>
return result;
}
export function findNode<T = any>(
tree: any,
func: Fn,
config: Partial<TreeHelperConfig> = {}
): T | null {
/** 查找树形匹配的节点信息,只包含当前节点数据 */
export function findNode<T = any>(tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}): T | null {
config = getConfig(config);
const { children } = config;
const list = [...tree];
@ -62,11 +60,8 @@ export function findNode<T = any>( @@ -62,11 +60,8 @@ export function findNode<T = any>(
return null;
}
export function findNodeAll<T = any>(
tree: any,
func: Fn,
config: Partial<TreeHelperConfig> = {}
): T[] {
/** 查找树形匹配的节点信息,包含当前节点数据以及他父级的节点数据,以集合的形式返回 */
export function findNodeAll<T = any>(tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}): T[] {
config = getConfig(config);
const { children } = config;
const list = [...tree];
@ -78,11 +73,8 @@ export function findNodeAll<T = any>( @@ -78,11 +73,8 @@ export function findNodeAll<T = any>(
return result;
}
export function findPath<T = any>(
tree: any,
func: Fn,
config: Partial<TreeHelperConfig> = {}
): T | T[] | null {
/** 查找树形集合父级元素,可以使用func函数进行控制 */
export function findPath<T = any>(tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}): T | T[] | null {
config = getConfig(config);
const path: T[] = [];
const list = [...tree];
@ -105,6 +97,7 @@ export function findPath<T = any>( @@ -105,6 +97,7 @@ export function findPath<T = any>(
return null;
}
/** 查找树形集合所有父级元素,不能使用func函数进行控制,只能利用func函数处理数据 */
export function findPathAll(tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}) {
config = getConfig(config);
const path: any[] = [];
@ -127,17 +120,12 @@ export function findPathAll(tree: any, func: Fn, config: Partial<TreeHelperConfi @@ -127,17 +120,12 @@ export function findPathAll(tree: any, func: Fn, config: Partial<TreeHelperConfi
return result;
}
export function filter<T = any>(
tree: T[],
func: (n: T) => boolean,
config: Partial<TreeHelperConfig> = {}
): T[] {
/** 树形集合过滤,过滤后数据为父级元素加子级元素的形式 */
export function filter<T = any>(tree: T[], func: (n: T) => boolean, config: Partial<TreeHelperConfig> = {}): T[] {
config = getConfig(config);
const children = config.children as string;
function listFilter(list: T[]) {
return list
.map((node: any) => ({ ...node }))
.filter((node) => {
return list.map((node: any) => ({ ...node })).filter((node) => {
node[children] = node[children] && listFilter(node[children]);
return func(node) || (node[children] && node[children].length);
});
@ -145,37 +133,25 @@ export function filter<T = any>( @@ -145,37 +133,25 @@ export function filter<T = any>(
return listFilter(tree);
}
export function forEach<T = any>(
tree: T[],
func: (n: T) => any,
config: Partial<TreeHelperConfig> = {}
): void {
/** 树形集合循环 */
export function forEach<T = any>(tree: T[], func: (n: T) => any, config: Partial<TreeHelperConfig> = {}): void {
config = getConfig(config);
const list: any[] = [...tree];
const { children } = config;
for (let i = 0; i < list.length; i++) {
//func 返回true就终止遍历,避免大量节点场景下无意义循环,引起浏览器卡顿
if (func(list[i])) {
return;
}
// func返回true就终止遍历,避免大量节点场景下无意义循环,引起浏览器卡顿
if (func(list[i])) return;
children && list[i][children] && list.splice(i + 1, 0, ...list[i][children]);
}
}
/**
*
*/
/** 提取树指定结构 */
export function treeMap<T = any>(treeData: T[], opt: { children?: string; conversion: Fn }): T[] {
return treeData.map((item) => treeMapEach(item, opt));
}
/**
*
*/
export function treeMapEach(
data: any,
{ children = 'children', conversion }: { children?: string; conversion: Fn }
) {
/** 进行循环转换指定树结构 */
export function treeMapEach(data: any, { children = 'children', conversion }: { children?: string; conversion: Fn }) {
const haveChildren = Array.isArray(data[children]) && data[children].length > 0;
const conversionData = conversion(data) || {};
if (haveChildren) {
@ -185,12 +161,11 @@ export function treeMapEach( @@ -185,12 +161,11 @@ export function treeMapEach(
treeMapEach(i, {
children,
conversion,
})
),
}))
};
} else {
return {
...conversionData,
...conversionData
};
}
}

54
kicc-ui/src/views/gateway/api/ApiDrawer.vue

@ -1,54 +0,0 @@ @@ -1,54 +0,0 @@
<template>
<BasicDrawer
v-bind="$attrs"
@register="registerDrawer"
showFooter
:title="getTitle"
width="500px"
@ok="handleSubmit"
>
<BasicForm @register="registerForm" />
</BasicDrawer>
</template>
<script lang="ts" setup>
import { ref, computed, unref } from 'vue';
import { BasicForm, useForm } from '/@/components/Form/index';
import { formSchema } from './api.data';
import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
import { set } from '/@/api/gateway/api';
const emit = defineEmits(['success', 'register']);
const isUpdate = ref(true);
const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
labelWidth: 100,
schemas: formSchema,
showActionButtonGroup: false,
});
const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
resetFields();
setDrawerProps({ confirmLoading: false });
isUpdate.value = !!data?.isUpdate;
if (unref(isUpdate)) {
setFieldsValue({
...data.record,
});
}
});
const getTitle = computed(() => (!unref(isUpdate) ? '新增API' : '编辑API'));
async function handleSubmit() {
try {
const values = await validate();
setDrawerProps({ confirmLoading: true });
await set(values);
closeDrawer();
emit('success');
} finally {
setDrawerProps({ confirmLoading: false });
}
}
</script>

45
kicc-ui/src/views/gateway/api/RouteTree.vue

@ -1,45 +0,0 @@ @@ -1,45 +0,0 @@
<template>
<div class="bg-white m-4 mr-0 overflow-hidden">
<BasicTree
title="微服务列表"
toolbar
search
:clickRowToExpand="false"
:treeData="treeData"
:replaceFields="{ key: 'id', title: 'name' }"
@select="handleSelect"
/>
</div>
</template>
<script lang="ts">
import { defineComponent, onMounted, ref } from 'vue';
import { BasicTree, TreeItem } from '/@/components/Tree';
import { tree } from '/@/api/gateway/route';
import { findNode } from '/@/utils/helper/treeHelper';
export default defineComponent({
name: 'DeptTree',
components: { BasicTree },
emits: ['select'],
setup(_, { emit }) {
const treeData = ref<TreeItem[]>([]);
async function fetch() {
treeData.value = (await tree()) as unknown as TreeItem[];
}
function handleSelect(keys: string) {
const node = findNode(treeData.value, (item) => item.id === keys[0], {
id: 'id',
});
emit('select', node.name);
}
onMounted(() => {
fetch();
});
return { treeData, handleSelect };
},
});
</script>

136
kicc-ui/src/views/gateway/api/api.data.ts

@ -1,136 +0,0 @@ @@ -1,136 +0,0 @@
import { BasicColumn } from '/@/components/Table';
import { FormSchema } from '/@/components/Table';
import { h } from 'vue';
import { Tag } from 'ant-design-vue';
export const columns: BasicColumn[] = [
{
title: '编码',
dataIndex: 'code',
width: 100,
},
{
title: '服务ID',
dataIndex: 'serviceId',
width: 100,
},
{
title: '名称',
dataIndex: 'name',
width: 100,
},
{
title: '请求方法',
dataIndex: 'method',
width: 60,
},
{
title: '请求路径',
dataIndex: 'path',
width: 130,
},
{
title: '认证',
dataIndex: 'auth',
width: 60,
customRender: ({ record }) => {
const auth = record.auth;
const enable = ~~auth === 1;
const color = enable ? 'green' : 'red';
const text = enable ? '认证' : '不认证';
return h(Tag, { color: color }, () => text);
},
},
{
title: '状态',
dataIndex: 'status',
width: 60,
customRender: ({ record }) => {
const status = record.status;
const enable = ~~status === 0;
const color = enable ? 'green' : 'red';
const text = enable ? '启用' : '停用';
return h(Tag, { color: color }, () => text);
},
},
{
title: '创建时间',
dataIndex: 'createTime',
width: 100,
},
];
export const searchFormSchema: FormSchema[] = [
{
field: 'keyword',
label: '关键字',
component: 'Input',
componentProps: {
placeholder: '请输入编码/请求地址',
},
colProps: { span: 8 },
},
{
field: 'startDate',
label: '起始时间',
component: 'DatePicker',
colProps: { span: 8 },
},
{
field: 'endDate',
label: '截止时间',
component: 'DatePicker',
colProps: { span: 8 },
},
];
export const formSchema: FormSchema[] = [
{
field: 'id',
label: 'ID',
component: 'Input',
show: false,
},
{
field: 'code',
label: '编码',
component: 'Input',
},
{
field: 'serviceId',
label: '服务ID',
component: 'Input',
},
{
field: 'name',
label: '名称',
component: 'Input',
},
{
field: 'method',
label: '请求方法',
component: 'Input',
},
{
field: 'className',
label: '类名',
component: 'Input',
},
{
field: 'methodName',
label: '方法名',
component: 'Input',
},
{
field: 'status',
label: '状态',
component: 'RadioButtonGroup',
defaultValue: '0',
componentProps: {
options: [
{ label: '启用', value: '0' },
{ label: '禁用', value: '1' },
],
},
},
];

94
kicc-ui/src/views/gateway/api/index.vue

@ -1,94 +0,0 @@ @@ -1,94 +0,0 @@
<template>
<PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
<RouteTree class="w-1/4 xl:w-1/5" @select="handleSelect" />
<BasicTable @register="registerTable" class="w-3/4 xl:w-4/5" :searchInfo="searchInfo">
<template #toolbar>
<a-button type="primary" @click="handleSync">同步API</a-button>
</template>
<template #action="{ record }">
<TableAction
:actions="[
{
icon: 'clarity:note-edit-line',
onClick: handleEdit.bind(null, record),
},
{
icon: 'ant-design:delete-outlined',
color: 'error',
popConfirm: {
title: '是否确认删除',
confirm: handleDelete.bind(null, record),
},
},
]"
/>
</template>
</BasicTable>
<ApiDrawer @register="registerDrawer" @success="handleSuccess" />
</PageWrapper>
</template>
<script lang="ts" setup>
import { reactive } from 'vue';
//
import { PageWrapper } from '/@/components/Page';
import { BasicTable, useTable, TableAction } from '/@/components/Table';
//
import { columns, searchFormSchema } from './api.data';
// API
import { page, sync, del } from '/@/api/gateway/api';
import { useDrawer } from '/@/components/Drawer';
import ApiDrawer from './ApiDrawer.vue';
import { useMessage } from '/@/hooks/web/useMessage';
import RouteTree from './RouteTree.vue';
const { createMessage } = useMessage();
const searchInfo = reactive<Recordable>({});
const [registerDrawer, { openDrawer }] = useDrawer();
const [registerTable, { reload }] = useTable({
title: '微服务列表',
api: page,
columns,
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
useSearchForm: true,
showTableSetting: true,
bordered: true,
showIndexColumn: false,
actionColumn: {
width: 80,
title: '操作',
dataIndex: 'action',
slots: { customRender: 'action' },
fixed: undefined,
},
});
async function handleSync() {
await sync();
handleSuccess();
}
function handleEdit(record: Recordable) {
openDrawer(true, {
record,
isUpdate: true,
});
}
async function handleDelete(record: Recordable) {
await del({ ids: record.id });
createMessage.success('删除成功!');
handleSuccess();
}
function handleSelect(serviceId = '') {
searchInfo.serviceId = serviceId;
reload();
}
function handleSuccess() {
reload();
}
</script>

58
kicc-ui/src/views/gateway/blacklist/BlacklistDrawer.vue

@ -1,58 +0,0 @@ @@ -1,58 +0,0 @@
<template>
<BasicDrawer
v-bind="$attrs"
@register="registerDrawer"
showFooter
:title="getTitle"
width="500px"
@ok="handleSubmit"
>
<BasicForm @register="registerForm" />
</BasicDrawer>
</template>
<script lang="ts" setup>
import { ref, computed, unref } from 'vue';
import { BasicForm, useForm } from '/@/components/Form/index';
import { formSchema } from './blacklist.data';
import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
import { set } from '/@/api/gateway/blacklist';
const emit = defineEmits(['success', 'register']);
const isUpdate = ref(true);
const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
labelWidth: 100,
schemas: formSchema,
showActionButtonGroup: false,
});
const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
resetFields();
setDrawerProps({ confirmLoading: false });
isUpdate.value = !!data?.isUpdate;
if (unref(isUpdate)) {
setFieldsValue({
...data.record,
});
}
});
const getTitle = computed(() => (!unref(isUpdate) ? '新增黑名单' : '编辑黑名单'));
async function handleSubmit() {
try {
const values = await validate();
if (!unref(isUpdate)) {
values.startTime = values.startTime.format('HH:mm:ss');
values.endTime = values.endTime.format('HH:mm:ss');
}
setDrawerProps({ confirmLoading: true });
await set(values);
closeDrawer();
emit('success');
} finally {
setDrawerProps({ confirmLoading: false });
}
}
</script>

128
kicc-ui/src/views/gateway/blacklist/blacklist.data.ts

@ -1,128 +0,0 @@ @@ -1,128 +0,0 @@
import { BasicColumn } from '/@/components/Table';
import { FormSchema } from '/@/components/Table';
import { h } from 'vue';
import { Tag } from 'ant-design-vue';
import moment from 'moment';
export const columns: BasicColumn[] = [
{
title: 'IP地址',
dataIndex: 'ip',
width: 100,
},
{
title: '请求地址',
dataIndex: 'requestUri',
width: 130,
},
{
title: '请求方法',
dataIndex: 'requestMethod',
width: 80,
},
{
title: '开始时间',
dataIndex: 'startTime',
width: 90,
},
{
title: '结束时间',
dataIndex: 'endTime',
width: 90,
},
{
title: '状态',
dataIndex: 'status',
width: 80,
customRender: ({ record }) => {
const status = record.status;
const enable = ~~status === 0;
const color = enable ? 'green' : 'red';
const text = enable ? '启用' : '停用';
return h(Tag, { color: color }, () => text);
},
},
{
title: '创建时间',
dataIndex: 'createTime',
width: 100,
},
];
export const searchFormSchema: FormSchema[] = [
{
field: 'keyword',
label: '关键字',
component: 'Input',
componentProps: {
placeholder: '请输入名称/服务ID',
},
colProps: { span: 8 },
},
{
field: 'startDate',
label: '起始时间',
component: 'DatePicker',
colProps: { span: 8 },
},
{
field: 'endDate',
label: '截止时间',
component: 'DatePicker',
colProps: { span: 8 },
},
];
export const formSchema: FormSchema[] = [
{
field: 'id',
label: 'ID',
component: 'Input',
show: false,
},
{
field: 'ip',
label: 'IP地址',
component: 'Input',
},
{
field: 'requestUri',
label: '请求地址',
component: 'Input',
},
{
field: 'requestMethod',
label: '请求方法',
component: 'Input',
},
{
field: 'startTime',
label: '开始时间',
component: 'TimePicker',
defaultValue: moment('09:00:00', 'HH:mm:ss'),
componentProps: {
valueFormat: 'HH:mm:ss',
},
},
{
field: 'endTime',
label: '结束时间',
component: 'TimePicker',
defaultValue: moment('21:00:00', 'HH:mm:ss'),
componentProps: {
valueFormat: 'HH:mm:ss',
},
},
{
field: 'status',
label: '状态',
component: 'RadioButtonGroup',
defaultValue: '0',
componentProps: {
options: [
{ label: '启用', value: '0' },
{ label: '禁用', value: '1' },
],
},
},
];

85
kicc-ui/src/views/gateway/blacklist/index.vue

@ -1,85 +0,0 @@ @@ -1,85 +0,0 @@
<template>
<PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
<BasicTable @register="registerTable">
<template #toolbar>
<a-button type="primary" @click="handleCreate">新增黑名单</a-button>
</template>
<template #action="{ record }">
<TableAction
:actions="[
{
icon: 'clarity:note-edit-line',
onClick: handleEdit.bind(null, record),
},
{
icon: 'ant-design:delete-outlined',
color: 'error',
popConfirm: {
title: '是否确认删除',
confirm: handleDelete.bind(null, record),
},
},
]"
/>
</template>
</BasicTable>
<BlacklistDrawer @register="registerDrawer" @success="handleSuccess" />
</PageWrapper>
</template>
<script lang="ts" setup>
//
import { PageWrapper } from '/@/components/Page';
import { BasicTable, useTable, TableAction } from '/@/components/Table';
//
import { columns, searchFormSchema } from './blacklist.data';
// API
import { page, del } from '/@/api/gateway/blacklist';
import { useDrawer } from '/@/components/Drawer';
import BlacklistDrawer from './BlacklistDrawer.vue';
import { useMessage } from '/@/hooks/web/useMessage';
const { createMessage } = useMessage();
const [registerDrawer, { openDrawer }] = useDrawer();
const [registerTable, { reload }] = useTable({
title: '黑名单列表',
api: page,
columns,
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
useSearchForm: true,
showTableSetting: true,
bordered: true,
showIndexColumn: false,
actionColumn: {
width: 80,
title: '操作',
dataIndex: 'action',
slots: { customRender: 'action' },
fixed: undefined,
},
});
function handleCreate() {
openDrawer(true, {
isUpdate: false,
});
}
function handleEdit(record: Recordable) {
openDrawer(true, {
record,
isUpdate: true,
});
}
async function handleDelete(record: Recordable) {
await del({ ids: record.id });
createMessage.success('删除成功!');
handleSuccess();
}
function handleSuccess() {
reload();
}
</script>

54
kicc-ui/src/views/gateway/route/RouteDrawer.vue

@ -1,54 +0,0 @@ @@ -1,54 +0,0 @@
<template>
<BasicDrawer
v-bind="$attrs"
@register="registerDrawer"
showFooter
:title="getTitle"
width="500px"
@ok="handleSubmit"
>
<BasicForm @register="registerForm" />
</BasicDrawer>
</template>
<script lang="ts" setup>
import { ref, computed, unref } from 'vue';
import { BasicForm, useForm } from '/@/components/Form/index';
import { formSchema } from './route.data';
import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
import { set } from '/@/api/gateway/route';
const emit = defineEmits(['success', 'register']);
const isUpdate = ref(true);
const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
labelWidth: 100,
schemas: formSchema,
showActionButtonGroup: false,
});
const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
resetFields();
setDrawerProps({ confirmLoading: false });
isUpdate.value = !!data?.isUpdate;
if (unref(isUpdate)) {
setFieldsValue({
...data.record,
});
}
});
const getTitle = computed(() => (!unref(isUpdate) ? '新增微服务' : '编辑微服务'));
async function handleSubmit() {
try {
const values = await validate();
setDrawerProps({ confirmLoading: true });
await set(values);
closeDrawer();
emit('success');
} finally {
setDrawerProps({ confirmLoading: false });
}
}
</script>

85
kicc-ui/src/views/gateway/route/index.vue

@ -1,85 +0,0 @@ @@ -1,85 +0,0 @@
<template>
<PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
<BasicTable @register="registerTable">
<template #toolbar>
<a-button type="primary" @click="handleCreate">新增微服务</a-button>
</template>
<template #action="{ record }">
<TableAction
:actions="[
{
icon: 'clarity:note-edit-line',
onClick: handleEdit.bind(null, record),
},
{
icon: 'ant-design:delete-outlined',
color: 'error',
popConfirm: {
title: '是否确认删除',
confirm: handleDelete.bind(null, record),
},
},
]"
/>
</template>
</BasicTable>
<RouteDrawer @register="registerDrawer" @success="handleSuccess" />
</PageWrapper>
</template>
<script lang="ts" setup>
//
import { PageWrapper } from '/@/components/Page';
import { BasicTable, useTable, TableAction } from '/@/components/Table';
//
import { columns, searchFormSchema } from './route.data';
// API
import { page, del } from '/@/api/gateway/route';
import { useDrawer } from '/@/components/Drawer';
import RouteDrawer from './RouteDrawer.vue';
import { useMessage } from '/@/hooks/web/useMessage';
const { createMessage } = useMessage();
const [registerDrawer, { openDrawer }] = useDrawer();
const [registerTable, { reload }] = useTable({
title: '微服务列表',
api: page,
columns,
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
useSearchForm: true,
showTableSetting: true,
bordered: true,
showIndexColumn: false,
actionColumn: {
width: 80,
title: '操作',
dataIndex: 'action',
slots: { customRender: 'action' },
fixed: undefined,
},
});
function handleCreate() {
openDrawer(true, {
isUpdate: false,
});
}
function handleEdit(record: Recordable) {
openDrawer(true, {
record,
isUpdate: true,
});
}
async function handleDelete(record: Recordable) {
await del({ ids: record.id });
createMessage.success('删除成功!');
handleSuccess();
}
function handleSuccess() {
reload();
}
</script>

109
kicc-ui/src/views/gateway/route/route.data.ts

@ -1,109 +0,0 @@ @@ -1,109 +0,0 @@
import { BasicColumn } from '/@/components/Table';
import { FormSchema } from '/@/components/Table';
import { h } from 'vue';
import { Tag } from 'ant-design-vue';
export const columns: BasicColumn[] = [
{
title: '名称',
dataIndex: 'name',
width: 100,
},
{
title: '服务ID',
dataIndex: 'serviceId',
width: 100,
},
{
title: '服务路径',
dataIndex: 'path',
width: 130,
},
{
title: 'URI',
dataIndex: 'url',
width: 90,
},
{
title: '状态',
dataIndex: 'status',
width: 80,
customRender: ({ record }) => {
const status = record.status;
const enable = ~~status === 0;
const color = enable ? 'green' : 'red';
const text = enable ? '启用' : '停用';
return h(Tag, { color: color }, () => text);
},
},
{
title: '创建时间',
dataIndex: 'createTime',
width: 100,
},
];
export const searchFormSchema: FormSchema[] = [
{
field: 'keyword',
label: '关键字',
component: 'Input',
componentProps: {
placeholder: '请输入名称/服务ID',
},
colProps: { span: 8 },
},
{
field: 'startDate',
label: '起始时间',
component: 'DatePicker',
colProps: { span: 8 },
},
{
field: 'endDate',
label: '截止时间',
component: 'DatePicker',
colProps: { span: 8 },
},
];
export const formSchema: FormSchema[] = [
{
field: 'id',
label: 'ID',
component: 'Input',
show: false,
},
{
field: 'name',
label: '名称',
component: 'Input',
},
{
field: 'serviceId',
label: '服务ID',
component: 'Input',
},
{
field: 'path',
label: '服务路径',
component: 'Input',
},
{
field: 'url',
label: 'URI',
component: 'Input',
},
{
field: 'status',
label: '状态',
component: 'RadioButtonGroup',
defaultValue: '0',
componentProps: {
options: [
{ label: '启用', value: '0' },
{ label: '禁用', value: '1' },
],
},
},
];
Loading…
Cancel
Save