Mure 7 månader sedan
förälder
incheckning
e4346aa288

+ 1 - 0
db/cms_article.sql

@@ -11,6 +11,7 @@ CREATE TABLE `cms_article` (
     `user_id` BIGINT NOT NULL COMMENT '作者/用户ID',
     `category_id` BIGINT NOT NULL COMMENT '资讯分类ID',
     `uid` VARCHAR(36) NOT NULL COMMENT 'UID',
+    `thumb` VARCHAR(500) COMMENT '封面图',
     `is_top` TINYINT(1) DEFAULT '-1' COMMENT '是否置顶 (-1否, 1是)',
     `status` TINYINT(1) DEFAULT '1' COMMENT '资讯状态 (-1禁用, 1启用)',
     -- `audit_status` TINYINT(1) DEFAULT '1' COMMENT '审核状态 (-1审核拒绝, 1待审核, 2审核通过)',

+ 2 - 2
db/sys_user.sql

@@ -24,8 +24,8 @@ CREATE TABLE `sys_user` (
 
 INSERT INTO sys_user(username, phone, phone_area_code, password) VALUES
     ('admin', '13670511519', 86, '$2a$10$xITUWkoJydVbYzwh2nflmOWTTGFp0bByyFXnr2l5W1ZM080uPseEC'),
-    ('admintest', '13333330001', null, '$2a$10$lVO.VhDbyCKMsfajNQc6xO4aZsWMHu0p5YuVATNuAgLV8Pbjkv17W'),
-    ('admintest2', '13333330002', null, '$2a$10$Uo530feMzEZFIU9y40uiteN493JWtJQBVpLBRVWC4dg/Mv7eaUhMy'),
+    ('admin2', '13333330001', null, '$2a$10$lVO.VhDbyCKMsfajNQc6xO4aZsWMHu0p5YuVATNuAgLV8Pbjkv17W'),
+    ('admin3', '13333330002', null, '$2a$10$Uo530feMzEZFIU9y40uiteN493JWtJQBVpLBRVWC4dg/Mv7eaUhMy'),
     ('aaa', '13333330003', null, '123456'),
     ('bbb', '13333330004', null, '123456'),
     ('ccc', '13333330005', null, '123456'),

+ 2 - 2
db/sys_user_info.sql

@@ -53,8 +53,8 @@ CREATE TABLE `sys_user_info` (
 
 INSERT INTO sys_user_info(user_id, nickname, email, gender, is_super, audit_status, audit_note, status, avatar, invite_code, create_time) VALUES
     (1, '超人', 'admin@qq.com', '1', '1', '2', '同意通过备注', '1', null, '12c9dd17-b7f4-4483-a513-fbcc36512d8d', '2023-07-19 10:45:00'),
-    (2, '测试账号', '1111@qq.com', '1', '1', '2', '同意通过备注', '1', null, '12c9dd17-b7f4-4483-a513-fbcc36512d8d', '2023-07-19 10:45:01'),
-    (3, '测试账号2', '2222@qq.com', '2', '1', '2', '同意通过备注', '1', null, '12c9dd17-b7f4-4483-a513-fbcc36512d8d', '2023-07-19 10:45:02'),
+    (2, 'AI运营', '1111@qq.com', '1', '1', '2', '同意通过备注', '1', null, '12c9dd17-b7f4-4483-a513-fbcc36512d8d', '2023-07-19 10:45:01'),
+    (3, '内容运营', '2222@qq.com', '2', '1', '2', '同意通过备注', '1', null, '12c9dd17-b7f4-4483-a513-fbcc36512d8d', '2023-07-19 10:45:02'),
     (4, 'aaa', 'aaa@qq.com', '2', '-1', '1', '', '1', null, '12c9dd17-b7f4-4483-a513-fbcc36512d8d', '2023-07-19 10:45:03'),
     (5, 'bbb', 'bbb@qq.com', '2', '-1', '-1', '拒绝通过备注', '1', null, '12c9dd17-b7f4-4483-a513-fbcc36512d8d', '2023-07-19 10:45:04'),
     (6, 'ccc', 'ccc@qq.com', '1', '-1', '-1', '拒绝通过备注', '1', null, '12c9dd17-b7f4-4483-a513-fbcc36512d8d', '2023-07-19 10:45:05'),

+ 1 - 1
db/sys_user_role.sql

@@ -22,5 +22,5 @@ CREATE TABLE `sys_user_role` (
 INSERT INTO sys_user_role(role_name, role_description, sort) VALUES
     ('管理员', '全部权限', 1),
     ('普通用户', '普通使用权限,没有管理权限', 2),
-    ('测试角色', '测试角色权限', 3)
+    ('内容管理员', '负责内容管理的运营人员', 3)
 ;

+ 21 - 23
db/sys_user_role_menu.sql

@@ -22,7 +22,7 @@ CREATE TABLE `sys_user_role_menu` (
 ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='系统菜单表';
 
 INSERT INTO sys_user_role_menu(id, parent_id, menu_name, menu_name_en, type, path, component, meta, icon, permission_id, sort) VALUES
-    (1, -1, '创意中心', 'Idea Center', 1, '/', '/src/views/home/ideaCenter.vue', '{}', 'House', '2', 1),
+    (1, -1, '创意中心', 'Idea Center', 1, '/', '/src/views/home/ideaCenter.vue', '{}', 'House', '2', 999),
 
 #     (-1, '商城管理', 'B2c', 1, '/b2c/good', '', '{}', 'Goods', '11', 2),
 #     (2, '商品管理', 'Goods', 1, '/b2c/good/b2cGood', '/src/views/b2c/good/b2cGood.vue', '{}', null, '11.1', 3),
@@ -36,32 +36,20 @@ INSERT INTO sys_user_role_menu(id, parent_id, menu_name, menu_name_en, type, pat
 #
 #     (2, '订单管理', 'Orders', 1, '/b2c/order/b2cOrder', '/src/views/b2c/order/b2cOrder.vue', '{}', null, null, 4),
 #     (2, '订单详情', 'Orders Detail', 2, '/b2c/order/b2cOrderDetail', '/src/views/b2c/order/b2cOrderDetail.vue', '{"isBack":true,"isHide":true}', null, null, 4),
-#
-#     (-1, '内容管理', 'CMS', 1, '/cms', '', '{}', 'Document', '12', 5),
-#     (13, '页面管理', 'Pages', 1, '/cms/page/cmsPage', '/src/views/cms/page/cmsPage.vue', '{}', 'Document', '12.1', 5),
-#
-#     (13, '资讯管理', 'Articles', 1, '/cms/article/cmsArticle', '/src/views/cms/article/cmsArticle.vue', '{}', null, '10.3', 6),
-#     (13, '资讯详情', 'Articles Detail', 2, '/cms/article/cmsArticleDetail', '/src/views/cms/article/cmsArticleDetail.vue', '{"isBack":true,"isHide":true}', null, '10.3.1', 6),
-#     (13, '资讯分类管理', 'Articles Categories', 1, '/cms/article/cmsArticleCategory', '/src/views/cms/article/cmsArticleCategory.vue', '{}', null, '10.2', 7),
-#     (13, '资讯分类详情', 'Articles Categorie Detail', 2, '/cms/article/cmsArticleCategoryDetail', '/src/views/cms/article/cmsArticleCategoryDetail.vue', '{"isBack":true,"isHide":true}', null, '10.2.1', 7),
-#     (13, '幻灯片管理', 'Banners', 1, '/cms/banner/cmsBanner', '/src/views/cms/banner/cmsBanner.vue', '{}', null, '10.1', 8),
-#     (13, '幻灯片详情', 'Banners Detail', 2, '/cms/banner/cmsBannerDetail', '/src/views/cms/banner/cmsBannerDetail.vue', '{"isBack":true,"isHide":true}', null, '10.1.1', 8),
 
-#     (13, '站点信息', 'SiteInfo', 1, '/cms/site/cmsSiteInfo', '/src/views/cms/site/cmsSiteInfo.vue', '{}', null, '13', 9),
+    (2, -1, 'AI文案', 'AI Copywriting', 1, '/ai/chat/copywriting', '/src/views/ai/copywriting.vue', '{}', 'Document', '31', 900),
 
-    (2, -1, 'AI文案', 'AI Copywriting', 1, '/ai/chat/copywriting', '/src/views/ai/copywriting.vue', '{}', 'Document', '31', 10),
+    (3, -1, 'AI图片生成器', 'AI Image', 1, '/ai/imagePicker', '', '{}', 'Picture', '35', 901),
+    (4, 3, 'AI模特', 'AI Model', 1, '/ai/modelCloth/make', '', '{}', '', '', 902),
+    (5, 3, 'AI商品图', 'AI Goods', 1, '/ai/generate/image/good', '', '{}', '', '', 903),
 
-    (3, -1, 'AI图片生成器', 'AI Image', 1, '/ai/imagePicker', '', '{}', 'Picture', '35', 10),
-    (4, 3, 'AI模特', 'AI Model', 1, '/ai/modelCloth/make', '', '{}', '', '', 10),
-    (5, 3, 'AI商品图', 'AI Goods', 1, '/ai/generate/image/good', '', '{}', '', '', 10),
+    (6, -1, 'AI数字人', 'AI Person', 1, '/ai/ivh', '', '{}', 'MessageBox', '33', 904),
+    (7, 6, '网红IP形象', 'Hot Figure', 1, '/ai/ivh', '', '{}', '', '', 905),
+    (8, 6, '数字人定制', 'Customized Figure', 1, '/ai/ivh/virtualman/my/virtualman', '', '{}', '', '', 906),
+    (9, 6, '声音复刻', 'Customized Voice', 1, '/ai/ivh/virtualman/my/virtualman?make_type=VOICE', '', '{}', '', '', 907),
+    (10, 6, '音视频生成', 'Generate Video', 1, '/ai/ivh/broadcast/my/broadcast', '', '{}', '', '', 908),
 
-    (6, -1, 'AI数字人', 'AI Person', 1, '/ai/ivh', '', '{}', 'MessageBox', '', 10),
-    (7, 6, '网红IP形象', 'Hot Figure', 1, '/ai/ivh', '', '{}', '', '', 10),
-    (8, 6, '数字人定制', 'Customized Figure', 1, '/ai/ivh/virtualman/my/virtualman', '', '{}', '', '', 10),
-    (9, 6, '声音复刻', 'Customized Voice', 1, '/ai/ivh/virtualman/my/virtualman?make_type=VOICE', '', '{}', '', '', 10),
-    (10, 6, '音视频生成', 'Generate Video', 1, '/ai/ivh/broadcast/my/broadcast', '', '{}', '', '', 10),
-
-    (11, -1, 'AI成片', 'AI Video', 1, '/ai/generate/video/broadcast/my/broadcast', '', '{}', 'VideoCamera', '34', 10),
+    (11, -1, 'AI成片', 'AI Video', 1, '/ai/generate/video/broadcast/my/broadcast', '', '{}', 'VideoCamera', '34', 909),
 
 
 #     (-1, '素材管理', 'Material', 1, '/material', '', '{}', 'MessageBox', '20', 10),
@@ -74,6 +62,16 @@ INSERT INTO sys_user_role_menu(id, parent_id, menu_name, menu_name_en, type, pat
 #     (8, '我的作品', 'My Work', 1, '/account/myWork', '', '{}', null, '21.2', 11),
 #     (8, '我的草稿', 'My Draft', 1, '/account/myDraft', '', '{}', null, '21.3', 11),
 
+    (30, -1, '内容管理', 'CMS', 1, '/cms', '', '{}', 'Document', '13', 5),
+    (31, 30, '页面管理', 'Pages', 1, '/cms/page/cmsPage', '/src/views/cms/page/cmsPage.vue', '{}', 'Document', '13.1', 5),
+    (32, 30, '资讯管理', 'Articles', 1, '/cms/article/cmsArticle', '/src/views/cms/article/cmsArticle.vue', '{}', null, '10.3', 6),
+    (33, 30, '资讯详情', 'Articles Detail', 2, '/cms/article/cmsArticleDetail', '/src/views/cms/article/cmsArticleDetail.vue', '{"isBack":true,"isHide":true}', null, '10.3.1', 6),
+    (34, 30, '资讯分类管理', 'Articles Categories', 1, '/cms/article/cmsArticleCategory', '/src/views/cms/article/cmsArticleCategory.vue', '{}', null, '10.2', 7),
+    (35, 30, '资讯分类详情', 'Articles Categorie Detail', 2, '/cms/article/cmsArticleCategoryDetail', '/src/views/cms/article/cmsArticleCategoryDetail.vue', '{"isBack":true,"isHide":true}', null, '10.2.1', 7),
+    (36, 30, '幻灯片管理', 'Banners', 1, '/cms/banner/cmsBanner', '/src/views/cms/banner/cmsBanner.vue', '{}', null, '10.1', 8),
+    (37, 30, '幻灯片详情', 'Banners Detail', 2, '/cms/banner/cmsBannerDetail', '/src/views/cms/banner/cmsBannerDetail.vue', '{"isBack":true,"isHide":true}', null, '10.1.1', 8),
+    (38, 30, '站点信息', 'SiteInfo', 1, '/cms/site/cmsSiteInfo', '/src/views/cms/site/cmsSiteInfo.vue', '{}', null, '13', 9),
+
     (12, -1, '系统管理', 'Systems', 1, '/system', '', '{}', 'Setting', '3', 12),
     (13, 12, '用户管理', 'Users', 1, '/system/sysUserList', '/src/views/system/sysUser/sysUserList.vue', '{}', null, '3.2', 12),
     (14, 12, '用户详情', 'Users Detail', 2, '/system/sysUserDetail', '/src/views/system/sysUser/sysUserDetail.vue', '{"isBack":true,"isHide":true}', null, '3.2.1', 12),

+ 15 - 5
db/sys_user_role_permission_relation.sql

@@ -46,6 +46,7 @@ INSERT INTO sys_user_role_permission_relation(role_id, permission_id) VALUES
     (1, '6'),
         (1, '6.1'),
             (1, '6.1.1'), (1, '6.1.3'),
+
     (1, '10'),
         (1, '10.1'),
             (1, '10.1.1'), (1, '10.1.2'), (1, '10.1.3'), (1, '10.1.4'),
@@ -66,10 +67,7 @@ INSERT INTO sys_user_role_permission_relation(role_id, permission_id) VALUES
 #             (1, '11.5.1'), (1, '11.5.2'), (1, '11.5.3'), (1, '11.5.4'),
 #         (1, '11.6'),
 #             (1, '11.6.1'), (1, '11.6.2'), (1, '11.6.3'), (1, '11.6.4'),
-#     (1, '12'),
-#         (1, '12.1'),
-#         (1, '12.2'),
-#         (1, '12.3'),
+
     (1, '13'),
         (1, '13.1'),
     (1, '14'),
@@ -121,5 +119,17 @@ INSERT INTO sys_user_role_permission_relation(role_id, permission_id) VALUES
             (3, '3.2.1'), (3, '3.2.1.2'), (3, '3.2.2'),
     (3, '4'),
         (3, '4.1'),
-            (3, '4.1.1'), (3, '4.1.2'), (3, '4.1.3'), (3, '4.1.4'), (3, '4.1.5')
+            (3, '4.1.1'), (3, '4.1.2'), (3, '4.1.3'), (3, '4.1.4'), (3, '4.1.5'),
+    (3, '10'),
+        (3, '10.1'),
+            (3, '10.1.1'), (3, '10.1.2'), (3, '10.1.3'), (3, '10.1.4'),
+        (3, '10.2'),
+            (3, '10.2.1'), (3, '10.2.2'), (3, '10.2.3'), (3, '10.2.4'),
+        (3, '10.3'),
+            (3, '10.3.1'), (3, '10.3.2'), (3, '10.3.3'), (3, '10.3.4'),
+    (3, '13'),
+        (3, '13.1'),
+    (3, '14'),
+        (3, '14.3'),
+            (3, '14.3.1'), (3, '14.3.2'), (3, '14.3.3'), (3, '14.3.4')
 ;

+ 1 - 1
db/sys_user_role_relation.sql

@@ -15,7 +15,7 @@ CREATE TABLE `sys_user_role_relation` (
 ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='系统用户角色关系表';
 
 INSERT INTO sys_user_role_relation(user_id, role_id) VALUES
-    (1, 3), (2, 1), (3, 2), (4, 2), (5, 2), (6, 2),
+    (1, 1), (2, 2), (3, 3), (4, 2), (5, 2), (6, 2),
     (7, 2), (8, 2), (9, 2), (10, 2), (11, 2), (12, 2),
     (13, 1), (14, 1), (15, 1), (16, 1)
 ;

+ 1 - 0
src/main/java/com/backendsys/modules/cms/article/entity/Article.java

@@ -30,6 +30,7 @@ public class Article {
     @NotNull(message="article_id 不能为空", groups = { Detail.class, Update.class, Delete.class })
     private Long article_id;
     private String uid;
+    private String thumb;
     @TableField(exist = false)
     @NotNull(message="article_id 不能为空", groups = { Delete.class })
     private List<Long> article_ids;

+ 33 - 4
src/main/java/com/backendsys/modules/cms/template/TemplateArticleController.java

@@ -1,11 +1,23 @@
 package com.backendsys.modules.cms.template;
 
+import cn.hutool.core.convert.Convert;
+import com.backendsys.modules.cms.article.dao.ArticleDao;
+import com.backendsys.modules.cms.article.entity.Article;
+import com.backendsys.modules.cms.article.service.ArticleService;
+import com.backendsys.modules.common.aspect.Pages;
+import com.backendsys.modules.common.utils.CookieUtil;
+import com.backendsys.utils.response.PageEntity;
+import com.backendsys.utils.v2.PageUtils;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import jakarta.servlet.http.HttpServletRequest;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import java.util.List;
+
 @Controller
 public class TemplateArticleController {
 
@@ -18,7 +30,12 @@ public class TemplateArticleController {
 //    @Autowired
 //    private CmsArticleCategoryService articleCategoryService;
 
-//    @Anonymous
+    @Autowired
+    private ArticleService articleService;
+    @Autowired
+    private ArticleDao articleDao;
+
+    @Pages
     @GetMapping({"/article"})
     public String article(Model model, HttpServletRequest request,
         @RequestParam(value = "page_num", defaultValue = "1") Integer pageNum,
@@ -27,9 +44,12 @@ public class TemplateArticleController {
         @RequestParam(value = "category_id", required = false) Long categoryId
     ) {
 
+        model.addAttribute("title","资讯中心");
+
 //        // -- 初始化公共事件 ---------------------------------------------
 //        RequestUtil.initResponse(model, request, cmsSiteInfoService, cmsNavigationService);
-//        String lang = (String) model.getAttribute("lang");
+        String lang = CookieUtil.getCookie("lang", request);
+        System.out.println("lang = " + lang);
 //        // -- Header ---------------------------------------------
 //        model.addAttribute("title", "zh".equals(lang) ? "资讯中心": "Aricle");
 //        // -------------------------------------------------------
@@ -39,8 +59,17 @@ public class TemplateArticleController {
 //        cmsArticleDTO.setTitle(title);
 //        cmsArticleDTO.setCategory_id(categoryId);
 //        cmsArticleDTO.setLang(lang);
-//        Map<String, Object> articleList = articleService.queryArticle(pageNum, pageSize, cmsArticleDTO);
-//        model.addAttribute("article", articleList);
+
+        Article article = new Article();
+        article.setLang(lang);
+        article.setTitle(title);
+        article.setCategory_id(categoryId);
+
+        PageUtils.startPage();  // 分页
+        PageEntity articleList = articleService.selectArticleList(article);
+
+        System.out.println(articleList);
+        model.addAttribute("article", articleList);
 //
 //        // [Get] 资讯分类
 //        List<Map<String, Object>> categoryList = articleCategoryService.queryArticleCategoryActive();

+ 0 - 6
src/main/java/com/backendsys/modules/cms/template/TemplateIndexController.java

@@ -9,17 +9,11 @@ import org.springframework.web.bind.annotation.GetMapping;
 @Controller
 public class TemplateIndexController {
 
-
-
     @Pages
     @GetMapping({"/"})
     public String index(Model model, HttpServletRequest request) {
 
-//        // -- 初始化公共事件 ---------------------------------------------
-//        RequestUtil.initResponse(model, request, cmsSiteInfoService, cmsNavigationService);
-//        // -- Header ---------------------------------------------
         model.addAttribute("title","首页");
-//        // -------------------------------------------------------
 
 //        model.addAttribute("bannerList", cmsBannerService.queryBannerPublic());
 //

+ 1 - 1
src/main/java/com/backendsys/modules/common/utils/CookieUtil.java

@@ -19,7 +19,7 @@ public class CookieUtil {
     public static String getCookie(String name, HttpServletRequest request) {
         String value = null;
         if (!StringUtils.isEmpty(name)) {
-            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+            //ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
             Cookie[] cks = request.getCookies();
             if (null != cks) {
                 for (Cookie cookie : cks) {

+ 4 - 0
src/main/resources/mapper/cms/article/ArticleDao.xml

@@ -6,6 +6,7 @@
         a.id id,
         a.id article_id,
         a.uid uid,
+        COALESCE(a.thumb, '') thumb,
         uf.user_id user_id,
         COALESCE(uf.nickname, '') user_nickname,
         COALESCE(ac.id, -1) category_id,
@@ -22,6 +23,7 @@
         a.id id,
         a.id article_id,
         a.uid uid,
+        COALESCE(a.thumb, '') thumb,
         uf.user_id user_id,
         COALESCE(uf.nickname, '') user_nickname,
         ac.id category_id,
@@ -55,6 +57,7 @@
         <id property="id" column="id" jdbcType="BIGINT" />
         <result property="article_id" column="article_id" javaType="java.lang.Long" />
         <result property="uid" column="uid" />
+        <result property="thumb" column="thumb" />
         <result property="user_id" column="user_id" javaType="java.lang.Long" />
         <result property="user_nickname" column="user_nickname" />
         <result property="category_id" column="category_id" javaType="java.lang.Long" />
@@ -71,6 +74,7 @@
         <id property="id" column="id" jdbcType="BIGINT" />
         <result property="article_id" column="article_id" javaType="java.lang.Long" />
         <result property="uid" column="uid" />
+        <result property="thumb" column="thumb" />
         <result property="user_id" column="user_id" javaType="java.lang.Long" />
         <result property="user_nickname" column="user_nickname" />
         <result property="category_id" column="category_id" javaType="java.lang.Long" />

+ 1 - 1
src/main/resources/mapper/system/SysUserRoleMenu.xml

@@ -50,7 +50,7 @@
                 AND type = #{type}
             </if>
         </where>
-        ORDER BY sort ASC
+        ORDER BY sort DESC
     </select>
 
 </mapper>

+ 18 - 19
src/main/resources/static/css/default.css

@@ -132,25 +132,24 @@
     margin-bottom: 10px; padding: 20px; box-sizing: border-box;
     background: #fff;
 }
-.article-list .article-item .article-thumb img { display: block; width: 220px; height: 220px; }
-
-.article-info { position: relative; width: 440px; height: 220px; padding: 10px 0; box-sizing: border-box; }
-.article-info .article-info-title { display: block; font-size: 18px; color: #333e46; margin-bottom: 10px; }
-.article-info .article-info-title:hover { color: #e5ac00; }
-.article-info .article-info-description {
-    font-size: 14px; color: #aaa; line-height: 24px;
-    display: -webkit-box; overflow: hidden; text-overflow: -o-ellipsis-lastline;
-    -webkit-line-clamp: 5; -webkit-box-orient: vertical; text-overflow: ellipsis;
-}
-.article-info .article-info-bottom { position: absolute; bottom: 0; width: 100%; display: flex; align-items: center; justify-content: space-between; }
-.article-info .article-info-time { font-size: 12px; color: #aaa; }
-.article-info .article-info-btn {
-    display: flex; align-items: center; justify-content: center;
-    height: 32px; padding: 0 16px; border-radius: 16px;
-    font-size: 12px; color: #fff; background: #333e46; transition: background-color 0.3s;
-}
-.article-info .article-info-btn:hover { background-color: #45545e; }
-.article-info .article-info-btn:active { background-color: #3c4852; }
+/*.article-list .article-item .article-thumb img { display: block; width: 220px; height: 220px; }*/
+/*.article-info { position: relative; width: 440px; height: 220px; padding: 10px 0; box-sizing: border-box; }*/
+/*.article-info .article-info-title { display: block; font-size: 18px; color: #333e46; margin-bottom: 10px; }*/
+/*.article-info .article-info-title:hover { color: #e5ac00; }*/
+/*.article-info .article-info-description {*/
+/*    font-size: 14px; color: #aaa; line-height: 24px;*/
+/*    display: -webkit-box; overflow: hidden; text-overflow: -o-ellipsis-lastline;*/
+/*    -webkit-line-clamp: 5; -webkit-box-orient: vertical; text-overflow: ellipsis;*/
+/*}*/
+/*.article-info .article-info-bottom { position: absolute; bottom: 0; width: 100%; display: flex; align-items: center; justify-content: space-between; }*/
+/*.article-info .article-info-time { font-size: 12px; color: #aaa; }*/
+/*.article-info .article-info-btn {*/
+/*    display: flex; align-items: center; justify-content: center;*/
+/*    height: 32px; padding: 0 16px; border-radius: 16px;*/
+/*    font-size: 12px; color: #fff; background: #333e46; transition: background-color 0.3s;*/
+/*}*/
+/*.article-info .article-info-btn:hover { background-color: #45545e; }*/
+/*.article-info .article-info-btn:active { background-color: #3c4852; }*/
 
 
 

+ 55 - 1
src/main/resources/templates/article.html

@@ -1,3 +1,57 @@
 <div class="hjcl-layout-container" th:fragment="body">
-  article
+
+  <div class="sub-section-main">
+    <div class="wrapper">
+      <div class="sub-section-container">
+        <div class="sub-section-container-title">Category</div>
+        <div class="sub-section-container-content">
+
+          <div class="sub-search">
+            <div th:replace="~{components/search-input::search-input}"></div>
+          </div>
+
+          <div class="article-list">
+            <div class="article-item" th:each="item, itemStat : ${article.list}">
+              <a class="article-thumb" th:if="${item.thumb != ''}" th:href="@{'/articleDetail/' + ${item.id}}"><img th:src="${item.thumb}" /></a>
+              <div class="article-info">
+                <a class="article-info-title" th:href="@{'/articleDetail/' + ${item.id}}">
+                  <span th:text="${item.title}"></span>
+                  <span th:if="${item.is_top == 1}" th:text="@{'[' + #{settop} + ']'}"></span>
+                </a>
+                <div class="article-info-description" th:text="${item.description}"></div>
+                <div class="article-info-bottom">
+                  <div class="article-info-time" th:text="${item.create_time}"></div>
+                  <a class="article-info-btn" th:href="@{'/articleDetail/' + ${item.id}}" th:text="#{viewdetail}"></a>
+                </div>
+              </div>
+            </div>
+          </div>
+          <div id="pagination-bar"></div>
+          <script th:inline="javascript">
+            // [Click] 分页
+            var lang = $.cookie('lang')
+            layui.use('laypage', function(){
+              layui.laypage.render({
+                elem: 'pagination-bar', theme: '#333e46',
+                prev: (lang == 'zh' ? '上一页' : 'Prev'),
+                next: (lang == 'zh' ? '下一页' : 'Next'),
+                count: [[${article.total}]], curr: [[${article.page_num}]], limit: [[${article.page_size}]],
+                jump: function(obj, first) {
+                  // console.log(obj)
+                  // 首次不执行
+                  if (!first) {
+                    //do something
+                    window.location.href = QueryString.updateParams({ page_num: obj.curr, page_size: obj.limit })
+                  }
+                }
+              })
+            })
+          </script>
+
+        </div>
+      </div>
+
+    </div>
+  </div>
+
 </div>

+ 4 - 6
src/main/resources/templates/layout/layout-footer.html

@@ -1,7 +1,5 @@
 <div th:fragment="layout-footer">
 
-  footer
-
 <!--  <div class="footer-menutabs">-->
 <!--    <a href="/" class="footer-menutabs-item"-->
 <!--       th:classappend="${(request_uri == '/' ? 'active' : '')}">-->
@@ -65,10 +63,10 @@
 <!--        </li>-->
 <!--      </ul>-->
 
-<!--      <div class="footer-copyright flex items-center justify-center">-->
-<!--        <span class="mx-1" th:utext="${siteInfo.copyright}"></span>-->
-<!--        <span class="mx-1" th:utext="${siteInfo.icp}"></span>-->
-<!--      </div>-->
+      <div class="footer-copyright flex items-center justify-center">
+        <span class="mx-1" th:utext="${siteInfo.copyright}"></span>
+        <span class="mx-1" th:utext="${siteInfo.icp}"></span>
+      </div>
 
 <!--    </div>-->
 <!--  </div>-->

+ 0 - 2
src/main/resources/templates/layout/layout-header.html

@@ -1,7 +1,5 @@
 <div th:fragment="layout-header" class="hjcl-layout-header">
 
-  header
-
   <div class="wrapper">
 
 <!--    <div class="nav-menu" id="navMenu"></div>-->