message.vue 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. <!-- -->
  2. <template>
  3. <div
  4. v-loading="loading"
  5. element-loading-text="拼命加载中"
  6. element-loading-spinner="el-icon-loading"
  7. element-loading-background="rgba(0, 0, 0, 0.8)"
  8. class="message_box"
  9. :style="'height:' + fullHeight + 'px'"
  10. >
  11. <!-- 头部 -->
  12. <div class="message_box_head">
  13. <!-- 返回图标 -->
  14. <div class="head_div" @click="goBack()">
  15. <img src="../../assets/image/return.png" alt class="head_div_img" />
  16. </div>
  17. <!-- 标题 -->
  18. <div class="head_title">
  19. <span class="head_title_text">留言列表</span>
  20. </div>
  21. <!-- 添加 -->
  22. <div class="head_add">
  23. <img @click="add()" src="../../assets/image/add.png" alt class="add_img" />
  24. </div>
  25. </div>
  26. <mescroll-vue ref="mescroll" :down="mescrollDown" :up="mescrollUp" @init="mescrollInit">
  27. <!-- 列表 -->
  28. <ul class="message_box_ul" v-if="listShow">
  29. <li
  30. class="message_box_li"
  31. @click="xiangqi($event, index)"
  32. v-for="(item, index) in this.redata"
  33. :key="index"
  34. >
  35. <div class="message_box_data_box">
  36. <!-- 用户 -->
  37. <div class="message_box_data_user">用户:</div>
  38. <!-- 内容 -->
  39. <div
  40. class="message_box_data_text"
  41. >{{ item.user_remark === null || item.user_remark === '' ? item.username : item.user_remark | ellipsis }}</div>
  42. <!-- 未回复 -->
  43. <div class="message_box_data_meg">{{ item.store !== null ? '已回复' : '未回复' }}</div>
  44. </div>
  45. <!-- 时间 -->
  46. <div class="message_box_time">{{ item.time }}</div>
  47. <!-- 线 -->
  48. <div class="message_box_wire"></div>
  49. </li>
  50. </ul>
  51. <!-- 暂无数据 -->
  52. <div class="message_box_judge" id="empty" v-else>
  53. <img src="../../assets/image/wu.png" alt class="message_box_judge_img" />
  54. <div class="message_box_judge_text">抱歉,暂无留言</div>
  55. </div>
  56. </mescroll-vue>
  57. </div>
  58. </template>
  59. <script>
  60. // 引入mescroll的vue组件
  61. import MescrollVue from "mescroll.js/mescroll.vue";
  62. export default {
  63. components: {
  64. MescrollVue // 注册mescroll组件
  65. },
  66. //限时数据文本的字数限时
  67. filters: {
  68. ellipsis(value) {
  69. if (!value) return "";
  70. if (value.length > 7) {
  71. return value.slice(0, 7) + "...";
  72. }
  73. return value;
  74. }
  75. },
  76. data() {
  77. //这里存放数据
  78. return {
  79. listShow: true, //数据暂空判断
  80. loading: true, //加载
  81. fullHeight: document.documentElement.clientHeight,
  82. redata: [], //后端数据
  83. //上拉加载下拉刷新
  84. mescroll: null, // mescroll实例对象
  85. mescrollDown: {}, //下拉刷新的配置. (如果下拉刷新和上拉加载处理的逻辑是一样的,则mescrollDown可不用写了)
  86. mescrollUp: {
  87. // 上拉加载的配置.
  88. callback: this.upCallback, // 上拉回调,此处简写; 相当于 callback: function(page, mescroll) { }
  89. //以下是一些常用的配置,当然不写也可以的.
  90. page: {
  91. num: 0, //当前页 默认0,回调之前会加1; 即callback(page)会从1开始
  92. size: 10 //每页数据条数,默认10
  93. },
  94. isBounce: true, //根据记录的滚动条高度回弹
  95. htmlNodata: '<p class="upwarp-nodata">-- 已经到底了! --</p>',
  96. noMoreSize: 10, //如果列表已无数据,可设置列表的总数量要大于5才显示无更多数据;
  97. // 避免列表数据过少(比如只有一条数据),显示无更多数据会不好看
  98. // 这就是为什么无更多数据有时候不显示的原因
  99. toTop: {
  100. //回到顶部按钮
  101. src:
  102. "http://pic.51yuansu.com/pic3/cover/00/65/23/5896fa4bc81fc_610.jpg", //图片路径,默认null,支持网络图
  103. offset: 800 //列表滚动1000px才显示回到顶部按钮
  104. },
  105. empty: {
  106. //列表第一页无任何数据时,显示的空提示布局; 需配置warpId才显示
  107. warpId: "xxid", //父布局的id (1.3.5版本支持传入dom元素)
  108. icon: "./static/mescroll/mescroll-empty.png", //图标,默认null,支持网络图
  109. tip: "暂无相关数据~" //提示
  110. },
  111. onScroll: function(mescroll, y, isUp) {
  112. //监听滚动条
  113. // console.log(y);
  114. },
  115. lazyLoad: {
  116. use: true // 是否开启懒加载,默认false
  117. }
  118. }
  119. };
  120. },
  121. beforeRouteEnter(to, from, next) {
  122. // 如果没有配置顶部按钮或isBounce,则beforeRouteEnter不用写
  123. next(vm => {
  124. // 滚动到原来的列表位置,恢复顶部按钮和isBounce的配置
  125. vm.$refs.mescroll && vm.$refs.mescroll.beforeRouteEnter();
  126. });
  127. },
  128. beforeRouteLeave(to, from, next) {
  129. // 如果没有配置顶部按钮或isBounce,则beforeRouteLeave不用写
  130. // 记录列表滚动的位置,隐藏顶部按钮和isBounce的配置
  131. this.$refs.mescroll && this.$refs.mescroll.beforeRouteLeave();
  132. next();
  133. },
  134. //监听属性 类似于data概念
  135. computed: {},
  136. //监控data中的数据变化
  137. watch: {
  138. fullHeight(val) {
  139. //监控浏览器高度变化
  140. if (!this.timer) {
  141. this.fullHeight = val;
  142. this.timer = true;
  143. let that = this;
  144. setTimeout(function() {
  145. //防止过度调用监测事件,导致卡顿
  146. that.timer = false;
  147. }, 400);
  148. }
  149. }
  150. },
  151. //方法集合
  152. methods: {
  153. mescrollInit(mescroll) {
  154. this.mescroll = mescroll; // 如果this.mescroll对象没有使用到,则mescrollInit可以不用配置
  155. },
  156. // 上拉回调 page = {num:1, size:10}; num:当前页 ,默认从1开始; size:每页数据条数,默认10
  157. upCallback(page, mescroll) {
  158. let _this = this;
  159. this.$axios({
  160. method: "get",
  161. url: "http://192.168.1.8:8002/check_leaving",
  162. params: {
  163. page: _this.mescrollUp.page.num
  164. }
  165. })
  166. .then(res => {
  167. _this.loading = false;
  168. let arr = res.data.dat;
  169. // 如果是第一页需手动置空列表
  170. if (page.num === 1) this.redata = [];
  171. // 把请求到的数据添加到列表
  172. this.redata = this.redata.concat(arr);
  173. // 数据渲染成功后,隐藏下拉刷新的状态
  174. _this.loading = false;
  175. this.$nextTick(() => {
  176. mescroll.endSuccess(arr.length);
  177. });
  178. //判读是否有数据
  179. if (res.data.dat.length === 0) {
  180. _this.listShow = false;
  181. } else if (res.data.dat.length !== 0) {
  182. _this.listShow = true;
  183. // _this.redata = res.data.dat; //全部数据
  184. }
  185. })
  186. .catch(error => {
  187. _this.loading = false;
  188. mescroll.endErr();
  189. });
  190. },
  191. //动态获取浏览器高度
  192. get_boderHeight() {
  193. const that = this;
  194. window.onresize = () => {
  195. return (() => {
  196. window.fullHeight = document.documentElement.clientHeight;
  197. that.fullHeight = window.fullHeight;
  198. })();
  199. };
  200. },
  201. //点击返回到主页
  202. goBack() {
  203. let _this = this;
  204. // _this.$router.push("/person");
  205. _this.$router.replace("/person");
  206. location.reload();
  207. },
  208. //点击进入新增留言页面
  209. add() {
  210. let _this = this;
  211. _this.$router.push("/addMeg");
  212. },
  213. //点击进入反馈详情页面
  214. xiangqi(e, index) {
  215. let _this = this;
  216. if (
  217. e.target.className === "message_box_li" ||
  218. e.target.className === "message_box_time" ||
  219. e.target.className === "message_box_data_box" ||
  220. e.target.className === "message_box_data_text" ||
  221. e.target.className === "message_box_data_meg"
  222. ) {
  223. _this.current = index;
  224. //获取点击对象
  225. let el = e.currentTarget;
  226. let listId = _this.redata[index].id;
  227. let listDistinction = _this.redata[index].ret;
  228. localStorage.setItem("messageID", listId); //保存ID
  229. localStorage.setItem("messageRet", listDistinction); //保存数据中的ret
  230. _this.$router.replace("/megXq");
  231. // _this.$router.push("/megXq");
  232. }
  233. }
  234. },
  235. //生命周期 - 创建完成(可以访问当前this实例)
  236. created() {},
  237. //生命周期 - 挂载完成(可以访问DOM元素)
  238. mounted() {
  239. this.get_boderHeight();
  240. }
  241. };
  242. </script>
  243. <style lang='scss'>
  244. @import "../../assets/scss/bus.scss";
  245. @import "../../assets/scss/message.scss";
  246. .message_box .mescroll {
  247. position: fixed;
  248. top: 44px;
  249. bottom: 0;
  250. height: auto;
  251. }
  252. </style>