基于SSH框架的小型论坛项目  

  一、项目入门  传送门

  二、框架整合  传送门

  三、用户模块  传送门

  四、页面显示  传送门

  五、帖子模块  传送门

  六、点赞模块  传送门

  七、辅助模块  传送门

回复帖子

  分析回复帖子

  拿到paste.title标签

  1. <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>">
  2. <s:property value="#paste.title" />
  3. </a>

  编写查看帖子模型驱动

  帖子模型驱动Web层

  1. //查看帖子详细信息
  2. public String getDetail() throws Exception{
  3.  
  4. Paste paste = pasteService.findAllPasteByIdReturnPaste(pasteid);
  5.  
  6. ActionContext.getContext().put("paste", paste);
  7.  
  8. return "detail";
  9. }

  帖子模型驱动Service层

  1. public Paste findAllPasteByIdReturnPaste(String pasteid) {
  2.  
  3. return pasteDao.findPasteByIdReturnPaste(pasteid);
  4. }

  帖子模板Dao层

  1. public Paste findPasteByIdReturnPaste(String pasteid) {
  2. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  3. String sql = "select * from paste where id = ?";
  4. NativeQuery query = session.createSQLQuery(sql);
  5. query.addEntity(Paste.class);
  6. query.setParameter(1, pasteid);
  7. Paste result = (Paste) query.uniqueResult();
  8. return result;
  9. }

  帖子前端页面

  

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>问题详情</title>
  6. <meta name="viewport"
  7. content="width=device-width, initial-scale=1, maximum-scale=1">
  8. <meta name="keywords" content="fly,layui,前端社区">
  9. <meta name="description"
  10. content="">
  11. <link rel="stylesheet" href="res/layui/css/layui.css">
  12. <link rel="stylesheet" href="res/css/global.css">
  13. <script src="res/layui/layui.js"></script>
  14. <script src="js/jquery.js"></script>
  15. <style type="text/css" rel="stylesheet">
  16. form {
  17. margin: 0;
  18. }
  19.  
  20. .editor {
  21. margin-top: 5px;
  22. margin-bottom: 5px;
  23. }
  24. </style>
  25.  
  26. </head>
  27. <body>
  28. <iframe src="head.html" scrolling="no" width="100%" height="65px" ></iframe>
  29. <div class="main layui-clear">
  30. <div class="wrap">
  31. <div class="content detail">
  32. <div class="fly-panel detail-box">
  33. <h1>帖子标题</h1>
  34. <div class="fly-tip fly-detail-hint" data-id="">
  35. <span class="fly-tip-stick">置顶帖</span><span class="jie-admin"> <a
  36. href="">点击置顶</a> </span> <span
  37. class="layui-btn layui-btn-mini jie-admin"> <a href="">取消置顶</a>
  38. </span> <span class="jie-admin" type="del" style="margin-left: 20px;">
  39. <a>删除该帖</a> </span>
  40. </span>
  41. <div class="fly-list-hint">
  42. <i class="iconfont" title="回答"></i> 2
  43. </div>
  44. </div>
  45. <div class="detail-about">
  46. <a class="jie-user" href=""> <img
  47. src="res/images/uer.jpg" alt="头像"> <cite> 压缩
  48. <em>2017-05-01发布</em> </cite> </a>
  49. <div class="detail-hits" data-id="{{rows.id}}">
  50. <span class="layui-btn layui-btn-mini jie-admin"><a
  51. href="#">已完帖,无法编辑</a> </span> <span
  52. class="layui-btn layui-btn-mini jie-admin" type="collect"
  53. data-type="add"> <a id="collectPost">收藏</a> </span> <span
  54. class="layui-btn layui-btn-mini jie-admin layui-btn-danger"
  55. type="collect" data-type="add"> <a>取消收藏</a> </span>
  56.  
  57. </div>
  58. </div>
  59. <div class="detail-body photos" style="margin-bottom: 20px;">
  60. <p>帖子内容</p>
  61. </div>
  62. </div>
  63. <div class="fly-panel detail-box" style="padding-top: 0;">
  64. <a name="comment"></a>
  65. <ul class="jieda photos" id="jieda">
  66. <li data-id="12" class="jieda-daan"><a
  67. name="item-121212121212"></a>
  68. <div class="detail-about detail-about-reply">
  69. <a class="jie-user" href=""> <img
  70. src="res/images/uer.jpg" alt=""> <cite> <i>纸飞机</i>
  71. <!-- <em>(楼主)</em>
  72. <em style="color:#5FB878">(管理员)</em> --> </cite> </a>
  73. <div class="detail-hits">
  74. <span>3分钟前</span>
  75. </div>
  76. <i class="iconfont icon-caina" title="最佳答案"></i>
  77. </div>
  78. <div class="detail-body jieda-body">
  79. <p>么么哒</p>
  80. </div>
  81. <div class="jieda-reply">
  82. <span class="jieda-zan zanok" type="zan"><i
  83. class="iconfont icon-zan"></i><em>12</em>
  84. </span>
  85. <!-- <div class="jieda-admin">
  86. <span type="del">删除</span>
  87. <span class="jieda-accept" type="accept">采纳</span>
  88. </div> -->
  89. </div></li>
  90. <li data-id="13"><a name="item-121212121212"></a>
  91. <div class="detail-about detail-about-reply">
  92. <a class="jie-user" href=""> <img
  93. src="res/images/uer.jpg" alt=""> <cite> <i>香菇</i>
  94. <em style="color:#FF9E3F">活雷锋</em> </cite> </a>
  95. <div class="detail-hits">
  96. <span>刚刚</span>
  97. </div>
  98. </div>
  99. <div class="detail-body jieda-body">
  100. <p>蓝瘦</p>
  101. </div>
  102. <div class="jieda-reply">
  103. <span class="jieda-zan" type="zan"><i
  104. class="iconfont icon-zan"></i><em>0</em>
  105. </span>
  106. <div class="jieda-admin">
  107. <span type="del"><a href="#" class="layui-btn layui-btn-danger layui-btn-small">删除</a></span>
  108. <span class="jieda-accept" type="accept">
  109. <a href="#" class="layui-btn layui-btn-small">采纳</a></span>
  110. </div>
  111. </div></li>
  112.  
  113. <!-- <li class="fly-none">没有任何回答</li> -->
  114. </ul>
  115. <span
  116. id="toName">@ 压缩(楼主)</span>
  117. <div class="layui-form layui-form-pane">
  118. <form action="">
  119. <div class="layui-form-item layui-form-text">
  120. <div class="layui-input-block">
  121. <textarea id="L_content" name="content" required
  122. lay-verify="required" placeholder="我要回答"
  123. class="layui-textarea fly-editor" style="height: 150px;"></textarea>
  124. </div>
  125. </div>
  126. <div class="layui-form-item">
  127. <button class="layui-btn" lay-filter="*" lay-submit>提交回答</button>
  128. </div>
  129. </form>
  130. </div>
  131. </div>
  132. </div>
  133. </div>
  134.  
  135. <div class="edge">
  136. <dl class="fly-panel fly-list-one">
  137. <dt class="fly-panel-title">最近热帖</dt>
  138. <dd>
  139. <a href="">使用 layui 秒搭后台大布局(基本结构)</a> <span><i
  140. class="iconfont"></i> 6087</span>
  141. </dd>
  142. <dd>
  143. <a href="">Java实现LayIM后端的核心代码</a> <span><i class="iconfont"></i>
  144. 767</span>
  145. </dd>
  146. <dd>
  147. <a href="">使用 layui 秒搭后台大布局(基本结构)</a> <span><i
  148. class="iconfont"></i> 6087</span>
  149. </dd>
  150. <dd>
  151. <a href="">Java实现LayIM后端的核心代码</a> <span><i class="iconfont"></i>
  152. 767</span>
  153. </dd>
  154. <dd>
  155. <a href="">使用 layui 秒搭后台大布局(基本结构)</a> <span><i
  156. class="iconfont"></i> 6087</span>
  157. </dd>
  158. <dd>
  159. <a href="">Java实现LayIM后端的核心代码</a> <span><i class="iconfont"></i>
  160. 767</span>
  161. </dd>
  162. <dd>
  163. <a href="">使用 layui 秒搭后台大布局(基本结构)</a> <span><i
  164. class="iconfont"></i> 6087</span>
  165. </dd>
  166. <dd>
  167. <a href="">Java实现LayIM后端的核心代码</a> <span><i class="iconfont"></i>
  168. 767</span>
  169. </dd>
  170. </dl>
  171.  
  172. <dl class="fly-panel fly-list-one">
  173. <dt class="fly-panel-title">近期热议</dt>
  174. <dd>
  175. <a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i
  176. class="iconfont"></i> 96</span>
  177. </dd>
  178. <dd>
  179. <a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i
  180. class="iconfont"></i> 96</span>
  181. </dd>
  182. <dd>
  183. <a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i
  184. class="iconfont"></i> 96</span>
  185. </dd>
  186. <dd>
  187. <a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i
  188. class="iconfont"></i> 96</span>
  189. </dd>
  190. <dd>
  191. <a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i
  192. class="iconfont"></i> 96</span>
  193. </dd>
  194. <dd>
  195. <a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i
  196. class="iconfont"></i> 96</span>
  197. </dd>
  198. <dd>
  199. <a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i
  200. class="iconfont"></i> 96</span>
  201. </dd>
  202. <dd>
  203. <a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i
  204. class="iconfont"></i> 96</span>
  205. </dd>
  206. </dl>
  207. </div>
  208. </div>
  209. <script type="text/javascript" charset="utf-8" src="res/js/kindeditor.js"></script>
  210. <script type="text/javascript">
  211. KE.show({
  212. id : 'L_content',
  213. resizeMode : 1,
  214. items : [
  215. 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold', 'italic', 'underline',
  216. 'removeformat', 'justifyleft', 'justifycenter', 'justifyright', 'insertorderedlist',
  217. 'insertunorderedlist', 'emoticons', 'image', 'link']
  218. });
  219. </script>
  220. </body>
  221. </html>

detail.html

  动态从数据库中获取帖子模块内容

  1. <div class="fly-panel detail-box">
  2.  
  3. <h1>
  4. <s:property value="#paste.title" />
  5. </h1>
  6. <div class="fly-tip fly-detail-hint" data-id="">
  7. <span class="fly-tip-stick">置顶帖</span>
  8. <span class="jie-admin">
  9. <a href="">点击置顶</a>
  10. </span>
  11. <span class="layui-btn layui-btn-mini jie-admin">
  12. <a href="">取消置顶</a>
  13. </span>
  14. <span class="jie-admin" type="del" style="margin-left: 20px;">
  15. <a>删除该帖</a>
  16. </span>
  17. </span>
  18. <div class="fly-list-hint">
  19. <i class="iconfont" title="回答"></i>
  20. <s:property value="#paste.ansnum" />
  21. </div>
  22. </div>
  23. <div class="detail-about">
  24. <a class="jie-user" href="">
  25.  
  26. <img src="${pageContext.request.contextPath }/<s:property value="#paste.user.image"/>" alt="头像">
  27. <cite>
  28. <s:property value="#paste.user.username" />
  29. <em>
  30. <s:property value="#paste.createtime" />
  31. 发布
  32. </em>
  33. </cite>
  34. </a>
  35. <div class="detail-hits" data-id="{{rows.id}}">
  36. <span class="layui-btn layui-btn-mini jie-admin">
  37. <a href="#">已完帖,无法编辑</a>
  38. </span>
  39. <span class="layui-btn layui-btn-mini jie-admin" type="collect" data-type="add">
  40. <a id="collectPost">收藏</a>
  41. </span>
  42. <span class="layui-btn layui-btn-mini jie-admin layui-btn-danger" type="collect" data-type="add">
  43. <a>取消收藏</a>
  44. </span>
  45.  
  46. </div>
  47. </div>
  48. <div class="detail-body photos" style="margin-bottom: 20px;">
  49. <p>
  50. <s:property value="#paste.content" />
  51. </p>
  52. </div>
  53. </div>

  

  Web层

  1. package com.Gary.web;
  2.  
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5.  
  6. import com.Gary.domain.Paste;
  7. import com.Gary.domain.User;
  8. import com.Gary.service.PasteService;
  9. import com.opensymphony.xwork2.ActionContext;
  10. import com.opensymphony.xwork2.ActionSupport;
  11. import com.opensymphony.xwork2.ModelDriven;
  12.  
  13. public class PasteAction extends ActionSupport implements ModelDriven<Paste> {
  14.  
  15. public Paste paste = new Paste();
  16. private PasteService pasteService;
  17. private String pasteid;
  18.  
  19. //查看帖子详细信息
  20. public String getDetail() throws Exception{
  21.  
  22. Paste paste = pasteService.findAllPasteByIdReturnPaste(pasteid);
  23.  
  24. ActionContext.getContext().put("paste", paste);
  25.  
  26. return "detail";
  27. }
  28.  
  29. //添加帖子
  30. public String addPaste() throws Exception {
  31. User user = (User)ActionContext.getContext().getSession().get("user");
  32.  
  33. if(user==null)
  34. {
  35. ActionContext.getContext().put("error", "只有登陆之后才可以发帖子!!");
  36. return "error";
  37. }
  38.  
  39. //private Integer ansnum;
  40. paste.setAnsnum(0);
  41. //private String createtime;
  42. Date date = new Date(System.currentTimeMillis());
  43. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
  44. String createtime = format.format(date);
  45. paste.setCreatetime(createtime);
  46. //private Integer glanceover;
  47. paste.setGlanceover(0);
  48. //是否结帖 0未结 1结束
  49. //private Integer solve;
  50. paste.setSolve(0);
  51. //private Integer isdelete;
  52. paste.setIsdelete(0);
  53. //private User user;
  54.  
  55. paste.setUser(user);
  56.  
  57. pasteService.addPaste(paste);
  58.  
  59. //重定向到主页
  60. return "toIndex";
  61. }
  62.  
  63. public PasteService getPasteService() {
  64. return pasteService;
  65. }
  66.  
  67. public void setPasteService(PasteService pasteService) {
  68. this.pasteService = pasteService;
  69. }
  70.  
  71. @Override
  72. public Paste getModel() {
  73. // TODO Auto-generated method stub
  74. return paste;
  75. }
  76.  
  77. public String getPasteid() {
  78. return pasteid;
  79. }
  80.  
  81. public void setPasteid(String pasteid) {
  82. this.pasteid = pasteid;
  83. }
  84.  
  85. }

PasteAction.java

  Service层

  1. package com.Gary.service;
  2.  
  3. import java.util.List;
  4.  
  5. import com.Gary.dao.PasteDao;
  6. import com.Gary.domain.Paste;
  7. import com.Gary.utils.PageBean;
  8.  
  9. public class PasteService {
  10.  
  11. private PasteDao pasteDao;
  12.  
  13. public Paste findAllPasteByIdReturnPaste(String pasteid) {
  14.  
  15. return pasteDao.findPasteByIdReturnPaste(pasteid);
  16. }
  17.  
  18. public PageBean getGlanceoverPageBean(Integer currentPage) {
  19. Integer totalCount = pasteDao.findAllPasteNum();
  20. PageBean glanceoverPageBean = new PageBean(currentPage, totalCount, 8);
  21. List<Paste> list = pasteDao.getGlanceoverPageList();
  22. glanceoverPageBean.setList(list);
  23.  
  24. return glanceoverPageBean;
  25. }
  26.  
  27. public PageBean getPastePageBean(Integer currentPage) {
  28.  
  29. Integer totalCount = pasteDao.findAllPasteNum();
  30. PageBean pageBean = new PageBean(currentPage,totalCount,8);
  31. List<Paste> list = pasteDao.getPastePageList(pageBean.getStart(),pageBean.getPageSize());
  32. pageBean.setList(list);
  33.  
  34. return pageBean;
  35. }
  36.  
  37. public PasteDao getPasteDao() {
  38. return pasteDao;
  39. }
  40.  
  41. public List<Paste> findAllPaste() {
  42.  
  43. return pasteDao.findAllPaste();
  44.  
  45. }
  46.  
  47. public void setPasteDao(PasteDao pasteDao) {
  48. this.pasteDao = pasteDao;
  49. }
  50.  
  51. public void addPaste(Paste paste) {
  52.  
  53. pasteDao.addPaste(paste);
  54.  
  55. }
  56.  
  57. public PageBean getAnsnumPageBean(Integer currentPage) {
  58. //获得所有的帖子数目
  59. Integer totalCount = pasteDao.findAllPasteNum();
  60. //创建PageBean
  61. PageBean ansnumPageBean = new PageBean(currentPage, totalCount, 8);
  62. //得到List
  63. List<Paste> list = pasteDao.getAnsnumPageList();
  64. //封装List
  65. ansnumPageBean.setList(list);
  66. return ansnumPageBean;
  67. }
  68.  
  69. }

PasteService.java

  Dao层

  1. package com.Gary.dao;
  2.  
  3. import java.math.BigInteger;
  4. import java.util.List;
  5.  
  6. import org.hibernate.Session;
  7. import org.hibernate.query.NativeQuery;
  8. import org.hibernate.query.Query;
  9. import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
  10.  
  11. import com.Gary.domain.Paste;
  12.  
  13. public class PasteDao extends HibernateDaoSupport{
  14.  
  15. public void addPaste(Paste paste) {
  16.  
  17. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  18. session.save(paste);
  19. }
  20.  
  21. //HQL
  22. public List<Paste> findAllPaste() {
  23.  
  24. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  25.  
  26. //书写SQL语句
  27. String hql = "from com.Gary.domain.Paste";
  28. Query query = session.createQuery(hql);
  29.  
  30. List<Paste> list = query.list();
  31.  
  32. return list;
  33. }
  34.  
  35. //查找所有帖子的数量
  36. public Integer findAllPasteNum() {
  37. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  38. String sql = "select count(*) from paste";
  39. NativeQuery query = session.createSQLQuery(sql);
  40. BigInteger result = (BigInteger)query.uniqueResult();
  41.  
  42. return result.intValue();
  43. }
  44.  
  45. //分页
  46. public List<Paste> getPastePageList(Integer start, Integer pageSize) {
  47. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  48. String sql = "select * from paste limit ?,?";
  49. NativeQuery query = session.createSQLQuery(sql);
  50. query.addEntity(Paste.class);
  51. query.setParameter(1, start);
  52. query.setParameter(2, pageSize);
  53. List<Paste> list = query.list();
  54.  
  55. return list;
  56. }
  57.  
  58. //最近热议
  59. public List<Paste> getGlanceoverPageList() {
  60. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  61. String sql = "select * from paste order by glanceover desc limit 0,8";
  62. NativeQuery query = session.createSQLQuery(sql);
  63. query.addEntity(Paste.class);
  64. List list = query.list();
  65. return list;
  66. }
  67.  
  68. public List<Paste> getAnsnumPageList() {
  69. //得到与当前线程绑定的session
  70. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  71. //书写sql
  72. String sql = "select * from paste order by ansnum desc limit 0,8";
  73. //获得query
  74. NativeQuery query = session.createSQLQuery(sql);
  75. //将结果集封装为Paste对象
  76. query.addEntity(Paste.class);
  77. //获得sql的执行结果(结果为list)
  78. List list = query.list();
  79. return list;
  80. }
  81.  
  82. //查看帖子
  83. public Paste findPasteByIdReturnPaste(String pasteid) {
  84. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  85. String sql = "select * from paste where id = ?";
  86. NativeQuery query = session.createSQLQuery(sql);
  87. query.addEntity(Paste.class);
  88. query.setParameter(1, pasteid);
  89. Paste result = (Paste) query.uniqueResult();
  90. return result;
  91. }
  92.  
  93. }

