国内流行的内容管理系统(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.

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