index.vue 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. <template>
  2. <div :class="{isMobile: mobile}">
  3. <div v-if="!mobile">
  4. <div class="followAreaShow">
  5. <div class="contentArea">
  6. <div class="selectArea">
  7. <div class="myFollow"
  8. :class="{selected: selected === SelectedType.myFollow}"
  9. @click="changeSelected(SelectedType.myFollow)"
  10. ><p>我的关注</p></div>
  11. <div class="myFans"
  12. :class="{selected: selected === SelectedType.myFans}"
  13. @click="changeSelected(SelectedType.myFans)"
  14. ><p>我的粉丝</p></div>
  15. </div>
  16. <div class="listArea">
  17. <div class="list" v-loading="loading">
  18. <div class="cell"
  19. v-for="item in dataList"
  20. :key="item.id"
  21. :title="item.name"
  22. >
  23. <div class="topContent">
  24. <div class="left">
  25. {{item.user_info && item.user_info.nickname || ""}}
  26. </div>
  27. <div class="right">
  28. {{item.updated_at}}
  29. </div>
  30. </div>
  31. <div class="descContent">
  32. 这里是个人介绍这里是个人介绍这里是个人介绍这里是个人介绍这里是个人介绍这里是个人介绍这里是个人介绍这里是个人介绍这里是个人介绍这里是个人介绍这里是个人介绍
  33. {{item.user_info && item.user_info.desc || ""}}
  34. </div>
  35. <div class="bottomContent">
  36. <div class="left" @click.once="deleteItems(item)"></div>
  37. <div class="right" @click="jumpToJishuinHomePageHandler(item)">
  38. <img :src="item.user_info && item.user_info.icon_url" alt=""/>
  39. </div>
  40. </div>
  41. </div>
  42. <!--id: "131"-->
  43. <!--user_id: "10468"-->
  44. <!--follow_id: "10000"-->
  45. <!--created_at: "2019-07-11 22:06:05"-->
  46. <!--updated_at: "2019-07-11 22:06:05"-->
  47. <!--user_info: {nickname: "程序员客栈", icon_url: "icon100001462323732", uid: "10000", seo_type: "1", certTags: [],…}-->
  48. <!--nickname: "程序员客栈"-->
  49. <!--icon_url: "icon100001462323732"-->
  50. <!--uid: "10000"-->
  51. <!--seo_type: "1"-->
  52. <!--certTags: []-->
  53. <!--seo_uri: "/wo/10000"-->
  54. <div v-if="dataList.length === 0" class="noneData">
  55. <p>没有数据</p>
  56. </div>
  57. </div>
  58. </div>
  59. <div class="pagination">
  60. <el-pagination background layout="prev, pager, next" :total="page.total"
  61. :page-size="page.pageSize" @current-change="pageChange" :current-page="Number(page.current
  62. )"></el-pagination>
  63. </div>
  64. </div>
  65. </div>
  66. </div>
  67. <div v-else class="followAreaShowMobile">
  68. <div class="selectArea">
  69. <div class="myFollow"
  70. :class="{selected: selected === SelectedType.myFollow}"
  71. @click="changeSelected(SelectedType.myFollow)"
  72. ><p>我的关注</p></div>
  73. <div class="myFans"
  74. :class="{selected: selected === SelectedType.myFans}"
  75. @click="changeSelected(SelectedType.myFans)"
  76. ><p>我的粉丝</p></div>
  77. </div>
  78. <van-pull-refresh v-model="refreshing" @refresh="onRefresh" class="listArea">
  79. <div style="text-align: center" v-if="firstLoading">
  80. <van-loading size="24px">加载中...</van-loading>
  81. </div>
  82. <van-list
  83. v-else
  84. v-model="loading"
  85. :finished="finished"
  86. finished-text="没有更多了"
  87. @load="onLoad"
  88. :immediate-check="false"
  89. class="list"
  90. >
  91. <van-swipe-cell
  92. class="cell"
  93. v-for="(item, index) in dataList" :key="'dataList' + index"
  94. >
  95. <div class="cellContent">
  96. <div class="left">
  97. <img :src="item.user_info && item.user_info.icon_url" alt="">
  98. </div>
  99. <div class="right">
  100. <div class="topContent">
  101. <div class="leftC">
  102. {{item.user_info && item.user_info.nickname || ""}}
  103. </div>
  104. <div class="rightC">
  105. {{item.updated_at}}
  106. </div>
  107. </div>
  108. <div class="descContent">
  109. 这里是个人介绍这里是个人介绍这里是个人介绍这里是个人介绍这里是个人介绍这里是个人介绍这里是个人介绍这里是个人介绍这里是个人介绍这里是个人介绍这里是个人介绍
  110. {{item.user_info && item.user_info.desc || ""}}
  111. </div>
  112. </div>
  113. </div>
  114. <template #right>
  115. <van-button square text="删除" type="danger" class="delete-button" @click="deleteItem(item)"/>
  116. </template>
  117. </van-swipe-cell>
  118. </van-list>
  119. </van-pull-refresh>
  120. </div>
  121. </div>
  122. </template>
  123. <script>
  124. const SelectedType = {
  125. myFollow: 1,
  126. myFans: 2
  127. }
  128. export default {
  129. name: "FollowListSeoIndex",
  130. // layout: "opacity_header",
  131. showCommonFooter: false,
  132. components: {},
  133. head() {
  134. let obj = {
  135. title: "我的关注-程序员客栈",
  136. meta: [
  137. {
  138. 'name': 'keywords',
  139. 'content': ""
  140. }, {
  141. 'name': 'descrption',
  142. 'content': ""
  143. }, {
  144. 'name': 'h1',
  145. 'content': ""
  146. }
  147. ]
  148. }
  149. return obj
  150. },
  151. async asyncData({ app }) {
  152. return {
  153. mobile: app.$deviceType.isMobile()
  154. }
  155. },
  156. data() {
  157. return {
  158. selected: SelectedType.myFollow,
  159. SelectedType,
  160. page: {
  161. current: 1,
  162. total: 0
  163. },
  164. dataList: [],
  165. loading: false,
  166. refreshing: false,
  167. firstLoading: false, //移动端加载loading
  168. isLoading: false
  169. }
  170. },
  171. watch: {},
  172. computed: {
  173. canSelectCity() {
  174. //远程无法选中地区
  175. return this.selected.workType !== 1
  176. },
  177. calcName() {
  178. const { direction, directionSmall, directionName = "", directionSmallName = "", } = this.selected
  179. let job = directionSmall || direction
  180. let jobName = directionSmallName === "全部" ? directionName : (directionSmallName || directionName)
  181. return {
  182. text: jobName || '全部职业',
  183. value: job
  184. }
  185. }
  186. },
  187. created() {
  188. this.checkLogin()
  189. this.getList()
  190. },
  191. mounted() {
  192. // this.getList()
  193. if (this.mobile) {
  194. document.body.style = "overflow:hidden;"
  195. }
  196. },
  197. methods: {
  198. changeSelected(type) {
  199. if (this.selected !== type) {
  200. this.selected = type
  201. this.page.page = 1
  202. this.page.total = 0
  203. this.getList()
  204. }
  205. },
  206. changeExpansion(key) {
  207. this.expansion[ key ] = !this.expansion[ key ]
  208. },
  209. getList() {
  210. const { page } = this
  211. let url = ""
  212. if (this.selected === SelectedType.myFollow) {
  213. url = "/api/community/follow/followers"
  214. } else {
  215. url = "/api/community/follow/fans"
  216. }
  217. if (this.isLoading) {
  218. return
  219. }
  220. this.loading = true
  221. this.isLoading = true
  222. this.$axios.post(url, page).then(res => {
  223. if (Number(res.data.status) === 1) {
  224. let data = res.data.data
  225. this.dataList = [ ...data ]
  226. // this.page.total = data.total
  227. // if (this.page.page === 1 || !this.mobile) {
  228. // this.dataList = [ ...data ]
  229. // } else {
  230. // this.dataList = [ ...this.dataList, ...data.list ]
  231. // }
  232. // this.page.page += 1
  233. // this.page.current = Number(data.page)
  234. // if (this.page.total <= this.dataList.length) {
  235. // this.finished = true
  236. // }
  237. }
  238. }).finally(() => {
  239. this.firstLoading = false
  240. this.refreshing = false
  241. this.isLoading = false
  242. this.$nextTick(() => {
  243. this.loading = false
  244. })
  245. console.log("this.finished", this.finished)
  246. })
  247. },
  248. pageChange(i) {
  249. this.page.page = i
  250. this.getList()
  251. },
  252. jumpToCompanyInfo(item) {
  253. const { companyInfo: { uid } } = item
  254. window.open(`/wo/${uid}`, `targetCompany${uid}`)
  255. },
  256. /** 移动端下拉刷新 **/
  257. onRefresh() {
  258. // 清空列表数据
  259. this.finished = false;
  260. console.log('onRefresh')
  261. this.onLoad();
  262. },
  263. onLoad() {
  264. console.log('onLoad')
  265. this.getList()
  266. },
  267. /** 删除项目 **/
  268. deleteItem(item) {
  269. const { follow_id } = item || {}
  270. //todo delete
  271. console.log("item:", item)
  272. },
  273. /** 跳转到技术圈主页 **/
  274. jumpToJishuinHomePageHandler() {
  275. }
  276. }
  277. }
  278. </script>
  279. <style scope lang="scss">
  280. .delete-button {
  281. height: 100%;
  282. }
  283. @import "../../../assets/css/user/follow.scss";
  284. </style>