多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ## 1、CMS架构总览 ![](https://box.kancloud.cn/57fde360661cba52e36e0b99d1467632_1529x1395.png) >[success]几个模块在后台都有管理界面,一目了然,就不废话了 ## 2、栏目与栏目的关系 栏目可以下设子栏目,在数据库中使用pid来建立树结构关系,pid表示该级栏目的父栏目,顶级栏目的pid为0。 ## 3、栏目与内容的关系 所有的内容(文章)都必须关联一个栏目ID,表示内容在该栏目下,很简单。 ## 4、标记 作用:标记是用来给栏目或者内容增加一个或者多个记号,比如,热门,置顶,推荐等,然后展示的时候方便筛选。 >[info]在栏目表跟内容表中都有“标记”字段,考虑查询的效率问题所以没有使用ID关联,而是直接记录的标记的字符串本身,超过一个标记使用英文的逗号隔开。 ## 5、模型的作用 模型是CMS的重点跟难点,我们试着将栏目和内容都抽象的理解一下,在用户看来,不管是点击栏目列表(如图一),或者是点击内容列表(如图二),反馈给用户的无疑包含两个部分: (1)展示给用户的前端页面。 (2)展示在前端页面上的数据。 所以在模型中包含两个核心字段,一个是template(代表模板),一个是data(代表数据)。然后再将模型ID绑定到栏目上或内容上,这样,一方面可以让他们可以关联起来,第二方面还可以尽可能的重复利用代码。 ***** :-: 图一、栏目列表 ![](https://box.kancloud.cn/dd40ff2d9371fb23ba387c744a7a9aa9_433x57.png) ***** :-: 图二、内容列表 ![](https://box.kancloud.cn/05cb8e41e81a15a8dcdffcc1ba33d860_313x298.png) ## 6、模型的使用 (1)新建一个测试模型test,设置template为test/a.jsp,设置data为testData。 ![](https://box.kancloud.cn/91dd1c293f117976cab37b0a1b58a66f_1150x521.png) (2)创建一篇内容,绑定刚刚新建的测试模型。 ![](https://box.kancloud.cn/2e32dd6f8f283af62c354cb3df10cf6b_1131x523.png) (3)在cn.lcfms.cms.model包中创建一个TestData.java类文件,使该类继承CmsDataBase类,并实现接口BaseModel的方法data。 ``` package cn.lcfms.cms.model; import java.util.HashMap; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.lcfms.bin.service.BaseService; import cn.lcfms.cms.CmsDataBase; public class TestData extends CmsDataBase{ public TestData(HttpServletRequest request, HttpServletResponse response, int id, BaseService service) { super(request, response, id, service); } @Override public void data() { HashMap<String, Object> data = service.where("id",id).selectMap(); request.setAttribute("data", data); } } ``` >[warning] TestData类自带4个成员变量,request,response,id,service,id为内容或者栏目的主键id,service可以用来获取数据,request可以用来传参到前端。 > (4)在控制器中调用BaseController的Cms方法,第一个参数是为BaseService初始化的的表,第二个参数为文章或者栏目id。 ``` @RequestMapping("/article/{id}.html") public ModelAndView article_id(@PathVariable int id,HttpServletRequest request,HttpServletResponse response) { return Cms("articles",id,request,response); } ``` (5)在template中创建模板test/a.jsp,并在模板中写入内容。 ``` <%@ page language="java" contentType="text/html" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>测试</title> </head> <body> <h1>测试模板</h1> ${data.title}<br> ${data.details}<br> </body> </html> ``` (6)访问控制器 ![](https://box.kancloud.cn/c96dcc0b0f4dc9a991ae519c986495ce_763x245.png) ## 7、文件的使用(资料管理) 理论上,任何一张表的任何一行数据都可以关联N个文件,比如说一篇文章,可以有N张图片,或者N个其他类型的文件。一个栏目也一样,或者其他的表,比如用户表,一个用户也可以关联N个文件。 所以lcfms的文件模块其实是独立的,可以支持包括cms,以及其他任意模块的文件管理。有两个关键的字段来支持一对多的关系:(1)file_type,关联的表名。(2)file_type_id,该表具体某一行的id值。 比如我新建一个测试栏目,并为该栏目上传了3张图片,如下图 ![](https://box.kancloud.cn/8bf44dcdac4afa9b6d88ff83ec6f01e2_901x319.png) ![](https://box.kancloud.cn/79f174968b060b0e3ddc136c3b6e5394_1091x241.png) [点击这里查看上传文件详细](上传文件.md)