国内流行的内容管理系统(CMS)多端全媒体解决方案 https://www.dedebiz.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

238 lines
7.4KB

  1. {dede:comment text="内容评论模块"/}
  2. <div class="comment mt-3 mb-3">
  3. <h4>发表评论</h4>
  4. <div id="feedback-alert">
  5. </div>
  6. <div class="content">
  7. <textarea cols="60" id="iptMsg" name="msg" rows="5" class="form-control"
  8. placeholder="说点什么吧,请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论"></textarea>
  9. </div>
  10. <div class="post">
  11. <div class="dcmp-userinfo" id="_ajax_feedback">
  12. <div class="form-row">
  13. <div class="col-md-6 mb-3">
  14. <label for="iptUsername">用户名</label>
  15. <input type="text" class="form-control" id="iptUsername">
  16. </div>
  17. <div class="col-md-6 mb-3 areaValidate" style="display: none;">
  18. <label for="iptValidate">验证码</label>
  19. <div class="input-group">
  20. <input type="text" class="form-control" id="iptValidate" style="text-transform:uppercase;">
  21. <img src="{dede:global.cfg_cmspath/}/plus/vdimgck.php" id="validateimg" style="cursor:pointer;"
  22. onclick="this.src='{dede:global.cfg_cmspath/}/plus/vdimgck.php?'+new Date().getTime()+Math.round(Math.random() * 10000)"
  23. title="点击我更换图片" alt="点击我更换图片" />
  24. </div>
  25. </div>
  26. </div>
  27. <div class="form-group">
  28. <div class="form-check">
  29. <input type="checkbox" value="1" name="notuser" id="iptAny" class="form-check-input" />
  30. <label class="form-check-label" for="iptAny">
  31. 匿名评论?
  32. </label>
  33. </div>
  34. </div>
  35. </div>
  36. <div class="dcmp-submit">
  37. <button class="btn btn-success" type="button" onClick='SendFeedback()'>发表评论</button>
  38. </div>
  39. </div>
  40. <div class="feedbacks">
  41. {dede:feedback}
  42. <div class="media">
  43. <img class="face" src="[field:face/]" class="mr-3">
  44. <div class="media-body">
  45. <div class="feedback-content">[field:msg /]</div>
  46. <div class="feedback-infos">
  47. <span class="feedback-basic">
  48. [field:username function="(@me=='guest' ? '游客' : @me)"/]
  49. <small>[field:dtime function="MyDate('Y-m-d',@me)"/]</small>
  50. <a href="javascript:ReplyFeedback([field:id/])">[回复]</a> <a href="javascript:LoadReplyFeedbacks([field:id/])">[field:replycount /]条回复</a>
  51. </span>
  52. <div class="feedback-action">
  53. <a href="javascript:GoodFeedback([field:id/], [field:good/])"><span id="feedbackGood[field:id/]">[field:good/]</span> <i class="fa fa-thumbs-up" aria-hidden="true"></i></a>
  54. </div>
  55. </div>
  56. <div class="_feedback_reply mt-1" for="[field:id/]">
  57. </div>
  58. <div class="feedback_replies" for="[field:id/]">
  59. </div>
  60. </div>
  61. </div>
  62. {/dede:feedback}
  63. </div>
  64. </div>
  65. <style>
  66. .feedbacks .face {
  67. width: 36px;
  68. height: 36px;
  69. border-radius: 50%;
  70. border: solid 1px #DDD;
  71. }
  72. .feedbacks .media {
  73. border-bottom: solid 1px #DDD;
  74. padding-top: 10px;
  75. }
  76. .feedbacks .feedback_replies .media {
  77. border-top: solid 1px #DDD;
  78. border-bottom:none;
  79. }
  80. .feedbacks .media-body {
  81. padding: 0 1em .5em 1em;
  82. }
  83. .feedbacks .media-body small{
  84. color: #999;
  85. }
  86. .feedbacks .feedback-action {
  87. float: right;
  88. }
  89. .feedbacks .feedback-basic a,.feedbacks .feedback-action a {
  90. color: #F1813F;
  91. font-size: 14px;
  92. }
  93. .feedbacks ._feedback_reply .alert {
  94. margin-bottom: 0;
  95. }
  96. @media only screen and (max-width: 576px) {
  97. .feedbacks .feedback-action {
  98. float: none;
  99. }
  100. }
  101. </style>
  102. <script async>
  103. // 发表评论
  104. function SendFeedback() {
  105. let feedback = {
  106. action: "send",
  107. comtype: "comments",
  108. aid: "{dede:field name='id'/}",
  109. msg: $("#iptMsg").val(),
  110. username: $("#iptUsername").val(),
  111. validate: $("#iptValidate").val(),
  112. notuser: $("#iptAny").is(":checked") ? "1" : "",
  113. };
  114. $.post("{dede:field name='phpurl'/}/feedback.php", feedback, function (data) {
  115. let result = JSON.parse(data);
  116. if (result.code === 200) {
  117. ShowAlert("#feedback-alert", result.msg, "success");
  118. $("#iptMsg").val("");
  119. $("#iptValidate").val("");
  120. ($("#iptUsername").attr("disabled") !== "disabled") && $("#iptUsername").val("");
  121. $("#validateimg").attr("src", '{dede:global.cfg_cmspath/}/plus/vdimgck.php?' + new Date().getTime() + Math.round(Math.random() * 10000));
  122. } else {
  123. ShowAlert("#feedback-alert", `评论失败:${result.msg}`, "danger");
  124. $("#validateimg").attr("src", '{dede:global.cfg_cmspath/}/plus/vdimgck.php?' + new Date().getTime() + Math.round(Math.random() * 10000));
  125. }
  126. });
  127. }
  128. // 进行回复,回复必须登录
  129. function SendReplyFeedback(fid) {
  130. let content = $(`._feedback_reply[for="${fid}"]`).find(".iptReplyContent").val();
  131. let reply = {
  132. action : "send",
  133. comtype : "reply",
  134. fid : fid,
  135. aid : "{dede:field name='id'/}",
  136. msg : content,
  137. }
  138. $.post("{dede:field name='phpurl'/}/feedback.php", reply, function (data) {
  139. let result = JSON.parse(data);
  140. if (result.code === 200) {
  141. ShowAlert(`._feedback_reply[for="${fid}"]`, result.msg, "success");
  142. } else {
  143. ShowAlert(`._feedback_reply[for="${fid}"]`, `评论失败:${result.msg}`, "danger");
  144. }
  145. })
  146. $(`._feedback_reply[for="${fid}"]`).find(".btnSend").attr("disabled", "disabled");
  147. }
  148. // 回复某个评论
  149. function ReplyFeedback(fid) {
  150. let replyPannel = `<div class="form-group mt-2">
  151. <div class="input-group">
  152. <input type="text" class="form-control iptReplyContent">
  153. <button class="btn btn-success btnSend" type="button" onClick='SendReplyFeedback(${fid})'>回复</button>
  154. </div>
  155. </div>`;
  156. $.get("{dede:global.cfg_cmsurl/}/member/ajax_loginsta.php?format=json", function(data) {
  157. let result = JSON.parse(data);
  158. if (result.code !== 200) {
  159. $(`._feedback_reply`).html("");
  160. ShowAlert(`._feedback_reply[for="${fid}"]`,
  161. '回复需要登录会员中心,您可以<a href="{dede:global.cfg_cmsurl/}/member/login.php">[点击登录]</a>后再来回复。', 'warning', 5000);
  162. } else {
  163. $(`._feedback_reply`).html("");
  164. $(`._feedback_reply[for="${fid}"]`).html(replyPannel);
  165. }
  166. });
  167. $(`._feedback_reply[for="${fid}"]`).html('<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>');
  168. }
  169. // 加载回复评论
  170. function LoadReplyFeedbacks(fid) {
  171. $(`.feedback_replies[for="${fid}"]`).html('<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>');
  172. $.get("{dede:field name='phpurl'/}/feedback.php", {
  173. "aid" : "{dede:field name='id'/}",
  174. "fid" : fid,
  175. }, function (data) {
  176. let result = JSON.parse(data);
  177. let tpl = `
  178. <div class="media">
  179. <img class="face" src="~face~">
  180. <div class="media-body">
  181. <div class="feedback-content">~msg~</div>
  182. <div class="feedback-infos">
  183. <span class="feedback-basic">
  184. ~username~
  185. <small>~dtimestr~</small>
  186. </span>
  187. <div class="feedback-action">
  188. <a href="javascript:GoodFeedback(~id~, ~good~)"><span id="feedbackGood~id~">~good~</span> <i class="fa fa-thumbs-up" aria-hidden="true"></i></a>
  189. </div>
  190. </div>
  191. </div>
  192. </div>
  193. `;
  194. if (result.code === 200) {
  195. $(`.feedback_replies[for="${fid}"]`).html("");
  196. for (let i = 0; i < result.data.length; i++) {
  197. const feedback = result.data[i];
  198. let rs = tpl;
  199. for (const key in feedback) {
  200. if (feedback.hasOwnProperty(key)) {
  201. rs = rs.replace(new RegExp(`~${key}~`,"gm"), feedback[key])
  202. }
  203. }
  204. $(`.feedback_replies[for="${fid}"]`).append(rs);
  205. }
  206. }
  207. })
  208. }
  209. // 赞
  210. function GoodFeedback(fid, g) {
  211. let good = {
  212. action : "send",
  213. feedbacktype : "good",
  214. good : g,
  215. fid : fid,
  216. }
  217. $.post("{dede:field name='phpurl'/}/feedback.php", good, function (data) {
  218. let result = JSON.parse(data);
  219. $(`#feedbackGood${fid}`).html(result.data);
  220. })
  221. }
  222. </script>