[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)
- 系统入门
- 系统简介
- 目录结构
- 系统配置
- 应用
- 应用
- 控制器
- 模板
- 自定义标签
- 用户信息
- 调试
- 调试模式
- 使用Vardump打印
- 访问数据库
- 数据库配置
- Dao模式
- BaseService模式
- 获取对象
- 插入
- 修改
- 删除
- 查询
- where方法
- column方法
- join方法
- 其他查询方法
- 操作集合
- sql方法
- 查询回调接口
- 使用别名
- 后台验证
- 同步表结构
- 使用事务
- 数据分页
- 通用视图模板
- CommonPageView
- CommonPageLayer
- CommonTreeView
- CommonEditView
- CommonEditLayer
- 日志管理
- 后台菜单
- 权限管理
- CMS
- CMS核心
- CMS仿站工具
- CMS采集工具
- websocket
- UI自动生成器
- 缓存
- 自定义缓存
- 生成静态页面
- 表单
- 上传文件
- 前端验证