PasteDao.java

  帖子模块前端页面

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <%@ taglib uri="/struts-tags" prefix="s"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta charset="utf-8">
  7. <title>问题详情</title>
  8. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  9. <meta name="keywords" content="fly,layui,前端社区">
  10. <meta name="description" content="">
  11. <link rel="stylesheet" href="res/layui/css/layui.css">
  12. <link rel="stylesheet" href="res/css/global.css">
  13. <script src="res/layui/layui.js"></script>
  14. <script src="js/jquery.js"></script>
  15. <style type="text/css" rel="stylesheet">
  16. form {
  17. margin: 0;
  18. }
  19.  
  20. .editor {
  21. margin-top: 5px;
  22. margin-bottom: 5px;
  23. }
  24. </style>
  25.  
  26. </head>
  27. <body style="margin: -2px">
  28. <iframe src="head.jsp" scrolling="no" width="100%" height="110px"></iframe>
  29. <div class="main layui-clear">
  30. <div class="wrap">
  31. <div class="content detail">
  32. <div class="fly-panel detail-box">
  33.  
  34. <h1>
  35. <s:property value="#paste.title" />
  36. </h1>
  37. <div class="fly-tip fly-detail-hint" data-id="">
  38. <span class="fly-tip-stick">置顶帖</span>
  39. <span class="jie-admin">
  40. <a href="">点击置顶</a>
  41. </span>
  42. <span class="layui-btn layui-btn-mini jie-admin">
  43. <a href="">取消置顶</a>
  44. </span>
  45. <span class="jie-admin" type="del" style="margin-left: 20px;">
  46. <a>删除该帖</a>
  47. </span>
  48. </span>
  49. <div class="fly-list-hint">
  50. <i class="iconfont" title="回答"></i>
  51. <s:property value="#paste.ansnum" />
  52. </div>
  53. </div>
  54. <div class="detail-about">
  55. <a class="jie-user" href="">
  56.  
  57. <img src="${pageContext.request.contextPath }/<s:property value="#paste.user.image"/>" alt="头像">
  58. <cite>
  59. <s:property value="#paste.user.username" />
  60. <em>
  61. <s:property value="#paste.createtime" />
  62. 发布
  63. </em>
  64. </cite>
  65. </a>
  66. <div class="detail-hits" data-id="{{rows.id}}">
  67. <span class="layui-btn layui-btn-mini jie-admin">
  68. <a href="#">已完帖,无法编辑</a>
  69. </span>
  70. <span class="layui-btn layui-btn-mini jie-admin" type="collect" data-type="add">
  71. <a id="collectPost">收藏</a>
  72. </span>
  73. <span class="layui-btn layui-btn-mini jie-admin layui-btn-danger" type="collect" data-type="add">
  74. <a>取消收藏</a>
  75. </span>
  76.  
  77. </div>
  78. </div>
  79. <div class="detail-body photos" style="margin-bottom: 20px;">
  80. <p>
  81. <s:property value="#paste.content" />
  82. </p>
  83. </div>
  84. </div>
  85.  
  86. <div class="fly-panel detail-box" style="padding-top: 0;">
  87. <a name="comment"></a>
  88. <ul class="jieda photos" id="jieda">
  89. <li data-id="12" class="jieda-daan"><a name="item-121212121212"></a>
  90. <div class="detail-about detail-about-reply">
  91. <a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>纸飞机</i> <!-- <em>(楼主)</em>
  92. <em style="color:#5FB878">(管理员)</em> -->
  93. </cite>
  94. </a>
  95. <div class="detail-hits">
  96. <span>3分钟前</span>
  97. </div>
  98. <i class="iconfont icon-caina" title="最佳答案"></i>
  99. </div>
  100. <div class="detail-body jieda-body">
  101. <p>么么哒</p>
  102. </div>
  103. <div class="jieda-reply">
  104. <span class="jieda-zan zanok" type="zan"><i class="iconfont icon-zan"></i><em>12</em> </span>
  105. <!-- <div class="jieda-admin">
  106. <span type="del">删除</span>
  107. <span class="jieda-accept" type="accept">采纳</span>
  108. </div> -->
  109. </div></li>
  110. <li data-id="13"><a name="item-121212121212"></a>
  111. <div class="detail-about detail-about-reply">
  112. <a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>香菇</i> <em style="color: #FF9E3F">活雷锋</em>
  113. </cite>
  114. </a>
  115. <div class="detail-hits">
  116. <span>刚刚</span>
  117. </div>
  118. </div>
  119. <div class="detail-body jieda-body">
  120. <p>蓝瘦</p>
  121. </div>
  122. <div class="jieda-reply">
  123. <span class="jieda-zan" type="zan"><i class="iconfont icon-zan"></i><em>0</em> </span>
  124. <div class="jieda-admin">
  125. <span type="del"><a href="#" class="layui-btn layui-btn-danger layui-btn-small">删除</a></span> <span class="jieda-accept" type="accept"> <a href="#" class="layui-btn layui-btn-small">采纳</a></span>
  126. </div>
  127. </div></li>
  128.  
  129. <!-- <li class="fly-none">没有任何回答</li> -->
  130. </ul>
  131. <span id="toName">@ 压缩(楼主)</span>
  132. <div class="layui-form layui-form-pane">
  133. <form action="">
  134. <div class="layui-form-item layui-form-text">
  135. <div class="layui-input-block">
  136. <textarea id="L_content" name="content" required lay-verify="required" placeholder="我要回答" class="layui-textarea fly-editor" style="height: 150px;"></textarea>
  137. </div>
  138. </div>
  139. <div class="layui-form-item">
  140. <button class="layui-btn" lay-filter="*" lay-submit>提交回答</button>
  141. </div>
  142. </form>
  143. </div>
  144. </div>
  145. </div>
  146. </div>
  147.  
  148. <div class="edge">
  149. <dl class="fly-panel fly-list-one">
  150. <dt class="fly-panel-title">最近热帖</dt>
  151. <dd>
  152. <a href="">使用 layui 秒搭后台大布局(基本结构)</a> <span><i class="iconfont"></i> 6087</span>
  153. </dd>
  154. <dd>
  155. <a href="">Java实现LayIM后端的核心代码</a> <span><i class="iconfont"></i> 767</span>
  156. </dd>
  157. <dd>
  158. <a href="">使用 layui 秒搭后台大布局(基本结构)</a> <span><i class="iconfont"></i> 6087</span>
  159. </dd>
  160. <dd>
  161. <a href="">Java实现LayIM后端的核心代码</a> <span><i class="iconfont"></i> 767</span>
  162. </dd>
  163. <dd>
  164. <a href="">使用 layui 秒搭后台大布局(基本结构)</a> <span><i class="iconfont"></i> 6087</span>
  165. </dd>
  166. <dd>
  167. <a href="">Java实现LayIM后端的核心代码</a> <span><i class="iconfont"></i> 767</span>
  168. </dd>
  169. <dd>
  170. <a href="">使用 layui 秒搭后台大布局(基本结构)</a> <span><i class="iconfont"></i> 6087</span>
  171. </dd>
  172. <dd>
  173. <a href="">Java实现LayIM后端的核心代码</a> <span><i class="iconfont"></i> 767</span>
  174. </dd>
  175. </dl>
  176.  
  177. <dl class="fly-panel fly-list-one">
  178. <dt class="fly-panel-title">近期热议</dt>
  179. <dd>
  180. <a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i class="iconfont"></i> 96</span>
  181. </dd>
  182. <dd>
  183. <a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i class="iconfont"></i> 96</span>
  184. </dd>
  185. <dd>
  186. <a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i class="iconfont"></i> 96</span>
  187. </dd>
  188. <dd>
  189. <a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i class="iconfont"></i> 96</span>
  190. </dd>
  191. <dd>
  192. <a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i class="iconfont"></i> 96</span>
  193. </dd>
  194. <dd>
  195. <a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i class="iconfont"></i> 96</span>
  196. </dd>
  197. <dd>
  198. <a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i class="iconfont"></i> 96</span>
  199. </dd>
  200. <dd>
  201. <a href="">使用 layui 秒搭后台大布局之基本结构</a> <span><i class="iconfont"></i> 96</span>
  202. </dd>
  203. </dl>
  204. </div>
  205. </div>
  206. <script type="text/javascript" charset="utf-8" src="res/js/kindeditor.js"></script>
  207. <script type="text/javascript">
  208. KE.show({
  209. id : 'L_content',
  210. resizeMode : 1,
  211. items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
  212. 'italic', 'underline', 'removeformat', 'justifyleft',
  213. 'justifycenter', 'justifyright', 'insertorderedlist',
  214. 'insertunorderedlist', 'emoticons', 'image', 'link' ]
  215. });
  216. </script>
  217. </body>
  218. </html>

detail.jsp

  当浏览一个帖子时,帖子的浏览数目需要+1  (数据库中glanceover+1)

  Service层中findAllPasteByIdReturnPaste()编写传送数据到Dao层修改数据库中glanceover语句

  1. public Paste findAllPasteByIdReturnPaste(String pasteid) {
  2.  
  3. pasteDao.addPasteGlanceover(pasteid);
  4. //SQL语句写法:update paste set glanceover = glanceover+1 where id = ?;
  5.  
  6. return pasteDao.findPasteByIdReturnPaste(pasteid);
  7. }

  帖子回复glanceover+1

  1. public void addPasteGlanceover(String pasteid) {
  2. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  3. String sql = "update paste set glanceover = glanceover+1 where id = ?";
  4. NativeQuery query = session.createSQLQuery(sql);
  5. query.setParameter(1, pasteid);
  6. query.executeUpdate();
  7. }

  1. package com.Gary.service;
  2.  
  3. import java.util.List;
  4.  
  5. import com.Gary.dao.PasteDao;
  6. import com.Gary.domain.Paste;
  7. import com.Gary.utils.PageBean;
  8.  
  9. public class PasteService {
  10.  
  11. private PasteDao pasteDao;
  12.  
  13. public Paste findAllPasteByIdReturnPaste(String pasteid) {
  14.  
  15. pasteDao.addPasteGlanceover(pasteid);
  16. //SQL语句写法:update paste set glanceover = glanceover+1 where id = ?;
  17.  
  18. return pasteDao.findPasteByIdReturnPaste(pasteid);
  19. }
  20.  
  21. public PageBean getGlanceoverPageBean(Integer currentPage) {
  22. Integer totalCount = pasteDao.findAllPasteNum();
  23. PageBean glanceoverPageBean = new PageBean(currentPage, totalCount, 8);
  24. List<Paste> list = pasteDao.getGlanceoverPageList();
  25. glanceoverPageBean.setList(list);
  26.  
  27. return glanceoverPageBean;
  28. }
  29.  
  30. public PageBean getPastePageBean(Integer currentPage) {
  31.  
  32. Integer totalCount = pasteDao.findAllPasteNum();
  33. PageBean pageBean = new PageBean(currentPage,totalCount,8);
  34. List<Paste> list = pasteDao.getPastePageList(pageBean.getStart(),pageBean.getPageSize());
  35. pageBean.setList(list);
  36.  
  37. return pageBean;
  38. }
  39.  
  40. public PasteDao getPasteDao() {
  41. return pasteDao;
  42. }
  43.  
  44. public List<Paste> findAllPaste() {
  45.  
  46. return pasteDao.findAllPaste();
  47.  
  48. }
  49.  
  50. public void setPasteDao(PasteDao pasteDao) {
  51. this.pasteDao = pasteDao;
  52. }
  53.  
  54. public void addPaste(Paste paste) {
  55.  
  56. pasteDao.addPaste(paste);
  57.  
  58. }
  59.  
  60. public PageBean getAnsnumPageBean(Integer currentPage) {
  61. //获得所有的帖子数目
  62. Integer totalCount = pasteDao.findAllPasteNum();
  63. //创建PageBean
  64. PageBean ansnumPageBean = new PageBean(currentPage, totalCount, 8);
  65. //得到List
  66. List<Paste> list = pasteDao.getAnsnumPageList();
  67. //封装List
  68. ansnumPageBean.setList(list);
  69. return ansnumPageBean;
  70. }
  71.  
  72. }

PasteService.java

  1. package com.Gary.dao;
  2.  
  3. import java.math.BigInteger;
  4. import java.util.List;
  5.  
  6. import org.hibernate.Session;
  7. import org.hibernate.query.NativeQuery;
  8. import org.hibernate.query.Query;
  9. import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
  10.  
  11. import com.Gary.domain.Paste;
  12.  
  13. public class PasteDao extends HibernateDaoSupport{
  14.  
  15. public void addPaste(Paste paste) {
  16.  
  17. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  18. session.save(paste);
  19. }
  20.  
  21. //HQL
  22. public List<Paste> findAllPaste() {
  23.  
  24. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  25.  
  26. //书写SQL语句
  27. String hql = "from com.Gary.domain.Paste";
  28. Query query = session.createQuery(hql);
  29.  
  30. List<Paste> list = query.list();
  31.  
  32. return list;
  33. }
  34.  
  35. //查找所有帖子的数量
  36. public Integer findAllPasteNum() {
  37. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  38. String sql = "select count(*) from paste";
  39. NativeQuery query = session.createSQLQuery(sql);
  40. BigInteger result = (BigInteger)query.uniqueResult();
  41.  
  42. return result.intValue();
  43. }
  44.  
  45. //分页
  46. public List<Paste> getPastePageList(Integer start, Integer pageSize) {
  47. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  48. String sql = "select * from paste limit ?,?";
  49. NativeQuery query = session.createSQLQuery(sql);
  50. query.addEntity(Paste.class);
  51. query.setParameter(1, start);
  52. query.setParameter(2, pageSize);
  53. List<Paste> list = query.list();
  54.  
  55. return list;
  56. }
  57.  
  58. //最近热议
  59. public List<Paste> getGlanceoverPageList() {
  60. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  61. String sql = "select * from paste order by glanceover desc limit 0,8";
  62. NativeQuery query = session.createSQLQuery(sql);
  63. query.addEntity(Paste.class);
  64. List list = query.list();
  65. return list;
  66. }
  67.  
  68. public List<Paste> getAnsnumPageList() {
  69. //得到与当前线程绑定的session
  70. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  71. //书写sql
  72. String sql = "select * from paste order by ansnum desc limit 0,8";
  73. //获得query
  74. NativeQuery query = session.createSQLQuery(sql);
  75. //将结果集封装为Paste对象
  76. query.addEntity(Paste.class);
  77. //获得sql的执行结果(结果为list)
  78. List list = query.list();
  79. return list;
  80. }
  81.  
  82. //查看帖子
  83. public Paste findPasteByIdReturnPaste(String pasteid) {
  84. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  85. String sql = "select * from paste where id = ?";
  86. NativeQuery query = session.createSQLQuery(sql);
  87. query.addEntity(Paste.class);
  88. query.setParameter(1, pasteid);
  89. Paste result = (Paste) query.uniqueResult();
  90. return result;
  91. }
  92.  
  93. //帖子回复glanceover+1
  94. public void addPasteGlanceover(String pasteid) {
  95. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  96. String sql = "update paste set glanceover = glanceover+1 where id = ?";
  97. NativeQuery query = session.createSQLQuery(sql);
  98. query.setParameter(1, pasteid);
  99. query.executeUpdate();
  100. }
  101.  
  102. }

PasteDao.java

  为了尽可能少的访问数据,利用数据持久状态

  1. public Paste findPasteByIdReturnPaste(String pasteid) {
  2.  
  3. //pasteDao.addPasteGlanceover(pasteid);
  4. //数据库SQL语句:update paste set glanceover = glanceover+1 where id = ?;
  5. Paste paste = pasteDao.findPasteByIdReturnPaste(pasteid);
  6. paste.setGlanceover(paste.getGlanceover()+1);
  7. return paste;
  8. }

  编写帖子模块最近热帖和最近热议

  帖子模块的最近热帖和最近热议应该动态从数据库中获取

  PasteAction.java

  1. //查看帖子详细信息
  2. public String getDetail() throws Exception{
  3.  
  4. //得到最近热帖
  5. PageBean glanceoverPageBean = pasteService.getGlanceoverPageBean(null);
  6. ActionContext.getContext().put("glanceoverPageBean", glanceoverPageBean);
  7.  
  8. //得到最近热议
  9. PageBean ansnumPageBean = pasteService.getAnsnumPageBean(null);
  10. ActionContext.getContext().put("ansnumPageBean", ansnumPageBean);
  11.  
  12. Paste paste = pasteService.findPasteByIdReturnPaste(pasteid);
  13. ActionContext.getContext().put("paste", paste);
  14.  
  15. return "detail";
  16. }

  修改detail.jsp

  1. <div class="edge">
  2. <dl class="fly-panel fly-list-one">
  3. <dt class="fly-panel-title">最近热帖</dt>
  4. <s:iterator value="#glanceoverPageBean.list" var="paste">
  5. <dd>
  6.  
  7. <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>">
  8. <s:property value="#paste.title" />
  9. </a>
  10. <span>
  11. <i class="iconfont"></i>
  12. <s:property value="#paste.glanceover" />
  13. </span>
  14. </dd>
  15. </s:iterator>
  16. </dl>
  17.  
  18. <dl class="fly-panel fly-list-one">
  19. <dt class="fly-panel-title">近期热议</dt>
  20. <s:iterator value="#ansnumPageBean.list" var="paste">
  21. <dd>
  22. <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>">
  23. <s:property value="#paste.title" />
  24. </a>
  25. <span>
  26. <i class="iconfont"></i>
  27. <s:property value="#paste.ansnum" />
  28. </span>
  29. </dd>
  30. </s:iterator>
  31. </dl>

  Web层

  1. package com.Gary.web;
  2.  
  3. import java.util.List;
  4.  
  5. import com.Gary.domain.Paste;
  6. import com.Gary.service.PasteService;
  7. import com.Gary.service.UserService;
  8. import com.Gary.utils.PageBean;
  9. import com.opensymphony.xwork2.ActionContext;
  10. import com.opensymphony.xwork2.ActionSupport;
  11.  
  12. public class GetDataAction extends ActionSupport{
  13.  
  14. private PasteService pasteService;
  15. private UserService userService;
  16. public UserService getUserService() {
  17. return userService;
  18. }
  19.  
  20. public void setUserService(UserService userService) {
  21. this.userService = userService;
  22. }
  23.  
  24. private Integer currentPage;
  25.  
  26. public String getData() throws Exception {
  27.  
  28. //得到帖子
  29. PageBean pastePageBean = pasteService.getPastePageBean(currentPage);
  30. ActionContext.getContext().put("pastePageBean", pastePageBean);
  31.  
  32. //得到最近热帖
  33. PageBean glanceoverPageBean = pasteService.getGlanceoverPageBean(currentPage);
  34. ActionContext.getContext().put("glanceoverPageBean", glanceoverPageBean);
  35.  
  36. //得到最近热议
  37. PageBean ansnumPageBean = pasteService.getAnsnumPageBean(currentPage);
  38. ActionContext.getContext().put("ansnumPageBean", ansnumPageBean);
  39.  
  40. //得到专家排行
  41. PageBean userPageBean = userService.getUserPageBean(currentPage);
  42. ActionContext.getContext().put("userPageBean", userPageBean);
  43.  
  44. return "index";
  45. }
  46.  
  47. public PasteService getPasteService() {
  48. return pasteService;
  49. }
  50.  
  51. public void setPasteService(PasteService pasteService) {
  52. this.pasteService = pasteService;
  53. }
  54.  
  55. public Integer getCurrentPage() {
  56. return currentPage;
  57. }
  58.  
  59. public void setCurrentPage(Integer currentPage) {
  60. this.currentPage = currentPage;
  61. }
  62. }

