环卫车小程序前端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

421 lines
14 KiB

1 year ago
11 months ago
1 year ago
1 year ago
11 months ago
1 year ago
11 months ago
1 year ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
1 year ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
1 year ago
11 months ago
1 year ago
11 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
1 year ago
11 months ago
11 months ago
1 year ago
1 year ago
11 months ago
1 year ago
1 year ago
1 year ago
1 year ago
11 months ago
1 year ago
  1. <template>
  2. <view>
  3. <view class="se-w-vw-100 se-h-500">
  4. <u-swiper :radius="0" :list="detail.images" :height="250" :autoplay="false"></u-swiper>
  5. </view>
  6. <view class="se-py-20 se-flex se-bgc-white">
  7. <view class="se-w-vw-90 se-pl-30">
  8. <view class=" se-c-black se-fw-6 se-fs-32">
  9. {{detail.goodsName}}
  10. </view>
  11. <view class="se-display-ib se-c-red se-fs-32 se-br-8 se-px-10 se-py-5">
  12. {{detail.price | getPersonAuthentication}}<text class="se-fs-24"></text><text class="se-fs-24" v-if="detail.categoryoneName=='环卫设备及配件'">/</text>
  13. </view>
  14. </view>
  15. <view class="se-pr-30 se-flex se-flex-v-c">
  16. <text v-if="detail.categoryoneName==`环卫设备及配件`">销售量{{detail.views}}+</text>
  17. <text v-else>浏览量{{detail.views}}+</text>
  18. <!-- <button style="justify-content: center;" class="se-w-140 se-flex se-flex-ai-c se-h-60 se-lh-60 se-fs-22 se-bgc-green se-c-white se-py-0 se-br-30 se-px-20 se-m-0" open-type="share">
  19. <uv-icon name="share" color="#fff"></uv-icon>
  20. <text class="se-fs-20 se-pl-5">分享</text>
  21. </button> -->
  22. </view>
  23. </view>
  24. <view class="se-mt-20 se-bgc-white se-px-20 se-py-10 se-ta-l se-c-black se-py-20 se-flex se-flex-ff-cw se-fs-24">
  25. <view class="se-flex se-flex-ai-c">
  26. <text>型号:</text>
  27. <view class="se-tag">
  28. {{detail.model}}
  29. </view>
  30. </view>
  31. <view class="se-flex se-flex-ai-c se-pt-10" v-if="detail.categoryoneName!='环卫设备及配件'">
  32. <text>品牌名:</text>
  33. <view class="se-tag">
  34. {{detail.brand}}
  35. </view>
  36. </view>
  37. <view class="se-flex se-flex-ai-c se-pt-10" v-if="detail.categoryoneName!='环卫设备及配件'">
  38. <text>公里数:</text>
  39. <view class="se-tag">
  40. {{detail.mileage}}公里
  41. </view>
  42. </view>
  43. <view class="se-flex se-flex-ai-c se-pt-10" v-if="detail.categoryoneName!='环卫设备及配件'">
  44. <text>时间:</text>
  45. <view class="se-tag">
  46. {{detail.goodsTime}}
  47. </view>
  48. </view>
  49. </view>
  50. <template v-if="detail.imageFronts && detail.imageFronts.length>0 && detail.categoryoneName!='环卫设备及配件'">
  51. <view class="se-mt-20 se-bgc-white se-px-20 se-py-10 se-ta-l se-c-black se-py-20 se-flex se-flex-ai-c se-fs-24">
  52. <text>车辆照片:</text>
  53. </view>
  54. <view class="se-flex se-m-20" style="flex-wrap: wrap;">
  55. <image v-for="(items,indexs) in detail.imageFronts" :key="indexs" @click="previewImage(detail.imageFronts,items)" class="se-w-220 se-h-180 se-bgc-f5 se-br-5 se-mr-10 se-mb-10" :src="items" mode=""></image>
  56. </view>
  57. </template>
  58. <template v-if="detail.imageBacks && detail.imageBacks.length>0 && detail.categoryoneName!='环卫设备及配件'">
  59. <view class="se-mt-20 se-bgc-white se-px-20 se-py-10 se-ta-l se-c-black se-py-20 se-flex se-flex-ai-c se-fs-24">
  60. <text>车辆照片:</text>
  61. </view>
  62. <view class="se-flex se-m-20" style="flex-wrap: wrap;">
  63. <image v-for="(items,indexs) in detail.imageBacks" :key="indexs" @click="previewImage(detail.imageBacks,items)" class="se-w-220 se-h-180 se-bgc-f5 se-br-5 se-mr-10 se-mb-10" :src="items" mode=""></image>
  64. </view>
  65. </template>
  66. <template v-if="detail.imageLefts && detail.imageLefts.length>0 && detail.categoryoneName!='环卫设备及配件'">
  67. <view class="se-mt-20 se-bgc-white se-px-20 se-py-10 se-ta-l se-c-black se-py-20 se-flex se-flex-ai-c se-fs-24">
  68. <text>车辆照片:</text>
  69. </view>
  70. <view class="se-flex se-m-20" style="flex-wrap: wrap;">
  71. <image v-for="(items,indexs) in detail.imageLefts" :key="indexs" @click="previewImage(detail.imageLefts,items)" class="se-w-220 se-h-180 se-bgc-f5 se-br-5 se-mr-10 se-mb-10" :src="items" mode=""></image>
  72. </view>
  73. </template>
  74. <template v-if="detail.imageRights && detail.imageRights.length>0 && detail.categoryoneName!='环卫设备及配件'">
  75. <view class="se-mt-20 se-bgc-white se-px-20 se-py-10 se-ta-l se-c-black se-py-20 se-flex se-flex-ai-c se-fs-24">
  76. <text>车辆照片:</text>
  77. </view>
  78. <view class="se-flex se-m-20" style="flex-wrap: wrap;">
  79. <image v-for="(items,indexs) in detail.imageRights" :key="indexs" @click="previewImage(detail.imageRights,items)" class="se-w-220 se-h-180 se-bgc-f5 se-br-5 se-mr-10 se-mb-10" :src="items" mode=""></image>
  80. </view>
  81. </template>
  82. <template v-if="detail.imageCabs && detail.imageCabs.length>0 && detail.categoryoneName!='环卫设备及配件'">
  83. <view class="se-mt-20 se-bgc-white se-px-20 se-py-10 se-ta-l se-c-black se-py-20 se-flex se-flex-ai-c se-fs-24">
  84. <text>车辆照片驾驶室:</text>
  85. </view>
  86. <view class="se-flex se-m-20" style="flex-wrap: wrap;">
  87. <image v-for="(items,indexs) in detail.imageCabs" :key="indexs" @click="previewImage(detail.imageCabs,items)" class="se-w-220 se-h-180 se-bgc-f5 se-br-5 se-mr-10 se-mb-10" :src="items" mode=""></image>
  88. </view>
  89. </template>
  90. <view class="se-pt-20">
  91. <view class="se-p-20 se-c-black se-fs-28">
  92. 产品参数
  93. </view>
  94. <view class="se-p-20 se-pb-200">
  95. <u-parse :content="detail.detail"></u-parse>
  96. </view>
  97. </view>
  98. <view class="se-pos-fixed se-bgc-white se-b-ts se-w-vw-100 se-h-160" style="bottom: 0px;left: 0rpx;">
  99. <view class=" se-flex se-flex-h-sb se-py-20">
  100. <button style="justify-content: center;" class="default-btn se-w-140 se-flex se-flex-v-c se-fs-22 se-c-black se-py-0 se-br-30 se-px-20 se-m-0" open-type="share">
  101. <u-icon name="share" color="#000"></u-icon>
  102. <text class="se-fs-20 se-pl-5 se-c-black">分享</text>
  103. </button>
  104. <view class="se-flex se-flex-ai-c se-px-40 se-py-20">
  105. <view @click="onCustomerService()" class="se-flex se-flex-ai-c se-px-60 se-h-60 se-c-green se-fs-24 se-c-black se-b" style="border-radius: 30rpx 0 0 30rpx;">
  106. 联系电话
  107. </view>
  108. <view @click="open()" class="se-flex se-flex-ai-c se-px-60 se-h-60 se-bgc-green se-fs-24 se-c-white se-b" style="border-radius: 0 30rpx 30rpx 0;">
  109. 预约看车
  110. </view>
  111. </view>
  112. </view>
  113. </view>
  114. <u-popup :show="show" @close="close" @open="open">
  115. <u--form labelPosition="left" :model="form" :rules="rules" ref="uForm" labelWidth="80">
  116. <view class="se-bgc-white se-pt-40 se-pb-80" style="border-radius: 10px 10px 0 0;">
  117. <view class="se-px-40 se-py-20 se-c-black se-fs-30 se-fw-6">
  118. 预约租车
  119. </view>
  120. <view class="se-px-20 se-pb-20 se-mx-20 se-bgc-white se-br-20">
  121. <u-form-item class="se-py-20" label="联系姓名" prop="name" borderBottom>
  122. <u--input v-model="form.name" border="none" placeholder="请输入联系姓名"></u--input>
  123. </u-form-item>
  124. <u-form-item class="se-py-20" label="联系电话" prop="mobile" borderBottom>
  125. <u--input v-model="form.mobile" type="number" border="none" placeholder="请输入联系电话"></u--input>
  126. </u-form-item>
  127. <u-form-item label="所在地区" prop="area" @click="handleAreaChange()">
  128. <u--input readonly v-model="form.address" placeholder="请选择地址" border="bottom"></u--input>
  129. <u-icon slot="right" name="arrow-right"></u-icon>
  130. </u-form-item>
  131. <!-- <u-form-item class="se-py-20" label="所在地区" prop="address" borderBottom>
  132. <u--input v-model="form.address" type="text" border="none" placeholder="请输入所在地区"></u--input>
  133. </u-form-item> -->
  134. <u-form-item>
  135. <view @click="submit"
  136. class="se-mx-10 se-flex-1 se-br-40 se-flex-h-c se-h-80 se-lh-80 se-ta-c se-fs-28 se-c-white se-bgc-green">
  137. <text>确认</text>
  138. </view>
  139. </u-form-item>
  140. </view>
  141. </view>
  142. </u--form>
  143. </u-popup>
  144. </view>
  145. </template>
  146. <script>
  147. import { queryGoodsById,addOrder } from "@/common/api.js"
  148. import QQMapWX from "@/util/qqmap-wx-jssdk.min.js"
  149. export default{
  150. data(){
  151. return{
  152. show:false,
  153. list:[
  154. // 'https://cdn.uviewui.com/uview/swiper/swiper1.png',
  155. // 'https://cdn.uviewui.com/uview/swiper/swiper2.png',
  156. // 'https://cdn.uviewui.com/uview/swiper/swiper3.png',
  157. ],
  158. form:{
  159. name:"",
  160. mobile:"",
  161. address: '',
  162. latitude:"",
  163. longitude:"",
  164. },
  165. rules:{
  166. name: [
  167. {
  168. required: true,
  169. message: '请输入联系姓名',
  170. trigger: ['blur', 'change']
  171. }
  172. ],
  173. mobile:[
  174. {
  175. required: true,
  176. message: '请输入联系电话',
  177. trigger: ['blur', 'change']
  178. }
  179. ],
  180. address: [
  181. {
  182. required: true,
  183. message: '请选择地址',
  184. trigger: ['blur', 'change']
  185. }
  186. ]
  187. },
  188. id:null,
  189. detail:{}
  190. }
  191. },
  192. onLoad(options) {
  193. //#ifdef MP-WEIXIN
  194. wx.showShareMenu({
  195. withShareTicket: true,
  196. menus: ['shareAppMessage', 'shareTimeline']
  197. });
  198. //#endif
  199. this.id = options.goodsId
  200. if(options.shareId){
  201. uni.setStorageSync('shareId',options.shareId)
  202. }
  203. this.onDetail()
  204. },
  205. onShareTimeline(){
  206. let share = {
  207. title:this.detail.goodsName,
  208. path:"/pages_subpack/detail/index?id="+this.id+"&shareId="+uni.getStorageSync('userInfo').id,
  209. imageUrl:this.list[0].url,
  210. success:(res) => {
  211. console.info(res)
  212. },
  213. fail:(err)=>{
  214. console.info(err)
  215. }
  216. }
  217. console.info(share)
  218. return share
  219. },
  220. onShareAppMessage(options) {
  221. console.info(options)
  222. let share = {
  223. title:this.detail.goodsName,
  224. path:"/pages_subpack/detail/index?goodsId="+this.id+"&shareId="+uni.getStorageSync('userInfo').id,
  225. imageUrl:this.list[0].url,
  226. success:(res) => {
  227. console.info(res)
  228. },
  229. fail:(err)=>{
  230. console.info(err)
  231. }
  232. }
  233. console.info(share)
  234. return share
  235. },
  236. filters:{
  237. getPersonAuthentication(price){
  238. let companyAuthenticationStatus = uni.getStorageSync("companyAuthenticationStatus")
  239. if(companyAuthenticationStatus==1){
  240. return price
  241. }
  242. let personAuthenticationStatus =uni.getStorageSync("personAuthenticationStatus")
  243. if (personAuthenticationStatus != 1){
  244. return '***';
  245. }
  246. return price
  247. }
  248. },
  249. methods:{
  250. previewImage(urls, current) {
  251. uni.previewImage({
  252. urls: urls, // 需要预览的图片 HTTP 链接列表
  253. current: current // 当前显示图片的链接,不填则默认为 urls 的第一张
  254. });
  255. },
  256. onDetail(){
  257. let that = this
  258. queryGoodsById({goodsId:that.id}).then(response=>{
  259. console.info("queryGoodsById",response)
  260. let items = response.result
  261. if(items.image){
  262. items.image.split(',').forEach(item=>{
  263. that.list.push({
  264. url: item,
  265. type: 'image'
  266. })
  267. })
  268. }
  269. if(items.image){
  270. items.images = items.image.split(',')
  271. }else{
  272. items.images = []
  273. }
  274. if(items.imageBack){
  275. items.imageBacks = items.imageBack.split(',')
  276. }else{
  277. items.imageBacks = []
  278. }
  279. if(items.imageCab){
  280. items.imageCabs = items.imageCab.split(',')
  281. }else{
  282. items.imageCabs = []
  283. }
  284. if(items.imageFront){
  285. items.imageFronts = items.imageFront.split(',')
  286. }else{
  287. items.imageFronts = []
  288. }
  289. if(items.imageLeft){
  290. items.imageLefts = items.imageLeft.split(',')
  291. }else{
  292. items.imageLefts = []
  293. }
  294. if(items.imageRight){
  295. items.imageRights = items.imageRight.split(',')
  296. }else{
  297. items.imageRights = []
  298. }
  299. that.detail = items
  300. }).catch(error=>{
  301. })
  302. },
  303. submit() {
  304. this.$refs.uForm.validate().then(res => {
  305. // uni.$u.toast('校验通过')
  306. this.onAddOrder()
  307. }).catch(errors => {
  308. })
  309. },
  310. onAddOrder(){
  311. let that = this
  312. let params ={
  313. goodsId:that.detail.id,
  314. area:that.form.address,
  315. name:that.form.name,
  316. phone:that.form.mobile,
  317. typeId:that.detail.cartypeId
  318. }
  319. addOrder(params).then(response=>{
  320. uni.$u.toast(response.message)
  321. that.close()
  322. uni.navigateTo({
  323. url:"/pages_subpack/success/index"
  324. })
  325. }).catch(error=>{
  326. })
  327. },
  328. onCustomerService(){
  329. let that = this
  330. // let obj = that.$utils.getkeyContent('phone')
  331. if (uni.canIUse('makePhoneCall')) {
  332. uni.makePhoneCall({
  333. phoneNumber:String(that.detail.phone),
  334. success: function () {
  335. console.log('拨打电话成功');
  336. },
  337. fail: function () {
  338. console.log('拨打电话失败');
  339. }
  340. });
  341. } else {
  342. console.log('你的设备不支持拨打电话功能');
  343. }
  344. },
  345. open() {
  346. this.show = true
  347. },
  348. close() {
  349. this.show = false
  350. },
  351. handleAreaChange(){
  352. const that = this;
  353. wx.chooseLocation({
  354. // type: 'wgs84',
  355. success: function (res) {
  356. const qqmapsdk = new QQMapWX({
  357. key: 'TT7BZ-Z3LW4-KOAUB-KWHOA-SBJJ6-Y5B6R' // 必填
  358. });
  359. uni.showLoading({
  360. title:"获取中...."
  361. })
  362. qqmapsdk.reverseGeocoder({
  363. location: {
  364. latitude: res.latitude,
  365. longitude: res.longitude
  366. },
  367. success: function(response) {
  368. console.log('逆地理编码结果:', response);
  369. uni.hideLoading()
  370. that.form.longitude = response.result.location.lng
  371. that.form.latitude = response.result.location.lat
  372. that.form.address = response.result.address
  373. },
  374. fail: function(error) {
  375. uni.hideLoading()
  376. console.error('逆地理编码失败:', error);
  377. }
  378. });
  379. }
  380. })
  381. // this.$refs.citySelectRef.open()
  382. },
  383. }
  384. }
  385. </script>
  386. <style>
  387. page{
  388. background-color: #f5f5f5;
  389. }
  390. </style>
  391. <style lang="scss" scoped>
  392. .default-btn{
  393. background-color: transparent;
  394. }
  395. .default-btn::after{
  396. content: "";
  397. border: none;
  398. }
  399. .se-tag{
  400. padding: 5rpx 20rpx;
  401. background: #fff2df;
  402. border-radius: 4rpx;
  403. border: 2rpx solid rgba(0,0,0,0.00);
  404. font-family: PingFang SC, PingFang SC-Bold;
  405. font-weight: 700;
  406. text-align: center;
  407. color: #fab143;
  408. margin-left: 10rpx;
  409. font-size: 22rpx;
  410. }
  411. .se-tag:first-child{
  412. margin-left: 0rpx;
  413. }
  414. </style>