shuzheng 9 лет назад
Родитель
Сommit
c4c668042d
26 измененных файлов с 1652 добавлено и 256 удалено
  1. 35 0
      zheng-cms/zheng-cms-web/src/main/java/com/zheng/cms/web/controller/ArticleController.java
  2. 26 0
      zheng-cms/zheng-cms-web/src/main/java/com/zheng/cms/web/controller/BlogController.java
  3. 70 0
      zheng-cms/zheng-cms-web/src/main/java/com/zheng/cms/web/controller/CategoryController.java
  4. 53 33
      zheng-cms/zheng-cms-web/src/main/java/com/zheng/cms/web/controller/IndexController.java
  5. 26 0
      zheng-cms/zheng-cms-web/src/main/java/com/zheng/cms/web/controller/NewsController.java
  6. 39 0
      zheng-cms/zheng-cms-web/src/main/java/com/zheng/cms/web/controller/PageController.java
  7. 26 0
      zheng-cms/zheng-cms-web/src/main/java/com/zheng/cms/web/controller/QaController.java
  8. 66 0
      zheng-cms/zheng-cms-web/src/main/java/com/zheng/cms/web/controller/SearchController.java
  9. 73 0
      zheng-cms/zheng-cms-web/src/main/java/com/zheng/cms/web/controller/TagController.java
  10. 61 0
      zheng-cms/zheng-cms-web/src/main/java/com/zheng/cms/web/controller/TopicController.java
  11. 62 0
      zheng-cms/zheng-cms-web/src/main/java/com/zheng/cms/web/interceptor/CmsWebInterceptor.java
  12. 9 0
      zheng-cms/zheng-cms-web/src/main/resources/springMVC-servlet.xml
  13. 0 151
      zheng-cms/zheng-cms-web/src/main/webapp/WEB-INF/jsp/index.jsp
  14. 106 0
      zheng-ui/src/zheng-cms-web/article/index.html
  15. 105 0
      zheng-ui/src/zheng-cms-web/blog/index.html
  16. 109 0
      zheng-ui/src/zheng-cms-web/category/index.html
  17. 0 8
      zheng-ui/src/zheng-cms-web/inc/footer.jsp
  18. 0 7
      zheng-ui/src/zheng-cms-web/inc/head.jsp
  19. 37 57
      zheng-ui/src/zheng-cms-web/index.html
  20. 105 0
      zheng-ui/src/zheng-cms-web/news/index.html
  21. 106 0
      zheng-ui/src/zheng-cms-web/page/index.html
  22. 105 0
      zheng-ui/src/zheng-cms-web/qa/index.html
  23. 109 0
      zheng-ui/src/zheng-cms-web/search/index.html
  24. 109 0
      zheng-ui/src/zheng-cms-web/tag/index.html
  25. 106 0
      zheng-ui/src/zheng-cms-web/topic/index.html
  26. 109 0
      zheng-ui/src/zheng-cms-web/topic/list.html

+ 35 - 0
zheng-cms/zheng-cms-web/src/main/java/com/zheng/cms/web/controller/ArticleController.java

@@ -0,0 +1,35 @@
+package com.zheng.cms.web.controller;
+
+import com.zheng.cms.dao.model.CmsArticle;
+import com.zheng.cms.rpc.api.CmsArticleService;
+import com.zheng.common.base.BaseController;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+/**
+ * 文章控制器
+ * Created by shuzheng on 2017/3/26.
+ */
+@Controller
+@RequestMapping(value = "/article")
+public class ArticleController extends BaseController {
+
+    private static Logger _log = LoggerFactory.getLogger(ArticleController.class);
+
+    @Autowired
+    private CmsArticleService cmsArticleService;
+
+    @RequestMapping(value = "/{articleId}", method = RequestMethod.GET)
+    public String index(@PathVariable("articleId") int articleId, Model model) {
+        CmsArticle article = cmsArticleService.selectByPrimaryKey(articleId);
+        model.addAttribute("article", article);
+        return thymeleaf("/article/index");
+    }
+
+}

+ 26 - 0
zheng-cms/zheng-cms-web/src/main/java/com/zheng/cms/web/controller/BlogController.java

@@ -0,0 +1,26 @@
+package com.zheng.cms.web.controller;
+
+import com.zheng.common.base.BaseController;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+/**
+ * 博客首页控制器
+ * Created by shuzheng on 2017/3/26.
+ */
+@Controller
+@RequestMapping(value = "/blog")
+public class BlogController extends BaseController {
+
+    private static Logger _log = LoggerFactory.getLogger(BlogController.class);
+
+    @RequestMapping(value = "", method = RequestMethod.GET)
+    public String index(Model model) {
+        return thymeleaf("/blog/index");
+    }
+
+}

+ 70 - 0
zheng-cms/zheng-cms-web/src/main/java/com/zheng/cms/web/controller/CategoryController.java

@@ -0,0 +1,70 @@
+package com.zheng.cms.web.controller;
+
+import com.zheng.cms.dao.model.*;
+import com.zheng.cms.rpc.api.*;
+import com.zheng.common.base.BaseController;
+import com.zheng.common.util.Paginator;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * 类目控制器
+ * Created by shuzheng on 2017/3/26.
+ */
+@Controller
+@RequestMapping(value = "/category")
+public class CategoryController extends BaseController {
+
+	private static Logger _log = LoggerFactory.getLogger(CategoryController.class);
+
+	@Autowired
+	private CmsCategoryService cmsCategoryService;
+
+	@Autowired
+	private CmsArticleService cmsArticleService;
+
+	@RequestMapping(value = "/{alias}", method = RequestMethod.GET)
+	public String index(@PathVariable("alias") String alias,
+						@RequestParam(required = false, defaultValue = "1", value = "page") int page,
+						@RequestParam(required = false, defaultValue = "orders", value = "sort") String sort,
+						@RequestParam(required = false, defaultValue = "desc", value = "order") String order,
+						HttpServletRequest request,
+						Model model) {
+		// 当前类目
+		CmsCategoryExample cmsCategoryExample = new CmsCategoryExample();
+		cmsCategoryExample.createCriteria()
+				.andAliasEqualTo(alias);
+		CmsCategory category = cmsCategoryService.selectFirstByExample(cmsCategoryExample);
+		model.addAttribute("category", category);
+		// 该类目文章列表
+		int rows = 10;
+		CmsArticleExample cmsArticleExample = new CmsArticleExample();
+		cmsArticleExample.createCriteria()
+				.andStatusEqualTo((byte) 1);
+		cmsArticleExample.setOffset((page - 1) * rows);
+		cmsArticleExample.setLimit(rows);
+		if (!StringUtils.isBlank(sort) && !StringUtils.isBlank(order)) {
+			cmsArticleExample.setOrderByClause(sort + " " + order);
+		}
+		List<CmsArticle> articles = cmsArticleService.selectByExample(cmsArticleExample);
+		model.addAttribute("articles", articles);
+		// 文章总数
+		long total = cmsArticleService.countByExample(cmsArticleExample);
+		// 分页
+		Paginator paginator = new Paginator(total, page, rows, request);
+		model.addAttribute("paginator", paginator);
+		return thymeleaf("/category/index");
+	}
+
+}

+ 53 - 33
zheng-cms/zheng-cms-web/src/main/java/com/zheng/cms/web/controller/IndexController.java

@@ -1,9 +1,7 @@
 package com.zheng.cms.web.controller;
 
 import com.zheng.cms.dao.model.*;
-import com.zheng.cms.rpc.api.CmsCategoryService;
-import com.zheng.cms.rpc.api.CmsMenuService;
-import com.zheng.cms.rpc.api.CmsTagService;
+import com.zheng.cms.rpc.api.*;
 import com.zheng.common.base.BaseController;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -22,35 +20,57 @@ import java.util.List;
 @Controller
 public class IndexController extends BaseController {
 
-	private static Logger _log = LoggerFactory.getLogger(IndexController.class);
-
-	@Autowired
-	private CmsMenuService cmsMenuService;
-
-	@Autowired
-	private CmsCategoryService cmsCategoryService;
-
-	@Autowired
-	private CmsTagService cmsTagService;
-
-	@RequestMapping(value = "", method = RequestMethod.GET)
-	public String index(Model model) {
-		// 菜单
-		CmsMenuExample cmsMenuExample = new CmsMenuExample();
-		cmsMenuExample.setOrderByClause("orders asc");
-		List<CmsMenu> menus = cmsMenuService.selectByExample(cmsMenuExample);
-		model.addAttribute("menus", menus);
-		// 所有分类
-		CmsCategoryExample cmsCategoryExample = new CmsCategoryExample();
-		cmsCategoryExample.setOrderByClause("orders asc");
-		List<CmsCategory> categories = cmsCategoryService.selectByExample(cmsCategoryExample);
-		model.addAttribute("categories", categories);
-		// 所有标签
-		CmsTagExample cmsTagExample = new CmsTagExample();
-		cmsTagExample.setOrderByClause("orders asc");
-		List<CmsTag> tags = cmsTagService.selectByExample(cmsTagExample);
-		model.addAttribute("tags", tags);
-		return thymeleaf("/index");
-	}
+    private static Logger _log = LoggerFactory.getLogger(IndexController.class);
+
+    @Autowired
+    private CmsMenuService cmsMenuService;
+
+    @Autowired
+    private CmsCategoryService cmsCategoryService;
+
+    @Autowired
+    private CmsTagService cmsTagService;
+
+    @Autowired
+    private CmsTopicService cmsTopicService;
+
+    @Autowired
+    private CmsArticleService cmsArticleService;
+
+    @RequestMapping(value = "", method = RequestMethod.GET)
+    public String index(Model model) {
+        // 菜单
+        CmsMenuExample cmsMenuExample = new CmsMenuExample();
+        cmsMenuExample.setOrderByClause("orders asc");
+        List<CmsMenu> menus = cmsMenuService.selectByExample(cmsMenuExample);
+        model.addAttribute("menus", menus);
+        // 所有类目
+        CmsCategoryExample cmsCategoryExample = new CmsCategoryExample();
+        cmsCategoryExample.setOrderByClause("orders asc");
+        List<CmsCategory> categories = cmsCategoryService.selectByExample(cmsCategoryExample);
+        model.addAttribute("categories", categories);
+        // 所有标签
+        CmsTagExample cmsTagExample = new CmsTagExample();
+        cmsTagExample.setOrderByClause("orders asc");
+        List<CmsTag> tags = cmsTagService.selectByExample(cmsTagExample);
+        model.addAttribute("tags", tags);
+        // 最新5个专题
+        CmsTopicExample cmsTopicExample = new CmsTopicExample();
+        cmsTopicExample.setOrderByClause("ctime desc");
+        List<CmsTopic> topics = cmsTopicService.selectByExample(cmsTopicExample);
+        model.addAttribute("topics", topics);
+        // 最新5条文章
+        CmsArticleExample cmsArticleExample = new CmsArticleExample();
+        cmsArticleExample.createCriteria()
+                .andStatusEqualTo((byte) 1);
+        cmsArticleExample.setOrderByClause("orders desc");
+        List<CmsArticle> newArticles = cmsArticleService.selectByExample(cmsArticleExample);
+        model.addAttribute("newArticles", newArticles);
+        // 最火5条文章
+        cmsArticleExample.setOrderByClause("readnumber desc");
+        List<CmsArticle> hotArticles = cmsArticleService.selectByExample(cmsArticleExample);
+        model.addAttribute("hotArticles", hotArticles);
+        return thymeleaf("/index");
+    }
 
 }

+ 26 - 0
zheng-cms/zheng-cms-web/src/main/java/com/zheng/cms/web/controller/NewsController.java

@@ -0,0 +1,26 @@
+package com.zheng.cms.web.controller;
+
+import com.zheng.common.base.BaseController;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+/**
+ * 资讯首页控制器
+ * Created by shuzheng on 2017/3/26.
+ */
+@Controller
+@RequestMapping(value = "/news")
+public class NewsController extends BaseController {
+
+    private static Logger _log = LoggerFactory.getLogger(NewsController.class);
+
+    @RequestMapping(value = "", method = RequestMethod.GET)
+    public String index(Model model) {
+        return thymeleaf("/news/index");
+    }
+
+}

