whiteList.vue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. <template>
  2. <view class="container">
  3. <u-navbar title="" :is-back="false" class="top-navbar">
  4. <view class="navbar-left">
  5. <u-icon name="arrow-left" color="#2979ff" size="32" label="" @click="backClose" style="margin-right: 30rpx;"></u-icon>
  6. <u-icon name="plus" color="#2979ff" size="32" label="增加" @click="openEdit"></u-icon>
  7. <text style="flex:1;text-align: center;">白名单管理</text>
  8. </view>
  9. <u-dropdown ref="filterDropdown">
  10. <u-dropdown-item title="筛选">
  11. <view class="slot-content dropdown-filter-con">
  12. <view class="filter-item">
  13. <text class="filter-label">使用期限</text>
  14. <view class="filter-date" @tap="showCalendar=true">
  15. <text>{{filter.endDate.length>0?(filter.startDate+' 至 '+filter.endDate):'请选择'}}</text>
  16. <u-icon name="search" style="margin:0rpx 20rpx;"></u-icon>
  17. </view>
  18. </view>
  19. <view class="filter-item">
  20. <text class="filter-label">车牌号</text>
  21. <view style="background-color:#f2f5fa;height:72rpx;margin-top:15rpx;"><u-input type="text" v-model="filter.carNum" :border="false" placeholder="请输入车牌号" :custom-style="filterInputCss" :placeholder-style="filterInputCss.phstyle"/></view>
  22. </view>
  23. <view class="filter-item">
  24. <text class="filter-label">停车场</text>
  25. <view class="filter-con">
  26. <view @tap="selectedParkVal='all'" class="filter-con-item" :class="{'selected-filter':selectedParkVal=='all'}" data-val="all">全部</view>
  27. <block v-for="(item,index) in myParkSites" :key="item.park_id">
  28. <view @tap="selectedParkVal=item.park_id" class="filter-con-item" :class="{'selected-filter':selectedParkVal==item.park_id}" :data-val="item.park_id">{{item.parking_name.length>7?(item.parking_name.substr(0,7)+'...'):item.parking_name}}</view>
  29. </block>
  30. </view>
  31. </view>
  32. <view class="filter-btn">
  33. <view class="filter-btn-reset" @tap="resetFilter">重置</view>
  34. <view class="filter-btn-sure" @tap="sureFilter">确定</view>
  35. </view>
  36. </view>
  37. </u-dropdown-item>
  38. </u-dropdown>
  39. </u-navbar>
  40. <u-calendar v-model="showCalendar" mode="range" @change="changeCalendar"></u-calendar>
  41. <view class="white-card" :class="{'white-card-invalid':item.cloud_del_flag==1}" v-for="(item,index) in pagedData.records" :key="item.id">
  42. <view class="car-num">{{item.member_car_num}}{{item.member_type==0?' [充电附赠]':''}}</view>
  43. <!-- <view class="us-time">使用时段:无限制</view> -->
  44. <view class="parking-site"><text style="color:#888;">使用场所:</text>{{item.parking_name}}</view>
  45. <view class="us-expire">使用期限:
  46. <text v-if="item.cloud_del_flag==1" style="font-size:26rpx;font-weight: bold;">
  47. 已失效
  48. </text>
  49. <text v-else>
  50. {{item.start_time+' 至 '+item.end_time}}
  51. </text>
  52. </view>
  53. <view class="edit-btn" @tap="openEdit(item)">{{item.cloud_del_flag||item.member_type==0?'查看':'编辑'}}</view>
  54. </view>
  55. <view v-show="showMoreTip">
  56. <u-loadmore :status="loadMoreStat" :load-text="loadMoreText"/>
  57. </view>
  58. <view v-show="pagedData.records.length==0" style="margin:50rpx;text-align: center;">未找到相关数据</view>
  59. </view>
  60. </template>
  61. <script>
  62. import * as api from '@/apis/whiteBill.js'
  63. export default {
  64. data() {
  65. return {
  66. showCalendar:false,
  67. myParkSites:[],
  68. selectedParkVal:'all',
  69. allParkIds:'',
  70. filter:{
  71. carNum:'',
  72. startDate:'',
  73. endDate:''
  74. },
  75. filterInputCss:{
  76. 'background-color':'#f2f5fa',
  77. 'padding-left':'10rpx',
  78. 'phstyle':'font-size:24rpx;'
  79. },
  80. loadMoreStat:'loadmore',
  81. showMoreTip:false,
  82. loadMoreText: {
  83. loadmore: '轻轻上拉',
  84. loading: '努力加载中',
  85. nomore: '实在没有了'
  86. },
  87. pagedData:{
  88. records:[]
  89. }
  90. }
  91. },
  92. onLoad(){
  93. this.myParkSites=api.getMyParkSites();
  94. let ids=[];
  95. this.myParkSites.forEach(function(item){
  96. ids.push(item.park_id);
  97. });
  98. this.allParkIds=ids.join(",");
  99. this.loadPageData(this.getLoadParams(1));
  100. uni.$on('reloadWhiteList',(param) =>{
  101. this.loadPageData(this.getLoadParams(1));
  102. });
  103. },
  104. onReachBottom(){
  105. this.showMoreTip=true;
  106. if(!this.checkHadMore()){ //没有更多数据
  107. return;
  108. }
  109. this.loadMoreStat = 'loading';
  110. this.loadPageData(this.getLoadParams(),true);
  111. },
  112. methods: {
  113. getLoadParams(pnum){
  114. let parkarg=this.selectedParkVal=="all"?this.allParkIds:this.selectedParkVal;
  115. if(!pnum){
  116. pnum=this.pagedData.pageNum!=null?(this.pagedData.pageNum+1):1;
  117. }
  118. return {parkingIds:parkarg,carNum:this.filter.carNum,queryStart:this.filter.startDate,queryEnd:this.filter.endDate,pageNum:pnum,pageSize:10};
  119. },
  120. checkHadMore(){
  121. let rst=this.pagedData.pageNum<this.pagedData.pageCount;
  122. this.loadMoreStat=rst?'loadmore':'nomore';
  123. return rst;
  124. },
  125. openEdit(item){
  126. let urlArg='editWhite';
  127. if(item){
  128. if(item.cloud_del_flag||item.member_type==0){
  129. urlArg='viewWhite?id='+item.id;
  130. }
  131. else{
  132. urlArg='editWhite?id='+item.id;
  133. }
  134. }
  135. uni.navigateTo({
  136. url:urlArg
  137. })
  138. },
  139. backClose(){
  140. //uni.navigateBack();
  141. uni.switchTab({
  142. url:'../me/me'
  143. })
  144. },
  145. changeCalendar(e){
  146. this.filter.startDate=e.startDate;
  147. this.filter.endDate=e.endDate;
  148. },
  149. resetFilter(){
  150. let resetObj={
  151. startDate:'',
  152. endDate:'',
  153. carNum:''
  154. };
  155. this.filter=resetObj;
  156. this.selectedParkVal='all';
  157. },
  158. sureFilter(){
  159. this.$refs.filterDropdown.close();
  160. this.loadPageData(this.getLoadParams(1));
  161. },
  162. loadPageData(param,moreLoad){
  163. uni.showLoading({
  164. title:'加载中...'
  165. });
  166. if(!moreLoad){ //全新查询重置该值
  167. this.showMoreTip=false;
  168. }
  169. api.query(param).then(resp => {
  170. console.log(resp)
  171. uni.hideLoading();
  172. if(!resp.success){
  173. return;
  174. }
  175. this.parseDatas(resp.data);
  176. if(moreLoad){ //附加以前的数据
  177. resp.data.records=resp.data.records?this.pagedData.records.concat(resp.data.records):this.pagedData.records;
  178. }
  179. this.pagedData=resp.data;
  180. this.checkHadMore();
  181. }).catch(error => {
  182. uni.hideLoading();
  183. });
  184. },
  185. parseDatas(respData){
  186. respData['pageNum']=respData.current;
  187. respData['pageCount']=respData.pages;
  188. respData['pageSize']=respData.size;
  189. }
  190. }
  191. }
  192. </script>
  193. <style>
  194. page{
  195. background-color: #f4f4f4;
  196. padding:30rpx;
  197. font-family: '华文行楷';
  198. /* height: 100%; */
  199. }
  200. .top-navbar/deep/ .u-slot-content{
  201. justify-content: space-between;
  202. padding:0rpx;
  203. }
  204. .top-navbar/deep/ .u-dropdown__menu{
  205. justify-content: flex-end;
  206. }
  207. .top-navbar/deep/ .u-dropdown__menu .u-dropdown__menu__item{
  208. flex:none;
  209. margin-right: 40rpx;
  210. }
  211. .top-navbar .navbar-left{
  212. position: absolute;
  213. z-index: 20;
  214. left:20rpx;
  215. display: flex;
  216. flex-flow: row nowrap;
  217. align-items: center;
  218. width:calc(100vw - 220rpx);
  219. }
  220. .dropdown-filter-con{
  221. display: flex;
  222. flex-direction: column;
  223. align-items: flex-start;
  224. justify-content: center;
  225. padding:20rpx 0rpx 0rpx;
  226. box-sizing: border-box;
  227. background-color: #fafafa;
  228. font-size: 26rpx;
  229. }
  230. .filter-item{
  231. width:100%;
  232. padding:0rpx 20rpx 30rpx;
  233. }
  234. .filter-item .filter-label{
  235. /* font-family: '楷体'; */
  236. }
  237. .filter-date{
  238. width:100%;
  239. height:55rpx;
  240. line-height: 55rpx;
  241. background-color: #f2f5fa;
  242. margin-top: 20rpx;
  243. display: flex;
  244. align-items:center;
  245. }
  246. .filter-date text{
  247. flex:1;
  248. }
  249. .filter-con{
  250. display: flex;
  251. flex-flow: row wrap;
  252. justify-content:flex-start;
  253. align-items: center;
  254. margin-top: 20rpx;
  255. }
  256. .filter-con .filter-con-item{
  257. padding:10rpx 10rpx;
  258. text-align: center;
  259. background-color: #f2f5fa;
  260. /* color:#ffffff; */
  261. /* height: 45rpx; */
  262. width:28vw;
  263. margin-right: 3vw;
  264. margin-bottom: 20rpx;
  265. }
  266. .filter-con .selected-filter{
  267. background-color: #185ac6;
  268. color:#ffffff;
  269. }
  270. .filter-btn{
  271. display: flex;
  272. flex-flow: row wrap;
  273. justify-content:flex-start;
  274. align-items: center;
  275. height: 80rpx;
  276. width:100vw;
  277. border-top:1px solid #f2f2f2;
  278. }
  279. .filter-btn-reset{
  280. flex:1;
  281. text-align: center;
  282. line-height: 80rpx;
  283. background-color: #f2f2f2;
  284. }
  285. .filter-btn-sure{
  286. flex:2;
  287. text-align: center;
  288. background-color: #185ac6;
  289. color:#ffffff;
  290. line-height: 80rpx;
  291. }
  292. .white-card{
  293. border-radius: 10rpx;
  294. /* padding:30rpx; */
  295. margin-bottom: 20rpx;
  296. background: linear-gradient(90deg,#fbe09e,#fada8a);
  297. position: relative;
  298. }
  299. .white-card-invalid{
  300. background: linear-gradient(90deg,#d0d0d0,#b4b4b4);
  301. }
  302. .white-card .car-num{
  303. font-size:30rpx;
  304. padding: 20rpx 30rpx 0rpx;
  305. }
  306. .white-card .us-time{
  307. font-size:24rpx;
  308. margin-top:5rpx;
  309. padding: 0rpx 30rpx;
  310. }
  311. .white-card .parking-site{
  312. font-size:34rpx;
  313. text-align: center;
  314. font-family: '黑体';
  315. margin:40rpx auto;
  316. }
  317. .white-card .us-expire{
  318. border-top:1px solid #c5c145;
  319. font-size:24rpx;
  320. padding:15rpx 30rpx;
  321. text-align: left;
  322. }
  323. .white-card-invalid .us-expire{
  324. border-top:1px solid #a1a1a1;
  325. }
  326. .white-card .edit-btn{
  327. position: absolute;
  328. top:25%;
  329. right: 0rpx;
  330. height:50rpx;
  331. width:100rpx;
  332. background-color: #f1bb57;
  333. border-top-left-radius: 25rpx;
  334. border-bottom-left-radius: 25rpx;
  335. text-align: center;
  336. line-height: 50rpx;
  337. font-size:24rpx;
  338. }
  339. .white-card-invalid .edit-btn{
  340. background-color: #a2a2a2;
  341. }
  342. </style>