1
0

feat: 优化书籍和章节编辑界面

This commit is contained in:
2024-12-23 09:47:24 +08:00
parent 13590cbe9c
commit e0653d7400
9 changed files with 571 additions and 509 deletions

16
.gitignore vendored
View File

@@ -91,14 +91,14 @@ replay_pid*
# When using Gradle or Maven with auto-import, you should exclude module files, # When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using # since they will be recreated, and may cause churn. Uncomment if using
# auto-import. # auto-import.
# .idea/artifacts .idea/artifacts
# .idea/compiler.xml .idea/compiler.xml
# .idea/jarRepositories.xml .idea/jarRepositories.xml
# .idea/modules.xml .idea/modules.xml
# .idea/*.iml .idea/*.iml
# .idea/modules .idea/modules
# *.iml *.iml
# *.ipr *.ipr
# CMake # CMake
cmake-build-*/ cmake-build-*/

7
.idea/jpa.xml generated Normal file
View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JpaBuddyIdeaProjectConfig">
<option name="defaultUnitInitialized" value="true" />
<option name="renamerInitialized" value="true" />
</component>
</project>

3
.idea/misc.xml generated
View File

@@ -7,4 +7,7 @@
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="corretto-17" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="corretto-17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" /> <output url="file://$PROJECT_DIR$/out" />
</component> </component>
<component name="ProjectType">
<option name="id" value="jpab" />
</component>
</project> </project>

BIN
gradle/wrapper/gradle-wrapper.jar vendored Normal file

Binary file not shown.

View File

@@ -33,3 +33,14 @@ spring:
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
username: bookstore username: bookstore
password: EzSn+RZ*x2&fHFh9kC+H password: EzSn+RZ*x2&fHFh9kC+H
---
spring:
config:
activate:
on-profile: mysql-remote
datasource:
url: jdbc:mysql://frp-air.top:43458/bookstore
driver-class-name: com.mysql.cj.jdbc.Driver
username: bookstore
password: EzSn+RZ*x2&fHFh9kC+H

View File

@@ -77,12 +77,132 @@ function bookDetailDialog() {
actionType: 'dialog', actionType: 'dialog',
dialog: { dialog: {
title: '编辑书籍', title: '编辑书籍',
size: 'md', size: 'lg',
body: { actions: [],
body: [
{
id: 'book-detail-dialog-form',
...bookForm(), ...bookForm(),
initApi: '${base}/book/detail/${bookId}', initApi: '${base}/book/detail/${bookId}',
api: '${base}/book/save', api: '${base}/book/save',
}, },
{
type: 'flex',
className: 'mt-5',
justify: 'flex-end',
items: [
{
type: 'action',
label: '保存',
level: 'primary',
onEvent: {
click: {
actions: [
{
actionType: 'submit',
componentId: 'book-detail-dialog-form',
},
{
actionType: 'reload',
componentId: 'book-list',
}
]
}
}
}
]
},
{
id: 'chapter-list',
type: 'crud',
...crudCommonOptions(),
api: {
method: 'get',
url: '${base}/chapter/list/${bookId}',
data: {
page: '${page|default:1}',
size: '${size|default:10}'
}
},
headerToolbar: [
'reload',
{
label: '',
icon: 'fa fa-add',
...chapterAddDialog(),
},
],
footerToolbar: [
paginationOption(),
],
columns: [
{
name: 'sequence',
label: '章节数',
width: 50,
},
{
name: 'name',
label: '名称',
width: 150,
},
{
name: 'description',
label: '简介',
},
{
type: 'operation',
label: '操作',
fixed: 'right',
className: 'nowrap',
width: 200,
buttons: [
{
type: 'action',
label: '编辑',
...chapterDetailDialog(),
},
{
type: 'action',
label: '阅读',
actionType: 'dialog',
dialog: {
title: '阅读',
size: 'lg',
actions: [],
body: {
type: 'service',
className: 'p-10',
api: '${base}/chapter/show/${chapterId}',
silentPolling: true,
body: {
type: 'tpl',
className: 'font-serif',
tpl: '${item|raw}'
}
}
}
},
{
type: 'action',
label: '导出',
actionType: 'download',
api: '${base}/chapter/export/${chapterId}',
},
{
type: 'action',
label: '删除',
level: 'danger',
confirmTitle: '确认删除',
confirmText: '确认删除名称为「${name}」的章节吗?',
actionType: 'ajax',
api: 'get:${base}/chapter/remove/${chapterId}',
},
],
},
],
},
],
}, },
} }
} }