+ 39 - 0
zheng-cms/zheng-cms-web/src/main/java/com/zheng/cms/web/controller/PageController.java

@@ -0,0 +1,39 @@
+package com.zheng.cms.web.controller;
+
+import com.zheng.cms.dao.model.CmsPage;
+import com.zheng.cms.dao.model.CmsPageExample;
+import com.zheng.cms.rpc.api.CmsPageService;
+import com.zheng.common.base.BaseController;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+/**
+ * 单页控制器
+ * Created by shuzheng on 2017/3/26.
+ */
+@Controller
+@RequestMapping(value = "/page")
+public class PageController extends BaseController {
+
+    private static Logger _log = LoggerFactory.getLogger(PageController.class);
+
+    @Autowired
+    private CmsPageService cmsPageService;
+
+    @RequestMapping(value = "/{alias}", method = RequestMethod.GET)
+    public String index(@PathVariable("alias") String alias, Model model) {
+        CmsPageExample cmsPageExample = new CmsPageExample();
+        cmsPageExample.createCriteria()
+                .andAliasEqualTo(alias);
+        CmsPage page = cmsPageService.selectFirstByExampleWithBLOBs(cmsPageExample);
+        model.addAttribute("page", page);
+        return thymeleaf("/page/index");
+    }
+
+}

+ 26 - 0
zheng-cms/zheng-cms-web/src/main/java/com/zheng/cms/web/controller/QaController.java

@@ -0,0 +1,26 @@
+package com.zheng.cms.web.controller;
+
+import com.zheng.common.base.BaseController;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+/**
+ * 问答首页控制器
+ * Created by shuzheng on 2017/3/26.
+ */
+@Controller
+@RequestMapping(value = "/qa")
+public class QaController extends BaseController {
+
+    private static Logger _log = LoggerFactory.getLogger(QaController.class);
+
+    @RequestMapping(value = "", method = RequestMethod.GET)
+    public String index(Model model) {
+        return thymeleaf("/qa/index");
+    }
+
+}

+ 66 - 0
zheng-cms/zheng-cms-web/src/main/java/com/zheng/cms/web/controller/SearchController.java

@@ -0,0 +1,66 @@
+package com.zheng.cms.web.controller;
+
+import com.zheng.cms.dao.model.CmsArticle;
+import com.zheng.cms.dao.model.CmsArticleExample;
+import com.zheng.cms.dao.model.CmsTag;
+import com.zheng.cms.dao.model.CmsTagExample;
+import com.zheng.cms.rpc.api.CmsArticleService;
+import com.zheng.cms.rpc.api.CmsTagService;
+import com.zheng.common.base.BaseController;
+import com.zheng.common.util.Paginator;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * 搜索控制器
+ * Created by shuzheng on 2017/3/26.
+ */
+@Controller
+@RequestMapping(value = "/search")
+public class SearchController extends BaseController {
+
+	private static Logger _log = LoggerFactory.getLogger(SearchController.class);
+
+	@Autowired
+	private CmsArticleService cmsArticleService;
+
+	@RequestMapping(value = "/{keyword}", method = RequestMethod.GET)
+	public String index(@PathVariable("keyword") String keyword,
+						@RequestParam(required = false, defaultValue = "1", value = "page") int page,
+						@RequestParam(required = false, defaultValue = "orders", value = "sort") String sort,
+						@RequestParam(required = false, defaultValue = "desc", value = "order") String order,
+						HttpServletRequest request,
+						Model model) {
+		// 该关键字文章列表
+		int rows = 10;
+		CmsArticleExample cmsArticleExample = new CmsArticleExample();
+		cmsArticleExample.createCriteria()
+				.andStatusEqualTo((byte) 1)
+				.andTitleLike(keyword);
+		cmsArticleExample.setOffset((page - 1) * rows);
+		cmsArticleExample.setLimit(rows);
+		if (!StringUtils.isBlank(sort) && !StringUtils.isBlank(order)) {
+			cmsArticleExample.setOrderByClause(sort + " " + order);
+		}
+		List<CmsArticle> articles = cmsArticleService.selectByExample(cmsArticleExample);
+		model.addAttribute("articles", articles);
+		// 文章总数
+		long total = cmsArticleService.countByExample(cmsArticleExample);
+		// 分页
+		Paginator paginator = new Paginator(total, page, rows, request);
+		model.addAttribute("paginator", paginator);
+		return thymeleaf("/search/index");
+	}
+
+}

+ 73 - 0
zheng-cms/zheng-cms-web/src/main/java/com/zheng/cms/web/controller/TagController.java

@@ -0,0 +1,73 @@
+package com.zheng.cms.web.controller;
+
+import com.zheng.cms.dao.model.*;
+import com.zheng.cms.rpc.api.CmsArticleService;
+import com.zheng.cms.rpc.api.CmsCategoryService;
+import com.zheng.cms.rpc.api.CmsTagService;
+import com.zheng.cms.rpc.api.CmsTopicService;
+import com.zheng.common.base.BaseController;
+import com.zheng.common.util.Paginator;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * 标签控制器
+ * Created by shuzheng on 2017/3/26.
+ */
+@Controller
+@RequestMapping(value = "/tag")
+public class TagController extends BaseController {
+
+	private static Logger _log = LoggerFactory.getLogger(TagController.class);
+
+	@Autowired
+	private CmsTagService cmsTagService;
+
+	@Autowired
+	private CmsArticleService cmsArticleService;
+
+	@RequestMapping(value = "/{alias}", method = RequestMethod.GET)
+	public String index(@PathVariable("alias") String alias,
+						@RequestParam(required = false, defaultValue = "1", value = "page") int page,
+						@RequestParam(required = false, defaultValue = "orders", value = "sort") String sort,
+						@RequestParam(required = false, defaultValue = "desc", value = "order") String order,
+						HttpServletRequest request,
+						Model model) {
+		// 当前标签
+		CmsTagExample cmsTagExample = new CmsTagExample();
+		cmsTagExample.createCriteria()
+				.andAliasEqualTo(alias);
+		CmsTag tag = cmsTagService.selectFirstByExample(cmsTagExample);
+		model.addAttribute("tag", tag);
+		// 该标签文章列表
+		int rows = 10;
+		CmsArticleExample cmsArticleExample = new CmsArticleExample();
+		cmsArticleExample.createCriteria()
+				.andStatusEqualTo((byte) 1);
+		cmsArticleExample.setOffset((page - 1) * rows);
+		cmsArticleExample.setLimit(rows);
+		if (!StringUtils.isBlank(sort) && !StringUtils.isBlank(order)) {
+			cmsArticleExample.setOrderByClause(sort + " " + order);
+		}
+		List<CmsArticle> articles = cmsArticleService.selectByExample(cmsArticleExample);
+		model.addAttribute("articles", articles);
+		// 文章总数
+		long total = cmsArticleService.countByExample(cmsArticleExample);
+		// 分页
+		Paginator paginator = new Paginator(total, page, rows, request);
+		model.addAttribute("paginator", paginator);
+		return thymeleaf("/tag/index");
+	}
+
+}

+ 61 - 0
zheng-cms/zheng-cms-web/src/main/java/com/zheng/cms/web/controller/TopicController.java

@@ -0,0 +1,61 @@
+package com.zheng.cms.web.controller;
+
+import com.zheng.cms.dao.model.CmsTopic;
+import com.zheng.cms.dao.model.CmsTopicExample;
+import com.zheng.cms.rpc.api.CmsTopicService;
+import com.zheng.common.base.BaseController;
+import com.zheng.common.util.Paginator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * 专题首页控制器
+ * Created by shuzheng on 2017/3/26.
+ */
+@Controller
+@RequestMapping(value = "/topic")
+public class TopicController extends BaseController {
+
+    private static Logger _log = LoggerFactory.getLogger(TopicController.class);
+
+    @Autowired
+    private CmsTopicService cmsTopicService;
+
+    @RequestMapping(value = "/list", method = RequestMethod.GET)
+    public String list(
+            @RequestParam(required = false, defaultValue = "1", value = "page") int page,
+            HttpServletRequest request,
+            Model model) {
+        // 专题列表
+        int rows = 10;
+        CmsTopicExample cmsTopicExample = new CmsTopicExample();
+        cmsTopicExample.setOffset((page - 1) * rows);
+        cmsTopicExample.setLimit(rows);
+        List<CmsTopic> topics = cmsTopicService.selectByExample(cmsTopicExample);
+        model.addAttribute("topics", topics);
+        // 文章总数
+        long total = cmsTopicService.countByExample(cmsTopicExample);
+        // 分页
+        Paginator paginator = new Paginator(total, page, rows, request);
+        model.addAttribute("paginator", paginator);
+        return thymeleaf("/topic/list");
+    }
+
+    @RequestMapping(value = "{topicId}", method = RequestMethod.GET)
+    public String index(@PathVariable("topicId") int topicId, Model model) {
+        CmsTopic topic = cmsTopicService.selectByPrimaryKey(topicId);
+        model.addAttribute("topic", topic);
+        return thymeleaf("/topic/index");
+    }
+
+}

+ 62 - 0
zheng-cms/zheng-cms-web/src/main/java/com/zheng/cms/web/interceptor/CmsWebInterceptor.java

@@ -0,0 +1,62 @@
+package com.zheng.cms.web.interceptor;
+
+import com.zheng.cms.dao.model.CmsMenu;
+import com.zheng.cms.dao.model.CmsMenuExample;
+import com.zheng.cms.rpc.api.CmsMenuService;
+import com.zheng.common.util.PropertiesFileUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 公共拦截器
+ * Created by shuzheng on 2017/3/25.
+ */
+public class CmsWebInterceptor extends HandlerInterceptorAdapter {
+
+    private static Logger _log = LoggerFactory.getLogger(CmsWebInterceptor.class);
+
+    @Autowired
+    private CmsMenuService cmsMenuService;
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        // 过滤ajax
+        if (null != request.getHeader("X-Requested-With") && request.getHeader("X-Requested-With").equalsIgnoreCase("XMLHttpRequest")) {
+            return true;
+        }
+        // zheng-ui静态资源配置信息
+        String appName = PropertiesFileUtil.getInstance().get("app.name");
+        String uiPath = PropertiesFileUtil.getInstance().get("zheng-ui.path");
+        request.setAttribute("appName", appName);
+        request.setAttribute("uiPath", uiPath);
+        // 菜单
+        CmsMenuExample cmsMenuExample = new CmsMenuExample();
+        cmsMenuExample.setOrderByClause("orders asc");
+        List<CmsMenu> menus = cmsMenuService.selectByExample(cmsMenuExample);
+        request.setAttribute("menus", menus);
+        return true;
+    }
+
+    @Override
+    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
+        super.postHandle(request, response, handler, modelAndView);
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+        super.afterCompletion(request, response, handler, ex);
+    }
+
+    @Override
+    public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        super.afterConcurrentHandlingStarted(request, response, handler);
+    }
+
+}

+ 9 - 0
zheng-cms/zheng-cms-web/src/main/resources/springMVC-servlet.xml

@@ -11,6 +11,15 @@
 	<!-- 根目录'/'对应页面 -->
 	<mvc:view-controller path="/" view-name="/index.jsp"/>
 
+	<!-- 拦截器 -->
+	<mvc:interceptors>
+		<!-- 公共拦截器 -->
+		<mvc:interceptor>
+			<mvc:mapping path="/**"/>
+			<bean class="com.zheng.cms.web.interceptor.CmsWebInterceptor"></bean>
+		</mvc:interceptor>
+	</mvc:interceptors>
+
 	<context:property-placeholder location="classpath:config.properties"/>
 
 	<!-- 使用thymeleaf视图 -->

+ 0 - 151
zheng-cms/zheng-cms-web/src/main/webapp/WEB-INF/jsp/index.jsp

