Kaynağa Gözat

Merge branch 'master' of ssh://gogs.zfire.top:2222/zfire-front/recycle-mobile

* 'master' of ssh://gogs.zfire.top:2222/zfire-front/recycle-mobile:
  feat: 修改样式
  feat:发布
  no message
  no message
  no message
  no message
Moss 1 yıl önce
ebeveyn
işleme
687acc46a2

+ 113 - 114
src/components/zj-container/zj-page-layout.vue

@@ -1,91 +1,85 @@
 <template>
-	<view
-		class="app-container"
-		:class="hasFooter || isTabbar ? '':'pb'"
-		:style="{background: bgColor, height: 'calc(100vh - ' + aHeight + 'px)'}">
-		<u-loading-page
-			loading-text="家盛茂工程师"
-			color="#333333"
-			fontSize="17"
-			image="/static/images/logo.png"
-			icon-size="44"
-			:loading="isLoading">
-		</u-loading-page>
+  <view class="app-container" :class="hasFooter || isTabbar ? '':'pb'"
+    :style="{background: bgColor, height: 'calc(100vh - ' + aHeight + 'px)'}">
+    <u-loading-page loading-text="家盛茂工程师" color="#333333" fontSize="17" image="/static/images/logo.png" icon-size="44"
+      :loading="isLoading">
+    </u-loading-page>
 
-		<block v-if="!isLoading">
-			<view class="header-container">
-				<slot name="header"></slot>
-			</view>
-			<view class="content-container">
-				<template v-if="isScroll">
-					<scroll-view
-						scroll-y
-						enable-flex
-						refresher-enabled
-						style="width: 100%; height: 100%; box-sizing: border-box;"
-						@scrolltoupper="(...p)=>{$emit('scrolltoupper',p)}"
-						@scrolltolower="(...p)=>{$emit('scrolltolower',p)}"
-						@scroll="(...p)=>{$emit('scroll',p)}"
-						@refresherpulling="(...p)=>{$emit('refresherpulling',p)}"
-						@refresherrefresh="(...p)=>{$emit('refresherrefresh',p)}"
-						@refresherrestore="(...p)=>{$emit('refresherrestore',p)}"
-						@refresherabort="(...p)=>{$emit('refresherabort',p)}"
-						:refresher-triggered="refresherTriggered">
-						<slot></slot>
-					</scroll-view>
-				</template>
-				<template v-else>
-					<view style="width: 100%; height: 100%; box-sizing: border-box; overflow-y: scroll;">
-						<slot></slot>
-					</view>
-				</template>
-			</view>
-			<view class="footer-container" v-if="hasFooter">
-				<slot name="footer"></slot>
-			</view>
-		</block>
-	</view>
+    <block v-if="!isLoading">
+      <view class="header-container">
+        <slot name="header"></slot>
+      </view>
+      <view class="content-container">
+        <template v-if="isScroll">
+          <scroll-view scroll-y enable-flex refresher-enabled style="width: 100%; height: 100%; box-sizing: border-box;"
+            :refresher-background="refresherBackground" @scrolltoupper="(...p)=>{$emit('scrolltoupper',p)}"
+            @scrolltolower="(...p)=>{$emit('scrolltolower',p)}" @scroll="(...p)=>{$emit('scroll',p)}"
+            @refresherpulling="(...p)=>{$emit('refresherpulling',p)}"
+            @refresherrefresh="(...p)=>{$emit('refresherrefresh',p)}"
+            @refresherrestore="(...p)=>{$emit('refresherrestore',p)}"
+            @refresherabort="(...p)=>{$emit('refresherabort',p)}" :refresher-triggered="refresherTriggered">
+            <slot></slot>
+          </scroll-view>
+        </template>
+        <template v-else>
+          <view style="width: 100%; height: 100%; box-sizing: border-box; overflow-y: scroll;">
+            <slot></slot>
+          </view>
+        </template>
+      </view>
+      <view class="footer-container" v-if="hasFooter">
+        <slot name="footer"></slot>
+      </view>
+    </block>
+  </view>
 </template>
 
 <script>
-  import { isWeixin } from "@/common/utils/common.js"
+  import {
+    isWeixin
+  } from "@/common/utils/common.js"
 
