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

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