@@ -1,151 +0,0 @@
-<%@ page contentType="text/html; charset=utf-8"%>
-<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
-<c:set var="basePath" value="${pageContext.request.contextPath}"/>
-<!DOCTYPE html>
-<html lang="zh-CN">
-<head>
-    <meta charset="utf-8"/>
-    <title>首页 - ZhengCms</title>
-    <meta name="keywords" content=""/>
-    <meta name="description" content=""/>
-    <meta name="renderer" content="webkit"/>
-    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
-    <meta name="viewport" content="width=device-width, initial-scale=1"/>
-    <link rel="shortcut icon" href="${basePath}/resources/favicon.ico"/>
-    <link rel="stylesheet" href="${basePath}/resources/css/bootstrap.min.css"/>
-    <!--[if lt IE 9]>
-    <script src="${basePath}/resources/js/vendor/html5shiv.js"></script>
-    <script src="${basePath}/resources/js/vendor/respond.min.js"></script>
-    <![endif]-->
-    <script type="text/javascript">
-        if (/msie [6|7|8]/i.test(navigator.userAgent)) {};
-    </script>
-    <link rel="stylesheet" href="${basePath}/resources/css/main.css"/>
-</head>
-<body>
-<!-- .navbar -->
-<nav class="navbar navbar-inverse navbar-fixed-top"><!--navbar-inverse-->
-    <div class="container">
-        <!-- navbar-header -->
-        <div class="navbar-header">
-            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#nav-menu">
-                <span class="sr-only">切换菜单</span>
-                <span class="icon-bar"></span>
-                <span class="icon-bar"></span>
-                <span class="icon-bar"></span>
-            </button>
-            <a class="navbar-brand" href="${basePath}/" title="zhengCMS"><span id="logo-text-left">zheng</span><span id="logo-text-right">CMS</span></a>
-            <p class="navbar-text hidden-sm">最简约的内容管理系统</p>
-        </div>
-        <!-- /.navbar-header -->
-        <!-- navbar-collapse -->
-        <div class="collapse navbar-collapse" id="nav-menu">
-            <ul class="nav navbar-nav">
-                <li class="active"><a href="${basePath}/">首页</a>
-                <c:forEach var="menu" items="${menus}">
-                    <c:if test="${menu.pid==null}">
-                    <li><a href="<c:url value="${menu.url}"/>" target="${menu.target}" class="dropdown-toggle" data-toggle="dropdown">${menu.name}</a>
-                        <ul class="dropdown-menu" role="menu">
-                        <c:forEach var="subMenu" items="${menus}">
-                            <c:if test="${menu.menuId==subMenu.pid}">
-                            <li><a href="<c:url value="${subMenu.url}"/>" target="${subMenu.target}">${subMenu.name}</a></li>
-                            </c:if>
-                        </c:forEach>
-                        </ul>
-                    </li>
-                    </c:if>
-                </c:forEach>
-            </ul>
-            <ul class="nav navbar-right navbar-nav">
-                <li class="dropdown">
-                    <a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="glyphicon glyphicon-search"></span></a>
-                    <ul class="dropdown-menu">
-                        <form id="search-form" class="form-inline">
-                            <div class="input-group">
-                                <input id="keywords" type="text" name="keywords" class="form-control" placeholder="搜索"/>
-                                <div class="input-group-btn">
-                                    <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-search"></span></button>
-                                </div>
-                            </div>
-                        </form>
-                    </ul>
-                </li>
-                <!--<li><a href="#">登录</a></li>
-                <li><a href="#">注册</a></li>-->
-                <li id="messages" class="dropdown">
-                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
-                        <span class="glyphicon glyphicon-bell"></span>
-                        <span class="badge bg-important">5</span>
-                    </a>
-                    <ul class="dropdown-menu">
-                        <li><a href="#"><span class="glyphicon glyphicon-envelope"></span> 我的私信(<span class="msg-txt">1</span>)</a></li>
-                        <li><a href="#"><span class="glyphicon glyphicon-volume-up"></span> 系统消息(<span class="msg-txt">4</span>)</a></li>
-                    </ul>
-                </li>
-                <li class="dropdown">
-                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
-                        <span class="glyphicon glyphicon-user"></span>
-                        <span class="caret"></span>
-                    </a>
-                    <ul class="dropdown-menu">
-                        <li><a href="#"><span class="glyphicon glyphicon-home"></span> 个人博客</a></li>
-                        <li><a href="#"><span class="glyphicon glyphicon-question-sign"></span> 我的提问</a></li>
-                        <li><a href="#"><span class="glyphicon glyphicon-ok-sign"></span> 我的回答</a></li>
-                        <li><a href="#"><span class="glyphicon glyphicon-star"></span> 我的收藏</a></li>
-                        <li class="divider"></li>
-                        <li><a href="#"><span class="glyphicon glyphicon-cog"></span> 修改资料</a></li>
-                        <li><a href="#"><span class="glyphicon glyphicon-lock"></span> 密码安全</a></li>
-                        <li><a href="#"><span class="glyphicon glyphicon-log-out"></span> 安全退出</a></li>
-                    </ul>
-                </li>
-            </ul>
-        </div>
-        <!-- /.navbar-collapse -->
-    </div>
-</nav>
-<!-- /.navbar -->
-<!-- .container -->
-<div class="container" style="min-height: 900px;">
-    <dl>
-        <dt>所有类目</dt>
-        <c:forEach var="category" items="${categories}">
-        <dd><a href="${basePath}/category-${category.alias}">${category.name}</a></dd>
-        </c:forEach>
-    </dl>
-    <dl>
-        <dt>所有标签</dt>
-        <c:forEach var="tag" items="${tags}">
-            <dd><a href="${basePath}/tag-${tag.alias}">${tag.name}</a></dd>
-        </c:forEach>
-    </dl>
-</div>
-<!-- /.container -->
-<!-- footer -->
-<footer class="container-fuild" style="background:#222;padding-top:20px;min-height:100px;">
-    <div class="container">
-        <div class="row">
-            <div class="col-xs-12 col-sm-6 col-md-4 col-lg-3">
-
-            </div>
-            <div class="col-xs-12 col-sm-6 col-md-4 col-lg-3">
-
-            </div>
-            <div class="col-xs-12 col-sm-6 col-md-4 col-lg-3">
-
-            </div>
-            <div class="col-xs-12 col-sm-6 col-md-4 col-lg-3 hidden-md">
-
-            </div>
-        </div>
-    </div>
-</footer>
-<!-- /footer -->
-<script src="${basePath}/resources/js/jquery-1.11.2.min.js"></script>
-<script src="${basePath}/resources/js/bootstrap.min.js"></script>
-<script src="${basePath}/resources/js/main.js"></script>
-</body>
-</html>

+ 106 - 0
zheng-ui/src/zheng-cms-web/article/index.html

@@ -0,0 +1,106 @@
+<!DOCTYPE html>
+<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
+<head>
+    <meta charset="utf-8"/>
+    <title th:text="${article.title} + ' - ZhengCms'">标题 - ZhengCms</title>
+    <meta name="keywords" content=""/>
+    <meta name="description" content=""/>
+    <meta name="renderer" content="webkit"/>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1"/>
+    <link rel="shortcut icon" href="../favicon.ico" th:href="@{${uiPath} + ${appName} + '/favicon.ico'}"/>
+    <link rel="stylesheet" href="../css/bootstrap.min.css" th:href="@{${uiPath} + ${appName} + '/css/bootstrap.min.css'}"/>
+    <!--[if lt IE 9]>
+    <script src="../js/vendor/html5shiv.js" th:src="@{${uiPath} + ${appName} + '/js/vendor/html5shiv.js'}"></script>
+    <script src="../js/vendor/respond.min.js" th:src="@{${uiPath} + ${appName} + '/js/vendor/respond.min.js'}"></script>
+    <![endif]-->
+    <script type="text/javascript">
+        if (/msie [6|7|8]/i.test(navigator.userAgent)) {};
+    </script>
+    <link rel="stylesheet" href="../css/main.css" th:href="@{${uiPath} + ${appName} + '/css/main.css'}"/>
+</head>
+<body>
+<!-- .navbar -->
+<nav class="navbar navbar-inverse navbar-fixed-top"><!--navbar-inverse-->
+    <div class="container">
+        <!-- navbar-header -->
+        <div class="navbar-header">
+            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#nav-menu">
+                <span class="sr-only">切换菜单</span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+            </button>
+            <a class="navbar-brand" href="../index.html" th:href="@{/}" title="zhengCMS"><span id="logo-text-left">zheng</span><span id="logo-text-right">CMS</span></a>
+            <p class="navbar-text hidden-sm">最简约的内容管理系统</p>
+        </div>
+        <!-- /.navbar-header -->
+        <!-- navbar-collapse -->
+        <div class="collapse navbar-collapse" id="nav-menu">
+            <ul class="nav navbar-nav">
+                <li th:each="menu : ${menus}" th:if="${menu.pid} == null"><a th:href="@{${menu.url}}" th:target="${menu.target}" th:text="${menu.name}">菜单</a></li>
+            </ul>
+            <ul class="nav navbar-right navbar-nav">
+                <li class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="glyphicon glyphicon-search"></span></a>
+                    <ul class="dropdown-menu">
+                        <form id="search-form" class="form-inline">
+                            <div class="input-group">
+                                <input id="keywords" type="text" name="keywords" class="form-control" placeholder="搜索"/>
+                                <div class="input-group-btn">
+                                    <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-search"></span></button>
+                                </div>
+                            </div>
+                        </form>
+                    </ul>
+                </li>
+                <li><a href="login.html">登录</a></li>
+                <li><a href="reg.html">注册</a></li>
+                <li id="messages" class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                        <span class="glyphicon glyphicon-bell"></span>
+                        <span class="badge bg-important">5</span>
+                    </a>
+                    <ul class="dropdown-menu">
+                        <li><a href="home/letter.html"><span class="glyphicon glyphicon-envelope"></span> 我的私信(<span class="msg-txt">1</span>)</a></li>
+                        <li><a href="home/message.html"><span class="glyphicon glyphicon-volume-up"></span> 系统消息(<span class="msg-txt">4</span>)</a></li>
+                    </ul>
+                </li>
+                <li class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                        <span class="glyphicon glyphicon-user"></span>
+                        <span class="caret"></span>
+                    </a>
+                    <ul class="dropdown-menu">
+                        <li><a href="home/index.html"><span class="glyphicon glyphicon-home"></span> 个人博客</a></li>
+                        <li><a href="home/question.html"><span class="glyphicon glyphicon-question-sign"></span> 我的提问</a></li>
+                        <li><a href="home/answer.html"><span class="glyphicon glyphicon-ok-sign"></span> 我的回答</a></li>
+                        <li><a href="home/collection.html"><span class="glyphicon glyphicon-star"></span> 我的收藏</a></li>
+                        <li class="divider"></li>
+                        <li><a href="setting/info.html"><span class="glyphicon glyphicon-cog"></span> 修改资料</a></li>
+                        <li><a href="setting/password.html"><span class="glyphicon glyphicon-lock"></span> 密码安全</a></li>
+                        <li><a href="logout.html"><span class="glyphicon glyphicon-log-out"></span> 安全退出</a></li>
+                    </ul>
+                </li>
+            </ul>
+        </div>
+        <!-- /.navbar-collapse -->
+    </div>
+</nav>
+<!-- /.navbar -->
+<!-- .container -->
+<div class="container" style="padding-bottom:80px;">
+    <h3 th:text="${article.title}">标题</h3>
+    <div th:utext="${article.content}">内容</div>
+</div>
+<!-- /.container -->
+<!-- footer -->
+<footer class="container-fuild text-center" style="position:fixed;bottom:0;width:100%;background:#eee;padding:20px 0;">
+    Copyright &copy; 2017 ZhangShuzheng All Rights Reserved
+</footer>
+<!-- /footer -->
+<script src="../js/jquery-1.11.2.min.js" th:src="@{${uiPath} + ${appName} + '/js/jquery-1.11.2.min.js'}"></script>
+<script src="../js/bootstrap.min.js" th:src="@{${uiPath} + ${appName} + '/js/bootstrap.min.js'}"></script>
+<script src="../js/main.js" th:src="@{${uiPath} + ${appName} + '/js/main.js'}"></script>
+</body>
+</html>

+ 105 - 0
zheng-ui/src/zheng-cms-web/blog/index.html