View File

@@ -57,12 +57,174 @@ function chapterDetailDialog() {
actionType: 'dialog', actionType: 'dialog',
dialog: { dialog: {
title: '编辑章节', title: '编辑章节',
size: 'md', size: 'lg',
body: { actions: [],
body: [
{
id: 'chapter-detail-dialog-form',
...chapterForm(), ...chapterForm(),
initApi: '${base}/chapter/detail/${chapterId}', initApi: '${base}/chapter/detail/${chapterId}',
api: '${base}/chapter/save/${bookId}', api: '${base}/chapter/save/${bookId}',
}, },
{
type: 'flex',
className: 'mt-5',
justify: 'flex-end',
items: [
{
type: 'action',
label: '保存',
level: 'primary',
onEvent: {
click: {
actions: [
{
actionType: 'submit',
componentId: 'chapter-detail-dialog-form',
},
{
actionType: 'reload',
componentId: 'chapter-list',
}
]
}
}
}
]
},
{
type: 'crud',
...crudCommonOptions(),
api: {
method: 'get',
url: '${base}/line/list/${chapterId}',
data: {
page: '${page|default:1}',
size: '${size|default:10}'
}
},
quickSaveItemApi: '${base}/line/update/${lineId}',
headerToolbar: [
'reload',
{
type: 'action',
label: '',
icon: 'fa fa-upload',
actionType: 'dialog',
dialog: {
title: '导入正文',
size: 'lg',
body: {
type: 'form',
api: '${base}/chapter/import/${chapterId}',
mode: 'normal',
body: [
{
type: 'switch',
name: 'override',
label: '覆盖导入',
},
{
type: 'textarea',
name: 'text',
label: '正文',
required: true,
...formInputClearable(),
showCounter: true,
trimContents: true,
minRows: 10,
maxRows: 10,
},
],
},
},
},
],
footerToolbar: [
paginationOption(),
],
columns: [
{
name: 'sequence',
label: '行号',
width: 50,
},
{
name: 'text',
label: '内容',
quickEdit: {
saveImmediately: true,
resetOnFailed: true,
type: 'textarea',
showCounter: true,
trimContents: true,
minRows: 10,
maxRows: 10,
},
},
{
type: 'operation',
label: '操作',
fixed: 'right',
className: 'nowrap',
width: 100,
buttons: [
{
type: 'action',
label: '处理',
actionType: 'dialog',
dialog: {
title: '文本处理',
size: 'lg',
body: {
debug: true,
type: 'form',
canAccessSuperData: false,
initApi: '${base}/line/detail/${lineId}',
api: '${base}/line/save/${chapterId}',
body: [
{
type: 'hidden',
name: 'lineId',
},
{
type: 'textarea',
name: 'text',
label: '正文',
...formInputClearable(),
showCounter: true,
trimContents: true,
minRows: 5,
maxRows: 5,
},
{
type: 'textarea',
name: 'newText',
label: '优化后正文',
...formInputClearable(),
showCounter: true,
trimContents: true,
minRows: 5,
maxRows: 5,
},
]
}
}
},
{
type: 'action',
label: '删除',
level: 'danger',
confirmTitle: '确认删除',
confirmText: '确认删除当前行吗?',
actionType: 'ajax',
api: 'get:${base}/line/remove/${lineId}',
},
]
}
],
},
]
}, },
} }
} }

View File

@@ -8,12 +8,13 @@ function crudCommonOptions() {
} }
} }
function horizontalFormOptions() { function horizontalFormOptions(left = 1) {
return { return {
mode: 'horizontal', mode: 'horizontal',
canAccessSuperData: false, canAccessSuperData: false,
horizontal: { horizontal: {
left: 1, left: left,
justify: true,
}, },
} }
} }

View File

