mirror of
https://gitee.com/bookshelfplus/bookshelfplus
synced 2025-09-16 23:22:20 +08:00
后台实现二级分类
This commit is contained in:
@@ -1,241 +1,3 @@
|
||||
<!-- 是否连续录入复选框 -->
|
||||
<p style="text-align: center;">
|
||||
<input type="checkbox" id="isContinuous" checked="checked" />连续录入
|
||||
</p>
|
||||
<!-- 生成分类结构 -->
|
||||
<script src="/assets/javascripts/generateCategoryHierarchy.js"></script>
|
||||
<script>
|
||||
async function getControlsProfile() {
|
||||
function btnSubmitClick() {
|
||||
formSubmit({
|
||||
type: 'POST',
|
||||
url: '/book/add',
|
||||
success: function (data) {
|
||||
console.log(data);
|
||||
alert("添加成功!");
|
||||
if (document.getElementById("isContinuous").checked) {
|
||||
location.reload();
|
||||
} else {
|
||||
// 回到书籍管理页
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async function getControlsProfile(getValidateUtils) {
|
||||
// 获取分类列表
|
||||
var categoryOptions = [];
|
||||
|
||||
var responseData = await getRequest("/category/list");
|
||||
var axiosData = responseData.data;
|
||||
var status = axiosData.status;
|
||||
var data = axiosData.data;
|
||||
if (status === "success") {
|
||||
// console.log(data)
|
||||
hierarchyData = generateCategoryHierarchy(data);
|
||||
console.log(hierarchyData);
|
||||
function render(category) {
|
||||
categoryOptions.push({
|
||||
"tag": "option",
|
||||
"attr": { "value": category.id },
|
||||
"innerHTML": `${" ".repeat((category.level - 1) * 8)}${category.name}`,
|
||||
})
|
||||
for (let i = 0; i < category.children.length; i++)
|
||||
render(category.children[i]);
|
||||
}
|
||||
render({ children: hierarchyData });
|
||||
categoryOptions.shift(); // 删除数组中的第一个元素
|
||||
} else {
|
||||
alert(`出错啦!${data.errMsg} (错误码: ${data.errCode}) `);
|
||||
}
|
||||
|
||||
console.log(categoryOptions);
|
||||
return [
|
||||
// 【模板】
|
||||
// {
|
||||
// // 必填
|
||||
// "tag": "input",
|
||||
// "attr": {
|
||||
// // 可选
|
||||
// "id": "",
|
||||
// "name": "", // 用于 POST 提交
|
||||
// "class": "",
|
||||
// "style": "",
|
||||
// "placeholder": "电子书的名称",
|
||||
// },
|
||||
// "label": {
|
||||
// "value": "书本名称",
|
||||
// },
|
||||
// "required": true, // 是否必填
|
||||
|
||||
// // 可选
|
||||
// "innerHTML": "",
|
||||
// "children": [
|
||||
// {
|
||||
// "tag": "option",
|
||||
// "attr": { "value": "1" },
|
||||
// "innerHTML": "选项1",
|
||||
// },
|
||||
// {
|
||||
// "tag": "option",
|
||||
// "attr": { "value": "2" },
|
||||
// "innerHTML": "选项2",
|
||||
// },
|
||||
// ],
|
||||
// "validate": function (value) {
|
||||
// var validate = validateUtils.setValue(value)
|
||||
// .validate.notNull(value, "书本名称不能为空,请输入书本名称")
|
||||
// .validate.notNull(value, "书本名称不能超过 50 个字符")
|
||||
// .validate.notNull(value, "书本名称不能包含特殊字符")
|
||||
// .result();
|
||||
// console.log(validate);
|
||||
|
||||
// if (validateUtils.isEmpty(value)) {
|
||||
// result = false;
|
||||
// msg = "不能为空";
|
||||
// }
|
||||
// return { result: result, msg: msg };
|
||||
// }
|
||||
// },
|
||||
// 必须设置 id, name
|
||||
// 只有设置了 id 才会使用 validate 校验取值
|
||||
{
|
||||
"tag": "input",
|
||||
"attr": {
|
||||
"id": "bookName",
|
||||
"name": "bookName",
|
||||
"placeholder": "电子书的名称",
|
||||
},
|
||||
"label": {
|
||||
"value": "书本名称",
|
||||
},
|
||||
"required": true, // 是否必填
|
||||
"innerHTML": "",
|
||||
"validate": (val) => getValidateUtils().setValue(val)
|
||||
.notString("传入的值为非字符串类型")
|
||||
.notEmptyAfterTrim("书本名称不能为空,请输入书本名称")
|
||||
.length(0, 50, "书本名称不能超过 50 个字符")
|
||||
.isValid()
|
||||
},
|
||||
{
|
||||
"tag": "input",
|
||||
"attr": {
|
||||
"id": "author",
|
||||
"name": "author",
|
||||
"placeholder": "电子书的作者",
|
||||
},
|
||||
"label": {
|
||||
"value": "作者姓名",
|
||||
},
|
||||
"required": true, // 是否必填
|
||||
"innerHTML": "",
|
||||
"validate": (val) => getValidateUtils().setValue(val)
|
||||
.notString("传入的值为非字符串类型")
|
||||
.notEmpty("作者姓名不能为空")
|
||||
.length(0, 50, "作者姓名不能超过 50 个字符")
|
||||
.isValid()
|
||||
},
|
||||
{
|
||||
"tag": "textarea",
|
||||
"attr": {
|
||||
"id": "description",
|
||||
"name": "description",
|
||||
"style": "height:100px;",
|
||||
"placeholder": "电子书的简介",
|
||||
},
|
||||
"label": {
|
||||
"value": "书籍简介",
|
||||
},
|
||||
"required": false, // 是否必填
|
||||
"innerHTML": "",
|
||||
"validate": (val) => getValidateUtils().setValue(val)
|
||||
.notString("传入的值为非字符串类型")
|
||||
.length(0, 5000, "书籍简介不能超过 5000 个字符")
|
||||
.isValid()
|
||||
},
|
||||
{
|
||||
"tag": "select",
|
||||
"attr": {
|
||||
"id": "language",
|
||||
"name": "language",
|
||||
"placeholder": "书籍语言",
|
||||
},
|
||||
"label": {
|
||||
"value": "语言",
|
||||
},
|
||||
"required": true, // 是否必填
|
||||
"children": [
|
||||
{
|
||||
"tag": "option",
|
||||
"attr": { "value": "Chinese" },
|
||||
"innerHTML": "中文",
|
||||
},
|
||||
{
|
||||
"tag": "option",
|
||||
"attr": { "value": "English" },
|
||||
"innerHTML": "英文",
|
||||
},
|
||||
{
|
||||
"tag": "option",
|
||||
"attr": { "value": "" },
|
||||
"innerHTML": "其他",
|
||||
},
|
||||
],
|
||||
"innerHTML": "",
|
||||
"validate": (val) => getValidateUtils().setValue(val)
|
||||
.notNull("书籍语言传入值错误")
|
||||
.isValid()
|
||||
},
|
||||
{
|
||||
"tag": "input",
|
||||
"attr": {
|
||||
"id": "publishingHouse",
|
||||
"name": "publishingHouse",
|
||||
"placeholder": "出版社",
|
||||
},
|
||||
"label": {
|
||||
"value": "出版社",
|
||||
},
|
||||
"required": true, // 是否必填
|
||||
"innerHTML": "",
|
||||
"validate": (val) => getValidateUtils().setValue(val)
|
||||
.notString("传入的值为非字符串类型")
|
||||
.notEmpty("出版社不能为空")
|
||||
.length(0, 50, "出版社不能超过 50 个字符")
|
||||
.isValid()
|
||||
},
|
||||
{
|
||||
"tag": "input",
|
||||
"attr": {
|
||||
"id": "copyright",
|
||||
"name": "copyright",
|
||||
"placeholder": "来源信息 & 版权信息",
|
||||
},
|
||||
"label": {
|
||||
"value": "来源(版权)",
|
||||
},
|
||||
"required": false, // 是否必填
|
||||
"innerHTML": "",
|
||||
"validate": (val) => getValidateUtils().setValue(val)
|
||||
.notNull("来源(版权)传入值错误")
|
||||
.isValid()
|
||||
},
|
||||
{
|
||||
"tag": "select",
|
||||
"attr": {
|
||||
"id": "categoryId",
|
||||
"name": "categoryId",
|
||||
},
|
||||
"label": {
|
||||
"value": "书籍分类",
|
||||
},
|
||||
"required": true, // 是否必填
|
||||
"children": categoryOptions,
|
||||
"validate": (val) => getValidateUtils().setValue(val)
|
||||
.notEmpty("请选择书籍分类")
|
||||
.notStringNumber("书籍分类传入值错误")
|
||||
.isValid()
|
||||
},
|
||||
];
|
||||
}
|
||||
</script>
|
||||
<p>
|
||||
<a href="book-manage/add">添加书籍</a>
|
||||
</p>
|
240
bookshelfplus-frontend/views/dashboard/admin/BookManage_Add.html
Normal file
240
bookshelfplus-frontend/views/dashboard/admin/BookManage_Add.html
Normal file
@@ -0,0 +1,240 @@
|
||||
<!-- 是否连续录入复选框 -->
|
||||
<p style="text-align: center;">
|
||||
<input type="checkbox" id="isContinuous" checked="checked" />连续录入
|
||||
</p>
|
||||
<!-- 生成分类结构 -->
|
||||
<script src="/assets/javascripts/generateCategoryHierarchy.js"></script>
|
||||
<script>
|
||||
function btnSubmitClick() {
|
||||
formSubmit({
|
||||
type: 'POST',
|
||||
url: '/book/add',
|
||||
success: function (data) {
|
||||
console.log(data);
|
||||
alert("添加成功!");
|
||||
if (document.getElementById("isContinuous").checked) {
|
||||
location.reload();
|
||||
} else {
|
||||
// 回到书籍管理页
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async function getControlsProfile(getValidateUtils) {
|
||||
// 获取分类列表
|
||||
var categoryOptions = [];
|
||||
|
||||
var responseData = await getRequest("/category/list");
|
||||
var axiosData = responseData.data;
|
||||
var status = axiosData.status;
|
||||
var data = axiosData.data;
|
||||
if (status === "success") {
|
||||
// console.log(data)
|
||||
hierarchyData = generateCategoryHierarchy(data);
|
||||
console.log(hierarchyData);
|
||||
function render(category) {
|
||||
categoryOptions.push({
|
||||
"tag": "option",
|
||||
"attr": { "value": category.id },
|
||||
"innerHTML": `${" ".repeat((category.level - 1) * 8)}${category.name}`,
|
||||
})
|
||||
for (let i = 0; i < category.children.length; i++)
|
||||
render(category.children[i]);
|
||||
}
|
||||
render({ children: hierarchyData });
|
||||
categoryOptions.shift(); // 删除数组中的第一个元素
|
||||
} else {
|
||||
alert(`出错啦!${data.errMsg} (错误码: ${data.errCode}) `);
|
||||
}
|
||||
|
||||
console.log(categoryOptions);
|
||||
return [
|
||||
// 【模板】
|
||||
// {
|
||||
// // 必填
|
||||
// "tag": "input",
|
||||
// "attr": {
|
||||
// // 可选
|
||||
// "id": "",
|
||||
// "name": "", // 用于 POST 提交
|
||||
// "class": "",
|
||||
// "style": "",
|
||||
// "placeholder": "电子书的名称",
|
||||
// },
|
||||
// "label": {
|
||||
// "value": "书本名称",
|
||||
// },
|
||||
// "required": true, // 是否必填
|
||||
|
||||
// // 可选
|
||||
// "innerHTML": "",
|
||||
// "children": [
|
||||
// {
|
||||
// "tag": "option",
|
||||
// "attr": { "value": "1" },
|
||||
// "innerHTML": "选项1",
|
||||
// },
|
||||
// {
|
||||
// "tag": "option",
|
||||
// "attr": { "value": "2" },
|
||||
// "innerHTML": "选项2",
|
||||
// },
|
||||
// ],
|
||||
// "validate": function (value) {
|
||||
// var validate = validateUtils.setValue(value)
|
||||
// .validate.notNull(value, "书本名称不能为空,请输入书本名称")
|
||||
// .validate.notNull(value, "书本名称不能超过 50 个字符")
|
||||
// .validate.notNull(value, "书本名称不能包含特殊字符")
|
||||
// .result();
|
||||
// console.log(validate);
|
||||
|
||||
// if (validateUtils.isEmpty(value)) {
|
||||
// result = false;
|
||||
// msg = "不能为空";
|
||||
// }
|
||||
// return { result: result, msg: msg };
|
||||
// }
|
||||
// },
|
||||
// 必须设置 id, name
|
||||
// 只有设置了 id 才会使用 validate 校验取值
|
||||
{
|
||||
"tag": "input",
|
||||
"attr": {
|
||||
"id": "bookName",
|
||||
"name": "bookName",
|
||||
"placeholder": "电子书的名称",
|
||||
},
|
||||
"label": {
|
||||
"value": "书本名称",
|
||||
},
|
||||
"required": true, // 是否必填
|
||||
"innerHTML": "",
|
||||
"validate": (val) => getValidateUtils().setValue(val)
|
||||
.notString("传入的值为非字符串类型")
|
||||
.notEmptyAfterTrim("书本名称不能为空,请输入书本名称")
|
||||
.length(0, 50, "书本名称不能超过 50 个字符")
|
||||
.isValid()
|
||||
},
|
||||
{
|
||||
"tag": "input",
|
||||
"attr": {
|
||||
"id": "author",
|
||||
"name": "author",
|
||||
"placeholder": "电子书的作者",
|
||||
},
|
||||
"label": {
|
||||
"value": "作者姓名",
|
||||
},
|
||||
"required": true, // 是否必填
|
||||
"innerHTML": "",
|
||||
"validate": (val) => getValidateUtils().setValue(val)
|
||||
.notString("传入的值为非字符串类型")
|
||||
.notEmpty("作者姓名不能为空")
|
||||
.length(0, 50, "作者姓名不能超过 50 个字符")
|
||||
.isValid()
|
||||
},
|
||||
{
|
||||
"tag": "textarea",
|
||||
"attr": {
|
||||
"id": "description",
|
||||
"name": "description",
|
||||
"style": "height:100px;",
|
||||
"placeholder": "电子书的简介",
|
||||
},
|
||||
"label": {
|
||||
"value": "书籍简介",
|
||||
},
|
||||
"required": false, // 是否必填
|
||||
"innerHTML": "",
|
||||
"validate": (val) => getValidateUtils().setValue(val)
|
||||
.notString("传入的值为非字符串类型")
|
||||
.length(0, 5000, "书籍简介不能超过 5000 个字符")
|
||||
.isValid()
|
||||
},
|
||||
{
|
||||
"tag": "select",
|
||||
"attr": {
|
||||
"id": "language",
|
||||
"name": "language",
|
||||
"placeholder": "书籍语言",
|
||||
},
|
||||
"label": {
|
||||
"value": "语言",
|
||||
},
|
||||
"required": true, // 是否必填
|
||||
"children": [
|
||||
{
|
||||
"tag": "option",
|
||||
"attr": { "value": "Chinese" },
|
||||
"innerHTML": "中文",
|
||||
},
|
||||
{
|
||||
"tag": "option",
|
||||
"attr": { "value": "English" },
|
||||
"innerHTML": "英文",
|
||||
},
|
||||
{
|
||||
"tag": "option",
|
||||
"attr": { "value": "" },
|
||||
"innerHTML": "其他",
|
||||
},
|
||||
],
|
||||
"innerHTML": "",
|
||||
"validate": (val) => getValidateUtils().setValue(val)
|
||||
.notNull("书籍语言传入值错误")
|
||||
.isValid()
|
||||
},
|
||||
{
|
||||
"tag": "input",
|
||||
"attr": {
|
||||
"id": "publishingHouse",
|
||||
"name": "publishingHouse",
|
||||
"placeholder": "出版社",
|
||||
},
|
||||
"label": {
|
||||
"value": "出版社",
|
||||
},
|
||||
"required": true, // 是否必填
|
||||
"innerHTML": "",
|
||||
"validate": (val) => getValidateUtils().setValue(val)
|
||||
.notString("传入的值为非字符串类型")
|
||||
.notEmpty("出版社不能为空")
|
||||
.length(0, 50, "出版社不能超过 50 个字符")
|
||||
.isValid()
|
||||
},
|
||||
{
|
||||
"tag": "input",
|
||||
"attr": {
|
||||
"id": "copyright",
|
||||
"name": "copyright",
|
||||
"placeholder": "来源信息 & 版权信息",
|
||||
},
|
||||
"label": {
|
||||
"value": "来源(版权)",
|
||||
},
|
||||
"required": false, // 是否必填
|
||||
"innerHTML": "",
|
||||
"validate": (val) => getValidateUtils().setValue(val)
|
||||
.notNull("来源(版权)传入值错误")
|
||||
.isValid()
|
||||
},
|
||||
{
|
||||
"tag": "select",
|
||||
"attr": {
|
||||
"id": "categoryId",
|
||||
"name": "categoryId",
|
||||
},
|
||||
"label": {
|
||||
"value": "书籍分类",
|
||||
},
|
||||
"required": true, // 是否必填
|
||||
"children": categoryOptions,
|
||||
"validate": (val) => getValidateUtils().setValue(val)
|
||||
.notEmpty("请选择书籍分类")
|
||||
.notStringNumber("书籍分类传入值错误")
|
||||
.isValid()
|
||||
},
|
||||
];
|
||||
}
|
||||
</script>
|
Reference in New Issue
Block a user