@@ -0,0 +1,105 @@
+<!DOCTYPE html>
+<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
+<head>
+    <meta charset="utf-8"/>
+    <title>博客首页 - ZhengCms</title>
+    <meta name="keywords" content=""/>
+    <meta name="description" content=""/>
+    <meta name="renderer" content="webkit"/>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1"/>
+    <link rel="shortcut icon" href="../favicon.ico" th:href="@{${uiPath} + ${appName} + '/favicon.ico'}"/>
+    <link rel="stylesheet" href="../css/bootstrap.min.css" th:href="@{${uiPath} + ${appName} + '/css/bootstrap.min.css'}"/>
+    <!--[if lt IE 9]>
+    <script src="../js/vendor/html5shiv.js" th:src="@{${uiPath} + ${appName} + '/js/vendor/html5shiv.js'}"></script>
+    <script src="../js/vendor/respond.min.js" th:src="@{${uiPath} + ${appName} + '/js/vendor/respond.min.js'}"></script>
+    <![endif]-->
+    <script type="text/javascript">
+        if (/msie [6|7|8]/i.test(navigator.userAgent)) {};
+    </script>
+    <link rel="stylesheet" href="../css/main.css" th:href="@{${uiPath} + ${appName} + '/css/main.css'}"/>
+</head>
+<body>
+<!-- .navbar -->
+<nav class="navbar navbar-inverse navbar-fixed-top"><!--navbar-inverse-->
+    <div class="container">
+        <!-- navbar-header -->
+        <div class="navbar-header">
+            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#nav-menu">
+                <span class="sr-only">切换菜单</span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+            </button>
+            <a class="navbar-brand" href="../index.html" th:href="@{/}" title="zhengCMS"><span id="logo-text-left">zheng</span><span id="logo-text-right">CMS</span></a>
+            <p class="navbar-text hidden-sm">最简约的内容管理系统</p>
+        </div>
+        <!-- /.navbar-header -->
+        <!-- navbar-collapse -->
+        <div class="collapse navbar-collapse" id="nav-menu">
+            <ul class="nav navbar-nav">
+                <li th:each="menu : ${menus}" th:if="${menu.pid} == null"><a th:href="@{${menu.url}}" th:target="${menu.target}" th:text="${menu.name}">菜单</a></li>
+            </ul>
+            <ul class="nav navbar-right navbar-nav">
+                <li class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="glyphicon glyphicon-search"></span></a>
+                    <ul class="dropdown-menu">
+                        <form id="search-form" class="form-inline">
+                            <div class="input-group">
+                                <input id="keywords" type="text" name="keywords" class="form-control" placeholder="搜索"/>
+                                <div class="input-group-btn">
+                                    <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-search"></span></button>
+                                </div>
+                            </div>
+                        </form>
+                    </ul>
+                </li>
+                <li><a href="login.html">登录</a></li>
+                <li><a href="reg.html">注册</a></li>
+                <li id="messages" class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                        <span class="glyphicon glyphicon-bell"></span>
+                        <span class="badge bg-important">5</span>
+                    </a>
+                    <ul class="dropdown-menu">
+                        <li><a href="home/letter.html"><span class="glyphicon glyphicon-envelope"></span> 我的私信(<span class="msg-txt">1</span>)</a></li>
+                        <li><a href="home/message.html"><span class="glyphicon glyphicon-volume-up"></span> 系统消息(<span class="msg-txt">4</span>)</a></li>
+                    </ul>
+                </li>
+                <li class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                        <span class="glyphicon glyphicon-user"></span>
+                        <span class="caret"></span>
+                    </a>
+                    <ul class="dropdown-menu">
+                        <li><a href="home/index.html"><span class="glyphicon glyphicon-home"></span> 个人博客</a></li>
+                        <li><a href="home/question.html"><span class="glyphicon glyphicon-question-sign"></span> 我的提问</a></li>
+                        <li><a href="home/answer.html"><span class="glyphicon glyphicon-ok-sign"></span> 我的回答</a></li>
+                        <li><a href="home/collection.html"><span class="glyphicon glyphicon-star"></span> 我的收藏</a></li>
+                        <li class="divider"></li>
+                        <li><a href="setting/info.html"><span class="glyphicon glyphicon-cog"></span> 修改资料</a></li>
+                        <li><a href="setting/password.html"><span class="glyphicon glyphicon-lock"></span> 密码安全</a></li>
+                        <li><a href="logout.html"><span class="glyphicon glyphicon-log-out"></span> 安全退出</a></li>
+                    </ul>
+                </li>
+            </ul>
+        </div>
+        <!-- /.navbar-collapse -->
+    </div>
+</nav>
+<!-- /.navbar -->
+<!-- .container -->
+<div class="container" style="padding-bottom:80px;">
+    博客首页
+</div>
+<!-- /.container -->
+<!-- footer -->
+<footer class="container-fuild text-center" style="position:fixed;bottom:0;width:100%;background:#eee;padding:20px 0;">
+    Copyright &copy; 2017 ZhangShuzheng All Rights Reserved
+</footer>
+<!-- /footer -->
+<script src="../js/jquery-1.11.2.min.js" th:src="@{${uiPath} + ${appName} + '/js/jquery-1.11.2.min.js'}"></script>
+<script src="../js/bootstrap.min.js" th:src="@{${uiPath} + ${appName} + '/js/bootstrap.min.js'}"></script>
+<script src="../js/main.js" th:src="@{${uiPath} + ${appName} + '/js/main.js'}"></script>
+</body>
+</html>

+ 109 - 0
zheng-ui/src/zheng-cms-web/category/index.html

@@ -0,0 +1,109 @@
+<!DOCTYPE html>
+<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
+<head>
+    <meta charset="utf-8"/>
+    <title th:text="${category.name} + ' - ZhengCms'">类目 - ZhengCms</title>
+    <meta name="keywords" content=""/>
+    <meta name="description" content=""/>
+    <meta name="renderer" content="webkit"/>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1"/>
+    <link rel="shortcut icon" href="../favicon.ico" th:href="@{${uiPath} + ${appName} + '/favicon.ico'}"/>
+    <link rel="stylesheet" href="../css/bootstrap.min.css" th:href="@{${uiPath} + ${appName} + '/css/bootstrap.min.css'}"/>
+    <!--[if lt IE 9]>
+    <script src="../js/vendor/html5shiv.js" th:src="@{${uiPath} + ${appName} + '/js/vendor/html5shiv.js'}"></script>
+    <script src="../js/vendor/respond.min.js" th:src="@{${uiPath} + ${appName} + '/js/vendor/respond.min.js'}"></script>
+    <![endif]-->
+    <script type="text/javascript">
+        if (/msie [6|7|8]/i.test(navigator.userAgent)) {};
+    </script>
+    <link rel="stylesheet" href="../css/main.css" th:href="@{${uiPath} + ${appName} + '/css/main.css'}"/>
+</head>
+<body>
+<!-- .navbar -->
+<nav class="navbar navbar-inverse navbar-fixed-top"><!--navbar-inverse-->
+    <div class="container">
+        <!-- navbar-header -->
+        <div class="navbar-header">
+            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#nav-menu">
+                <span class="sr-only">切换菜单</span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+            </button>
+            <a class="navbar-brand" href="../index.html" th:href="@{/}" title="zhengCMS"><span id="logo-text-left">zheng</span><span id="logo-text-right">CMS</span></a>
+            <p class="navbar-text hidden-sm">最简约的内容管理系统</p>
+        </div>
+        <!-- /.navbar-header -->
+        <!-- navbar-collapse -->
+        <div class="collapse navbar-collapse" id="nav-menu">
+            <ul class="nav navbar-nav">
+                <li th:each="menu : ${menus}" th:if="${menu.pid} == null"><a th:href="@{${menu.url}}" th:target="${menu.target}" th:text="${menu.name}">菜单</a></li>
+            </ul>
+            <ul class="nav navbar-right navbar-nav">
+                <li class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="glyphicon glyphicon-search"></span></a>
+                    <ul class="dropdown-menu">
+                        <form id="search-form" class="form-inline">
+                            <div class="input-group">
+                                <input id="keywords" type="text" name="keywords" class="form-control" placeholder="搜索"/>
+                                <div class="input-group-btn">
+                                    <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-search"></span></button>
+                                </div>
+                            </div>
+                        </form>
+                    </ul>
+                </li>
+                <li><a href="login.html">登录</a></li>
+                <li><a href="reg.html">注册</a></li>
+                <li id="messages" class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                        <span class="glyphicon glyphicon-bell"></span>
+                        <span class="badge bg-important">5</span>
+                    </a>
+                    <ul class="dropdown-menu">
+                        <li><a href="home/letter.html"><span class="glyphicon glyphicon-envelope"></span> 我的私信(<span class="msg-txt">1</span>)</a></li>
+                        <li><a href="home/message.html"><span class="glyphicon glyphicon-volume-up"></span> 系统消息(<span class="msg-txt">4</span>)</a></li>
+                    </ul>
+                </li>
+                <li class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                        <span class="glyphicon glyphicon-user"></span>
+                        <span class="caret"></span>
+                    </a>
+                    <ul class="dropdown-menu">
+                        <li><a href="home/index.html"><span class="glyphicon glyphicon-home"></span> 个人博客</a></li>
+                        <li><a href="home/question.html"><span class="glyphicon glyphicon-question-sign"></span> 我的提问</a></li>
+                        <li><a href="home/answer.html"><span class="glyphicon glyphicon-ok-sign"></span> 我的回答</a></li>
+                        <li><a href="home/collection.html"><span class="glyphicon glyphicon-star"></span> 我的收藏</a></li>
+                        <li class="divider"></li>
+                        <li><a href="setting/info.html"><span class="glyphicon glyphicon-cog"></span> 修改资料</a></li>
+                        <li><a href="setting/password.html"><span class="glyphicon glyphicon-lock"></span> 密码安全</a></li>
+                        <li><a href="logout.html"><span class="glyphicon glyphicon-log-out"></span> 安全退出</a></li>
+                    </ul>
+                </li>
+            </ul>
+        </div>
+        <!-- /.navbar-collapse -->
+    </div>
+</nav>
+<!-- /.navbar -->
+<!-- .container -->
+<div class="container" style="padding-bottom:80px;">
+    <dl>
+        <dt><span th:text="${category.name}">类目</span>文章列表</dt>
+        <dd th:each="article : ${articles}"><a href="../article/index.html" th:href="@{'/article/' + ${article.articleId}}" th:text="${article.title}">文章标题</a></dd>
+    </dl>
+    <div th:utext="${paginator.html}"></div>
+</div>
+<!-- /.container -->
+<!-- footer -->
+<footer class="container-fuild text-center" style="position:fixed;bottom:0;width:100%;background:#eee;padding:20px 0;">
+    Copyright &copy; 2017 ZhangShuzheng All Rights Reserved
+</footer>
+<!-- /footer -->
+<script src="../js/jquery-1.11.2.min.js" th:src="@{${uiPath} + ${appName} + '/js/jquery-1.11.2.min.js'}"></script>
+<script src="../js/bootstrap.min.js" th:src="@{${uiPath} + ${appName} + '/js/bootstrap.min.js'}"></script>
+<script src="../js/main.js" th:src="@{${uiPath} + ${appName} + '/js/main.js'}"></script>
+</body>
+</html>

+ 0 - 8
zheng-ui/src/zheng-cms-web/inc/footer.jsp

@@ -1,8 +0,0 @@
-<%@ page contentType="text/html; charset=utf-8"%>
-<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
-<c:set var="basePath" value="${pageContext.request.contextPath}"/>
-<script>var BASE_PATH = '${basePath}';</script>

+ 0 - 7
zheng-ui/src/zheng-cms-web/inc/head.jsp

@@ -1,7 +0,0 @@
-<%@ page contentType="text/html; charset=utf-8"%>
-<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
-<c:set var="basePath" value="${pageContext.request.contextPath}"/>

+ 37 - 57
zheng-ui/src/zheng-cms-web/index.html

@@ -8,16 +8,16 @@
     <meta name="renderer" content="webkit"/>
     <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
     <meta name="viewport" content="width=device-width, initial-scale=1"/>
-    <link rel="shortcut icon" href="http://ui.zhangshuzheng.cn:1000/zheng-cms-web/favicon.ico"/>
-    <link rel="stylesheet" href="http://ui.zhangshuzheng.cn:1000/zheng-cms-web/css/bootstrap.min.css"/>
+    <link rel="shortcut icon" href="favicon.ico" th:href="@{${uiPath} + ${appName} + '/favicon.ico'}"/>
+    <link rel="stylesheet" href="css/bootstrap.min.css" th:href="@{${uiPath} + ${appName} + '/css/bootstrap.min.css'}"/>
     <!--[if lt IE 9]>
