Skip to content

Commit 0ab4c03

Browse files
committed
feat: add Nav list page
1 parent 1a7b6d1 commit 0ab4c03

File tree

18 files changed

+287
-35
lines changed

18 files changed

+287
-35
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,4 @@ yarn-error.log*
5353
*.sln
5454
*.sw*
5555
package-lock.json
56+
dice-admin/dist

dice-admin/src/api/nav/nav.ts

+16
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ enum Api {
88
NavTypeAdd = '/nav/type/add',
99
NavTypeDelete = '/nav/type/delete',
1010
NavTypeUpdate = '/nav/type/update',
11+
NavDetailPageList = '/nav/detail/getPageList',
12+
NavDetailAdd = '/nav/detail/add',
13+
NavDetailUpdate = '/nav/detail/update',
14+
NavDetailDelete = '/nav/detail/delete',
1115
}
1216

1317
export function apiNavTypeList(params: BasicPageParams) {
@@ -28,3 +32,15 @@ export const delNavType = (params: any) =>
2832

2933
export const updateNavType = (params: any) =>
3034
defHttp.post({ url: Api.NavTypeUpdate, params: params });
35+
36+
export const getNavDetailList = (params: any) =>
37+
defHttp.get({ url: Api.NavDetailPageList, params });
38+
39+
export const addNavDetail = (params: any) =>
40+
defHttp.post({ url: Api.NavDetailAdd, params: params });
41+
42+
export const updateNavDetail = (params: any) =>
43+
defHttp.post({ url: Api.NavDetailUpdate, params: params });
44+
45+
export const delNavDetail = (params: any) =>
46+
defHttp.post({ url: Api.NavDetailDelete + '/' + params.id });

dice-admin/src/views/nav/list/NavListModal.vue

+13-14
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,10 @@
77
import { defineComponent, ref, computed, unref } from 'vue';
88
import { BasicModal, useModalInner } from '/@/components/Modal';
99
import { BasicForm, useForm } from '/@/components/Form/index';
10-
import { accountFormSchema } from './list.data';
11-
import { getDeptList } from '/@/api/demo/system';
12-
10+
import { navDetailFormSchema } from './list.data';
11+
import { addNavDetail, getNavTypeTreeList, updateNavDetail } from '/@/api/nav/nav';
1312
export default defineComponent({
14-
name: 'AccountModal',
13+
name: 'NavDetailModal',
1514
components: { BasicModal, BasicForm },
1615
emits: ['success', 'register'],
1716
setup(_, { emit }) {
@@ -20,7 +19,7 @@
2019
2120
const [registerForm, { setFieldsValue, updateSchema, resetFields, validate }] = useForm({
2221
labelWidth: 100,
23-
schemas: accountFormSchema,
22+
schemas: navDetailFormSchema,
2423
showActionButtonGroup: false,
2524
actionColOptions: {
2625
span: 23,
@@ -39,27 +38,27 @@
3938
});
4039
}
4140
42-
const treeData = await getDeptList();
41+
const treeData = await getNavTypeTreeList();
4342
updateSchema([
4443
{
45-
field: 'pwd',
46-
show: !unref(isUpdate),
47-
},
48-
{
49-
field: 'dept',
44+
field: 'typeId',
5045
componentProps: { treeData },
5146
},
5247
]);
5348
});
5449
55-
const getTitle = computed(() => (!unref(isUpdate) ? '新增账号' : '编辑账号'));
50+
const getTitle = computed(() => (!unref(isUpdate) ? '新增导航' : '编辑导航'));
5651
5752
async function handleSubmit() {
5853
try {
5954
const values = await validate();
6055
setModalProps({ confirmLoading: true });
61-
// TODO custom api
62-
console.log(values);
56+
if (isUpdate.value) {
57+
values.id = rowId.value;
58+
await updateNavDetail(values);
59+
} else {
60+
await addNavDetail(values);
61+
}
6362
closeModal();
6463
emit('success', { isUpdate: unref(isUpdate), values: { ...values, id: rowId.value } });
6564
} finally {

dice-admin/src/views/nav/list/NavListTree.vue

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
search
77
:clickRowToExpand="false"
88
:treeData="treeData"
9-
:replaceFields="{ key: 'id', title: 'deptName' }"
9+
:replaceFields="{ key: 'id', title: 'name' }"
1010
@select="handleSelect"
1111
/>
1212
</div>
@@ -15,7 +15,7 @@
1515
import { defineComponent, onMounted, ref } from 'vue';
1616
1717
import { BasicTree, TreeItem } from '/@/components/Tree';
18-
import { getDeptList } from '/@/api/demo/system';
18+
import { getNavTypeTreeList } from '/@/api/nav/nav';
1919
2020
export default defineComponent({
2121
name: 'DeptTree',
@@ -26,7 +26,7 @@
2626
const treeData = ref<TreeItem[]>([]);
2727
2828
async function fetch() {
29-
treeData.value = ((await getDeptList()) as unknown) as TreeItem[];
29+
treeData.value = (await getNavTypeTreeList()) as unknown as TreeItem[];
3030
}
3131
3232
function handleSelect(keys: string, e) {
+114
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
<template>
2+
<PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
3+
<DeptTree class="w-1/4 xl:w-1/5" @select="handleSelect" />
4+
<BasicTable @register="registerTable" class="w-3/4 xl:w-4/5">
5+
<template #toolbar>
6+
<a-button type="primary" @click="handleCreate">新增导航</a-button>
7+
</template>
8+
<template #action="{ record }">
9+
<TableAction
10+
:actions="[
11+
{
12+
icon: 'clarity:note-edit-line',
13+
onClick: handleEdit.bind(null, record),
14+
},
15+
{
16+
icon: 'ant-design:delete-outlined',
17+
color: 'error',
18+
popConfirm: {
19+
title: '是否确认删除',
20+
confirm: handleDelete.bind(null, record),
21+
},
22+
},
23+
]"
24+
/>
25+
</template>
26+
</BasicTable>
27+
<AccountModal @register="registerModal" @success="handleSuccess" />
28+
</PageWrapper>
29+
</template>
30+
<script lang="ts">
31+
import { defineComponent } from 'vue';
32+
33+
import { BasicTable, useTable, TableAction } from '/@/components/Table';
34+
import { delNavDetail, getNavDetailList } from "/@/api/nav/nav";
35+
import { PageWrapper } from '/@/components/Page';
36+
import DeptTree from './NavListTree.vue';
37+
38+
import { useModal } from '/@/components/Modal';
39+
import AccountModal from './NavListModal.vue';
40+
41+
import { columns, searchFormSchema } from './list.data';
42+
43+
export default defineComponent({
44+
name: 'AccountManagement',
45+
components: { BasicTable, PageWrapper, DeptTree, AccountModal, TableAction },
46+
setup() {
47+
const [registerModal, { openModal }] = useModal();
48+
const [registerTable, { reload, updateTableDataRecord }] = useTable({
49+
title: '导航列表',
50+
api: getNavDetailList,
51+
rowKey: 'id',
52+
columns,
53+
formConfig: {
54+
labelWidth: 120,
55+
schemas: searchFormSchema,
56+
},
57+
useSearchForm: true,
58+
showTableSetting: true,
59+
bordered: true,
60+
actionColumn: {
61+
width: 80,
62+
title: '操作',
63+
dataIndex: 'action',
64+
slots: { customRender: 'action' },
65+
},
66+
});
67+
68+
function handleCreate() {
69+
openModal(true, {
70+
isUpdate: false,
71+
});
72+
}
73+
74+
function handleEdit(record: Recordable) {
75+
console.log(record);
76+
openModal(true, {
77+
record,
78+
isUpdate: true,
79+
});
80+
}
81+
82+
function handleDelete(record: Recordable) {
83+
delNavDetail(record);
84+
reload();
85+
}
86+
87+
function handleSuccess({ isUpdate, values }) {
88+
if (isUpdate) {
89+
// 演示不刷新表格直接更新内部数据。
90+
// 注意:updateTableDataRecord要求表格的rowKey属性为string并且存在于每一行的record的keys中
91+
const result = updateTableDataRecord(values.id, values);
92+
console.log(result);
93+
} else {
94+
reload();
95+
}
96+
}
97+
98+
function handleSelect(deptId = '') {
99+
console.log(deptId);
100+
reload({ searchInfo: { deptId } });
101+
}
102+
103+
return {
104+
registerTable,
105+
registerModal,
106+
handleCreate,
107+
handleEdit,
108+
handleDelete,
109+
handleSuccess,
110+
handleSelect,
111+
};
112+
},
113+
});
114+
</script>
+95
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import { BasicColumn } from '/@/components/Table';
2+
import { FormSchema } from '/@/components/Table';
3+
4+
export const columns: BasicColumn[] = [
5+
{
6+
title: '名称',
7+
dataIndex: 'name',
8+
width: 100,
9+
},
10+
{
11+
title: '图标',
12+
dataIndex: 'icon',
13+
width: 100,
14+
},
15+
{
16+
title: '创建时间',
17+
dataIndex: 'createTime',
18+
width: 180,
19+
},
20+
{
21+
title: '地址',
22+
dataIndex: 'url',
23+
width: 200,
24+
},
25+
{
26+
title: '描述',
27+
dataIndex: 'description',
28+
},
29+
];
30+
31+
export const searchFormSchema: FormSchema[] = [
32+
{
33+
field: 'name',
34+
label: '导航名',
35+
component: 'Input',
36+
colProps: { span: 8 },
37+
},
38+
{
39+
field: 'description',
40+
label: '描述',
41+
component: 'Input',
42+
colProps: { span: 8 },
43+
},
44+
{
45+
field: 'url',
46+
label: '地址',
47+
component: 'Input',
48+
colProps: { span: 8 },
49+
},
50+
];
51+
52+
export const navDetailFormSchema: FormSchema[] = [
53+
{
54+
field: 'name',
55+
label: '名称',
56+
component: 'Input',
57+
required: true,
58+
},
59+
{
60+
field: 'typeId',
61+
label: '所属分类',
62+
component: 'TreeSelect',
63+
componentProps: {
64+
replaceFields: {
65+
title: 'name',
66+
key: 'id',
67+
value: 'id',
68+
},
69+
getPopupContainer: () => document.body,
70+
},
71+
required: true,
72+
},
73+
{
74+
field: 'url',
75+
label: '地址',
76+
component: 'Input',
77+
required: true,
78+
},
79+
{
80+
field: 'icon',
81+
label: '图标',
82+
component: 'Input',
83+
required: true,
84+
},
85+
{
86+
label: '排序',
87+
field: 'sort',
88+
component: 'Input',
89+
},
90+
{
91+
label: '描述',
92+
field: 'description',
93+
component: 'InputTextArea',
94+
},
95+
];

dice-server/bootstrap/src/main/resources/init.sql

+21
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,27 @@ create table nav_type
443443
create index nav_type_creator_index
444444
on nav_type (creator);
445445

446+
create table nav_detail
447+
(
448+
id bigint auto_increment comment '导航明细项id'
449+
primary key,
450+
create_time timestamp default CURRENT_TIMESTAMP null comment '创建时间',
451+
update_time timestamp default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '更新时间',
452+
creator int null comment '创建人',
453+
modifier int null comment '修改人',
454+
deleted tinyint default 0 null comment '逻辑删除标识(0.未删除,1.已删除)',
455+
is_public tinyint default 1 null comment '是否公开',
456+
icon varchar(255) null comment '图标',
457+
description varchar(255) null comment '简介',
458+
name varchar(255) null comment '导航地址名称',
459+
type_id int null comment '类型id',
460+
status tinyint null comment '状态(1启用,0禁用)'
461+
)
462+
comment '导航明细表' charset = utf8mb4;
463+
464+
create index nav_detail_creator_index
465+
on nav_detail (creator);
466+
446467
INSERT INTO dice.user (id, username, password, email, screen_name, created, logged, salt) VALUES (1, 'dice', 'dab6458f688b27c04d86b6f99757e2ce70d533f0092a85e4fbd9668261b1092b', '[email protected]', 'admin', '2019-05-16 02:24:35', '2020-09-29 15:28:07', '66666');
447468
INSERT INTO dice.user (id, username, password, email, screen_name, created, logged, salt) VALUES (2, 'demo', 'dab6458f688b27c04d86b6f99757e2ce70d533f0092a85e4fbd9668261b1092b', '[email protected]', 'demo用户', '2019-12-27 15:34:01', '2020-09-29 15:28:07', '66666');
448469

dice-server/framework/src/main/java/com/bihell/dice/framework/shiro/convert/ShiroMapstructConvert.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
import org.mapstruct.factory.Mappers;
77

88
/**
9-
* Shiro包下使用mapstruct对象属性复制转换器 todo
10-
**/
9+
* Shiro包下使用mapstruct对象属性复制转换器
10+
*
11+
* @author haseochen*/
1112
@Mapper
1213
public interface ShiroMapstructConvert {
1314

dice-server/framework/src/main/java/com/bihell/dice/framework/shiro/vo/LoginSysUserVo.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@
99

1010
/**
1111
* <p>
12-
* 登录用户对象,响应给前端 todo
12+
* 登录用户对象,响应给前端
1313
* </p>
14-
**/
14+
*
15+
* @author haseochen*/
1516
@Data
1617
@Accessors(chain = true)
1718
public class LoginSysUserVo implements Serializable {

dice-server/nav/src/main/java/com/bihell/dice/nav/controller/NavDetailController.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,10 @@ public ApiResult<NavDetail> getNavDetail(@PathVariable("id") Long id) throws Exc
8181
/**
8282
* 导航明细表分页列表
8383
*/
84-
@PostMapping("/getPageList")
84+
@GetMapping("/getPageList")
8585
@OperationLog(name = "导航明细表分页列表", type = OperationLogType.PAGE)
8686
@ApiOperation(value = "导航明细表分页列表", response = NavDetail.class)
87-
public ApiResult<Paging<NavDetail>> getNavDetailPageList(@Validated @RequestBody NavDetailPageParam navDetailPageParam) throws Exception {
87+
public ApiResult<Paging<NavDetail>> getNavDetailPageList(@Validated NavDetailPageParam navDetailPageParam) throws Exception {
8888
Paging<NavDetail> paging = navDetailService.getNavDetailPageList(navDetailPageParam);
8989
return ApiResult.ok(paging);
9090
}

0 commit comments

Comments
 (0)