index.vue 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. <template>
  2. <view class="main">
  3. <view class="top-tabs" :style="colorStyle">
  4. <view class="tabs" :class="{btborder:type === index}" v-for="(item,index) in tabsList" :key="index"
  5. @tap="changeTabs(index)">
  6. {{item.name}}
  7. </view>
  8. </view>
  9. <view v-if="list.length && type ===1" class="list">
  10. <view v-for="(item, index) in list" :key="index" class="item" @click="goChat(item.to_uid)">
  11. <view class="image-wrap">
  12. <image class="image" :src="item.avatar"></image>
  13. </view>
  14. <view class="text-wrap">
  15. <view class="name-wrap">
  16. <view class="name">{{ item.nickname }}</view>
  17. <view>{{ item._update_time }}</view>
  18. </view>
  19. <view class="info-wrap">
  20. <view v-if="item.message_type === 1" class="info" v-html="item.message"></view>
  21. <view v-if="item.message_type === 2" class="info" v-html="item.message"></view>
  22. <view v-if="item.message_type === 3" class="info">[图片]</view>
  23. <view v-if="item.message_type === 4" class="info">[语音]</view>
  24. <view v-if="item.message_type === 5" class="info">[商品]</view>
  25. <view v-if="item.message_type === 6" class="info">[订单]</view>
  26. <view class="num" v-if="item.mssage_num">{{ item.mssage_num }}</view>
  27. </view>
  28. </view>
  29. </view>
  30. </view>
  31. <view class="list" v-if="list.length && type === 0">
  32. <view v-for="(item, index) in list" :key="index" class="item" @click="goDetail(item.id)">
  33. <view class="image-wrap">
  34. <image v-if="item.type === 1" class="image" src="../../../static/images/admin-msg.png"></image>
  35. <image v-else class="image" src="../../../static/images/user-msg.png"></image>
  36. <view class="no-look" v-if="!item.look"></view>
  37. </view>
  38. <view class="text-wrap">
  39. <view class="name-wrap">
  40. <view class="name">{{ item.title || '--' }}</view>
  41. <view>{{ item.add_time }}</view>
  42. </view>
  43. <view class="info-wrap">
  44. <view class="info" v-html="item.content"></view>
  45. </view>
  46. </view>
  47. </view>
  48. </view>
  49. <view v-else-if="finished && !list.length" class="empty-wrap">
  50. <view class="image-wrap">
  51. <image class="image" src="../../../static/images/noMessage.png"></image>
  52. </view>
  53. <view>亲、暂无消息记录哟!</view>
  54. </view>
  55. </view>
  56. </template>
  57. <script>
  58. import {
  59. serviceRecord,
  60. messageSystem
  61. } from '@/api/user.js';
  62. import colors from '@/mixins/color.js';
  63. export default {
  64. mixins:[colors],
  65. data() {
  66. return {
  67. list: [],
  68. page: 1,
  69. type: 0,
  70. limit: 20,
  71. loading: false,
  72. finished: false,
  73. tabsList: [{
  74. key: 0,
  75. name: '站内消息'
  76. }, {
  77. key: 1,
  78. name: '客服消息'
  79. }]
  80. };
  81. },
  82. onShow() {
  83. this.page = 1
  84. this.list = []
  85. this.changeTabs(this.type)
  86. },
  87. onReachBottom() {
  88. if (this.type === 1) {
  89. this.getList()
  90. } else {
  91. this.messageSystem()
  92. }
  93. },
  94. onPullDownRefresh() {
  95. this.page = 1
  96. this.finished = false
  97. this.list = []
  98. if (this.type === 1) {
  99. this.getList()
  100. } else {
  101. this.messageSystem()
  102. }
  103. },
  104. methods: {
  105. changeTabs(index) {
  106. this.type = index
  107. this.page = 1
  108. this.limit = 20
  109. this.list = []
  110. this.finished = false
  111. if (index === 1) {
  112. this.getList()
  113. } else {
  114. this.messageSystem()
  115. }
  116. },
  117. // 站内信
  118. messageSystem() {
  119. if (this.loading || this.finished) {
  120. return;
  121. }
  122. this.loading = true;
  123. uni.showLoading({
  124. title: '加载中'
  125. });
  126. messageSystem({
  127. page: this.page,
  128. limit: this.limit
  129. })
  130. .then(res => {
  131. let data = res.data;
  132. uni.hideLoading();
  133. this.loading = false;
  134. this.list = this.list.concat(data.list);
  135. this.finished = data.list.length < this.limit;
  136. this.page += 1;
  137. uni.stopPullDownRefresh();
  138. })
  139. .catch(err => {
  140. uni.showToast({
  141. title: err.msg,
  142. icon: 'none'
  143. })
  144. })
  145. },
  146. // 客服list
  147. getList() {
  148. if (this.loading || this.finished) {
  149. return;
  150. }
  151. this.loading = true;
  152. uni.showLoading({
  153. title: '加载中'
  154. });
  155. serviceRecord({
  156. page: this.page,
  157. limit: this.limit
  158. })
  159. .then(res => {
  160. uni.stopPullDownRefresh();
  161. let data = res.data;
  162. uni.hideLoading();
  163. this.loading = false;
  164. data.forEach(item => {
  165. if (item.message_type === 1) {
  166. item.message = this.replace_em(item.message);
  167. }
  168. if (item.message_type === 2) {
  169. item.message = this.replace_em(item.message);
  170. }
  171. });
  172. this.list = this.list.concat(data);
  173. this.finished = data.length < this.limit;
  174. this.page += 1;
  175. })
  176. .catch(err => {
  177. uni.showToast({
  178. title: err.msg,
  179. icon: 'none'
  180. })
  181. })
  182. },
  183. replace_em(str) {
  184. str = str.replace(/\[em-([a-z_]*)\]/g, "<span class='em em-$1'/></span>");
  185. return str;
  186. },
  187. goChat(id) {
  188. // this.$router.push({ path: '/pages/customer_list/chat'})
  189. uni.navigateTo({
  190. url: '/pages/customer_list/chat?to_uid=' + id + '&type=1'
  191. })
  192. },
  193. goDetail(id) {
  194. uni.navigateTo({
  195. url: '/pages/users/message_center/messageDetail?id=' + id,
  196. })
  197. },
  198. },
  199. }
  200. </script>
  201. <style lang="scss" scoped>
  202. .list {
  203. // background-color: #fff;
  204. overflow: hidden;
  205. padding-top: 100rpx;
  206. .item {
  207. background-color: #fff;
  208. display: flex;
  209. align-items: center;
  210. // height: 130rpx;
  211. padding: 30rpx 30rpx;
  212. margin: 10rpx 20rpx;
  213. border-radius: 12rpx;
  214. box-shadow: 0px 0px 1px 0px rgba(235, 214, 214, 0.75);
  215. -webkit-box-shadow: 0px 0px 1px 0px rgba(235, 214, 214, 0.75);
  216. -moz-box-shadow: 0px 0px 1px 0px rgba(235, 214, 214, 0.75);
  217. ~.item {
  218. border-top: 1rpx solid #f5f5f5;
  219. }
  220. .image{
  221. border-radius: 50%;
  222. }
  223. }
  224. .image-wrap {
  225. width: 88rpx;
  226. height: 88rpx;
  227. border-radius: 50%;
  228. position: relative;
  229. .no-look {
  230. position: absolute;
  231. width: 18rpx;
  232. height: 18rpx;
  233. border-radius: 50%;
  234. background-color: #1ABB1D;
  235. top: 0rpx;
  236. right: 0rpx;
  237. z-index: 999;
  238. }
  239. }
  240. .image {
  241. display: block;
  242. width: 100%;
  243. height: 100%;
  244. }
  245. .text-wrap {
  246. flex: 1;
  247. min-width: 0;
  248. margin-left: 20rpx;
  249. }
  250. .name-wrap {
  251. display: flex;
  252. align-items: center;
  253. font-size: 20rpx;
  254. color: #ccc;
  255. }
  256. .name {
  257. flex: 1;
  258. min-width: 0;
  259. margin-right: 20rpx;
  260. overflow: hidden;
  261. white-space: nowrap;
  262. text-overflow: ellipsis;
  263. font-size: 28rpx;
  264. color: #333;
  265. }
  266. .info-wrap {
  267. display: flex;
  268. align-items: center;
  269. margin-top: 18rpx;
  270. }
  271. .info {
  272. flex: 1;
  273. min-width: 0;
  274. overflow: hidden;
  275. white-space: nowrap;
  276. text-overflow: ellipsis;
  277. font-size: 24rpx;
  278. color: #999;
  279. }
  280. .num {
  281. min-width: 32rpx;
  282. height: 32rpx;
  283. border-radius: 16rpx;
  284. margin-left: 20rpx;
  285. background-color: #e93323;
  286. font-size: 20rpx;
  287. line-height: 32rpx;
  288. text-align: center;
  289. color: #fff;
  290. }
  291. }
  292. .empty-wrap {
  293. font-size: 26rpx;
  294. text-align: center;
  295. color: #999;
  296. .image-wrap {
  297. width: 414rpx;
  298. height: 436rpx;
  299. padding-top: 100rpx;
  300. margin: 0rpx auto 0;
  301. }
  302. .image {
  303. display: block;
  304. width: 100%;
  305. height: 100%;
  306. }
  307. }
  308. .main {
  309. position: relative;
  310. }
  311. .top-tabs {
  312. position: fixed;
  313. width: 100%;
  314. display: flex;
  315. align-items: center;
  316. background-color: #fff;
  317. font-size: 28rpx;
  318. border-radius: 8rpx;
  319. padding: 20rpx 0;
  320. margin-bottom: 10rpx;
  321. z-index: 1000;
  322. }
  323. .tabs {
  324. display: flex;
  325. align-items: center;
  326. padding: 4rpx 15rpx;
  327. margin: 0 20rpx;
  328. }
  329. .btborder {
  330. color: #fff;
  331. background-color: var(--view-theme);
  332. border-radius: 30rpx;
  333. }
  334. </style>