-    <script src="http://ui.zhangshuzheng.cn:1000/zheng-cms-web/js/vendor/html5shiv.js"></script>
-    <script src="http://ui.zhangshuzheng.cn:1000/zheng-cms-web/js/vendor/respond.min.js"></script>
+    <script src="js/vendor/html5shiv.js" th:src="@{${uiPath} + ${appName} + '/js/vendor/html5shiv.js'}"></script>
+    <script src="js/vendor/respond.min.js" th:src="@{${uiPath} + ${appName} + '/js/vendor/respond.min.js'}"></script>
     <![endif]-->
     <script type="text/javascript">
         if (/msie [6|7|8]/i.test(navigator.userAgent)) {};
     </script>
-    <link rel="stylesheet" href="http://ui.zhangshuzheng.cn:1000/zheng-cms-web/css/main.css"/>
+    <link rel="stylesheet" href="css/main.css" th:href="@{${uiPath} + ${appName} + '/css/main.css'}"/>
 </head>
 <body>
 <!-- .navbar -->
@@ -38,20 +38,7 @@
         <!-- navbar-collapse -->
         <div class="collapse navbar-collapse" id="nav-menu">
             <ul class="nav navbar-nav">
-                <li class="active"><a href="index.html" th:href="@{/}">首页13</a>
-                    <c:forEach var="menu" items="${menus}">
-                        <c:if test="${menu.pid==null}">
-                <li><a href="<c:url value="${menu.url}"/>" target="${menu.target}" class="dropdown-toggle" data-toggle="dropdown">${menu.name}</a>
-                    <ul class="dropdown-menu" role="menu">
-                        <c:forEach var="subMenu" items="${menus}">
-                            <c:if test="${menu.menuId==subMenu.pid}">
-                                <li><a href="<c:url value="${subMenu.url}"/>" target="${subMenu.target}">${subMenu.name}</a></li>
-                            </c:if>
-                        </c:forEach>
-                    </ul>
-                </li>
-                </c:if>
-                </c:forEach>
+                <li th:each="menu : ${menus}" th:if="${menu.pid} == null"><a th:href="@{${menu.url}}" th:target="${menu.target}" th:text="${menu.name}">菜单</a></li>
             </ul>
             <ul class="nav navbar-right navbar-nav">
                 <li class="dropdown">
@@ -67,16 +54,16 @@
                         </form>
                     </ul>
                 </li>
-                <!--<li><a href="#">登录</a></li>
-                <li><a href="#">注册</a></li>-->
+                <li><a href="login.html">登录</a></li>
+                <li><a href="reg.html">注册</a></li>
                 <li id="messages" class="dropdown">
                     <a href="#" class="dropdown-toggle" data-toggle="dropdown">
                         <span class="glyphicon glyphicon-bell"></span>
                         <span class="badge bg-important">5</span>
                     </a>
                     <ul class="dropdown-menu">
-                        <li><a href="#"><span class="glyphicon glyphicon-envelope"></span> 我的私信(<span class="msg-txt">1</span>)</a></li>
-                        <li><a href="#"><span class="glyphicon glyphicon-volume-up"></span> 系统消息(<span class="msg-txt">4</span>)</a></li>
+                        <li><a href="home/letter.html"><span class="glyphicon glyphicon-envelope"></span> 我的私信(<span class="msg-txt">1</span>)</a></li>
+                        <li><a href="home/message.html"><span class="glyphicon glyphicon-volume-up"></span> 系统消息(<span class="msg-txt">4</span>)</a></li>
                     </ul>
                 </li>
                 <li class="dropdown">
@@ -85,14 +72,14 @@
                         <span class="caret"></span>
                     </a>
                     <ul class="dropdown-menu">
-                        <li><a href="#"><span class="glyphicon glyphicon-home"></span> 个人博客</a></li>
-                        <li><a href="#"><span class="glyphicon glyphicon-question-sign"></span> 我的提问</a></li>
-                        <li><a href="#"><span class="glyphicon glyphicon-ok-sign"></span> 我的回答</a></li>
-                        <li><a href="#"><span class="glyphicon glyphicon-star"></span> 我的收藏</a></li>
+                        <li><a href="home/index.html"><span class="glyphicon glyphicon-home"></span> 个人博客</a></li>
+                        <li><a href="home/question.html"><span class="glyphicon glyphicon-question-sign"></span> 我的提问</a></li>
+                        <li><a href="home/answer.html"><span class="glyphicon glyphicon-ok-sign"></span> 我的回答</a></li>
+                        <li><a href="home/collection.html"><span class="glyphicon glyphicon-star"></span> 我的收藏</a></li>
                         <li class="divider"></li>
-                        <li><a href="#"><span class="glyphicon glyphicon-cog"></span> 修改资料</a></li>
-                        <li><a href="#"><span class="glyphicon glyphicon-lock"></span> 密码安全</a></li>
-                        <li><a href="#"><span class="glyphicon glyphicon-log-out"></span> 安全退出</a></li>
+                        <li><a href="setting/info.html"><span class="glyphicon glyphicon-cog"></span> 修改资料</a></li>
+                        <li><a href="setting/password.html"><span class="glyphicon glyphicon-lock"></span> 密码安全</a></li>
+                        <li><a href="logout.html"><span class="glyphicon glyphicon-log-out"></span> 安全退出</a></li>
                     </ul>
                 </li>
             </ul>
@@ -102,43 +89,36 @@
 </nav>
 <!-- /.navbar -->
 <!-- .container -->
-<div class="container" style="min-height: 900px;">
+<div class="container" style="padding-bottom:80px;">
     <dl>
         <dt>所有类目</dt>
-        <c:forEach var="category" items="${categories}">
-            <dd><a href="category.html" th:href="@{/}">${category.name}</a></dd>
-        </c:forEach>
+        <dd th:each="category : ${categories}"><a href="category/index.html" th:href="@{'/category/' + ${category.alias}}" th:text="${category.name}">类目</a></dd>
     </dl>
     <dl>
         <dt>所有标签</dt>
-        <c:forEach var="tag" items="${tags}">
-            <dd><a href="${basePath}/tag-${tag.alias}">${tag.name}</a></dd>
-        </c:forEach>
+        <dd th:each="tag : ${tags}"><a href="tag/index.html" th:href="@{'/tag/' + ${tag.alias}}" th:text="${tag.name}">标签</a></dd>
+    </dl>
+    <dl>
+        <dt>最新5个专题</dt>
+        <dd th:each="topic : ${topics}"><a href="topic/index.html" th:href="@{${topic.url}}" th:text="${topic.title}">专题</a></dd>
+    </dl>
+    <dl>
+        <dt>最新5条文章</dt>
+        <dd th:each="newArticle : ${newArticles}"><a href="article/index.html" th:href="@{'/article/' + ${newArticle.articleId}}" th:text="${newArticle.title}">文章标题</a></dd>
+    </dl>
+    <dl>
+        <dt>最热5个文章</dt>
+        <dd th:each="hotArticle : ${hotArticles}"><a href="article/index.html" th:href="@{'/article/' + ${hotArticle.articleId}}" th:text="${hotArticle.title}">文章标题</a></dd>
     </dl>
 </div>
 <!-- /.container -->
 <!-- footer -->
-<footer class="container-fuild" style="background:#222;padding-top:20px;min-height:100px;">
-    <div class="container">
-        <div class="row">
-            <div class="col-xs-12 col-sm-6 col-md-4 col-lg-3">
-
-            </div>
-            <div class="col-xs-12 col-sm-6 col-md-4 col-lg-3">
-
-            </div>
-            <div class="col-xs-12 col-sm-6 col-md-4 col-lg-3">
-
-            </div>
-            <div class="col-xs-12 col-sm-6 col-md-4 col-lg-3 hidden-md">
-
-            </div>
-        </div>
-    </div>
+<footer class="container-fuild text-center" style="position:fixed;bottom:0;width:100%;background:#eee;padding:20px 0;">
+    Copyright &copy; 2017 ZhangShuzheng All Rights Reserved
 </footer>
 <!-- /footer -->
-<script src="http://ui.zhangshuzheng.cn:1000/zheng-cms-web/js/jquery-1.11.2.min.js"></script>
-<script src="http://ui.zhangshuzheng.cn:1000/zheng-cms-web/js/bootstrap.min.js"></script>
-<script src="http://ui.zhangshuzheng.cn:1000/zheng-cms-web/js/main.js"></script>
+<script src="js/jquery-1.11.2.min.js" th:src="@{${uiPath} + ${appName} + '/js/jquery-1.11.2.min.js'}"></script>
+<script src="js/bootstrap.min.js" th:src="@{${uiPath} + ${appName} + '/js/bootstrap.min.js'}"></script>
+<script src="js/main.js" th:src="@{${uiPath} + ${appName} + '/js/main.js'}"></script>
 </body>
 </html>

+ 105 - 0
zheng-ui/src/zheng-cms-web/news/index.html

@@ -0,0 +1,105 @@
+<!DOCTYPE html>
+<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
+<head>
+    <meta charset="utf-8"/>
+    <title>资讯首页 - ZhengCms</title>
+    <meta name="keywords" content=""/>
+    <meta name="description" content=""/>
+    <meta name="renderer" content="webkit"/>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1"/>
+    <link rel="shortcut icon" href="../favicon.ico" th:href="@{${uiPath} + ${appName} + '/favicon.ico'}"/>
+    <link rel="stylesheet" href="../css/bootstrap.min.css" th:href="@{${uiPath} + ${appName} + '/css/bootstrap.min.css'}"/>
+    <!--[if lt IE 9]>
+    <script src="../js/vendor/html5shiv.js" th:src="@{${uiPath} + ${appName} + '/js/vendor/html5shiv.js'}"></script>
+    <script src="../js/vendor/respond.min.js" th:src="@{${uiPath} + ${appName} + '/js/vendor/respond.min.js'}"></script>
+    <![endif]-->
+    <script type="text/javascript">
+        if (/msie [6|7|8]/i.test(navigator.userAgent)) {};
+    </script>
+    <link rel="stylesheet" href="../css/main.css" th:href="@{${uiPath} + ${appName} + '/css/main.css'}"/>
+</head>
+<body>
+<!-- .navbar -->
+<nav class="navbar navbar-inverse navbar-fixed-top"><!--navbar-inverse-->
+    <div class="container">
+        <!-- navbar-header -->
+        <div class="navbar-header">
+            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#nav-menu">
+                <span class="sr-only">切换菜单</span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+            </button>
+            <a class="navbar-brand" href="../index.html" th:href="@{/}" title="zhengCMS"><span id="logo-text-left">zheng</span><span id="logo-text-right">CMS</span></a>
+            <p class="navbar-text hidden-sm">最简约的内容管理系统</p>
+        </div>
+        <!-- /.navbar-header -->
+        <!-- navbar-collapse -->
+        <div class="collapse navbar-collapse" id="nav-menu">
+            <ul class="nav navbar-nav">
+                <li th:each="menu : ${menus}" th:if="${menu.pid} == null"><a th:href="@{${menu.url}}" th:target="${menu.target}" th:text="${menu.name}">菜单</a></li>
+            </ul>
+            <ul class="nav navbar-right navbar-nav">
+                <li class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="glyphicon glyphicon-search"></span></a>
+                    <ul class="dropdown-menu">
+                        <form id="search-form" class="form-inline">
+                            <div class="input-group">
+                                <input id="keywords" type="text" name="keywords" class="form-control" placeholder="搜索"/>
+                                <div class="input-group-btn">
+                                    <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-search"></span></button>
+                                </div>
+                            </div>
+                        </form>
+                    </ul>
+                </li>
+                <li><a href="login.html">登录</a></li>
+                <li><a href="reg.html">注册</a></li>
+                <li id="messages" class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                        <span class="glyphicon glyphicon-bell"></span>
+                        <span class="badge bg-important">5</span>
+                    </a>
+                    <ul class="dropdown-menu">
+                        <li><a href="home/letter.html"><span class="glyphicon glyphicon-envelope"></span> 我的私信(<span class="msg-txt">1</span>)</a></li>
+                        <li><a href="home/message.html"><span class="glyphicon glyphicon-volume-up"></span> 系统消息(<span class="msg-txt">4</span>)</a></li>
+                    </ul>
+                </li>
+                <li class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                        <span class="glyphicon glyphicon-user"></span>
+                        <span class="caret"></span>
+                    </a>
+                    <ul class="dropdown-menu">
+                        <li><a href="home/index.html"><span class="glyphicon glyphicon-home"></span> 个人博客</a></li>
+                        <li><a href="home/question.html"><span class="glyphicon glyphicon-question-sign"></span> 我的提问</a></li>
+                        <li><a href="home/answer.html"><span class="glyphicon glyphicon-ok-sign"></span> 我的回答</a></li>
+                        <li><a href="home/collection.html"><span class="glyphicon glyphicon-star"></span> 我的收藏</a></li>
+                        <li class="divider"></li>
+                        <li><a href="setting/info.html"><span class="glyphicon glyphicon-cog"></span> 修改资料</a></li>
+                        <li><a href="setting/password.html"><span class="glyphicon glyphicon-lock"></span> 密码安全</a></li>
+                        <li><a href="logout.html"><span class="glyphicon glyphicon-log-out"></span> 安全退出</a></li>
+                    </ul>
+                </li>
+            </ul>
+        </div>
+        <!-- /.navbar-collapse -->
+    </div>
+</nav>
+<!-- /.navbar -->
+<!-- .container -->
+<div class="container" style="padding-bottom:80px;">
+    资讯首页
+</div>
+<!-- /.container -->
+<!-- footer -->
+<footer class="container-fuild text-center" style="position:fixed;bottom:0;width:100%;background:#eee;padding:20px 0;">
+    Copyright &copy; 2017 ZhangShuzheng All Rights Reserved
+</footer>
+<!-- /footer -->
+<script src="../js/jquery-1.11.2.min.js" th:src="@{${uiPath} + ${appName} + '/js/jquery-1.11.2.min.js'}"></script>
+<script src="../js/bootstrap.min.js" th:src="@{${uiPath} + ${appName} + '/js/bootstrap.min.js'}"></script>
+<script src="../js/main.js" th:src="@{${uiPath} + ${appName} + '/js/main.js'}"></script>
+</body>
+</html>

