tsurumure před 5 měsíci
rodič
revize
b2c3b75a0d

+ 2 - 2
db/cms_banner_i18n.sql

@@ -17,6 +17,6 @@ CREATE TABLE `cms_banner_i18n` (
 ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='幻灯片表 (翻译)';
 
 INSERT INTO cms_banner_i18n(banner_id, language, title, link, image, image_thumb) VALUES
-    (1, 'zh', '枯在斯柯达欠妥', '/page/index/index', '/uploads/banners/banners.1680162484582.png', '/uploads/banners/banners.1680162484582.png'),
-    (1, 'en', 'aaaadfqwea', '/page/index/index', '/uploads/banners/banners.1680162484582.png', '/uploads/banners/banners.1680162484582.png')
+    (1, 'zh', '枯在斯柯达欠妥', '/PageDao/index/index', '/uploads/banners/banners.1680162484582.png', '/uploads/banners/banners.1680162484582.png'),
+    (1, 'en', 'aaaadfqwea', '/PageDao/index/index', '/uploads/banners/banners.1680162484582.png', '/uploads/banners/banners.1680162484582.png')
 ;

+ 8 - 8
db/cms_navigation_i18n.sql

@@ -21,14 +21,14 @@ INSERT INTO cms_navigation_i18n(navigation_id, language, navigation_name, link)
     (1, 'en', 'Product', '/article?category_id=1'),
         (2, 'en', 'Rolex', '/article?category_id=2'),
         (3, 'en', 'IWC', '/article?category_id=3'),
-    (41, 'zh', '品牌世界', '/page/brand'),
-    (41, 'en', 'Brand', '/page/brand'),
+    (41, 'zh', '品牌世界', '/PageDao/brand'),
+    (41, 'en', 'Brand', '/PageDao/brand'),
     (42, 'zh', '新闻资讯', '/article?category_id=41'),
     (42, 'en', 'New', '/article?category_id=41'),
-    (43, 'zh', '客户服务', '/page/service'),
-    (43, 'en', 'Service', '/page/service'),
-    (44, 'zh', '关于我们', '/page/about'),
-    (44, 'en', 'About', '/page/about'),
-    (45, 'zh', '联系我们', '/page/contact'),
-    (45, 'en', 'Contact', '/page/contact')
+    (43, 'zh', '客户服务', '/PageDao/service'),
+    (43, 'en', 'Service', '/PageDao/service'),
+    (44, 'zh', '关于我们', '/PageDao/about'),
+    (44, 'en', 'About', '/PageDao/about'),
+    (45, 'zh', '联系我们', '/PageDao/contact'),
+    (45, 'en', 'Contact', '/PageDao/contact')
 ;

+ 6 - 4
db/cms_page.sql

@@ -9,11 +9,13 @@ CREATE TABLE `cms_page` (
     PRIMARY KEY (`id`),
     `id` BIGINT AUTO_INCREMENT COMMENT 'ID',
     `page_sign` VARCHAR(10) NOT NULL COMMENT '内容标识',
+    `sort` INT DEFAULT '1' COMMENT '排序',
     `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
-    `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
+    `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    INDEX `idx_page_sign` (`page_sign`)
 ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='内容表';
 
-INSERT INTO cms_page(page_sign) VALUES
-    ('about'),
-    ('contact')
+INSERT INTO cms_page(page_sign, sort) VALUES
+    ('about', 2),
+    ('contact', 1)
 ;

+ 7 - 4
db/cms_page_translations.sql → db/cms_page_i18n.sql

@@ -1,15 +1,18 @@
-DROP TABLE IF EXISTS `cms_page_translations`;
-CREATE TABLE `cms_page_translations` (
+DROP TABLE IF EXISTS `cms_page_i18n`;
+CREATE TABLE `cms_page_i18n` (
     PRIMARY KEY (`id`),
     `id` BIGINT AUTO_INCREMENT COMMENT 'ID',
     `page_sign` VARCHAR(255) NOT NULL COMMENT '内容标识',
     `language` VARCHAR(10) NOT NULL COMMENT '语种',
     `title` VARCHAR(255) NOT NULL COMMENT '内容标题',
     `description` VARCHAR(500) COMMENT '内容描述',
-    `content` TEXT NOT NULL COMMENT '内容详情'
+    `content` TEXT NOT NULL COMMENT '内容详情',
+    `meta_keyword` VARCHAR(255) COMMENT 'SEO-Keyword',
+    `meta_description` VARCHAR(500) COMMENT 'SEO-Description',
+    INDEX `idx_page_sign` (`page_sign`)
 ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='内容翻译表';
 
-INSERT INTO cms_page_translations(page_sign, language, title, description, content) VALUES
+INSERT INTO cms_page_i18n(page_sign, language, title, description, content) VALUES
     ('about', 'zh', '关于我们', '一家致力于为用户提供智能生活解决方案的科技公司', '是一家致力于为用户提供智能生活解决方案的科技公司。我们的使命是利用最先进的人工智能技术,使每个人都能享受更智能、更便捷的生活体验。无论是通过我们的智能助手或者其他创新产品,我们都致力于为大家提供优质的服务和技术。'),
     ('about', 'en', 'About us', 'A technology company dedicated to providing intelligent lifestyle solutions for users', 'WeTab is a technology company dedicated to providing intelligent lifestyle solutions for users. Our mission is to leverage cutting-edge artificial intelligence technology to enable everyone to enjoy a smarter and more convenient life experience. Whether through our smart assistant or other innovative products, we are committed to providing high-quality service and technology.'),
     ('contact', 'zh', '联系我们', '', '<p>联系电话:+1234567890</p><p>邮箱地址:info@WeTab.com</p><p>企业地址:XXXX街道,XX城市,XX国家</p>'),

+ 1 - 1
db/sys_user_role_menu.sql

@@ -63,7 +63,7 @@ INSERT INTO sys_user_role_menu(id, parent_id, menu_name, menu_name_en, type, pat
 #     (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),
+    (31, 30, '页面管理', 'Pages', 1, '/cms/PageDao/cmsPage', '/src/views/cms/PageDao/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),

+ 5 - 4
db/sys_user_role_permission.sql

@@ -141,10 +141,11 @@ INSERT INTO sys_user_role_permission(id, parent_id, permission_name, sort) VALUE
     --         ('11.6.2', '11.6', '创建商品规格SKU', null),
     --         ('11.6.3', '11.6', '编辑商品规格SKU', null),
     --         ('11.6.4', '11.6', '删除商品规格SKU', null),
-    -- ('12', -1, '单页管理', null),
-    --     ('12.1', '12', '单页列表', null),
-    --     ('12.2', '12', '单页详情', null),
-    --     ('12.3', '12', '编辑单页', null),
+
+    ('12', -1, '单页管理', null),
+        ('12.1', '12', '单页列表', null),
+        ('12.2', '12', '单页详情', null),
+        ('12.3', '12', '编辑单页', null),
 
     ('13', -1, '站点管理', null),
         ('13.1', '13', '编辑站点信息', null),

+ 3 - 0
db/sys_user_role_permission_relation.sql

@@ -67,6 +67,9 @@ 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'),

+ 5 - 5
src/main/java/com/backendsys/controller/Cms/CmsPageController.java

@@ -25,11 +25,11 @@ public class CmsPageController {
     // 使用这个写法,让实体类自动添加 lang 参数,这个参数来自于 Cookie
 
 
-    @PreAuthorize("@sr.hasPermission('12.1')")
-    @GetMapping("/api/cms/page/getPage")
-    public Result getPage(@Validated PageDTO pageDTO, @Validated CmsPageDTO cmsPageDTO) {
-        return Result.success(cmsPageService.queryPage(pageDTO.getPage_num(), pageDTO.getPage_size(), cmsPageDTO));
-    }
+//    @PreAuthorize("@sr.hasPermission('12.1')")
+//    @GetMapping("/api/cms/page/getPage")
+//    public Result getPage(@Validated PageDTO pageDTO, @Validated CmsPageDTO cmsPageDTO) {
+//        return Result.success(cmsPageService.queryPage(pageDTO.getPage_num(), pageDTO.getPage_size(), cmsPageDTO));
+//    }
 
     /**
      * 详情

+ 31 - 0
src/main/java/com/backendsys/modules/cms/page/controller/PageController.java

@@ -0,0 +1,31 @@
+package com.backendsys.modules.cms.page.controller;
+
+import com.backendsys.entity.Cms.CmsPageDTO;
+import com.backendsys.entity.PageDTO;
+import com.backendsys.modules.cms.page.entity.Page;
+import com.backendsys.modules.cms.page.service.PageService;
+import com.backendsys.modules.common.utils.Result;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Validated
+@RestController
+@Tag(name = "单页管理")
+public class PageController {
+
+    @Autowired
+    private PageService pageService;
+
+    @Operation(summary = "获取单页列表")
+    @PreAuthorize("@sr.hasPermission('10.3')")
+    @GetMapping("/api/cms/page/getPage")
+    public Result getPage(@Validated Page page) {
+        return Result.success().put("data", pageService.selectPageList(page));
+    }
+
+}

+ 14 - 0
src/main/java/com/backendsys/modules/cms/page/dao/PageDao.java

@@ -0,0 +1,14 @@
+package com.backendsys.modules.cms.page.dao;
+
+import com.backendsys.modules.cms.page.entity.Page;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface PageDao extends BaseMapper<Page> {
+
+    List<Page> selectPageList(Page page);
+
+}

+ 49 - 0
src/main/java/com/backendsys/modules/cms/page/entity/Page.java

@@ -0,0 +1,49 @@
+package com.backendsys.modules.cms.page.entity;
+
+import com.backendsys.modules.cms.article.entity.ArticleCategory;
+import com.backendsys.modules.cms.article.entity.ArticleCategoryI18n;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import org.hibernate.validator.constraints.Range;
+
+import java.util.List;
+
+@Data
+@TableName("cms_page")
+public class Page {
+
+    public static interface Detail{}
+    public static interface Create{}
+    public static interface Update{}
+    public static interface Delete{}
+
+    @TableField(exist = false)
+    private String lang;
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    @NotEmpty(message="内容标识不能为空", groups = { Create.class, Update.class })
+    private String page_sign;
+
+    @TableField(exist = false)
+    private String title;
+    @TableField(exist = false)
+    private String description;
+
+    @Range(min = 1, max = 9999, message = "排序必须在 {min} 到 {max} 之间", groups = { Create.class, Update.class })
+    private Integer sort;
+
+    @TableField(exist = false)
+    @NotEmpty(message="内容不能为空", groups = { Create.class, Update.class})
+    private List<PageI18n> translations;
+
+    private String create_time;
+    private String update_time;
+
+}

+ 42 - 0
src/main/java/com/backendsys/modules/cms/page/entity/PageI18n.java

@@ -0,0 +1,42 @@
+package com.backendsys.modules.cms.page.entity;
+
+import com.backendsys.modules.cms.article.entity.ArticleI18n;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+
+@Data
+@TableName("cms_page_i18n")
+public class PageI18n {
+
+    public static interface Detail{}
+    public static interface Create{}
+    public static interface Update{}
+    public static interface Delete{}
+
+    @NotEmpty(message="语言不能为空", groups = { Create.class, Update.class })
+    private String language;
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    @NotEmpty(message="内容标识不能为空", groups = { Create.class })
+    private String page_sign;
+    @Size(max = 20, message = "内容标题长度不超过 {max} 字符", groups = { Create.class, Update.class })
+    @NotBlank(message="内容标题不能为空", groups = { Create.class, Update.class })
+    private String title;
+    @Size(max = 200, message = "内容描述长度不超过 {max} 字符", groups = { Create.class, Update.class })
+    private String description;
+    @Size(max = 10000, message = "内容长度不超过 {max} 字符", groups = { Create.class, Update.class })
+    @NotEmpty(message="内容不能为空")
+    private String content;
+
+    @Size(max = 100, message = "关键词长度不超过 {max} 字符", groups = { Create.class, Update.class })
+    private String meta_keyword;
+    @Size(max = 200, message = "关键词描述长度不超过 {max} 字符", groups = { Create.class, Update.class })
+    private String meta_description;
+
+}

+ 11 - 0
src/main/java/com/backendsys/modules/cms/page/service/PageService.java

@@ -0,0 +1,11 @@
+package com.backendsys.modules.cms.page.service;
+
+import com.backendsys.modules.cms.page.entity.Page;
+import com.backendsys.utils.response.PageEntity;
+
+public interface PageService {
+
+    // 获取单页列表
+    PageEntity selectPageList(Page page);
+
+}

+ 30 - 0
src/main/java/com/backendsys/modules/cms/page/service/impl/PageServiceImpl.java

@@ -0,0 +1,30 @@
+package com.backendsys.modules.cms.page.service.impl;
+
+import com.backendsys.modules.cms.page.dao.PageDao;
+import com.backendsys.modules.cms.page.entity.Page;
+import com.backendsys.modules.cms.page.service.PageService;
+import com.backendsys.utils.response.PageEntity;
+import com.backendsys.utils.response.PageInfoResult;
+import com.backendsys.utils.v2.PageUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class PageServiceImpl implements PageService {
+
+    @Autowired
+    private PageDao pageDao;
+
+    /**
+     * 获取单页列表
+     */
+    @Override
+    public PageEntity selectPageList(Page page) {
+        PageUtils.startPage();  // 分页
+        List<Page> list = pageDao.selectPageList(page);
+        return new PageInfoResult(list).toEntity();
+    }
+
+}

+ 1 - 16
src/main/java/com/backendsys/modules/cms/template/TemplateArticleController.java → src/main/java/com/backendsys/modules/cms/template/ViewArticleController.java

@@ -1,6 +1,5 @@
 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;
@@ -8,7 +7,6 @@ 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;
@@ -16,24 +14,11 @@ 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 {
-
-//    @Autowired
-//    private CmsSiteInfoService cmsSiteInfoService;
-//    @Autowired
-//    private CmsNavigationService cmsNavigationService;
-//    @Autowired
-//    private CmsArticleService articleService;
-//    @Autowired
-//    private CmsArticleCategoryService articleCategoryService;
+public class ViewArticleController {
 
     @Autowired
     private ArticleService articleService;
-    @Autowired
-    private ArticleDao articleDao;
 
     @Pages
     @GetMapping({"/article"})

+ 1 - 1
src/main/java/com/backendsys/modules/cms/template/TemplateIndexController.java → src/main/java/com/backendsys/modules/cms/template/ViewIndexController.java

@@ -7,7 +7,7 @@ import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.GetMapping;
 
 @Controller
-public class TemplateIndexController {
+public class ViewIndexController {
 
     @Pages
     @GetMapping({"/"})

+ 96 - 0
src/main/resources/mapper/cms/page/PageDao.xml

@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.backendsys.modules.cms.page.dao.PageDao">
+
+    <sql id="includePage">
+        p.id id,
+        p.page_sign page_sign,
+        pt.title title,
+        COALESCE(pt.description, '') description,
+        p.sort sort,
+        p.create_time create_time,
+        p.update_time update_time
+    </sql>
+
+    <sql id="includePageDetail">
+        p.id id,
+        p.page_sign page_sign,
+        p.sort sort,
+        p.create_time create_time,
+        p.update_time update_time,
+    </sql>
+    <sql id="includePageTranslation">
+        id, page_sign, language,
+        title, description, content,
+        COALESCE(meta_keyword, '') meta_keyword,
+        COALESCE(meta_description, '') meta_description
+    </sql>
+
+    <sql id="leftJoinTranslations">
+        LEFT JOIN cms_page_i18n pt ON p.page_sign = pt.page_sign
+    </sql>
+
+    <resultMap id="resultMapPage" type="java.util.LinkedHashMap">
+        <id property="id" column="id" jdbcType="BIGINT" />
+        <result property="page_sign" column="page_sign" />
+        <result property="title" column="title" />
+        <result property="description" column="description" />
+        <result property="sort" column="sort" javaType="java.lang.Integer" />
+        <result property="create_time" column="create_time" />
+        <result property="update_time" column="update_time" />
+    </resultMap>
+
+    <resultMap id="resultMapPageDetail" type="java.util.LinkedHashMap">
+        <id property="id" column="id" jdbcType="BIGINT" />
+        <result property="page_sign" column="page_sign" />
+        <result property="sort" column="sort" javaType="java.lang.Integer" />
+        <result property="create_time" column="create_time" />
+        <result property="update_time" column="update_time" />
+        <collection property="translations" javaType="java.util.List"
+            select="queryTranslationsById" column="page_sign">
+            <id property="id" column="id" />
+            <result property="page_sign" column="page_sign" />
+            <result property="title" column="title" />
+            <result property="content" column="content" />
+            <result property="description" column="description" />
+            <result property="meta_keyword" column="meta_keyword" />
+            <result property="meta_description" column="meta_description" />
+        </collection>
+    </resultMap>
+
+
+    <!-- 查 列表 -->
+    <select id="selectPageList" resultMap="resultMapPage">
+        SELECT <include refid="includePage" /> FROM cms_page p
+        <include refid="leftJoinTranslations" />
+        <where>
+            pt.language = #{lang}
+            <if test="title != null and title != ''">
+                AND pt.title LIKE CONCAT('%', #{title}, '%')
+            </if>
+            <if test="create_time != null and create_time != ''">
+                AND p.create_time >= #{create_time}
+            </if>
+        </where>
+        ORDER BY p.create_time DESC, p.sort DESC
+    </select>
+
+    <!-- 查 详情 -->
+    <select id="selectPageDetail" resultMap="resultMapPageDetail">
+        SELECT <include refid="includePageDetail" />
+        FROM cms_page p
+        <where>
+            <if test="page_sign != null and page_sign != ''">
+                AND p.page_sign = #{page_sign}
+            </if>
+        </where>
+    </select>
+
+    <!-- 查 翻译详情 (子查询) -->
+    <select id="queryTranslationsById" resultType="java.util.LinkedHashMap">
+        SELECT <include refid="includePageTranslation" />
+        FROM cms_page_i18n
+        WHERE page_sign = #{page_sign}
+    </select>
+
+</mapper>