GetDataAction.java

  1. package com.Gary.web;
  2.  
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5.  
  6. import com.Gary.domain.Paste;
  7. import com.Gary.domain.User;
  8. import com.Gary.service.PasteService;
  9. import com.Gary.utils.PageBean;
  10. import com.opensymphony.xwork2.ActionContext;
  11. import com.opensymphony.xwork2.ActionSupport;
  12. import com.opensymphony.xwork2.ModelDriven;
  13.  
  14. public class PasteAction extends ActionSupport implements ModelDriven<Paste> {
  15.  
  16. public Paste paste = new Paste();
  17. private PasteService pasteService;
  18. private String pasteid;
  19.  
  20. //查看帖子详细信息
  21. public String getDetail() throws Exception{
  22.  
  23. //得到最近热帖
  24. PageBean glanceoverPageBean = pasteService.getGlanceoverPageBean(null);
  25. ActionContext.getContext().put("glanceoverPageBean", glanceoverPageBean);
  26.  
  27. //得到最近热议
  28. PageBean ansnumPageBean = pasteService.getAnsnumPageBean(null);
  29. ActionContext.getContext().put("ansnumPageBean", ansnumPageBean);
  30.  
  31. Paste paste = pasteService.findPasteByIdReturnPaste(pasteid);
  32. ActionContext.getContext().put("paste", paste);
  33.  
  34. return "detail";
  35. }
  36.  
  37. //添加帖子
  38. public String addPaste() throws Exception {
  39. User user = (User)ActionContext.getContext().getSession().get("user");
  40.  
  41. if(user==null)
  42. {
  43. ActionContext.getContext().put("error", "只有登陆之后才可以发帖子!!");
  44. return "error";
  45. }
  46.  
  47. //private Integer ansnum;
  48. paste.setAnsnum(0);
  49. //private String createtime;
  50. Date date = new Date(System.currentTimeMillis());
  51. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
  52. String createtime = format.format(date);
  53. paste.setCreatetime(createtime);
  54. //private Integer glanceover;
  55. paste.setGlanceover(0);
  56. //是否结帖 0未结 1结束
  57. //private Integer solve;
  58. paste.setSolve(0);
  59. //private Integer isdelete;
  60. paste.setIsdelete(0);
  61. //private User user;
  62.  
  63. paste.setUser(user);
  64.  
  65. pasteService.addPaste(paste);
  66.  
  67. //重定向到主页
  68. return "toIndex";
  69. }
  70.  
  71. public PasteService getPasteService() {
  72. return pasteService;
  73. }
  74.  
  75. public void setPasteService(PasteService pasteService) {
  76. this.pasteService = pasteService;
  77. }
  78.  
  79. @Override
  80. public Paste getModel() {
  81. // TODO Auto-generated method stub
  82. return paste;
  83. }
  84.  
  85. public String getPasteid() {
  86. return pasteid;
  87. }
  88.  
  89. public void setPasteid(String pasteid) {
  90. this.pasteid = pasteid;
  91. }
  92.  
  93. }

PasteAction.java

  前端页面

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <%@ taglib uri="/struts-tags" prefix="s"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta charset="utf-8">
  7. <title>问题详情</title>
  8. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  9. <meta name="keywords" content="fly,layui,前端社区">
  10. <meta name="description" content="">
  11. <link rel="stylesheet" href="res/layui/css/layui.css">
  12. <link rel="stylesheet" href="res/css/global.css">
  13. <script src="res/layui/layui.js"></script>
  14. <script src="js/jquery.js"></script>
  15. <style type="text/css" rel="stylesheet">
  16. form {
  17. margin: 0;
  18. }
  19.  
  20. .editor {
  21. margin-top: 5px;
  22. margin-bottom: 5px;
  23. }
  24. </style>
  25.  
  26. </head>
  27. <body style="margin: -2px">
  28. <iframe src="head.jsp" scrolling="no" width="100%" height="110px"></iframe>
  29. <div class="main layui-clear">
  30. <div class="wrap">
  31. <div class="content detail">
  32. <div class="fly-panel detail-box">
  33.  
  34. <h1>
  35. <s:property value="#paste.title" />
  36. </h1>
  37. <div class="fly-tip fly-detail-hint" data-id="">
  38. <span class="fly-tip-stick">置顶帖</span>
  39. <span class="jie-admin">
  40. <a href="">点击置顶</a>
  41. </span>
  42. <span class="layui-btn layui-btn-mini jie-admin">
  43. <a href="">取消置顶</a>
  44. </span>
  45. <span class="jie-admin" type="del" style="margin-left: 20px;">
  46. <a>删除该帖</a>
  47. </span>
  48. </span>
  49. <div class="fly-list-hint">
  50. <i class="iconfont" title="回答"></i>
  51. <s:property value="#paste.ansnum" />
  52. </div>
  53. </div>
  54. <div class="detail-about">
  55. <a class="jie-user" href="">
  56.  
  57. <img src="${pageContext.request.contextPath }/<s:property value="#paste.user.image"/>" alt="头像">
  58. <cite>
  59. <s:property value="#paste.user.username" />
  60. <em>
  61. <s:property value="#paste.createtime" />
  62. 发布
  63. </em>
  64. </cite>
  65. </a>
  66. <div class="detail-hits" data-id="{{rows.id}}">
  67. <span class="layui-btn layui-btn-mini jie-admin">
  68. <a href="#">已完帖,无法编辑</a>
  69. </span>
  70. <span class="layui-btn layui-btn-mini jie-admin" type="collect" data-type="add">
  71. <a id="collectPost">收藏</a>
  72. </span>
  73. <span class="layui-btn layui-btn-mini jie-admin layui-btn-danger" type="collect" data-type="add">
  74. <a>取消收藏</a>
  75. </span>
  76.  
  77. </div>
  78. </div>
  79. <div class="detail-body photos" style="margin-bottom: 20px;">
  80. <p>
  81. <s:property value="#paste.content" />
  82. </p>
  83. </div>
  84. </div>
  85.  
  86. <div class="fly-panel detail-box" style="padding-top: 0;">
  87. <a name="comment"></a>
  88. <ul class="jieda photos" id="jieda">
  89. <li data-id="12" class="jieda-daan"><a name="item-121212121212"></a>
  90. <div class="detail-about detail-about-reply">
  91. <a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>纸飞机</i> <!-- <em>(楼主)</em>
  92. <em style="color:#5FB878">(管理员)</em> -->
  93. </cite>
  94. </a>
  95. <div class="detail-hits">
  96. <span>3分钟前</span>
  97. </div>
  98. <i class="iconfont icon-caina" title="最佳答案"></i>
  99. </div>
  100. <div class="detail-body jieda-body">
  101. <p>么么哒</p>
  102. </div>
  103. <div class="jieda-reply">
  104. <span class="jieda-zan zanok" type="zan"><i class="iconfont icon-zan"></i><em>12</em> </span>
  105. <!-- <div class="jieda-admin">
  106. <span type="del">删除</span>
  107. <span class="jieda-accept" type="accept">采纳</span>
  108. </div> -->
  109. </div></li>
  110. <li data-id="13"><a name="item-121212121212"></a>
  111. <div class="detail-about detail-about-reply">
  112. <a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>香菇</i> <em style="color: #FF9E3F">活雷锋</em>
  113. </cite>
  114. </a>
  115. <div class="detail-hits">
  116. <span>刚刚</span>
  117. </div>
  118. </div>
  119. <div class="detail-body jieda-body">
  120. <p>蓝瘦</p>
  121. </div>
  122. <div class="jieda-reply">
  123. <span class="jieda-zan" type="zan"><i class="iconfont icon-zan"></i><em>0</em> </span>
  124. <div class="jieda-admin">
  125. <span type="del"><a href="#" class="layui-btn layui-btn-danger layui-btn-small">删除</a></span> <span class="jieda-accept" type="accept"> <a href="#" class="layui-btn layui-btn-small">采纳</a></span>
  126. </div>
  127. </div></li>
  128.  
  129. <!-- <li class="fly-none">没有任何回答</li> -->
  130. </ul>
  131. <span id="toName">@ 压缩(楼主)</span>
  132. <div class="layui-form layui-form-pane">
  133. <form action="">
  134. <div class="layui-form-item layui-form-text">
  135. <div class="layui-input-block">
  136. <textarea id="L_content" name="content" required lay-verify="required" placeholder="我要回答" class="layui-textarea fly-editor" style="height: 150px;"></textarea>
  137. </div>
  138. </div>
  139. <div class="layui-form-item">
  140. <button class="layui-btn" lay-filter="*" lay-submit>提交回答</button>
  141. </div>
  142. </form>
  143. </div>
  144. </div>
  145. </div>
  146. </div>
  147.  
  148. <div class="edge">
  149. <dl class="fly-panel fly-list-one">
  150. <dt class="fly-panel-title">最近热帖</dt>
  151. <s:iterator value="#glanceoverPageBean.list" var="paste">
  152. <dd>
  153.  
  154. <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>">
  155. <s:property value="#paste.title" />
  156. </a>
  157. <span>
  158. <i class="iconfont"></i>
  159. <s:property value="#paste.glanceover" />
  160. </span>
  161. </dd>
  162. </s:iterator>
  163. </dl>
  164.  
  165. <dl class="fly-panel fly-list-one">
  166. <dt class="fly-panel-title">近期热议</dt>
  167. <s:iterator value="#ansnumPageBean.list" var="paste">
  168. <dd>
  169. <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>">
  170. <s:property value="#paste.title" />
  171. </a>
  172. <span>
  173. <i class="iconfont"></i>
  174. <s:property value="#paste.ansnum" />
  175. </span>
  176. </dd>
  177. </s:iterator>
  178. </dl>
  179. </div>
  180. </div>
  181.  
  182. <script type="text/javascript" charset="utf-8" src="res/js/kindeditor.js"></script>
  183. <script type="text/javascript">
  184. KE.show({
  185. id : 'L_content',
  186. resizeMode : 1,
  187. items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
  188. 'italic', 'underline', 'removeformat', 'justifyleft',
  189. 'justifycenter', 'justifyright', 'insertorderedlist',
  190. 'insertunorderedlist', 'emoticons', 'image', 'link' ]
  191. });
  192. </script>
  193. </body>
  194. </html>

detail.jsp

分析回复帖子模块

  创建回复帖子Action骨架

  1. public class AnswerAction extends ActionSupport implements ModelDriven<Answer>{
  2.  
  3. public Answer answer = new Answer();
  4. private AnswerService answerService;
  5.  
  6. public String addAnswer() throws Exception {
  7.  
  8. answerService.addAnswer(answer);
  9.  
  10. return "success";
  11. }
  12.  
  13. public Answer getModel() {
  14.  
  15. return answer;
  16. }
  17.  
  18. }

  完成Answer实体

  1. private String id;
  2. //内容
  3. private String content;
  4. //回复时间
  5. private String anstime;
  6. //同意数
  7. private Integer agree;
  8. //是否解决
  9. private Integer solve;
  10.  
  11. private User user;
  12.  
  13. private Paste paste;
  14.  
  15. //登录的用户是否点赞了改回复
  16. private Integer loginUserIsAgree;
  1. package com.Gary.domain;
  2.  
  3. public class Answer {
  4.  
  5. private String id;
  6. //内容
  7. private String content;
  8. //回复时间
  9. private String anstime;
  10. //同意数
  11. private Integer agree;
  12. //是否解决
  13. private Integer solve;
  14.  
  15. private User user;
  16.  
  17. private Paste paste;
  18.  
  19. //登录的用户是否点赞了改回复
  20. private Integer loginUserIsAgree;
  21.  
  22. public String getId() {
  23. return id;
  24. }
  25. public void setId(String id) {
  26. this.id = id;
  27. }
  28. public String getContent() {
  29. return content;
  30. }
  31. public void setContent(String content) {
  32. this.content = content.replaceAll("<br />", ".");;
  33. }
  34. public String getAnstime() {
  35. return anstime;
  36. }
  37. public void setAnstime(String anstime) {
  38. this.anstime = anstime;
  39. }
  40. public Integer getAgree() {
  41. return agree;
  42. }
  43. public void setAgree(Integer agree) {
  44. this.agree = agree;
  45. }
  46. public Integer getSolve() {
  47. return solve;
  48. }
  49. public void setSolve(Integer solve) {
  50. this.solve = solve;
  51. }
  52. public User getUser() {
  53. return user;
  54. }
  55. public void setUser(User user) {
  56. this.user = user;
  57. }
  58. public Paste getPaste() {
  59. return paste;
  60. }
  61. public void setPaste(Paste paste) {
  62. this.paste = paste;
  63. }
  64. public Integer getLoginUserIsAgree() {
  65. return loginUserIsAgree;
  66. }
  67. public void setLoginUserIsAgree(Integer loginUserIsAgree) {
  68. this.loginUserIsAgree = loginUserIsAgree;
  69. }
  70.  
  71. }

Answer.java

  Web层

  1. package com.Gary.web;
  2.  
  3. import com.Gary.domain.Answer;
  4. import com.Gary.service.AnswerService;
  5. import com.opensymphony.xwork2.ActionSupport;
  6. import com.opensymphony.xwork2.ModelDriven;
  7.  
  8. public class AnswerAction extends ActionSupport implements ModelDriven<Answer>{
  9.  
  10. public Answer answer = new Answer();
  11. private AnswerService answerService;
  12.  
  13. public String addAnswer() throws Exception {
  14.  
  15. answerService.addAnswer(answer);
  16.  
  17. return "success";
  18. }
  19.  
  20. public Answer getModel() {
  21.  
  22. return answer;
  23. }
  24.  
  25. }

AnswerAction.java

  Service层

  1. package com.Gary.service;
  2.  
  3. import com.Gary.dao.AnswerDao;
  4. import com.Gary.domain.Answer;
  5.  
  6. public class AnswerService {
  7.  
  8. private AnswerDao answerDao;
  9.  
  10. public AnswerDao getAnswerDao() {
  11. return answerDao;
  12. }
  13.  
  14. public void setAnswerDao(AnswerDao answerDao) {
  15. this.answerDao = answerDao;
  16. }
  17.  
  18. public void addAnswer(Answer answer) {
  19. // TODO Auto-generated method stub
  20. answerDao.addAnswer(answer);
  21. }
  22.  
  23. }

AnswerService.java

  Dao层

  1. package com.Gary.dao;
  2.  
  3. import org.hibernate.Session;
  4. import org.hibernate.query.NativeQuery;
  5. import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
  6.  
  7. import com.Gary.domain.Answer;
  8.  
  9. public class AnswerDao extends HibernateDaoSupport{
  10.  
  11. public void addAnswer(Answer answer) {
  12. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  13. session.save(answer);
  14. }
  15.  
  16. }

AnswerDao.java

  User.java用户模块中添加一个用户回复Set<Paste> answerPasteSet

  1. //用户回复
  2. private Set<Paste> answerPasteSet = new HashSet<Paste>();
  3.  
  4. public Set<Paste> getAnswerPasteSet() {
  5. return answerPasteSet;
  6. }
  7. public void setAnswerPasteSet(Set<Paste> answerPasteSet) {
  8. this.answerPasteSet = answerPasteSet;
  9. }

  在User.hbm.xml中添加一对多的关系

  1. <set name="answerPasteSet">
  2. <key column="pasteid"></key>
  3. <one-to-many class="Answer"/>
  4. </set>

  分析用户帖子一对多的关系

  在Paste.java中添加HashSet<User>用户回复

  1. private Set<User> userAnswerSet = new HashSet<User>();
  2.  
  3. public Set<User> getUserAnswerSet() {
  4. return userAnswerSet;
  5. }
  6. public void setUserAnswerSet(Set<User> userAnswerSet) {
  7. this.userAnswerSet = userAnswerSet;
  8. }

  Paste.hbm.xml中绑定用户与表一对多的关系

  1. <set name="userAnswerSet">
  2. <!-- 外键的类名 -->
  3. <key column="userid"></key>
  4. <!-- 外键的类名的类 -->
  5. <one-to-many class="Answer"/>
  6. </set>

  

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5.  
  6. <hibernate-mapping package="com.Gary.domain">
  7.  
  8. <class name="Answer" table="answer">
  9. <id name="id">
  10. <generator class="uuid"></generator>
  11. </id>
  12.  
  13. <property name="content" column="content"></property>
  14. <property name="anstime" column="anstime"></property>
  15. <property name="agree" column="agree"></property>
  16. <property name="solve" column="solve"></property>
  17.  
  18. <many-to-one name="user" column="userid" class="User"></many-to-one>
  19. <!-- colum为外键的字段名字 -->
  20. <many-to-one name="paste" column="pasteid" class="Paste"></many-to-one>
  21.  
  22. </class>
  23. </hibernate-mapping>

Answer.hbm.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5.  
  6. <hibernate-mapping package="com.Gary.domain">
  7. <class name="Paste" table="paste">
  8. <id name="id">
  9. <generator class="uuid"></generator>
  10. </id>
  11.  
  12. <!--private String title;
  13. private String content;
  14. private Integer offer;
  15. private Integer ansnum;
  16. private String createtime;
  17. private Integer glanceover;
  18. //是否结帖
  19. private Integer solve;
  20. private Integer isdelete;-->
  21.  
  22. <property name="title" column="title"></property>
  23. <property name="content" column="content"></property>
  24. <property name="offer" column="offer"></property>
  25. <property name="ansnum" column="ansnum"></property>
  26. <property name="createtime" column="createtime"></property>
  27. <property name="glanceover" column="glanceover"></property>
  28. <property name="solve" column="solve"></property>
  29. <property name="isdelete" column="isdelete"></property>
  30.  
  31. <many-to-one name="user" class="User" column="userid" insert="true"></many-to-one>
  32.  
  33. <set name="userAnswerSet">
  34. <!-- 外键的类名 -->
  35. <key column="userid"></key>
  36. <!-- 外键的类名的类 -->
  37. <one-to-many class="Answer"/>
  38. </set>
  39.  
  40. </class>
  41. </hibernate-mapping>

Paste.hbm.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5.  
  6. <hibernate-mapping package="com.Gary.domain">
  7.  
  8. <class name="Answer" table="answer">
  9. <id name="id">
  10. <generator class="uuid"></generator>
  11. </id>
  12.  
  13. <property name="content" column="content"></property>
  14. <property name="anstime" column="anstime"></property>
  15. <property name="agree" column="agree"></property>
  16. <property name="solve" column="solve"></property>
  17.  
  18. <many-to-one name="user" column="userid" class="User"></many-to-one>
  19. <!-- colum为外键的字段名字 -->
  20. <many-to-one name="paste" column="pasteid" class="Paste"></many-to-one>
  21.  
  22. </class>
  23. </hibernate-mapping>

