Explorar el Código

1.添加图书管理模块

1 hace 1 mes
padre
commit
b0f29438b5

+ 1 - 1
imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/controller/cms/books/CategoriesServiceController.java

@@ -7,7 +7,7 @@ import org.springframework.web.bind.annotation.*;
 import top.imwork.commons.core.base.BaseController;
 import top.imwork.commons.core.pojo.DeleteParams;
 import top.imwork.commons.core.pojo.ResponseMsg;
-import top.imwork.silos.convert.CategoriesConvert;
+import top.imwork.window.silos.convert.CategoriesConvert;
 import top.imwork.window.silos.pojo.bo.CategoriesBO;
 import top.imwork.window.silos.pojo.bo.CategoriesResultBO;
 import top.imwork.window.silos.pojo.po.CategoriesListParamVO;

+ 1 - 1
imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/convert/CategoriesConvert.java

@@ -1,4 +1,4 @@
-package top.imwork.silos.convert;
+package top.imwork.window.silos.convert;
 
 import org.springframework.util.ObjectUtils;
 import top.imwork.window.silos.entity.Categories;

+ 3 - 3
imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/entity/Categories.java

@@ -39,7 +39,7 @@ public class Categories implements Serializable {
     /**
      * 分类颜色
      */
-    private Long categoryColor;
+    private String categoryColor;
     /**
      * 分类图标
      */
@@ -170,11 +170,11 @@ public class Categories implements Serializable {
         this.englishName = englishName;
     }
 
-    public Long getCategoryColor() {
+    public String getCategoryColor() {
         return categoryColor;
     }
 
-    public void setCategoryColor(Long categoryColor) {
+    public void setCategoryColor(String categoryColor) {
         this.categoryColor = categoryColor;
     }
 

+ 1 - 1
imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/pojo/bo/CategoriesBO.java

@@ -36,7 +36,7 @@ public class CategoriesBO implements Serializable {
     /**
      * 分类颜色
      */
-    private Long categoryColor;
+    private String categoryColor;
     /**
      * 分类图标
      */

+ 1 - 1
imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/pojo/dto/CategoriesDTO.java

@@ -36,7 +36,7 @@ public class CategoriesDTO implements Serializable {
     /**
      * 分类颜色
      */
-    private Long categoryColor;
+    private String categoryColor;
     /**
      * 分类图标
      */

+ 1 - 1
imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/pojo/po/CategoriesListParamVO.java

@@ -14,5 +14,5 @@ import top.imwork.commons.core.pojo.BaseParams;
 @EqualsAndHashCode(callSuper = true)
 @Data
 public class CategoriesListParamVO extends BaseParams {
-    private String CategoriesName;
+    private String categoriesName;
 }

+ 1 - 1
imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/pojo/po/CategoriesParamVO.java

@@ -36,7 +36,7 @@ public class CategoriesParamVO implements Serializable {
     /**
      * 分类颜色
      */
-    private Long categoryColor;
+    private String categoryColor;
     /**
      * 分类图标
      */

+ 1 - 1
imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/pojo/vo/CategoriesVO.java

@@ -37,7 +37,7 @@ public class CategoriesVO implements Serializable{
     /**
      * 分类颜色
      */
-    private Long categoryColor;
+    private String categoryColor;
     /**
      * 分类图标
      */

+ 2 - 4
imwork-windows/imwork-silos/src/main/java/top/imwork/window/silos/service/impl/CategoriesServiceImpl.java

@@ -10,7 +10,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
 import top.imwork.commons.core.utils.StringUtils;
-import top.imwork.silos.convert.CategoriesConvert;
+import top.imwork.window.silos.convert.CategoriesConvert;
 import top.imwork.window.silos.dao.CategoriesDao;
 import top.imwork.window.silos.entity.Categories;
 import top.imwork.window.silos.pojo.bo.CategoriesBO;
@@ -46,8 +46,6 @@ public class CategoriesServiceImpl extends ServiceImpl<CategoriesDao, Categories
     public CategoriesBO save(CategoriesDTO categoriesDTO) {
         Categories categories = CategoriesConvert.categoriesDtoToDo(categoriesDTO);
         if (ObjectUtils.isEmpty(categories.getId())) {
-            categories.setCategoryStatus("0");
-            categories.setIsVisible("Y");
             categories.setDelFlag("N");
             categories.setCreateTime(new Date());
             categoriesDao.insert(categories);
@@ -77,7 +75,7 @@ public class CategoriesServiceImpl extends ServiceImpl<CategoriesDao, Categories
         QueryWrapper<Categories> queryWrapper = new QueryWrapper<>();
 
         if (!StringUtils.isEmpty(categoriesListDTO.getCategoriesName())) {
-            queryWrapper.like("categories_name", categoriesListDTO.getCategoriesName());
+            queryWrapper.like("category_name", categoriesListDTO.getCategoriesName());
         }
 
         if (!StringUtils.isEmpty(categoriesListDTO.getCreateBeginTime())) {

+ 2 - 2
imwork-windows/imwork-silos/src/main/resources/static/business/cms/books/category/edit.js

@@ -16,8 +16,8 @@ layui.use(['form', 'layer'], function () {
                 categoryCode:$("#categoryCode").val(),
                 categoryName:$("#categoryName").val(),
                 englishName: $("#englishName").val(),
-                categoryColor: 1,
-                categoryIcon: 1,
+                categoryColor: $("#categoryColor").val(),
+                categoryIcon: $("#categoryIcon").val(),
                 parentId: $("#parentId").val(),
                 level: $("#level").val(),
                 path: $("#path").val(),

+ 238 - 0
imwork-windows/imwork-silos/src/main/resources/static/business/cms/books/category/list.js

@@ -1,6 +1,126 @@
 layui.config({
     base: '/assets/lib/jplus/treeTable/'
 }).use(['form', 'layer', 'table', 'laytpl', 'treeTable'], function () {
+    var form = layui.form,
+        layer = parent.layer === undefined ? layui.layer : top.layer,
+        $ = layui.jquery,
+        laytpl = layui.laytpl,
+        table = layui.table,
+        treeTable = layui.treeTable;
+
+    //用户列表
+    var tableIns = table.render({
+        elem: '#list',
+        url: '/silos/cms/books/categories/queryPage',
+        method: 'POST',
+        dataType: 'json',
+        contentType: 'application/json;charset=utf-8',
+        headers: {token: ''},
+        cellMinWidth: 95,
+        page: true,
+        height: "full-125",
+        limits: [10, 15, 20, 25],
+        limit: 15,
+        id: "listTable",
+        request: {
+            pageName: "pageNo",//重新定义当前页码参数名称
+            limitName: "pageRows"//重新定义每页大小参数名称
+        },
+        response: {
+            statusName: 'code', //数据状态的字段名称,默认:code
+            statusCode: 200, //成功的状态码,默认:0
+            msgName: 'msg',  //状态信息的字段名称,默认:msg
+            countName: 'totalRows',  //数据总数的字段名称,默认:count
+            dataName: 'data' //数据列表的字段名称,默认:data
+        },
+        where: {
+            //请求的参数写在where
+        },
+        parseData: function (res) {
+            return {
+                "code": res.code,
+                "msg": res.msg, //解析提示文本
+                "totalRows": res.data.totalRows, //解析数据长度
+                "data": res.data.dataList, //解析数据列表
+            };
+        },
+        cols: [[
+            {type: "checkbox", fixed: "left", width: 50},
+            {field: 'categoryCode', title: '分类代码', minWidth: 100, align: "center"},
+            {field: 'categoryName', title: '分类名称', minWidth: 100, align: "center"},
+            {field: 'englishName', title: '英文名称', minWidth: 100, align: "center"},
+            {
+                field: 'parentId', title: '父级分类', align: 'center', templet: function (d) {
+                    if (d.parentId == "0") {
+                        return "顶级分类";
+                    } else if (d.parentId == "1") {
+                        return "一级分类";
+                    } else if (d.parentId == "2") {
+                        return "二级分类";
+                    } else {
+                        return "三级分类";
+                    }
+                }
+            },
+            {field: 'level', title: '层级', minWidth: 100, align: "center"},
+            {field: 'sortOrder', title: '排序', minWidth: 100, align: "center"},
+            {field: 'description', title: '分类描述', align: 'center'},
+            {
+                field: 'categoryStatus', title: '状态', align: 'center', templet: function (d) {
+                    if (d.categoryStatus == "0") {
+                        return "活跃";
+                    } else if (d.categoryStatus == "1") {
+                        return "归档";
+                    }else {
+                        return "未知状态";
+                    }
+                }
+            },
+            {
+                field: 'isVisible', title: '是否可见', align: 'center', templet: function (d) {
+                    if (d.isVisible == "Y") {
+                        return "是";
+                    } else if (d.isVisible == "N") {
+                        return "否";
+                    } else {
+                        return "未知";
+                    }
+                }
+            },
+            {field: 'path', title: '分类路径', minWidth: 100, align: "center"},
+            /*{field: 'userAvatar', title: '用户头像', minWidth:100, align:"center",templet:function(d){
+                    return "<img src='"+d.userAvatar+"' style='width: 30px;height: 30px'>";
+            }},*/
+            {field: 'keywords', title: '关键词', minWidth: 100, align: "center"},
+            {field: 'creator', title: '创建人', minWidth: 100, align: "center"},
+            {field: 'modifier', title: '修改人', minWidth: 100, align: "center"},
+            {
+                field: 'createTime', title: '创建时间', minWidth: 100, align: "center", templet: function (d) {
+                    return showTime(d.createTime);
+                }
+            },
+            {
+                field: 'updateTime', title: '修改时间', minWidth: 100, align: "center", templet: function (d) {
+                    return showTime(d.updateTime);
+                }
+            },
+            {title: '操作', minWidth: 200, templet: '#listBar', fixed: "right", align: "center", toolBar: '#listBar'}
+        ]]
+    });
+    $(".search_category_btn").click(function () {
+        var categoriesName = $("#search_value").val();
+        console.log(categoriesName)
+        renderCategoriesGrid();
+        table.reload("listTable", {
+            page: {
+                curr: 1 //重新从第 1 页开始
+            },
+            where: {
+                categoriesName: $("#search_value").val()
+            }
+        })
+    })
+
     $(".add_btn").click(function () {
         edit();
     })
@@ -47,4 +167,122 @@ layui.config({
             layui.layer.full(window.sessionStorage.getItem("index"));
         })
     }
+    //时间转换函数
+    function showTime(tempDate) {
+        var d = new Date(tempDate);
+        var year = d.getFullYear();
+        var month = d.getMonth();
+        month++;
+        var day = d.getDate();
+        var hours = d.getHours();
+
+        var minutes = d.getMinutes();
+        var seconds = d.getSeconds();
+        month = month < 10 ? "0" + month : month;
+        day = day < 10 ? "0" + day : day;
+        hours = hours < 10 ? "0" + hours : hours;
+        minutes = minutes < 10 ? "0" + minutes : minutes;
+        seconds = seconds < 10 ? "0" + seconds : seconds;
+
+
+        var time = year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds;
+        return time;
+    }
+    // 生成分类卡片(网格视图)
+    function renderCategoriesGrid() {
+        const categoriesGrid = document.getElementById('categoriesGrid');
+        $.ajax({
+            url: "/silos/cms/books/categories/queryPage",
+            type: "POST",
+            dataType: "json",
+            async: false,
+            contentType: 'application/json;charset=UTF-8',
+            data: JSON.stringify({
+                pageNo:1,
+                pageRows:100,
+                categoriesName:$("#search_value").val()
+            }),
+            success: function (res) {
+                const data = res.data.dataList;
+                if (data.length === 0) {
+                    categoriesGrid.innerHTML = `
+                    <div class="empty-state">
+                        <i class="fas fa-tags"></i>
+                        <h3>暂无分类</h3>
+                        <p>点击"添加分类"按钮开始创建分类</p>
+                    </div>
+                `;
+                    return;
+                }
+
+                categoriesGrid.innerHTML = data.map(category => `
+                <div class="category-card" data-id="${category.id}">
+                    <div class="category-header">
+                        <div class="category-icon" style="background-color: ${category.categoryColor}">
+                            <i class="${category.categoryIcon}"></i>
+                        </div>
+                        <div class="category-actions">
+                            <div class="action-btn edit-btn" data-id="${category.id}">
+                                <i class="fas fa-edit"></i>
+                            </div>
+                            <div class="action-btn delete-btn" data-id="${category.id}">
+                                <i class="fas fa-trash"></i>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="category-info">
+                        <div class="category-code">${category.categoryCode}</div>
+                        <h3 class="category-name">${category.categoryName}</h3>
+                        <p class="category-description">${category.description}</p>
+                        <div class="category-meta">
+                            <span>${category.isVisible ? '可见' : '隐藏'}</span>
+                        </div>
+                    </div>
+                </div>
+            `).join('');
+            },
+            error: function (e) {
+                console.log(e);
+            }
+        })
+    }
+    // 自定义绑定事件方法
+    function bind_event(dom, fn, type, child,) {
+        if (typeof dom == 'object' && dom != 'undefined') {
+            type = type == null ? "click" : type;
+            if (child != "" && child != 'object') {
+                return dom.on(type, child, fn);
+            } else {
+                return dom.on(type, fn);
+            }
+        }
+    };
+    // 刷新页面
+    bind_event($(".search_refresh"), function () {
+        window.location.reload();
+    });
+    $(function () {
+        renderCategoriesGrid();
+        //切换tab页的显示
+        $(document).on('click', '.view-btn', function (e) {
+            // 视图切换功能
+            const viewButtons = document.querySelectorAll('.view-btn');
+            viewButtons.forEach(btn => {
+                btn.addEventListener('click', function() {
+                    const viewType = this.getAttribute('data-view');
+
+                    viewButtons.forEach(b => b.classList.remove('active'));
+                    this.classList.add('active');
+
+                    if (viewType === 'grid') {
+                        document.getElementById('categoriesGrid').classList.add('active');
+                        document.getElementById('categoriesTable').classList.remove('active');
+                    } else {
+                        document.getElementById('categoriesGrid').classList.remove('active');
+                        document.getElementById('categoriesTable').classList.add('active');
+                    }
+                });
+            });
+        })
+    });
 })

+ 16 - 19
imwork-windows/imwork-silos/src/main/resources/templates/cms/books/category/edit.html

@@ -66,15 +66,15 @@
                     <div class="form-group">
                         <label for="categoryStatus">分类状态</label>
                         <select id="categoryStatus">
-                            <option value="active">活跃</option>
-                            <option value="inactive">未激活</option>
+                            <option value="0">活跃</option>
+                            <option value="1">归档</option>
                         </select>
                     </div>
                     <div class="form-group">
                         <label for="isVisible">是否可见</label>
                         <select id="isVisible">
-                            <option value="1">可见</option>
-                            <option value="0">隐藏</option>
+                            <option value="Y">可见</option>
+                            <option value="N">隐藏</option>
                         </select>
                     </div>
                 </div>
@@ -82,15 +82,12 @@
                 <div class="form-row">
                     <div class="form-group">
                         <label>分类颜色</label>
-                        <div class="color-preview">
-                            <div class="color-option selected" style="background-color: #4f46e5;" data-color="#4f46e5"></div>
-                            <div class="color-option" style="background-color: #ef4444;" data-color="#ef4444"></div>
-                            <div class="color-option" style="background-color: #10b981;" data-color="#10b981"></div>
-                            <div class="color-option" style="background-color: #f59e0b;" data-color="#f59e0b"></div>
-                            <div class="color-option" style="background-color: #8b5cf6;" data-color="#8b5cf6"></div>
-                            <div class="color-option" style="background-color: #ec4899;" data-color="#ec4899"></div>
-                        </div>
-                        <input type="hidden" id="categoryColor" name="categoryColor" value="#4f46e5">
+                        <select id="categoryColor" name="categoryColor"  value="#4f46e5" style="background-color: #4f46e5;">
+                            <option value="#10b981" style="background-color: #10b981;">一级分类</option>
+                            <option value="#ef4444" style="background-color: #ef4444;">二级分类</option>
+                            <option value="#f59e0b" style="background-color: #f59e0b;">三级分类</option>
+                            <option value="#ec4899" style="background-color: #ec4899;">三级分类</option>
+                        </select>
                     </div>
                     <div class="form-group">
                         <label>分类图标</label>
@@ -117,22 +114,22 @@
                         <input type="hidden" id="categoryIcon" name="categoryIcon" value="book">
                     </div>
                     <div class="form-group">
-                        <label for="categoryPath">分类路径</label>
-                        <input type="text" id="categoryPath" placeholder="如: /文学/小说">
+                        <label for="path">分类路径</label>
+                        <input type="text" id="path" placeholder="如: /文学/小说">
                     </div>
                 </div>
 
                 <div class="form-row">
                     <div class="form-group full-width">
-                        <label for="categoryDescription">分类描述</label>
-                        <textarea id="categoryDescription" rows="3" placeholder="请输入分类描述"></textarea>
+                        <label for="description">分类描述</label>
+                        <textarea id="description" rows="3" placeholder="请输入分类描述"></textarea>
                     </div>
                 </div>
 
                 <div class="form-row">
                     <div class="form-group full-width">
-                        <label for="categoryNotes">备注</label>
-                        <textarea id="categoryNotes" rows="2" placeholder="请输入备注信息"></textarea>
+                        <label for="remark">备注</label>
+                        <textarea id="remark" rows="2" placeholder="请输入备注信息"></textarea>
                     </div>
                 </div>
 

+ 14 - 21
imwork-windows/imwork-silos/src/main/resources/templates/cms/books/category/list.html

@@ -78,12 +78,12 @@
         <div class="search-bar">
             <div class="search-input">
                 <i class="fas fa-search search-icon"></i>
-                <input type="text" placeholder="搜索书名、作者或ISBN...">
+                <input type="text" placeholder="搜索书名、作者或ISBN..." id="search_value" name="search_value" autocomplete="off">
             </div>
-            <button class="btn btn-primary">
+            <button class="btn btn-primary search_category_btn">
                 <i class="fas fa-search"></i> 搜索
             </button>
-            <button class="btn btn-secondary">
+            <button class="btn btn-secondary search_refresh">
                 <i class="fas fa-sync-alt"></i> 刷新
             </button>
             <button class="btn btn-primary add_btn" id="addCategoryBtn">
@@ -94,10 +94,10 @@
         <div class="filters">
             <div class="filter-group">
                 <label>分类</label>
-                <select>
-                    <option>全部</option>
-                    <option>文学</option>
-                    <option>科技</option>
+                <select id="category" name="category">
+                    <option value="all">全部</option>
+                    <option value="古典文学">文学</option>
+                    <option value="历史传记">科技</option>
                     <option>历史</option>
                     <option>经济</option>
                     <option>教育</option>
@@ -146,21 +146,14 @@
 
         <!-- 列表视图 -->
         <div class="categories-table" id="categoriesTable">
-            <div class="table-header">
-                <div class="table-cell">序号</div>
-                <div class="table-cell">分类代码</div>
-                <div class="table-cell">分类名称</div>
-                <div class="table-cell hide-on-mobile">英文名称</div>
-                <div class="table-cell hide-on-medium">父级分类</div>
-                <div class="table-cell hide-on-large">层级</div>
-                <div class="table-cell">状态</div>
-                <div class="table-cell hide-on-small">可见性</div>
-                <div class="table-cell hide-on-large">排序</div>
-                <div class="table-cell hide-on-medium">路径</div>
-                <div class="table-cell">操作</div>
-            </div>
             <div id="categoriesTableBody">
-                <!-- 表格行将通过JavaScript动态生成 -->
+                <table id="list" lay-filter="list" class="table-header"></table>
+                <!--操作-->
+                <script type="text/html" id="listBar">
+                    <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
+                    <a class="layui-btn layui-btn-xs layui-btn-warm" lay-event="usable">已启用</a>
+                    <a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="del">删除</a>
+                </script>
             </div>
         </div>
     </section>