+ 106 - 0
zheng-ui/src/zheng-cms-web/page/index.html

@@ -0,0 +1,106 @@
+<!DOCTYPE html>
+<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
+<head>
+    <meta charset="utf-8"/>
+    <title th:text="${page.title} + ' - ZhengCms'">标题 - ZhengCms</title>
+    <meta name="keywords" content="关键字" th:content="${page.keywords}"/>
+    <meta name="description" content="描述" th:content="${page.description}"/>
+    <meta name="renderer" content="webkit"/>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1"/>
+    <link rel="shortcut icon" href="../favicon.ico" th:href="@{${uiPath} + ${appName} + '/favicon.ico'}"/>
+    <link rel="stylesheet" href="../css/bootstrap.min.css" th:href="@{${uiPath} + ${appName} + '/css/bootstrap.min.css'}"/>
+    <!--[if lt IE 9]>
+    <script src="../js/vendor/html5shiv.js" th:src="@{${uiPath} + ${appName} + '/js/vendor/html5shiv.js'}"></script>
+    <script src="../js/vendor/respond.min.js" th:src="@{${uiPath} + ${appName} + '/js/vendor/respond.min.js'}"></script>
+    <![endif]-->
+    <script type="text/javascript">
+        if (/msie [6|7|8]/i.test(navigator.userAgent)) {};
+    </script>
+    <link rel="stylesheet" href="../css/main.css" th:href="@{${uiPath} + ${appName} + '/css/main.css'}"/>
+</head>
+<body>
+<!-- .navbar -->
+<nav class="navbar navbar-inverse navbar-fixed-top"><!--navbar-inverse-->
+    <div class="container">
+        <!-- navbar-header -->
+        <div class="navbar-header">
+            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#nav-menu">
+                <span class="sr-only">切换菜单</span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+            </button>
+            <a class="navbar-brand" href="../index.html" th:href="@{/}" title="zhengCMS"><span id="logo-text-left">zheng</span><span id="logo-text-right">CMS</span></a>
+            <p class="navbar-text hidden-sm">最简约的内容管理系统</p>
+        </div>
+        <!-- /.navbar-header -->
+        <!-- navbar-collapse -->
+        <div class="collapse navbar-collapse" id="nav-menu">
+            <ul class="nav navbar-nav">
+                <li th:each="menu : ${menus}" th:if="${menu.pid} == null"><a th:href="@{${menu.url}}" th:target="${menu.target}" th:text="${menu.name}">菜单</a></li>
+            </ul>
+            <ul class="nav navbar-right navbar-nav">
+                <li class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="glyphicon glyphicon-search"></span></a>
+                    <ul class="dropdown-menu">
+                        <form id="search-form" class="form-inline">
+                            <div class="input-group">
+                                <input id="keywords" type="text" name="keywords" class="form-control" placeholder="搜索"/>
+                                <div class="input-group-btn">
+                                    <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-search"></span></button>
+                                </div>
+                            </div>
+                        </form>
+                    </ul>
+                </li>
+                <li><a href="login.html">登录</a></li>
+                <li><a href="reg.html">注册</a></li>
+                <li id="messages" class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                        <span class="glyphicon glyphicon-bell"></span>
+                        <span class="badge bg-important">5</span>
+                    </a>
+                    <ul class="dropdown-menu">
+                        <li><a href="home/letter.html"><span class="glyphicon glyphicon-envelope"></span> 我的私信(<span class="msg-txt">1</span>)</a></li>
+                        <li><a href="home/message.html"><span class="glyphicon glyphicon-volume-up"></span> 系统消息(<span class="msg-txt">4</span>)</a></li>
+                    </ul>
+                </li>
+                <li class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                        <span class="glyphicon glyphicon-user"></span>
+                        <span class="caret"></span>
+                    </a>
+                    <ul class="dropdown-menu">
+                        <li><a href="home/index.html"><span class="glyphicon glyphicon-home"></span> 个人博客</a></li>
+                        <li><a href="home/question.html"><span class="glyphicon glyphicon-question-sign"></span> 我的提问</a></li>
+                        <li><a href="home/answer.html"><span class="glyphicon glyphicon-ok-sign"></span> 我的回答</a></li>
+                        <li><a href="home/collection.html"><span class="glyphicon glyphicon-star"></span> 我的收藏</a></li>
+                        <li class="divider"></li>
+                        <li><a href="setting/info.html"><span class="glyphicon glyphicon-cog"></span> 修改资料</a></li>
+                        <li><a href="setting/password.html"><span class="glyphicon glyphicon-lock"></span> 密码安全</a></li>
+                        <li><a href="logout.html"><span class="glyphicon glyphicon-log-out"></span> 安全退出</a></li>
+                    </ul>
+                </li>
+            </ul>
+        </div>
+        <!-- /.navbar-collapse -->
+    </div>
+</nav>
+<!-- /.navbar -->
+<!-- .container -->
+<div class="container" style="padding-bottom:80px;">
+    <h3 th:text="${page.title}">标题</h3>
+    <div th:utext="${page.content}">内容</div>
+</div>
+<!-- /.container -->
+<!-- footer -->
+<footer class="container-fuild text-center" style="position:fixed;bottom:0;width:100%;background:#eee;padding:20px 0;">
+    Copyright &copy; 2017 ZhangShuzheng All Rights Reserved
+</footer>
+<!-- /footer -->
+<script src="../js/jquery-1.11.2.min.js" th:src="@{${uiPath} + ${appName} + '/js/jquery-1.11.2.min.js'}"></script>
+<script src="../js/bootstrap.min.js" th:src="@{${uiPath} + ${appName} + '/js/bootstrap.min.js'}"></script>
+<script src="../js/main.js" th:src="@{${uiPath} + ${appName} + '/js/main.js'}"></script>
+</body>
+</html>

+ 105 - 0
zheng-ui/src/zheng-cms-web/qa/index.html

@@ -0,0 +1,105 @@
+<!DOCTYPE html>
+<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
+<head>
+    <meta charset="utf-8"/>
+    <title>问答首页 - ZhengCms</title>
+    <meta name="keywords" content=""/>
+    <meta name="description" content=""/>
+    <meta name="renderer" content="webkit"/>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1"/>
+    <link rel="shortcut icon" href="../favicon.ico" th:href="@{${uiPath} + ${appName} + '/favicon.ico'}"/>
+    <link rel="stylesheet" href="../css/bootstrap.min.css" th:href="@{${uiPath} + ${appName} + '/css/bootstrap.min.css'}"/>
+    <!--[if lt IE 9]>
+    <script src="../js/vendor/html5shiv.js" th:src="@{${uiPath} + ${appName} + '/js/vendor/html5shiv.js'}"></script>
+    <script src="../js/vendor/respond.min.js" th:src="@{${uiPath} + ${appName} + '/js/vendor/respond.min.js'}"></script>
+    <![endif]-->
+    <script type="text/javascript">
+        if (/msie [6|7|8]/i.test(navigator.userAgent)) {};
+    </script>
+    <link rel="stylesheet" href="../css/main.css" th:href="@{${uiPath} + ${appName} + '/css/main.css'}"/>
+</head>
+<body>
+<!-- .navbar -->
+<nav class="navbar navbar-inverse navbar-fixed-top"><!--navbar-inverse-->
+    <div class="container">
+        <!-- navbar-header -->
+        <div class="navbar-header">
+            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#nav-menu">
+                <span class="sr-only">切换菜单</span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+            </button>
+            <a class="navbar-brand" href="../index.html" th:href="@{/}" title="zhengCMS"><span id="logo-text-left">zheng</span><span id="logo-text-right">CMS</span></a>
+            <p class="navbar-text hidden-sm">最简约的内容管理系统</p>
+        </div>
+        <!-- /.navbar-header -->
+        <!-- navbar-collapse -->
+        <div class="collapse navbar-collapse" id="nav-menu">
+            <ul class="nav navbar-nav">
+                <li th:each="menu : ${menus}" th:if="${menu.pid} == null"><a th:href="@{${menu.url}}" th:target="${menu.target}" th:text="${menu.name}">菜单</a></li>
+            </ul>
+            <ul class="nav navbar-right navbar-nav">
+                <li class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="glyphicon glyphicon-search"></span></a>
+                    <ul class="dropdown-menu">
+                        <form id="search-form" class="form-inline">
+                            <div class="input-group">
+                                <input id="keywords" type="text" name="keywords" class="form-control" placeholder="搜索"/>
+                                <div class="input-group-btn">
+                                    <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-search"></span></button>
+                                </div>
+                            </div>
+                        </form>
+                    </ul>
+                </li>
+                <li><a href="login.html">登录</a></li>
+                <li><a href="reg.html">注册</a></li>
+                <li id="messages" class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                        <span class="glyphicon glyphicon-bell"></span>
+                        <span class="badge bg-important">5</span>
+                    </a>
+                    <ul class="dropdown-menu">
+                        <li><a href="home/letter.html"><span class="glyphicon glyphicon-envelope"></span> 我的私信(<span class="msg-txt">1</span>)</a></li>
+                        <li><a href="home/message.html"><span class="glyphicon glyphicon-volume-up"></span> 系统消息(<span class="msg-txt">4</span>)</a></li>
+                    </ul>
+                </li>
+                <li class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                        <span class="glyphicon glyphicon-user"></span>
+                        <span class="caret"></span>
+                    </a>
+                    <ul class="dropdown-menu">
+                        <li><a href="home/index.html"><span class="glyphicon glyphicon-home"></span> 个人博客</a></li>
+                        <li><a href="home/question.html"><span class="glyphicon glyphicon-question-sign"></span> 我的提问</a></li>
+                        <li><a href="home/answer.html"><span class="glyphicon glyphicon-ok-sign"></span> 我的回答</a></li>
+                        <li><a href="home/collection.html"><span class="glyphicon glyphicon-star"></span> 我的收藏</a></li>
+                        <li class="divider"></li>
+                        <li><a href="setting/info.html"><span class="glyphicon glyphicon-cog"></span> 修改资料</a></li>
+                        <li><a href="setting/password.html"><span class="glyphicon glyphicon-lock"></span> 密码安全</a></li>
+                        <li><a href="logout.html"><span class="glyphicon glyphicon-log-out"></span> 安全退出</a></li>
+                    </ul>
+                </li>
+            </ul>
+        </div>
+        <!-- /.navbar-collapse -->
+    </div>
+</nav>
+<!-- /.navbar -->
+<!-- .container -->
+<div class="container" style="padding-bottom:80px;">
+    问答首页
+</div>
+<!-- /.container -->
+<!-- footer -->
+<footer class="container-fuild text-center" style="position:fixed;bottom:0;width:100%;background:#eee;padding:20px 0;">
+    Copyright &copy; 2017 ZhangShuzheng All Rights Reserved
+</footer>
+<!-- /footer -->
+<script src="../js/jquery-1.11.2.min.js" th:src="@{${uiPath} + ${appName} + '/js/jquery-1.11.2.min.js'}"></script>
+<script src="../js/bootstrap.min.js" th:src="@{${uiPath} + ${appName} + '/js/bootstrap.min.js'}"></script>
+<script src="../js/main.js" th:src="@{${uiPath} + ${appName} + '/js/main.js'}"></script>
+</body>
+</html>