-	export default {
-		props: {
-			bgColor: {
-				type: String,
-				default: '#F3F4F8',
-			},
-			hasFooter: {
-				type: Boolean,
-				default: false,
-			},
-			isScroll: {
-				type: Boolean,
-				default: false,
-			},
-			refresherTriggered: {
-				type: Boolean,
-				default: false,
-			},
-			isLoading: {
-				type: Boolean,
-				default: false,
-			}
-		},
+  export default {
+    props: {
+      bgColor: {
+        type: String,
+        default: '#F3F4F8',
+      },
+      refresherBackground: {
+        type: String,
+        default: '#FFF',
+      },
+      hasFooter: {
+        type: Boolean,
+        default: false,
+      },
+      isScroll: {
+        type: Boolean,
+        default: false,
+      },
+      refresherTriggered: {
+        type: Boolean,
+        default: false,
+      },
+      isLoading: {
+        type: Boolean,
+        default: false,
+      }
+    },
 
-		computed: {
-			isTabbar() {
-				let pages = getCurrentPages();
-				if(pages.length > 0) {
-					let prevPage = pages[pages.length - 1];
-					if (prevPage.route === 'pages/index/index' || prevPage.route === 'pages/issue/index' || prevPage.route === 'pages/message/index' || prevPage.route === 'pages/mine/index') {
-						return true;
-					}else {
-						return false;
-					}
-				}
-			},
+    computed: {
+      isTabbar() {
+        let pages = getCurrentPages();
+        if (pages.length > 0) {
+          let prevPage = pages[pages.length - 1];
+          if (prevPage.route === 'pages/index/index' || prevPage.route === 'pages/issue/index' || prevPage.route ===
+            'pages/message/index' || prevPage.route === 'pages/mine/index') {
+            return true;
+          } else {
+            return false;
+          }
+        }
+      },
 
       aHeight() {
         let num = 0;
@@ -93,47 +87,52 @@
         if (isWeixin()) {
           num = 0;
         } else {
-          if(this.isTabbar) {
+          if (this.isTabbar) {
             num = 50;
-          }else {
+          } else {
             num = 44;
           }
         }
         // #endif
         return num;
       }
-		}
-	}
+    }
+  }
 </script>
 
 <style lang="scss" scoped>
-	::v-deep .u-loading-page {
-		z-index: 999999;
-	}
-	.app-container {
-		width: 100%;
+  ::v-deep .u-loading-page {
+    z-index: 999999;
+  }
+
+  .app-container {
+    width: 100%;
     height: 100vh;
-		box-sizing: border-box;
-		display: flex;
-		flex-direction: column;
-		&.pb {
-			padding-bottom: env(safe-area-inset-bottom);
-		}
-		.header-container {
-			flex-shrink: 0;
-		}
-		.content-container {
-			flex: 1;
-			height: 0;
-		}
-		.footer-container {
-			flex-shrink: 0;
-			padding-bottom: env(safe-area-inset-bottom);
-			background: #ffffff;
-			box-sizing: border-box;
-			box-shadow: $bottom-shadow;
-			position: relative;
-			z-index: 1;
-		}
-	}
-</style>
+    box-sizing: border-box;
+    display: flex;
+    flex-direction: column;
+
+    &.pb {
+      padding-bottom: env(safe-area-inset-bottom);
+    }
+
+    .header-container {
+      flex-shrink: 0;
+    }
+
+    .content-container {
+      flex: 1;
+      height: 0;
+    }
+
+    .footer-container {
+      flex-shrink: 0;
+      padding-bottom: env(safe-area-inset-bottom);
+      background: #ffffff;
+      box-sizing: border-box;
+      box-shadow: $bottom-shadow;
+      position: relative;
+      z-index: 1;
+    }
+  }
+</style>

+ 7 - 11
src/pages/goods/order.vue

@@ -72,16 +72,16 @@
         }, false).then(res => {
           uni.showModal({
             title: '支付查询',
-            content: '等待支付结果,或直接去订单管理',
+            content: '等待支付结果',
             showCancel: false,
             confirmText: "订单管理",
-            success: function() {
+            success: () => {
               if (this.timeId) {
                 clearTimeout(this.timeId)
               }
               this.$navToPage({
                 url: '/pages/mine/myBuy/list'
-              })
+              }, "reLaunch")
             }
           });
           uni.requestPayment({
@@ -91,7 +91,9 @@
             package: res.data.payPackage,
             signType: "MD5",
             paySign: res.data.paySign,
-            success: () => {
+            success: () => {},
+            fail: () => {},
+            complete: () => {
               var getList = () => {
                 if (this.timeId) {
                   clearTimeout(this.timeId)
@@ -105,19 +107,13 @@
                     }
                     this.$navToPage({
                       url: '/pages/mine/myBuy/list'
-                    })
+                    }, "reLaunch")
                   } else {
                     this.timeId = setTimeout(getList, 1000)
                   }
                 })
               }
               getList()
