Browse Source

chartlist

jwyu 3 years ago
parent
commit
8a4924657d

+ 11 - 0
api/chart.js

@@ -20,4 +20,15 @@ export const apiChartList=params=>{
  */
 export const apiChartClassifyList=params=>{
     return httpGet('/my_chart/getChartChassify',params)
+}
+
+/**
+ * 图库移动排序
+ * @param MyChartId 
+ * @param MyChartClassifyId 
+ * @param PrevMyChartId 
+ * @param NextMyChartId 
+ */
+export const apiChartMove=params=>{
+    return httpPost('/my_chart/moveMyChart',params)
 }

+ 13 - 5
components/chartClassifyItem/HM-dragSorts.vue

@@ -4,7 +4,10 @@
 			<view class="row" id="shadowRow">
 				<view class="modules">
 					<!-- 内容  -->
-					<slot name="rowContent" :row="shadowRow"></slot>
+					<!-- <slot name="rowContent" :row="shadowRow"></slot> -->
+					<view :class="['chart-classify-item',selectId==shadowRow.myChartClassifyId?'chart-classify-item-active':'']">
+						{{shadowRow.myChartClassifyName}}
+					</view>
 					<!-- 拖拽图标 -->
 					<view class="drag" :style="{'height': rowHeight+'px'}"><text class="iconfont icon-drag"></text></view>
 				</view>
@@ -21,7 +24,7 @@
 								<view class="modules" @tap="triggerClick(index,row)">
 									<!-- 内容  -->
 									<!-- <slot name="rowContent" :row="row"></slot> -->
-									<view class="chart-classify-item">
+									<view :class="['chart-classify-item',selectId==row.myChartClassifyId?'chart-classify-item-active':'']">
 										{{row.myChartClassifyName}}
 									</view>
 									<!-- 拖拽图标 -->
@@ -172,7 +175,9 @@
 			listHeight: {
 				value: Number,
 				default: 0
-			}
+			},
+
+			selectId:0,//选择的id
 		},
 		watch: {
 			list: {
@@ -316,6 +321,9 @@
 		font-size: 14px;
       	color: #1F243A !important;
 	}
+	.chart-classify-item-active{
+		color: #E3B377 !important;
+	}
 
 	//默认
 	$text-color : #000000;
@@ -346,7 +354,7 @@
 
 			&.move {
 				background-color: $background-color-moveing;
-				box-shadow: 0 1px 5px $shadow-background-color-moveing;
+				box-shadow: 0px 0px 12rpx 0px rgba(154,141,123,0.16);
 			}
 
 			.modules {
@@ -422,7 +430,7 @@
 
 
 				&.move {
-					position: fixed;
+					// position: fixed;
 					z-index: 100;
 
 					.modules {

+ 55 - 9
pages-chart/allTypes.vue

@@ -14,16 +14,23 @@
           <van-collapse :value="active" @change="change" :border="false">
             <van-collapse-item title="公共图库" name="common" :border="false">
               <view class="list">
-                <view class="item">分类一</view>
-                <view class="item">分类一</view>
-                <view class="item">分类一</view>
+                <view 
+                  class="item" 
+                  v-for="item in pubClassifyList" 
+                  :key="item.myChartClassifyName"
+                  @click="handleSelectClassify(item,true)"
+                >{{item.myChartClassifyName}}</view>
               </view>
             </van-collapse-item>
-            <van-collapse-item title="我的图库" name="mine" :border="false">
-              <view class="list">
-                <view class="item">分类一</view>
-                <view class="item">分类一</view>
-                <view class="item">分类一</view>
+            <van-collapse-item title="我的图库" name="mine" :border="false" custom-class="self-wrap">
+              <view class="list" v-if="myClassifyList.length>0">
+                <dragSorts
+                  :list="myClassifyList"
+                  :selectId="selectId"
+                  :rowHeight="rowHeight"
+                  :listHeight="classifyListHeight+20"
+                  @onclick="myClassifyClick"
+                ></dragSorts>
               </view>
             </van-collapse-item>
           </van-collapse>
@@ -32,16 +39,52 @@
 </template>
 
 <script>
+import {apiChartClassifyList} from '@/api/chart'
+import dragSorts from '@/components/chartClassifyItem/HM-dragSorts.vue'
 export default {
+  components: {
+    dragSorts
+  },
   data () {
     return {
       searchVal:'',
-      active:['common','mine']
+      active:['common','mine'],
+      selectId:0,
+      myClassifyList:[],
+      pubClassifyList:[],
+
+      classifyListHeight:0,//我的分类默认高度
+      rowHeight:44,
     }
   },
+  onLoad(options) {
+    this.selectId=options.selectId
+    this.getList()
+  },
   methods: {
     change(e){
       this.active=e.detail
+    },
+
+    // 获取分类数据
+    async getList(){
+      const res=await apiChartClassifyList({Keywords:this.searchVal})
+      if(res.code===200){
+        this.myClassifyList=res.data.private_classify||[]
+        this.pubClassifyList=res.data.public_classify||[]
+        this.classifyListHeight=this.rowHeight*this.myClassifyList.length
+      }
+    },
+
+    // 点击我的分类项
+    myClassifyClick(e){
+      this.handleSelectClassify(e.value.myChartClassifyId,false)
+    },
+
+    handleSelectClassify(item,isPublic){
+      this.selectId=item.myChartClassifyId
+      uni.$emit('classifyPageSelect', {selectId:this.selectId,isPublic:isPublic})
+      uni.navigateBack()
     }
   }
 };
@@ -65,6 +108,9 @@ export default {
   .van-hairline--top:after{
     border-top-width: 0 !important;
   }
+  .self-wrap{
+    margin-top: 60rpx;
+  }
   .list{
     .item{
       &:first-child{

+ 2 - 1
pages.json

@@ -22,7 +22,8 @@
 		{
 			"path": "pages/chart/chart",
 			"style": {
-				"navigationBarTitleText": "ETA图库"
+				"navigationBarTitleText": "ETA图库",
+				"enablePullDownRefresh": true
 			}
 		},
 		{

+ 148 - 49
pages/chart/chart.vue

@@ -20,13 +20,21 @@
             />
         </view>
       </van-sticky>
-      <view class="chart-list-wrap">
+      <view class="empty-box" v-if="list.length==0&&finished">
+        <image
+          :src="globalImgUrls.chartEmpty"
+          mode="widthFix"
+        />
+        <view>暂时找不到对应图,试试别的搜索词吧~</view>
+      </view>
+      <view class="chart-list-wrap" v-else>
         <drag
           ref="chartDragIns"
           generic:item="chart-item"
           :columns="2"
           :list-data="list"
           :itemHeight="400"
+          :searchVal="searchVal"
           @sortend="chartSortend"
           @click="chartClick"
           @scroll="chartScroll"
@@ -34,8 +42,6 @@
         ></drag>
       </view>
       
-      
-    
     </view>
 
     <!-- 无权限 -->
@@ -58,17 +64,22 @@
           <view class="filter-list">
             <view class="title">公共图库</view>
             <view 
-              class="filter-item" 
+              :class="['filter-item',selectClassifyId==item.myChartClassifyId?'active':'']" 
               v-for="item in pubClassifyList" 
               :key="item.myChartClassifyName"
+              @click="handleSelectClassify(item,true)"
             >{{item.myChartClassifyName}}</view>
 
-            <view class="title">我的图库</view>
+            <block v-if="myClassifyList.length>0">
+            <view class="title" style="border:none">我的图库</view>
             <dragSorts
               :list="myClassifyList"
-              :rowHeight="44"
-              :listHeight="200"
+              :selectId="selectClassifyId"
+              :rowHeight="rowHeight"
+              :listHeight="classifyListHeight+20"
+              @onclick="myClassifyClick"
             ></dragSorts>
+            </block>
           </view>
         </view>
       </van-popup>
@@ -78,7 +89,7 @@
 import chartItem from './component/chartItem.vue'
 import dragSorts from '../../components/chartClassifyItem/HM-dragSorts.vue'
 import noAuth from './component/noAuth.vue'
-import {apiChartList,apiChartClassifyList} from '@/api/chart'
+import {apiChartList,apiChartClassifyList,apiChartMove} from '@/api/chart'
 export default {
     components: {
       'chart-item':chartItem,
@@ -99,28 +110,55 @@ export default {
           myClassifyList:[],//我的图库分类数据
           selectClassifyId:0,//选中的分类id
           isPublic:false,//是否当前显示的列表数据为公共图库数据
+          classifyListHeight:0,//我的分类默认高度
+          rowHeight:44,
+
+          searchVal:'',//图库搜素关键词
         }
     },
     onLoad() {
       this.getClassifyList()
+      this.addEventListenerSelectClassify()
+    },
+    onUnload(){
+      uni.$off('classifyPageSelect')
+    },
+    onPullDownRefresh() {
+      this.initPage()
+      this.getClassifyList()
+      setTimeout(() => {
+        uni.stopPullDownRefresh()
+      }, 1500)
     },
-    
     onReachBottom() {
         if (this.finished) return
         this.page++
         this.getList()
     },
+    onShareAppMessage(res) {
+        return {
+            title: '弘则研报',
+            path: ''
+        }
+    },
     onPageScroll({ scrollTop }) {
       this.scrollTop=scrollTop
     },
     methods: {
       // 获取列表
       async getList(){
-        const res=await apiChartList({Page:this.page,Limit:20})
+        const res=await apiChartList({
+          Page:this.page,
+          Limit:20,
+          ClassifyId:this.selectClassifyId,
+          Keywords:this.searchVal
+        })
+        // console.log(res);
         if(res.code===200){
           if(res.data){
+            // 公共图库分类下数据不允许拖动
             let arr=res.data.map(item=>{
-              return {...item,dragId:item.UniqueCode,fixed: false}
+              return {...item,dragId:item.UniqueCode,fixed: this.isPublic?true:false}
             })
             this.list=[...this.list,...arr]
             setTimeout(() => {
@@ -131,35 +169,38 @@ export default {
             this.finished=true
           }
         }
-
-
-        // if(this.page<3){
-        //   let arr=[]
-        //   for (let index = (this.page-1)*20; index < this.page*20; index++) {
-        //     arr.push({title:'标题'+index,src:'',dragId:'chart'+index,fixed: false})
-        //   }
-        //   this.list=[...this.list,...arr]
-        //   setTimeout(() => {
-        //     this.chartDragIns=this.$refs.chartDragIns
-        //     this.chartDragIns.init();
-        //   }, 100);
-        // }else{
-        //   this.finished=true
-        // }
-        
       },
 
       //移动排序结束
-      chartSortend(e){
+      async chartSortend(e){
         // curIndex 为排序前元素所在位置  listData为排序后的数组
         let {curIndex,listData}=e.detail
         const moveTarget=this.list[curIndex]
         console.log(moveTarget.ChartName);
-        this.list=listData
-        setTimeout(() => {
-          this.chartDragIns.init();
-        }, 100);
-        
+        // 找到移动后所在位置
+        const endIndex=listData.findIndex(item=>item.MyChartId===moveTarget.MyChartId)
+        console.log('移动结束后序号:',endIndex);
+
+        const NextMyChartId=listData[endIndex+1]&&listData[endIndex+1].MyChartId||0
+        const PrevMyChartId=listData[endIndex-1]&&listData[endIndex-1].MyChartId||0
+
+        const res=await apiChartMove({
+          MyChartId:moveTarget.MyChartId,
+          MyChartClassifyId:this.selectClassifyId,
+          PrevMyChartId:PrevMyChartId,
+          NextMyChartId:NextMyChartId,
+        })
+        if(res.code===200){
+          this.list=listData
+          setTimeout(() => {
+            this.chartDragIns.init();
+          }, 100);
+        }else{
+          uni.showToast({
+            title: '移动失败',
+            icon: 'none'
+          })
+        }
       },
 
       // 点击某项
@@ -172,47 +213,91 @@ export default {
 
       // 移动时滚动
       chartScroll(e){
+        uni.stopPullDownRefresh()
         this.pageMetaScrollTop=e.detail.scrollTop
       },
 
       // 获取分类数据
       async getClassifyList(){
         const res=await apiChartClassifyList()
-        console.log(res);
         if(res.code===200){
           this.myClassifyList=res.data.private_classify||[]
           this.pubClassifyList=res.data.public_classify||[]
+          this.classifyListHeight=this.rowHeight*this.myClassifyList.length
           if(res.data.private_classify){
-            this.selectClassifyId=res.data.private_classify[0]
+            this.selectClassifyId=res.data.private_classify[0].myChartClassifyId
+            this.isPublic=false
+          }else{
+            this.selectClassifyId=res.data.public_classify[0].myChartClassifyId
+            this.isPublic=true 
           }
         }
         this.getList()
       },
 
-      // // 显示筛查弹窗
-      // async handleShowFilter(){
-      //   const res=await apiChartClassifyList()
-      //   console.log(res);
-      //   if(res.code===200){
-      //     this.myClassifyList=res.data.private_classify||[]
-      //     this.pubClassifyList=res.data.public_classify||[]
-      //   }
-      //   this.showFilter=true
-      // },
+      // 我的分类点击
+      myClassifyClick(e){
+        this.handleSelectClassify(e.value,false)
+      },
+
+      // 选中分类
+      handleSelectClassify(item,isPublic){
+        this.initPage()
+        this.searchVal=''
+        this.selectClassifyId=item.myChartClassifyId
+        this.isPublic=isPublic
+        this.getList()
+        this.showFilter=false
+      },
 
       // 跳转全部分类
       goAllTypes(){
         uni.navigateTo({ 
-          url: '/pages-chart/allTypes'
+          url: '/pages-chart/allTypes?selectId='+this.selectClassifyId
         })
         this.showFilter=false
-      }
-      
+      },
+
+      // 搜索关键词变化
+      searchValChange(e){
+        this.searchVal=e.detail
+      },
+
+      // 确认搜索
+      onSearch(){
+        this.initPage()
+        this.isPublic=true
+        this.getList()
+      },
+
+      // 清除搜索内容
+      onClearSearch(){
+        this.initPage()
+        this.isPublic=false
+        this.getClassifyList()
+      },
+
+      // 初始化页面数据 
+      initPage(){
+        this.page=1
+        this.list=[]
+        this.finished=false
+        this.selectClassifyId=0
+        this.pageMetaScrollTop=0
+        this.scrollTop=0
+      },
+
+      // 监听分类页面选中分类事件
+      addEventListenerSelectClassify(){
+        uni.$on('classifyPageSelect',e=>{
+            this.handleSelectClassify({myChartClassifyId:e.selectId},e.isPublic)
+        })
+      },
     }
 }
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
 .chart-page {
     min-height: calc(100vh - calc(50px + constant(safe-area-inset-bottom)));
     min-height: calc(100vh - calc(50px + env(safe-area-inset-bottom)));
@@ -277,6 +362,20 @@ export default {
       font-size: 14px;
       color: #1F243A;
     }
+    .active{
+      color: #E3B377;
+    }
+  }
+}
+
+.empty-box{
+  text-align: center;
+  font-size: 32rpx;
+  color: #999;
+  padding-top: 150rpx;
+  image{
+    width: 346rpx;
+    margin-bottom: 57rpx;
   }
 }
 </style>

+ 6 - 10
pages/chart/component/chartItem.vue

@@ -2,10 +2,10 @@
   <view class="chart-item" :data-id="itemData.dragId" @click.stop="itemClick">
       <rich-text 
         class="van-multi-ellipsis--l2 title" 
-        :nodes="getTitle(itemData.ChartName)"
+        :nodes="itemData.ChartName"
         @longpress.stop="chartTitle(itemData,$event)"
       ></rich-text>
-      <view class="pop-title" v-if="showPopTitle">{{ChartName}}</view>
+      <view class="pop-title" v-if="showPopTitle">{{itemData.ChartName}}</view>
       <!-- <view class="van-multi-ellipsis--l2 title">{{itemData.title}}就发动机上课了发觉得凯撒尽快发动机卡JFK的撒尽快付款的撒娇离开了</view> -->
       <image lazy-load class="img" :src="itemData.ChartImage" mode="aspectFill"/>
   </view>
@@ -18,7 +18,8 @@ export default {
         itemData:{
           type: Object,
 			    value: {}
-        }
+        },
+        searchVal:""
     },
     data () {
       return {
@@ -32,17 +33,12 @@ export default {
         this.showPopTitle=false
       },
 
-      // 格式化标题
-      getTitle(e){
-        return `<span style="">${e}</span>`
-      },
-
       // 长按标题
       chartTitle(data,e){
         this.showPopTitle=true
-        this.title=data.title
+        this.title=data.ChartName
         uni.setClipboardData({
-          data: data.title,
+          data: data.ChartName,
           success: (result) => {},
           fail: (error) => {}
         })

+ 1 - 0
utils/config.js

@@ -23,6 +23,7 @@ if(env.envVersion==='develop'){//开发
 
 // 配置图片资源 https://hzstatic.hzinsights.com/static/icon/hzyb/
 const globalImgUrls={
+    chartEmpty:'https://hzstatic.hzinsights.com/static/icon/hzyb/chart_empty.png',
     activityNoAuth:'https://hzstatic.hzinsights.com/static/icon/hzyb/activity_no_auth.png',
     imgSuccess:'https://hzstatic.hzinsights.com/static/icon/hzyb/success_icon.png',
     loginTop:'https://hzstatic.hzinsights.com/static/icon/hzyb/login_top_img.png',

+ 3 - 0
utils/request.js

@@ -3,6 +3,8 @@ import {apiWechatLogin} from '@/api/user'
 import CryptoJS from './crypto'
 import store from '@/store/index'
 
+const ENV=uni.getAccountInfoSync().miniProgram
+
 // 请求错误消息提示
 const showError=error=>{
 	let errMsg=''
@@ -101,6 +103,7 @@ const http=(url,params,method)=>{
 					},0)
 					return
 				}
+				console.log(ENV);
 				let res=JSON.parse(CryptoJS.Des3Decrypt(e.data));//解密
 				// let res=e.data
 				if(res.code!==200&&res.code!==403&&res.code!==4001&&res.code!==401){

+ 5 - 0
wxcomponents/drag/index.js

@@ -61,6 +61,11 @@ Component({
 			type: Number,
 			value: 0
 		},
+
+		searchVal:{				 //搜索值
+			type:String,
+			value:''
+		}
 	},
 	data: {
 		/* 未渲染数据 */

+ 1 - 1
wxcomponents/drag/index.scss

@@ -1,4 +1,4 @@
-@import "../../assets/css/variables";
+// @import "../../assets/css/variables";
 
 .item-wrap {
 	position: relative;

+ 1 - 1
wxcomponents/drag/index.wxml

@@ -21,7 +21,7 @@
 			<slot name="{{item.slot}}"></slot>
 		</block>
 		<block wx:else>
-			<item data-index="{{index}}" columns="{{columns}}" item-data="{{item.data}}" bind:click="itemClick"/>
+			<item data-index="{{index}}" searchVal="{{searchVal}}" columns="{{columns}}" item-data="{{item.data}}" bind:click="itemClick"/>
 		</block>
 
 	</view>