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

181 lines
7.0KB

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