-            },
-            fail: (ress) => {
-              console.log(ress)
-            },
-            complete: () => {
-              console.log("失败")
             }
           });
         })

+ 14 - 12
src/pages/index/index.vue

@@ -3,7 +3,8 @@
   <view>
     <view class="bg-container"></view>
     <zj-page-layout :hasFooter="false" :isScroll="true" :refresherTriggered="refresherTriggered"
-      @refresherrefresh="refresherrefresh" @scrolltolower="scrolltolower">
+      @refresherrefresh="refresherrefresh" @scrolltolower="scrolltolower"
+      refresherBackground="linear-gradient(to bottom, #01C30B, #f4f2f2)">
       <!-- <template slot="header">
         <view class="header-container" :style="cuStyle">二手空调</view>
       </template> -->
@@ -43,7 +44,8 @@
             <view class="title">{{item.title}}</view>
             <view class="des">{{item.content}}</view>
             <view class="imgs">
-              <image :src="imageUrl + it.imgUrl" v-for="(it, idx) in item.goodsFiles" :key="idx" mode="aspectFill"></image>
+              <image :src="imageUrl + it.imgUrl" v-for="(it, idx) in item.goodsFiles" :key="idx" mode="aspectFill">
+              </image>
             </view>
             <view class="bottom">
               <view class="left-location"><text class="iconfont icon-dingwei"></text>{{item.city}} {{item.area}}</view>