@@ -40,6 +40,7 @@
subTitle: '网络书籍精排版工具', subTitle: '网络书籍精排版工具',
body: [ body: [
{ {
id: 'book-list',
type: 'crud', type: 'crud',
api: { api: {
method: 'get', method: 'get',
@@ -96,249 +97,6 @@
label: '编辑', label: '编辑',
...bookDetailDialog(), ...bookDetailDialog(),
}, },
{
type: 'action',
label: '编辑章节',
actionType: 'dialog',
dialog: {
title: '章节',
size: 'lg',
actions: [],
body: [
{
type: 'crud',
...crudCommonOptions(),
api: {
method: 'get',
url: '${base}/chapter/list/${bookId}',
data: {
page: '${page|default:1}',
size: '${size|default:10}'
}
},
headerToolbar: [
'reload',
{
label: '',
icon: 'fa fa-add',
...chapterAddDialog(),
},
],
footerToolbar: [
paginationOption(),
],
columns: [
{
name: 'sequence',
label: '章节数',
width: 50,
},
{
name: 'name',
label: '名称',
width: 150,
},
{
name: 'description',
label: '简介',
},
{
type: 'operation',
label: '操作',
fixed: 'right',
className: 'nowrap',
width: 200,
buttons: [
{
type: 'action',
label: '编辑',
...chapterDetailDialog(),
},
{
type: 'action',
label: '阅读',
actionType: 'dialog',
dialog: {
title: '阅读',
size: 'lg',
actions: [],
body: {
type: 'service',
className: 'p-10',
api: '${base}/chapter/show/${chapterId}',
silentPolling: true,
body: {
type: 'tpl',
className: 'font-serif',
tpl: '${item|raw}'
}
}
}
},
{
type: 'action',
label: '导入',
actionType: 'dialog',
dialog: {
title: '导入正文',
size: 'lg',
body: {
debug: '${debug}',
type: 'form',
api: '${base}/chapter/import/${chapterId}',
mode: 'normal',
body: [
{
type: 'switch',
name: 'override',
label: '覆盖导入',
},
{
type: 'textarea',
name: 'text',
label: '正文',
required: true,
...formInputClearable(),
showCounter: true,
trimContents: true,
minRows: 10,
maxRows: 10,
},
],
},
},
},
{
type: 'action',
label: '导出',
actionType: 'download',
api: '${base}/chapter/export/${chapterId}',
},
{
type: 'action',
label: '编辑正文',
actionType: 'dialog',
dialog: {
title: '编辑正文',
size: 'lg',
actions: [],
body: {
type: 'crud',
...crudCommonOptions(),
api: {
method: 'get',
url: '${base}/line/list/${chapterId}',
data: {
page: '${page|default:1}',
size: '${size|default:10}'
}
},
quickSaveItemApi: '${base}/line/update/${lineId}',
headerToolbar: [
'reload',
],
footerToolbar: [
paginationOption(),
],
columns: [
{
name: 'sequence',
label: '行号',
width: 50,
},
{
name: 'text',
label: '内容',
quickEdit: {
saveImmediately: true,
resetOnFailed: true,
type: 'textarea',
showCounter: true,
trimContents: true,
minRows: 10,
maxRows: 10,
},
},
{
type: 'operation',
label: '操作',
fixed: 'right',
className: 'nowrap',
width: 100,
buttons: [
{
type: 'action',
label: '处理',
actionType: 'dialog',
dialog: {
title: '文本处理',
size: 'lg',
body: {
debug: true,
type: 'form',
canAccessSuperData: false,
initApi: '${base}/line/detail/${lineId}',
api: '${base}/line/save/${chapterId}',
body: [
{
type: 'hidden',
name: 'lineId',
},
{
type: 'textarea',
name: 'text',
label: '正文',
...formInputClearable(),
showCounter: true,
trimContents: true,
minRows: 5,
maxRows: 5,
},
{
type: 'textarea',
name: 'newText',
label: '优化后正文',
...formInputClearable(),
showCounter: true,
trimContents: true,
minRows: 5,
maxRows: 5,
},
]
}
}
},
{
type: 'action',
label: '删除',
level: 'danger',
confirmTitle: '确认删除',
confirmText: '确认删除当前行吗?',
actionType: 'ajax',
api: 'get:${base}/line/remove/${lineId}',
},
]
}
],
},
},
},
{
type: 'action',
label: '删除',
level: 'danger',
confirmTitle: '确认删除',
confirmText: '确认删除名称为「${name}」的章节吗?',
actionType: 'ajax',
api: 'get:${base}/chapter/remove/${chapterId}',
},
],
},
],
},
],
},
},
{ {
type: 'action', type: 'action',
label: '删除', label: '删除',