Answer.hbm.xml

  此时点击提交回答按钮后表单无法发送问题!!!

  修改detail中的表单

  1. <div class="layui-form layui-form-pane">
  2. <!-- <form action="${pageContext.request.contextPath }/AnswerAction_addAnswer">
  3. <input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
  4. <div class="layui-form-item layui-form-text">
  5. <div class="layui-input-block">
  6. <textarea id="L_content" name="content" required lay-verify="required" placeholder="我要回答" class="layui-textarea fly-editor" style="height: 150px;"></textarea>
  7. </div>
  8. </div>
  9. <div class="layui-form-item">
  10. <button class="layui-btn" lay-filter="*" lay-submit>提交回答</button>
  11. </div>
  12. </form> -->
  13. <form action="${pageContext.request.contextPath}/AnswerAction_addAnswer">
  14. <input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
  15. <div class="layui-form-item layui-form-text">
  16. <div class="layui-input-block">
  17. <div class="editor">
  18. <textarea id="content" name="content" style="width: 690px; height: 300px; visibility: hidden;"></textarea>
  19. </div>
  20. </div>
  21.  
  22. </div>
  23.  
  24. <div class="layui-form-item">
  25. <button class="layui-btn" lay-filter="*" lay-submit>立即发布</button>
  26. </div>
  27. </form>
  28. </div>

  可以看到,修改完表单后,在未登录的轻快下,点击提交回答按钮后页面会自动跳转到登陆页面

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <%@ taglib uri="/struts-tags" prefix="s"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta charset="utf-8">
  7. <title>问题详情</title>
  8. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  9. <meta name="keywords" content="fly,layui,前端社区">
  10. <meta name="description" content="">
  11. <link rel="stylesheet" href="res/layui/css/layui.css">
  12. <link rel="stylesheet" href="res/css/global.css">
  13. <script src="res/layui/layui.js"></script>
  14. <script src="js/jquery.js"></script>
  15. <style type="text/css" rel="stylesheet">
  16. form {
  17. margin: 0;
  18. }
  19.  
  20. .editor {
  21. margin-top: 5px;
  22. margin-bottom: 5px;
  23. }
  24. </style>
  25.  
  26. </head>
  27. <body style="margin: -2px">
  28. <iframe src="head.jsp" scrolling="no" width="100%" height="110px"></iframe>
  29. <div class="main layui-clear">
  30. <div class="wrap">
  31. <div class="content detail">
  32. <div class="fly-panel detail-box">
  33.  
  34. <h1>
  35. <s:property value="#paste.title" />
  36. </h1>
  37. <div class="fly-tip fly-detail-hint" data-id="">
  38. <span class="fly-tip-stick">置顶帖</span> <span class="jie-admin"> <a href="">点击置顶</a>
  39. </span> <span class="layui-btn layui-btn-mini jie-admin"> <a href="">取消置顶</a>
  40. </span> <span class="jie-admin" type="del" style="margin-left: 20px;"> <a>删除该帖</a>
  41. </span> </span>
  42. <div class="fly-list-hint">
  43. <i class="iconfont" title="回答"></i>
  44. <s:property value="#paste.ansnum" />
  45. </div>
  46. </div>
  47. <div class="detail-about">
  48. <a class="jie-user" href=""> <img src="${pageContext.request.contextPath }/<s:property value="#paste.user.image"/>" alt="头像"> <cite> <s:property value="#paste.user.username" /> <em> <s:property value="#paste.createtime" /> 发布
  49. </em>
  50. </cite>
  51. </a>
  52. <div class="detail-hits" data-id="{{rows.id}}">
  53. <span class="layui-btn layui-btn-mini jie-admin"> <a href="#">已完帖,无法编辑</a>
  54. </span> <span class="layui-btn layui-btn-mini jie-admin" type="collect" data-type="add"> <a id="collectPost">收藏</a>
  55. </span> <span class="layui-btn layui-btn-mini jie-admin layui-btn-danger" type="collect" data-type="add"> <a>取消收藏</a>
  56. </span>
  57.  
  58. </div>
  59. </div>
  60. <div class="detail-body photos" style="margin-bottom: 20px;">
  61. <p>
  62. <s:property value="#paste.content" />
  63. </p>
  64. </div>
  65. </div>
  66.  
  67. <div class="fly-panel detail-box" style="padding-top: 0;">
  68. <a name="comment"></a>
  69. <ul class="jieda photos" id="jieda">
  70. <li data-id="12" class="jieda-daan"><a name="item-121212121212"></a>
  71. <div class="detail-about detail-about-reply">
  72. <a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>纸飞机</i> <!-- <em>(楼主)</em>
  73. <em style="color:#5FB878">(管理员)</em> -->
  74. </cite>
  75. </a>
  76. <div class="detail-hits">
  77. <span>3分钟前</span>
  78. </div>
  79. <i class="iconfont icon-caina" title="最佳答案"></i>
  80. </div>
  81. <div class="detail-body jieda-body">
  82. <p>么么哒</p>
  83. </div>
  84. <div class="jieda-reply">
  85. <span class="jieda-zan zanok" type="zan"><i class="iconfont icon-zan"></i><em>12</em> </span>
  86. <!-- <div class="jieda-admin">
  87. <span type="del">删除</span>
  88. <span class="jieda-accept" type="accept">采纳</span>
  89. </div> -->
  90. </div></li>
  91. <li data-id="13"><a name="item-121212121212"></a>
  92. <div class="detail-about detail-about-reply">
  93. <a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>香菇</i> <em style="color: #FF9E3F">活雷锋</em>
  94. </cite>
  95. </a>
  96. <div class="detail-hits">
  97. <span>刚刚</span>
  98. </div>
  99. </div>
  100. <div class="detail-body jieda-body">
  101. <p>蓝瘦</p>
  102. </div>
  103. <div class="jieda-reply">
  104. <span class="jieda-zan" type="zan"><i class="iconfont icon-zan"></i><em>0</em> </span>
  105. <div class="jieda-admin">
  106. <span type="del"><a href="#" class="layui-btn layui-btn-danger layui-btn-small">删除</a></span> <span class="jieda-accept" type="accept"> <a href="#" class="layui-btn layui-btn-small">采纳</a></span>
  107. </div>
  108. </div></li>
  109.  
  110. <!-- <li class="fly-none">没有任何回答</li> -->
  111. </ul>
  112. <span id="toName">@ 压缩(楼主)</span>
  113. <div class="layui-form layui-form-pane">
  114. <!-- <form action="${pageContext.request.contextPath }/AnswerAction_addAnswer">
  115. <input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
  116. <div class="layui-form-item layui-form-text">
  117. <div class="layui-input-block">
  118. <textarea id="L_content" name="content" required lay-verify="required" placeholder="我要回答" class="layui-textarea fly-editor" style="height: 150px;"></textarea>
  119. </div>
  120. </div>
  121. <div class="layui-form-item">
  122. <button class="layui-btn" lay-filter="*" lay-submit>提交回答</button>
  123. </div>
  124. </form> -->
  125. <form action="${pageContext.request.contextPath}/PasteAction_addPaste">
  126. <input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
  127. <div class="layui-form-item layui-form-text">
  128. <div class="layui-input-block">
  129. <div class="editor">
  130. <textarea id="content" name="content" style="width: 690px; height: 300px; visibility: hidden;"></textarea>
  131. </div>
  132. </div>
  133.  
  134. </div>
  135.  
  136. <div class="layui-form-item">
  137. <button class="layui-btn" lay-filter="*" lay-submit>立即发布</button>
  138. </div>
  139. </form>
  140. </div>
  141. </div>
  142. </div>
  143. </div>
  144.  
  145. <div class="edge">
  146. <dl class="fly-panel fly-list-one">
  147. <dt class="fly-panel-title">最近热帖</dt>
  148. <s:iterator value="#glanceoverPageBean.list" var="paste">
  149. <dd>
  150.  
  151. <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
  152. </a> <span> <i class="iconfont"></i> <s:property value="#paste.glanceover" />
  153. </span>
  154. </dd>
  155. </s:iterator>
  156. </dl>
  157.  
  158. <dl class="fly-panel fly-list-one">
  159. <dt class="fly-panel-title">近期热议</dt>
  160. <s:iterator value="#ansnumPageBean.list" var="paste">
  161. <dd>
  162. <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
  163. </a> <span> <i class="iconfont"></i> <s:property value="#paste.ansnum" />
  164. </span>
  165. </dd>
  166. </s:iterator>
  167. </dl>
  168. </div>
  169. </div>
  170.  
  171. <%-- <script type="text/javascript" charset="utf-8" src="res/js/kindeditor.js"></script>
  172. <script type="text/javascript">
  173. KE.show({
  174. id : 'L_content',
  175. resizeMode : 1,
  176. items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
  177. 'italic', 'underline', 'removeformat', 'justifyleft',
  178. 'justifycenter', 'justifyright', 'insertorderedlist',
  179. 'insertunorderedlist', 'emoticons', 'image', 'link' ]
  180. });
  181. </script> --%>
  182. <script type="text/javascript" charset="utf-8" src="js/kindeditor.js"></script>
  183. <script type="text/javascript">
  184. KE.show({
  185. id : 'content',
  186. resizeMode : 1,
  187. cssPath : './index.css',
  188. items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
  189. 'italic', 'underline', 'removeformat', 'justifyleft',
  190. 'justifycenter', 'justifyright', 'insertorderedlist',
  191. 'insertunorderedlist', 'emoticons', 'image', 'link' ]
  192. });
  193. </script>
  194. <script>
  195. layui.cache.page = '';
  196. layui.cache.user = {
  197. username : '游客',
  198. uid : -1,
  199. avatar : '../res/images/avatar/00.jpg',
  200. experience : 83,
  201. sex : '男'
  202. };
  203. layui.config({
  204. version : "2.0.0",
  205. base : '../res/mods/'
  206. }).extend({
  207. fly : 'index'
  208. }).use('fly');
  209. </script>
  210. </body>
  211. </html>

detail.jsp

  测试登陆用户发帖模块

  

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <%@ taglib uri="/struts-tags" prefix="s"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta charset="utf-8">
  7. <title>问题详情</title>
  8. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  9. <meta name="keywords" content="fly,layui,前端社区">
  10. <meta name="description" content="">
  11. <link rel="stylesheet" href="res/layui/css/layui.css">
  12. <link rel="stylesheet" href="res/css/global.css">
  13. <script src="res/layui/layui.js"></script>
  14. <script src="js/jquery.js"></script>
  15. <style type="text/css" rel="stylesheet">
  16. form {
  17. margin: 0;
  18. }
  19.  
  20. .editor {
  21. margin-top: 5px;
  22. margin-bottom: 5px;
  23. }
  24. </style>
  25.  
  26. </head>
  27. <body style="margin: -2px">
  28. <iframe src="head.jsp" scrolling="no" width="100%" height="110px"></iframe>
  29. <div class="main layui-clear">
  30. <div class="wrap">
  31. <div class="content detail">
  32. <div class="fly-panel detail-box">
  33.  
  34. <h1>
  35. <s:property value="#paste.title" />
  36. </h1>
  37. <div class="fly-tip fly-detail-hint" data-id="">
  38. <span class="fly-tip-stick">置顶帖</span> <span class="jie-admin"> <a href="">点击置顶</a>
  39. </span> <span class="layui-btn layui-btn-mini jie-admin"> <a href="">取消置顶</a>
  40. </span> <span class="jie-admin" type="del" style="margin-left: 20px;"> <a>删除该帖</a>
  41. </span> </span>
  42. <div class="fly-list-hint">
  43. <i class="iconfont" title="回答"></i>
  44. <s:property value="#paste.ansnum" />
  45. </div>
  46. </div>
  47. <div class="detail-about">
  48. <a class="jie-user" href=""> <img src="${pageContext.request.contextPath }/<s:property value="#paste.user.image"/>" alt="头像"> <cite> <s:property value="#paste.user.username" /> <em> <s:property value="#paste.createtime" /> 发布
  49. </em>
  50. </cite>
  51. </a>
  52. <div class="detail-hits" data-id="{{rows.id}}">
  53. <span class="layui-btn layui-btn-mini jie-admin"> <a href="#">已完帖,无法编辑</a>
  54. </span> <span class="layui-btn layui-btn-mini jie-admin" type="collect" data-type="add"> <a id="collectPost">收藏</a>
  55. </span> <span class="layui-btn layui-btn-mini jie-admin layui-btn-danger" type="collect" data-type="add"> <a>取消收藏</a>
  56. </span>
  57.  
  58. </div>
  59. </div>
  60. <div class="detail-body photos" style="margin-bottom: 20px;">
  61. <p>
  62. <s:property value="#paste.content" />
  63. </p>
  64. </div>
  65. </div>
  66.  
  67. <div class="fly-panel detail-box" style="padding-top: 0;">
  68. <a name="comment"></a>
  69. <ul class="jieda photos" id="jieda">
  70. <li data-id="12" class="jieda-daan"><a name="item-121212121212"></a>
  71. <div class="detail-about detail-about-reply">
  72. <a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>纸飞机</i> <!-- <em>(楼主)</em>
  73. <em style="color:#5FB878">(管理员)</em> -->
  74. </cite>
  75. </a>
  76. <div class="detail-hits">
  77. <span>3分钟前</span>
  78. </div>
  79. <i class="iconfont icon-caina" title="最佳答案"></i>
  80. </div>
  81. <div class="detail-body jieda-body">
  82. <p>么么哒</p>
  83. </div>
  84. <div class="jieda-reply">
  85. <span class="jieda-zan zanok" type="zan"><i class="iconfont icon-zan"></i><em>12</em> </span>
  86. <!-- <div class="jieda-admin">
  87. <span type="del">删除</span>
  88. <span class="jieda-accept" type="accept">采纳</span>
  89. </div> -->
  90. </div></li>
  91. <li data-id="13"><a name="item-121212121212"></a>
  92. <div class="detail-about detail-about-reply">
  93. <a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>香菇</i> <em style="color: #FF9E3F">活雷锋</em>
  94. </cite>
  95. </a>
  96. <div class="detail-hits">
  97. <span>刚刚</span>
  98. </div>
  99. </div>
  100. <div class="detail-body jieda-body">
  101. <p>蓝瘦</p>
  102. </div>
  103. <div class="jieda-reply">
  104. <span class="jieda-zan" type="zan"><i class="iconfont icon-zan"></i><em>0</em> </span>
  105. <div class="jieda-admin">
  106. <span type="del"><a href="#" class="layui-btn layui-btn-danger layui-btn-small">删除</a></span> <span class="jieda-accept" type="accept"> <a href="#" class="layui-btn layui-btn-small">采纳</a></span>
  107. </div>
  108. </div></li>
  109.  
  110. <!-- <li class="fly-none">没有任何回答</li> -->
  111. </ul>
  112. <span id="toName">@ 压缩(楼主)</span>
  113. <div class="layui-form layui-form-pane">
  114. <!-- <form action="${pageContext.request.contextPath }/AnswerAction_addAnswer">
  115. <input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
  116. <div class="layui-form-item layui-form-text">
  117. <div class="layui-input-block">
  118. <textarea id="L_content" name="content" required lay-verify="required" placeholder="我要回答" class="layui-textarea fly-editor" style="height: 150px;"></textarea>
  119. </div>
  120. </div>
  121. <div class="layui-form-item">
  122. <button class="layui-btn" lay-filter="*" lay-submit>提交回答</button>
  123. </div>
  124. </form> -->
  125. <form action="${pageContext.request.contextPath}/AnswerAction_addAnswer">
  126. <input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
  127. <div class="layui-form-item layui-form-text">
  128. <div class="layui-input-block">
  129. <div class="editor">
  130. <textarea id="content" name="content" style="width: 690px; height: 300px; visibility: hidden;"></textarea>
  131. </div>
  132. </div>
  133.  
  134. </div>
  135.  
  136. <div class="layui-form-item">
  137. <button class="layui-btn" lay-filter="*" lay-submit>立即发布</button>
  138. </div>
  139. </form>
  140. </div>
  141. </div>
  142. </div>
  143. </div>
  144.  
  145. <div class="edge">
  146. <dl class="fly-panel fly-list-one">
  147. <dt class="fly-panel-title">最近热帖</dt>
  148. <s:iterator value="#glanceoverPageBean.list" var="paste">
  149. <dd>
  150.  
  151. <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
  152. </a> <span> <i class="iconfont"></i> <s:property value="#paste.glanceover" />
  153. </span>
  154. </dd>
  155. </s:iterator>
  156. </dl>
  157.  
  158. <dl class="fly-panel fly-list-one">
  159. <dt class="fly-panel-title">近期热议</dt>
  160. <s:iterator value="#ansnumPageBean.list" var="paste">
  161. <dd>
  162. <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
  163. </a> <span> <i class="iconfont"></i> <s:property value="#paste.ansnum" />
  164. </span>
  165. </dd>
  166. </s:iterator>
  167. </dl>
  168. </div>
  169. </div>
  170.  
  171. <%-- <script type="text/javascript" charset="utf-8" src="res/js/kindeditor.js"></script>
  172. <script type="text/javascript">
  173. KE.show({
  174. id : 'L_content',
  175. resizeMode : 1,
  176. items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
  177. 'italic', 'underline', 'removeformat', 'justifyleft',
  178. 'justifycenter', 'justifyright', 'insertorderedlist',
  179. 'insertunorderedlist', 'emoticons', 'image', 'link' ]
  180. });
  181. </script> --%>
  182. <script type="text/javascript" charset="utf-8" src="js/kindeditor.js"></script>
  183. <script type="text/javascript">
  184. KE.show({
  185. id : 'content',
  186. resizeMode : 1,
  187. cssPath : './index.css',
  188. items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
  189. 'italic', 'underline', 'removeformat', 'justifyleft',
  190. 'justifycenter', 'justifyright', 'insertorderedlist',
  191. 'insertunorderedlist', 'emoticons', 'image', 'link' ]
  192. });
  193. </script>
  194. <script>
  195. layui.cache.page = '';
  196. layui.cache.user = {
  197. username : '游客',
  198. uid : -1,
  199. avatar : '../res/images/avatar/00.jpg',
  200. experience : 83,
  201. sex : '男'
  202. };
  203. layui.config({
  204. version : "2.0.0",
  205. base : '../res/mods/'
  206. }).extend({
  207. fly : 'index'
  208. }).use('fly');
  209. </script>
  210. </body>
  211. </html>

detail.jsp

  此时发现跳转过来的页面全部问题、最近热帖、最近热议、专家排行榜都是空的白的,接下来需要实现重定向到Action

  添加addAnswer()请求,如果用户成功回复,则返回"toDetail“

  1. public String addAnswer() throws Exception {
  2.  
  3. User user = (User) ActionContext.getContext().getSession().get("user");
  4. if(user == null)
  5. {
  6. ActionContext.getContext().put("error", "未登录不能回复!!");
  7. return "error";
  8. }
  9.  
  10. // //回复时间
  11. // private String anstime;
  12. Date date = new Date(System.currentTimeMillis());
  13. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
  14. String anstime = format.format(date);
  15. answer.setAnstime(anstime);
  16. // //同意数
  17. // private Integer agree;
  18. answer.setAgree(0);
  19. // //是否解决
  20. // private Integer solve;
  21. answer.setSolve(0);
  22. //
  23. // private User user;
  24. answer.setUser(user);
  25. //
  26. // private Paste paste;
  27. Paste paste = pasteService.findPasteByIdReturnPaste(pasteid);
  28. answer.setPaste(paste);
  29.  
  30. answerService.addAnswer(answer,paste);
  31. answerService.addAnswer(answer);
  32.  
  33. return "toDetail";
  34. }

  在struts.xml中配置toDetail结果集成重定向到action中

  1. <action name="AnswerAction_*" class="com.Gary.web.AnswerAction" method="{1}">
  2. <result name="error">/login.jsp</result>
  3. <!-- 重定向到Action -->
  4. <result name="toDetail" type="redirectAction">
  5. <param name="actionName">PasteAction_getDetail</param>
  6. <!-- struts不认识pasteid则会封装到重定向的action中 -->
  7. <param name="pasteid">${pasteid}</param>
  8. </result>
  9. </action>
  10. </package>

  1. package com.Gary.web;
  2.  
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5. import com.Gary.domain.Answer;
  6. import com.Gary.domain.Paste;
  7. import com.Gary.domain.User;
  8. import com.Gary.service.AnswerService;
  9. import com.Gary.service.PasteService;
  10. import com.opensymphony.xwork2.ActionContext;
  11. import com.opensymphony.xwork2.ActionSupport;
  12. import com.opensymphony.xwork2.ModelDriven;
  13.  
  14. public class AnswerAction extends ActionSupport implements ModelDriven<Answer>{
  15.  
  16. public Answer answer = new Answer();
  17. private AnswerService answerService;
  18. private String pasteid;
  19. private PasteService pasteService;
  20.  
  21. public AnswerService getAnswerService() {
  22. return answerService;
  23. }
  24.  
  25. public void setAnswerService(AnswerService answerService) {
  26. this.answerService = answerService;
  27. }
  28.  
  29. public PasteService getPasteService() {
  30. return pasteService;
  31. }
  32.  
  33. public void setPasteService(PasteService pasteService) {
  34. this.pasteService = pasteService;
  35. }
  36.  
  37. public String getPasteid() {
  38. return pasteid;
  39. }
  40.  
  41. public void setPasteid(String pasteid) {
  42. this.pasteid = pasteid;
  43. }
  44.  
  45. public String addAnswer() throws Exception {
  46.  
  47. User user = (User) ActionContext.getContext().getSession().get("user");
  48. if(user == null)
  49. {
  50. ActionContext.getContext().put("error", "未登录不能回复!!");
  51. return "error";
  52. }
  53.  
  54. // //回复时间
  55. // private String anstime;
  56. Date date = new Date(System.currentTimeMillis());
  57. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
  58. String anstime = format.format(date);
  59. answer.setAnstime(anstime);
  60. // //同意数
  61. // private Integer agree;
  62. answer.setAgree(0);
  63. // //是否解决
  64. // private Integer solve;
  65. answer.setSolve(0);
  66. //
  67. // private User user;
  68. answer.setUser(user);
  69. //
  70. // private Paste paste;
  71. Paste paste = pasteService.findPasteByIdReturnPaste(pasteid);
  72. answer.setPaste(paste);
  73.  
  74. answerService.addAnswer(answer,paste);
  75. answerService.addAnswer(answer);
  76.  
  77. return "toDetail";
  78. }
  79.  
  80. public Answer getModel() {
  81.  
  82. return answer;
  83. }
  84.  
  85. }