+ 109 - 0
zheng-ui/src/zheng-cms-web/search/index.html

@@ -0,0 +1,109 @@
+<!DOCTYPE html>
+<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
+<head>
+    <meta charset="utf-8"/>
+    <title>搜索结果 - ZhengCms</title>
+    <meta name="keywords" content=""/>
+    <meta name="description" content=""/>
+    <meta name="renderer" content="webkit"/>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1"/>
+    <link rel="shortcut icon" href="../favicon.ico" th:href="@{${uiPath} + ${appName} + '/favicon.ico'}"/>
+    <link rel="stylesheet" href="../css/bootstrap.min.css" th:href="@{${uiPath} + ${appName} + '/css/bootstrap.min.css'}"/>
+    <!--[if lt IE 9]>
+    <script src="../js/vendor/html5shiv.js" th:src="@{${uiPath} + ${appName} + '/js/vendor/html5shiv.js'}"></script>
+    <script src="../js/vendor/respond.min.js" th:src="@{${uiPath} + ${appName} + '/js/vendor/respond.min.js'}"></script>
+    <![endif]-->
+    <script type="text/javascript">
+        if (/msie [6|7|8]/i.test(navigator.userAgent)) {};
+    </script>
+    <link rel="stylesheet" href="../css/main.css" th:href="@{${uiPath} + ${appName} + '/css/main.css'}"/>
+</head>
+<body>
+<!-- .navbar -->
+<nav class="navbar navbar-inverse navbar-fixed-top"><!--navbar-inverse-->
+    <div class="container">
+        <!-- navbar-header -->
+        <div class="navbar-header">
+            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#nav-menu">
+                <span class="sr-only">切换菜单</span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+            </button>
+            <a class="navbar-brand" href="../index.html" th:href="@{/}" title="zhengCMS"><span id="logo-text-left">zheng</span><span id="logo-text-right">CMS</span></a>
+            <p class="navbar-text hidden-sm">最简约的内容管理系统</p>
+        </div>
+        <!-- /.navbar-header -->
+        <!-- navbar-collapse -->
+        <div class="collapse navbar-collapse" id="nav-menu">
+            <ul class="nav navbar-nav">
+                <li th:each="menu : ${menus}" th:if="${menu.pid} == null"><a th:href="@{${menu.url}}" th:target="${menu.target}" th:text="${menu.name}">菜单</a></li>
+            </ul>
+            <ul class="nav navbar-right navbar-nav">
+                <li class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="glyphicon glyphicon-search"></span></a>
+                    <ul class="dropdown-menu">
+                        <form id="search-form" class="form-inline">
+                            <div class="input-group">
+                                <input id="keywords" type="text" name="keywords" class="form-control" placeholder="搜索"/>
+                                <div class="input-group-btn">
+                                    <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-search"></span></button>
+                                </div>
+                            </div>
+                        </form>
+                    </ul>
+                </li>
+                <li><a href="login.html">登录</a></li>
+                <li><a href="reg.html">注册</a></li>
+                <li id="messages" class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                        <span class="glyphicon glyphicon-bell"></span>
+                        <span class="badge bg-important">5</span>
+                    </a>
+                    <ul class="dropdown-menu">
+                        <li><a href="home/letter.html"><span class="glyphicon glyphicon-envelope"></span> 我的私信(<span class="msg-txt">1</span>)</a></li>
+                        <li><a href="home/message.html"><span class="glyphicon glyphicon-volume-up"></span> 系统消息(<span class="msg-txt">4</span>)</a></li>
+                    </ul>
+                </li>
+                <li class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                        <span class="glyphicon glyphicon-user"></span>
+                        <span class="caret"></span>
+                    </a>
+                    <ul class="dropdown-menu">
+                        <li><a href="home/index.html"><span class="glyphicon glyphicon-home"></span> 个人博客</a></li>
+                        <li><a href="home/question.html"><span class="glyphicon glyphicon-question-sign"></span> 我的提问</a></li>
+                        <li><a href="home/answer.html"><span class="glyphicon glyphicon-ok-sign"></span> 我的回答</a></li>
+                        <li><a href="home/collection.html"><span class="glyphicon glyphicon-star"></span> 我的收藏</a></li>
+                        <li class="divider"></li>
+                        <li><a href="setting/info.html"><span class="glyphicon glyphicon-cog"></span> 修改资料</a></li>
+                        <li><a href="setting/password.html"><span class="glyphicon glyphicon-lock"></span> 密码安全</a></li>
+                        <li><a href="logout.html"><span class="glyphicon glyphicon-log-out"></span> 安全退出</a></li>
+                    </ul>
+                </li>
+            </ul>
+        </div>
+        <!-- /.navbar-collapse -->
+    </div>
+</nav>
+<!-- /.navbar -->
+<!-- .container -->
+<div class="container" style="padding-bottom:80px;">
+    <dl>
+        <dt>搜索结果</dt>
+        <dd th:each="article : ${articles}"><a href="../article/index.html" th:href="@{'/article/' + ${article.articleId}}" th:text="${article.title}">文章标题</a></dd>
+    </dl>
+    <div th:utext="${paginator.html}"></div>
+</div>
+<!-- /.container -->
+<!-- footer -->
+<footer class="container-fuild text-center" style="position:fixed;bottom:0;width:100%;background:#eee;padding:20px 0;">
+    Copyright &copy; 2017 ZhangShuzheng All Rights Reserved
+</footer>
+<!-- /footer -->
+<script src="../js/jquery-1.11.2.min.js" th:src="@{${uiPath} + ${appName} + '/js/jquery-1.11.2.min.js'}"></script>
+<script src="../js/bootstrap.min.js" th:src="@{${uiPath} + ${appName} + '/js/bootstrap.min.js'}"></script>
+<script src="../js/main.js" th:src="@{${uiPath} + ${appName} + '/js/main.js'}"></script>
+</body>
+</html>

+ 109 - 0
zheng-ui/src/zheng-cms-web/tag/index.html

@@ -0,0 +1,109 @@
+<!DOCTYPE html>
+<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
+<head>
+    <meta charset="utf-8"/>
+    <title th:text="${tag.name} + ' - ZhengCms'">标签 - ZhengCms</title>
+    <meta name="keywords" content=""/>
+    <meta name="description" content=""/>
+    <meta name="renderer" content="webkit"/>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1"/>
+    <link rel="shortcut icon" href="../favicon.ico" th:href="@{${uiPath} + ${appName} + '/favicon.ico'}"/>
+    <link rel="stylesheet" href="../css/bootstrap.min.css" th:href="@{${uiPath} + ${appName} + '/css/bootstrap.min.css'}"/>
+    <!--[if lt IE 9]>
+    <script src="../js/vendor/html5shiv.js" th:src="@{${uiPath} + ${appName} + '/js/vendor/html5shiv.js'}"></script>
+    <script src="../js/vendor/respond.min.js" th:src="@{${uiPath} + ${appName} + '/js/vendor/respond.min.js'}"></script>
+    <![endif]-->
+    <script type="text/javascript">
+        if (/msie [6|7|8]/i.test(navigator.userAgent)) {};
+    </script>
+    <link rel="stylesheet" href="../css/main.css" th:href="@{${uiPath} + ${appName} + '/css/main.css'}"/>
+</head>
+<body>
+<!-- .navbar -->
+<nav class="navbar navbar-inverse navbar-fixed-top"><!--navbar-inverse-->
+    <div class="container">
+        <!-- navbar-header -->
+        <div class="navbar-header">
+            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#nav-menu">
+                <span class="sr-only">切换菜单</span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+            </button>
+            <a class="navbar-brand" href="../index.html" th:href="@{/}" title="zhengCMS"><span id="logo-text-left">zheng</span><span id="logo-text-right">CMS</span></a>
+            <p class="navbar-text hidden-sm">最简约的内容管理系统</p>
+        </div>
+        <!-- /.navbar-header -->
+        <!-- navbar-collapse -->
+        <div class="collapse navbar-collapse" id="nav-menu">
+            <ul class="nav navbar-nav">
+                <li th:each="menu : ${menus}" th:if="${menu.pid} == null"><a th:href="@{${menu.url}}" th:target="${menu.target}" th:text="${menu.name}">菜单</a></li>
+            </ul>
+            <ul class="nav navbar-right navbar-nav">
+                <li class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="glyphicon glyphicon-search"></span></a>
+                    <ul class="dropdown-menu">
+                        <form id="search-form" class="form-inline">
+                            <div class="input-group">
+                                <input id="keywords" type="text" name="keywords" class="form-control" placeholder="搜索"/>
+                                <div class="input-group-btn">
+                                    <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-search"></span></button>
+                                </div>
+                            </div>
+                        </form>
+                    </ul>
+                </li>
+                <li><a href="login.html">登录</a></li>
+                <li><a href="reg.html">注册</a></li>
+                <li id="messages" class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                        <span class="glyphicon glyphicon-bell"></span>
+                        <span class="badge bg-important">5</span>
+                    </a>
+                    <ul class="dropdown-menu">
+                        <li><a href="home/letter.html"><span class="glyphicon glyphicon-envelope"></span> 我的私信(<span class="msg-txt">1</span>)</a></li>
+                        <li><a href="home/message.html"><span class="glyphicon glyphicon-volume-up"></span> 系统消息(<span class="msg-txt">4</span>)</a></li>
+                    </ul>
+                </li>
+                <li class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                        <span class="glyphicon glyphicon-user"></span>
+                        <span class="caret"></span>
+                    </a>
+                    <ul class="dropdown-menu">
+                        <li><a href="home/index.html"><span class="glyphicon glyphicon-home"></span> 个人博客</a></li>
+                        <li><a href="home/question.html"><span class="glyphicon glyphicon-question-sign"></span> 我的提问</a></li>
+                        <li><a href="home/answer.html"><span class="glyphicon glyphicon-ok-sign"></span> 我的回答</a></li>
+                        <li><a href="home/collection.html"><span class="glyphicon glyphicon-star"></span> 我的收藏</a></li>
+                        <li class="divider"></li>
+                        <li><a href="setting/info.html"><span class="glyphicon glyphicon-cog"></span> 修改资料</a></li>
+                        <li><a href="setting/password.html"><span class="glyphicon glyphicon-lock"></span> 密码安全</a></li>
+                        <li><a href="logout.html"><span class="glyphicon glyphicon-log-out"></span> 安全退出</a></li>
+                    </ul>
+                </li>
+            </ul>
+        </div>
+        <!-- /.navbar-collapse -->
+    </div>
+</nav>
+<!-- /.navbar -->
+<!-- .container -->
+<div class="container" style="padding-bottom:80px;">
+    <dl>
+        <dt><span th:text="${tag.name}">标签</span>文章列表</dt>
+        <dd th:each="article : ${articles}"><a href="../article/index.html" th:href="@{'/article/' + ${article.articleId}}" th:text="${article.title}">文章标题</a></dd>
+    </dl>
+    <div th:utext="${paginator.html}"></div>
+</div>
+<!-- /.container -->
+<!-- footer -->
+<footer class="container-fuild text-center" style="position:fixed;bottom:0;width:100%;background:#eee;padding:20px 0;">
+    Copyright &copy; 2017 ZhangShuzheng All Rights Reserved
+</footer>
+<!-- /footer -->
+<script src="../js/jquery-1.11.2.min.js" th:src="@{${uiPath} + ${appName} + '/js/jquery-1.11.2.min.js'}"></script>
+<script src="../js/bootstrap.min.js" th:src="@{${uiPath} + ${appName} + '/js/bootstrap.min.js'}"></script>
+<script src="../js/main.js" th:src="@{${uiPath} + ${appName} + '/js/main.js'}"></script>
+</body>
+</html>

