seek_data.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. <!-- -->
  2. <template>
  3. <div class="seek_data_box" :style="'height:' + fullHeight + 'px'" v-loading="loading">
  4. <!-- 头部 -->
  5. <div class="seek_data_head">
  6. <div class="seek_data_head_returnA" @click="FanHui()">
  7. <img src="../../assets/image/returnA.png" alt class="seek_data_head_returnA_img" />
  8. </div>
  9. <div class="seek_data_head_ipt_div">
  10. <input @click="iptfocus()" type="text" v-model="seek_dataA" class="seek_data_head_ipt" />
  11. </div>
  12. <div class="seek_data_head_sousuo">
  13. <img src="../../assets/image/seek.png" alt class="seek_data_head_sousuo_img" />
  14. </div>
  15. </div>
  16. <!-- 返回顶部 -->
  17. <!-- <goTop></goTop> -->
  18. <!-- 列表 -->
  19. <mescroll-vue ref="mescroll" :down="mescrollDown" :up="mescrollUp" @init="mescrollInit">
  20. <div class="seek_data_list">
  21. <ul class="seek_data_ul" v-if="axiosShow">
  22. <li
  23. class="seek_data_li"
  24. @click="details($event, index)"
  25. v-for="(item, index) in this.redata"
  26. :key="index"
  27. >
  28. <!-- 图片 -->
  29. <div class="seek_data_li_div">
  30. <img
  31. v-lazy="item.img_urls === null || item.img_urls === '' ? './static/picture.png' : item.img_urls"
  32. alt
  33. class="seek_data_li_img"
  34. />
  35. </div>
  36. <!-- 昆虫或病害名称 -->
  37. <div class="seek_data_li_name">{{ item.name | ellipsis }}</div>
  38. <!-- 科目 -->
  39. <div class="seek_data_li_subject">
  40. <span class="seek_data_li_subject_text">{{ item.course | ellipsis }}</span>
  41. </div>
  42. <!-- 详情按钮 -->
  43. <div class="seek_data_li_btn_div">
  44. <span class="seek_data_li_btn_text">详情</span>
  45. <img src="../../assets/image/right.png" alt class="seek_data_li_btn_img" />
  46. </div>
  47. </li>
  48. </ul>
  49. <!-- 暂空判断 -->
  50. <div class="seek_data_judge" v-else>
  51. <img src="../../assets/image/wu.png" alt class="seek_data_judge_img" />
  52. <div class="seek_data_judge_text">抱歉,暂无此数据</div>
  53. </div>
  54. </div>
  55. </mescroll-vue>
  56. </div>
  57. </template>
  58. <script>
  59. // import goTop from "../goTop/goTop"; //回到顶部
  60. // 引入mescroll的vue组件
  61. import MescrollVue from "mescroll.js/mescroll.vue";
  62. export default {
  63. name: "seek_data",
  64. //限时数据文本的字数限时
  65. filters: {
  66. ellipsis(value) {
  67. if (!value) return "";
  68. if (value.length > 5) {
  69. return value.slice(0, 5) + "...";
  70. }
  71. return value;
  72. }
  73. },
  74. components: {
  75. // goTop,
  76. MescrollVue // 注册mescroll组件
  77. },
  78. data() {
  79. return {
  80. fullHeight: document.documentElement.clientHeight,
  81. seek_dataA: localStorage.getItem("seek_name"),
  82. redata: [],
  83. axiosShow: true, //暂空判断
  84. //测试
  85. mescroll: null, // mescroll实例对象
  86. mescrollDown: {}, //下拉刷新的配置. (如果下拉刷新和上拉加载处理的逻辑是一样的,则mescrollDown可不用写了)
  87. mescrollUp: {
  88. // 上拉加载的配置.
  89. callback: this.upCallback, // 上拉回调,此处简写; 相当于 callback: function(page, mescroll) { }
  90. //以下是一些常用的配置,当然不写也可以的.
  91. page: {
  92. num: 0, //当前页 默认0,回调之前会加1; 即callback(page)会从1开始
  93. size: 6 //每页数据条数,默认10
  94. },
  95. isBounce: true, //根据记录的滚动条高度回弹
  96. htmlNodata: '<p class="upwarp-nodata">-- 已经到底了! --</p>',
  97. noMoreSize: 6, //如果列表已无数据,可设置列表的总数量要大于5才显示无更多数据;
  98. // 避免列表数据过少(比如只有一条数据),显示无更多数据会不好看
  99. // 这就是为什么无更多数据有时候不显示的原因
  100. toTop: {
  101. //回到顶部按钮
  102. // src: "../../../static/gotop.png", //图片路径,默认null,支持网络图
  103. src:
  104. "http://pic.51yuansu.com/pic3/cover/00/65/23/5896fa4bc81fc_610.jpg", //图片路径,默认null,支持网络图
  105. offset: 800 //列表滚动1000px才显示回到顶部按钮
  106. },
  107. empty: {
  108. //列表第一页无任何数据时,显示的空提示布局; 需配置warpId才显示
  109. warpId: "xxid", //父布局的id (1.3.5版本支持传入dom元素)
  110. icon: "./static/mescroll/mescroll-empty.png", //图标,默认null,支持网络图
  111. tip: "暂无相关数据~" //提示
  112. },
  113. onScroll: function(mescroll, y, isUp) {
  114. //监听滚动条
  115. //y为列表当前滚动条的位置
  116. },
  117. lazyLoad: {
  118. use: true // 是否开启懒加载,默认false
  119. }
  120. },
  121. aggregate: "", //后端传来数据的总条数
  122. loading: true, //加载
  123. };
  124. },
  125. //监听属性 类似于data概念
  126. computed: {},
  127. beforeRouteEnter(to, from, next) {
  128. // 如果没有配置顶部按钮或isBounce,则beforeRouteEnter不用写
  129. next(vm => {
  130. // 滚动到原来的列表位置,恢复顶部按钮和isBounce的配置
  131. vm.$refs.mescroll && vm.$refs.mescroll.beforeRouteEnter();
  132. });
  133. },
  134. beforeRouteLeave(to, from, next) {
  135. // 如果没有配置顶部按钮或isBounce,则beforeRouteLeave不用写
  136. // 记录列表滚动的位置,隐藏顶部按钮和isBounce的配置
  137. this.$refs.mescroll && this.$refs.mescroll.beforeRouteLeave();
  138. next();
  139. },
  140. //监控data中的数据变化
  141. watch: {
  142. fullHeight(val) {
  143. //监控浏览器高度变化
  144. if (!this.timer) {
  145. this.fullHeight = val;
  146. this.timer = true;
  147. let that = this;
  148. setTimeout(function() {
  149. //防止过度调用监测事件,导致卡顿
  150. that.timer = false;
  151. }, 400);
  152. }
  153. }
  154. },
  155. //方法集合
  156. methods: {
  157. // mescroll组件初始化的回调,可获取到mescroll对象
  158. mescrollInit(mescroll) {
  159. this.mescroll = mescroll; // 如果this.mescroll对象没有使用到,则mescrollInit可以不用配置
  160. },
  161. // 上拉回调 page = {num:1, size:10}; num:当前页 ,默认从1开始; size:每页数据条数,默认10
  162. upCallback(page, mescroll) {
  163. let _this = this;
  164. let postData = this.$qs.parse({
  165. page: this.mescrollUp.page.num,
  166. name: localStorage.getItem("seekName")
  167. });
  168. this.$axios({
  169. method: "post",
  170. url: "http://120.27.222.26:5555/search",
  171. data: postData
  172. })
  173. .then(res => {
  174. //判断data中的变量是否为空 ,为空的话存后端发来的总条数
  175. if (this.aggregate === "") {
  176. //存变量
  177. this.aggregate = res.data.num;
  178. var b = "6";
  179. this.aggregate = this.aggregate / b;
  180. this.aggregate = Math.ceil(this.aggregate); //将小数点转换为整数
  181. }
  182. //删除了默认的每页条数后判断数是否大于页码
  183. if (this.mescrollUp.page.num <= this.aggregate) {
  184. let postData = this.$qs.parse({
  185. page: this.mescrollUp.page.num,
  186. name: localStorage.getItem("seekName")
  187. });
  188. this.$axios({
  189. method: "post",
  190. url: "http://120.27.222.26:5555/search",
  191. data: postData
  192. })
  193. .then(res => {
  194. let arr = res.data.dat;
  195. // 如果是第一页需手动置空列表
  196. if (page.num === 1) this.redata = [];
  197. // 把请求到的数据添加到列表
  198. this.redata = this.redata.concat(arr);
  199. // 数据渲染成功后,隐藏下拉刷新的状态
  200. this.$nextTick(() => {
  201. mescroll.endSuccess(arr.length);
  202. });
  203. if (res.data.dat.length === 0) {
  204. _this.axiosShow = false;
  205. _this.FenShow = false;
  206. } else if (res.data.dat.length !== 0) {
  207. _this.axiosShow = true;
  208. _this.FenShow = true;
  209. }
  210. _this.loading = false
  211. })
  212. .catch(error => {
  213. mescroll.endErr();
  214. });
  215. } else if (this.mescrollUp.page.num > this.aggregate) {
  216. _this.loading = false
  217. // 数据渲染成功后,隐藏下拉刷新的状态
  218. this.$nextTick(() => {
  219. mescroll.endSuccess(this.aggregate);
  220. });
  221. }
  222. if (this.aggregate === 0) {
  223. this.axiosShow = false;
  224. this.FenShow = false;
  225. }
  226. })
  227. .catch(error => {
  228. mescroll.endErr();
  229. });
  230. },
  231. //动态获取浏览器高度
  232. get_boderHeight() {
  233. const that = this;
  234. window.onresize = () => {
  235. return (() => {
  236. window.fullHeight = document.documentElement.clientHeight;
  237. that.fullHeight = window.fullHeight;
  238. })();
  239. };
  240. },
  241. iptfocus() {
  242. let _this = this;
  243. _this.$router.push("/seek");
  244. localStorage.removeItem("seek_name");
  245. location.reload();
  246. },
  247. // 返回home页面
  248. FanHui() {
  249. let _this = this;
  250. if (localStorage.getItem('seekBiaishi') == '1') {
  251. _this.$router.push('/repository')
  252. localStorage.removeItem('seekBiaishi')
  253. } else {
  254. _this.$router.push("/home");
  255. }
  256. localStorage.removeItem("seek_name");
  257. },
  258. //点击详情进入页面
  259. details(e, index) {
  260. let _this = this;
  261. if (
  262. e.target.className === "seek_data_li_btn_text" ||
  263. e.target.className === "seek_data_li_div" ||
  264. e.target.className === "seek_data_li_img" ||
  265. e.target.className === "seek_data_li_name"
  266. ) {
  267. _this.current = index;
  268. //获取点击对象
  269. let el = e.currentTarget;
  270. let listId = _this.redata[index].id;
  271. localStorage.setItem("seek_dataID", listId); //保存获取的ID
  272. _this.$router.push("/record");
  273. }
  274. }
  275. },
  276. //生命周期 - 创建完成(可以访问当前this实例)
  277. created() {},
  278. //生命周期 - 挂载完成(可以访问DOM元素)
  279. mounted() {
  280. this.get_boderHeight();
  281. }
  282. };
  283. </script>
  284. <style lang='scss'>
  285. @import "../../assets/scss/bus.scss";
  286. @import "../../assets/scss/seek_data.scss";
  287. .seek_data_box .mescroll {
  288. position: fixed;
  289. top: 44px;
  290. bottom: 0;
  291. height: auto;
  292. }
  293. </style>