AnswerAction.java

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
  4. "http://struts.apache.org/dtds/struts-2.5.dtd">
  5.  
  6. <struts>
  7.  
  8. <!--开启动态方法调用 -->
  9. <constant name="struts.devMode" value="true"></constant>
  10. <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
  11.  
  12. <!-- 告诉struts不用自己创建Action,Spring来帮你创建 -->
  13. <constant name="struts.objectFactory" value="spring"></constant>
  14. <package name="Gary_SSHForum" namespace="/" extends="struts-default">
  15. <!-- 允许全部方法 -->
  16. <global-allowed-methods>regex:.*</global-allowed-methods>
  17. <action name="UserAction_*" class="com.Gary.web.UserAction" method="{1}">
  18. <result name="toLogin" type="redirect">/login.jsp</result>
  19. <result name="login">/login.jsp</result>
  20. <result name="toIndex" type="redirect">/default.jsp</result>
  21. <result name="error">/login.jsp</result>
  22. <result name="toRegisterSuccess" type="redirect">/registerSuccess.jsp</result>
  23. </action>
  24.  
  25. <action name="PasteAction_*" class="com.Gary.web.PasteAction" method="{1}">
  26. <!-- 从定向到jsp -->
  27. <result name="toIndex" type="redirect">/default.jsp</result>
  28. <result name="error">/login.jsp</result>
  29. <!-- 转发到jsp -->
  30. <result name="detail">/detail.jsp</result>
  31. </action>
  32.  
  33. <action name="GetDataAction_*" class="com.Gary.web.GetDataAction" method="{1}">
  34. <result name="index" >/index.jsp</result>
  35. </action>
  36. <action name="AnswerAction_*" class="com.Gary.web.AnswerAction" method="{1}">
  37. <result name="error">/login.jsp</result>
  38. <!-- 重定向到Action -->
  39. <result name="toDetail" type="redirectAction">
  40. <param name="actionName">PasteAction_getDetail</param>
  41. <!-- struts不认识pasteid则会封装到重定向的action中 -->
  42. <param name="pasteid">${pasteid}</param>
  43. </result>
  44. </action>
  45. </package>
  46.  
  47. </struts>

struts.xml

查看所有回复

  分析查看回复

  Web层

  1. package com.Gary.web;
  2.  
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5. import java.util.List;
  6.  
  7. import com.Gary.domain.Answer;
  8. import com.Gary.domain.Paste;
  9. import com.Gary.domain.User;
  10. import com.Gary.service.AnswerService;
  11. import com.Gary.service.PasteService;
  12. import com.Gary.utils.PageBean;
  13. import com.opensymphony.xwork2.ActionContext;
  14. import com.opensymphony.xwork2.ActionSupport;
  15. import com.opensymphony.xwork2.ModelDriven;
  16.  
  17. public class PasteAction extends ActionSupport implements ModelDriven<Paste> {
  18.  
  19. public Paste paste = new Paste();
  20. private String pasteid;
  21.  
  22. private PasteService pasteService;
  23. private AnswerService answerService;
  24.  
  25. //查看帖子详细信息
  26. public String getDetail() throws Exception{
  27.  
  28. //得到最近热帖
  29. PageBean glanceoverPageBean = pasteService.getGlanceoverPageBean(null);
  30. ActionContext.getContext().put("glanceoverPageBean", glanceoverPageBean);
  31.  
  32. //得到最近热议
  33. PageBean ansnumPageBean = pasteService.getAnsnumPageBean(null);
  34. ActionContext.getContext().put("ansnumPageBean", ansnumPageBean);
  35.  
  36. //获得帖子
  37. Paste paste = pasteService.findPasteByIdReturnPaste(pasteid);
  38. ActionContext.getContext().put("paste", paste);
  39.  
  40. //获得该帖子的所有回复
  41. List<Answer> answerList = answerService.findAllAnswerByPasteid(pasteid);
  42. ActionContext.getContext().put("answerList", answerList);
  43.  
  44. return "detail";
  45. }
  46.  
  47. public AnswerService getAnswerService() {
  48. return answerService;
  49. }
  50.  
  51. public void setAnswerService(AnswerService answerService) {
  52. this.answerService = answerService;
  53. }
  54.  
  55. //添加帖子
  56. public String addPaste() throws Exception {
  57. User user = (User)ActionContext.getContext().getSession().get("user");
  58.  
  59. if(user==null)
  60. {
  61. ActionContext.getContext().put("error", "只有登陆之后才可以发帖子!!");
  62. return "error";
  63. }
  64.  
  65. //private Integer ansnum;
  66. paste.setAnsnum(0);
  67. //private String createtime;
  68. Date date = new Date(System.currentTimeMillis());
  69. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
  70. String createtime = format.format(date);
  71. paste.setCreatetime(createtime);
  72. //private Integer glanceover;
  73. paste.setGlanceover(0);
  74. //是否结帖 0未结 1结束
  75. //private Integer solve;
  76. paste.setSolve(0);
  77. //private Integer isdelete;
  78. paste.setIsdelete(0);
  79. //private User user;
  80.  
  81. paste.setUser(user);
  82.  
  83. pasteService.addPaste(paste);
  84.  
  85. //重定向到主页
  86. return "toIndex";
  87. }
  88.  
  89. public PasteService getPasteService() {
  90. return pasteService;
  91. }
  92.  
  93. public void setPasteService(PasteService pasteService) {
  94. this.pasteService = pasteService;
  95. }
  96.  
  97. @Override
  98. public Paste getModel() {
  99. // TODO Auto-generated method stub
  100. return paste;
  101. }
  102.  
  103. public String getPasteid() {
  104. return pasteid;
  105. }
  106.  
  107. public void setPasteid(String pasteid) {
  108. this.pasteid = pasteid;
  109. }
  110.  
  111. }

PasteAction.java

  Service层

  1. package com.Gary.service;
  2.  
  3. import java.util.List;
  4.  
  5. import com.Gary.dao.AnswerDao;
  6. import com.Gary.domain.Answer;
  7. import com.Gary.domain.Paste;
  8.  
  9. public class AnswerService {
  10.  
  11. private AnswerDao answerDao;
  12.  
  13. public List<Answer> findAllAnswerByPasteid(String pasteid) {
  14. List<Answer> answerList = answerDao.findAllAnswerByPasteid(pasteid);
  15. return answerList;
  16. }
  17.  
  18. public AnswerDao getAnswerDao() {
  19. return answerDao;
  20. }
  21.  
  22. public void setAnswerDao(AnswerDao answerDao) {
  23. this.answerDao = answerDao;
  24. }
  25.  
  26. public void addAnswer(Answer answer) {
  27. // TODO Auto-generated method stub
  28. answerDao.addAnswer(answer);
  29. }
  30.  
  31. public void addAnswer(Answer answer, Paste paste) {
  32.  
  33. paste.setAnsnum(paste.getAnsnum() + 1);
  34. answerDao.addAnswer(answer);
  35. }
  36.  
  37. }

AnswerService.java

  Dao层

  1. package com.Gary.dao;
  2.  
  3. import java.util.List;
  4.  
  5. import org.hibernate.Session;
  6. import org.hibernate.query.NativeQuery;
  7. import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
  8.  
  9. import com.Gary.domain.Answer;
  10.  
  11. public class AnswerDao extends HibernateDaoSupport{
  12.  
  13. public void addAnswer(Answer answer) {
  14. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  15. session.save(answer);
  16. }
  17.  
  18. public List<Answer> findAllAnswerByPasteid(String pasteid) {
  19. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  20. String sql = "select * from answer where pasteid = ?";
  21. NativeQuery query = session.createSQLQuery(sql);
  22. query.addEntity(Answer.class);
  23. query.setParameter(1, pasteid);
  24. List<Answer> list = query.list();
  25. return list;
  26. }
  27.  
  28. }

AnswerDao.java

  前端样式的美化

  1. <div class="layui-form layui-form-pane">
  2. <!-- <form action="${pageContext.request.contextPath }/AnswerAction_addAnswer">
  3. <input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
  4. <div class="layui-form-item layui-form-text">
  5. <div class="layui-input-block">
  6. <textarea id="L_content" name="content" required lay-verify="required" placeholder="我要回答" class="layui-textarea fly-editor" style="height: 150px;"></textarea>
  7. </div>
  8. </div>
  9. <div class="layui-form-item">
  10. <button class="layui-btn" lay-filter="*" lay-submit>提交回答</button>
  11. </div>
  12. </form> -->
  13. <form action="${pageContext.request.contextPath}/AnswerAction_addAnswer">
  14. <input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
  15. <label for="L_title" class="layui-form-label" style="width: 690px; height: 40px;">
  16. <div style="margin-left: -580px">回答问题:</div>
  17. </label>
  18. <div class="layui-form-item layui-form-text">
  19. <div class="layui-input-block">
  20. <div class="editor">
  21. <textarea id="content" name="content" style="width: 690px; height: 300px; visibility: hidden;"></textarea>
  22. </div>
  23. </div>
  24.  
  25. </div>
  26.  
  27. <div class="layui-form-item">
  28. <button class="layui-btn" lay-filter="*" lay-submit>立即发布</button>
  29. </div>
  30. </form>
  31. </div>
  32. </div>
  33. </div>
  34. </div>
  35.  
  36. <div class="edge">
  37. <dl class="fly-panel fly-list-one">
  38. <dt class="fly-panel-title">最近热帖</dt>
  39. <s:iterator value="#glanceoverPageBean.list" var="paste">
  40. <dd>
  41.  
  42. <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
  43. </a> <span> <i class="iconfont"></i> <s:property value="#paste.glanceover" />
  44. </span>
  45. </dd>
  46. </s:iterator>
  47. </dl>
  48.  
  49. <dl class="fly-panel fly-list-one">
  50. <dt class="fly-panel-title">近期热议</dt>
  51. <s:iterator value="#ansnumPageBean.list" var="paste">
  52. <dd>
  53. <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
  54. </a> <span> <i class="iconfont"></i> <s:property value="#paste.ansnum" />
  55. </span>
  56. </dd>
  57. </s:iterator>
  58. </dl>
  59. </div>
  60. </div>

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <%@ taglib uri="/struts-tags" prefix="s"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta charset="utf-8">
  7. <title>问题详情</title>
  8. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  9. <meta name="keywords" content="fly,layui,前端社区">
  10. <meta name="description" content="">
  11. <link rel="stylesheet" href="res/layui/css/layui.css">
  12. <link rel="stylesheet" href="res/css/global.css">
  13. <script src="res/layui/layui.js"></script>
  14. <script src="js/jquery.js"></script>
  15. <style type="text/css" rel="stylesheet">
  16. form {
  17. margin: 0;
  18. }
  19.  
  20. .editor {
  21. margin-top: 5px;
  22. margin-bottom: 5px;
  23. }
  24. </style>
  25.  
  26. </head>
  27. <body style="margin: -2px">
  28. <iframe src="head.jsp" scrolling="no" width="100%" height="110px"></iframe>
  29. <div class="main layui-clear">
  30. <div class="wrap">
  31. <div class="content detail">
  32. <div class="fly-panel detail-box">
  33.  
  34. <h1>
  35. <s:property value="#paste.title" />
  36. </h1>
  37. <div class="fly-tip fly-detail-hint" data-id="">
  38. <span class="fly-tip-stick">置顶帖</span> <span class="jie-admin"> <a href="">点击置顶</a>
  39. </span> <span class="layui-btn layui-btn-mini jie-admin"> <a href="">取消置顶</a>
  40. </span> <span class="jie-admin" type="del" style="margin-left: 20px;"> <a>删除该帖</a>
  41. </span> </span>
  42. <div class="fly-list-hint">
  43. <i class="iconfont" title="回答"></i>
  44. <s:property value="#paste.ansnum" />
  45. </div>
  46. </div>
  47. <div class="detail-about">
  48. <a class="jie-user" href=""> <img src="${pageContext.request.contextPath }/<s:property value="#paste.user.image"/>" alt="头像"> <cite> <s:property value="#paste.user.username" /> <em> <s:property value="#paste.createtime" /> 发布
  49. </em>
  50. </cite>
  51. </a>
  52. <div class="detail-hits" data-id="{{rows.id}}">
  53. <span class="layui-btn layui-btn-mini jie-admin"> <a href="#">已完帖,无法编辑</a>
  54. </span> <span class="layui-btn layui-btn-mini jie-admin" type="collect" data-type="add"> <a id="collectPost">收藏</a>
  55. </span> <span class="layui-btn layui-btn-mini jie-admin layui-btn-danger" type="collect" data-type="add"> <a>取消收藏</a>
  56. </span>
  57.  
  58. </div>
  59. </div>
  60. <div class="detail-body photos" style="margin-bottom: 20px;">
  61. <p>
  62. <s:property value="#paste.content" />
  63. </p>
  64. </div>
  65. </div>
  66.  
  67. <div class="fly-panel detail-box" style="padding-top: 0;">
  68. <a name="comment"></a>
  69. <ul class="jieda photos" id="jieda">
  70. <!-- <li data-id="12" class="jieda-daan"><a name="item-121212121212"></a>
  71. <div class="detail-about detail-about-reply">
  72. <a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>纸飞机</i> <em>(楼主)</em>
  73. <em style="color:#5FB878">(管理员)</em>
  74. </cite>
  75. </a>
  76. <div class="detail-hits">
  77. <span>3分钟前</span>
  78. </div>
  79. <i class="iconfont icon-caina" title="最佳答案"></i>
  80. </div>
  81. <div class="detail-body jieda-body">
  82. <p>么么哒</p>
  83. </div>
  84. <div class="jieda-reply">
  85. <span class="jieda-zan zanok" type="zan"><i class="iconfont icon-zan"></i><em>12</em> </span>
  86. <!-- <div class="jieda-admin">
  87. <span type="del">删除</span>
  88. <span class="jieda-accept" type="accept">采纳</span>
  89. </div>
  90. </div></li> -->
  91.  
  92. <s:iterator value="#answerList" var="answer">
  93. <li data-id="13"><a name="item-121212121212"></a>
  94. <div class="detail-about detail-about-reply">
  95. <a class="jie-user" href="">
  96. <img src="${pageContext.request.contextPath }/<s:property value="#answer.user.image"/>" alt="">
  97. <cite> <i><s:property value="#answer.user.username" /></i> <em style="color: #FF9E3F">活雷锋</em>
  98. </cite>
  99. </a>
  100. <div class="detail-hits">
  101. <span> <s:property value="#answer.anstime" />
  102. </span>
  103. </div>
  104. </div>
  105. <div class="detail-body jieda-body">
  106. <p><s:property value="#answer.content" /></p>
  107. </div>
  108. <div class="jieda-reply">
  109. <span class="jieda-zan" type="zan"><i class="iconfont icon-zan"></i>
  110. <em> <s:property value="#answer.agree" /></em>
  111. </span>
  112. <div class="jieda-admin">
  113.  
  114. <span type="del"><a href="#" class="layui-btn layui-btn-danger layui-btn-small">删除</a></span> <span class="jieda-accept" type="accept"> <a href="#" class="layui-btn layui-btn-small">采纳</a></span>
  115. </div>
  116. </div></li>
  117. </s:iterator>
  118. <s:if test="#answerList.size()==0">
  119. <li class="fly-none">没有任何回答</li>
  120. </s:if>
  121. </ul>
  122. <div class="layui-form layui-form-pane">
  123. <!-- <form action="${pageContext.request.contextPath }/AnswerAction_addAnswer">
  124. <input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
  125. <div class="layui-form-item layui-form-text">
  126. <div class="layui-input-block">
  127. <textarea id="L_content" name="content" required lay-verify="required" placeholder="我要回答" class="layui-textarea fly-editor" style="height: 150px;"></textarea>
  128. </div>
  129. </div>
  130. <div class="layui-form-item">
  131. <button class="layui-btn" lay-filter="*" lay-submit>提交回答</button>
  132. </div>
  133. </form> -->
  134. <form action="${pageContext.request.contextPath}/AnswerAction_addAnswer">
  135. <input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
  136. <label for="L_title" class="layui-form-label" style="width: 690px; height: 40px;">
  137. <div style="margin-left: -580px">回答问题:</div>
  138. </label>
  139. <div class="layui-form-item layui-form-text">
  140. <div class="layui-input-block">
  141. <div class="editor">
  142. <textarea id="content" name="content" style="width: 690px; height: 300px; visibility: hidden;"></textarea>
  143. </div>
  144. </div>
  145.  
  146. </div>
  147.  
  148. <div class="layui-form-item">
  149. <button class="layui-btn" lay-filter="*" lay-submit>立即发布</button>
  150. </div>
  151. </form>
  152. </div>
  153. </div>
  154. </div>
  155. </div>
  156.  
  157. <div class="edge">
  158. <dl class="fly-panel fly-list-one">
  159. <dt class="fly-panel-title">最近热帖</dt>
  160. <s:iterator value="#glanceoverPageBean.list" var="paste">
  161. <dd>
  162.  
  163. <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
  164. </a> <span> <i class="iconfont"></i> <s:property value="#paste.glanceover" />
  165. </span>
  166. </dd>
  167. </s:iterator>
  168. </dl>
  169.  
  170. <dl class="fly-panel fly-list-one">
  171. <dt class="fly-panel-title">近期热议</dt>
  172. <s:iterator value="#ansnumPageBean.list" var="paste">
  173. <dd>
  174. <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
  175. </a> <span> <i class="iconfont"></i> <s:property value="#paste.ansnum" />
  176. </span>
  177. </dd>
  178. </s:iterator>
  179. </dl>
  180. </div>
  181. </div>
  182.  
  183. <%-- <script type="text/javascript" charset="utf-8" src="res/js/kindeditor.js"></script>
  184. <script type="text/javascript">
  185. KE.show({
  186. id : 'L_content',
  187. resizeMode : 1,
  188. items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
  189. 'italic', 'underline', 'removeformat', 'justifyleft',
  190. 'justifycenter', 'justifyright', 'insertorderedlist',
  191. 'insertunorderedlist', 'emoticons', 'image', 'link' ]
  192. });
  193. </script> --%>
  194. <script type="text/javascript" charset="utf-8" src="js/kindeditor.js"></script>
  195. <script type="text/javascript">
  196. KE.show({
  197. id : 'content',
  198. resizeMode : 1,
  199. cssPath : './index.css',
  200. items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
  201. 'italic', 'underline', 'removeformat', 'justifyleft',
  202. 'justifycenter', 'justifyright', 'insertorderedlist',
  203. 'insertunorderedlist', 'emoticons', 'image', 'link' ]
  204. });
  205. </script>
  206. <script>
  207. layui.cache.page = '';
  208. layui.cache.user = {
  209. username : '游客',
  210. uid : -1,
  211. avatar : '../res/images/avatar/00.jpg',
  212. experience : 83,
  213. sex : '男'
  214. };
  215. layui.config({
  216. version : "2.0.0",
  217. base : '../res/mods/'
  218. }).extend({
  219. fly : 'index'
  220. }).use('fly');
  221. </script>
  222. </body>
  223. </html>