+ 106 - 0
zheng-ui/src/zheng-cms-web/topic/index.html

@@ -0,0 +1,106 @@
+<!DOCTYPE html>
+<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
+<head>
+    <meta charset="utf-8"/>
+    <title th:text="${topic.title} + ' - ZhengCms'">标题 - ZhengCms</title>
+    <meta name="keywords" content=""/>
+    <meta name="description" content=""/>
+    <meta name="renderer" content="webkit"/>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1"/>
+    <link rel="shortcut icon" href="favicon.ico" th:href="@{${uiPath} + ${appName} + '/favicon.ico'}"/>
+    <link rel="stylesheet" href="css/bootstrap.min.css" th:href="@{${uiPath} + ${appName} + '/css/bootstrap.min.css'}"/>
+    <!--[if lt IE 9]>
+    <script src="js/vendor/html5shiv.js" th:src="@{${uiPath} + ${appName} + '/js/vendor/html5shiv.js'}"></script>
+    <script src="js/vendor/respond.min.js" th:src="@{${uiPath} + ${appName} + '/js/vendor/respond.min.js'}"></script>
+    <![endif]-->
+    <script type="text/javascript">
+        if (/msie [6|7|8]/i.test(navigator.userAgent)) {};
+    </script>
+    <link rel="stylesheet" href="css/main.css" th:href="@{${uiPath} + ${appName} + '/css/main.css'}"/>
+</head>
+<body>
+<!-- .navbar -->
+<nav class="navbar navbar-inverse navbar-fixed-top"><!--navbar-inverse-->
+    <div class="container">
+        <!-- navbar-header -->
+        <div class="navbar-header">
+            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#nav-menu">
+                <span class="sr-only">切换菜单</span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+            </button>
+            <a class="navbar-brand" href="index.html" th:href="@{/}" title="zhengCMS"><span id="logo-text-left">zheng</span><span id="logo-text-right">CMS</span></a>
+            <p class="navbar-text hidden-sm">最简约的内容管理系统</p>
+        </div>
+        <!-- /.navbar-header -->
+        <!-- navbar-collapse -->
+        <div class="collapse navbar-collapse" id="nav-menu">
+            <ul class="nav navbar-nav">
+                <li th:each="menu : ${menus}" th:if="${menu.pid} == null"><a th:href="@{${menu.url}}" th:target="${menu.target}" th:text="${menu.name}">菜单</a></li>
+            </ul>
+            <ul class="nav navbar-right navbar-nav">
+                <li class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="glyphicon glyphicon-search"></span></a>
+                    <ul class="dropdown-menu">
+                        <form id="search-form" class="form-inline">
+                            <div class="input-group">
+                                <input id="keywords" type="text" name="keywords" class="form-control" placeholder="搜索"/>
+                                <div class="input-group-btn">
+                                    <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-search"></span></button>
+                                </div>
+                            </div>
+                        </form>
+                    </ul>
+                </li>
+                <li><a href="login.html">登录</a></li>
+                <li><a href="reg.html">注册</a></li>
+                <li id="messages" class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                        <span class="glyphicon glyphicon-bell"></span>
+                        <span class="badge bg-important">5</span>
+                    </a>
+                    <ul class="dropdown-menu">
+                        <li><a href="home/letter.html"><span class="glyphicon glyphicon-envelope"></span> 我的私信(<span class="msg-txt">1</span>)</a></li>
+                        <li><a href="home/message.html"><span class="glyphicon glyphicon-volume-up"></span> 系统消息(<span class="msg-txt">4</span>)</a></li>
+                    </ul>
+                </li>
+                <li class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                        <span class="glyphicon glyphicon-user"></span>
+                        <span class="caret"></span>
+                    </a>
+                    <ul class="dropdown-menu">
+                        <li><a href="home/index.html"><span class="glyphicon glyphicon-home"></span> 个人博客</a></li>
+                        <li><a href="home/question.html"><span class="glyphicon glyphicon-question-sign"></span> 我的提问</a></li>
+                        <li><a href="home/answer.html"><span class="glyphicon glyphicon-ok-sign"></span> 我的回答</a></li>
+                        <li><a href="home/collection.html"><span class="glyphicon glyphicon-star"></span> 我的收藏</a></li>
+                        <li class="divider"></li>
+                        <li><a href="setting/info.html"><span class="glyphicon glyphicon-cog"></span> 修改资料</a></li>
+                        <li><a href="setting/password.html"><span class="glyphicon glyphicon-lock"></span> 密码安全</a></li>
+                        <li><a href="logout.html"><span class="glyphicon glyphicon-log-out"></span> 安全退出</a></li>
+                    </ul>
+                </li>
+            </ul>
+        </div>
+        <!-- /.navbar-collapse -->
+    </div>
+</nav>
+<!-- /.navbar -->
+<!-- .container -->
+<div class="container" style="padding-bottom:80px;">
+    <h3 th:text="${topic.title}">标题</h3>
+    <div th:utext="${topic.description}">描述</div>
+</div>
+<!-- /.container -->
+<!-- footer -->
+<footer class="container-fuild text-center" style="position:fixed;bottom:0;width:100%;background:#eee;padding:20px 0;">
+    Copyright &copy; 2017 ZhangShuzheng All Rights Reserved
+</footer>
+<!-- /footer -->
+<script src="js/jquery-1.11.2.min.js" th:src="@{${uiPath} + ${appName} + '/js/jquery-1.11.2.min.js'}"></script>
+<script src="js/bootstrap.min.js" th:src="@{${uiPath} + ${appName} + '/js/bootstrap.min.js'}"></script>
+<script src="js/main.js" th:src="@{${uiPath} + ${appName} + '/js/main.js'}"></script>
+</body>
+</html>

+ 109 - 0
zheng-ui/src/zheng-cms-web/topic/list.html

@@ -0,0 +1,109 @@
+<!DOCTYPE html>
+<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
+<head>
+    <meta charset="utf-8"/>
+    <title>专题列表 - ZhengCms</title>
+    <meta name="keywords" content=""/>
+    <meta name="description" content=""/>
+    <meta name="renderer" content="webkit"/>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1"/>
+    <link rel="shortcut icon" href="favicon.ico" th:href="@{${uiPath} + ${appName} + '/favicon.ico'}"/>
+    <link rel="stylesheet" href="css/bootstrap.min.css" th:href="@{${uiPath} + ${appName} + '/css/bootstrap.min.css'}"/>
+    <!--[if lt IE 9]>
+    <script src="js/vendor/html5shiv.js" th:src="@{${uiPath} + ${appName} + '/js/vendor/html5shiv.js'}"></script>
+    <script src="js/vendor/respond.min.js" th:src="@{${uiPath} + ${appName} + '/js/vendor/respond.min.js'}"></script>
+    <![endif]-->
+    <script type="text/javascript">
+        if (/msie [6|7|8]/i.test(navigator.userAgent)) {};
+    </script>
+    <link rel="stylesheet" href="css/main.css" th:href="@{${uiPath} + ${appName} + '/css/main.css'}"/>
+</head>
+<body>
+<!-- .navbar -->
+<nav class="navbar navbar-inverse navbar-fixed-top"><!--navbar-inverse-->
+    <div class="container">
+        <!-- navbar-header -->
+        <div class="navbar-header">
+            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#nav-menu">
+                <span class="sr-only">切换菜单</span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+            </button>
+            <a class="navbar-brand" href="index.html" th:href="@{/}" title="zhengCMS"><span id="logo-text-left">zheng</span><span id="logo-text-right">CMS</span></a>
+            <p class="navbar-text hidden-sm">最简约的内容管理系统</p>
+        </div>
+        <!-- /.navbar-header -->
+        <!-- navbar-collapse -->
+        <div class="collapse navbar-collapse" id="nav-menu">
+            <ul class="nav navbar-nav">
+                <li th:each="menu : ${menus}" th:if="${menu.pid} == null"><a th:href="@{${menu.url}}" th:target="${menu.target}" th:text="${menu.name}">菜单</a></li>
+            </ul>
+            <ul class="nav navbar-right navbar-nav">
+                <li class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="glyphicon glyphicon-search"></span></a>
+                    <ul class="dropdown-menu">
+                        <form id="search-form" class="form-inline">
+                            <div class="input-group">
+                                <input id="keywords" type="text" name="keywords" class="form-control" placeholder="搜索"/>
+                                <div class="input-group-btn">
+                                    <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-search"></span></button>
+                                </div>
+                            </div>
+                        </form>
+                    </ul>
+                </li>
+                <li><a href="login.html">登录</a></li>
+                <li><a href="reg.html">注册</a></li>
+                <li id="messages" class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                        <span class="glyphicon glyphicon-bell"></span>
+                        <span class="badge bg-important">5</span>
+                    </a>
+                    <ul class="dropdown-menu">
+                        <li><a href="home/letter.html"><span class="glyphicon glyphicon-envelope"></span> 我的私信(<span class="msg-txt">1</span>)</a></li>
+                        <li><a href="home/message.html"><span class="glyphicon glyphicon-volume-up"></span> 系统消息(<span class="msg-txt">4</span>)</a></li>
+                    </ul>
+                </li>
+                <li class="dropdown">
+                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                        <span class="glyphicon glyphicon-user"></span>
+                        <span class="caret"></span>
+                    </a>
+                    <ul class="dropdown-menu">
+                        <li><a href="home/index.html"><span class="glyphicon glyphicon-home"></span> 个人博客</a></li>
+                        <li><a href="home/question.html"><span class="glyphicon glyphicon-question-sign"></span> 我的提问</a></li>
+                        <li><a href="home/answer.html"><span class="glyphicon glyphicon-ok-sign"></span> 我的回答</a></li>
+                        <li><a href="home/collection.html"><span class="glyphicon glyphicon-star"></span> 我的收藏</a></li>
+                        <li class="divider"></li>
+                        <li><a href="setting/info.html"><span class="glyphicon glyphicon-cog"></span> 修改资料</a></li>
+                        <li><a href="setting/password.html"><span class="glyphicon glyphicon-lock"></span> 密码安全</a></li>
+                        <li><a href="logout.html"><span class="glyphicon glyphicon-log-out"></span> 安全退出</a></li>
+                    </ul>
+                </li>
+            </ul>
+        </div>
+        <!-- /.navbar-collapse -->
+    </div>
+</nav>
+<!-- /.navbar -->
+<!-- .container -->
+<div class="container" style="padding-bottom:80px;">
+    <dl>
+        <dt>专题列表</dt>
+        <dd th:each="topic : ${topics}"><a href="topic/index.html" th:href="@{'/topic/' + ${topic.topicId}}" th:text="${topic.title}">专题标题</a></dd>
+    </dl>
+    <div th:utext="${paginator.html}"></div>
+</div>
+<!-- /.container -->
+<!-- footer -->
+<footer class="container-fuild text-center" style="position:fixed;bottom:0;width:100%;background:#eee;padding:20px 0;">
+    Copyright &copy; 2017 ZhangShuzheng All Rights Reserved
+</footer>
+<!-- /footer -->
+<script src="js/jquery-1.11.2.min.js" th:src="@{${uiPath} + ${appName} + '/js/jquery-1.11.2.min.js'}"></script>
+<script src="js/bootstrap.min.js" th:src="@{${uiPath} + ${appName} + '/js/bootstrap.min.js'}"></script>
+<script src="js/main.js" th:src="@{${uiPath} + ${appName} + '/js/main.js'}"></script>
+</body>
+</html>