@@ -144,7 +146,7 @@
             pageSize: -1,
             state: true
           }).then(res => {
-            if(res.data && res.data.records) {
+            if (res.data && res.data.records) {
               this.bannerList = res.data.records.map(item => {
                 return this.imageUrl + item.imgSrc;
               });
@@ -158,23 +160,23 @@
       async getCategory() {
         return new Promise((resolve, reject) => {
           this.$api.get('/goods/category/list')
-          .then(res => {
-            this.categoryList = res.data || [];
-          }).finally(res => {
-            resolve(1);
-          })
+            .then(res => {
+              this.categoryList = res.data || [];
+            }).finally(res => {
+              resolve(1);
+            })
         })
       },
 
       //获取列表数据
       async getList() {
         let params = {};
-        if(this.tabCurrent === 1) {
+        if (this.tabCurrent === 1) {
           params.status = '1';
-        }else if(this.tabCurrent === 2) {
+        } else if (this.tabCurrent === 2) {
           params.lng = this.lng;
           params.lat = this.lat;
-        }else if(this.tabCurrent === 3) {
+        } else if (this.tabCurrent === 3) {
           params.visitOrderBy = 'YES';
         }
 
@@ -300,4 +302,4 @@
       }
     }
   }
-</style>
+</style>

+ 174 - 39
src/pages/issue/index.vue

@@ -5,6 +5,9 @@
     <view>
       <u-popup :show="show" :overlay="false">
         <view class="pop">
+          <view class="contentXZ"> 
+            <u-parse :content="content"></u-parse>
+          </view><br><br><br><br><br>
           <view class="bottom-container">
             <u-button @click="handleAgree" text="我已知晓" color="#5298ff" shape="circle"></u-button>
           </view>
@@ -12,18 +15,18 @@
       </u-popup>
     </view>
     <!-- ---------- -->
-    <view class="content">
-      <u--form labelPosition="top" labelWidth="150" :model="form" :rules="rules" ref="uForm">
-        <u-form-item label="商品名称" prop="form.title" borderBottom ref="item1">
+    <view v-if="!show" class="content">
+      <u--form labelPosition="top" labelWidth="150" :model="form" :rules="rules" ref="form">
+        <u-form-item label="商品名称" prop="title" required borderBottom ref="title">
           <u--input v-model="form.title" placeholder="请输入商品名称" border="none"></u--input>
         </u-form-item>
-        <u-form-item label="商品描述" prop="form.content" borderBottom ref="item1">
+        <u-form-item label="商品描述" prop="content" required borderBottom ref="item1">
           <u--input v-model="form.content" placeholder="请输入" border="none"></u--input>
         </u-form-item>
-        <u-form-item label="商品图片" prop="form.name" borderBottom ref="item1">
-          <zj-upload key="cp" @getFiles="getFiles" :fileList="fileList" :count="1" />
+        <u-form-item label="商品图片" prop="" required borderBottom ref="item1">
+          <zj-upload key="cp" @getFiles="getFiles" :fileList="fileList" :count="9" />
         </u-form-item>
-        <u-form-item labelPosition="left" label="商品分类" prop="form.categoryId" borderBottom ref="item1">
+        <u-form-item labelPosition="left" required label="商品分类" prop="categoryId" borderBottom ref="item1">
           <u-radio-group v-model="form.categoryId" placement="column">
             <u-radio
               v-for="(v, i) in categoryList"
@@ -35,20 +38,20 @@
             </u-radio>
           </u-radio-group>
         </u-form-item>
-        <u-form-item label="所在位置" labelPosition="left" prop="form.name" borderBottom ref="item1">
+        <u-form-item label="所在位置" labelPosition="left" prop="" required borderBottom ref="item1">
           <view @click="handleDW" class="letText">
             <text v-if="form.address">{{ form.address }}</text>
             <text v-if="!form.address">请选择定位</text>
             <u-icon name="arrow-right"></u-icon>
           </view>
         </u-form-item>
-        <u-form-item label="商品价格(含运费) " labelPosition="left" prop="form.amount" borderBottom ref="item1">
+        <u-form-item label="商品价格(含运费) " labelPosition="left" required prop="amount" borderBottom ref="item1">
           <u--input v-model="form.amount" inputAlign="right" placeholder="请输入数字" border="none"></u--input>
         </u-form-item>
-        <u-form-item label="上架数量" labelPosition="left" prop="form.num" borderBottom ref="item1">
+        <u-form-item label="上架数量" labelPosition="left" required prop="num" borderBottom ref="item1">
           <u--input v-model="form.num" inputAlign="right" placeholder="请输入" border="none"></u--input>
         </u-form-item>
-        <u-form-item label="商品品牌" labelPosition="left" prop="form.brand" borderBottom ref="item1">
+        <u-form-item label="商品品牌" labelPosition="left" prop="brand" borderBottom ref="item1">
           <u--input
             v-model="form.brand"
             inputAlign="right"
@@ -56,10 +59,10 @@
             border="none"
           ></u--input>
         </u-form-item>
-        <u-form-item label="功率(W)" labelPosition="left" prop="form.power" borderBottom ref="item1">
+        <u-form-item label="功率(W)" labelPosition="left" prop="power" borderBottom ref="item1">
           <u--input v-model="form.power" inputAlign="right" placeholder="请输入" border="none"></u--input>
         </u-form-item>
-        <u-form-item labelPosition="left" label="能效标识" prop="form.energy" borderBottom ref="item1">
+        <u-form-item labelPosition="left" label="能效标识" prop="energy" borderBottom ref="item1">
           <u-radio-group v-model="form.energy" placement="column">
             <u-radio
               v-for="(v, i) in dictList"
@@ -71,9 +74,11 @@
             </u-radio>
           </u-radio-group>
         </u-form-item>
-        <u-form-item label="制造日期" labelPosition="left" prop="form.goodsCreateTime" borderBottom ref="item1">
+        <u-form-item label="制造日期" labelPosition="left" prop="goodsCreateTime" borderBottom ref="item1">
           <view class="letText" @click="handleTime">
-            <text v-if="form.goodsCreateTime">{{ form.goodsCreateTime || '' }}</text>
+            <text v-if="form.goodsCreateTime">{{
+              form.goodsCreateTime.split('-')[0] + '-' + form.goodsCreateTime.split('-')[1] || ''
+            }}</text>
             <text v-if="!form.goodsCreateTime">请选择</text>
             <u-icon name="arrow-right"></u-icon>
           </view>
@@ -120,46 +125,156 @@ export default {
         brand: '',
         power: '',
         energy: '',
+        province: '',
+        city: '',
+        area: '',
+        street: '',
         goodsCreateTime: ''
       },
+      rules: {
+        title: [
+          {
+            required: true,
+            message: '必传',
+            trigger: ['change', 'blur']
+          }
+        ],
+        content: [
+          {
+            required: true,
+            message: '必传',
+            trigger: ['change', 'blur']
+          }
+        ],
+        categoryId: [
+          {
+            required: true,
+            message: '必传',
+            trigger: ['change', 'blur']
+          }
+        ],
+        amount: [
+          {
+            required: true,
+            message: '必传',
+            trigger: ['change', 'blur']
+          }
+        ],
+        num: [
+          {
+            required: true,
+            message: '必传',
+            trigger: ['change', 'blur']
+          }
+        ],
+        power: [
+          {
+            required: true,
+            message: '必传',
+            trigger: ['change', 'blur']
+          }
+        ],
+        energy: [
+          {
+            required: true,
+            message: '必传',
+            trigger: ['change', 'blur']
+          }
+        ],
+        goodsCreateTime: [
+          {
+            required: true,
+            message: '必传',
+            trigger: ['change', 'blur']
+          }
+        ]
+      },
       time: Number(new Date()),
-      rules: {},
       categoryList: [],
       dictList: [],
       fileList: [],
-      url:''
+      url: [],
+      content: ''
     }
   },
+  onReady() {
+    //如果需要兼容微信小程序,并且校验规则中含有方法等,只能通过setRules方法设置规则。
+    this.$refs.form.setRules(this.rules)
+  },
   onShow() {
+    this.getConfig()
     this.getList()
     this.getDictList()
   },
   methods: {
+    getConfig() {
+      this.$api
+        .get('/app/config/detail-by-type', {
+          configType: '4'
+        })
+        .then(res => {
+          this.content = res.data.content
+        })
+        .catch(() => {})
+    },
     getFiles(value) {
-      console.log(value, 67676)
-      this.fileList = 
-      this.url = value[0]
+      this.url = []
+      value.forEach(v => {
+        this.url.push({
+          imgUrl: v
+        })
+      })
     },
     submin() {
-      this.form.categoryName = this.categoryList.find(v => v.categoryId === this.form.categoryId)?.categoryName ?? ''
-      let params = {
-        ...this.form,
-        goodsFiles: [
-          {
-            goodsId: '',
-            imgUrl: this.url,
+      this.$refs.form
+        .validate()
+        .then(valid => {
+          if (valid) {
+            this.form.categoryName =
+              this.categoryList.find(v => v.categoryId === this.form.categoryId)?.categoryName ?? ''
+            let params = {
+              ...this.form,
+              goodsFiles: this.url
+            }
+            this.$api
+              .post('/goods/add', params)
+              .then(res => {
+                this.form = {
+                  title: '',
+                  content: '',
+                  categoryName: '',
+                  categoryId: '',
+                  lng: '',
+                  lat: '',
+                  address: '',
+                  amount: '',
+                  num: '',
+                  brand: '',
+                  power: '',
+                  province: '',
+                  city: '',
+                  area: '',
+                  street: '',
+                  energy: '',
+                  goodsCreateTime: ''
+                }
+                this.$refs.form.clearValidate()
+                this.show = true
+                this.$navToPage(
+                  {
+                    url: '/pages/index/index'
+                  },
+                  'switchTab'
+                )
+              })
+              .catch(() => {})
           }
-        ]
-      }
-      this.$api
-        .post('/goods/add',params)
-        .then(res => {
-            console.log(res);
-            this.$navToPage({
-              url: '/pages/index/index'
-            }, 'switchTab')
         })
-        .catch(() => {})
+        .catch(err => {
+          this.$toast('缺少必要参数,请检查')
+        })
+
+      return
     },
     //获取商品分类数据
     async getList() {
@@ -177,7 +292,6 @@ export default {
           dictCode: '能效'
         })
         .then(res => {
-          console.log(res)
           this.dictList = res.data
         })
         .catch(() => {})
@@ -188,6 +302,16 @@ export default {
           this.form.lng = res.longitude
           this.form.lat = res.latitude
           this.form.address = res.address
+          this.$api
+            .post(`/lbs/amap/region/query?lng=${res.longitude}&lat=${res.latitude}`)
+            .then(res => {
+              console.log(res)
+              this.form.province = res.data.provinceName
+              this.form.city = res.data.cityName
+              this.form.area = res.data.areaName
+              this.form.street = res.data.name
+            })
+            .catch(() => {})
         }
       })
     },
@@ -221,10 +345,21 @@ export default {
 </script>
 
 <style lang="scss" scoped>
+.contentXZ {
+  padding: 20px;
+}
 .pop {
+  overflow: auto;
   //   padding: 0 20rpx;
-  height: calc(100vh - 44px);
+  /* #ifdef H5 */
+  // height: calc(100vh - 44px);
+  height: 100vh;
+  /* #endif */
+  /* #ifndef H5 */
+  height: 100vh;
+  /* #endif */
 }
+
 .content {
   padding: 0 40rpx;
   margin: 20rpx 0;

+ 3 - 1
src/pages/message/index.vue

@@ -15,7 +15,9 @@
             <view class="message_user_info">
               <!-- 头像 -->
               <view class="user_head">
-                <image style="width: 100%; height: 100%;" mode="aspectFill" :src="imageUrl + item.userPic"></image>
+                <image v-if="item.userPic" style="width: 100%; height: 100%;" mode="aspectFill"
+                  :src="imageUrl + item.userPic"></image>
+                <image v-else style="width: 100%; height: 100%;" mode="aspectFill" src="@/static/common/logo.png">
               </view>
               <view class="user_info">
                 <!-- 姓名 -->

+ 17 - 5
src/pages/message/msgView.vue

@@ -44,14 +44,20 @@
               </view>
               <!-- 头像 -->
               <view class="msg_user_img">
-                <image style="width: 100%; height: 100%;" mode="aspectFill" :src="imageUrl + item.userPic"></image>
+                <image v-if="item.userPic" style="width: 100%; height: 100%;" mode="aspectFill"
+                  :src="imageUrl + item.userPic"></image>
+                <image v-else style="width: 100%; height: 100%;" mode="aspectFill" src="@/static/common/logo.png">
+                </image>
               </view>
             </view>
             <!-- 左消息 -->
             <view class="msg_view" v-else>
               <!-- 头像 -->
               <view class="msg_user_img">
-                <image style="width: 100%; height: 100%;" mode="aspectFill" :src="imageUrl + item.userPic"></image>
+                <image v-if="item.userPic" style="width: 100%; height: 100%;" mode="aspectFill"
+                  :src="imageUrl + item.userPic"></image>
+                <image v-else style="width: 100%; height: 100%;" mode="aspectFill" src="@/static/common/logo.png">
+                </image>
               </view>
               <view class="msg_view_info msg_view_info_left">
                 <view class="msg_view_conent">{{item.message}}</view>
@@ -120,7 +126,8 @@
         list: [],
         message: "",
         userId: this.$store.state.user.userId,
-        goodsDetail: {}
+        goodsDetail: {},
+        ids: {}
       }
     },
     onLoad(pam) {
@@ -223,10 +230,15 @@
             return {}
           })(),
         }, false).then(res => {
+          var newlist = res.data.filter(item => {
+            var bool = !this.ids[item.id]
+            this.ids[item.id] = true
+            return bool
+          })
           if (flag) {
-            this.list.unshift(...res.data)
+            this.list.unshift(...newlist)
           } else {
-            this.list.push(...res.data)
+            this.list.push(...newlist)
           }
           cb && cb()
         })