detail.jsp

  删除与采纳的显示

  判断当前回复帖子人是登陆名自己的,显示可以删除帖子

  1.     <s:if test="#session.user.username==#answer.user.username ">
  2.       <span type="del"><a href="#" class="layui-btn layui-btn-danger layui-btn-small">删除</a></span>
  3.     </s:if>

  判断当前发帖人是登录名自己的,显示可以采纳帖子

  1.     <s:if test="#session.user.username==#paste.user.username && #paste.solve==0">
  2.       <span class="jieda-accept" type="accept"> <a href="#" class="layui-btn layui-btn-small">采纳</a></span>
  3.     </s:if>

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <%@ taglib uri="/struts-tags" prefix="s"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta charset="utf-8">
  7. <title>问题详情</title>
  8. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  9. <meta name="keywords" content="fly,layui,前端社区">
  10. <meta name="description" content="">
  11. <link rel="stylesheet" href="res/layui/css/layui.css">
  12. <link rel="stylesheet" href="res/css/global.css">
  13. <script src="res/layui/layui.js"></script>
  14. <script src="js/jquery.js"></script>
  15. <style type="text/css" rel="stylesheet">
  16. form {
  17. margin: 0;
  18. }
  19.  
  20. .editor {
  21. margin-top: 5px;
  22. margin-bottom: 5px;
  23. }
  24. </style>
  25.  
  26. </head>
  27. <body style="margin: -2px">
  28. <iframe src="head.jsp" scrolling="no" width="100%" height="110px"></iframe>
  29. <div class="main layui-clear">
  30. <div class="wrap">
  31. <div class="content detail">
  32. <div class="fly-panel detail-box">
  33.  
  34. <h1>
  35. <s:property value="#paste.title" />
  36. </h1>
  37. <div class="fly-tip fly-detail-hint" data-id="">
  38. <span class="fly-tip-stick">置顶帖</span> <span class="jie-admin"> <a href="">点击置顶</a>
  39. </span> <span class="layui-btn layui-btn-mini jie-admin"> <a href="">取消置顶</a>
  40. </span> <span class="jie-admin" type="del" style="margin-left: 20px;"> <a>删除该帖</a>
  41. </span> </span>
  42. <div class="fly-list-hint">
  43. <i class="iconfont" title="回答"></i>
  44. <s:property value="#paste.ansnum" />
  45. </div>
  46. </div>
  47. <div class="detail-about">
  48. <a class="jie-user" href=""> <img src="${pageContext.request.contextPath }/<s:property value="#paste.user.image"/>" alt="头像"> <cite> <s:property value="#paste.user.username" /> <em> <s:property value="#paste.createtime" /> 发布
  49. </em>
  50. </cite>
  51. </a>
  52. <div class="detail-hits" data-id="{{rows.id}}">
  53. <span class="layui-btn layui-btn-mini jie-admin"> <a href="#">已完帖,无法编辑</a>
  54. </span> <span class="layui-btn layui-btn-mini jie-admin" type="collect" data-type="add"> <a id="collectPost">收藏</a>
  55. </span> <span class="layui-btn layui-btn-mini jie-admin layui-btn-danger" type="collect" data-type="add"> <a>取消收藏</a>
  56. </span>
  57.  
  58. </div>
  59. </div>
  60. <div class="detail-body photos" style="margin-bottom: 20px;">
  61. <p>
  62. <s:property value="#paste.content" />
  63. </p>
  64. </div>
  65. </div>
  66.  
  67. <div class="fly-panel detail-box" style="padding-top: 0;">
  68. <a name="comment"></a>
  69. <ul class="jieda photos" id="jieda">
  70. <!-- <li data-id="12" class="jieda-daan"><a name="item-121212121212"></a>
  71. <div class="detail-about detail-about-reply">
  72. <a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>纸飞机</i> <em>(楼主)</em>
  73. <em style="color:#5FB878">(管理员)</em>
  74. </cite>
  75. </a>
  76. <div class="detail-hits">
  77. <span>3分钟前</span>
  78. </div>
  79. <i class="iconfont icon-caina" title="最佳答案"></i>
  80. </div>
  81. <div class="detail-body jieda-body">
  82. <p>么么哒</p>
  83. </div>
  84. <div class="jieda-reply">
  85. <span class="jieda-zan zanok" type="zan"><i class="iconfont icon-zan"></i><em>12</em> </span>
  86. <!-- <div class="jieda-admin">
  87. <span type="del">删除</span>
  88. <span class="jieda-accept" type="accept">采纳</span>
  89. </div>
  90. </div></li> -->
  91.  
  92. <s:iterator value="#answerList" var="answer">
  93. <li data-id="13"><a name="item-121212121212"></a>
  94. <div class="detail-about detail-about-reply">
  95. <a class="jie-user" href="">
  96. <img src="${pageContext.request.contextPath }/<s:property value="#answer.user.image"/>" alt="">
  97. <cite> <i><s:property value="#answer.user.username" /></i> <em style="color: #FF9E3F">活雷锋</em>
  98. </cite>
  99. </a>
  100. <div class="detail-hits">
  101. <span> <s:property value="#answer.anstime" />
  102. </span>
  103. </div>
  104. </div>
  105. <div class="detail-body jieda-body">
  106. <p><s:property value="#answer.content" /></p>
  107. </div>
  108. <div class="jieda-reply">
  109. <span class="jieda-zan" type="zan"><i class="iconfont icon-zan"></i>
  110. <em> <s:property value="#answer.agree" /></em>
  111. </span>
  112. <div class="jieda-admin">
  113. <s:if test="#session.user.username==#answer.user.username ">
  114. <span type="del"><a href="#" class="layui-btn layui-btn-danger layui-btn-small">删除</a></span>
  115. </s:if>
  116. <s:if test="#session.user.username==#paste.user.username && #paste.solve==0">
  117. <span class="jieda-accept" type="accept"> <a href="#" class="layui-btn layui-btn-small">采纳</a></span>
  118. </s:if>
  119. </div>
  120. </div></li>
  121. </s:iterator>
  122. <s:if test="#answerList.size()==0">
  123. <li class="fly-none">没有任何回答</li>
  124. </s:if>
  125. </ul>
  126. <div class="layui-form layui-form-pane">
  127. <!-- <form action="${pageContext.request.contextPath }/AnswerAction_addAnswer">
  128. <input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
  129. <div class="layui-form-item layui-form-text">
  130. <div class="layui-input-block">
  131. <textarea id="L_content" name="content" required lay-verify="required" placeholder="我要回答" class="layui-textarea fly-editor" style="height: 150px;"></textarea>
  132. </div>
  133. </div>
  134. <div class="layui-form-item">
  135. <button class="layui-btn" lay-filter="*" lay-submit>提交回答</button>
  136. </div>
  137. </form> -->
  138. <form action="${pageContext.request.contextPath}/AnswerAction_addAnswer">
  139. <input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
  140. <label for="L_title" class="layui-form-label" style="width: 690px; height: 40px;">
  141. <div style="margin-left: -580px">回答问题:</div>
  142. </label>
  143. <div class="layui-form-item layui-form-text">
  144. <div class="layui-input-block">
  145. <div class="editor">
  146. <textarea id="content" name="content" style="width: 690px; height: 300px; visibility: hidden;"></textarea>
  147. </div>
  148. </div>
  149.  
  150. </div>
  151.  
  152. <div class="layui-form-item">
  153. <button class="layui-btn" lay-filter="*" lay-submit>立即发布</button>
  154. </div>
  155. </form>
  156. </div>
  157. </div>
  158. </div>
  159. </div>
  160.  
  161. <div class="edge">
  162. <dl class="fly-panel fly-list-one">
  163. <dt class="fly-panel-title">最近热帖</dt>
  164. <s:iterator value="#glanceoverPageBean.list" var="paste">
  165. <dd>
  166.  
  167. <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
  168. </a> <span> <i class="iconfont"></i> <s:property value="#paste.glanceover" />
  169. </span>
  170. </dd>
  171. </s:iterator>
  172. </dl>
  173.  
  174. <dl class="fly-panel fly-list-one">
  175. <dt class="fly-panel-title">近期热议</dt>
  176. <s:iterator value="#ansnumPageBean.list" var="paste">
  177. <dd>
  178. <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
  179. </a> <span> <i class="iconfont"></i> <s:property value="#paste.ansnum" />
  180. </span>
  181. </dd>
  182. </s:iterator>
  183. </dl>
  184. </div>
  185. </div>
  186.  
  187. <%-- <script type="text/javascript" charset="utf-8" src="res/js/kindeditor.js"></script>
  188. <script type="text/javascript">
  189. KE.show({
  190. id : 'L_content',
  191. resizeMode : 1,
  192. items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
  193. 'italic', 'underline', 'removeformat', 'justifyleft',
  194. 'justifycenter', 'justifyright', 'insertorderedlist',
  195. 'insertunorderedlist', 'emoticons', 'image', 'link' ]
  196. });
  197. </script> --%>
  198. <script type="text/javascript" charset="utf-8" src="js/kindeditor.js"></script>
  199. <script type="text/javascript">
  200. KE.show({
  201. id : 'content',
  202. resizeMode : 1,
  203. cssPath : './index.css',
  204. items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
  205. 'italic', 'underline', 'removeformat', 'justifyleft',
  206. 'justifycenter', 'justifyright', 'insertorderedlist',
  207. 'insertunorderedlist', 'emoticons', 'image', 'link' ]
  208. });
  209. </script>
  210. <script>
  211. layui.cache.page = '';
  212. layui.cache.user = {
  213. username : '游客',
  214. uid : -1,
  215. avatar : '../res/images/avatar/00.jpg',
  216. experience : 83,
  217. sex : '男'
  218. };
  219. layui.config({
  220. version : "2.0.0",
  221. base : '../res/mods/'
  222. }).extend({
  223. fly : 'index'
  224. }).use('fly');
  225. </script>
  226. </body>
  227. </html>

detail.jsp

分析删除回复

  删除和采纳

  1. <div class="jieda-admin">
  2. <s:if test="#session.user.username==#answer.user.username ">
  3. <span type="del"><a href="${pageContext.request.contextPath }/AnswerAction_deleteAnswer?answerid=<s:property value="#answer.id"/>&pasteid=<s:property value="#paste.id"/>" class="layui-btn layui-btn-danger layui-btn-small">删除</a></span>
  4. </s:if>
  5. <s:if test="#session.user.username==#paste.user.username && #paste.solve==0">
  6. <span class="jieda-accept" type="accept"> <a href="#" class="layui-btn layui-btn-small">采纳</a></span>
  7. </s:if>
  8. </div>
  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <%@ taglib uri="/struts-tags" prefix="s"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta charset="utf-8">
  7. <title>问题详情</title>
  8. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  9. <meta name="keywords" content="fly,layui,前端社区">
  10. <meta name="description" content="">
  11. <link rel="stylesheet" href="res/layui/css/layui.css">
  12. <link rel="stylesheet" href="res/css/global.css">
  13. <script src="res/layui/layui.js"></script>
  14. <script src="js/jquery.js"></script>
  15. <style type="text/css" rel="stylesheet">
  16. form {
  17. margin: 0;
  18. }
  19.  
  20. .editor {
  21. margin-top: 5px;
  22. margin-bottom: 5px;
  23. }
  24. </style>
  25.  
  26. </head>
  27. <body style="margin: -2px">
  28. <iframe src="head.jsp" scrolling="no" width="100%" height="110px"></iframe>
  29. <div class="main layui-clear">
  30. <div class="wrap">
  31. <div class="content detail">
  32. <div class="fly-panel detail-box">
  33.  
  34. <h1>
  35. <s:property value="#paste.title" />
  36. </h1>
  37. <div class="fly-tip fly-detail-hint" data-id="">
  38. <span class="fly-tip-stick">置顶帖</span> <span class="jie-admin"> <a href="">点击置顶</a>
  39. </span> <span class="layui-btn layui-btn-mini jie-admin"> <a href="">取消置顶</a>
  40. </span> <span class="jie-admin" type="del" style="margin-left: 20px;"> <a>删除该帖</a>
  41. </span> </span>
  42. <div class="fly-list-hint">
  43. <i class="iconfont" title="回答"></i>
  44. <s:property value="#paste.ansnum" />
  45. </div>
  46. </div>
  47. <div class="detail-about">
  48. <a class="jie-user" href=""> <img src="${pageContext.request.contextPath }/<s:property value="#paste.user.image"/>" alt="头像"> <cite> <s:property value="#paste.user.username" /> <em> <s:property value="#paste.createtime" /> 发布
  49. </em>
  50. </cite>
  51. </a>
  52. <div class="detail-hits" data-id="{{rows.id}}">
  53. <span class="layui-btn layui-btn-mini jie-admin"> <a href="#">已完帖,无法编辑</a>
  54. </span> <span class="layui-btn layui-btn-mini jie-admin" type="collect" data-type="add"> <a id="collectPost">收藏</a>
  55. </span> <span class="layui-btn layui-btn-mini jie-admin layui-btn-danger" type="collect" data-type="add"> <a>取消收藏</a>
  56. </span>
  57.  
  58. </div>
  59. </div>
  60. <div class="detail-body photos" style="margin-bottom: 20px;">
  61. <p>
  62. <s:property value="#paste.content" />
  63. </p>
  64. </div>
  65. </div>
  66.  
  67. <div class="fly-panel detail-box" style="padding-top: 0;">
  68. <a name="comment"></a>
  69. <ul class="jieda photos" id="jieda">
  70. <!-- <li data-id="12" class="jieda-daan"><a name="item-121212121212"></a>
  71. <div class="detail-about detail-about-reply">
  72. <a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>纸飞机</i> <em>(楼主)</em>
  73. <em style="color:#5FB878">(管理员)</em>
  74. </cite>
  75. </a>
  76. <div class="detail-hits">
  77. <span>3分钟前</span>
  78. </div>
  79. <i class="iconfont icon-caina" title="最佳答案"></i>
  80. </div>
  81. <div class="detail-body jieda-body">
  82. <p>么么哒</p>
  83. </div>
  84. <div class="jieda-reply">
  85. <span class="jieda-zan zanok" type="zan"><i class="iconfont icon-zan"></i><em>12</em> </span>
  86. <!-- <div class="jieda-admin">
  87. <span type="del">删除</span>
  88. <span class="jieda-accept" type="accept">采纳</span>
  89. </div>
  90. </div></li> -->
  91.  
  92. <s:iterator value="#answerList" var="answer">
  93. <li data-id="13"><a name="item-121212121212"></a>
  94. <div class="detail-about detail-about-reply">
  95. <a class="jie-user" href=""> <img src="${pageContext.request.contextPath }/<s:property value="#answer.user.image"/>" alt=""> <cite> <i><s:property value="#answer.user.username" /></i> <em style="color: #FF9E3F">活雷锋</em>
  96. </cite>
  97. </a>
  98. <div class="detail-hits">
  99. <span> <s:property value="#answer.anstime" />
  100. </span>
  101. </div>
  102. </div>
  103. <div class="detail-body jieda-body">
  104. <p>
  105. <s:property value="#answer.content" />
  106. </p>
  107. </div>
  108. <div class="jieda-reply">
  109. <span class="jieda-zan" type="zan"><i class="iconfont icon-zan"></i> <em> <s:property value="#answer.agree" /></em> </span>
  110. <div class="jieda-admin">
  111. <s:if test="#session.user.username==#answer.user.username ">
  112. <span type="del"><a href="${pageContext.request.contextPath }/AnswerAction_deleteAnswer?answerid=<s:property value="#answer.id"/>&pasteid=<s:property value="#paste.id"/>" class="layui-btn layui-btn-danger layui-btn-small">删除</a></span>
  113. </s:if>
  114. <s:if test="#session.user.username==#paste.user.username && #paste.solve==0">
  115. <span class="jieda-accept" type="accept"> <a href="#" class="layui-btn layui-btn-small">采纳</a></span>
  116. </s:if>
  117. </div>
  118. </div></li>
  119. </s:iterator>
  120. <s:if test="#answerList.size()==0">
  121. <li class="fly-none">没有任何回答</li>
  122. </s:if>
  123. </ul>
  124. <div class="layui-form layui-form-pane">
  125. <!-- <form action="${pageContext.request.contextPath }/AnswerAction_addAnswer">
  126. <input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
  127. <div class="layui-form-item layui-form-text">
  128. <div class="layui-input-block">
  129. <textarea id="L_content" name="content" required lay-verify="required" placeholder="我要回答" class="layui-textarea fly-editor" style="height: 150px;"></textarea>
  130. </div>
  131. </div>
  132. <div class="layui-form-item">
  133. <button class="layui-btn" lay-filter="*" lay-submit>提交回答</button>
  134. </div>
  135. </form> -->
  136. <form action="${pageContext.request.contextPath}/AnswerAction_addAnswer">
  137. <input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>"> <label for="L_title" class="layui-form-label" style="width: 690px; height: 40px;">
  138. <div style="margin-left: -580px">回答问题:</div>
  139. </label>
  140. <div class="layui-form-item layui-form-text">
  141. <div class="layui-input-block">
  142. <div class="editor">
  143. <textarea id="content" name="content" style="width: 690px; height: 300px; visibility: hidden;"></textarea>
  144. </div>
  145. </div>
  146.  
  147. </div>
  148.  
  149. <div class="layui-form-item">
  150. <button class="layui-btn" lay-filter="*" lay-submit>立即发布</button>
  151. </div>
  152. </form>
  153. </div>
  154. </div>
  155. </div>
  156. </div>
  157.  
  158. <div class="edge">
  159. <dl class="fly-panel fly-list-one">
  160. <dt class="fly-panel-title">最近热帖</dt>
  161. <s:iterator value="#glanceoverPageBean.list" var="paste">
  162. <dd>
  163.  
  164. <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
  165. </a> <span> <i class="iconfont"></i> <s:property value="#paste.glanceover" />
  166. </span>
  167. </dd>
  168. </s:iterator>
  169. </dl>
  170.  
  171. <dl class="fly-panel fly-list-one">
  172. <dt class="fly-panel-title">近期热议</dt>
  173. <s:iterator value="#ansnumPageBean.list" var="paste">
  174. <dd>
  175. <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
  176. </a> <span> <i class="iconfont"></i> <s:property value="#paste.ansnum" />
  177. </span>
  178. </dd>
  179. </s:iterator>
  180. </dl>
  181. </div>
  182. </div>
  183.  
  184. <%-- <script type="text/javascript" charset="utf-8" src="res/js/kindeditor.js"></script>
  185. <script type="text/javascript">
  186. KE.show({
  187. id : 'L_content',
  188. resizeMode : 1,
  189. items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
  190. 'italic', 'underline', 'removeformat', 'justifyleft',
  191. 'justifycenter', 'justifyright', 'insertorderedlist',
  192. 'insertunorderedlist', 'emoticons', 'image', 'link' ]
  193. });
  194. </script> --%>
  195. <script type="text/javascript" charset="utf-8" src="js/kindeditor.js"></script>
  196. <script type="text/javascript">
  197. KE.show({
  198. id : 'content',
  199. resizeMode : 1,
  200. cssPath : './index.css',
  201. items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
  202. 'italic', 'underline', 'removeformat', 'justifyleft',
  203. 'justifycenter', 'justifyright', 'insertorderedlist',
  204. 'insertunorderedlist', 'emoticons', 'image', 'link' ]
  205. });
  206. </script>
  207. <script>
  208. layui.cache.page = '';
  209. layui.cache.user = {
  210. username : '游客',
  211. uid : -1,
  212. avatar : '../res/images/avatar/00.jpg',
  213. experience : 83,
  214. sex : '男'
  215. };
  216. layui.config({
  217. version : "2.0.0",
  218. base : '../res/mods/'
  219. }).extend({
  220. fly : 'index'
  221. }).use('fly');
  222. </script>
  223. </body>
  224. </html>

detail.jsp

  Web层:当增加帖子时,帖子数+1

  1. //删除answer
  2. public String deleteAnswer() throws Exception {
  3.  
  4. Paste paste = pasteService.findPasteByIdReturnPaste(pasteid);
  5.  
  6. answerService.deleteAnswerById(answerid,paste);
  7. ActionContext.getContext().put("pasteid", pasteid);
  8. return "toDetail";
  9. }
  10.  
  11. //添加answer
  12. public String addAnswer() throws Exception {
  13.  
  14. User user = (User) ActionContext.getContext().getSession().get("user");
  15. if(user == null)
  16. {
  17. ActionContext.getContext().put("error", "未登录不能回复!!");
  18. return "error";
  19. }
  1. package com.Gary.web;
  2.  
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5. import com.Gary.domain.Answer;
  6. import com.Gary.domain.Paste;
  7. import com.Gary.domain.User;
  8. import com.Gary.service.AnswerService;
  9. import com.Gary.service.PasteService;
  10. import com.opensymphony.xwork2.ActionContext;
  11. import com.opensymphony.xwork2.ActionSupport;
  12. import com.opensymphony.xwork2.ModelDriven;
  13.  
  14. public class AnswerAction extends ActionSupport implements ModelDriven<Answer>{
  15.  
  16. public Answer answer = new Answer();
  17. private AnswerService answerService;
  18. private String pasteid;
  19. private PasteService pasteService;
  20. private String answerid;
  21.  
  22. public String getAnswerid() {
  23. return answerid;
  24. }
  25.  
  26. public void setAnswerid(String answerid) {
  27. this.answerid = answerid;
  28. }
  29.  
  30. public AnswerService getAnswerService() {
  31. return answerService;
  32. }
  33.  
  34. public void setAnswerService(AnswerService answerService) {
  35. this.answerService = answerService;
  36. }
  37.  
  38. public PasteService getPasteService() {
  39. return pasteService;
  40. }
  41.  
  42. public void setPasteService(PasteService pasteService) {
  43. this.pasteService = pasteService;
  44. }
  45.  
  46. public String getPasteid() {
  47. return pasteid;
  48. }
  49.  
  50. public void setPasteid(String pasteid) {
  51. this.pasteid = pasteid;
  52. }
  53.  
  54. //删除answer
  55. public String deleteAnswer() throws Exception {
  56.  
  57. Paste paste = pasteService.findPasteByIdReturnPaste(pasteid);
  58.  
  59. answerService.deleteAnswerById(answerid,paste);
  60. ActionContext.getContext().put("pasteid", pasteid);
  61. return "toDetail";
  62. }
  63.  
  64. //添加answer
  65. public String addAnswer() throws Exception {
  66.  
  67. User user = (User) ActionContext.getContext().getSession().get("user");
  68. if(user == null)
  69. {
  70. ActionContext.getContext().put("error", "未登录不能回复!!");
  71. return "error";
  72. }
  73.  
  74. // //回复时间
  75. // private String anstime;
  76. Date date = new Date(System.currentTimeMillis());
  77. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
  78. String anstime = format.format(date);
  79. answer.setAnstime(anstime);
  80. // //同意数
  81. // private Integer agree;
  82. answer.setAgree(0);
  83. // //是否解决
  84. // private Integer solve;
  85. answer.setSolve(0);
  86. //
  87. // private User user;
  88. answer.setUser(user);
  89. //
  90. // private Paste paste;
  91. Paste paste = pasteService.findPasteByIdReturnPaste(pasteid);
  92. answer.setPaste(paste);
  93.  
  94. answerService.addAnswer(answer,paste);
  95.  
  96. return "toDetail";
  97. }
  98.  
  99. public Answer getModel() {
  100.  
  101. return answer;
  102. }
  103.  
  104. }

AnswerAction.java

  Service层

  1. public void addAnswer(Answer answer, Paste paste) {
  2.  
  3. paste.setAnsnum(paste.getAnsnum() + 1);
  4. answerDao.addAnswer(answer);
  5. }
  6.  
  7. public void deleteAnswerById(String answerid, Paste paste) {
  8. paste.setAnsnum(paste.getAnsnum()-1);
  9. answerDao.deleteAnswerById(answerid);
  10. }
  1. package com.Gary.service;
  2.  
  3. import java.util.List;
  4.  
  5. import com.Gary.dao.AnswerDao;
  6. import com.Gary.domain.Answer;
  7. import com.Gary.domain.Paste;
  8.  
  9. public class AnswerService {
  10.  
  11. private AnswerDao answerDao;
  12.  
  13. public List<Answer> findAllAnswerByPasteid(String pasteid) {
  14. List<Answer> answerList = answerDao.findAllAnswerByPasteid(pasteid);
  15. return answerList;
  16. }
  17.  
  18. public void addAnswer(Answer answer, Paste paste) {
  19.  
  20. paste.setAnsnum(paste.getAnsnum() + 1);
  21. answerDao.addAnswer(answer);
  22. }
  23.  
  24. public void deleteAnswerById(String answerid, Paste paste) {
  25. paste.setAnsnum(paste.getAnsnum()-1);
  26. answerDao.deleteAnswerById(answerid);
  27. }
  28.  
  29. public AnswerDao getAnswerDao() {
  30. return answerDao;
  31. }
  32.  
  33. public void setAnswerDao(AnswerDao answerDao) {
  34. this.answerDao = answerDao;
  35. }
  36.  
  37. }

AnswerService.java

  Dao层:操作数据库

  1. public void addAnswer(Answer answer) {
  2. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  3. session.save(answer);
  4. }
  5.  
  6. public List<Answer> findAllAnswerByPasteid(String pasteid) {
  7. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  8. String sql = "select * from answer where pasteid = ?";
  9. NativeQuery query = session.createSQLQuery(sql);
  10. query.addEntity(Answer.class);
  11. query.setParameter(1, pasteid);
  12. List<Answer> list = query.list();
  13. return list;
  14. }
  15.  
  16. public void deleteAnswerById(String answerid) {
  17. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  18. String sql = "delete from answer where id = ?";
  19. NativeQuery query = session.createSQLQuery(sql);
  20. query.setParameter(1, answerid);
  21. query.executeUpdate();
  22.  
  23. //session.delete(answerid, Answer.class);
  24.  
  25. }
  1. package com.Gary.dao;
  2.  
  3. import java.util.List;
  4.  
  5. import org.hibernate.Session;
  6. import org.hibernate.query.NativeQuery;
  7. import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
  8.  
  9. import com.Gary.domain.Answer;
  10.  
  11. public class AnswerDao extends HibernateDaoSupport{
  12.  
  13. public void addAnswer(Answer answer) {
  14. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  15. session.save(answer);
  16. }
  17.  
  18. public List<Answer> findAllAnswerByPasteid(String pasteid) {
  19. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  20. String sql = "select * from answer where pasteid = ?";
  21. NativeQuery query = session.createSQLQuery(sql);
  22. query.addEntity(Answer.class);
  23. query.setParameter(1, pasteid);
  24. List<Answer> list = query.list();
  25. return list;
  26. }
  27.  
  28. public void deleteAnswerById(String answerid) {
  29. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  30. String sql = "delete from answer where id = ?";
  31. NativeQuery query = session.createSQLQuery(sql);
  32. query.setParameter(1, answerid);
  33. query.executeUpdate();
  34.  
  35. //session.delete(answerid, Answer.class);
  36.  
  37. }
  38.  
  39. }

AnswerDao.java

  可以看到,进入帖子后,帖子浏览数目+1,当增加回帖时,帖子数+1,当删除回帖时,帖子数-1

  添加属性与元数据字段

  1. private String answerid;
  1. <property name="answerid" column="answerid"></property>

  

  分析采纳帖子

  detail.jsp

  1. <s:if test="#session.user.username==#paste.user.username && #paste.solve==0">
  2. <span class="jieda-accept" type="accept">
  3. <a href="${pageContext.request.contextPath }/PasteAction_solvePaste?answerid=<s:property value="#answer.id"/>&pasteid=<s:property value="#paste.id"/>" class="layui-btn layui-btn-small">采纳</a>
  4. </span>
  5. </s:if>

  Web层:采纳用户回帖

  1. public String solvePaste() throws Exception{
  2.  
  3. pasteService.solvePasteByIdAndAnswerid(pasteid,paste.getAnswerid());
  4. ActionContext.getContext().put("pasteid", pasteid);
  5.  
  6. return "toDetail";
  7. }

  Service层:获得Web层数据传递到Dao层

  1. public void solvePasteByIdAndAnswerid(String pasteid, String answerid) {
  2. pasteDao.solvePasteByIdAndAnswerid(pasteid,answerid);
  3. }

  Dao层:进行数据的处理

  1. public void solvePasteByIdAndAnswerid(String pasteid, String answerid) {
  2. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  3. String sql ="update paste set solve = 1, answerid = ? where id = ?";
  4. NativeQuery query = session.createSQLQuery(sql);
  5. query.setParameter(1, answerid);
  6. query.setParameter(2, pasteid);
  7. query.executeUpdate();
  8. }

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <%@ taglib uri="/struts-tags" prefix="s"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta charset="utf-8">
  7. <title>问题详情</title>
  8. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  9. <meta name="keywords" content="fly,layui,前端社区">
  10. <meta name="description" content="">
  11. <link rel="stylesheet" href="res/layui/css/layui.css">
  12. <link rel="stylesheet" href="res/css/global.css">
  13. <script src="res/layui/layui.js"></script>
  14. <script src="js/jquery.js"></script>
  15. <style type="text/css" rel="stylesheet">
  16. form {
  17. margin: 0;
  18. }
  19.  
  20. .editor {
  21. margin-top: 5px;
  22. margin-bottom: 5px;
  23. }
  24. </style>
  25.  
  26. </head>
  27. <body style="margin: -2px">
  28. <iframe src="head.jsp" scrolling="no" width="100%" height="110px"></iframe>
  29. <div class="main layui-clear">
  30. <div class="wrap">
  31. <div class="content detail">
  32. <div class="fly-panel detail-box">
  33.  
  34. <h1>
  35. <s:property value="#paste.title" />
  36. </h1>
  37. <div class="fly-tip fly-detail-hint" data-id="">
  38. <span class="fly-tip-stick">置顶帖</span> <span class="jie-admin"> <a href="">点击置顶</a>
  39. </span> <span class="layui-btn layui-btn-mini jie-admin"> <a href="">取消置顶</a>
  40. </span> <span class="jie-admin" type="del" style="margin-left: 20px;"> <a>删除该帖</a>
  41. </span> </span>
  42. <div class="fly-list-hint">
  43. <i class="iconfont" title="回答"></i>
  44. <s:property value="#paste.ansnum" />
  45. </div>
  46. </div>
  47. <div class="detail-about">
  48. <a class="jie-user" href=""> <img src="${pageContext.request.contextPath }/<s:property value="#paste.user.image"/>" alt="头像"> <cite> <s:property value="#paste.user.username" /> <em> <s:property value="#paste.createtime" /> 发布
  49. </em>
  50. </cite>
  51. </a>
  52. <div class="detail-hits" data-id="{{rows.id}}">
  53. <span class="layui-btn layui-btn-mini jie-admin"> <a href="#">已完帖,无法编辑</a>
  54. </span> <span class="layui-btn layui-btn-mini jie-admin" type="collect" data-type="add"> <a id="collectPost">收藏</a>
  55. </span> <span class="layui-btn layui-btn-mini jie-admin layui-btn-danger" type="collect" data-type="add"> <a>取消收藏</a>
  56. </span>
  57.  
  58. </div>
  59. </div>
  60. <div class="detail-body photos" style="margin-bottom: 20px;">
  61. <p>
  62. <s:property value="#paste.content" />
  63. </p>
  64. </div>
  65. </div>
  66.  
  67. <div class="fly-panel detail-box" style="padding-top: 0;">
  68. <a name="comment"></a>
  69. <ul class="jieda photos" id="jieda">
  70. <!-- <li data-id="12" class="jieda-daan"><a name="item-121212121212"></a>
  71. <div class="detail-about detail-about-reply">
  72. <a class="jie-user" href=""> <img src="res/images/uer.jpg" alt=""> <cite> <i>纸飞机</i> <em>(楼主)</em>
  73. <em style="color:#5FB878">(管理员)</em>
  74. </cite>
  75. </a>
  76. <div class="detail-hits">
  77. <span>3分钟前</span>
  78. </div>
  79. <i class="iconfont icon-caina" title="最佳答案"></i>
  80. </div>
  81. <div class="detail-body jieda-body">
  82. <p>么么哒</p>
  83. </div>
  84. <div class="jieda-reply">
  85. <span class="jieda-zan zanok" type="zan"><i class="iconfont icon-zan"></i><em>12</em> </span>
  86. <!-- <div class="jieda-admin">
  87. <span type="del">删除</span>
  88. <span class="jieda-accept" type="accept">采纳</span>
  89. </div>
  90. </div></li> -->
  91.  
  92. <s:iterator value="#answerList" var="answer">
  93. <li data-id="13"><a name="item-121212121212"></a>
  94. <div class="detail-about detail-about-reply">
  95. <a class="jie-user" href=""> <img src="${pageContext.request.contextPath }/<s:property value="#answer.user.image"/>" alt=""> <cite> <i><s:property value="#answer.user.username" /></i> <em style="color: #FF9E3F">活雷锋</em>
  96. </cite>
  97. </a>
  98. <div class="detail-hits">
  99. <span> <s:property value="#answer.anstime" />
  100. </span>
  101. </div>
  102. </div>
  103. <div class="detail-body jieda-body">
  104. <p>
  105. <s:property value="#answer.content" />
  106. </p>
  107. </div>
  108. <div class="jieda-reply">
  109. <span class="jieda-zan" type="zan"><i class="iconfont icon-zan"></i> <em> <s:property value="#answer.agree" /></em> </span>
  110. <div class="jieda-admin">
  111. <s:if test="#session.user.username==#answer.user.username ">
  112. <span type="del"><a href="${pageContext.request.contextPath }/AnswerAction_deleteAnswer?answerid=<s:property value="#answer.id"/>&pasteid=<s:property value="#paste.id"/>" class="layui-btn layui-btn-danger layui-btn-small">删除</a></span>
  113. </s:if>
  114. <s:if test="#session.user.username==#paste.user.username ">
  115. <a href="${pageContext.request.contextPath }/PasteAction_solvePaste?answerid=<s:property value="#answer.id"/>&pasteid=<s:property value="#paste.id"/>" class="layui-btn layui-btn-small">采纳</a>
  116. </s:if>
  117. </div>
  118. </div></li>
  119. </s:iterator>
  120. <s:if test="#answerList.size()==0">
  121. <li class="fly-none">没有任何回答</li>
  122. </s:if>
  123. </ul>
  124. <div class="layui-form layui-form-pane">
  125. <!-- <form action="${pageContext.request.contextPath }/AnswerAction_addAnswer">
  126. <input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>">
  127. <div class="layui-form-item layui-form-text">
  128. <div class="layui-input-block">
  129. <textarea id="L_content" name="content" required lay-verify="required" placeholder="我要回答" class="layui-textarea fly-editor" style="height: 150px;"></textarea>
  130. </div>
  131. </div>
  132. <div class="layui-form-item">
  133. <button class="layui-btn" lay-filter="*" lay-submit>提交回答</button>
  134. </div>
  135. </form> -->
  136. <form action="${pageContext.request.contextPath}/AnswerAction_addAnswer">
  137. <input type="hidden" name="pasteid" value="<s:property value="#paste.id"/>"> <label for="L_title" class="layui-form-label" style="width: 690px; height: 40px;">
  138. <div style="margin-left: -580px">回答问题:</div>
  139. </label>
  140. <div class="layui-form-item layui-form-text">
  141. <div class="layui-input-block">
  142. <div class="editor">
  143. <textarea id="content" name="content" style="width: 690px; height: 300px; visibility: hidden;"></textarea>
  144. </div>
  145. </div>
  146.  
  147. </div>
  148.  
  149. <div class="layui-form-item">
  150. <button class="layui-btn" lay-filter="*" lay-submit>立即发布</button>
  151. </div>
  152. </form>
  153. </div>
  154. </div>
  155. </div>
  156. </div>
  157.  
  158. <div class="edge">
  159. <dl class="fly-panel fly-list-one">
  160. <dt class="fly-panel-title">最近热帖</dt>
  161. <s:iterator value="#glanceoverPageBean.list" var="paste">
  162. <dd>
  163.  
  164. <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
  165. </a> <span> <i class="iconfont"></i> <s:property value="#paste.glanceover" />
  166. </span>
  167. </dd>
  168. </s:iterator>
  169. </dl>
  170.  
  171. <dl class="fly-panel fly-list-one">
  172. <dt class="fly-panel-title">近期热议</dt>
  173. <s:iterator value="#ansnumPageBean.list" var="paste">
  174. <dd>
  175. <a href="${pageContext.request.contextPath }/PasteAction_getDetail?pasteid=<s:property value="#paste.id"/>"> <s:property value="#paste.title" />
  176. </a> <span> <i class="iconfont"></i> <s:property value="#paste.ansnum" />
  177. </span>
  178. </dd>
  179. </s:iterator>
  180. </dl>
  181. </div>
  182. </div>
  183.  
  184. <%-- <script type="text/javascript" charset="utf-8" src="res/js/kindeditor.js"></script>
  185. <script type="text/javascript">
  186. KE.show({
  187. id : 'L_content',
  188. resizeMode : 1,
  189. items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
  190. 'italic', 'underline', 'removeformat', 'justifyleft',
  191. 'justifycenter', 'justifyright', 'insertorderedlist',
  192. 'insertunorderedlist', 'emoticons', 'image', 'link' ]
  193. });
  194. </script> --%>
  195. <script type="text/javascript" charset="utf-8" src="js/kindeditor.js"></script>
  196. <script type="text/javascript">
  197. KE.show({
  198. id : 'content',
  199. resizeMode : 1,
  200. cssPath : './index.css',
  201. items : [ 'fontname', 'fontsize', 'textcolor', 'bgcolor', 'bold',
  202. 'italic', 'underline', 'removeformat', 'justifyleft',
  203. 'justifycenter', 'justifyright', 'insertorderedlist',
  204. 'insertunorderedlist', 'emoticons', 'image', 'link' ]
  205. });
  206. </script>
  207. <script>
  208. layui.cache.page = '';
  209. layui.cache.user = {
  210. username : '游客',
  211. uid : -1,
  212. avatar : '../res/images/avatar/00.jpg',
  213. experience : 83,
  214. sex : '男'
  215. };
  216. layui.config({
  217. version : "2.0.0",
  218. base : '../res/mods/'
  219. }).extend({
  220. fly : 'index'
  221. }).use('fly');
  222. </script>
  223. </body>
  224. </html>

detail.jsp

  实现采纳问题

  1.   <div class="jieda-admin">
  2.     <s:if test="#session.user.username==#answer.user.username ">
  3.       <span type="del"><a href="${pageContext.request.contextPath }/AnswerAction_deleteAnswer?answerid=<s:property value="#answer.id"/>&pasteid=<s:property value="#paste.id"/>" class="layui-btn layui-btn-danger layui-btn-small">删除</a></span>
  4.     </s:if>
  5.     <s:if test="#session.user.username==#paste.user.username ">
  6.       <a href="${pageContext.request.contextPath }/PasteAction_solvePaste?answerid=<s:property value="#answer.id"/>&pasteid=<s:property value="#paste.id"/>" class="layui-btn layui-btn-small">采纳</a>
  7.     </s:if>
  8.   </div>

  Service层

  1. public List<Answer> findAllAnswerByPasteid(String pasteid) {
  2.  
  3. Paste paste = pasteDao.findPasteByIdReturnPaste(pasteid);
  4. List<Answer> answerList = null;
  5. // 判断paste中的solve是否为1
  6. if (paste.getSolve() == 1) {
  7. // 查找最佳答案
  8. Answer answer = answerDao.findAnswerById(paste.getAnswerid());
  9. // 查找所有答案
  10. answerList = answerDao.findAllAnswerByPasteid(pasteid);
  11. // 查找所有答案中包括了最佳答案所以将最佳答案删除
  12. answerList.remove(answer);
  13. // 在头元素中插入最佳答案
  14. answerList.add(0, answer);
  15. } else {
  16. answerList = answerDao.findAllAnswerByPasteid(pasteid);
  17. }
  18.  
  19. return answerList;
  20. }
  1. package com.Gary.service;
  2.  
  3. import java.util.List;
  4.  
  5. import com.Gary.dao.AnswerDao;
  6. import com.Gary.dao.PasteDao;
  7. import com.Gary.domain.Answer;
  8. import com.Gary.domain.Paste;
  9.  
  10. public class AnswerService {
  11.  
  12. private AnswerDao answerDao;
  13. private PasteDao pasteDao;
  14.  
  15. public List<Answer> findAllAnswerByPasteid(String pasteid) {
  16.  
  17. Paste paste = pasteDao.findPasteByIdReturnPaste(pasteid);
  18. List<Answer> answerList = null;
  19. // 判断paste中的solve是否为1
  20. if (paste.getSolve() == 1) {
  21. // 查找最佳答案
  22. Answer answer = answerDao.findAnswerById(paste.getAnswerid());
  23. // 查找所有答案
  24. answerList = answerDao.findAllAnswerByPasteid(pasteid);
  25. // 查找所有答案中包括了最佳答案所以将最佳答案删除
  26. answerList.remove(answer);
  27. // 在头元素中插入最佳答案
  28. answerList.add(0, answer);
  29. } else {
  30. answerList = answerDao.findAllAnswerByPasteid(pasteid);
  31. }
  32.  
  33. return answerList;
  34. }
  35.  
  36. public void addAnswer(Answer answer, Paste paste) {
  37.  
  38. paste.setAnsnum(paste.getAnsnum() + 1);
  39. answerDao.addAnswer(answer);
  40. }
  41.  
  42. public void deleteAnswerById(String answerid, Paste paste) {
  43. paste.setAnsnum(paste.getAnsnum()-1);
  44. answerDao.deleteAnswerById(answerid);
  45. }
  46.  
  47. public AnswerDao getAnswerDao() {
  48. return answerDao;
  49. }
  50.  
  51. public void setAnswerDao(AnswerDao answerDao) {
  52. this.answerDao = answerDao;
  53. }
  54.  
  55. public PasteDao getPasteDao() {
  56. return pasteDao;
  57. }
  58.  
  59. public void setPasteDao(PasteDao pasteDao) {
  60. this.pasteDao = pasteDao;
  61. }
  62. }

AnswerService.java

  Dao层

  1. public Answer findAnswerById(String answerid) {
  2. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  3. String sql = "select * from answer where id = ?";
  4. NativeQuery query = session.createSQLQuery(sql);
  5. query.addEntity(Answer.class);
  6. query.setParameter(1, answerid);
  7. Answer result = (Answer) query.uniqueResult();
  8. return result;
  9. }
  1. package com.Gary.dao;
  2.  
  3. import java.util.List;
  4.  
  5. import org.hibernate.Session;
  6. import org.hibernate.query.NativeQuery;
  7. import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
  8.  
  9. import com.Gary.domain.Answer;
  10.  
  11. public class AnswerDao extends HibernateDaoSupport{
  12.  
  13. public void addAnswer(Answer answer) {
  14. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  15. session.save(answer);
  16. }
  17.  
  18. public List<Answer> findAllAnswerByPasteid(String pasteid) {
  19. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  20. String sql = "select * from answer where pasteid = ?";
  21. NativeQuery query = session.createSQLQuery(sql);
  22. query.addEntity(Answer.class);
  23. query.setParameter(1, pasteid);
  24. List<Answer> list = query.list();
  25. return list;
  26. }
  27.  
  28. public void deleteAnswerById(String answerid) {
  29. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  30. String sql = "delete from answer where id = ?";
  31. NativeQuery query = session.createSQLQuery(sql);
  32. query.setParameter(1, answerid);
  33. query.executeUpdate();
  34.  
  35. //session.delete(answerid, Answer.class);
  36.  
  37. }
  38.  
  39. public Answer findAnswerById(String answerid) {
  40. Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
  41. String sql = "select * from answer where id = ?";
  42. NativeQuery query = session.createSQLQuery(sql);
  43. query.addEntity(Answer.class);
  44. query.setParameter(1, answerid);
  45. Answer result = (Answer) query.uniqueResult();
  46. return result;
  47. }
  48.  
  49. }

AnswerDao.java

  发现当采纳问题后,应该隐藏其它问题的采纳按钮,已采纳的问题也不可删除

  1.     <s:if test="#session.user.username==#answer.user.username && #paste.answerid!=#answer.id">
  2.       <span type="del">
  3.         <a href="${pageContext.request.contextPath }/AnswerAction_deleteAnswer?answerid=<s:property value="#answer.id"/>&pasteid=<s:property value="#paste.id"/>" class="layui-btn layui-btn-danger layui-btn-small">删除</a>
  4.       </span>
  5.     </s:if>
  6.     <s:if test="#session.user.username==#paste.user.username && #paste.solve==0">
  7.       <span class="jieda-accept" type="accept">
  8.     <a href="${pageContext.request.contextPath }/PasteAction_solvePaste?answerid=<s:property value="#answer.id"/>&pasteid=<s:property value="#paste.id"/>" class="layui-btn layui-btn-small">采纳</a>
  9.     </span>
  10.   </s:if>

  添加采纳金币模块

  1.   <s:if test="#session.user.username==#paste.user.username && #paste.solve==0">
  2.     <span class="jieda-accept" type="accept">
  3.       <a href="${pageContext.request.contextPath }/PasteAction_solvePaste?answerid=<s:property value="#answer.id"/>&pasteid=<s:property value="#paste.id"/>" class="layui-btn layui-btn-small">采纳</a>
  4.     </span>
  5.   </s:if>

  Service层

  1. public void solvePasteByIdAndAnswerid(String pasteid, String answerid) {
  2. //给回复的人添加金币
  3. Paste paste = pasteDao.findPasteByIdReturnPaste(pasteid);
  4. //通过answerid查找user
  5. Answer answer = answerDao.findAnswerById(answerid);
  6. //通过userid找user对象
  7. //User user = userDao.finduserByIdReturnUser(answer.getUser().getId());
  8. //获得answer下的user对象(持久化数据类型)
  9. User user = answer.getUser();
  10. //因为是持久化类型对象,即可直接修改属性,同步到数据库
  11. user.setCoin(user.getCoin()+paste.getOffer());
  12. //解决问题
  13. pasteDao.solvePasteByIdAndAnswerid(pasteid,answerid);
  14. }
  1. package com.Gary.service;
  2.  
  3. import java.util.List;
  4.  
  5. import com.Gary.dao.AnswerDao;
  6. import com.Gary.dao.PasteDao;
  7. import com.Gary.dao.UserDao;
  8. import com.Gary.domain.Answer;
  9. import com.Gary.domain.Paste;
  10. import com.Gary.domain.User;
  11. import com.Gary.utils.PageBean;
  12.  
  13. public class PasteService {
  14.  
  15. private PasteDao pasteDao;
  16. private AnswerDao answerDao;
  17. private UserDao userDao;
  18.  
  19. public void solvePasteByIdAndAnswerid(String pasteid, String answerid) {
  20. //给回复的人添加金币
  21. Paste paste = pasteDao.findPasteByIdReturnPaste(pasteid);
  22. //通过answerid查找user
  23. Answer answer = answerDao.findAnswerById(answerid);
  24. //通过userid找user对象
  25. //User user = userDao.finduserByIdReturnUser(answer.getUser().getId());
  26. //获得answer下的user对象(持久化数据类型)
  27. User user = answer.getUser();
  28. //因为是持久化类型对象,即可直接修改属性,同步到数据库
  29. user.setCoin(user.getCoin()+paste.getOffer());
  30. //解决问题
  31. pasteDao.solvePasteByIdAndAnswerid(pasteid,answerid);
  32. }
  33.  
  34. public AnswerDao getAnswerDao() {
  35. return answerDao;
  36. }
  37.  
  38. public void setAnswerDao(AnswerDao answerDao) {
  39. this.answerDao = answerDao;
  40. }
  41.  
  42. public UserDao getUserDao() {
  43. return userDao;
  44. }
  45.  
  46. public void setUserDao(UserDao userDao) {
  47. this.userDao = userDao;
  48. }
  49.  
  50. public Paste findPasteByIdReturnPaste(String pasteid) {
  51.  
  52. //pasteDao.addPasteGlanceover(pasteid);
  53. //数据库SQL语句:update paste set glanceover = glanceover+1 where id = ?;
  54. Paste paste = pasteDao.findPasteByIdReturnPaste(pasteid);
  55. paste.setGlanceover(paste.getGlanceover()+1);
  56. return paste;
  57. }
  58.  
  59. public PageBean getGlanceoverPageBean(Integer currentPage) {
  60. Integer totalCount = pasteDao.findAllPasteNum();
  61. PageBean glanceoverPageBean = new PageBean(currentPage, totalCount, 8);
  62. List<Paste> list = pasteDao.getGlanceoverPageList();
  63. glanceoverPageBean.setList(list);
  64.  
  65. return glanceoverPageBean;
  66. }
  67.  
  68. public PageBean getPastePageBean(Integer currentPage) {
  69.  
  70. Integer totalCount = pasteDao.findAllPasteNum();
  71. PageBean pageBean = new PageBean(currentPage,totalCount,8);
  72. List<Paste> list = pasteDao.getPastePageList(pageBean.getStart(),pageBean.getPageSize());
  73. pageBean.setList(list);
  74.  
  75. return pageBean;
  76. }
  77.  
  78. public PasteDao getPasteDao() {
  79. return pasteDao;
  80. }
  81.  
  82. public List<Paste> findAllPaste() {
  83.  
  84. return pasteDao.findAllPaste();
  85.  
  86. }
  87.  
  88. public void setPasteDao(PasteDao pasteDao) {
  89. this.pasteDao = pasteDao;
  90. }
  91.  
  92. public void addPaste(Paste paste) {
  93.  
  94. pasteDao.addPaste(paste);
  95.  
  96. }
  97.  
  98. public PageBean getAnsnumPageBean(Integer currentPage) {
  99. //获得所有的帖子数目
  100. Integer totalCount = pasteDao.findAllPasteNum();
  101. //创建PageBean
  102. PageBean ansnumPageBean = new PageBean(currentPage, totalCount, 8);
  103. //得到List
  104. List<Paste> list = pasteDao.getAnsnumPageList();
  105. //封装List
  106. ansnumPageBean.setList(list);
  107. return ansnumPageBean;
  108. }
  109.  
  110. }

AnswerDao.java

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:tx="http://www.springframework.org/schema/tx"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/context
  10. http://www.springframework.org/schema/context/spring-context.xsd
  11. http://www.springframework.org/schema/aop
  12. http://www.springframework.org/schema/aop/spring-aop.xsd
  13. http://www.springframework.org/schema/tx
  14. http://www.springframework.org/schema/tx/spring-tx.xsd">
  15.  
  16. <!-- 配置数据源 -->
  17. <bean name="dataSource"
  18. class="com.mchange.v2.c3p0.ComboPooledDataSource">
  19. <property name="jdbcUrl" value="jdbc:mysqL:///garyssh_forum"></property>
  20. <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
  21. <property name="user" value="root"></property>
  22. <property name="password" value="123456"></property>
  23. </bean>
  24.  
  25. <!-- 配置sessionFactory -->
  26. <bean name="sessionFactory"
  27. class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
  28. <property name="dataSource" ref="dataSource"></property>
  29. <property name="hibernateProperties">
  30. <props>
  31. <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
  32. <prop key="hibernate.hbm2ddl.auto">update</prop>
  33. <prop key="hibernate.show_sqp">true</prop>
  34. <prop key="hibernate.format_sql">true</prop>
  35. </props>
  36. </property>
  37.  
  38. <property name="mappingDirectoryLocations"
  39. value="classpath:com/Gary/domain"></property>
  40.  
  41. </bean>
  42.  
  43. <!-- 配置事务的核心管理器 -->
  44. <bean name="transactionManager"
  45. class="org.springframework.orm.hibernate5.HibernateTransactionManager">
  46. <property name="sessionFactory" ref="sessionFactory"></property>
  47. </bean>
  48.  
  49. <!-- 通知 -->
  50. <tx:advice id="advice"
  51. transaction-manager="transactionManager">
  52. <tx:attributes>
  53. <tx:method name="*" />
  54. </tx:attributes>
  55. </tx:advice>
  56.  
  57. <!-- 织入 -->
  58. <aop:config>
  59. <!-- 切入点 -->
  60. <aop:pointcut
  61. expression="execution(* com.Gary.service.*.*(..))" id="pc" />
  62. <!-- 配置切面 切入点+通知 -->
  63. <aop:advisor advice-ref="advice" pointcut-ref="pc" />
  64. </aop:config>
  65.  
  66. <!-- 配置Action -->
  67. <bean name="userAction" class="com.Gary.web.UserAction" scope="prototype">
  68. <property name="userService" ref="userService"></property>
  69. </bean>
  70. <bean name="pasteAction" class="com.Gary.web.PasteAction" scope="prototype">
  71. <property name="pasteService" ref="pasteService"></property>
  72. <property name="answerService" ref="answerService"></property>
  73. </bean>
  74. <bean name="getDataAction" class="com.Gary.web.GetDataAction" scope="prototype">
  75. <property name="pasteService" ref="pasteService"></property>
  76. <property name="userService" ref="userService"></property>
  77. </bean>
  78. <bean name="answerAction" class="com.Gary.web.AnswerAction" scope="prototype">
  79. <property name="answerService" ref="answerService"></property>
  80. <property name="pasteService" ref="pasteService"></property>
  81. </bean>
  82.  
  83. <!-- 配置Service -->
  84. <bean name="userService" class="com.Gary.service.UserService">
  85. <property name="userDao" ref="userDao"></property>
  86. </bean>
  87. <bean name="pasteService" class="com.Gary.service.PasteService">
  88. <property name="pasteDao" ref="pasteDao"></property>
  89. <property name="userDao" ref="userDao"></property>
  90. <property name="answerDao" ref="answerDao"></property>
  91. </bean>
  92. <bean name="answerService" class="com.Gary.service.AnswerService">
  93. <property name="answerDao" ref="answerDao"></property>
  94. <property name="pasteDao" ref="pasteDao"></property>
  95. </bean>
  96.  
  97. <!-- 配置Dao -->
  98. <bean name="userDao" class="com.Gary.dao.UserDao">
  99. <property name="sessionFactory" ref="sessionFactory"></property>
  100. </bean>
  101. <bean name="pasteDao" class="com.Gary.dao.PasteDao">
  102. <property name="sessionFactory" ref="sessionFactory"></property>
  103. </bean>
  104. <bean name="answerDao" class="com.Gary.dao.AnswerDao">
  105. <property name="sessionFactory" ref="sessionFactory"></property>
  106. </bean>
  107.  
  108. </beans>

applicationContext.xml

JavaWeb_(SSH论坛)_五、帖子模块的更多相关文章

  1. JavaWeb_(SSH论坛)_七、辅助模块

    基于SSH框架的小型论坛项目 一.项目入门 传送门 二.框架整合 传送门 三.用户模块 传送门 四.页面显示 传送门 五.帖子模块 传送门 六.点赞模块 传送门 七.辅助模块 传送门 为避免代码冗余, ...

  2. JavaWeb_(SSH论坛)_六、点赞模块

    基于SSH框架的小型论坛项目 一.项目入门 传送门 二.框架整合 传送门 三.用户模块 传送门 四.页面显示 传送门 五.帖子模块 传送门 六.点赞模块 传送门 七.辅助模块 传送门 联合主键 创建p ...

  3. JavaWeb_(SSH论坛)_三、用户模块

    基于SSH框架的小型论坛项目 一.项目入门 传送门 二.框架整合 传送门 三.用户模块 传送门 四.页面显示 传送门 五.帖子模块 传送门 六.点赞模块 传送门 七.辅助模块 传送门 User表 id ...

  4. JavaWeb_(SSH论坛)_一、项目入门

    基于SSH框架的小型论坛项目 一.项目入门 传送门 二.框架整合 传送门 三.用户模块 传送门 四.页面显示 传送门 五.帖子模块 传送门 六.点赞模块 传送门 七.辅助模块 传送门 项目已上传至gi ...

  5. JavaWeb_(SSH论坛)_四、页面显示

    基于SSH框架的小型论坛项目 一.项目入门 传送门 二.框架整合 传送门 三.用户模块 传送门 四.页面显示 传送门 五.帖子模块 传送门 六.点赞模块 传送门 七.辅助模块 传送门 帖子表与回复表 ...

  6. JavaWeb_(SSH论坛)_二、框架整合

    基于SSH框架的小型论坛项目 一.项目入门 传送门 二.框架整合 传送门 三.用户模块 传送门 四.页面显示 传送门 五.帖子模块 传送门 六.点赞模块 传送门 七.辅助模块 传送门 导入Jar包 导 ...

  7. JavaWeb_(Mybatis框架)输入和输出参数_五

    系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...

  8. discuz 帖子模块用到的表及自动发帖函数

    最近在做一个discuz的插件,由于需要程序自动生成并调用discuz已经存在插件的帖子.然而这就相当于自动发帖的功能了.网上找了一下,大部分都是通过curl模拟登陆,模拟发帖的,这显然不满足我的要求 ...

  9. python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。

    本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...

随机推荐

  1. Java回调实现异步

    在正常的业务中使用同步线程,如果服务器每处理一个请求,就创建一个线程的话,会对服务器的资源造成浪费.因为这些线程可能会浪费时间在等待网络传输,等待数据库连接等其他事情上,真正处理业务逻辑的时间很短很短 ...

  2. 多表表与表关系 增删改查 admin

    今日内容 多表表与表关系 增删改查表数据 admin 多表操作 表与表关系 默认指向主键 可能是隐藏主键 djamgo1.1默认级联(models. SET NULL解除级联) 一对一 先建立少的一方 ...

  3. Java Web开发技术教程入门-JavaBean组件与Servlet

    补更:阅战阅勇第7/8/9Days笔记 昨天我们了解了JDBC技术的一些日常操作,对于数据库而言,不仅仅的只有"增,删,改,查".博主觉得最重要的是SQL语句的优化,一个" ...

  4. Codeforces 1196F. K-th Path

    传送门 发现到 $K$ 不大,考虑有什么和 $K$ 有关的结论 发现答案似乎只会经过前 $K$ 小的边,如果边权第 $K$ 小的边有多条那么可以任意取 证明挺显然的吧,首先如果走了边权排名大于 $K$ ...

  5. 使用jdbc操作ClickHouse

    使用jdbc操作ClickHouse 2018年07月01日 01:33:00 狮子头儿 阅读数 10501   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处 ...

  6. eclipse+maven搭建springboot项目入门

    一.下载jdk,例如(jdk1.8.171) 安装(注意仅仅安装jdk就可以了,不要安装jre,设置JAVA_HOME,配置jdk环境变量) 二.下载maven(apache-maven-3.5.3- ...

  7. sql server len函数

    len函数 --返回字符表达式中的字符数 --如果字符串中包含前导空格和尾随空格,则函数将它们包含在内 --LEN对相同的单字节和双字节字符串返回相同的值 --示例:select LEN('no'), ...

  8. golang(2):基本数据类型和操作符

    1). 文件名 & 关键字 & 标识符 . 所有go源码都以 .go 结尾 . 标识符以字母或下划线开头,大小写敏感 . _ 是特殊标识符,用来忽略结果 . 保留关键字 golang  ...

  9. 关于记录log日志的几种方法

    最近在记录日志的时候总结了几种方式: 1.使用log4j2记录 2.使用log4j记录 3.使用logback配置,记录前使用 private  final Logger logger = Logge ...

  10. chrome 浏览器安装 postman

    chrome 浏览器安装 postman(插件下载见文章末尾) 1.安装方法 将下载的crx插件拖拽到chrome浏览器即可安装成功. 2.特殊情况 问题: chrome73版本后拖拽安装chrome ...