linwei 1 gadu atpakaļ
revīzija
eed7e203d8
100 mainītis faili ar 11461 papildinājumiem un 0 dzēšanām
  1. 8 0
      .gitignore
  2. 4 0
      .vscode/settings.json
  3. 18 0
      App.vue
  4. 114 0
      components/v-tabs-column/readme.md
  5. 286 0
      components/v-tabs-column/v-tabs-column.vue
  6. 310 0
      http/api/common.js
  7. 12 0
      http/config/config.js
  8. 85 0
      http/config/http.js
  9. 20 0
      index.html
  10. 14 0
      main.js
  11. 91 0
      manifest.json
  12. 187 0
      pages.json
  13. 408 0
      pages/components/comment.vue
  14. 159 0
      pages/components/exchange-item.vue
  15. 165 0
      pages/components/videoList.vue
  16. 149 0
      pages/components/wenzhanList.vue
  17. 204 0
      pages/home/ArticleDetails.vue
  18. 358 0
      pages/home/Information.vue
  19. 101 0
      pages/home/allview.vue
  20. 200 0
      pages/home/base/appitem.vue
  21. 140 0
      pages/home/base/tabs-column.vue
  22. 276 0
      pages/home/exchange.vue
  23. 74 0
      pages/index/base/Exchange.vue
  24. 132 0
      pages/index/base/Market.vue
  25. 296 0
      pages/index/base/head.vue
  26. 136 0
      pages/index/base/newVideo.vue
  27. 127 0
      pages/index/base/news.vue
  28. 203 0
      pages/index/base/shoppingMalls.vue
  29. 61 0
      pages/index/index.vue
  30. 98 0
      pages/market/BrowsingHistory.vue
  31. 491 0
      pages/market/OrderDetails.vue
  32. 660 0
      pages/market/ProductDetails.vue
  33. 220 0
      pages/market/ProductEvaluate.vue
  34. 306 0
      pages/market/PublishComments.vue
  35. 366 0
      pages/market/allOrder.vue
  36. 468 0
      pages/market/base/ProductType.vue
  37. 153 0
      pages/market/base/columnList.vue
  38. 136 0
      pages/market/base/rowList.vue
  39. 336 0
      pages/market/commodity.vue
  40. 502 0
      pages/market/confirmOrder.vue
  41. 644 0
      pages/market/market.vue
  42. 298 0
      pages/myinfo/address.vue
  43. 141 0
      pages/myinfo/login.vue
  44. 275 0
      pages/myinfo/myinfo.vue
  45. 122 0
      pages/myinfo/notifiesPage.vue
  46. 83 0
      pages/myinfo/notifiesPageDetails.vue
  47. 248 0
      pages/myinfo/userInfo.vue
  48. 876 0
      pages/util/util.js
  49. BIN
      static/btn_fenlei.png
  50. BIN
      static/btn_fenlei2.png
  51. BIN
      static/btn_gouwc.png
  52. BIN
      static/btn_gouwc2.png
  53. BIN
      static/btn_mine.png
  54. BIN
      static/btn_mine2.png
  55. BIN
      static/btn_shouy.png
  56. BIN
      static/btn_shouy2.png
  57. BIN
      static/iconm_gongys.png
  58. BIN
      static/iconm_gongys2.png
  59. BIN
      static/index/btn_xiaox.png
  60. BIN
      static/index/btn_yagnzhi@2x.png
  61. BIN
      static/index/icomx_sahnchu1.png
  62. BIN
      static/index/icon_baoyujg@2x.png
  63. BIN
      static/index/icon_baoyym.png
  64. BIN
      static/index/icon_haicfl@2x.png
  65. BIN
      static/index/icon_penren@2x.png
  66. BIN
      static/index/iconm_goutong.png
  67. BIN
      static/index/iconm_message.png
  68. BIN
      static/index/iconm_play.png
  69. BIN
      static/index/iconm_shitu.png
  70. BIN
      static/index/img_tianqcx.png
  71. BIN
      static/index/sp.png
  72. BIN
      static/logo.png
  73. BIN
      static/market/btn_chanpfl.png
  74. BIN
      static/market/btn_chanpxx.png
  75. BIN
      static/market/btn_gouwc.png
  76. BIN
      static/market/btn_kefu.png
  77. BIN
      static/market/btn_screening.png
  78. BIN
      static/market/btn_shoucang.png
  79. BIN
      static/market/btn_up.png
  80. BIN
      static/market/icomm_dizhi.png
  81. BIN
      static/market/icomx_quertj1.png
  82. BIN
      static/market/iconm_shoucang.png
  83. BIN
      static/market/iconx__caidan1.png
  84. BIN
      static/myinfo/btn_right.png
  85. BIN
      static/myinfo/icomm_jilu.png
  86. BIN
      static/myinfo/icomx_banli.png
  87. BIN
      static/myinfo/icomx_dizhi.png
  88. BIN
      static/myinfo/icomx_message.png
  89. BIN
      static/myinfo/icomx_souc.png
  90. BIN
      static/myinfo/icon_dingdang.png
  91. BIN
      static/myinfo/iconm_bianj.png
  92. BIN
      static/myinfo/iconm_gouwu.png
  93. BIN
      static/myinfo/iconm_xiaoxi.png
  94. BIN
      static/myinfo/iconx_xitongg.png
  95. 10 0
      uni.promisify.adaptor.js
  96. 163 0
      uni.scss
  97. 21 0
      uni_modules/uview-ui/LICENSE
  98. 66 0
      uni_modules/uview-ui/README.md
  99. 362 0
      uni_modules/uview-ui/changelog.md
  100. 78 0
      uni_modules/uview-ui/components/u--form/u--form.vue

+ 8 - 0
.gitignore

@@ -0,0 +1,8 @@
+.tea
+node_modules
+unpackage
+.hbuilderx
+.
+..
+.DS_Store
+.idea

+ 4 - 0
.vscode/settings.json

@@ -0,0 +1,4 @@
+{
+    "editor.accessibilityPageSize": 10,
+    "editor.fontSize": 18
+}

+ 18 - 0
App.vue

@@ -0,0 +1,18 @@
+<script>
+	export default {
+		onLaunch: function() {
+			console.log('App Launch')
+		},
+		onShow: function() {
+			console.log('App Show')
+		},
+		onHide: function() {
+			console.log('App Hide')
+		}
+	}
+</script>
+
+<style lang="scss">
+	/* 注意要写在第一行,同时给style标签加入lang="scss"属性 */
+	@import "@/uni_modules/uview-ui/index.scss";
+</style>

+ 114 - 0
components/v-tabs-column/readme.md

@@ -0,0 +1,114 @@
+## 写在前面:
+
+> 欢迎各位老铁反馈 bug ,本人后端 PHP 一枚,只是应为感兴趣前端,自己琢磨,自己搞。如果你在使用的过程中有什么不合理,需要优化的,都可以在下面评论(或加我 QQ: 1207791534,QQ 群: 917543334),本人看见后回复、修正,感谢。
+
+## 插件说明
+
+> 常用于分类列表左侧导航,支持 H5,小程序,APP,不支持 nvue
+
+## 使用说明
+
+### 1. 最基本的用法
+
+- 视图文件
+
+```html
+<v-tabs-column :tabs="tabs" position="left" v-model="current">
+  <view class="p" v-for="i in 100" :key="i">{{ i }}我只是静态的文字,展示作用</view>
+</v-tabs-column>
+```
+
+- js 文件
+
+```js
+export default {
+  data() {
+    return {
+      current: 0,
+      tabs: ['服装', '手机', '鞋子', '衬衣', 'T桖', '键盘', '电脑', '手机', '玩具', '电瓶车', '背包', '手表', '餐具']
+    }
+  }
+}
+```
+
+### 2. 完整用法
+
+- 视图文件
+
+```html
+<v-tabs-column
+  :tabs="tabs"
+  :is-tabbar="false"
+  position="left"
+  active-color="purple"
+  inactive-color="#444"
+  bg-color="#ccc"
+  active-bg-color="#f3f3f3"
+  v-model="current"
+  padding="30rpx 30rpx"
+  bold="bold"
+  @change="changeTab"
+>
+  <view class="p" v-for="i in 100" :key="i">{{ i }}我只是静态的文字,展示作用</view>
+</v-tabs-column>
+```
+
+- js 文件
+
+```js
+export default {
+  data() {
+    return {
+      current: 0,
+      tabs: ['服装', '手机', '鞋子', '衬衣', 'T桖', '键盘', '电脑', '手机', '玩具', '电瓶车', '背包', '手表', '餐具']
+    }
+  },
+  methods: {
+    changeTab(index) {
+      uni.showToast({
+        title: '当前选中的是:' + this.tabs[index],
+        icon: 'none'
+      })
+    }
+  }
+}
+```
+
+## 文档说明
+
+### 1. 属性说明
+
+|       参数       |     类型      |  默认值   |                说明                |
+| :--------------: | :-----------: | :-------: | :--------------------------------: |
+|      value       |    Number     |     0     |         必传(双向绑定的值)         |
+|      width       |    String     | '240rpx'  |                宽度                |
+|      height      |    String     |    ''     |                高度                |
+|     bg-color     |    String     | '#f3f3f3' |              背景颜色              |
+|       tabs       |     Array     |    []     |                列表                |
+|    is-tabbar     |    Boolean    |   false   |  底部是否有 tabbar [true] [false]  |
+|     position     |    String     |   left    |    位置 left(左侧) right(右侧)     |
+|      field       |    String     |    ''     | 当传入的数组里面是对象时,传入键名 |
+|  inactiveStyle   | Object,String |    ''     |              默认样式              |
+|   activeStyle    | Object,String |    ''     |             激活的样式             |
+|   activeColor    |    String     |  '#f00'   |           激活的文字颜色           |
+|  inactiveColor   |    String     |  '#333'   |           默认的文字颜色           |
+|  activeFontSize  |    String     |  '32rpx'  |           激活的文字大小           |
+| inactiveFontSize |    String     |   28rpx   |           默认的文字大小           |
+|     padding      |    String     |  '30rpx'  |               内边距               |
+|       bold       | String,Number |    500    |          选中文字加粗效果          |
+
+### 2. 事件说明
+
+|  名称  | 参数  |                说明                |
+| :----: | :---: | :--------------------------------: |
+| change | index | 改变选中项触发, index 选中项的下标 |
+
+## 更新日志
+
+### 2020-11-17
+
+1. 更新初始设置 `current` 值,没有切换到指定选项问题
+
+### 2020-10-22
+
+1. 发布 `v-tabs-column` `1.0.0` 版本

+ 286 - 0
components/v-tabs-column/v-tabs-column.vue

@@ -0,0 +1,286 @@
+<template>
+  <view class="v-tabs-column">
+    <view class="v-tabs-column__bar" :style="getStyle">
+      <scroll-view scroll-y scroll-with-animation style="height: 100%; overflow: hidden" :scroll-top="scrollTop">
+        <view
+          class="v-tabs-column__bar-item"
+          v-for="(v, i) in tabs"
+          :key="i"
+          :style="i == current ? getActiveStyle : getInActiveStyle"
+          :class="{ active: i == current }"
+          @click="chooseItem(i)"
+        >
+          {{ field ? v[field] : v }}
+        </view>
+      </scroll-view>
+    </view>
+    <view class="v-tabs-column__container" :style="getWidth">
+      <slot />
+    </view>
+  </view>
+</template>
+
+<script>
+/**
+ * 常用于分类列表页面,展示分类导航使用
+ * @description 常用于分类列表页面,展示分类导航使用
+ * @tutorial https://ext.dcloud.net.cn/plugin?id=3275
+ * @version 1.0.0
+ * @property {String} width = '240rpx' 宽度
+ * @property {String} height 高度
+ * @property {String} bg-color = '#f3f3f3' 背景颜色
+ * @property {Array} tabs 数据列表
+ * @property {Boolean} is-tabbar = [true | false] 当有 tabbar 的时候需要设置为 true
+ * @property {String} position = ['left' | 'right'] 位置
+ * @property {String} field 如果使用对象,设置键名
+ * @property {Object, String} inactiveStyle 默认选项样式
+ * @property {Object, String} activeStyle 选中的样式
+ * @property {String} activeColor 选中的文字颜色
+ * @property {String} inactiveColor 默认的文字颜色
+ * @property {String} activeFontSize 选中的文字大小
+ * @property {String} inactiveFontSize 默认的文字大小
+ * @property {String} padding = '30rpx' 内边距
+ * @property {String, Number} bold = 500 选中文字加粗效果
+ *
+ */
+export default {
+  props: {
+    width: {
+      type: String,
+      default: '240rpx'
+    },
+    height: {
+      type: String,
+      default: ''
+    },
+    bgColor: {
+      type: String,
+      default: '#f3f3f3'
+    },
+    activeBgColor: {
+      type: String,
+      default: '#fff'
+    },
+    tabs: {
+      type: Array,
+      default() {
+        return []
+      }
+    },
+    isTabbar: {
+      type: Boolean,
+      default: false
+    },
+    position: {
+      type: String,
+      default: 'left'
+    },
+    field: {
+      type: String,
+      default: ''
+    },
+    inactiveStyle: {
+      type: [Object, String],
+      default() {
+        return {}
+      }
+    },
+    activeStyle: {
+      type: [Object, String],
+      default() {
+        return {}
+      }
+    },
+    activeColor: {
+      type: String,
+      default: '#f00'
+    },
+    inactiveColor: {
+      type: String,
+      default: '#333'
+    },
+    activeFontSize: {
+      tyep: String,
+      default: '32rpx'
+    },
+    inactiveFontSize: {
+      type: String,
+      default: '28rpx'
+    },
+    padding: {
+      type: String,
+      default: '30rpx'
+    },
+    bold: {
+      type: [String, Number],
+      default: 500
+    },
+    value: {
+      type: [String, Number],
+      default: 0
+    },
+    newCurrent: {
+      type: [String, Number],
+      default: 0
+    },
+  },
+  watch: {
+    newCurrent(newVal, oldVal) {
+      this.current = newVal
+    },
+    current(newVal, oldVal) {
+      this.$emit('input', newVal)
+    }
+  },
+  data() {
+    return {
+      current: this.value,
+      scrollTop: 0,
+      containerHeight: 0,
+      items: [] // 缓存
+    }
+  },
+  methods: {
+    getHeight() {
+      if (this.height) {
+        return this.height
+      }
+      let height = ''
+      // 判断是否是 H5
+      // #ifdef H5
+      height = this.isTabbar ? 'calc(100vh - 44px - 50px)' : 'calc(100vh - 44px)'
+      // #endif
+      // #ifndef H5
+      height = this.isTabbar ? 'calc(100vh - 44px)' : '100vh'
+      // #endif
+
+      return height
+    },
+    chooseItem(index) {
+      if (this.current !== index) {
+        this.current = index
+        this.$emit('change', index)
+        this.setPosition()
+      }
+    },
+    setPosition() {
+      const query = uni
+        .createSelectorQuery()
+        // #ifndef MP-ALIPAY
+        .in(this)
+      // #endif
+      // 如果容器的高度已经存在,不需要再循环
+      if (!this.containerHeight) {
+        query
+          .select('.v-tabs-column__bar')
+          .boundingClientRect((data) => {
+            // 判断属性值存在
+            if (data && data.height) {
+              this.containerHeight = data.height
+            }
+          })
+          .exec()
+      }
+      // 缓存有属性,不必每次循环节点
+      if (this.items.length <= 0) {
+        query
+          .selectAll('.v-tabs-column__bar-item')
+          .boundingClientRect((data) => {
+            this.items = data
+            this.calcScrollTop()
+          })
+          .exec()
+      } else {
+        this.calcScrollTop()
+      }
+    },
+    calcScrollTop() {
+      if (this.items) {
+        // 每一个 item 的高度都相等,随便取一个即可
+        const currentHeight = (this.current + 1) * this.items[0].height
+        // 计算滚动条距离顶部的位置
+        this.scrollTop = currentHeight - this.containerHeight / 2
+      }
+    },
+    // 将对象转换成字符串: {'font-size': '24rpx'}  ====> 'font-size: 24rpx'
+    objToString(obj) {
+      let result = ''
+      for (let [key, val] of Object.entries(obj)) {
+        result += `${key}: ${val};`
+      }
+
+      return result
+    }
+  },
+  computed: {
+    // 计算 bar 的样式
+    getStyle() {
+      // 判断是否传入了 height,如果没有,计算一下 height(除去 navbar 和 tabbar)
+      return this.objToString({
+        width: this.width,
+        height: this.getHeight(),
+        background: this.bgColor,
+        left: this.position === 'left' ? 0 : 'auto',
+        right: this.position === 'right' ? 0 : 'auto'
+      })
+    },
+    // 计算 item 激活样式
+    getActiveStyle() {
+      return this.objToString(
+        Object.assign(
+          {
+            color: this.activeColor,
+            padding: this.padding,
+            background: this.activeBgColor,
+            'font-weight': this.bold,
+            'font-size': this.activeFontSize
+          },
+          this.activeStyle
+        )
+      )
+    },
+    // 计算 item 未激活样式
+    getInActiveStyle() {
+      return this.objToString(
+        Object.assign(
+          {
+            color: this.inactiveColor,
+            padding: this.padding,
+            'font-size': this.inactiveFontSize
+          },
+          this.inactiveStyle
+        )
+      )
+    },
+    // 计算容器区域宽度和内边距
+    getWidth() {
+      return this.objToString({
+        width: `calc(100vw - ${this.width})`,
+        'padding-left': this.position == 'left' ? this.width : 0
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.v-tabs-column {
+  position: relative;
+
+  ::-webkit-scrollbar {
+    display: none;
+  }
+
+  &__bar {
+    position: fixed;
+
+    &-item {
+      position: relative;
+      transition: all 0.3s;
+      text-overflow: ellipsis;
+      overflow: hidden;
+      white-space: nowrap;
+    }
+  }
+}
+</style>

+ 310 - 0
http/api/common.js

@@ -0,0 +1,310 @@
+import {
+	request
+} from '../config/http.js'
+import env from "../config/config.js"
+
+//获取菜单列表
+export const getMenuListByOpen = (data) => request({
+	url: '/open/columnArticle/getMenuListByOpen',
+	method: 'POST',
+	data: data
+})
+
+//获取文章列表
+export const getArticleByOpen = (data) => request({
+	url: '/open/columnArticle/getArticleByOpen',
+	method: 'POST',
+	data: data
+})
+
+//获取文章详情
+export const getArticleDetailByOpen = (data) => request({
+	url: '/open/columnArticle/getArticleDetailByOpen',
+	method: 'POST',
+	data: data
+})
+
+//轮播图列表
+export const carouselList = (data) => request({
+	url: '/open/carousel/list',
+	method: 'POST',
+	data: data
+})
+
+//收货地址 列表
+export const deliveryAddressList = (data) => request({
+	url: '/open/wechat/myCenter/deliveryAddressList',
+	method: 'POST',
+	data: data
+})
+//收货地址 新增
+export const addDeliveryAddress = (data) => request({
+	url: '/open/wechat/myCenter/addDeliveryAddress',
+	method: 'POST',
+	data: data
+})
+//收货地址 删除
+export const delDeliveryAddressList = (id) => request({
+	url: `/open/wechat/myCenter/delDeliveryAddressList/${id}`,
+	method: 'POST'
+})
+//收货地址 修改
+export const modifyDeliveryAddress = (data,id) => request({
+	url: `/open/wechat/myCenter/modifyDeliveryAddress/${id}`,
+	method: 'POST',
+	data: data
+})
+
+
+//登录
+export const login = (code) => request({
+	url: `/open/wechat/login/${env.appid}/${code}`,
+	method: 'POST'
+})
+//绑定手机号
+export const bindphone = (code) => request({
+	url: `/open/wechat/bind/${env.appid}/${code}`,
+	method: 'POST'
+})
+//获取个人信息
+export const myInfo = (code) => request({
+	url: `/open/wechat/myCenter/myInfo`,
+	method: 'POST'
+})
+//修改个人信息
+export const modifyInfo = (data) => request({
+	url: `/open/wechat/myCenter/modifyInfo`,
+	method: 'POST',
+	data: data
+})
+
+
+//模块一接口(推荐)
+export const moduleByOne = (data) => request({
+	url: '/open/homeSetting/moduleByOne',
+	method: 'POST',
+	data: data
+})
+//模块二接口(技术培训)
+export const moduleByTwo = (data) => request({
+	url: '/open/homeSetting/moduleByTwo',
+	method: 'POST',
+	data: data
+})
+//模块三接口(行业详情)
+export const moduleByThree = (data) => request({
+	url: '/open/homeSetting/moduleByThree',
+	method: 'POST',
+	data: data
+})
+//模块四接口(最新资讯)
+export const moduleByFour = (data) => request({
+	url: '/open/homeSetting/moduleByFour',
+	method: 'POST',
+	data: data
+})
+//模块五接口(视频资讯
+export const moduleByFive = (data) => request({
+	url: '/open/homeSetting/moduleByFive',
+	method: 'POST',
+	data: data
+})
+//模块六接口(商品分类)
+export const moduleBySix = (data) => request({
+	url: '/open/homeSetting/moduleBySix',
+	method: 'POST',
+	data: data
+})
+//模块七接口(互动天地)
+export const moduleBySeven = (data) => request({
+	url: '/open/homeSetting/moduleBySeven',
+	method: 'POST',
+	data: data
+})
+
+
+
+//产品列表
+export const productPage = (data) => request({
+	url: '/open/wechat/product/productPage',
+	method: 'POST',
+	data: data
+})
+//产品详情
+export const productdetail = (id) => request({
+	url: `/open/wechat/product/detail/${id}`,
+	method: 'POST',
+})
+//规格型号及配方
+export const productspecs = (id) => request({
+	url: `/open/wechat/product/specs/${id}`,
+	method: 'POST',
+})
+//收藏
+export const productcollection = (id) => request({
+	url: `/open/wechat/product/collection/${id}`,
+	method: 'POST'
+})
+//取消收藏
+export const cancelCollection = (id) => request({
+	url: `/open/wechat/product/cancelCollection/${id}`,
+	method: 'POST'
+})
+//发表评论
+export const publishReviews = (data) => request({
+	url: `/open/wechat/product/publishReviews`,
+	method: 'POST',
+	data: data
+})
+//评论列表
+export const reviewsPage = (data) => request({
+	url: `/open/wechat/product/reviewsPage`,
+	method: 'POST',
+	data: data
+})
+//产品类目
+export const categoriesList = (data) => request({
+	url: `/open/wechat/product/categoriesList`,
+	method: 'POST',
+	data: data
+})
+
+
+
+
+//加入购物车
+export const addShoppingCart = (data) => request({
+	url: `/open/wechat/order/addShoppingCart`,
+	method: 'POST',
+	data: data
+})
+//移除购物车
+export const removeShoppingCart = (id) => request({
+	url: `/open/wechat/order/removeShoppingCart/${id}`,
+	method: 'POST',
+	// data: data
+})
+//购物车列表
+export const shoppingCartPage = (data) => request({
+	url: `/open/wechat/order/shoppingCartPage`,
+	method: 'POST',
+	data: data
+})
+//计算购物车价格
+export const calcShoppingCart = (data) => request({
+	url: `/open/wechat/order/calcShoppingCart`,
+	method: 'POST',
+	data: data
+})
+//购物车下单
+export const shoppingCartCreateOrder = (data) => request({
+	url: `/open/wechat/order/shoppingCartCreateOrder`,
+	method: 'POST',
+	data: data
+})
+//确认订单
+export const confirmOrder = (data,orderId) => request({
+	url: `/open/wechat/order/confirmOrder/${orderId}`,
+	method: 'POST',
+	data: data
+})
+//确认订单页面中取消订单
+export const cancelOrderByConfirm = (orderId) => request({
+	url: `/open/wechat/order/cancelOrderByConfirm/${orderId}`,
+	method: 'POST',
+	// data: data
+})
+//订单详情
+export const orderDetail = (orderId) => request({
+	url: `/open/wechat/order/orderDetail/${orderId}`,
+	method: 'POST',
+	// data: data
+})
+//订单列表
+export const orderPage = (data) => request({
+	url: `/open/wechat/order/orderPage`,
+	method: 'POST',
+	data: data
+})
+//订单列表页 取消订单
+export const cancelOrder = (orderId) => request({
+	url: `/open/wechat/order/cancelOrder/${orderId}`,
+	method: 'POST',
+	// data: data
+})
+//订单列表页 再次购买
+export const orderAgain = (orderId) => request({
+	url: `/open/wechat/order/orderAgain/${orderId}`,
+	method: 'POST',
+	// data: data
+})
+
+
+
+
+//主题详情
+export const topicDetail = (data,topicId) => request({
+	url: `/open/topic/detail/${topicId}`,
+	method: 'POST',
+	data: data
+})
+//回复列表
+export const replyPage = (data) => request({
+	url: `/open/topic/replyPage`,
+	method: 'POST',
+	data: data
+})
+//回复主题/楼层
+export const topicReply = (data,topicId) => request({
+	url: `/open/topic/reply/${topicId}`,
+	method: 'POST',
+	data: data
+})
+
+
+//收藏列表
+export const collectionList = (data) => request({
+	url: `/open/wechat/product/collectionList`,
+	method: 'POST',
+	data: data
+})
+//浏览记录
+export const browsingHistoryPage = (data) => request({
+	url: `/open/wechat/product/browsingHistoryPage`,
+	method: 'POST',
+	data: data
+})
+//意见反馈
+export const feedback = (data) => request({
+	url: `/open/wechat/myCenter/feedback`,
+	method: 'POST',
+	data: data
+})
+
+
+//互动天地列表
+export const contentPage = (data,sortType) => request({
+	url: `/open/topic/contentPage/${sortType}`,
+	method: 'POST',
+	data: data
+})
+
+//互动天地我参与的条数
+export const joinCountByMe = (data) => request({
+	url: `/open/topic/joinCountByMe`,
+	method: 'POST',
+	data: data
+})
+
+
+//公告列表
+export const notifiesPage = (data) => request({
+	url: `/open/wechat/common/notifiesPage`,
+	method: 'POST',
+	data: data
+})
+//公告详情
+export const notifiesDetails = (id) => request({
+	url: `/open/wechat/common/notifies/${id}`,
+	method: 'POST'
+})

+ 12 - 0
http/config/config.js

@@ -0,0 +1,12 @@
+//请求地址
+// const BASEURL = "https://lqh.zyjsfz.cn"
+const BASEURL = "http://120.26.86.247:9	898"
+const appid = "wx1ce6c9916db76eab"
+const secret = "55c58b1cccee46069c6fdbf1de2dd1ea"
+
+
+export default {
+	BASEURL,
+	appid,
+	secret
+}

+ 85 - 0
http/config/http.js

@@ -0,0 +1,85 @@
+//引入相关配置信息
+import env from "./config.js"
+/**
+ * create zzq
+ * uni请求框架的二次封装
+ * 参数说明options:{url:...,method:...,data...}
+ */
+export const request = (options) => {
+	return new Promise((resolve, reject) => {
+		// if(!options?.hideload){
+		// 	if(options?.data?.token&&options.data.token){
+		// 		uni.showLoading({
+		// 			title: '',
+		// 		})
+		// 	}
+		// }
+
+		let token = uni.getStorageSync('AppAuthorization'); //判断是否存在请求token
+		let header={}
+		header=options.headers || {'Content-Type': 'application/json'}
+		if(!token){
+			header=options.headers || {'Content-Type': 'application/json'}
+		}else{
+			if(options.headers){
+			   options.headers["AppAuthorization"]=token
+			}
+			header=options.headers || {'Content-Type': 'application/json','AppAuthorization': token}
+		}
+		// // 添加 timestamp 解决接口缓存问题,保证每次请求都是最新的
+		// options.data = {
+		// 	...options.data,
+		// 	timestamp:new Date().getTime()
+		// }
+		uni.request({
+			header:header, //默认是json的请求方式
+			url: env.BASEURL + options.url, //是否是走本部门接口还是走外部接口
+			method: options.method || 'GET',  //默认是GET请求
+			data: options.data || {}, //如果data不为空,则请求data数据信息
+			dataType:options.dataType||"json",
+			timeout:options.timeout||40000,
+			success: (res) => {
+				//判断请求响应不为200
+				if (res.data.code == 200||(res.data.meta&&res.data.meta.success==true)) { 
+					// if(res.header.authorization &&(options.url=="platformNormalLogin" || options.url=="/newPlatformLogin" || options.url=="/platformThirdSelectLogin")){
+					// 	uni.setStorageSync("authorization",res.header.authorization);
+					// }
+					resolve(res)
+				}else{
+					//提示用户相关的后端返回信息
+					if(res.data.msg){
+						uni.showToast({
+							icon: "none",
+							title: res.data.msg  //后端返回的校验信息
+						})
+					}
+
+					let noLogin = [10003,10004]
+					if (noLogin.includes(res.data.code)) {
+						setTimeout(() => {
+							uni.navigateTo({
+								url: '/pages/myinfo/login'
+							});
+						}, 1000);
+					}
+					resolve(res)
+					
+				}
+			},
+			fail: (err) => {
+				console.log('request-fail>>>',options.url,err)
+				//请求接口报错或服务端异常则提示用户以下信息
+				// uni.showToast({
+				// 	title: "服务端接口异常~",
+				// 	icon: "none"
+				// })
+				reject(err)
+			},
+			complete() {
+				if (!options.hideload) {
+					uni.hideLoading()
+				}
+			}
+		})
+	})
+}

+ 20 - 0
index.html

@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <script>
+      var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
+        CSS.supports('top: constant(a)'))
+      document.write(
+        '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
+        (coverSupport ? ', viewport-fit=cover' : '') + '" />')
+    </script>
+    <title></title>
+    <!--preload-links-->
+    <!--app-context-->
+  </head>
+  <body>
+    <div id="app"><!--app-html--></div>
+    <script type="module" src="/main.js"></script>
+  </body>
+</html>

+ 14 - 0
main.js

@@ -0,0 +1,14 @@
+import App from './App'
+import Vue from 'vue'
+import './uni.promisify.adaptor'
+
+//引入uview样式
+import uView from '@/uni_modules/uview-ui'
+Vue.use(uView)
+
+Vue.config.productionTip = false
+App.mpType = 'app'
+const app = new Vue({
+  ...App
+})
+app.$mount()

+ 91 - 0
manifest.json

@@ -0,0 +1,91 @@
+{
+    "name" : "wxuniapp",
+    "appid" : "__UNI__70C069F",
+    "description" : "",
+    "versionName" : "1.0.0",
+    "versionCode" : "100",
+    "transformPx" : false,
+    /* 5+App特有相关 */
+    "app-plus" : {
+        "usingComponents" : true,
+        "nvueStyleCompiler" : "uni-app",
+        "compilerVersion" : 3,
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true,
+            "waiting" : true,
+            "autoclose" : true,
+            "delay" : 0
+        },
+        /* 模块配置 */
+        "modules" : {
+            "OAuth" : {}
+        },
+        /* 应用发布信息 */
+        "distribute" : {
+            /* android打包配置 */
+            "android" : {
+                "permissions" : [
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ]
+            },
+            /* ios打包配置 */
+            "ios" : {},
+            /* SDK配置 */
+            "sdkConfigs" : {
+                "oauth" : {
+                    "weixin" : {
+                        "appid" : "wx1ce6c9916db76eab",
+                        "UniversalLinks" : ""
+                    }
+                }
+            }
+        }
+    },
+    /* 快应用特有相关 */
+    "quickapp" : {},
+    /* 小程序特有相关 */
+    "mp-weixin" : {
+        "appid" : "wx1ce6c9916db76eab",
+        "setting" : {
+            "urlCheck" : false,
+            "es6" : false
+        },
+        "usingComponents" : true
+    },
+    "mp-alipay" : {
+        "usingComponents" : true
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "uniStatistics" : {
+        "enable" : false
+    },
+    "vueVersion" : "2",
+    "h5" : {
+        "router" : {
+            "mode" : "history"
+        },
+        "devServer" : {
+            "https" : false,
+            "port" : ""
+        }
+    }
+}

+ 187 - 0
pages.json

@@ -0,0 +1,187 @@
+{
+	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+		{
+			"path": "pages/index/index",
+			"style": {
+				"navigationBarTitleText": "首页"
+			}
+		},
+		{
+			"path": "pages/myinfo/login",
+			"style": {
+				"navigationBarTitleText": "登录页"
+			}
+		},
+		{
+			"path": "pages/myinfo/userInfo",
+			"style": {
+				"navigationBarTitleText": "个人信息"
+			}
+		},
+		{
+			"path" : "pages/home/Information",
+			"style" : 
+			{
+				"navigationBarTitleText" : "最新资讯"
+			}
+		},
+		{
+			"path" : "pages/home/exchange",
+			"style" : 
+			{
+				"navigationBarTitleText" : "互动天地"
+			}
+		},
+		{
+			"path" : "pages/home/ArticleDetails",
+			"style" : 
+			{
+				"navigationBarTitleText" : "文章详情"
+			}
+		},
+		{
+			"path" : "pages/home/allview",
+			"style" : 
+			{
+				"navigationBarTitleText" : "分类"
+			}
+		},
+		{
+			"path" : "pages/market/commodity",
+			"style" : 
+			{
+				"navigationBarTitleText" : "商品列表"
+			}
+		},
+		{
+			"path" : "pages/market/BrowsingHistory",
+			"style" : 
+			{
+				"navigationBarTitleText" : "浏览记录"
+			}
+		},
+		{
+			"path" : "pages/market/ProductDetails",
+			"style" : 
+			{
+				"navigationBarTitleText" : "商品详情"
+			}
+		},
+		{
+			"path" : "pages/market/ProductEvaluate",
+			"style" : 
+			{
+				"navigationBarTitleText" : "商品评价"
+			}
+		},
+		{
+			"path" : "pages/market/confirmOrder",
+			"style" : 
+			{
+				"navigationBarTitleText" : "确认订单"
+			}
+		},
+		{
+			"path" : "pages/market/allOrder",
+			"style" : 
+			{
+				"navigationBarTitleText" : "我的订单"
+			}
+		},
+		{
+			"path" : "pages/market/OrderDetails",
+			"style" : 
+			{
+				"navigationBarTitleText" : "订单详情"
+			}
+		},
+		{
+			"path" : "pages/market/PublishComments",
+			"style" : 
+			{
+				"navigationBarTitleText" : "发表评价"
+			}
+		},
+		{
+			"path" : "pages/market/market",
+			"style" : 
+			{
+				"navigationBarTitleText" : "购物车"
+			}
+		},
+		{
+			"path" : "pages/myinfo/address",
+			"style" : 
+			{
+				"navigationBarTitleText" : "我的地址"
+			}
+		},
+		{
+			"path" : "pages/myinfo/notifiesPage",
+			"style" : 
+			{
+				"navigationBarTitleText" : "消息中心"
+			}
+		},
+		{
+			"path" : "pages/myinfo/notifiesPageDetails",
+			"style" : 
+			{
+				"navigationBarTitleText" : "公告详情"
+			}
+		},
+		{
+			"path" : "pages/myinfo/myinfo",
+			"style" : 
+			{
+				"navigationBarTitleText" : "我的"
+			}
+		}
+	],
+	"globalStyle": {
+		"navigationBarTextStyle": "black",
+		"navigationBarTitleText": "",
+		"navigationBarBackgroundColor": "#F8F8F8",
+		"backgroundColor": "#F8F8F8"
+	},
+	"uniIdRouter": {},
+	"tabBar": {
+		"color": "#7A7E83",
+		"selectedColor": "#009DFF",
+		"borderStyle": "black",
+		"backgroundColor": "#ffffff",
+		"iconWidth":"40rpx",
+		"list": [
+			{
+				"pagePath": "pages/index/index",
+				"iconPath": "static/btn_shouy.png",
+				"selectedIconPath": "static/btn_shouy2.png",
+				"text": "首页"
+			},
+			{
+				"pagePath": "pages/home/Information",
+				"iconPath": "static/btn_fenlei.png",
+				"selectedIconPath": "static/btn_fenlei2.png",
+				"text": "分类"
+			},
+			{
+				"pagePath": "pages/market/commodity",
+				"iconPath": "static/iconm_gongys.png",
+				"selectedIconPath": "static/iconm_gongys2.png",
+				"text": "好物"
+			},
+			{
+				"pagePath": "pages/market/market",
+				"iconPath": "static/btn_gouwc.png",
+				"selectedIconPath": "static/btn_gouwc2.png",
+				"text": "购物车"
+			},
+			{
+				"pagePath": "pages/myinfo/myinfo",
+				"iconPath": "static/btn_mine.png",
+				"selectedIconPath": "static/btn_mine2.png",
+				"text": "我的"
+			}
+		]
+	}
+}

+ 408 - 0
pages/components/comment.vue

@@ -0,0 +1,408 @@
+<template>
+    <view class="content">
+        <!-- 评论组件 -->
+        <view class="plbox">
+            <view class="pl">{{num}}评论</view>
+            <view class="subsection" >
+                <view :class="curNow==0?'checksub':'nocheck'" @click="sectionChange(0)">最新</view>
+                <view :class="curNow==1?'checksub':'nocheck'" @click="sectionChange(1)">热门</view>
+                <!-- <u-subsection  
+                :list="subsectionlist" :current="curNow" 
+                @change="sectionChange"></u-subsection> -->
+            </view>
+        </view>
+        <!-- 评论列表 -->
+        <view class="comment" v-for="(item,index) in dataList" :key="index">
+            <view class="photo">
+                <u--image v-if="item.authorLogo" width="80rpx" height="80rpx" :src="item.authorLogo" ></u--image>
+            </view>
+            <view class="right_content">
+                <view class="rc_1">{{item.authorName || '未知用户'}}</view>
+                <view class="rc_2">{{item.createTime}}</view>
+                <view class="rc_3" @click="openPopup(item)">{{item.content}}</view>
+
+                <view class="rc_sub" v-for="(item2,index) in item.floorList" :key="index">
+                    <!-- index 只显示3条 -->
+                    <view v-if="index<2" @click="openPopup(item)" class="rc_sub_item">
+                        {{item2.authorName}}:{{item2.content}}
+                    </view>
+                </view>
+
+                <view class="rc_bottom">
+                    <view class="rb_1">{{item.time}}</view>
+                    <view @click="openPopup(item)" class="rb_2">
+                        <u--image width="40rpx" height="40rpx" src="/static/index/iconm_message.png" ></u--image>
+                        <view style="margin-left:8rpx">回复</view> 
+                    </view>
+                </view>
+
+                <u-line margin='40rpx 0' color="#e4e7ed" />
+            </view>
+        </view>
+        <view class="loadmore" @click="loadmore()" >
+            {{jiazaitext}}
+        </view>
+        <!-- 对主题进行回复 -->
+        <view class="w700 flex">
+            <u-input class="commentInput" placeholder="点击输入评论" v-model="inputValue" :auto-height="true" type="text"  />
+            <view class="btn">
+                <u-button  shape="circle" size="medium" type="primary" 
+                @click="submit1">提交</u-button>
+            </view>
+        </view>
+
+        <!-- 点击评论弹出层 -->
+        <u-popup :closeable='true' :round="10" :show="popupShow" @close="close" @open="open">
+            <view class="popupView">
+                <view class="scrollview">
+                    <!-- 弹出层中意见详情 -->
+                    <view class="comment">
+                        <view class="photo">
+                            <u--image width="80rpx" v-if="popupData.authorLogo" height="80rpx" :src="popupData.authorLogo" ></u--image>
+                        </view>
+                        <view class="right_content">
+                            <view class="rc_1" @click="toReply(popupData,2)">{{popupData.authorName || '未知用户'}}</view>
+                            <view class="rc_2">{{popupData.createTime}}</view>
+                            <view class="rc_3" @click="toReply(popupData,2)">{{popupData.content}}</view>    
+                        </view>
+                    </view>
+                    <u-line margin='30rpx 0' color="#e4e7ed" />
+                    <view class="comment" v-for="(item2,index) in popupData.floorList" :key="index">
+                        <view class="photo">
+                            <u--image width="80rpx" height="80rpx" v-if="item2.authorLogo" :src="item2.authorLogo" ></u--image>
+                        </view>
+                        <view class="right_content">
+                            <view class="rc_1" @click="toReply(item2,3)">{{item2.authorName || '未知用户'}}</view>
+                            <view class="rc_2">{{item2.createTime}}</view>
+                            <view class="rc_3" @click="toReply(item2,3)">
+                                <text v-if="item2.citeAuthorName">{{ '对 '+ item2.citeAuthorName + '回复:' }}</text>
+                                {{item2.content}}
+                            </view>    
+                        </view>
+                    </view>
+                </view>
+            </view>
+            
+            <u-line margin='20rpx 0' color="#e4e7ed" />
+            <view class="w700 btnflex">
+                <u-input class="commentInput" :placeholder="popupPlaceholder" v-model="inputValue2" :auto-height="true" type="text"  />
+                <view class="btn">
+                    <u-button  shape="circle" size="medium" type="primary" 
+                    @click="submit2">提交</u-button>
+                </view>
+            </view>
+		</u-popup>
+    </view>
+</template>
+<script>
+import {topicDetail,replyPage,topicReply} from '@/http/api/common.js'
+import * as util from '@/pages/util/util.js'
+export default {
+    options: { styleIsolation: 'shared' },
+props: {
+    topicId: {
+        type: String,
+        default: '',
+    },
+},
+watch:{
+    topicId: {
+        immediate: true,
+        handler(val) {
+           console.log(val);
+           if(val!=''){
+                //获取评论列表
+                this.getTopicReply()
+           }
+        },
+    }
+},
+data() {
+    return {
+        popupShow:false,
+        show:false,
+        inputValue:'',
+        inputValue2:'',
+        num:999,
+        popupData:{
+            name:'',
+            userimg:'',
+            content:'',
+            time:'',
+            sublist:[]
+        },
+        dataList:[],
+        subsectionlist: [
+            {
+                name: '热门'
+            },
+            {
+                name: '最新'
+            } 
+        ],
+        curNow:0,
+        popupPlaceholder:'点击输入评论',
+        pageNum:1,
+        pageSize:2,//初始为2
+        jiazaitext:'加载更多',
+        replyType:2,//回复类型 1:回复主题 2:回复楼层 3:回复楼层内的评论
+        replyId:''
+    }
+},
+onReachBottom() {
+    this.loadmore()
+},
+methods: {
+    //加载更多
+    loadmore(){
+        console.log('下拉加载',this.jiazaitext);
+        if (this.pageSize == 2) {
+            this.pageSize = 10
+            this.dataList = []
+            this.jiazaitext="加载中..."
+            this.getTopicReply()
+        }else{
+            if (this.jiazaitext=="加载更多") {
+                this.pageNum=this.pageNum+1
+                this.jiazaitext="加载中..."
+                this.getTopicReply()
+            }
+        }
+        
+        
+    },
+    async getTopicReply(){
+        let res = await topicDetail({
+            pageNum:this.pageNum,
+            pageSize:this.pageSize,
+            sortType:this.curNow==1? '1' : '',//1=热门回答: 最新回答传空
+        },this.topicId)
+        if (res.data.code == 200) {
+
+            let newrows = res.data.data.repliesPage.rows || []
+
+            this.dataList.push(...newrows)
+            this.num = res.data.data.repliesPage.total
+            if(this.dataList.length!=res.data.data.repliesPage.total){
+                this.jiazaitext="加载更多"
+            }else{
+                this.jiazaitext="已经到底"
+            }
+        }
+    },
+    sectionChange(index) {
+        console.log(index);
+        this.curNow = index;
+
+        //每次切换页签初始化请求页签
+        this.pageNum = 1
+        this.dataList = []
+        this.getTopicReply()
+    },
+    openPopup(item){
+        // 打开弹出层 
+        console.log(item);
+        this.popupData = item
+        this.popupShow = true
+    },
+    async submit1(){
+        //对主题回复
+        let res = await topicReply({
+            content:this.inputValue,
+            replyType:1, 
+        },this.topicId)
+
+        if (res.data.code == 200) {
+            util.toastFunc('回复成功')
+            this.inputValue = ''
+
+            //初始化请求页签
+            this.pageNum = 1
+            this.dataList = []
+            //获取评论列表
+            this.getTopicReply()
+        }
+    },
+    async submit2(){
+        //对子级回复
+        let res = await topicReply({
+            floorId:this.popupData.id,
+            content:this.inputValue2,
+            replyId:this.replyId,
+            replyType:this.replyType, //回复类型 1:回复主题 2:回复楼层 3:回复楼层内的评论
+        },this.topicId)
+
+        if (res.data.code == 200) {
+            util.toastFunc('回复成功')
+            this.inputValue2 = ''
+
+            //初始化请求页签
+            this.pageNum = 1
+            this.dataList = []
+            //获取评论列表
+            this.getTopicReply()
+            this.close()
+        }
+    },
+    open() {
+        // console.log('open');
+    },
+    close() {
+        this.popupShow = false
+        // console.log('close');
+    },
+    toReply(item,type){
+        //获取对谁回复
+        console.log(item);
+        this.replyType = type
+        if (type == 3) {
+            this.replyId = item.id
+        }else{
+            this.replyId = ''
+        }
+        this.popupPlaceholder = `对${item.authorName}回复`
+    }
+}
+}
+</script>
+
+<style>
+.content{
+    width: 750rpx;
+    background-color: #FFFFFF;
+    padding: 30rpx 0 30rpx 0;
+    
+}
+.plbox{
+    width: 700rpx;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+}
+.pl{
+    width: 132rpx;
+    height: 45rpx;
+    font-size: 32rpx;
+    font-weight: bold;
+    color: #333333;
+    line-height: 36rpx;
+}
+
+
+.comment{
+    display: flex;
+    width: 700rpx;
+    
+    margin-top: 40rpx;
+}
+.photo{
+    width: 80rpx;
+    height: 80rpx;
+    background: #EEEEEE;
+    opacity: 1;
+    background-image: url('@/static/btn_mine.png');
+    background-position: center center;
+    background-size: contain;
+}
+.right_content{
+     width: 598rpx;
+     margin-left: 26rpx;
+}
+.rc_1{
+    width: 500rpx;
+    height: 50rpx;
+    font-size: 28rpx;
+    font-weight: bold;
+    color: #333333;
+}
+.rc_2{
+    width: 500rpx;
+    height: 50rpx;
+    font-size: 28rpx;
+    font-weight: 400;
+    color: #999999;
+    line-height: 40rpx;
+}
+.rc_3{
+    width: 598rpx;
+    height: 80rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #333333;
+    line-height: 40rpx;
+    margin-bottom: 24rpx;
+}
+.rc_sub{
+    /* width: 560rpx;
+    min-height: 80rpx;
+    background: #F1F1F1;
+    border-radius: 8rpx 8rpx 8rpx 8rpx;
+    opacity: 1;
+    padding: 20rpx; */
+}
+.rc_sub_item{
+    width: 550rpx;
+    height: 80rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #333333;
+    line-height: 40rpx;
+
+    background: #F1F1F1;
+    border-radius: 8rpx 8rpx 8rpx 8rpx;
+    opacity: 1;
+    padding: 20rpx;
+}
+.rc_bottom{
+    display: flex;
+    font-size: 28rpx;
+    font-weight: 400;
+    color: #999999;
+    line-height: 40rpx;
+    justify-content: space-between;
+    margin-top: 24rpx;
+}
+.rb_1{
+    height: 33rpx;
+}
+.rb_2{
+    display: flex;
+}
+.btn{
+    width: 150rpx;
+    margin-left: 20rpx;
+}
+.popupView{
+    height: 1000rpx;
+    display: flex;
+    padding-top: 100rpx;
+    flex-direction: column;
+    align-items: center;
+}
+.scrollview{
+    height: 850rpx;
+    overflow: auto;
+}
+.btnflex{
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    position: absolute;
+    bottom: 20rpx;
+    left: 20rpx;
+}
+.loadmore{
+    height:200rpx;
+    text-align: center;
+    font-size: 28rpx;
+    font-weight: 400;
+    color: #999;
+    padding-top: 24rpx;
+}
+.commentInput{
+    background: #EEEEEE;
+    border-radius: 40rpx 40rpx 40rpx 40rpx; 
+}
+
+</style>
+    

+ 159 - 0
pages/components/exchange-item.vue

@@ -0,0 +1,159 @@
+<template>
+    <view>
+        <view class="box" >
+            <view class="leftbox" @click="linkDetails(info[0])">
+                <view class="leftbox_title">
+                    <u--image class="" width="40rpx" height="40rpx" src="/static/index/iconm_goutong.png" ></u--image>
+                    <view style="margin-left:16rpx">精选互动</view> 
+                </view>
+                <view class="leftbox_content">
+                    {{info[0].title}}
+                </view>
+                <view class="leftbox_num">
+                    {{info[0].views}} 人正在互动
+                </view>
+            </view>
+            <view class="rightbox">
+                <view class="rightbox_item" @click="linkDetails(info[1])">
+                    <view class="rightbox_title">
+                        <u--image style="float: left;margin-left: 20rpx;" class="" width="40rpx" height="40rpx" src="/static/index/iconm_goutong.png" ></u--image>
+                        <view style="margin-left:16rpx">{{info[1].title}}</view> 
+                    </view>
+                    <view class="leftbox_num">
+                        {{info[1].views}} 人正在互动
+                    </view>
+                </view>
+                <view style="margin-top: 20rpx;background: #EAF0FF;" class="rightbox_item" @click="linkDetails(info[2])">
+                    <view class="rightbox_title">
+                        <u--image style="float: left;margin-left: 20rpx;" class="" width="40rpx" height="40rpx" src="/static/index/iconm_goutong.png" ></u--image>
+                        <view style="margin-left:16rpx">{{info[2].title}}</view> 
+                    </view>
+                    <view class="leftbox_num">
+                        {{info[2].views}} 人正在互动
+                    </view>
+                </view>
+            </view>
+        </view>
+    </view>
+</template>
+<script>
+export default {
+props: {
+    info: {
+        type: Array,
+        default: [],
+    },
+},
+// watch:{
+//     info: {
+//         immediate: true,
+//         handler(val) {
+//            console.log(val);
+//         },
+//     }
+// },
+data() {
+    return {
+        
+    }
+},
+onLoad() {
+
+},
+methods: {
+    linkDetails(e){
+        uni.navigateTo({
+             url: '/pages/home/ArticleDetails?id=' + e.id
+        });
+    }
+}
+}
+</script>
+
+<style>
+.box{
+    display: flex;
+    margin: 20rpx auto;
+    justify-content: center;
+    background: white;
+    padding: 20rpx 0;
+}
+.leftbox{
+    width: 343rpx;
+    height: 400rpx;
+    background: #FFF7EC;
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    opacity: 1;
+    
+    display: flex;
+    flex-direction: column;
+    justify-content: space-around;
+
+}
+.rightbox{
+    margin-left: 20rpx;
+    width: 356rpx;
+    height: 320rpx;
+    background: white;
+    opacity: 1;
+}
+.rightbox_item{
+    width: 343rpx;
+    height: 192rpx;
+    background: #EFF9F1;
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    opacity: 1;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-around;
+}
+.leftbox_title{
+    display: flex;
+    font-weight: 400;
+    color: #666666;
+    font-size: 28rpx;
+    padding-left: 40rpx;
+}
+.leftbox_content{
+    width: 252rpx;
+    font-size: 28rpx;
+    font-weight: bold;
+    color: #333333;
+    margin: 0 auto;
+
+    height: 180rpx;
+
+    display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:3;
+}
+.leftbox_num{
+    width: 185rpx;
+    height: 33rpx;
+    font-size: 24rpx;
+    font-weight: 400;
+    color: #999999;
+    
+    padding-left: 40rpx;
+}
+.rightbox_title{
+    display: flex;
+    margin-left: 20rpx;
+    width: 288rpx;
+    height: 70rpx;
+    font-size: 28rpx;
+    font-weight: bold;
+    color: #333333;
+
+    /* display: -webkit-box; */
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:2;
+}
+</style>
+    

+ 165 - 0
pages/components/videoList.vue

@@ -0,0 +1,165 @@
+<template>
+    <view class="content">
+        <view @click="linkDetails(item)" v-for="(item,index) in newsList" :key="index" class="box" >
+            <view class="box_img">
+                <u--image radius='16rpx' class="" width="90vw" height="395rpx" :src="item.coverList[0].fileUrl" ></u--image>
+                <view class="iconm_play">
+                    <u--image  width="128rpx" height="128rpx" src="/static/index/iconm_play.png" ></u--image>
+                </view>
+                
+            </view>
+            <view class="box_title">
+                {{item.title}}
+            </view>
+            <view class="box_bottom">
+                <view class="box_type">
+                    <view class="flex">
+                        <u--image width="40rpx" height="40rpx" src="/static/index/iconm_shitu.png" ></u--image>
+                        <view style="margin-left:8rpx">{{ item.views || 0}}</view> 
+                    </view>
+                    <view class="flex" style="margin-left:10rpx">
+                        <u--image width="40rpx" height="40rpx" src="/static/index/iconm_message.png" ></u--image>
+                        <view style="margin-left:8rpx">{{ item.num || 0}}</view> 
+                    </view>
+                </view>
+                <view class="box_type">
+                    <view class="flex">{{item.subIdName}}</view>
+                    <view class="flex" style="margin-left:24rpx">{{ computerTime(item) }}</view>
+                </view>
+            </view>
+        </view>
+    </view>
+</template>
+<script>
+export default {
+    props: {
+    listdata: {
+        type: Array,
+        default: [],
+    },
+},
+watch:{
+    listdata: {
+        immediate: true,
+        handler(val) {
+           console.log(val);
+           this.newsList = val
+        },
+    }
+},
+data() {
+    return {
+        newsList:[]
+    }
+},
+onLoad() {
+
+},
+methods: {
+    computerTime(data){
+        let time = data?.time || data?.createTime
+        if (time) {
+            return time.slice(5,10)
+        }else{
+            return ''
+        }
+    },
+    linkDetails(e){
+        uni.navigateTo({
+             url: '/pages/home/ArticleDetails?id=' + e.id
+        });
+    }
+}
+}
+</script>
+
+<style>
+.content{
+    width: 100vw;
+    background-color: #FFFFFF;
+    padding: 30rpx 0 30rpx 0;
+}
+.title{
+    display: flex;
+    width: 90vw;
+    justify-content: space-between;
+    margin: 0 auto;
+}
+.title_text{
+    width: 128rpx;
+    height: 45rpx;
+    font-size: 32rpx;
+    font-weight: bold;
+    color: #333333;
+    line-height: 45rpx;
+}
+.title_more{
+    width: 80rpx;
+    height: 40rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #999999;
+    line-height: 40rpx;
+}
+.box{
+    display: flex;
+    margin: 20rpx auto;
+    justify-content: flex-start;
+    width: 90vw;
+    flex-direction: column;
+    align-items: center;
+    height: 510rpx;
+}
+.box_img{
+    width: 100%;
+    height: 395rpx;
+    border-radius: 16rpx;
+    background-color: #999999;
+}
+.box_right{
+    margin-left: 10rpx;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-around;
+}
+.box_title{
+    margin-top: 24rpx;
+
+    width: 100%;
+    height: 45rpx;
+    font-size: 32rpx;
+    font-weight: bold;
+    color: #333333;
+    line-height: 45rpx;
+
+    display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:1;
+}
+.box_bottom{
+    margin-top: 16rpx;
+    display: flex;
+    justify-content: space-between;
+    width: 100%;
+}
+.box_type{
+    display: flex;
+    justify-content: space-between;
+
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #999999;
+    line-height: 40rpx;
+}
+.iconm_play{
+    position: relative;
+    left: 40%;
+    top: -260rpx;
+    z-index: 150;
+    width: 128rpx;
+}
+</style>
+    

+ 149 - 0
pages/components/wenzhanList.vue

@@ -0,0 +1,149 @@
+<template>
+    <view>
+        <view class="content">
+            <view @click="linkDetails(item)" v-for="(item,index) in newsList" :key="index" class="box" >
+                <view class="box_img">
+                    <u--image radius='16rpx' width="224rpx" height="168rpx" :src="item.coverList[0].fileUrl" ></u--image>
+                </view>
+                <view class="box_right">
+                    <view class="box_title">
+                        {{item.title}}
+                    </view>
+                    <view class="box_type">
+                        <view :class="currentName == 'default' ?'type_one':'type_one_index'">{{item.subIdName}}</view>
+                        <view>{{ computerTime(item) }}</view>
+                    </view>
+                </view>
+            </view>
+        </view>
+
+    </view>
+</template>
+<script>
+export default {
+    props: {
+        listdata: {
+            type: Array,
+            default: ()=>[],
+        },
+        currentName:{
+            type:String,
+            default:'default'
+        }
+    },
+watch:{
+    listdata: {
+        immediate: true,
+        handler(val) {
+        //    console.log(val);
+           this.newsList = val
+        },
+    }
+},
+data() {
+return {
+    newsList:[]
+}
+},
+onLoad(e) {
+    
+},
+methods: {
+    computerTime(data){
+        let time = data?.time || data?.createTime
+        if (time) {
+            return time.slice(5,10)
+        }else{
+            return ''
+        }
+    },
+    linkDetails(e){
+        uni.navigateTo({
+             url: '/pages/home/ArticleDetails?id=' + e.id
+        });
+    }
+}
+}
+</script>
+
+<style>
+.content{
+    width: 100vw;
+    background-color: #FFFFFF;
+    padding: 30rpx 0 30rpx 0;
+}
+.box{
+    display: flex;
+    margin: 40rpx auto;
+    justify-content: flex-start;
+    width: 90vw;
+    height: 160rpx;
+}
+.box_img{
+    width: 224rpx;
+    height: 168rpx;
+    border-radius: 16rpx;
+    background-color: #999999;
+}
+.box_right{
+    margin-left: 10rpx;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+}
+.box_title{
+    width: 454rpx;
+    height: 80rpx;
+    font-size: 28rpx;
+    font-weight: bold;
+    color: #333333;
+    line-height: 40rpx;
+
+    margin-left: 12rpx;
+
+    display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:2;
+}
+.box_type{
+    display: flex;
+    justify-content: space-between;
+
+    font-size: 28rpx;
+    font-weight: 400;
+    color: #999999;
+    line-height: 40rpx;
+}
+.type_one{
+    width: 136rpx;
+    height: 48rpx;
+    background: #DEEEFC;
+    border-radius: 8rpx 8rpx 8rpx 8rpx;
+    opacity: 1;
+    
+    
+    font-size: 28rpx;
+    font-weight: 400;
+    color: #46A6FF;
+    line-height: 48rpx;
+    text-align: center;
+}
+.type_one_index{
+    width: 136rpx;
+    height: 48rpx;
+    /* background: #DEEEFC; */
+    border-radius: 8rpx 8rpx 8rpx 8rpx;
+    opacity: 1;
+    
+    
+    font-size: 28rpx;
+    font-weight: 400;
+    color: #999;
+    line-height: 48rpx;
+    text-align: center;
+}
+</style>
+    

+ 204 - 0
pages/home/ArticleDetails.vue

@@ -0,0 +1,204 @@
+<template>
+	<view class="ArticleDetails">
+		<view class="Articletitle">
+            {{ info.title }}
+        </view>
+        <view class="subtitle">
+            <view class="subtitle_left">
+                <view class="subtitle_left_item">
+                    {{info.columnIdName}}
+                    <text style="color: #fff;margin: 0 10rpx;">{{ '|' }}</text> 
+                    {{info.subIdName}}
+                </view>
+                <!-- <view class="subtitle_left_item">{{info.subIdName}}</view> -->
+            </view>
+            <view class="subtitle_right">
+                <u--image width="40rpx" height="40rpx" src="/static/index/iconm_shitu.png" ></u--image>
+                {{ info.views || 0 }}
+            </view>
+        </view>
+        <view class="time">
+            {{ info.time }}
+        </view>
+        <view class="vHtml" v-if="!showVido">
+            <u-parse class="vHtml" :content="info.content"></u-parse>
+        </view>
+        <view class="videoBox" v-else>
+            <!-- 视频组件 -->
+            <video style="width: 710rpx;" :src="info.videoUrl"></video>
+        </view>
+        <view class="linebox">
+
+        </view>
+        <view>
+            <!-- 评论组件 -->
+            <comment :topicId="info.id"></comment>
+        </view>
+	</view>
+</template>
+
+<script>
+import comment from '@/pages/components/comment.vue'
+import {getArticleDetailByOpen} from '@/http/api/common.js'
+export default {
+    data() {
+        return {
+            info:{
+                title:'',
+                readNum:999,
+                time:'',
+                content:'',
+                columnIdName:'',
+                subIdName:'',
+                videoUrl:'',
+                id:''
+            },
+            showVido:false
+        }
+    },
+    components: {
+        comment
+    },
+    async onLoad(e) {
+        if (e?.id != '') {
+            await this.initData(e?.id)
+        }else{
+            uni.showToast({
+                title: '参数错误',
+                duration: 2000
+            });
+        }
+    },
+    onShow() {
+        
+    },
+    computed:{
+        
+    },
+    methods: {
+        async initData(id){
+            let query = {
+                id:id
+            }
+            
+            //获取文章详情
+            let res =  await getArticleDetailByOpen(query)
+            if (res.data.code == 200) {
+                this.info = res.data.data
+
+                if (this.info.subIdName == '视频资讯') {
+                    this.info.videoUrl = this.info.videoList[0].fileUrl
+                    this.showVido = true
+                }else{
+                    this.showVido = false
+                }
+                
+            }
+        }
+    }
+}
+</script>
+
+<style>
+.ArticleDetails{
+    width: 750rpx;
+    margin: 0 auto;
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+    padding-left: 20rpx;
+}
+.Articletitle{
+    width: 710rpx;
+    height: 112rpx;
+    font-size: 40rpx;
+    font-family: PingFang SC, PingFang SC;
+    font-weight: bold;
+    color: #333333;
+    line-height: 56rpx;
+
+    display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:2;
+
+}
+.subtitle{
+    width: 710rpx;
+    height: 48rpx;
+    display: flex;
+    margin-top: 33rpx;
+    justify-content: space-between;
+}
+.subtitle_left{
+    width: 304rpx;
+    height: 48rpx;
+    display: flex;
+}
+.subtitle_left_item{
+    width: 300rpx;
+    height: 48rpx;
+    margin-left: 4rpx;
+    background: #EAF0FF;
+    border-radius: 8rpx 8rpx 8rpx 8rpx;
+    text-align: center;
+    font-size: 28rpx;
+    font-weight: 400;
+    color: #46A6FF;
+    line-height: 40rpx;
+}
+.subtitle_right{
+    width: 85rpx;
+    height: 48rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #999999;
+    display: flex;
+}
+
+.time{
+    width: 300rpx;
+    height: 33rpx;
+    font-size: 28rpx;
+    font-weight: 400;
+    color: #999999;
+    line-height: 40rpx;
+
+    margin-top: 20rpx;
+    margin-bottom: 40rpx;
+}
+.vHtml{
+    width: 710rpx;
+    line-height: 48rpx;
+}
+.vHtml >>> img {
+    vertical-align: middle;
+    border-style: none;
+    width: 100%;
+    height: auto;
+    border-radius: 16rpx;
+    margin:40rpx 0 ;
+}
+.vHtml >>> p {
+    margin-top: 30rpx;
+    margin-bottom: 30rpx;
+}
+
+.vHtml >>> h1{
+    margin-top: 30rpx;
+    margin-bottom: 30rpx;
+}
+
+.videoBox{
+    width: 710rpx;
+    margin: 24rpx 0;
+}
+.linebox{
+    width: 750rpx;
+    height: 100rpx;
+    border-bottom: 30rpx solid #EEEEEE;
+    margin-left: -18rpx;
+}
+</style>

+ 358 - 0
pages/home/Information.vue

@@ -0,0 +1,358 @@
+<template>
+    <view class="bg">
+        <view class="head">
+			<view class="search" style="margin-top: 10rpx;background: #F6F6F6;">
+                <u-search bgColor='#F6F6F6' placeholder="请输入关键词" 
+                :showAction='false' @custom="searchList"  v-model="searchword"></u-search>
+                <view @click="searchList" class="searchBtn">搜索</view>
+				<!-- <u-search @custom="searchList" placeholder="请输入关键词" v-model="searchword"></u-search> -->
+			</view>
+			<view class="margintb w750" >
+                <view v-if="list1.length>0" class="w700">
+                    <u-tabs :current="tabCurrent" :list="list1" @change="tabsChange"></u-tabs>
+                </view>
+                <view @click="openMuen">
+                    <u--image width="40rpx" height="40rpx" src="/static/market/iconx__caidan1.png" ></u--image>
+                </view>
+			</view>
+            <view class="list2">
+                <view @click="changeType(index)" 
+                    :class="item.plain ?'btnview': 'checkbtnview'" 
+                    v-for="(item,index) in list2" :key="index">
+                    {{ item.name }}
+                </view>
+            </view>
+		</view>
+        <videoList v-if="currentview == 'videoList'" :listdata="newsList"></videoList>
+        <wenzhanList v-if="currentview == 'wenzhanList'" :listdata="newsList"></wenzhanList>
+        
+        <view class="loadmore" @click="loadmore()" >
+            {{jiazaitext}}
+        </view>
+    </view>
+</template>
+<script>
+import videoList from '@/pages/components/videoList.vue'
+import wenzhanList from '@/pages/components/wenzhanList.vue'
+import * as util from '@/pages/util/util.js'
+import {getMenuListByOpen,getArticleByOpen} from '@/http/api/common.js'
+export default {
+    components: {
+        videoList,
+        wenzhanList,
+    },
+    
+data() {
+return {
+    currentview:'wenzhanList',
+    list1:[],
+    list2:[],
+    tabCurrent:0,
+    pageNum:1,
+    searchword:'',
+    curNowid:'',
+    curNowsubid:'',
+    jiazaitext:'加载更多',
+    newsList:[],
+    loadingType:false,
+}
+},
+onReachBottom() {
+    this.loadmore()
+},
+onUnload(){
+},
+async onLoad() {
+    
+},
+async onShow(){
+    let curNowdata = uni.getStorageSync('curNowdata')
+    if (curNowdata&&curNowdata!='') {
+        curNowdata = JSON.parse(curNowdata)
+        this.curNowid = curNowdata?.curNowid || ''
+        this.curNowsubid = curNowdata?.curNowsubid || ''
+        this.tabCurrent = this.list1.findIndex(v => v.id == this.curNowid) || 0
+    }else{
+        this.tabCurrent = 0
+    }
+    await this.initData()
+    uni.setStorageSync('curNowdata','')
+},
+methods: {
+    async searchList(){
+        // if (this.searchword == '') {
+        //     return
+        // }
+        //每次切换页签初始化请求页签
+        this.pageNum = 1
+        this.newsList = []
+
+        //获取页签
+        await this.getArticleList()
+    },
+    async initData(){
+        //获取文章分类和数据
+        let res = await getMenuListByOpen()
+        if (res.data.code == 200 ) {
+            this.list1 = res.data.data
+
+            this.list1.push({
+                name:'互动天地',
+                id:'互动天地',
+            })
+            
+            let defaultData = this.list1[0]//默认选中第一项
+            if (this.curNowid!='') {
+                console.log('this.curNowid',this.curNowid);
+                //如果是从菜单选中跳过来的
+                defaultData = this.list1.find(v => v.id == this.curNowid)
+                // this.tabCurrent = this.list1.findIndex(v => v.id == this.curNowid) || 0
+            }
+            this.tabsChange(defaultData)
+        }
+    },
+    //tab第一级页签选择
+    tabsChange(e) {
+        console.log('22222',e);
+        if (e && e?.index) {
+            this.tabCurrent = e.index
+        }else{
+            if (this.curNowid!='') {
+                this.tabCurrent = this.list1.findIndex(v => v.id == this.curNowid) || 0
+            }
+        }
+        if (e.id == '互动天地') {
+            let curNowdata = {
+                curNowid :this.curNowid,
+                curNowsubid :this.curNowsubid
+            }
+            uni.setStorageSync('curNowdata',JSON.stringify(curNowdata));
+
+
+            uni.navigateTo({
+                url: '/pages/home/exchange'
+            });
+            return
+        }
+
+        //当前选中的id 存下来
+        this.curNowid = e.id
+
+        //切页签置空搜索
+        this.searchword = ''
+
+        if (e && e?.columnMenuSubList) {
+            this.list2 = e.columnMenuSubList.map(v => {
+                return {
+                    plain:true,
+                    ...v
+                }
+            })
+            let defaultData = 0//默认选中第一项
+            if (this.curNowsubid!='') {
+                //如果是从菜单选中跳过来的
+                defaultData = this.list2.findIndex(v => v.id == this.curNowsubid)
+            }
+            //默认获取第一项分类数据
+            this.changeType(defaultData<0?0:defaultData)
+        }else{
+            util.toastFunc('获取分类失败')
+        }
+    },
+    //第二级 子页签选择
+    async changeType(index) {
+        this.list2.forEach(item => {
+            item.plain = true
+        });
+
+        this.list2[index].plain = false
+        //当前选中的子页签id 存下来
+        this.curNowsubid = this.list2[index].id
+        if (this.list2[index].name == '视频资讯') {
+            this.currentview = 'videoList'
+        }else{
+            this.currentview = 'wenzhanList'
+        }
+        //每次切换页签初始化请求页签
+        this.pageNum = 1
+        this.newsList = []
+
+        //获取页签
+        await this.getArticleList()
+    },
+    async getArticleList(){
+        if (this.loadingType) {
+            //加载中禁止重复加载
+            return
+        }
+        this.loadingType=true
+        let data = {
+            subId:this.curNowsubid,
+            pageNum:this.pageNum,
+            titleLike:this.searchword,
+            pageSize:10,
+        }
+        let res = await getArticleByOpen(data)
+        if (res.data.code == 200) {
+            let newrows = res.data.data?.rows || []
+
+            this.newsList.push(...newrows)
+            
+            if(this.newsList.length!=res.data.data.total){
+                this.jiazaitext="加载更多"
+            }else{
+                this.jiazaitext="已经到底"
+            }
+        }
+        this.loadingType=false
+    },
+    //加载更多
+    loadmore(){
+        console.log('下拉加载',this.jiazaitext);
+        if (this.jiazaitext=="加载更多") {
+            this.pageNum=this.pageNum+1
+            this.jiazaitext="加载中..."
+            this.getArticleList()
+        }
+    },
+    openMuen(){
+        let curNowdata = {
+            curNowid :this.curNowid,
+            curNowsubid :this.curNowsubid
+        }
+        uni.setStorageSync('curNowdata',JSON.stringify(curNowdata) );
+        uni.navigateTo({
+            url: '/pages/home/allview?curNowid='+this.curNowid+'&curNowsubid='+this.curNowsubid
+        });
+    }
+}
+}
+</script>
+
+<style>
+.bg{
+    background-color: #F6F6F6;
+    width: 100vw;
+    height: 100vh;
+}
+.head{
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    background: #FFFFFF;
+    opacity: 1;
+    height: 340rpx;
+    margin-bottom: 32rpx;
+}
+.u-notice-bar{
+    width: 90vw;
+    margin: 0 auto;
+}
+.u-search{
+    width: 702rpx;
+    margin: 0 auto;
+}
+.margintb{
+    margin: 16rpx 0;
+    display: flex;
+    align-items: center;
+}
+.list2{
+    display: flex;
+    justify-content: flex-start;
+    width: 90vw;
+}
+
+
+.content{
+    width: 100vw;
+    background-color: #FFFFFF;
+    padding: 30rpx 0 30rpx 0;
+}
+.box{
+    display: flex;
+    margin: 20rpx auto;
+    justify-content: flex-start;
+    width: 90vw;
+    height: 160rpx;
+}
+.box_img{
+    width: 224rpx;
+    height: 150rpx;
+    border-radius: 16rpx;
+    background-color: #999999;
+}
+.box_right{
+    margin-left: 10rpx;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-evenly;
+}
+.box_title{
+    width: 454rpx;
+    height: 80rpx;
+    font-size: 28rpx;
+    font-weight: bold;
+    color: #333333;
+    line-height: 40rpx;
+
+    display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:2;
+}
+.box_type{
+    display: flex;
+    justify-content: space-between;
+
+    font-size: 28rpx;
+    font-weight: 400;
+    color: #999999;
+    line-height: 40rpx;
+}
+
+
+.checkbtnview{
+    width: 160rpx;
+    height: 64rpx;
+    background: #DEEEFC;
+    border-radius: 40rpx 40rpx 40rpx 40rpx;
+    opacity: 1;
+
+    font-size: 28rpx;
+    font-weight: 400;
+    color: #46A6FF;
+    line-height: 64rpx;
+    text-align: center;
+
+    margin-right: 20rpx;
+
+}
+.btnview{
+    width: 160rpx;
+    height: 64rpx;
+    background: #F1F1F1;
+    border-radius: 40rpx 40rpx 40rpx 40rpx;
+    opacity: 1;
+
+    font-size: 28rpx;
+    font-weight: 400;
+    color: #999;
+    line-height: 64rpx;
+    text-align: center;
+    margin-right: 20rpx;
+
+}
+.loadmore{
+    height:200rpx;
+    text-align: center;
+    font-size: 28rpx;
+    font-weight: 400;
+    color: #999;
+    padding-top: 24rpx;
+}
+</style>
+    

+ 101 - 0
pages/home/allview.vue

@@ -0,0 +1,101 @@
+<template>
+	<view class="avw">
+		<!-- <view class="tabs">
+			<u-tabs height="80" :is-scroll="false" :list="list1" @click="changeTab"></u-tabs>
+		</view>
+		<view v-if="current == 1">
+			<tabsColumn :openType="current"></tabsColumn>
+		</view>
+		<view v-else>
+			<tabsColumn :openType="current"></tabsColumn>
+		</view> -->
+
+		<tabsColumn :tabsItem="tabsItem" :curNowdata="curNowdata" :tabsList="tabsList" :openType="current"></tabsColumn>
+	</view>
+</template>
+
+<script>
+import tabsColumn from './base/tabs-column.vue'
+import * as util from '@/pages/util/util.js'
+import {getMenuListByOpen,getArticleByOpen} from '@/http/api/common.js'
+export default {
+data() {
+return {
+	list1: [{
+		name: '最新资讯',
+		key :'1'
+	}, {
+		name: '视频资讯',
+		key:'2'
+	}],
+	current:'1',
+	curNowsubid:'1',
+	curNowid:'1',
+	tabsList: [],//右侧内容
+	tabsItem: [],//左侧菜单
+}
+},
+components: {
+	tabsColumn
+},
+async onLoad(e) {
+	this.curNowdata = e
+	await this.initData(e)
+},
+onShow() {
+	
+},
+computed:{
+	
+},
+methods: {
+	async initData(e){
+		//获取文章分类和数据
+		let res = await getMenuListByOpen()
+		if (res.data.code == 200 ) {
+			this.tabsItem = res.data.data.map(v => {
+				return v.name
+			})
+			//固定添加模块
+			this.tabsItem.push('互动天地')
+
+			res.data.data.forEach(item => {
+				if (item.id == e.curNowid) {
+					item.check = true
+				}else{
+					item.check = false
+				}
+				item.columnMenuSubList.forEach(v =>{
+					if (v?.id == e.curNowsubid) {
+						v.plain = false
+					}else{
+						v.plain = true
+					}
+				})
+			});
+			this.tabsList = res.data.data
+
+			this.tabsList.push({
+				name:'互动天地',
+				columnMenuSubList:[{
+					name:'互动天地',
+					plain:true
+				}]
+			})
+
+
+
+		}
+	},
+	
+}
+}
+</script>
+
+<style>
+.tabs{
+	display: flex;
+    justify-content: center;
+}
+	
+</style>

+ 200 - 0
pages/home/base/appitem.vue

@@ -0,0 +1,200 @@
+<template>
+	<view>
+        <u-swiper v-if="swiperlist.length>0" class="swiperstyle"
+            :list="swiperlist"
+            indicatorMode="line"
+            circular
+            indicator
+            keyName="fileUrl"
+            @click="LinktoDetails"
+        ></u-swiper>
+
+        <view class="btnList">
+            <view @click="changeType(index)" 
+            :class="item.plain ?'btnview': 'checkbtnview'" 
+            v-for="(item,index) in btnList" :key="index">
+                {{ item.name }}
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+import {carouselList} from '@/http/api/common.js'
+export default {
+props: {
+    listdata: {
+        type: Object,
+        default: '',
+    },
+    openType:{
+        type: String,
+        default: '1',
+    },
+    curNowdata:{
+        type:Object
+    },
+    current:{
+        type:Number,
+        default:0
+    },
+},
+watch:{
+    listdata: {
+        immediate: true,
+        handler(val) {
+            console.log('vassss',val);
+            this.btnList = val.columnMenuSubList
+            if (val?.id) {
+                this.getCarouselList(val.id)
+            }
+        },
+    },
+    current: {
+        immediate: true,
+        handler(val) {
+             //获取轮播图
+            // this.getCarouselList()
+        },
+    },
+},
+data() {
+    return {
+        swiperlist:[],
+        btnList:[]
+    }
+},
+components: {
+    // appitem,
+},
+onLoad(e) {
+    
+},
+
+methods: {
+    async getCarouselList(id){
+        //获取轮播图
+        let res = await carouselList({
+            modules:'2',
+            modulesColumnId:id
+        })
+        if (res.data.code == 200) {
+            let data = res.data.data.rows
+            this.swiperlist = data.map(v => {
+                return {
+                    ...v,
+                    fileUrl:v.carouselUrlList[0].fileUrl
+                }
+            })
+        }
+    },
+    changeType(index) {
+        if (this.btnList[index].name == '互动天地') {
+            uni.navigateTo({
+                url: '/pages/home/exchange'
+            });
+            return
+        }
+
+        this.btnList.forEach(item => {
+            item.plain = true
+        });
+        
+
+        this.btnList[index].plain = false
+
+        let curNowdata = uni.getStorageSync('curNowdata')
+		if (curNowdata&&curNowdata!='') {
+
+			curNowdata = JSON.parse(curNowdata)
+			curNowdata['curNowsubid'] = this.btnList[index].id
+
+			uni.setStorageSync('curNowdata',JSON.stringify(curNowdata) );
+		}
+        if (this.openType == 'commodity') {
+            //从商场页过来的 选类型 不做跳转
+            
+        }else{
+            uni.switchTab({
+                url: '/pages/home/Information',
+            });
+        }
+        
+        
+    },
+    LinktoDetails(e){
+        console.log('第',e,this.swiperlist[e]);
+
+        if (this.swiperlist[e] && this.swiperlist[e]?.targetType == '2') {
+            // 2=文章;
+            // columnId 菜单栏目id/商品大类
+            // subId 子栏目id/商品子类
+            // articleId 文章id/商品id
+            if (this.swiperlist[e]?.articleId) {
+                uni.navigateTo({
+                    url: '/pages/home/ArticleDetails?id=' + this.swiperlist[e]?.articleId
+                });
+            }
+
+        }else if(this.swiperlist[e] && this.swiperlist[e]?.targetType == '3'){
+            //  3=商品;
+            if (this.swiperlist[e]?.articleId) {
+                uni.navigateTo({
+                    url: '/pages/market/ProductDetails?id=' + this.swiperlist[e]?.articleId
+                });
+            }
+        }else{
+            //跳转方式1=栏目;
+            uni.switchTab({
+                url: '/pages/home/Information',
+            });
+        }
+        
+    },
+
+}
+}
+</script>
+
+<style lang="scss">
+.btnList{
+    display: flex;
+    flex-direction: row;
+    flex-wrap: wrap;
+    justify-content: flex-start;
+}
+.swiperstyle{
+    width: 436rpx;
+    height: 187rpx;
+}
+.checkbtnview{
+    width: 206rpx;
+    height: 80rpx;
+    background: #46A6FF;
+    border-radius: 40rpx 40rpx 40rpx 40rpx;
+    opacity: 1;
+
+    font-size: 28rpx;
+    font-weight: 400;
+    color: #FFFFFF;
+    line-height: 80rpx;
+    text-align: center;
+
+    margin: 20rpx;
+}
+.btnview{
+    width: 206rpx;
+    height: 80rpx;
+    background: #F1F1F1;
+    border-radius: 40rpx 40rpx 40rpx 40rpx;
+    opacity: 1;
+
+    font-size: 28rpx;
+    font-weight: 400;
+    color: #666;
+    line-height: 80rpx;
+    text-align: center;
+
+    margin: 20rpx;
+}
+</style>

+ 140 - 0
pages/home/base/tabs-column.vue

@@ -0,0 +1,140 @@
+<template>
+	<view class="avw">
+		<view style="position: relative;overflow: hidden;" class="height1">
+			<v-tabs-column :height="tabheight" :tabs="tabs" :is-tabbar="false" position="left" active-color="#3296FA" inactive-color="#1F1F1F"
+			 bg-color="rgb(247,247,247)" :newCurrent='current' active-bg-color="rgb(255,255,255)" v-model="current" padding="30rpx 20rpx" bold="bold"
+			 @change="changeTab">
+				<view :style="{backgroundColor:'white',height:tabheight,overflow:'scroll'}" class="p" v-for="(item,index) in list" :key="index" v-show="index==current">
+					<view>
+						<appitem ref="appitem" :curNowdata="curNowdata" :openType="openType" :current='current' :listdata="item"></appitem>
+					</view>
+				</view>
+			</v-tabs-column>
+		</view>
+		<view v-if="openType == 'commodity'" class="btnbox">
+            <view @click="getType()" class="btn">
+                确定
+            </view>
+        </view>
+	</view>
+</template>
+
+<script>
+import appitem from './appitem.vue'
+export default {
+	props:{
+		openType:{
+			type: String,
+			default: '',
+		},
+		tabsList:{
+			type:Array,
+			default:[]
+		},
+		tabsItem:{
+			type:Array,
+			default:[]
+		},
+		curNowdata:{
+			type:Object
+		}
+	},
+	watch:{
+		tabsList:{
+			immediate: true,
+			handler(val) {
+				if (val && val.length>0) {
+					this.list = val
+					let current = this.list.findIndex(v => {
+						return v?.check == true
+					})
+					if (current > 0) {
+						this.changeTab(current)
+					}
+				}
+				
+			}
+    	},
+		tabsItem:{
+			immediate: true,
+			handler(val) {
+				this.tabs = val
+			}
+    	}
+	},
+data() {
+return {
+	list: [],
+	current: 0,
+	tabs: [],
+	tabheight:"calc(100vh - 222rpx)"
+}
+},
+components: {
+appitem,
+},
+onLoad(e) {
+
+},
+onShow() {
+
+},
+
+methods: {
+	changeTab(index) {
+		console.log(index);
+		this.current = index;
+
+		let curNowdata = uni.getStorageSync('curNowdata')
+		if (curNowdata&&curNowdata!='') {
+
+			curNowdata = JSON.parse(curNowdata)
+			curNowdata['curNowid'] = this.tabsList[index].id
+
+			uni.setStorageSync('curNowdata',JSON.stringify(curNowdata) );
+		}
+		
+	},
+	getType(){
+		//获取商品类型
+		console.log(this.$refs.appitem[this.current]);
+	},
+}
+}
+</script>
+
+<style lang="scss">
+	.height1{
+		height: calc(100% - 326rpx);
+	}
+	
+	.avw {
+		width: 100%;
+		height: 100%;
+		background-color: rgb(255, 255, 255);
+
+		.headSearch {
+			background-color: #FFFFFF;
+			width: 100%;
+		}
+	}
+	.btnbox{
+		position: fixed;
+		bottom: 20rpx;
+		left:24rpx;
+	}
+	.btn{
+		width: 702rpx;
+		height: 80rpx;
+		background: #46A6FF;
+		border-radius: 64rpx 64rpx 64rpx 64rpx;
+		opacity: 1;
+
+		font-size: 28rpx;
+		font-weight: 500;
+		color: #FFFFFF;
+		line-height: 80rpx;
+		text-align: center;
+	}
+
+</style>

+ 276 - 0
pages/home/exchange.vue

@@ -0,0 +1,276 @@
+<template>
+    <view class="bg">
+        <view class="head">
+            <view v-if="list1.length>0" class="margintb">
+                <u-tabs :current="tabCurrent" :list="list1" @click="tabsChange"></u-tabs>
+            </view>
+            <view class="search" style="margin-top: 10rpx;background: #F6F6F6;">
+				<u-search bgColor='#F6F6F6' placeholder="请输入关键词" 
+                :showAction='false'
+                @custom="searchList"  v-model="searchword"></u-search>
+                <view @click="searchList" class="searchBtn">搜索</view>
+			</view>
+		</view>
+
+        <view>
+            <exchangeItem :info="info" ></exchangeItem>
+        </view>
+
+        <view class="plbox">
+            <view class="pl">{{total + ' '}}条互动</view>
+            <view class="pl">{{mytotal + ' '}}我参与的</view>
+            <view class="subsection" >
+                <view :class="curNow==0?'checksub':'nocheck'" @click="sectionChange(0)">最新</view>
+                <view :class="curNow==1?'checksub':'nocheck'" @click="sectionChange(1)">热门</view>
+
+            </view>
+        </view>
+
+        <videoList v-if="currentview == 'videoList'" :listdata="newsList"></videoList>
+        <wenzhanList v-if="currentview == 'wenzhanList'" :listdata="newsList"></wenzhanList>
+
+        <view class="loadmore" @click="loadmore()" >
+            {{jiazaitext}}
+        </view>
+        <view style="height:100rpx"></view>
+    </view>
+</template>
+<script>
+import exchangeItem from '@/pages/components/exchange-item.vue'
+import videoList from '@/pages/components/videoList.vue'
+import wenzhanList from '@/pages/components/wenzhanList.vue'
+import * as util from '@/pages/util/util.js'
+import {moduleBySeven,getMenuListByOpen,joinCountByMe,contentPage} from '@/http/api/common.js'
+export default {
+    components: {
+        videoList,
+        exchangeItem,
+        wenzhanList
+    },
+    
+data() {
+return {
+    info:[],
+    currentview:'wenzhanList',
+    list1:[],
+    list2:[],
+    tabCurrent:0,
+    pageNum:1,
+    searchword:'',
+    curNowid:'',
+    curNowsubid:'',
+    jiazaitext:'加载更多',
+    newsList:[],
+    num:999,
+    curNow:0,
+    total:0,
+    mytotal:0,
+    subsectionlist: [
+        {
+            name: '热门'
+        },
+        {
+            name: '最新'
+        } 
+    ],
+    loadingType:false,
+}
+},
+onReachBottom() {
+    this.loadmore()
+},
+onLoad(e) {
+   this.getmoduleBySeven()
+   this.initData()
+
+},
+methods: {
+     sectionChange(index) {
+        console.log(index);
+        this.curNow = index;
+
+        //每次切换页签初始化请求页签
+        this.pageNum = 1
+        this.newsList = []
+        this.getArticleList()
+    },
+     async getmoduleBySeven(){
+        //获取模块7
+        let res = await moduleBySeven()
+        if (res.data.code == 200) {
+            this.info = res.data.data.contentVoList
+
+        }
+    },
+    async searchList(){
+        // if (this.searchword == '') {
+        //     return
+        // }
+        //每次切换页签初始化请求页签
+        this.pageNum = 1
+        this.newsList = []
+
+        //获取页签
+        await this.getArticleList()
+    },
+     async initData(){
+        //获取文章分类和数据
+        let res = await getMenuListByOpen()
+        if (res.data.code == 200 ) {
+            this.list1 = res.data.data
+
+            let defaultData = this.list1[0]//默认选中第一项
+            if (this.curNowid!='') {
+                //如果是从菜单选中跳过来的
+                defaultData = this.list1.find(v => v.id == this.curNowid)
+                this.tabCurrent = this.list1.findIndex(v => v.id == this.curNowid)
+            }
+
+            this.tabsChange(defaultData)
+        }
+    },
+     //tab第一级页签选择
+    tabsChange(e) {
+        //当前选中的id 存下来
+        this.curNowid = e.id
+
+        //切页签置空搜索
+        this.searchword = ''
+        //每次切换页签初始化请求页签
+        this.pageNum = 1
+        this.newsList = []
+
+        if (e && e?.columnMenuSubList) {
+            this.list2 = e.columnMenuSubList.map(v => {
+                return {
+                    plain:true,
+                    ...v
+                }
+            })
+
+            if (this.list2[0].name == '视频资讯') {
+                this.currentview = 'videoList'
+            }else{
+                this.currentview = 'wenzhanList'
+            }
+
+            //直接获取模块列表
+            this.getArticleList()
+        }else{
+            util.toastFunc('获取分类失败')
+        }
+    },
+    
+    async getArticleList(){
+        if (this.loadingType) {
+            //加载中禁止重复加载
+            return
+        }
+        this.loadingType=true
+        let data = {
+            columnId:this.curNowid,
+            pageNum:this.pageNum,
+            titleLike:this.searchword,
+            pageSize:10,
+        }
+        // 1=热门回答;2=最新回答;3=带解答?暂时改成我的提问
+        let res = await contentPage(data,this.curNow==0?'2':'1')
+        if (res.data.code == 200) {
+            //总条数
+            this.total = res.data.data?.total 
+            // 我参与的
+            if (uni.getStorageSync('AppAuthorization')) {
+                let res2 = await joinCountByMe()
+                this.mytotal = res2?.data?.data || 0
+
+            }
+            let newrows = res.data.data?.rows || []
+
+            this.newsList.push(...newrows)
+            
+            if(this.newsList.length!=res.data.data.total){
+                this.jiazaitext="加载更多"
+            }else{
+                this.jiazaitext="已经到底"
+            }
+        }
+        this.loadingType=false
+    },
+    //加载更多
+    loadmore(){
+        console.log('下拉加载',this.jiazaitext);
+        if (this.jiazaitext=="加载更多") {
+            this.pageNum=this.pageNum+1
+            this.jiazaitext="加载中..."
+            this.getArticleList()
+        }
+    },
+}
+}
+</script>
+
+<style>
+.bg{
+    background-color: #F6F6F6;
+    width: 100vw;
+    height: 100vh;
+}
+.head{
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    background: #FFFFFF;
+    opacity: 1;
+    height: 240rpx;
+}
+.u-notice-bar{
+    width: 90vw;
+    margin: 0 auto;
+}
+.u-search{
+    width: 90vw;
+}
+.margintb{
+    margin: 16rpx 0;
+}
+.list2{
+    display: flex;
+    justify-content: space-around;
+    width: 90vw;
+}
+
+
+.content{
+    width: 100vw;
+    background-color: #FFFFFF;
+    padding: 30rpx 0 30rpx 0;
+}
+
+.loadmore{
+    height:200rpx;
+    text-align: center;
+    font-size: 28rpx;
+    font-weight: 400;
+    color: #999;
+    padding-top: 24rpx;
+}
+
+.plbox{
+    width: 750rpx;
+    background: #FFF;
+    display: flex;
+    justify-content: space-evenly;
+    align-items: center;
+    padding-top: 24rpx;
+}
+.pl{
+    width: 170rpx;
+    height: 45rpx;
+    font-size: 28rpx;
+    font-weight: 400;
+    color: #666;
+    line-height: 36rpx;
+}
+</style>
+    

+ 74 - 0
pages/index/base/Exchange.vue

@@ -0,0 +1,74 @@
+<template>
+    <view>
+        <view class="title" >
+            <view class="title_text">{{title}}</view>
+            <view class="title_more" @click="linkpath()">更多></view>
+        </view>
+        <view v-if="info">
+            <exchangeItem :info="info" ></exchangeItem>
+        </view>
+
+    </view>
+</template>
+<script>
+import exchangeItem from '@/pages/components/exchange-item.vue'
+import {moduleBySeven} from '@/http/api/common.js'
+export default {
+components: {
+    exchangeItem,
+},
+data() {
+    return {
+        info:[],
+        title:'互动天地',
+    }
+},
+async mounted() {
+   this.getmoduleBySeven()
+},
+methods: {
+    async getmoduleBySeven(){
+        //获取模块7
+        let res = await moduleBySeven()
+        if (res.data.code == 200) {
+            this.title = res.data.data.title
+            this.info = res.data.data.contentVoList
+
+        }
+    },
+    linkpath(){
+        uni.navigateTo({
+             url: '/pages/home/exchange'
+        });
+    }
+}
+}
+</script>
+
+<style>
+.title{
+    display: flex;
+    width: 90vw;
+    justify-content: space-between;
+    margin: 0 auto;
+}
+.title_text{
+    width: 128rpx;
+    height: 45rpx;
+    font-size: 32rpx;
+    font-weight: bold;
+    color: #333333;
+    line-height: 45rpx;
+}
+.title_more{
+    width: 80rpx;
+    height: 40rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #999999;
+    line-height: 40rpx;
+}
+
+
+</style>
+    

+ 132 - 0
pages/index/base/Market.vue

@@ -0,0 +1,132 @@
+<template>
+    <view>
+        <view class="title" >
+            <view class="title_text">{{info.title}}</view>
+            <view class="title_more" @click="clicktoMore">更多></view>
+        </view>
+
+        <view class="box" >
+            <view @click="clicktabs(menuslist[0])" v-if="menuslist[0]" class="leftbox" >
+                <u--image width="280rpx" height="340rpx" :src="menuslist[0].imgUrl" ></u--image>
+            </view>
+            <view class="rightbox">
+                <view @click="clicktabs(menuslist[1])" v-if="menuslist[1]" class="rightbox_item">
+                    <u--image width="406rpx" height="162rpx" :src="menuslist[1].imgUrl" ></u--image>
+                </view>
+                <view @click="clicktabs(menuslist[2])" v-if="menuslist[2]" style="margin-top: 20rpx;" class="rightbox_item">
+                    <u--image width="406rpx" height="162rpx" :src="menuslist[2].imgUrl" ></u--image>
+                </view>
+            </view>
+        </view>
+
+    </view>
+</template>
+<script>
+import {moduleByThree} from '@/http/api/common.js'
+export default {
+data() {
+    return {
+        menuslist:[],
+        info:{
+            title:'信息行情'
+        }
+    }
+},
+async mounted() {
+   this.getmoduleByThree()
+},
+methods: {
+    async getmoduleByThree(){
+        //获取模块3
+        let res = await moduleByThree()
+        this.menuslist = []
+        if (res.data.code == 200) {
+            this.info = res.data.data
+            this.menuslist = res.data.data.subList.map(v =>{
+                return {
+                    ...v,
+                    imgUrl:v.coverList[0].fileUrl
+                }
+            })
+
+        }
+    },
+    clicktabs(item){
+        let data = {
+            curNowid:item.columnId,
+            curNowsubid:item.subId,
+        }
+        uni.setStorageSync('curNowdata',JSON.stringify(data) );
+        uni.switchTab({
+            url: '/pages/home/Information',
+        });
+    },
+    clicktoMore(){
+        if (this.info?.moreToSubId && this.info?.moreToColumnId) {
+            let data = {
+                curNowid:this.info?.moreToColumnId,
+                curNowsubid:this.info?.moreToSubId,
+            }
+            uni.setStorageSync('curNowdata',JSON.stringify(data) );
+            uni.switchTab({
+                url: '/pages/home/Information',
+            });
+        }
+    },
+}
+}
+</script>
+
+<style>
+.title{
+    display: flex;
+    width: 90vw;
+    justify-content: space-between;
+    margin: 0 auto;
+}
+.title_text{
+    width: 128rpx;
+    height: 45rpx;
+    font-size: 32rpx;
+    font-weight: bold;
+    color: #333333;
+    line-height: 45rpx;
+}
+.title_more{
+    width: 80rpx;
+    height: 40rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #999999;
+    line-height: 40rpx;
+}
+.box{
+    display: flex;
+    margin: 20rpx 0;
+    justify-content: center;
+}
+.leftbox{
+    width: 280rpx;
+    height: 340rpx;
+    /* background: #FFE9CC;
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    opacity: 1; */
+
+    background: linear-gradient(180deg, #FFEDD6 0%, #FECE8F 100%);
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    opacity: 1;
+}
+.rightbox{
+    margin-left: 20rpx;
+    width: 406rpx;
+    height: 340rpx;
+    background: white;
+    opacity: 1;
+}
+.rightbox_item{
+    height: 162rpx;
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    background: #FFEDD6;
+}
+</style>
+    

+ 296 - 0
pages/index/base/head.vue

@@ -0,0 +1,296 @@
+<template>
+    <view>
+        <view class="bg">
+			<view class="search" style="margin-top: 10rpx;">
+				<u-search bgColor='#fff' placeholder="请输入关键词" 
+                :showAction='false'
+                @custom="Linkto('Information')" @click="Linkto('Information')" 
+                :disabled='true' v-model="searchword"></u-search>
+                <view class="searchBtn">搜索</view>
+			</view>
+			<view class="margintb w700" >
+				<u-tabs keyName='subIdName'
+                    :activeStyle="{
+                            color:'#000',
+                            fontSize: '42rpx',
+                            transform: 'scale(1.05)'
+                        }"
+                     @click="clicktabs" :list="list1"></u-tabs>
+			</view>
+            <view class="swiperstyle">
+                <u-swiper 
+                    style="width:720rpx"
+                    height="300rpx"
+					:list="swiperlist"
+					indicatorMode="line"
+					circular
+					indicator
+                    keyName="fileUrl"
+                    @click="LinktoDetails"
+				></u-swiper>
+            </view>
+            
+			
+		</view>
+		<view v-if="showNoticeBar" class="margintop40 w750 flexjc" >
+            <view class="noticeBar">
+                <view class="noticeBar_1">
+                    <u--image width="40rpx" height="40rpx" src="/static/index/btn_xiaox.png" ></u--image>
+                    最新消息
+                </view>
+                <view @click="openDetails" class="noticeBar_2">
+                    {{noticeDetails.title}}
+                </view>
+                <view>
+                    <u--image @click="showNoticeBar = false" width="40rpx" height="40rpx" src="/static/index/icomx_sahnchu1.png" ></u--image>
+                </view>
+            </view>
+			<!-- <u-notice-bar :url="'/pages/myinfo/notifiesPageDetails?id=' + noticeDetails.id" :text="noticeDetails.title" mode="closable"></u-notice-bar> -->
+		</view>
+    
+        <view class="menus">
+          <view @click="clicktabs(item)" v-for="item in menuslist" :key="item.id">
+            <view class="menus_item">
+              <u--image width="80rpx" height="80rpx" :src="item.imgUrl" ></u--image>
+              <view style="margin-top: 16rpx;">{{item.subIdName}}</view>
+            </view>
+          </view>
+        </view>
+    </view>
+</template>
+<script>
+import {carouselList,moduleByOne,moduleByTwo,notifiesPage} from '@/http/api/common.js'
+export default {
+data() {
+return {
+    list1:[
+        {
+            subIdName: '推荐',
+        }
+    ],
+    swiperlist:[],
+    searchword:'',
+    noticebarmsg: '测试公告测试公告测试公告测试公告',
+    menuslist:[],
+    noticeDetails:{
+        title:''
+    },
+    actionStyle:{
+        width:'100rpx',
+        color:'#333'
+    },
+    inputStyle:{
+        width:'300rpx'
+    },
+    showNoticeBar:true
+}
+},
+async mounted() {
+   this.getCarouselList()
+   this.getmoduleByOne()
+   this.getmoduleByTwo()
+   this.getnotifiesPage()
+},
+methods: {
+    async getnotifiesPage(){
+        let res = await notifiesPage({
+            pageSize:1,
+            pageNum:1,
+        })
+        if (res.data.code == 200) {
+            this.noticeDetails = res.data.data?.rows[0]
+        }
+    },
+    openDetails(){
+        uni.navigateTo({
+             url: '/pages/myinfo/notifiesPageDetails?id=' + this.noticeDetails.id
+        });
+    },
+    Linkto(key){
+        uni.switchTab({
+            url: '/pages/home/Information',
+        });
+    },
+    LinktoDetails(e){
+        console.log('第',e,this.swiperlist[e]);
+
+        if (this.swiperlist[e] && this.swiperlist[e]?.targetType == '2') {
+            // 2=文章;
+            // columnId 菜单栏目id/商品大类
+            // subId 子栏目id/商品子类
+            // articleId 文章id/商品id
+            if (this.swiperlist[e]?.articleId) {
+                uni.navigateTo({
+                    url: '/pages/home/ArticleDetails?id=' + this.swiperlist[e]?.articleId
+                });
+            }
+
+        }else if(this.swiperlist[e] && this.swiperlist[e]?.targetType == '3'){
+            //  3=商品;
+            if (this.swiperlist[e]?.articleId) {
+                uni.navigateTo({
+                    url: '/pages/market/ProductDetails?id=' + this.swiperlist[e]?.articleId
+                });
+            }
+        }else{
+            //跳转方式1=栏目;
+            uni.switchTab({
+                url: '/pages/home/Information',
+            });
+        }
+        
+    },
+    async getCarouselList(){
+        //获取轮播图
+        let res = await carouselList({
+            modules:'1'
+        })
+        if (res.data.code == 200) {
+            let data = res.data.data.rows
+            this.swiperlist = data.map(v => {
+                return {
+                    ...v,
+                    fileUrl:v.carouselUrlList[0].fileUrl
+                }
+            })
+        }
+    },
+    async getmoduleByOne(){
+        //获取模块1
+        let res = await moduleByOne()
+        
+        if (res.data.code == 200) {
+            this.list1 = [
+                {
+                    subIdName: res.data.data.title,
+                }
+            ]
+            this.list1 = [
+                ...this.list1,
+                ...res.data.data.subList
+            ]
+        }
+    },
+    async getmoduleByTwo(){
+        //获取模块1
+        let res = await moduleByTwo()
+        this.menuslist = []
+        if (res.data.code == 200) {
+            this.menuslist = res.data.data.subList.map(v =>{
+                return {
+                    ...v,
+                    imgUrl:v.coverList[0].fileUrl
+                }
+            })
+
+        }
+    },
+    clicktabs(item){
+        if (item.subIdName != '推荐') {
+            let data = {
+                curNowid:item.columnId,
+                curNowsubid:item.subId,
+            }
+            uni.setStorageSync('curNowdata',JSON.stringify(data) );
+            uni.switchTab({
+                url: '/pages/home/Information',
+            });
+        }
+    }
+}
+}
+</script>
+
+<style>
+.w700{
+    width: 702rpx;
+}
+.content {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+}
+.bg{
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    background: linear-gradient(180deg, #A3D1FC 0%, #FFFFFF 50%);
+    opacity: 1;
+    width: 750rpx;
+}
+.u-notice-bar{
+    width: 702rpx !important;
+    height: 40rpx !important;
+    background: #FFFFFF;
+    margin: 0 auto !important;
+}
+/* .u-search{
+    width: 702rpx !important;
+    height: 80rpx !important;
+} */
+
+.margintb{
+    margin: 16rpx 0;
+}
+.margintop40{
+    margin-top: 40rpx;
+}
+.menus_item{
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    font-size: 28rpx;
+    font-weight: 400;
+    color: #333333;
+    line-height: 45rpx;
+}
+.menus{
+    padding-bottom: 20rpx;
+    display: flex;
+    justify-content: space-around;
+    width: 90vw;
+    margin: 0 auto;
+    margin-top: 40rpx;
+}
+.swiperstyle{
+    width: 702rpx;
+    height: 300rpx;
+    box-shadow: 0px 0px 20px 0px rgba(0,0,0,0.5);
+    border-radius: 16rpx;
+}
+
+.noticeBar{
+    width: 702rpx;
+    height: 90rpx;
+    background: linear-gradient(90deg, #FFF4E5 0%, #FFFFFF 100%);
+    border-radius: 8rpx 8rpx 8rpx 8rpx;
+    opacity: 1;
+
+    display: flex;
+    align-items: center;
+}
+.noticeBar_1{
+    width: 216rpx;
+    display: flex;
+    font-size: 28rpx;
+    font-weight: bold;
+    color: #000000;
+    justify-content: space-evenly;
+    align-items: center;
+    border-right: 1rpx solid #ccc;
+}
+.noticeBar_2{
+    margin-left: 16rpx;
+    width: 430rpx;
+    font-size: 28rpx;
+    font-weight: bold;
+    color: #000000;
+
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+</style>
+    

+ 136 - 0
pages/index/base/newVideo.vue

@@ -0,0 +1,136 @@
+<template>
+    <view>
+        <view class="title" >
+            <view class="title_text">{{info.title}}</view>
+            <view class="title_more" @click="clicktoMore">更多></view>
+        </view>
+        <view v-if="menuslist.length>0">
+            <videoList :listdata="menuslist" ></videoList>
+        </view>
+    </view>
+</template>
+<script>
+import videoList from '@/pages/components/videoList.vue'
+import {moduleByFive} from '@/http/api/common.js'
+export default {
+    components: {
+        videoList,
+    },
+data() {
+    return {
+        menuslist:[],
+        info:{
+            title:'最新资讯'
+        }
+    }
+},
+async mounted() {
+   this.getmoduleByFive()
+},
+methods: {
+    async getmoduleByFive(){
+        //获取模块5
+        let res = await moduleByFive()
+        this.menuslist = []
+        if (res.data.code == 200) {
+            this.info = res.data.data
+            this.menuslist = res.data.data.articleVoList
+
+        }
+    },
+    clicktoMore(){
+        if (this.info?.moreToSubId && this.info?.moreToColumnId) {
+            let data = {
+                curNowid:this.info?.moreToColumnId,
+                curNowsubid:this.info?.moreToSubId,
+            }
+            uni.setStorageSync('curNowdata',JSON.stringify(data) );
+            uni.switchTab({
+                url: '/pages/home/Information',
+            });
+        }
+    },
+}
+}
+</script>
+
+<style>
+.title{
+    display: flex;
+    width: 90vw;
+    justify-content: space-between;
+    margin: 0 auto;
+}
+.title_text{
+    width: 128rpx;
+    height: 45rpx;
+    font-size: 32rpx;
+    font-weight: bold;
+    color: #333333;
+    line-height: 45rpx;
+}
+.title_more{
+    width: 80rpx;
+    height: 40rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #999999;
+    line-height: 40rpx;
+}
+.box{
+    display: flex;
+    margin: 20rpx 0;
+    justify-content: flex-start;
+    width: 90vw;
+    flex-direction: column;
+    align-items: center;
+}
+.box_img{
+    width: 100%;
+    height: 395rpx;
+    border-radius: 16rpx;
+    background-color: #999999;
+}
+.box_right{
+    margin-left: 10rpx;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-around;
+}
+.box_title{
+    width: 100%;
+    height: 45rpx;
+    font-size: 32rpx;
+    font-weight: bold;
+    color: #333333;
+    line-height: 45rpx;
+
+    display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:1;
+}
+.box_bottom{
+    display: flex;
+    justify-content: space-between;
+    width: 100%;
+}
+.box_type{
+    display: flex;
+    justify-content: space-between;
+
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #999999;
+    line-height: 40rpx;
+}
+.iconm_play{
+    position: relative;
+    left: 40%;
+    top: -260rpx;
+    z-index: 150;
+}
+</style>
+    

+ 127 - 0
pages/index/base/news.vue

@@ -0,0 +1,127 @@
+<template>
+    <view>
+        <view class="title" >
+            <view class="title_text">{{info.title}}</view>
+            <view class="title_more" @click="clicktoMore">更多></view>
+        </view>
+        <view v-if="menuslist.length>0">
+            <wenzhanList currentName='index' :listdata="menuslist" ></wenzhanList>
+        </view>
+
+    </view>
+</template>
+<script>
+import wenzhanList from '@/pages/components/wenzhanList.vue'
+
+import {moduleByFour} from '@/http/api/common.js'
+export default {
+components: {
+    wenzhanList,
+},
+data() {
+    return {
+        menuslist:[],
+        info:{
+            title:'最新资讯'
+        }
+    }
+},
+async mounted() {
+   this.getmoduleByFour()
+},
+methods: {
+    async getmoduleByFour(){
+        //获取模块4
+        let res = await moduleByFour()
+        this.menuslist = []
+        if (res.data.code == 200) {
+            this.info = res.data.data
+            this.menuslist = res.data.data.articleVoList
+
+        }
+    },
+    clicktoMore(){
+        if (this.info?.moreToSubId && this.info?.moreToColumnId) {
+            let data = {
+                curNowid:this.info?.moreToColumnId,
+                curNowsubid:this.info?.moreToSubId,
+            }
+            uni.setStorageSync('curNowdata',JSON.stringify(data) );
+            uni.switchTab({
+                url: '/pages/home/Information',
+            });
+        }
+    },
+}
+}
+</script>
+
+<style>
+.title{
+    display: flex;
+    width: 90vw;
+    justify-content: space-between;
+    margin: 0 auto;
+}
+.title_text{
+    width: 128rpx;
+    height: 45rpx;
+    font-size: 32rpx;
+    font-weight: bold;
+    color: #333333;
+    line-height: 45rpx;
+}
+.title_more{
+    width: 80rpx;
+    height: 40rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #999999;
+    line-height: 40rpx;
+}
+.box{
+    display: flex;
+    margin: 20rpx auto;
+    justify-content: flex-start;
+    width: 90vw;
+    height: 160rpx;
+}
+.box_img{
+    width: 224rpx;
+    height: 150rpx;
+    border-radius: 16rpx;
+    background-color: #999999;
+}
+.box_right{
+    margin-left: 10rpx;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-around;
+}
+.box_title{
+    width: 454rpx;
+    height: 80rpx;
+    font-size: 28rpx;
+    font-weight: bold;
+    color: #333333;
+    line-height: 40rpx;
+
+    display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:2;
+}
+.box_type{
+    display: flex;
+    justify-content: space-between;
+
+    font-size: 28rpx;
+    font-weight: 400;
+    color: #999999;
+    line-height: 40rpx;
+}
+
+</style>
+    

+ 203 - 0
pages/index/base/shoppingMalls.vue

@@ -0,0 +1,203 @@
+<template>
+    <view>
+        <view class="title" >
+            <view class="title_text">商场分类</view>
+            <view @click="linkto('commodity')" class="title_more">更多></view>
+        </view>
+
+        <view class="box" >
+            <u-grid :border="false" col="4" >
+                <u-grid-item v-for="(listItem,listIndex) in list" :key="listIndex" >
+                    <view class="box_grid">
+                        <u--image width="80rpx" @click="clickItem(listItem)" height="80rpx" :src="listItem.imgUrl" ></u--image>
+                        <text class="grid-text">{{listItem.columnIdName}}</text>
+                    </view>
+                </u-grid-item>
+            </u-grid>
+            
+            <view class="box_two">
+                <view v-if="rexiaoList.length>0" class="box_two_item">
+                    <view class="bt_item_title">热销心选</view>
+                    <view class="flex">
+                        <view @click="linkto(item)" v-for="(item,index) in rexiaoList" :key="index">
+                            <view class="bt_item_img">
+                                <u--image width="130rpx" height="130rpx" :src="item.fileList[0].fileUrl" ></u--image>
+                            </view>
+                            <view class="bt_item_text">
+                                <text style="font-size: 16rpx;">¥</text>{{item.price}}
+                            </view>
+                        </view>
+                    </view>
+                </view>
+                <view v-if="haowuList.length>0" class="box_two_item">
+                    <view class="bt_item_title">好物推荐</view>
+                    <view class="flex">
+                        <view @click="linkto(item)" v-for="(item,index) in haowuList" :key="index">
+                            <view class="bt_item_img">
+                                 <u--image width="130rpx" height="130rpx" :src="item.fileList[0].fileUrl" ></u--image>
+                            </view>
+                            <view class="bt_item_text">
+                                <text style="font-size: 16rpx;">¥</text>{{item.price}}
+                            </view>
+                        </view>
+                    </view>
+                </view>
+            </view>
+        </view>
+    </view>
+</template>
+<script>
+import {toastFunc} from '@/pages/util/util.js'
+import {moduleBySix,productPage} from '@/http/api/common.js'
+export default {
+data() {
+    return {
+        list: [],
+        rexiaoList:[],
+        haowuList:[],
+    }
+},
+async mounted() {
+   this.getmoduleBySix()
+   this.getProductPage()
+},
+methods: {
+    async getmoduleBySix(){
+        //获取模块6
+        let res = await moduleBySix()
+        this.list = []
+        if (res.data.code == 200) {
+            this.list = res.data.data.subList.map(v =>{
+                return {
+                    ...v,
+                    imgUrl:v.coverList[0].fileUrl
+                }
+            })
+
+        }
+    },
+    async getProductPage(categoryId=''){
+        
+        // 标签;1=热销心选;2=好物推荐
+        let res =  await productPage({
+            tag:1,
+            pageSize:2,
+            pageNum:1,
+        })
+        let res2 =  await productPage({
+            tag:2,
+            pageSize:2,
+            pageNum:1,
+        })
+        
+        if (res.data.code == 200) {
+            this.rexiaoList = res.data.data.rows
+            this.haowuList = res2.data.data.rows
+        }
+    },
+    clickItem(item){
+        console.log(item);
+        // toastFunc('点击了'+item.columnIdName)
+        uni.setStorageSync('categoryId', item.columnId)
+        uni.setStorageSync('columnIdName', item.columnIdName)
+        uni.switchTab({
+            url: '/pages/market/commodity',
+        });
+    },
+    linkto(item){
+        if (item == 'commodity') {
+            uni.switchTab({
+                url: '/pages/market/commodity',
+            });
+        }else{
+            uni.navigateTo({
+                url: '/pages/market/ProductDetails?id=' + item.id
+            });
+        }
+        
+    }
+}
+}
+</script>
+
+<style>
+.title{
+    display: flex;
+    width: 90vw;
+    justify-content: space-between;
+    margin: 0 auto;
+}
+.title_text{
+    width: 128rpx;
+    height: 45rpx;
+    font-size: 32rpx;
+    font-weight: bold;
+    color: #333333;
+    line-height: 45rpx;
+}
+.title_more{
+    width: 80rpx;
+    height: 40rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #999999;
+    line-height: 40rpx;
+}
+.box{
+    margin: 80rpx 0 20rpx 0;
+    background: linear-gradient(180deg, #FFFFFF 0%, #ECF6FF 100%);
+    border-radius: 20rpx 20rpx 20rpx 20rpx;
+    opacity: 1;
+    width: 95vw;
+}
+.box_grid{
+    margin: 20rpx 0;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+.grid-text{
+    font-size: 28rpx;
+    font-weight: bold;
+    color: #333333;
+    margin-top: 16rpx;
+}
+.box_two{
+    display: flex;
+    display: flex;
+    justify-content: space-around;
+    padding: 40rpx 20rpx;
+}
+.box_two_item{
+    width: 327rpx;
+    height: 283rpx;
+    background: #FFFFFF;
+    border-radius: 10rpx 10rpx 10rpx 10rpx;
+    opacity: 1;
+    /* padding: 10rpx; */
+}
+.bt_item_title{
+    width: 128rpx;
+    height: 45rpx;
+    font-size: 32rpx;
+    font-weight: bold;
+    color: #333333;
+    margin: 24rpx;
+}
+.bt_item_img{
+    width: 130rpx;
+    height: 130rpx;
+    background: #EEEEEE;
+    border-radius: 0rpx 0rpx 0rpx 0rpx;
+    opacity: 1;
+}
+.bt_item_text{
+    width: 130rpx;
+    height: 28rpx;
+    font-size: 24rpx;
+    font-weight: bold;
+    color: #F6514F;
+    text-align: center;
+}
+</style>
+    

+ 61 - 0
pages/index/index.vue

@@ -0,0 +1,61 @@
+<template>
+	<view class="content">
+		<!-- 首页信息 -->
+		<iHead></iHead>
+		<!-- 行情信息 -->
+		<Market class="margintop20"></Market>
+		<!-- 商场分类 -->
+		<shoppingMalls class="margintop20"></shoppingMalls>
+		<!-- 最新资讯 -->
+		<news class="margintop20"></news>
+		<!-- 最新视频 -->
+		<newVideo class="margintop20"></newVideo>
+		<!-- 互动天地 -->
+		<Exchange class="margintop20"></Exchange>
+	</view>
+</template>
+
+<script>
+import iHead from './base/head.vue'
+import Market from './base/Market.vue'
+import shoppingMalls from './base/shoppingMalls.vue'
+import news from './base/news.vue'
+import newVideo from './base/newVideo.vue'
+import Exchange from './base/Exchange.vue'
+
+import {carouselList} from '@/http/api/common.js'
+export default {
+	components: {
+        iHead,
+		Market,
+		shoppingMalls,
+		news,
+		newVideo,
+		Exchange
+	},
+data() {
+	return {
+		
+	}
+},
+async onLoad() {
+},
+methods: {
+	
+}
+}
+</script>
+
+<style>
+	.content {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		overflow-y: hidden;
+	}
+	.margintop20{
+		margin-top: 40rpx;
+	}
+	
+</style>

+ 98 - 0
pages/market/BrowsingHistory.vue

@@ -0,0 +1,98 @@
+<template>
+    <view>
+        
+        <rowList :listdata="newsList" ></rowList>
+
+        <view class="loadmore" @click="loadmore()" >
+            {{jiazaitext}}
+        </view>
+    </view>
+</template>
+<script>
+import rowList from '@/pages/market/base/rowList.vue' //左右布局
+import {collectionList,browsingHistoryPage} from '@/http/api/common.js'
+export default {
+components: {
+    rowList,
+},
+data() {
+    return {
+        newsList:[],
+        jiazaitext:'加载更多',
+        pageNum:1,
+        pageSize:10,
+        showType:'jilu'
+    }
+},
+async onLoad(e) {
+    this.newsList = []
+    if (e.showType) {
+        if (e.showType == 'shouchang') {
+            uni.setNavigationBarTitle({
+                title: '收藏列表'
+            })
+        }
+        this.showType = e.showType
+    }
+    //获取商品列表
+    await this.getList()
+   
+},
+onReachBottom() {
+    this.loadmore()
+},
+methods: {
+    //加载更多
+    loadmore(){
+        console.log('下拉加载',this.jiazaitext);
+        if (this.jiazaitext=="加载更多") {
+            this.pageNum=this.pageNum+1
+            this.jiazaitext="加载中..."
+            this.getList()
+        }
+    },
+    async getList(){
+        let res = {
+            data:null
+        }
+        if (this.showType == 'shouchang') {
+            //获取收藏列表
+            res = await collectionList({
+                pageSize:this.pageSize,
+                pageNum:this.pageNum,
+            })
+        }else{
+             //获取浏览记录
+             res = await browsingHistoryPage({
+                pageSize:this.pageSize,
+                pageNum:this.pageNum,
+            })
+        }
+        if (res.data?.code == 200) {
+            let newrows = res.data.data?.rows || []
+
+            this.newsList.push(...newrows)
+            
+            if(this.newsList.length!=res.data.data.total){
+                this.jiazaitext="加载更多"
+            }else{
+                this.jiazaitext="已经到底"
+            }
+        }
+    },
+    
+}
+}
+</script>
+
+<style>
+.loadmore{
+    height:200rpx;
+    text-align: center;
+    font-size: 28rpx;
+    font-weight: 400;
+    color: #999;
+    padding-top: 24rpx;
+}
+</style>
+    

+ 491 - 0
pages/market/OrderDetails.vue

@@ -0,0 +1,491 @@
+<template>
+    <view class="bg">
+        <view class="head">
+            <view class="head_text1">
+                {{ computerStatus(orderDetailData.status) }}
+            </view>
+            <view class="head_text2">
+                <!-- 订单已提交,请在30分钟内完成支付,超时订单将自动取消 -->
+                确认订单详情
+            </view>
+        </view>
+        <view class="address" >
+            <view>
+                <u--image width="40rpx" height="40rpx" src="/static/market/icomm_dizhi.png" ></u--image>
+            </view>
+            <view class="address_text">
+                <view class="flex_start">
+                    <view class="mr">默认</view>
+                    <!-- <view class="mr1">{{orderDetailData.deliveryAddress}}</view> -->
+                </view>
+                <view class="address_conter">
+                    {{orderDetailData.deliveryAddress}}
+                </view>
+                <view class="flex_start address_bottom" >
+                    <view>{{orderDetailData.consignee}}</view>
+                    <view style="margin-left:8rpx">{{orderDetailData.contact}}</view>
+                </view>
+            </view>
+             <!-- <view @click="openaddress">
+                <u--image width="40rpx" height="40rpx" src="/static/myinfo/btn_right.png" ></u--image>
+            </view> -->
+        </view>
+
+        <view class="commodity">
+            <view class="commodity_title">厦门海嘉成商城</view>
+            <view class="mc_item" v-for="(item,index) in orderDetailData.detailVoList" :key="index">
+                <view class="item_swipe">
+					<view class="box_img">
+						<u--image width="180rpx" height="180rpx" :src="item.fileList[0].fileUrl" ></u--image>
+					</view>
+					<view class="box_text">
+						<view class="box_title">
+							{{ item.productTitle }}
+						</view>
+						<view class="box_type">
+							已选择 {{item.specsName}}
+						</view>
+						<view class="box_num">
+							<view class="bn_left">
+								¥{{item.price}}
+							</view>
+							<view class="bn_right">
+                                {{ 'x' + item.num }}
+							</view>
+						</view>
+					</view>
+				</view>
+            </view>
+        </view>
+
+        <view class="PriceInfo2">
+            <view class="PriceInfo_title">订单信息</view>
+            <view class="PriceInfo_item">
+                <view>订单编号</view>
+                <view>{{orderDetailData.orderNo}}</view>
+            </view>
+            <view class="PriceInfo_item">
+                <view>下单时间</view>
+                <view>{{orderDetailData.createTime}}</view>
+            </view>
+            <!-- <view class="PriceInfo_item">
+                <view>支付方式</view>
+                <view>微信支付</view>
+            </view>
+            <view class="PriceInfo_item">
+                <view>发票类型</view>
+                <view>普通发票</view>
+            </view>
+            <view class="PriceInfo_item">
+                <view>发票内容</view>
+                <view>商品明细</view>
+            </view> -->
+        </view>
+
+        <view class="PriceInfo">
+            <view class="PriceInfo_title">费用明细</view>
+            <view class="PriceInfo_item">
+                <view>商品总额</view>
+                <view>¥ {{orderDetailData.productPrice}}</view>
+            </view>
+            <view class="PriceInfo_item">
+                <view>加工费用</view>
+                <view>¥ {{orderDetailData.processPrice}}</view>
+            </view>
+            <view class="PriceInfo_item">
+                <view>包装袋费</view>
+                <view>¥ {{orderDetailData.packagePrice}}</view>
+            </view>
+            <!-- <view class="PriceInfo_item">
+                <view>优惠券</view>
+                <view>¥ 450.00</view>
+            </view> -->
+            <view class="PriceInfo_item">
+                <view>实付金额</view>
+                <view style="color: #F6514F;font-weight: bold;font-size: 28rpx;">¥ {{orderDetailData.totalPrice}}</view>
+            </view>
+        </view>
+        <view style="height: 200rpx;">
+
+        </view>
+
+        <view class="btnBox" >
+            <view class="bm_btn">
+                <view v-if="orderDetailData.status=='1'" @click="cancelOrder" class="bm_btn1">取消订单</view>
+                <view v-else @click="returnPage" class="bm_btn2">返回</view>
+            </view>
+        </view>
+    </view>
+</template>
+<script>
+import {orderDetail,cancelOrder} from '@/http/api/common.js'
+export default {
+components: {
+},
+data() {
+    return {
+        orderDetailData:{
+            deliveryAddress:'',
+            consignee:'',
+            contact:'',
+            detailVoList:[]//订单列表
+        },
+    }
+},
+async onLoad(e) {
+    if (e?.orderId) {
+        await this.getOrderDetail(e?.orderId)
+    }
+},
+methods: {
+    computerStatus(status){
+        let a = {
+            '1':'未确认',
+            '2':'已确认',
+            '3':'已取消',
+            '4':'已完成',
+        }
+        return a[status]
+    },
+    async getOrderDetail(id){
+        let res = await orderDetail(id)
+        if (res.data.code ==200) {
+            this.orderDetailData = res.data.data
+            
+        }
+    },
+    openaddress(){
+        //打开地址设置
+        uni.navigateTo({
+             url: '/pages/myinfo/address'
+        });
+    },
+    async cancelOrder(){
+        //取消订单
+        let res = await cancelOrder(id)
+        if (res.data.code == 200) {
+            util.toastFunc('取消成功',()=>{
+                uni.navigateBack({ delta: 1 })
+            })
+        }
+    },
+    returnPage(){
+        uni.navigateBack({ delta: 1 })
+    }
+}
+}
+</script>
+
+<style>
+.bg{
+    width: 750rpx;
+    height: auto;
+    background: #F1F1F1;
+    border-radius: 0rpx 0rpx 0rpx 0rpx;
+
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+.address{
+    width: 702rpx;
+    height: 200rpx;
+    background: #FFFFFF;
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    opacity: 1;
+
+    margin-top: -40px;
+}
+.commodity{
+    width: 702rpx;
+    height: auto;
+    background: #FFFFFF;
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    opacity: 1;
+    margin-top: 24rpx;
+}
+.PriceInfo2{
+    width: 702rpx;
+    height: 230rpx;
+    background: #FFFFFF;
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    opacity: 1;
+    margin-top: 24rpx;
+
+    display: flex;
+	align-items: center;
+    justify-content: space-evenly;
+    flex-direction: column;
+}
+.PriceInfo{
+    width: 702rpx;
+    height: 461rpx;
+    background: #FFFFFF;
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    opacity: 1;
+    margin-top: 24rpx;
+
+    display: flex;
+	align-items: center;
+    justify-content: space-evenly;
+    flex-direction: column;
+}
+
+.PriceInfo_item{
+	display: flex;
+	justify-content: space-between;
+
+	width: 654rpx;
+	height: 40rpx;
+	font-size: 28rpx;
+	font-weight: 500;
+	color: #666666;
+	line-height: 36rpx;
+}
+.PriceInfo_title{
+	display: flex;
+
+	width: 654rpx;
+	height: 40rpx;
+	font-size: 32rpx;
+    font-weight: bold;
+    color: #333333;
+    line-height: 36rpx;
+}
+.btnBox{
+    width: 750rpx;
+    height: 100rpx;
+    background: #FFFFFF;
+    border-radius: 0rpx 0rpx 0rpx 0rpx;
+    opacity: 1;
+
+    position: fixed;
+    z-index: 10088;
+    bottom: 0;
+
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    justify-content: flex-end;
+}
+
+.bm_btn{
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    width: 250rpx;
+    height: 72rpx;
+    justify-content: space-evenly;
+}
+.bm_btn1{
+    width: 200rpx;
+    height: 72rpx;
+    background: #EEEEEE;
+    border-radius: 60rpx 60rpx 60rpx 60rpx;
+    opacity: 1;
+
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #666;
+    line-height: 72rpx;
+    text-align: center;
+}
+.bm_btn2{
+    width: 200rpx;
+    height: 72rpx;
+    background: #46A6FF;
+    border-radius: 60rpx 60rpx 60rpx 60rpx;
+    opacity: 1;
+
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #FFFFFF;
+    line-height: 72rpx;
+    text-align: center;
+}
+
+.address{
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    justify-content: space-evenly;
+}
+.flex_start{
+    display: flex;
+    justify-content: flex-start;
+    align-items: center;
+}
+.mr{
+    width: 64rpx;
+    height: 32rpx;
+    background: #FF8C33;
+    border-radius: 8rpx 8rpx 8rpx 8rpx;
+    opacity: 1;
+
+    font-size: 24rpx;
+    font-weight: 500;
+    color: #FFFFFF;
+    text-align: center;
+}
+.mr1{
+    width: 440rpx;
+    margin-left: 8rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #333333;
+}
+.commodity_title{
+    width: 196rpx;
+    height: 40rpx;
+    font-size: 28rpx;
+    font-weight: bold;
+    color: #333333;
+    line-height: 40rpx;
+    padding: 24rpx 0 0 24rpx;
+}
+.address_text{
+    width: 550rpx;
+    height: 200rpx;
+
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+
+}
+.address_conter{
+    width: 550rpx;
+    height: 45rpx;
+    font-size: 32rpx;
+    font-weight: bold;
+    color: #333333;
+    line-height: 45rpx;
+
+    margin-top: 8rpx;
+
+    display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:1;
+}
+.address_bottom{
+    width: 550rpx;
+    height: 40rpx;
+    font-size: 28rpx;
+    font-weight: bold;
+    color: #999999;
+    margin-top: 8rpx;
+}
+
+
+
+.mc_item{
+	width: 702rpx;
+	height: 244rpx;
+	background: #FFFFFF;
+	border-radius: 16rpx 16rpx 16rpx 16rpx;
+	opacity: 1;
+	margin-top: 24rpx;
+}
+.item_swipe{
+	width: 678rpx;
+	height: 244rpx;
+	background: #FFFFFF;
+	border-radius: 16rpx 16rpx 16rpx 16rpx;
+	opacity: 1;
+	display: flex;
+    align-items: center;
+    flex-direction: row;
+	padding-left: 24rpx;
+}
+
+.box_img{
+    width: 180rpx;
+    height: 180rpx;
+    background-color: #999999;
+}
+.box_text{
+	width: 392rpx;
+	height: 200rpx;
+	margin-left: 20rpx;
+
+	display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+}
+.box_title{
+	width: 392rpx;
+	height: 40rpx;
+	font-size: 28rpx;
+	font-weight: bold;
+	color: #333333;
+	line-height: 40rpx;
+
+	display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:1;
+}
+.box_type{
+	width: 410rpx;
+	height: 48rpx;
+	background: #EEEEEE;
+	border-radius: 8rpx 8rpx 8rpx 8rpx;
+	opacity: 1;
+
+	font-size: 28rpx;
+	font-weight: 500;
+	color: #999999;
+    padding-left: 24rpx;
+    line-height: 48rpx;
+
+	display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:1;
+}
+.box_num{
+	width: 410rpx;
+	display: flex;
+	justify-content: space-between;
+    align-items: center;
+}
+.bn_left{
+	width: 106rpx;
+	height: 38rpx;
+	font-size: 28rpx;
+	font-weight: bold;
+	color: #333333;
+	line-height: 36rpx;
+}
+
+.head{
+    width: 750rpx;
+    height: 300rpx;
+    background: #46A6FF;
+    border-radius: 0rpx 0rpx 0rpx 0rpx;
+    opacity: 1;
+}
+.head_text1{
+    width: 96rpx;
+    font-size: 32rpx;
+    font-weight: bold;
+    color: #FFFFFF;
+    margin-left: 24rpx;
+    margin-top: 40rpx;
+}
+.head_text2{
+    width: 678rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #FFFFFF;
+    margin-left: 24rpx;
+    margin-top: 40rpx;
+}
+</style>
+    

+ 660 - 0
pages/market/ProductDetails.vue

@@ -0,0 +1,660 @@
+<template>
+    <view class="ProductDetails">
+        <view class="PDswiper">
+            <u-swiper class="PDswiper"
+                    height="750rpx"
+					:list="swiperlist"
+					indicatorMode="line"
+                    keyName="fileUrl"
+					circular
+					indicator
+                    radius='0'
+				></u-swiper>
+		</view>
+    
+        <view class="menus">
+            <view class="menus_1">
+                <view class="menus_1_right">
+                    <text class="mr1">¥</text>
+                    <text class="mr2">{{ ProductDetails.price || 0 }}</text>
+                    <!-- <text class="mr1" v-if="ProductDetails.decimal">{{ '.'+ ProductDetails.decimal }}</text> -->
+                </view>
+                <view class="menus_1_left">
+                    销量: {{ProductDetails.salesVolume || 0}}
+                </view>
+            </view>
+            <!-- <view class="menus_2">
+                每满200-30
+            </view> -->
+            <view class="menus_3">
+                {{ProductDetails.title}}
+            </view>
+            <view class="menus_4">
+                {{ProductDetails.subTitle}}
+            </view>
+        </view>
+
+        <view class="ProductType">
+            <!-- 商品类型 -->
+            <ProductType ref="getProductType" :info='ProductDetails' />
+        </view>
+        <!-- 评论 -->
+        <view class="comment">
+            <view class="commentTop">
+                <view class="commentTop_left">
+                    评价 <text class="commentTop_left_num">({{reviewsTotal}})</text>
+                </view>
+                <view v-if="reviewsTotal!=0" @click="openLink('ProductEvaluate')" class="commentTop_right">
+                    全部评论
+                    <u--image width="40rpx" height="40rpx" src="/static/myinfo/btn_right.png" ></u--image>
+                </view>
+            </view>
+            <view v-if="reviewsTotal!=0" class="commentTop">
+                <view @click="checkCommentbtn(item,index)" :class="iscommentbtn==index?'check_commentbtn':'commentbtn'" v-for="(item,index) in commentbtnList" :key="index">
+                    {{item.name}}
+                </view>
+            </view>
+            <view v-if="reviewsTotal!=0" class="commentTop">
+                <view class="commentUser">
+                    <view class="Userimg">
+                        <u--image width="60rpx" height="60rpx" src="/static/btn_mine.png" ></u--image>
+                    </view>
+                    <view class="Userimg_r">
+                        <view style="font-size: 28rpx;font-weight: 500;color: #666666;margin-left: 8rpx;">
+                            {{showtypetopl.author}}
+                        </view>
+                        <view>
+                            <u-rate readonly active-color="#ffcf00" inactive-color="#b2b2b2" :count="5" v-model="showtypetopl.score"></u-rate>
+                        </view>
+                    </view>
+                </view>
+            </view>
+            <view v-if="reviewsTotal!=0" class="commentTop">
+                <view class="commentcontent">
+                    {{showtypetopl.content}}
+                </view>
+            </view>
+            <view style="margin-top:100rpx" v-if="reviewsTotal==0">
+                该商品暂无评价
+            </view>
+        </view>
+
+        <view class="parseBox">
+            <view class="parseBox_title">详情</view>
+            <u-parse class="vHtml" :content="ProductDetails.content"></u-parse>
+        </view>
+
+        <view class="parseBox">
+            <view class="parseBox_title">服务条款</view>
+            <u-parse class="vHtml" :content="ProductDetails.serviceTerms"></u-parse>
+            <!-- <view class="parseBox_item" v-for="(item,index) in TermServiceList" :key="index">
+                {{item}}
+            </view> -->
+        </view>
+
+        <view class="tuijian">
+            <view class="tj_title">为您推荐</view>
+            <rowList :listdata="newsList" ></rowList>
+        </view>
+
+        <view style="height: 150rpx;"></view>
+
+
+        <view class="bottomMeun">
+            <view class="bm_item">
+                <u--image width="48rpx" height="48rpx" src="/static/market/btn_kefu.png" ></u--image>
+                客服
+            </view>
+            <view @click="toCollection()" class="bm_item">
+                <u--image width="48rpx" height="48rpx" :src="ProductDetails.favorites?'/static/market/iconm_shoucang.png':'/static/market/btn_shoucang.png'" ></u--image>
+                {{ProductDetails.favorites?'取消':'收藏'}}
+            </view>
+            <view @click="openLink('market')" class="bm_item">
+                <u--image width="48rpx" height="48rpx" src="/static/market/btn_gouwc.png" ></u--image>
+                购物车
+            </view>
+            <view class="bm_btn">
+                <view @click="addShoppingCart()" class="bm_btn1">加入购物车</view>
+                <view @click="openLink('market')" class="bm_btn2">去结算</view>
+            </view>
+        </view>
+        
+    </view>
+</template>
+<script>
+import {productPage,productdetail,productcollection,reviewsPage,addShoppingCart,cancelCollection} from '@/http/api/common.js'
+
+import rowList from '@/pages/market/base/rowList.vue' //左右布局
+import ProductType from './base/ProductType.vue'
+import * as util from '@/pages/util/util.js'
+export default {
+    components:{
+        rowList,
+        ProductType
+    },
+data() {
+return {
+    newsList:[],
+    rateValue:5,
+    reviewsTotal:'0',
+    swiperlist:[],
+    TermServiceList:[],
+    ProductDetails:{
+        title:'',
+        DESCRIPTION:'',
+        serviceTerms:'',
+        num:'999',
+        decimal:"99",
+        xiaoliang:'999',
+        newsHtml:'',
+        favorites:false
+    },
+    commentbtnList:[
+        {
+            name:'全部',
+            key:''
+        },
+        {
+            name:'好评',
+            key:'3'
+        },
+        {
+            name:'中评',
+            key:'2'
+        },
+        {
+            name:'差评',
+            key:'1'
+        },
+    ],
+    iscommentbtn:0,
+    showtypetopl:{
+        author:'',
+        score:5,
+        content:''
+    }
+}
+},
+async onLoad(e) {
+    if (e?.id) {
+        //获取商品详情
+        await this.getproductdetail(e?.id)
+        //获取两条推荐商品
+        await this.getProductPage()
+        //获取评论列表
+        await this.getreviewsPage()
+    }
+    
+},
+methods: {
+     async getProductPage(){
+        let data = {
+            priceAsc:false, //价格正序排序
+            priceDesc:false, //价格倒序排序
+            salesVolumeDesc:false, //销量倒序排序
+            keyword:'', //标题,副标题搜索
+            pageSize:2,
+            pageNum:1,
+            categoryId:this.ProductDetails.categoryId //类目id
+        }
+        
+        let res =  await productPage(data)
+        if (res.data.code == 200) {
+            let newrows = res.data.data?.rows || []
+
+            this.newsList.push(...newrows)
+        }
+    },
+    async getproductdetail(id){
+        let res = await productdetail(id)
+        if (res.data.code == 200) {
+            this.ProductDetails = res.data.data
+            
+            if (this.ProductDetails.status == '0') {
+                //状态为0 表示商品已下架
+                util.toastFunc('该商品已下架',()=>{
+                    // 返回上一级
+                    uni.navigateBack({
+                        delta: 1
+                    });
+                })
+            }
+
+            // 商品轮播图
+            this.swiperlist = res.data.data?.fileList || []
+
+            //服务条款
+            // if (res.data.data?.serviceTerms) {
+            //     this.TermServiceList = res.data.data?.serviceTerms.split(',')
+            // }
+
+
+        }else{
+            util.toastFunc('该商品已下架',()=>{
+                //请求商品详情失败 返回上一页
+                uni.navigateBack({ delta: 1 })
+            })
+        }
+    },
+    async toCollection(){
+        //收藏
+        let res = null
+        if (this.ProductDetails.favorites) {
+            // favorites true 为收藏过了 调用取消收藏接口
+            res = await cancelCollection(this.ProductDetails.id)
+        }else{
+            res = await productcollection(this.ProductDetails.id)
+        }
+        
+        if (res.data.code == 200) {
+            let  title = this.ProductDetails.favorites ? '取消收藏成功' :'收藏成功'
+            uni.showToast({
+                title: title,
+                duration: 2000
+            });
+            
+            this.ProductDetails.favorites = !this.ProductDetails.favorites
+        }
+    },
+    async getreviewsPage(){
+        //获取评论列表
+        // 1=差评;2=中评;3=好评
+        let res = await reviewsPage({
+            rating:'',
+            productId:this.ProductDetails.id
+        })
+        if (res.data.code == 200) {
+            this.plList = res.data.data.rows
+            this.reviewsTotal = res.data.data.total
+            //默认选中全部类型
+            this.checkCommentbtn(this.commentbtnList[0],0)
+        }
+    },
+    checkCommentbtn(item,index){
+        this.iscommentbtn = index
+        if (item.key != '') {
+            this.showtypetopl = this.plList.find(v=>v.rating == item.key)
+        }else{
+            this.showtypetopl = this.plList[0]
+        }
+
+        // //去评论列表
+        // uni.navigateTo({
+        //     url: '/pages/market/ProductEvaluate?checkindex='+index
+        // });
+    },
+    async addShoppingCart(){
+        //加入购物车
+        if (this.$refs?.getProductType?.popupShow) {
+            let refgetData = this.$refs?.getProductType?.getCheckData()
+            if (refgetData) {
+                // if (refgetData.num == '') {
+                //     util.toastFunc('请选择商品数量')
+                //     return
+                // }
+                // if (refgetData.porList.length>0) {
+                //     console.log('refgetData.porList',refgetData.porList);
+                //     let findQuantity = refgetData.porList.find(v => v.quantity == '')
+                //     console.log(findQuantity);
+                //     if (!findQuantity) {
+                //         util.toastFunc('配方数量不能为空')
+                //         return
+                //     }
+                // }
+                let data = {
+                    productId:this.ProductDetails.id , //产品id
+                    specsId:refgetData.specsId, //规格id
+                    num:refgetData.num , //个数
+                    porList:refgetData.porList//配方id列表
+                }
+                
+                let res =  await addShoppingCart(data)
+                if (res.data.code == 200) {
+                    this.$refs?.getProductType?.close()
+                    uni.showToast({
+                        title: '添加购物车成功',
+                        duration: 2000
+                    });
+                }
+            }
+        }else{
+            this.$refs?.getProductType?.openPopup()
+        }
+    },
+    openLink(type){
+        if (type == 'market') {
+            //去购物车
+            uni.switchTab({
+                url: '/pages/market/market'
+            });
+        }else if (type == 'ProductEvaluate') {
+            //去评论列表
+            uni.navigateTo({
+                url: '/pages/market/ProductEvaluate?id='+this.ProductDetails.id
+            });
+        }
+    }
+}
+}
+</script>
+
+<style>
+.ProductDetails{
+    width: 750rpx;
+    min-height: 100vh;
+    background: #F1F1F1;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+.PDswiper{
+    width: 750rpx;
+    height: 750rpx;
+}
+.menus{
+    width: 702rpx;
+    max-height: 348rpx;
+    background: #FFFFFF;
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    opacity: 1;
+    margin-top: 24rpx;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+.menus_1{
+    width: 654rpx;
+    display: flex;
+    justify-content: space-between;
+    align-items: flex-end;
+    margin-top: 24rpx;
+}
+.menus_1_right{
+    display: flex;
+    align-items: center;
+}
+.mr1{
+    height: 33rpx;
+    font-size: 28rpx;
+    font-weight: bold;
+    color: #F6514F;
+    line-height: 36rpx;
+}
+.mr2{
+    height: 47rpx;
+    font-size: 40rpx;
+    font-weight: bold;
+    color: #F6514F;
+    line-height: 36rpx;
+}
+.menus_1_left{
+    width: 123rpx;
+    height: 40rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #999999;
+    line-height: 36rpx;
+}
+.menus_2{
+    width: 654rpx;
+    height: 64rpx;
+    background: #FFEDEC;
+    border-radius: 8rpx 8rpx 8rpx 8rpx;
+    margin-top: 24rpx;
+}
+.menus_3{
+    width: 640rpx;
+    max-height: 85rpx;
+    font-size: 32rpx;
+    font-weight: bold;
+    color: #333333;
+    line-height: 40rpx;
+    margin-top: 24rpx;
+
+    display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:2;
+}
+.menus_4{
+    width: 640rpx;
+    min-height: 40rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #666666;
+    line-height: 40rpx;
+    margin: 24rpx 0;
+
+    /* display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:1; */
+}
+.ProductType{
+    margin-top: 24rpx;
+}
+.comment{
+    width: 702rpx;
+    height: 434rpx;
+    background: #FFFFFF;
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+.commentTop{
+    width: 640rpx;
+    min-height: 45rpx;
+    margin-top: 24rpx;
+    display: flex;
+    justify-content: space-between;
+}
+.commentTop_left{
+    width: 220rpx;
+    height: 45rpx;
+    font-size: 32rpx;
+    font-weight: bold;
+    color: #333333;
+    line-height: 36rpx;
+    display: flex;
+    justify-content: space-between;
+}
+.commentTop_left_num{
+    width: 124rpx;
+    height: 37rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #999999;
+    line-height: 36rpx;
+}
+.commentTop_right{
+    display: flex;
+    width: 160rpx;
+    height: 40rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #999999;
+    line-height: 36rpx;
+}
+.commentbtn{
+    width: 151rpx;
+    height: 64rpx;
+    background: #DDDDDD;
+    border-radius: 60rpx 60rpx 60rpx 60rpx;
+    opacity: 1;
+
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #666666;
+    line-height: 64rpx;
+    text-align: center;
+}
+.check_commentbtn{
+    width: 151rpx;
+    height: 64rpx;
+    background: #46A6FF;
+    border-radius: 60rpx 60rpx 60rpx 60rpx;
+    opacity: 1;
+
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #FFF;
+    line-height: 64rpx;
+    text-align: center;
+}
+.commentcontent{
+    width: 644rpx;
+    height: 80rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #333333;
+    line-height: 40rpx;
+
+    display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:2;
+}
+.Userimg{
+    width: 80rpx;
+    height: 80rpx;
+    background: #EEEEEE;
+    border-radius: 50%;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+.commentUser{
+    display: flex;
+}
+.Userimg_r{
+    margin-left: 24rpx;
+}
+.parseBox{
+    width: 702rpx;
+    background: #FFFFFF;
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    margin-top: 24rpx;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+.parseBox_title{
+    width: 654rpx;
+    height: 45rpx;
+    font-size: 32rpx;
+    font-weight: bold;
+    color: #333333;
+    line-height: 36rpx;
+    margin-top: 24rpx;
+}
+.vHtml{
+    width: 654rpx;
+    margin: 24rpx 0;
+}
+.vHtml >>> img {
+    vertical-align: middle;
+    border-style: none;
+    width: 100%;
+    height: auto;
+}
+
+.TermService{
+    margin-top: 24rpx;
+    width: 702rpx;
+    height: 410rpx;
+    background: #FFFFFF;
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+.parseBox_item{
+    margin-top: 24rpx;
+    width: 640rpx;
+    height: 76rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #333333;
+    line-height: 36rpx;
+}
+.tuijian{
+    margin-top: 24rpx;
+    /* background: #FFFFFF; */
+}
+.tj_title{
+    font-size: 36rpx;
+    font-weight: bold;
+    color: #333333;
+    text-align: center;
+    margin-top: 24rpx;
+}
+.bottomMeun{
+    width: 750rpx;
+    height: 98rpx;
+    background: #FFFFFF;
+    border-radius: 0rpx 0rpx 0rpx 0rpx;
+    opacity: 1;
+
+    position: fixed;
+    z-index: 10088;
+    bottom: 0;
+
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    justify-content: space-between;
+}
+.bm_item{
+    width: 80rpx;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+
+    font-size: 24rpx;
+    font-weight: bold;
+    color: #666666;
+    line-height: 36rpx;
+}
+.bm_btn{
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    width: 450rpx;
+    height: 72rpx;
+    justify-content: space-evenly;
+}
+.bm_btn1{
+    width: 200rpx;
+    height: 72rpx;
+    background: #FFB048;
+    border-radius: 60rpx 60rpx 60rpx 60rpx;
+    opacity: 1;
+
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #FFFFFF;
+    line-height: 72rpx;
+    text-align: center;
+}
+.bm_btn2{
+    width: 200rpx;
+    height: 72rpx;
+    background: #46A6FF;
+    border-radius: 60rpx 60rpx 60rpx 60rpx;
+    opacity: 1;
+
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #FFFFFF;
+    line-height: 72rpx;
+    text-align: center;
+}
+</style>
+    

+ 220 - 0
pages/market/ProductEvaluate.vue

@@ -0,0 +1,220 @@
+<template>
+    <view class="ProductDetails">
+        <!-- 评论 -->
+        <view class="comment">
+            <view class="commentTop">
+                <view class="commentTop_left">
+                    评价 
+                </view>
+            </view>
+            <view class="commentTop">
+                <view @click="checkCommentbtn(item,index)" :class="iscommentbtn==index?'check_commentbtn':'commentbtn'" v-for="(item,index) in commentbtnList" :key="index">
+                    {{item.name}}
+                </view>
+            </view>
+            <view v-for="(item,index) in plList" :key="index">
+                <view class="commentTop">
+                    <view class="commentUser">
+                        <view class="Userimg">
+                            <u--image width="60rpx" height="60rpx" src="/static/btn_mine.png" ></u--image>
+                        </view>
+                        <view class="Userimg_r">
+                            <view style="font-size: 28rpx;font-weight: 500;color: #666666;margin-left: 8rpx;">
+                                {{item.author}}
+                            </view>
+                            <view>
+                                <u-rate readonly active-color="#ffcf00" inactive-color="#b2b2b2" :count="5" v-model="item.score"></u-rate>
+                            </view>
+                        </view>
+                    </view>
+                </view>
+                <view class="commentTop">
+                    <view class="commentcontent">
+                        {{item.content}}
+                    </view>
+                </view>
+            </view>
+        </view>
+        
+    </view>
+</template>
+<script>
+import {productPage,productdetail,productcollection,reviewsPage,addShoppingCart,cancelCollection} from '@/http/api/common.js'
+
+export default {
+    components:{
+
+    },
+data() {
+return {
+    TermServiceList:[],
+    ProductId:'',
+    rating:'',
+    plList:[],
+    commentbtnList:[
+        {
+            name:'全部',
+            key:''
+        },
+        {
+            name:'好评',
+            key:'3'
+        },
+        {
+            name:'中评',
+            key:'2'
+        },
+        {
+            name:'差评',
+            key:'1'
+        },
+    ],
+    iscommentbtn:0,
+    showtypetopl:null
+}
+},
+async onLoad(e) {
+    if (e?.id) {
+        this.ProductId = e?.id
+        //获取评论列表
+        await this.getreviewsPage()
+    }
+    
+},
+methods: {
+    async getreviewsPage(){
+        //获取评论列表
+        // 1=差评;2=中评;3=好评
+        let res = await reviewsPage({
+            rating:this.rating,
+            productId:this.ProductId
+        })
+        if (res.data.code == 200) {
+            this.plList = res.data.data.rows
+            //默认选中全部类型
+            // this.checkCommentbtn(this.commentbtnList[0],0)
+        }
+    },
+    checkCommentbtn(item,index){
+        this.iscommentbtn = index
+        this.rating = item.key
+
+        this.getreviewsPage()
+    },
+    
+}
+}
+</script>
+
+<style>
+.ProductDetails{
+    width: 750rpx;
+    min-height: 100vh;
+    background: #F1F1F1;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+.comment{
+    width: 702rpx;
+    /* height: 434rpx; */
+    background: #FFFFFF;
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    margin-top: 24rpx;
+}
+.commentTop{
+    width: 640rpx;
+    min-height: 45rpx;
+    margin-top: 24rpx;
+    display: flex;
+    justify-content: space-between;
+}
+.commentTop_left{
+    width: 220rpx;
+    height: 45rpx;
+    font-size: 32rpx;
+    font-weight: bold;
+    color: #333333;
+    line-height: 36rpx;
+    display: flex;
+    justify-content: space-between;
+}
+.commentTop_left_num{
+    width: 124rpx;
+    height: 37rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #999999;
+    line-height: 36rpx;
+}
+.commentTop_right{
+    display: flex;
+    width: 160rpx;
+    height: 40rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #999999;
+    line-height: 36rpx;
+}
+.commentbtn{
+    width: 151rpx;
+    height: 64rpx;
+    background: #DDDDDD;
+    border-radius: 60rpx 60rpx 60rpx 60rpx;
+    opacity: 1;
+
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #666666;
+    line-height: 64rpx;
+    text-align: center;
+}
+.check_commentbtn{
+    width: 151rpx;
+    height: 64rpx;
+    background: #46A6FF;
+    border-radius: 60rpx 60rpx 60rpx 60rpx;
+    opacity: 1;
+
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #FFF;
+    line-height: 64rpx;
+    text-align: center;
+}
+.commentcontent{
+    width: 644rpx;
+    height: 80rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #333333;
+    line-height: 40rpx;
+
+    display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:2;
+}
+.Userimg{
+    width: 80rpx;
+    height: 80rpx;
+    background: #EEEEEE;
+    border-radius: 50%;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+.commentUser{
+    display: flex;
+}
+.Userimg_r{
+    margin-left: 24rpx;
+}
+
+</style>
+    

+ 306 - 0
pages/market/PublishComments.vue

@@ -0,0 +1,306 @@
+<template>
+    <view class="bg">
+
+        <view  class="commodity">
+            <view @click="linkto(item)" class="mc_item" v-for="(item,index) in dataList.orderlist" :key="index">
+                <view class="item_swipe">
+					<view class="box_img">
+						<u--image width="180rpx" height="180rpx" :src="item.fileList[0].fileUrl" ></u--image>
+					</view>
+					<view class="box_text">
+						<view class="box_title">
+							{{ item.name }}
+						</view>
+						<view class="box_type">
+							已选择 配方原料
+						</view>
+						<view class="box_num">
+							<view class="bn_left">
+								¥1888
+							</view>
+							<view class="bn_right">
+                                {{ 'x' + item.num }}
+							</view>
+						</view>
+					</view>
+				</view>
+            </view>
+            <u-divider ></u-divider>
+            <view class="rateBox">
+                整体满意度 <u-rate active-color="#ffcf00" inactive-color="#b2b2b2" :count="5" v-model="rateValue"></u-rate>
+            </view>
+            <view class="pjBox">
+                <u--textarea  v-model="value1" placeholder="展开对商品评价..." 
+                count  maxlength="200" ></u--textarea>
+            </view>
+            
+            <view class="upload">
+                <u-upload
+                    :fileList="fileList1"
+                    @afterRead="afterRead"
+                    @delete="deletePic"
+                    name="1"
+                    multiple
+                    :maxCount="3"
+                ></u-upload>
+            </view>
+        </view>
+        <view style="height: 200rpx;"></view>
+        <view class="btnBox">
+            <view class="btn">
+                提交评价
+            </view>
+        </view>
+
+    </view>
+</template>
+<script>
+import env from "@/http/config/config.js"
+export default {
+components: {
+},
+data() {
+    return {
+        fileList1:[],
+        value1:'',
+        dataList:{   
+                    orderlist:[
+                        {
+                            check:false,
+                            name:'产品名称产',
+                            num:2,
+                        },
+                        {
+                            check:false,
+                            name:'产品名称产品名称产品名称产品产品名称产品名称产品名称产品',
+                            num:1,
+                        }
+                    ],
+					time:'2023-04-12 18:31:56',
+					name:'产品名称产',
+					type:'待付款',
+				},
+    }
+},
+onLoad() {
+
+},
+methods: {
+    linktoPublishComments(){
+        uni.navigateTo({
+             url: '/pages/market/PublishComments'
+        });
+    },
+    linkto(item){
+        uni.navigateTo({
+             url: '/pages/market/OrderDetails'
+        });
+    },
+    // 删除图片
+    deletePic(event) {
+        this[`fileList${event.name}`].splice(event.index, 1)
+    },
+    // 新增图片
+    async afterRead(event) {
+        // 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
+        let lists = [].concat(event.file)
+        let fileListLen = this[`fileList${event.name}`].length
+        lists.map((item) => {
+            this[`fileList${event.name}`].push({
+                ...item,
+                status: 'uploading',
+                message: '上传中'
+            })
+        })
+        for (let i = 0; i < lists.length; i++) {
+            const result = await this.uploadFilePromise(lists[i].url)
+            let item = this[`fileList${event.name}`][fileListLen]
+            this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
+                status: 'success',
+                message: '',
+                url: result
+            }))
+            fileListLen++
+        }
+    },
+    uploadFilePromise(url) {
+        return new Promise((resolve, reject) => {
+            let a = uni.uploadFile({
+                url: env.BASEURL + '/open/upload/uploadFile',
+                filePath: url,
+                name: 'file',
+                formData: {
+                    user: 'test'
+                },
+                success: (res) => {
+                    setTimeout(() => {
+                        resolve(res.data.data)
+                    }, 1000)
+                }
+            });
+        })
+    },
+}
+}
+</script>
+
+<style>
+.bg{
+    width: 750rpx;
+    height: auto;
+    min-height: 100vh;
+    background: #F1F1F1;
+    border-radius: 0rpx 0rpx 0rpx 0rpx;
+
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+
+.commodity{
+    width: 702rpx;
+    height: auto;
+    /* min-height: 954rpx; */
+    background: #FFFFFF;
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    opacity: 1;
+    margin-top: 24rpx;
+    /* padding-bottom: 100rpx; */
+}
+
+.commodity_title{
+    width: 650rpx;
+    height: 40rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #999;
+    line-height: 40rpx;
+    padding: 24rpx 0 0 24rpx;
+
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+}
+
+
+
+.mc_item{
+	width: 702rpx;
+	height: 244rpx;
+	background: #FFFFFF;
+	border-radius: 16rpx 16rpx 16rpx 16rpx;
+	opacity: 1;
+	margin-top: 24rpx;
+}
+.item_swipe{
+	width: 678rpx;
+	height: 244rpx;
+	background: #FFFFFF;
+	border-radius: 16rpx 16rpx 16rpx 16rpx;
+	opacity: 1;
+	display: flex;
+    align-items: center;
+    flex-direction: row;
+	padding-left: 24rpx;
+}
+
+.box_img{
+    width: 180rpx;
+    height: 180rpx;
+    background-color: #999999;
+}
+.box_text{
+	width: 392rpx;
+	height: 200rpx;
+	margin-left: 20rpx;
+
+	display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+}
+.box_title{
+	width: 392rpx;
+	height: 40rpx;
+	font-size: 28rpx;
+	font-weight: bold;
+	color: #333333;
+	line-height: 40rpx;
+
+	display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:1;
+}
+.box_type{
+	width: 410rpx;
+	height: 48rpx;
+	background: #EEEEEE;
+	border-radius: 8rpx 8rpx 8rpx 8rpx;
+	opacity: 1;
+
+	font-size: 28rpx;
+	font-weight: 500;
+	color: #999999;
+    padding-left: 24rpx;
+    line-height: 48rpx;
+
+	display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:1;
+}
+.box_num{
+	width: 410rpx;
+	display: flex;
+	justify-content: space-between;
+    align-items: center;
+}
+.rateBox{
+    display: flex;
+    margin: 24rpx;
+}
+.pjBox{
+    margin-left: 24rpx;
+
+    width: 654rpx;
+    /* height: 320rpx; */
+    background: #F1F1F1;
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    opacity: 1;
+}
+.btnBox{
+    width: 750rpx;
+    height: 100rpx;
+    background: #FFFFFF;
+    border-radius: 0rpx 0rpx 0rpx 0rpx;
+    opacity: 1;
+
+    display: flex;
+    flex-direction: row;
+    justify-content: center;
+    align-items: center;
+    position: fixed;
+    bottom: 0;
+}
+.btn{
+    width: 702rpx;
+    height: 80rpx;
+    background: #46A6FF;
+    border-radius: 64rpx 64rpx 64rpx 64rpx;
+    opacity: 1;
+
+    font-weight: 500;
+    color: #FFFFFF;
+    line-height: 80rpx;
+    text-align: center;
+}
+.upload{
+    width: 702rpx;
+    margin: 48rpx 0 48rpx 24rpx;
+}
+</style>
+    

+ 366 - 0
pages/market/allOrder.vue

@@ -0,0 +1,366 @@
+<template>
+    <view class="bg">
+        <view class="margintb tabwiew" >
+            <u-tabs keyName='subIdName' @click="clicktabs" :list="list1"></u-tabs>
+        </view>
+        <view v-for="(item) in dataList" :key="item.id" class="commodity">
+            <view class="commodity_title">
+                <view class="flex">
+                    下单时间: <view style="margin-left: 12rpx;">{{ item.createTime }}</view>
+                </view>
+                <view :style="item.status=='1'?'color:red':''">
+                    {{ computerStatus(item.status) }}
+                </view>
+            </view>
+            <u-divider ></u-divider>
+            <view @click="linkto(item)" class="mc_item" v-for="(item2) in item.detailVoList" :key="item2.id">
+                <view class="item_swipe">
+					<view class="box_img">
+						<u--image width="180rpx" height="180rpx" :src="item2.fileList[0].fileUrl" ></u--image>
+					</view>
+					<view class="box_text">
+						<view class="box_title">
+							{{ item2.productTitle }}
+						</view>
+						<view class="box_type">
+							已选择 {{ item2.specsName }}
+						</view>
+						<view class="box_num">
+							<view class="bn_left">
+								¥{{ item2.price }}
+							</view>
+							<view class="bn_right">
+                                {{ 'x' + item2.num }}
+							</view>
+						</view>
+					</view>
+				</view>
+            </view>
+            <u-divider ></u-divider>
+            <view class="heji">
+                共{{item.productsNum}}件商品合计: <text style="color: #F6514F;font-weight: bold;">¥ {{item.totalPrice}}</text> 
+            </view>
+            <view class="heji">
+                (含制作费、包装贷费)
+            </view>
+            <view class="btnright">
+                <view @click="toCancelOrder(item.id)" v-if="item.status=='1'" class="btn">取消订单</view>
+                <view @click="linktoPublishComments()" v-if="item.type=='4'" class="btn">立即评价</view>
+                <view @click="toOrderAgain(item.id)" v-if="item.status=='3'||item.status=='2'" class="btn">再次购买</view>
+            </view>
+        </view>
+        <view class="loadmore" @click="loadmore()" >
+            {{jiazaitext}}
+        </view>
+        <view style="height: 100rpx;">
+
+        </view>
+
+    </view>
+</template>
+<script>
+import {orderPage,cancelOrder,orderAgain} from '@/http/api/common.js'
+import * as util from '@/pages/util/util.js'
+export default {
+components: {
+},
+data() {
+    return {
+        list1:[
+            {
+                subIdName: '全部',
+                key:''
+            },
+            {
+                subIdName: '未确认',
+                key:'1'
+            },
+            {
+                subIdName: '已确认',
+                key:'2'
+            },
+            {
+                subIdName: '已取消',
+                key:'3'
+            },
+            {
+                subIdName: '已完成',
+                key:'4'
+            }
+        ],
+        dataList:[],//订单列表
+        status:'',
+        pageSize:10,
+        pageNum:1,
+        jiazaitext:'加载更多',
+    }
+},
+onLoad() {
+   
+},
+onShow() {
+    //每次切换页签初始化请求页签
+    this.pageNum = 1
+    this.dataList = []
+    //获取订单列表
+    this.getorderPage()
+},
+onReachBottom() {
+    this.loadmore()
+},
+methods: {
+    async toCancelOrder(id){
+        //取消订单
+        let res = await cancelOrder(id)
+        if (res.data.code == 200) {
+            util.toastFunc('取消成功',()=>{
+                this.status = ''
+                //每次切换页签初始化请求页签
+                this.pageNum = 1
+                this.dataList = []
+
+                this.getorderPage()
+            })
+        }
+    },
+    async toOrderAgain(id){
+        //再次购买
+        let res = await orderAgain(id)
+        if (res.data.code == 200) {
+            util.toastFunc('添加成功',()=>{
+                uni.switchTab({
+                    url: '/pages/market/market',
+                });
+            })
+        }
+    },
+    computerStatus(status){
+        let a = {
+            '1':'未确认',
+            '2':'已确认',
+            '3':'已取消',
+            '4':'已完成',
+        }
+        return a[status]
+    },
+     //加载更多
+     loadmore(){
+        console.log('下拉加载',this.jiazaitext);
+        if (this.jiazaitext=="加载更多") {
+            this.pageNum=this.pageNum+1
+            this.jiazaitext="加载中..."
+            this.getorderPage()
+        }
+    },
+    async getorderPage(){ 
+        // status 1未确认 2已确认 3已取消 4已完成
+        let res = await orderPage({
+            status:this.status,
+            pageSize:this.pageSize,
+            pageNum:this.pageNum,
+        })
+        if (res.data.code == 200) {
+            let newrows = res.data.data?.rows || []
+
+            this.dataList.push(...newrows)
+            
+            if(this.dataList.length!=res.data.data.total){
+                this.jiazaitext="加载更多"
+            }else{
+                this.jiazaitext="已经到底"
+            }
+        }
+    },
+    async clicktabs(item){
+        console.log(item.key);
+        this.status = item.key
+
+        //每次切换页签初始化请求页签
+        this.pageNum = 1
+        this.dataList = []
+
+        await this.getorderPage()
+    },
+    linktoPublishComments(){
+        uni.navigateTo({
+             url: '/pages/market/PublishComments'
+        });
+    },
+    linkto(item){
+        uni.navigateTo({
+             url: '/pages/market/OrderDetails?orderId=' + item.id
+        });
+    }
+}
+}
+</script>
+
+<style>
+.bg{
+    width: 750rpx;
+    height: auto;
+    min-height: 100vh;
+    background: #F1F1F1;
+    border-radius: 0rpx 0rpx 0rpx 0rpx;
+
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+
+.commodity{
+    width: 702rpx;
+    height: auto;
+    background: #FFFFFF;
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    opacity: 1;
+    margin-top: 24rpx;
+}
+
+.commodity_title{
+    width: 650rpx;
+    height: 40rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #999;
+    line-height: 40rpx;
+    padding: 24rpx 0 0 24rpx;
+
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+}
+
+
+
+.mc_item{
+	width: 702rpx;
+	height: 244rpx;
+	background: #FFFFFF;
+	border-radius: 16rpx 16rpx 16rpx 16rpx;
+	opacity: 1;
+	margin-top: 24rpx;
+}
+.item_swipe{
+	width: 678rpx;
+	height: 244rpx;
+	background: #FFFFFF;
+	border-radius: 16rpx 16rpx 16rpx 16rpx;
+	opacity: 1;
+	display: flex;
+    align-items: center;
+    flex-direction: row;
+	padding-left: 24rpx;
+}
+
+.box_img{
+    width: 180rpx;
+    height: 180rpx;
+    background-color: #999999;
+}
+.box_text{
+	width: 392rpx;
+	height: 200rpx;
+	margin-left: 20rpx;
+
+	display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+}
+.box_title{
+	width: 392rpx;
+	height: 40rpx;
+	font-size: 28rpx;
+	font-weight: bold;
+	color: #333333;
+	line-height: 40rpx;
+    
+
+	display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:1;
+}
+.box_type{
+	width: 410rpx;
+	height: 48rpx;
+	background: #EEEEEE;
+	border-radius: 8rpx 8rpx 8rpx 8rpx;
+	opacity: 1;
+
+	font-size: 28rpx;
+	font-weight: 500;
+	color: #999999;
+    padding-left: 24rpx;
+    line-height: 48rpx;
+
+	display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:1;
+}
+.box_num{
+	width: 410rpx;
+	display: flex;
+	justify-content: space-between;
+    align-items: center;
+}
+.bn_left{
+	width: 106rpx;
+	height: 38rpx;
+	font-size: 28rpx;
+	font-weight: bold;
+	color: #333333;
+	line-height: 36rpx;
+}
+.btnright{
+    display: flex;
+    justify-content: flex-end;
+}
+.btn{
+    width: 160rpx;
+    height: 64rpx;
+    background: #FFFFFF;
+    border-radius: 40rpx 40rpx 40rpx 40rpx;
+    opacity: 1;
+    border: 1rpx solid #F6514F;
+
+    font-weight: 500;
+    color: #F6514F;
+    font-size: 28rpx;
+    line-height: 64rpx;
+    text-align: center;
+
+    margin: 24rpx;
+}
+.heji{
+    display: flex;
+    align-items: center;
+    justify-content: flex-end;
+    margin-right: 24rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #999999;
+}
+.loadmore{
+    height:200rpx;
+    text-align: center;
+    font-size: 28rpx;
+    font-weight: 400;
+    color: #999;
+    padding-top: 24rpx;
+}
+.tabwiew{
+    background-color: white;
+    width: 100vw;
+    height: 50px;
+    display: flex;
+    justify-content: center;
+    font-size: 32rpx;
+}
+</style>
+    

+ 468 - 0
pages/market/base/ProductType.vue

@@ -0,0 +1,468 @@
+<template>
+    <view class="content">
+        <view class="top">
+            <view class="topItem">
+                <view class="topItem_left">选择</view>
+                <view @click="openPopup()" class="topItem_right">
+                    {{ pfname }}
+                    <u--image width="40rpx" height="40rpx" src="/static/myinfo/btn_right.png" ></u--image>
+                </view>
+            </view>
+            <!-- <view class="topItem">
+                <view class="topItem_left">配送</view>
+                <view class="topItem_right">
+                    请填写地址
+                    <u--image width="40rpx" height="40rpx" src="/static/myinfo/btn_right.png" ></u--image>
+                </view>
+            </view> -->
+            <view class="topItem">
+                <view class="topItem_left">加工费</view>
+                <view class="topItem_right2">
+                    {{info.processingFee +'/'+info.processingUnit}}
+                </view>
+            </view>
+            <view class="topItem">
+                <view class="topItem_left">包装袋费用</view>
+                <view class="topItem_right2">
+                    {{info.packagingFee +'/'+info.packagingUnit}}
+                </view>
+            </view>
+            <view class="topItem">
+                <view class="topItem_left">制作说明</view>
+                <view class="topItem_right2">
+                    {{info.assemblyGuide}}
+                </view>
+            </view>
+            <view class="topItem">
+                <view class="topItem_left">成品指标</view>
+                <view class="topItem_right2">
+                    {{info.productSpec}}
+                </view>
+            </view>
+        </view>
+
+
+        <view class="bottom">
+            <view class="bottomitem" v-for="(item,index) in list" :key="index">
+                <u--image width="40rpx" height="40rpx" src="/static/market/icomx_quertj1.png" ></u--image>
+                {{ item }}
+            </view>
+        </view>
+
+        <u-popup :closeable='true' :round="10" :show="popupShow" @close="close" @open="open">
+            <view class="popupView">
+                <view class="scrollview">
+
+                    <!-- 顶部图片和价格 -->
+                    <view class="spinfo">
+                        <view class="spinfo_img">
+                            <u--image radius='16rpx' width="200rpx" height="200rpx" :src="checkpfImg" ></u--image>
+                        </view>
+                        <view class="spinfo_text">
+                            <view class="spinfo_text1">总价</view>
+                            <view class="menus_1_right">
+                                <text class="mr1">¥</text>
+                                <text class="mr2">{{computerAllPrice()}}</text>
+                                <!-- <text class="mr1" >{{ '.'+ 99 }}</text> -->
+                            </view>
+                            <!-- <view class="spinfo_text2">已选6种配方</view> -->
+                        </view>
+                    </view>
+
+                    <!-- 选择配方 -->
+                    <view class="selectPF">
+                        <view class="selectPF_title">
+                            <view style="font-size: 28rpx;font-weight: bold;color: #333333;">推荐配方</view>
+                            
+                            <!-- <view style="font-size: 28rpx;font-weight: 500;color: #46A6FF;">确定</view> -->
+                        </view>
+                        <view class="pflist">
+                            <view @click="checkpf(item,index)" :class="ischeckpf==index?'checkPF_item':'PF_item'" v-for="(item,index) in pflist" :key="index">
+                                {{ item.name }}
+                            </view>
+                        </view>
+                        <view class="selectPF_title selectPF">
+                            <view style="font-size: 28rpx;font-weight: bold;color: #333333;">配方原料</view>
+                        </view>
+                        <view class="pfinfo">
+                            <view class="pfinfo_item" v-for="(item,index) in pfinfolist" :key="index">
+                                <view class="pfinfo_title">
+                                    <view style="font-size: 28rpx;font-weight: bold;color: #333333;">
+                                        {{item.name}} <text style="padding-left: 12rpx;font-size: 24rpx;font-weight: 500;color: #999;">{{ item.unitPrice + '元 /'+ item.unit }}</text>
+                                    </view>
+                                    <view style="font-size: 28rpx;font-weight: 500;color: #333;">
+                                        {{ '¥' + computerPrice(item)   }}
+                                    </view>
+                                </view>
+                                <view class="pfinfo_title">
+                                    <view style="font-size: 28rpx;font-weight: bold;color: #999;">
+                                       数量
+                                    </view>
+                                    <view >
+                                        <u-number-box :min="1" :max="999" integer button-size="28" v-model="item.quantity" @blur="valblur($event,item)" @change="valChange"></u-number-box>
+                                    </view>
+                                </view>
+                            </view>
+                        </view>
+                        <view class="selectPF_title selectPF">
+                            <view style="font-size: 28rpx;font-weight: bold;color: #333333;">购买数量</view>
+                            <view>
+                                <u-number-box :min="1" :max="999" integer button-size="28" v-model="num" @blur="valblur($event,'num')" @change="valChange"></u-number-box>
+                            </view>
+                            <!-- <view style="font-size: 28rpx;font-weight: 500;color: #46A6FF;">确定</view> -->
+                        </view>
+                    </view>
+
+                    <view style="height: 100rpx;"></view>
+                </view>
+            </view>
+		</u-popup>
+    </view>
+</template>
+<script>
+export default {
+    props: {
+        info: {
+            type: Object,
+            default: null,
+        },
+    },
+watch:{
+    info: {
+        immediate: true,
+        handler(val) {
+           console.log(val);
+            //承诺保障
+            // this.list = val?.promise?.split(',')
+            this.list = val?.promiseList
+            //配方列表
+            this.pflist = val?.specsList
+            if (this.pflist?.length>0) {
+                //默认点击第一项
+                this.checkpf(this.pflist[0],0)
+            }
+        },
+    }
+},
+data() {
+return {
+    newsList:[],
+    pflist:[],
+    ischeckpf:0,
+    num:1,
+    pfinfolist:[],
+    popupShow:false,
+    list:[
+        '正品保障','质量保障','包邮','可配送全球','7天无理由退换'
+    ],
+    pfname:'请选择规格',
+    checkpfImg:''
+}
+},
+onLoad(e) {
+    
+},
+methods: {
+    openPopup(){
+        this.popupShow = true
+    },
+    computerPrice(item){
+        //计算出单价
+        if (item?.unitPrice && item?.quantity) {
+            item.price = (Number(item?.unitPrice) * Number(item?.quantity))
+            return (Number(item?.unitPrice) * Number(item?.quantity)).toFixed(2)
+        }else{
+            return 0
+        }
+    },
+    computerAllPrice(){
+        // console.log('this.pfinfolist',this.pfinfolist);
+        if (this.pfinfolist?.length>0) {
+            let Price = 0 
+            this.pfinfolist.forEach(item => {
+                if (item?.price) {
+                    Price += item.price
+                }else{
+                    Price += (Number(item?.unitPrice) * Number(item?.quantity))
+                }
+            });
+            return (Price * this.num).toFixed(2)
+        }else{
+            let Price = this.pflist[this.ischeckpf]?.price || 0 
+            return (Price * this.num).toFixed(2)
+        }
+    },
+    checkpf(item,index){
+        this.ischeckpf = index
+
+        this.pfname = item.name
+        this.checkpfImg = item.fileList[0].fileUrl
+        this.pfinfolist = item.originalRecipeList
+    },
+    open() {
+    },
+    close() {
+        this.popupShow = false
+    },
+    valChange(e){
+        console.log(e);
+    },
+    valblur(e,item){
+        if (e.value == '') {
+            console.log(item === 'object');
+            if (typeof item === 'object') {
+                console.log('quantity[item]',item.quantity);
+                if (item.quantity==1) {
+                    item.quantity = 2 
+                }else{
+                    item.quantity = 1
+                }
+            }else{
+                console.log('this[item]',this[item]);
+                if (this[item] == 2) {
+                    this[item] = 1
+                }else{
+                    this[item] = 2
+                }
+            }
+        }
+    },
+    getCheckData(){
+        let porList = this.pfinfolist.map(v=>{
+            return {
+                id:v.id,
+                quantity:v.quantity
+            }
+        })
+        let data = {
+            specsId:this.pflist[this.ischeckpf].id,
+            num:this.num,
+            porList:porList
+        }
+        return data
+    }
+}
+}
+</script>
+
+<style>
+.content{
+    width: 702rpx;
+    height: 620rpx;
+    background: #FFFFFF;
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    opacity: 1;
+}
+.bottom{
+    width: 702rpx;
+    height: 160rpx;
+    background: #EEEEEE;
+    opacity: 1;
+
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: flex-start;
+    flex-direction: row;
+    align-content: space-around;
+}
+.bottomitem{
+    display: flex;
+    height: 40rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #999999;
+    line-height: 36rpx;
+    margin-left: 10rpx;
+}
+
+.top{
+    width: 702rpx;
+    /* height: 584rpx; */
+    height: 460rpx;
+    background: #FFFFFF;
+    opacity: 1;
+
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+.topItem{
+    width: 640rpx;
+    display: flex;
+    justify-content: space-between;
+    margin-top: 40rpx;
+}
+.topItem_left{
+    display: flex;
+    width: 140rpx;
+    height: 40rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #999999;
+    line-height: 36rpx;
+}
+.topItem_right{
+    display: flex;
+    width: 400rpx;
+    height: 40rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #999999;
+    line-height: 36rpx;
+
+    text-align: right;
+    flex-direction: row;
+    justify-content: flex-end;
+}
+.topItem_right2{
+    display: flex;
+    width: 400rpx;
+    height: 40rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #666;
+    line-height: 36rpx;
+
+    text-align: right;
+    flex-direction: row;
+    justify-content: flex-end;
+
+    /* display: -webkit-box; */
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:1;
+}
+
+.popupView{
+    height: 1000rpx;
+    display: flex;
+    padding-top: 100rpx;
+    flex-direction: column;
+    align-items: center;
+}
+.scrollview{
+    height: 850rpx;
+    width: 702rpx;
+    overflow: auto;
+}
+
+.spinfo{
+    display: flex;
+}
+.spinfo_img{
+    width: 200rpx;
+    height: 200rpx;
+    background-color: #666;
+    border-radius: 16rpx;
+}
+
+.spinfo_text{
+    margin-left: 24rpx;
+    width: 400rpx;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-around;
+}
+.spinfo_text1{
+    width: 56rpx;
+    height: 40rpx;
+    font-size: 28rpx;
+    font-weight: bold;
+    color: #999999;
+    line-height: 36rpx;
+}
+.menus_1_right{
+    display: flex;
+    align-items: center;
+}
+.mr1{
+    height: 33rpx;
+    font-size: 28rpx;
+    font-weight: bold;
+    color: #F6514F;
+    line-height: 36rpx;
+}
+.mr2{
+    height: 47rpx;
+    font-size: 40rpx;
+    font-weight: bold;
+    color: #F6514F;
+    line-height: 36rpx;
+}
+.spinfo_text2{
+    width: 170rpx;
+    height: 40rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #999999;
+    line-height: 36rpx;
+}
+.selectPF{
+    margin-top: 40rpx;
+}
+.selectPF_title{
+    display: flex;
+    justify-content: space-between;
+}
+.pflist{
+    display: flex;
+    margin-top: 40rpx;
+    flex-direction: row;
+    flex-wrap: wrap;
+    justify-content: flex-start;
+}
+.PF_item{
+    min-width: 160rpx;
+    height: 80rpx;
+    background: #EEEEEE;
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    opacity: 1;
+    margin: 10rpx;
+    padding: 0 24rpx;
+
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #333333;
+    line-height: 80rpx;
+    text-align: center;
+}
+.checkPF_item{
+    min-width: 160rpx;
+    height: 80rpx;
+    background: #46A6FF;
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    opacity: 1;
+    margin: 10rpx;
+    padding: 0 24rpx;
+
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #FFF;
+    line-height: 80rpx;
+    text-align: center;
+}
+.pfinfo{
+    width: 702rpx;
+}
+.pfinfo_item{
+    width: 702rpx;
+    height: 160rpx;
+    background: #EEEEEE;
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    opacity: 1;
+
+    margin-top: 24rpx;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: space-around;
+}
+.pfinfo_title{
+    width: 600rpx;
+    display: flex;
+    justify-content: space-between;
+}
+</style>
+    

+ 153 - 0
pages/market/base/columnList.vue

@@ -0,0 +1,153 @@
+<template>
+    <view>
+        <view class="content">
+            <view @click="linkDetails(item)" v-for="(item,index) in newsList" :key="index" class="box" >
+                <view class="box_img">
+                    <u--image radius='16rpx' width="180rpx" height="180rpx" :src="item.fileList[0].fileUrl" ></u--image>
+                </view>
+                <view class="box_right">
+                    <view class="box_title">
+                        {{item.title}}
+                    </view>
+                    <view class="box_c">
+                        <text>{{ item.subTitle }}</text>
+                    </view>
+                    <view class="box_num">
+                        <view class="bn_left">
+                            ¥{{item.price}}
+                        </view>
+                        <view class="bn_right">
+                            {{item.views}}人看过
+                        </view>
+                    </view>
+                </view>
+            </view>
+        </view>
+
+    </view>
+</template>
+<script>
+export default {
+    props: {
+    listdata: {
+        type: Array,
+        default: [],
+    },
+},
+watch:{
+    listdata: {
+        immediate: true,
+        handler(val) {
+           console.log(val);
+           this.newsList = val
+        },
+    }
+},
+data() {
+return {
+    newsList:[]
+}
+},
+onLoad(e) {
+    
+},
+methods: {
+    linkDetails(e){
+        let id = e.id
+        if (e?.productId) {
+            id = e?.productId
+        }
+        uni.navigateTo({
+            url: '/pages/market/ProductDetails?id=' + e.id
+        });
+    }
+}
+}
+</script>
+
+<style>
+.content{
+    width: 100vw;
+    background-color: #FFFFFF;
+    padding: 30rpx 0 30rpx 0;
+}
+.box{
+    width: 702rpx;
+    height: 244rpx;
+    background: #FFFFFF;
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    opacity: 1;
+
+    display: flex;
+    margin: 20rpx auto;
+    justify-content: space-around;
+    align-items: center;
+}
+.box_img{
+    width: 180rpx;
+    height: 180rpx;
+    border-radius: 16rpx;
+    background-color: #999999;
+}
+.box_right{
+    width: 448rpx;
+    height: 180rpx;
+    margin-left: 10rpx;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+}
+.box_title{
+    width: 440rpx;
+    height: 40rpx;
+    font-size: 28rpx;
+    font-weight: bold;
+    color: #333333;
+    line-height: 40rpx;
+
+    display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:1;
+}
+.box_c{
+    width: 400rpx;
+    height: 33rpx;
+    font-size: 24rpx;
+    font-weight: 400;
+    color: #999999;
+    line-height: 36rpx;
+
+    display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:1;
+}
+.box_num{
+	width: 410rpx;
+	display: flex;
+	justify-content: space-between;
+    align-items: center;
+}
+.bn_left{
+	width: 106rpx;
+	height: 38rpx;
+	font-size: 28rpx;
+	font-weight: bold;
+	color: #F6514F;
+	line-height: 36rpx;
+}
+.bn_right{
+	width: 120rpx;
+    height: 33rpx;
+    font-size: 24rpx;
+    font-weight: 400;
+    color: #999999;
+    line-height: 40rpx;
+}
+</style>
+    

+ 136 - 0
pages/market/base/rowList.vue

@@ -0,0 +1,136 @@
+<template>
+    <view>
+        <view class="content">
+            <view @click="linkDetails(item)" v-for="(item,index) in newsList" :key="index" class="box" >
+                <view class="box_img">
+                    <u--image radius='16rpx' width="343rpx" height="343rpx" :src="item.fileList[0].fileUrl" ></u--image>
+                </view>
+                <view class="box_right">
+                    <view class="box_title">
+                        {{item.title}}
+                    </view>
+                    <view class="box_num">
+                        <view class="bn_left">
+                            ¥{{item.price}}
+                        </view>
+                        <view class="bn_right">
+                            {{item.views}}人看过
+                        </view>
+                    </view>
+                </view>
+            </view>
+        </view>
+
+    </view>
+</template>
+<script>
+export default {
+    props: {
+        listdata: {
+            type: Array,
+            default: [],
+        },
+},
+watch:{
+    listdata: {
+        immediate: true,
+        handler(val) {
+           console.log(val);
+           this.newsList = val
+        },
+    }
+},
+data() {
+return {
+    newsList:[]
+}
+},
+onLoad(e) {
+    
+},
+methods: {
+    linkDetails(e){
+        let id = e.id
+        if (e?.productId) {
+            id = e?.productId
+        }
+        uni.navigateTo({
+             url: '/pages/market/ProductDetails?id=' + id
+        });
+    }
+}
+}
+</script>
+
+<style>
+.content{
+    width: 100vw;
+    /* background-color: #FFFFFF; */
+    padding: 30rpx 0 30rpx 0;
+    display: flex;
+    flex-wrap: wrap;
+}
+.box{
+    width: 343rpx;
+    height: 545rpx;
+    background: #FFFFFF;
+    border-radius: 8rpx 8rpx 8rpx 8rpx;
+    opacity: 1;
+
+    border: 6rpx solid white;
+
+    margin: 10rpx;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+.box_img{
+    width: 343rpx;
+    height: 343rpx;
+    border-radius: 16rpx;
+    background-color: #999999;
+}
+.box_right{
+    margin-left: 10rpx;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-evenly;
+}
+.box_title{
+    width: 343rpx;
+    height: 80rpx;
+    font-size: 28rpx;
+    font-weight: bold;
+    color: #333333;
+    margin: 24rpx 0;
+    line-height: 40rpx;
+
+    display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:2;
+}
+.box_num{
+	width: 343rpx;
+	display: flex;
+	justify-content: space-between;
+    align-items: center;
+}
+.bn_left{
+	width: 106rpx;
+	height: 38rpx;
+	font-size: 28rpx;
+	font-weight: bold;
+	color: #F6514F;
+}
+.bn_right{
+	width: 120rpx;
+    height: 33rpx;
+    font-size: 24rpx;
+    font-weight: 400;
+    color: #999999;
+}
+</style>
+    

+ 336 - 0
pages/market/commodity.vue

@@ -0,0 +1,336 @@
+<template>
+    <view>
+        <view class="searchBox" style="margin-top: 10rpx;">
+            <view class="search" style="margin-top: 10rpx;background: #F6F6F6;width: 630rpx;">
+                <u-search bgColor='#F6F6F6' placeholder="请输入关键词" 
+                :showAction='false' @custom="searchList"  v-model="searchword"></u-search>
+                <view @click="searchList" class="searchBtn">搜索</view>
+			</view>
+            <!-- <view class="search">
+                <u-search placeholder="请输入关键词" @custom="searchList" v-model="searchword"></u-search>
+            </view> -->
+            <view @click="changeMode">
+                <u--image width="48rpx" height="48rpx" :src="Modeimg" ></u--image>
+            </view>
+        </view>
+        <view style="font-size: 32rpx;" class="flex flexfend">
+            <view @click="checkType('1')" :class="ischeck=='1'?'check':''">
+                综合
+            </view>
+            <view class="flex" style="align-items: center;" @click="checkType('2')" :class="ischeck=='2'?'check':''">
+                价格 <view>
+                        <u-icon name="arrow-up-fill" :color="checkup?'#46A6FF':'#ccc'" size="8"></u-icon>
+                        <u-icon name="arrow-down-fill" :color="!checkup?'#46A6FF':'#ccc'" size="8"></u-icon>
+                    </view>
+            </view>
+            <view @click="checkType('3')" :class="ischeck=='3'?'check':''">
+                销量
+            </view>
+            <view @click="openTabs()" class="selectTypebox">
+                {{selectType}}<u--image style="margin-top: 10rpx;" width="40rpx" height="40rpx" src="/static/market/btn_screening.png" ></u--image>
+            </view>
+        </view>
+        <u-popup :closeable='true' :round="10" :show="showTabs" @close="close" @open="open">
+            <view class="popupView">
+                <view class="scrollview">
+                    <!-- <tabsColumn :tabsItem="tabsItem" :tabsList="tabsList" :openType="current"></tabsColumn> -->
+                    <view class="btnList" >
+                        <view @click="changeType(index)" 
+                        :class="item.plain ?'btnview': 'checkbtnview'" 
+                        v-for="(item,index) in tabsList" :key="index">
+                            {{ item.name }}
+                        </view>
+                    </view>
+                
+                </view>
+            </view>
+        </u-popup>
+        <rowList v-if="showRow" :listdata="newsList" ></rowList>
+        <columnList v-else :listdata="newsList" ></columnList>
+        
+        <view class="loadmore" @click="loadmore()" >
+            {{jiazaitext}}
+        </view>
+    </view>
+</template>
+<script>
+import rowList from '@/pages/market/base/rowList.vue' //左右布局
+import columnList from '@/pages/market/base/columnList.vue'  //竖排列表
+import tabsColumn from '@/pages/home/base/tabs-column.vue'
+
+import {productPage,categoriesList} from '@/http/api/common.js'
+export default {
+components: {
+    rowList,
+    columnList,
+    tabsColumn
+},
+data() {
+    return {
+        current:'commodity',
+        showRow:true,
+        checkup:true,
+        showTabs:false,
+        loadingType:false,
+        ischeck:'1',
+        searchword:'',
+        selectType:'筛选',
+        Modeimg:'/static/market/btn_chanpxx.png',
+        newsList:[],
+        tabsList:[],
+        tabsItem:[],
+        pageNum:1,
+        jiazaitext:'加载更多',
+        categoryId:'',
+    }
+},
+async onLoad() {
+    
+    // 获取商品分类
+    await this.getcategoriesList()
+},
+async onShow(){
+    let categoryId = uni.getStorageSync('categoryId')
+    let columnIdName = uni.getStorageSync('columnIdName')
+    if (categoryId) {
+        this.selectType = columnIdName
+        this.categoryId = categoryId
+
+        this.tabsList.forEach(item => {
+            if (item.id == this.categoryId) {
+                item.plain = false
+            }else{
+                item.plain = true
+            }
+        });
+
+        //获取商品列表
+        //每次切换页签初始化请求页签
+        this.pageNum = 1
+        this.newsList = []
+        await this.getProductPage()
+        uni.setStorageSync('categoryId', '')
+        uni.setStorageSync('columnIdName', '')
+    }else{
+        //每次切换页签初始化请求页签
+        this.pageNum = 1
+        this.newsList = []
+        //获取商品列表
+        await this.getProductPage()
+    }
+},
+onReachBottom() {
+    this.loadmore()
+},
+methods: {
+    async getProductPage(categoryId=''){
+        if (this.loadingType) {
+            //加载中禁止重复加载
+            return
+        }
+        this.loadingType=true
+        let data = {
+            priceAsc:false, //价格正序排序
+            priceDesc:false, //价格倒序排序
+            salesVolumeDesc:false, //销量倒序排序
+            keyword:this.searchword, //标题,副标题搜索
+            pageSize:10,
+            pageNum:this.pageNum,
+            categoryId:this.categoryId //类目id
+        }
+
+        if (this.ischeck == '1') {
+            //综合
+            data.priceAsc = false
+            data.priceDesc = false
+            data.salesVolumeDesc = false
+        }else if (this.ischeck == '2') {
+            //价格
+            data.priceAsc = this.checkup
+            data.priceDesc = !this.checkup
+            data.salesVolumeDesc = false
+        } else {
+            //销量
+            data.priceAsc = false
+            data.priceDesc = false
+            data.salesVolumeDesc = true
+        }
+        
+
+        let res =  await productPage(data)
+        if (res.data.code == 200) {
+            let newrows = res.data.data?.rows || []
+
+            this.newsList.push(...newrows)
+            
+            if(this.newsList.length!=res.data.data.total){
+                this.jiazaitext="加载更多"
+            }else{
+                this.jiazaitext="已经到底"
+            }
+        }
+        this.loadingType=false
+    },
+    async searchList(){
+        // if (this.searchword == '') {
+        //     return
+        // }
+        //每次切换页签初始化请求页签
+        this.pageNum = 1
+        this.newsList = []
+
+        await this.getProductPage()
+    },
+    //加载更多
+    loadmore(){
+        console.log('下拉加载',this.jiazaitext);
+        if (this.jiazaitext=="加载更多") {
+            this.pageNum=this.pageNum+1
+            this.jiazaitext="加载中..."
+            this.getProductPage()
+        }
+    },
+    async getcategoriesList(){
+        //获取商品分类
+        let res =  await categoriesList()
+        if (res.data.code == 200) {
+
+            let list = res.data.data.map(v=>{
+                return {
+                    ...v,
+                    plain:true
+                }
+            })
+            let a = {
+                name:'全部',
+                plain:false
+            }
+            this.tabsList.push(a)
+            this.tabsList.push(...list)
+        }
+    },
+    async openTabs(){
+        this.showTabs = true
+    },
+    changeType(index) {
+        //选择商品类目
+        this.tabsList.forEach(item => {
+            item.plain = true
+        });
+
+        this.tabsList[index].plain = false
+        this.selectType = this.tabsList[index].name
+        //每次切换页签初始化请求页签
+        this.pageNum = 1
+        this.newsList = []
+        this.categoryId = this.tabsList[index].id
+        this.getProductPage()
+
+        this.showTabs = false
+    },
+    checkType(type){
+        //选择列表排序类型
+        this.ischeck = type
+        if (this.ischeck == '2' && this.ischeck == type) {
+            this.checkup = !this.checkup
+        }
+
+        //每次切换页签初始化请求页签
+        this.pageNum = 1
+        this.newsList = []
+
+        this.getProductPage()
+
+    },
+    changeMode(){
+        this.showRow = !this.showRow
+        this.Modeimg = this.showRow ? '/static/market/btn_chanpfl.png' : '/static/market/btn_chanpxx.png'
+    },
+    open() {
+        // console.log('open');
+    },
+    close() {
+        this.showTabs = false
+        // console.log('close');
+    },
+}
+}
+</script>
+
+<style>
+.check{
+    color: #46A6FF;
+}
+.searchBox{
+    width: 750rpx;
+    height: 126rpx;
+    background: #FFFFFF;
+    border-radius: 0rpx 0rpx 0rpx 0rpx;
+    opacity: 1;
+
+    display: flex;
+    align-items: center;
+    justify-content: space-around;
+
+}
+
+.scrollview{
+    width: 750rpx;
+    height: 850rpx;
+    overflow: auto;
+}
+.loadmore{
+    height:200rpx;
+    text-align: center;
+    font-size: 28rpx;
+    font-weight: 400;
+    color: #999;
+    padding-top: 24rpx;
+}
+
+.btnList{
+    display: flex;
+    flex-direction: row;
+    flex-wrap: wrap;
+    justify-content: flex-start;
+}
+.checkbtnview{
+    width: 206rpx;
+    height: 80rpx;
+    background: #46A6FF;
+    border-radius: 40rpx 40rpx 40rpx 40rpx;
+    opacity: 1;
+
+    font-size: 28rpx;
+    font-weight: 400;
+    color: #FFFFFF;
+    line-height: 80rpx;
+    text-align: center;
+
+    margin: 20rpx;
+}
+.btnview{
+    width: 206rpx;
+    height: 80rpx;
+    background: #F1F1F1;
+    border-radius: 40rpx 40rpx 40rpx 40rpx;
+    opacity: 1;
+
+    font-size: 28rpx;
+    font-weight: 400;
+    color: #666;
+    line-height: 80rpx;
+    text-align: center;
+
+    margin: 20rpx;
+}
+.selectTypebox{
+    display: flex;
+    width: 200rpx;
+    align-items: flex-end;
+    justify-content: space-evenly;
+    border-left: 1rpx solid #ccc;
+    height: 40rpx;
+}
+</style>
+    

+ 502 - 0
pages/market/confirmOrder.vue

@@ -0,0 +1,502 @@
+<template>
+    <view class="bg">
+        <view class="address" >
+            <view>
+                <u--image width="40rpx" height="40rpx" src="/static/market/icomm_dizhi.png" ></u--image>
+            </view>
+            <view class="address_text">
+                <view class="flex_start">
+                    <view v-if="orderDetailData.defaultAddress=='1'" class="mr">默认</view>
+                    <!-- <view class="mr1">{{orderDetailData.deliveryAddress}}</view> -->
+                </view>
+                <view class="address_conter">
+                    {{orderDetailData.deliveryAddress}}
+                </view>
+                <view class="flex_start address_bottom" >
+                    <view>{{orderDetailData.consignee}}</view>
+                    <view style="margin-left:8rpx">{{orderDetailData.contact}}</view>
+                </view>
+            </view>
+             <view @click="openaddress">
+                <u--image width="40rpx" height="40rpx" src="/static/myinfo/btn_right.png" ></u--image>
+            </view>
+        </view>
+
+        <view class="commodity">
+            <view class="commodity_title">厦门海嘉成商城</view>
+            <view class="mc_item" v-for="(item,index) in orderDetailData.detailVoList" :key="index">
+                <view class="item_swipe">
+					<view class="box_img">
+						<u--image radius='16rpx' width="180rpx" height="180rpx" :src="item.fileList[0].fileUrl" ></u--image>
+					</view>
+					<view class="box_text">
+						<view class="box_title">
+							{{ item.productTitle }}
+						</view>
+						<view class="box_type">
+							已选择 {{item.specsName}}
+						</view>
+						<view class="box_num">
+							<view class="bn_left">
+								¥{{item.price}}
+							</view>
+							<view class="bn_right">
+                                {{ 'x' + item.num }}
+							</view>
+						</view>
+					</view>
+				</view>
+            </view>
+            <view style="margin-left: 12px;margin-bottom: 12px;" class="PriceInfo_item">
+                <view>备注</view>
+                <view @click="openPopup()" style="color: #999999;display: flex;">
+                    <view class="beizhu">{{ remark == ''?'备注留言信息':remark }}</view>
+                    <u--image width="40rpx" height="40rpx" src="/static/myinfo/btn_right.png" ></u--image>
+                </view>
+            </view>
+        </view>
+
+        
+
+        <view class="PriceInfo">
+            <view class="PriceInfo_title">费用明细</view>
+            <view class="PriceInfo_item">
+                <view>商品总额</view>
+                <view>¥ {{orderDetailData.productPrice}}</view>
+            </view>
+            <view class="PriceInfo_item">
+                <view>加工费用</view>
+                <view>¥ {{orderDetailData.processPrice}}</view>
+            </view>
+            <view class="PriceInfo_item">
+                <view>包装袋费</view>
+                <view>¥ {{orderDetailData.packagePrice}}</view>
+            </view>
+            <!-- <view class="PriceInfo_item">
+                <view>优惠券</view>
+                <view>¥ {{item.price}}</view>
+            </view> -->
+            <view class="PriceInfo_item">
+                <view>总价</view>
+                <view style="color: #F6514F;font-weight: bold;font-size: 28rpx;">¥ {{orderDetailData.totalPrice}}</view>
+            </view>
+        </view>
+        <u-popup mode="center"  :round="10" :show="popupShow" @close="close" @open="open">
+            <view style="width: 700rpx;height: 300rpx;padding: 20rpx;">
+                <view>
+                    <u-form-item  :labelWidth="labelWidth" label="备注信息"  borderBottom >
+                        <u--textarea  v-model="beizhu" placeholder="请输入备注信息" 
+                        count  maxlength="200" ></u--textarea>
+                    </u-form-item>
+                </view>
+                <view style="display: flex;
+                    justify-content: center;
+                    margin-top: 10rpx;">
+                    <view @click="submitbeizhu" class="bm_btn2">
+                        保存
+                    </view>
+                </view>
+            </view>
+		</u-popup>
+        <view style="height: 200rpx;">
+
+        </view>
+
+        <view class="btnBox" >
+            <view class="bm_btn">
+                <view @click="cancelOrder" class="bm_btn1">取消订单</view>
+                <view @click="submitOrder" class="bm_btn2">提交订单</view>
+            </view>
+        </view>
+    </view>
+</template>
+<script>
+import {orderDetail,cancelOrderByConfirm,confirmOrder,deliveryAddressList} from '@/http/api/common.js'
+import * as util from '@/pages/util/util.js'
+export default {
+components: {
+},
+data() {
+    return {
+        orderDetailData:{
+            deliveryAddress:'',
+            deliveryAddressId:'',
+            defaultAddress:'',
+            consignee:'',
+            contact:'',
+            detailVoList:[],//订单列表
+        },
+        beizhu:'',
+        remark:'',
+        labelWidth:100,
+        popupShow:false,
+        AddressData:{}
+    }
+},
+async onLoad(e) {
+    if (e?.orderId) {
+        await this.getOrderDetail(e?.orderId)
+    }
+},
+onShow(){
+    let selectAddress = uni.getStorageSync('selectAddress');
+    if (selectAddress) {
+        selectAddress = JSON.parse(selectAddress)
+
+        this.orderDetailData.deliveryAddress = selectAddress.address
+        this.orderDetailData.defaultAddress = selectAddress.defaultAddress
+        this.orderDetailData.deliveryAddressId = selectAddress.id
+    }
+},
+methods: {
+    async getdeliveryAddressList(){
+        let res = await deliveryAddressList()
+
+        if (res.data.code == 200) {
+			if (res.data.data) {
+				this.AddressData = res.data.data.find(v=>v.defaultAddress == '1')
+			}
+        }
+        
+    },
+    openPopup() {
+        this.popupShow = true
+    },
+    open() {
+        
+    },
+    submitbeizhu(){
+        this.close()
+        this.remark = this.beizhu
+    },
+    close() {
+        this.popupShow = false
+        // console.log('close');
+    },
+    async getOrderDetail(id){
+        let res = await orderDetail(id)
+        if (res.data.code ==200) {
+            this.orderDetailData = res.data.data
+            
+        }
+    },
+    async cancelOrder(){
+        //取消订单
+        let res = await cancelOrderByConfirm(this.orderDetailData.id)
+
+        util.toastFunc('取消成功',()=>{
+            uni.switchTab({
+                url: '/pages/market/market',
+            });
+        })
+    },
+    async submitOrder(){
+        //提交订单
+        let res = await confirmOrder({
+            remark:this.remark,
+            deliveryAddressId:this.orderDetailData.deliveryAddressId,
+        },this.orderDetailData.id)
+
+        util.toastFunc('提交订单成功',()=>{
+            uni.switchTab({
+                url: '/pages/market/market',
+            });
+        })
+    },
+    openaddress(){
+        uni.navigateTo({
+             url: '/pages/myinfo/address?selectAddress=1'
+        });
+    }
+}
+}
+</script>
+
+<style>
+.bg{
+    width: 750rpx;
+    height: 100vh;
+    min-height: 1160rpx;
+    background: #F1F1F1;
+    border-radius: 0rpx 0rpx 0rpx 0rpx;
+
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+.address{
+    width: 702rpx;
+    height: 200rpx;
+    background: #FFFFFF;
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    opacity: 1;
+
+    margin-top: 24rpx;
+
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    justify-content: space-evenly;
+}
+.commodity{
+    width: 702rpx;
+    height: auto;
+    background: #FFFFFF;
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    opacity: 1;
+    margin-top: 24rpx;
+}
+.PriceInfo{
+    width: 702rpx;
+    height: 400rpx;
+    background: #FFFFFF;
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    opacity: 1;
+    margin-top: 24rpx;
+
+    display: flex;
+	align-items: center;
+    justify-content: space-evenly;
+    flex-direction: column;
+}
+
+.PriceInfo_item{
+	display: flex;
+	justify-content: space-between;
+
+	width: 654rpx;
+	height: 40rpx;
+	font-size: 28rpx;
+	font-weight: 500;
+	color: #666666;
+	line-height: 36rpx;
+}
+.PriceInfo_title{
+	display: flex;
+
+	width: 654rpx;
+	height: 40rpx;
+	font-size: 32rpx;
+    font-weight: bold;
+    color: #333333;
+    line-height: 36rpx;
+    margin: 20rpx 0;
+}
+.btnBox{
+    width: 750rpx;
+    height: 100rpx;
+    background: #FFFFFF;
+    border-radius: 0rpx 0rpx 0rpx 0rpx;
+    opacity: 1;
+
+    position: fixed;
+    z-index: 10088;
+    bottom: 0;
+
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    justify-content: flex-end;
+}
+
+.bm_btn{
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    width: 450rpx;
+    height: 72rpx;
+    justify-content: space-evenly;
+}
+.bm_btn1{
+    width: 200rpx;
+    height: 72rpx;
+    background: #EEEEEE;
+    border-radius: 60rpx 60rpx 60rpx 60rpx;
+    opacity: 1;
+
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #666;
+    line-height: 72rpx;
+    text-align: center;
+}
+.bm_btn2{
+    width: 200rpx;
+    height: 72rpx;
+    background: #46A6FF;
+    border-radius: 60rpx 60rpx 60rpx 60rpx;
+    opacity: 1;
+
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #FFFFFF;
+    line-height: 72rpx;
+    text-align: center;
+}
+
+
+.flex_start{
+    display: flex;
+    justify-content: flex-start;
+    align-items: center;
+}
+.mr{
+    width: 64rpx;
+    height: 32rpx;
+    background: #FF8C33;
+    border-radius: 8rpx 8rpx 8rpx 8rpx;
+    opacity: 1;
+
+    font-size: 24rpx;
+    font-weight: 500;
+    color: #FFFFFF;
+    text-align: center;
+}
+.mr1{
+    width: 440rpx;
+    margin-left: 8rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #333333;
+}
+.commodity_title{
+    width: 196rpx;
+    height: 40rpx;
+    font-size: 28rpx;
+    font-weight: bold;
+    color: #333333;
+    line-height: 40rpx;
+    padding: 24rpx 0 0 24rpx;
+}
+.address_text{
+    width: 550rpx;
+    height: 200rpx;
+
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+
+}
+.address_conter{
+    width: 550rpx;
+    height: 45rpx;
+    font-size: 32rpx;
+    font-weight: bold;
+    color: #333333;
+    line-height: 45rpx;
+
+    margin-top: 8rpx;
+
+    display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:1;
+}
+.address_bottom{
+    width: 550rpx;
+    height: 40rpx;
+    font-size: 28rpx;
+    font-weight: bold;
+    color: #999999;
+    margin-top: 8rpx;
+}
+
+
+
+.mc_item{
+	width: 702rpx;
+	height: 244rpx;
+	background: #FFFFFF;
+	border-radius: 16rpx 16rpx 16rpx 16rpx;
+	opacity: 1;
+	margin-top: 24rpx;
+}
+.item_swipe{
+	width: 678rpx;
+	height: 244rpx;
+	background: #FFFFFF;
+	border-radius: 16rpx 16rpx 16rpx 16rpx;
+	opacity: 1;
+	display: flex;
+    align-items: center;
+    flex-direction: row;
+	padding-left: 24rpx;
+}
+
+.box_img{
+    width: 180rpx;
+    height: 180rpx;
+    background-color: #999999;
+    border-radius: 16rpx;
+}
+.box_text{
+	width: 392rpx;
+	height: 200rpx;
+	margin-left: 20rpx;
+
+	display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+}
+.box_title{
+	width: 392rpx;
+	height: 40rpx;
+	font-size: 28rpx;
+	font-weight: bold;
+	color: #333333;
+	line-height: 40rpx;
+
+	display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:1;
+}
+.box_type{
+	width: 410rpx;
+	height: 48rpx;
+	background: #EEEEEE;
+	border-radius: 8rpx 8rpx 8rpx 8rpx;
+	opacity: 1;
+
+	font-size: 28rpx;
+	font-weight: 500;
+	color: #999999;
+    padding-left: 24rpx;
+    line-height: 48rpx;
+
+	display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:1;
+}
+.box_num{
+	width: 410rpx;
+	display: flex;
+	justify-content: space-between;
+    align-items: center;
+}
+.bn_left{
+	width: 106rpx;
+	height: 38rpx;
+	font-size: 28rpx;
+	font-weight: bold;
+	color: #333333;
+	line-height: 36rpx;
+}
+.beizhu{
+    max-width: 500rpx;
+    display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:1;
+}
+</style>
+    

+ 644 - 0
pages/market/market.vue

@@ -0,0 +1,644 @@
+<template>
+	<view class="market">
+		<view class="marketTop">
+			<view class="top_L">
+				<u-icon name="map" color="#999" size="16"></u-icon>
+				<view class="top_text">{{AddressData.address}}</view>
+				<u-icon name="arrow-right" color="#999" size="16"></u-icon>
+			</view>
+			<view @click="linkto('address')" class="top_R">
+				编辑
+			</view>
+		</view>
+
+		<view class="marketContent">
+			<u-swipe-action >
+				<u-swipe-action-item class="mc_item" v-for="(item,index) in dataList" :key="item.id" @click="swipeAaction(index,$event)"
+				:options="options1" :show="swipeShow"
+				>
+				<view class="item_swipe">
+						<checkbox :checked="item.check" @click="checkitem(item)"  shape="circle"></checkbox>
+					<view class="box_img">
+						<u--image radius='16rpx' width="180rpx" height="180rpx" :src="item.fileList[0].fileUrl" ></u--image>
+					</view>
+					<view class="box_text">
+						<view class="box_title">
+							{{ item.productName }}
+						</view>
+						<view class="box_type">
+							已选择 {{item.specsName}}
+						</view>
+						<view class="box_num">
+							<view class="bn_left">
+								¥{{item.specsPrice}}
+							</view>
+							<view class="bn_right">
+								<u-number-box :min="1" :max="999" button-size="28" v-model="item.num" 
+								@blur="valblur($event,item,index)" @change="valChange(index,item.num)"></u-number-box>
+							</view>
+						</view>
+					</view>
+				</view>
+				</u-swipe-action-item>
+			</u-swipe-action>
+		
+		</view>
+		
+		<view  class="bottom">
+			<view class="w700 bottomflexac">
+				<view class="checkall">
+					<u-checkbox-group >
+						<u-checkbox :checked="checked" shape="circle" class="" @change="checkAll"></u-checkbox><text>全选</text>
+					</u-checkbox-group>
+				</view>
+				<view class="bt_r">
+					<view class="num">
+						<view>合计:
+							<text class="num_n">
+								¥
+								<text style="font-size:36rpx">{{shoppingCarCalcData.totalPrice || 0}}</text>
+							</text>
+						</view>
+						<view @click="popupShow = !popupShow" style="font-size: 24rpx;color: #FF655B;text-align: right;margin-right: 20rpx;">{{popupShow?'关闭明细':'查看明细'}}</view>
+					</view>
+					<view class="btn">
+						<u-button  shape="circle" size="medium" type="primary" 
+						@click="submit">结算</u-button>
+					</view>
+				</view>
+			</view>
+		</view>
+
+		<u-popup  :closeable='true' :round="10" :show="popupShow" @close="close" @open="open">
+			<view class="popupView">
+                <view class="scrollview">
+					<view class="popuptitle">金额明细</view>
+					
+					<view class="popupimg">
+						<view style="margin: 20rpx 10rpx" v-for="(item,index) in tempCheckArray" :key="index">
+							<view class="box_img">
+								<u--image radius='16rpx' width="180rpx" height="180rpx" :src="item.fileList[0].fileUrl" ></u--image>
+							</view>
+						</view>
+					</view>
+					<view class="popupInfo">
+						<view class="popupInfo_item">
+							<view>商品总额</view>
+							<view>¥ {{shoppingCarCalcData.productPrice || 0}}</view>
+						</view>
+						<view class="popupInfo_item">
+							<view>加工费用</view>
+							<view>¥ {{shoppingCarCalcData.processPrice || 0}}</view>
+						</view>
+						<view class="popupInfo_item">
+							<view>包装袋费</view>
+							<view>¥ {{shoppingCarCalcData.packagePrice || 0}}</view>
+						</view>
+						<!-- <view class="popupInfo_item">
+							<view>优惠券</view>
+							<view>¥ 0.00</view>
+						</view> -->
+					</view>
+					<view class="popupInfo2">
+						<view class="popupInfo_item2">
+							<view>合计</view>
+							<view>¥ {{shoppingCarCalcData.totalPrice || 0}}</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</u-popup>
+	</view>
+</template>
+
+<script>
+import {
+    deliveryAddressList,shoppingCartPage,
+	cancelCollection,productcollection,removeShoppingCart,
+	shoppingCartCreateOrder,calcShoppingCart
+    } from '@/http/api/common.js'
+	import * as util from '@/pages/util/util.js'
+export default {
+data() {
+	return {
+		popupShow:false,
+		checked: false,
+		disabled: false,
+		tempCheckArray:[],//选中的数据列表
+		dataList:[],//购物车列表
+		options1: [
+			// {
+			// 	text: '分享',
+			// 	style: {
+			// 		backgroundColor: '#BBB'
+			// 	}
+			// },
+			{
+				text: '收藏',
+				style: {
+					backgroundColor: '#FF8C33'
+				}
+			}, {
+				text: '删除',
+				style: {
+					backgroundColor: '#F6514F'
+				}
+			}
+		],
+		swipeShow:false,
+		AddressData:{
+			address:'请填写收货地址'
+		},
+		shoppingCarCalcData:{
+			totalPrice:0,//总价
+			productPrice:0,//商品价格
+			packagePrice:0,//包装费
+			processPrice:0,//加工费
+		}
+	};
+},
+async onShow(e) {
+	
+	if(uni.getStorageSync('AppAuthorization')){
+		 //获取地址列表
+		await this.getdeliveryAddressList()
+
+		 //获取购物车列表
+		await this.getshoppingCartPage()
+	}
+},
+methods: {
+	
+	async getdeliveryAddressList(){
+        let res = await deliveryAddressList()
+
+        if (res.data.code == 200) {
+			if (res.data.data) {
+				this.AddressData = res.data.data.find(v=>v.defaultAddress == '1')
+			}
+        }
+        
+    },
+	async getshoppingCartPage(){
+		 //获取购物车列表
+        let res = await shoppingCartPage({
+			pageSize:10,
+			pageNum:1
+		})
+
+        if (res.data.code == 200) {
+			if (res.data.data) {
+				this.dataList = res.data.data.rows.map(v=>{
+					let findoldData = this.dataList.find(vv => vv.id == v.id)
+					let check = false
+					if (findoldData) {
+						check = findoldData.check
+					}
+					return {
+						check:check,
+						...v
+					}
+				})
+				//获取购物车后 自动计算一次
+				this.calcShoppingCart()
+			}
+        }
+        
+    },
+	open() {
+	},
+	close() {
+		this.popupShow = false
+	},
+	valblur(e,item,index){
+		console.log(e);
+        if (e.value == '') {
+            console.log(item === 'object');
+            if (typeof item === 'object') {
+               item.num = 1 
+
+			   this.valChange(index,item.num)
+            }else{
+                this[item] = 2
+            }
+        }
+    },
+	async valChange(index,num){
+				
+		if (this.disabled) {
+			return
+		}
+
+		this.dataList[index].check = true
+		this.dataList[index].num = num
+
+
+		this.disabled = true
+		setTimeout(() => {
+			//点击数量触发计算
+			this.calcShoppingCart()
+		}, 100);
+	},
+	async checkitem(item){
+		// console.log(this.dataList);
+		item.check = !item.check
+		// this.dataList[index].check = !this.dataList[index]?.check
+
+		//点击单选框触发计算
+		setTimeout(() => {
+			//点击数量触发计算
+			this.calcShoppingCart()
+		}, 100);
+	},
+	//全选
+	async checkAll() {
+		this.checked = !this.checked
+
+		this.dataList.forEach(v => {
+			v.check = this.checked
+		})
+
+
+		//点击单选框触发计算
+		setTimeout(() => {
+			//点击数量触发计算
+			this.calcShoppingCart()
+		}, 100);
+	},
+	async calcShoppingCart(){
+
+		//计算购物车价格
+		this.tempCheckArray = this.dataList.filter(v => v.check)
+		let shoppingCarSubmitVOList = this.tempCheckArray.map(v => {
+			let a = {
+				id:v.id,
+				num:v.num
+			}
+			return a
+		})
+		let res = await calcShoppingCart({
+			shoppingCarSubmitVOList:shoppingCarSubmitVOList
+		})
+		this.disabled = false
+		if (res.data.code == 200) {
+			this.shoppingCarCalcData = res.data.data
+		}
+		
+
+	},
+	swipeAaction(index,options){
+		//index操作了第几个 ,options点了 第几个按钮
+		console.log(index,options);
+		// 0 收藏 1删除
+		if (options.index == 0) {
+			if (this.dataList[index].favorites) {
+				util.toastFunc('已经收藏过了')
+			}else{
+				this.toCollection(this.dataList[index])
+			}
+		}else{
+			this.removeShoppingCart(this.dataList[index])
+		}
+	},
+	async toCollection(data){
+        //收藏
+        let res = null
+        if (data.favorites) {
+            // favorites true 为收藏过了 调用取消收藏接口
+            res = await cancelCollection(data.productId)
+        }else{
+            res = await productcollection(data.productId)
+        }
+        
+        if (res.data.code == 200) {
+            let  title = data.favorites ? '取消收藏成功' :'收藏成功'
+            uni.showToast({
+                title: title,
+                duration: 2000
+            });
+        }
+    },
+	async removeShoppingCart(data){
+        //删除
+        let res =  await removeShoppingCart(data.id)
+        
+        if (res.data.code == 200) {
+            util.toastFunc('已从购物车中移除',()=>{
+				this.getshoppingCartPage()
+			})
+        }
+    },
+	async submit(){
+		//确认订单
+		if (this.tempCheckArray.lenght==0) {
+			util.toastFunc('已从购物车中移除',()=>{
+				this.getshoppingCartPage()
+			})
+		}
+		let shoppingCarSubmitVOList = this.tempCheckArray.map(v => {
+			let a = {
+				id:v.id
+			}
+			return a
+		})
+		//购物车下单
+		let res = await shoppingCartCreateOrder({
+			shoppingCarSubmitVOList:shoppingCarSubmitVOList,
+			deliveryAddressId:this.AddressData.id
+		})
+
+		if (res.data.code == 200) {
+			let orderId = res.data.data.id
+			
+			uni.navigateTo({
+				url: '/pages/market/confirmOrder?orderId=' + orderId
+			});
+		}
+	},
+	linkto(key){
+		if (key == 'address') {
+			uni.navigateTo({
+				url: '/pages/myinfo/address'
+			});
+		}
+		
+	},
+},
+};
+</script>
+<style lang="scss">
+.market{
+	display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+.btn{
+    width: 200rpx;
+	height: 80rpx;
+    margin-left: 20rpx;
+}
+.bottomflexac{
+	display: flex;
+    align-items: center;
+    justify-content: space-between;
+}
+.marketTop{
+	width: 700rpx;
+	height: 90rpx;
+	background: #FFFFFF;
+	border-radius: 0rpx 0rpx 0rpx 0rpx;
+	opacity: 1;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+}
+.bottom{
+	width: 750rpx;
+	height: 120rpx;
+    background-color: white;
+    display: flex;
+    flex-direction: row;
+    justify-content: center;
+    position: absolute;
+    bottom: 0;
+	z-index: 10076;
+}
+.top_text{
+	width: 260rpx;
+	max-height: 80rpx;
+	font-size: 28rpx;
+	font-weight: 500;
+	color: #999999;
+	line-height: 40rpx;
+
+	// display: flex;
+	// align-items: center;
+	display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:2;
+}
+.top_L{
+	display: flex;
+	align-items: center;
+}
+.top_R{
+	width: 56rpx;
+	height: 40rpx;
+	font-size: 28rpx;
+	font-weight: 500;
+	color: #666666;
+}
+.checkall{
+	display: flex;
+	align-items: center;
+	width: 150rpx;
+	height: 40rpx;
+	font-size: 28rpx;
+	font-weight: 500;
+	color: #666666;
+}
+.bt_r{
+	min-width: 440rpx;
+    display: flex;
+    align-items: center;
+}
+.num{
+	min-width: 220rpx;
+	height: 47rpx;
+	font-size: 28rpx;
+	font-weight: 500;
+	color: #666666;
+	display: flex;
+	flex-direction: column;
+}
+.num_n{
+	font-size: 28rpx;
+	font-weight: bold;
+	color: #F6514F;
+}
+.marketContent{
+	width: 750rpx;
+	height: calc(100vh - 200rpx);
+	background: #F1F1F1;
+	border-radius: 0rpx 0rpx 0rpx 0rpx;
+	overflow: auto;
+	display: flex;
+	flex-direction: column;
+    align-items: center;
+}
+.mc_item{
+	width: 702rpx;
+	height: 244rpx;
+	background: #FFFFFF;
+	border-radius: 16rpx 16rpx 16rpx 16rpx;
+	opacity: 1;
+	margin-top: 24rpx;
+}
+.item_swipe{
+	width: 702rpx;
+	height: 244rpx;
+	background: #FFFFFF;
+	border-radius: 16rpx 16rpx 16rpx 16rpx;
+	opacity: 1;
+	display: flex;
+    align-items: center;
+    flex-direction: row;
+	padding-left: 24rpx;
+}
+
+.box_img{
+    width: 180rpx;
+    height: 180rpx;
+    background-color: #999999;
+	border-radius: 16rpx;
+}
+.box_text{
+	width: 392rpx;
+	height: 200rpx;
+	margin-left: 20rpx;
+
+	display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+}
+.box_title{
+	width: 392rpx;
+	height: 40rpx;
+	font-size: 28rpx;
+	font-weight: bold;
+	color: #333333;
+	line-height: 40rpx;
+
+	display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:1;
+}
+.box_type{
+	width: 390rpx;
+	height: 48rpx;
+	background: #EEEEEE;
+	border-radius: 8rpx 8rpx 8rpx 8rpx;
+	opacity: 1;
+
+	font-size: 28rpx;
+	font-weight: 500;
+	color: #999999;
+    padding-left: 24rpx;
+    line-height: 48rpx;
+
+	display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:1;
+}
+.box_num{
+	width: 410rpx;
+	display: flex;
+	justify-content: space-between;
+    align-items: center;
+}
+.bn_left{
+	width: 106rpx;
+	height: 38rpx;
+	font-size: 28rpx;
+	font-weight: bold;
+	color: #F6514F;
+	line-height: 36rpx;
+}
+.popupView{
+    height: 1000rpx;
+    display: flex;
+    padding-top: 40rpx;
+    flex-direction: column;
+    align-items: center;
+}
+.scrollview{
+    height: 850rpx;
+    width: 702rpx;
+    overflow: auto;
+}
+.popuptitle{
+	// width: 128rpx;
+	// height: 45rpx;
+	font-size: 32rpx;
+	font-weight: bold;
+	color: #000000;
+	text-align: center;
+}
+.popupimg{
+	display: flex;
+    flex-wrap: wrap;
+    justify-content: flex-start;
+	margin-top: 40rpx;
+
+}
+.popupInfo{
+	width: 702rpx;
+	height: 180rpx;
+	background: #EEEEEE;
+	border-radius: 16rpx 16rpx 16rpx 16rpx;
+	opacity: 1;
+
+	display: flex;
+	align-items: center;
+	justify-content: center;
+    flex-direction: column;
+}
+.popupInfo_item{
+	display: flex;
+	justify-content: space-between;
+
+	width: 654rpx;
+	height: 40rpx;
+	font-size: 28rpx;
+	font-weight: 500;
+	color: #666666;
+	line-height: 36rpx;
+}
+.popupInfo2{
+	width: 702rpx;
+	height: 80rpx;
+
+	display: flex;
+	align-items: center;
+	justify-content: center;
+    flex-direction: column;
+}
+.popupInfo_item2{
+	display: flex;
+	justify-content: space-between;
+
+	width: 654rpx;
+	height: 40rpx;
+	font-size: 28rpx;
+	font-weight: bold;
+	color: #333;
+	line-height: 36rpx;
+}
+
+checkbox .wx-checkbox-input {
+	width: 32rpx; 
+    height: 32rpx;
+    border-color: #409eff;
+    background-color: transparent;
+    transition: background-color .2s;
+	border-radius: 50%;
+}
+checkbox .wx-checkbox-input.wx-checkbox-input-checked {
+	color: #fff; /* 这里也可以设置对钩的颜色 */
+    background-color: #409eff;
+	border-radius: 50%;
+}
+.u-swipe-action-item{
+	margin-top: 24rpx;
+	border-radius: 16rpx;
+}
+</style>

+ 298 - 0
pages/myinfo/address.vue

@@ -0,0 +1,298 @@
+<template>
+	<view class="bg">
+        <view v-for="(item,index) in list" :key="index" class="address">
+            <view @click="selectAddressToPage(item)" class="address_text">
+                <view class="text1">
+                    <view>{{item.contact}}</view>
+                    <view style="margin-left:8rpx">{{item.contactPhone}}</view>
+                    <view v-if="item.defaultAddress == '1'" class="mr">默认</view>
+                </view>
+                <view class="text2">
+                    {{item.address}}
+                </view>
+            </view>
+            <view @click="openPopup(item)">
+                <u--image width="40rpx" height="40rpx" src="/static/myinfo/iconm_bianj.png" ></u--image>
+            </view>
+        </view>
+
+        <view class="btnbox">
+            <view @click="openPopup()" class="btn">
+                新增
+            </view>
+        </view>
+
+        <u-popup :closeable='true' :round="10" :show="popupShow" @close="close" @open="open">
+            <view class="popupView">
+                <view class="scrollview">
+                    <u--form :rules="rules" labelPosition="left" :model="form"  ref="uForm">
+                        <u-form-item prop="contact" :labelWidth="labelWidth" label="姓名"  borderBottom >
+                            <u--input placeholder="请输入姓名" v-model="form.contact" border="none" ></u--input>
+                        </u-form-item>
+                        <u-form-item prop="contactPhone" :labelWidth="labelWidth" label="手机号" borderBottom >
+                            <u--input placeholder="请输入手机号" v-model="form.contactPhone" border="none" ></u--input>
+                        </u-form-item>
+                        <u-form-item prop="address" :labelWidth="labelWidth" label="详细地址"   borderBottom >
+                            <u--textarea maxlength="100" v-model="form.address" border="none" placeholder="请输入详细地址" ></u--textarea>
+                            <!-- <u--input placeholder="请输入详细地址" v-model="form.address" border="none" ></u--input> -->
+                        </u-form-item>
+                        
+                        <u-form-item prop="switch" :labelWidth="labelWidth" label="设为默认地址" borderBottom >
+                            <u-switch v-model="defaultAddress" ></u-switch>
+                        </u-form-item>
+                    </u--form>
+
+                    <view style="color: red;" @click="deladdress()" v-if="ismodify">
+                        删除
+                    </view>
+                </view>
+            </view>
+            
+            <view class="btnbox" style="left: 24rpx;">
+                <view @click="submit" class="btn">
+                    保存
+                </view>
+            </view>
+		</u-popup>
+    </view>
+</template>
+
+<script>
+import {
+    deliveryAddressList,
+        addDeliveryAddress,
+        delDeliveryAddressList,
+        modifyDeliveryAddress
+    } from '@/http/api/common.js'
+import * as util from '@/pages/util/util.js'
+export default {
+
+data() {
+    return {
+        list:[],
+        defaultAddress:false,
+        ismodify:false,
+        form:{
+            contact:'',
+            contactPhone:'',
+            address:'',
+            defaultAddress:'0'
+        },
+        labelWidth:100,
+        popupShow:false,
+        rules: {
+            'contact': {
+                type: 'string',
+                required: true,
+                message: '请填写姓名',
+                trigger: ['blur', 'change']
+            },
+            'contactPhone':[ 
+                {
+                    type: 'string',
+                    required: true,
+                    message: '请输入手机号',
+                    trigger: ['blur', 'change']
+                },
+                {
+                    validator: (rule, value, callback) => {
+                        return uni.$u.test.mobile(value);
+                    },
+                    message: '手机号码格式不正确',
+                    // 触发器可以同时用blur和change
+                    trigger: ['blur'],
+                }
+            ],
+            'address': {
+                type: 'string',
+                required: true,
+                message: '请输入详细地址',
+                trigger: ['blur', 'change']
+            },
+            selectAddress:false
+        },
+    }
+},
+components: {
+    // appitem,
+},
+onLoad(e) {
+    if (e?.selectAddress == '1') {
+        this.selectAddress = true
+    }
+    //获取地址列表
+    this.getdeliveryAddressList()
+},
+onReady() {
+    //如果需要兼容微信小程序,并且校验规则中含有方法等,只能通过setRules方法设置规则。
+    this.$refs.uForm?.setRules(this.rules)
+},
+
+methods: {
+    selectAddressToPage(item){
+        if (this.selectAddress) {
+            uni.setStorageSync('selectAddress', JSON.stringify(item))
+            uni.navigateBack({
+                 delta: 1
+            });
+        }
+    },
+    async getdeliveryAddressList(){
+        let res = await deliveryAddressList()
+
+        if (res.data.code == 200) {
+            this.list = res.data.data
+        }
+        
+    },
+    async deladdress(){
+        if (this.form?.id != '') {
+            let res = await delDeliveryAddressList(this.form?.id)
+
+            if (res.data.code == 200) {
+                util.toastFunc('删除成功',()=>{
+                    this.getdeliveryAddressList()
+                    this.popupShow = false
+                })
+            }
+            
+        }
+        
+    },
+    async submit(){
+        this.$refs.uForm.validate().then(async uFormRes => {
+            this.form.defaultAddress = this.defaultAddress ? '1' : '0'
+            let res = {
+                data:{
+                    code:500
+                }
+            }
+            if (this.ismodify) {
+                //修改
+                res = await modifyDeliveryAddress(this.form,this.form.id)
+            }else{
+                //新增
+                res = await addDeliveryAddress(this.form)
+            }
+            
+            let msg = this.ismodify ? '修改成功' : '添加成功'
+            if (res.data.code == 200) {
+                util.toastFunc(msg,()=>{
+                    this.getdeliveryAddressList()
+                    this.popupShow = false
+                })
+            }
+            
+        }).catch(errors => {
+            
+        })
+    },
+    open() {
+        // console.log('open');
+    },
+    close() {
+        this.popupShow = false
+        // console.log('close');
+    },
+    openPopup(data=null){
+        if (data) {
+            this.ismodify = true //是否修改 true为修改模式
+            this.form = data
+            this.defaultAddress = data.defaultAddress=='1'?true:false
+            
+            this.popupShow = true
+        }else{
+            //新增 置空表单数据
+            this.form = {
+                contact:'',
+                contactPhone:'',
+                address:'',
+                defaultAddress:'0'
+            }
+            this.ismodify = false
+            this.popupShow = true
+        }
+    }
+
+}
+}
+</script>
+
+<style lang="scss">
+.bg{
+    width: 750rpx;
+    height: auto;
+    min-height: 100vh;
+    background: #F1F1F1;
+    border-radius: 0rpx 0rpx 0rpx 0rpx;
+
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+.address{
+    width: 702rpx;
+    min-height: 180rpx;
+    background: #FFFFFF;
+    border-radius: 16rpx 16rpx 16rpx 16rpx;
+    opacity: 1;
+
+    display: flex;
+    align-items: center;
+    justify-content: space-around;
+    margin-top: 24rpx;
+
+    padding: 20rpx 0;
+}
+.address_text{
+    display: flex;
+    flex-direction: column;
+}
+.text1{
+    display: flex;
+    align-items: center;
+
+    min-height: 45rpx;
+    font-size: 32rpx;
+    font-weight: bold;
+    color: #333333;
+}
+.text2{
+    width: 547rpx;
+    min-height: 80rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #666666;
+}
+.btnbox{
+    position: fixed;
+    bottom: 20rpx;
+}
+.btn{
+    width: 702rpx;
+    height: 80rpx;
+    background: #46A6FF;
+    border-radius: 64rpx 64rpx 64rpx 64rpx;
+    opacity: 1;
+
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #FFFFFF;
+    line-height: 80rpx;
+    text-align: center;
+}
+.mr{
+    width: 64rpx;
+    height: 32rpx;
+    background: #FF8C33;
+    border-radius: 8rpx 8rpx 8rpx 8rpx;
+    opacity: 1;
+
+    font-size: 24rpx;
+    font-weight: 500;
+    color: #FFFFFF;
+    text-align: center;
+
+    margin-left: 12rpx;
+}
+</style>

+ 141 - 0
pages/myinfo/login.vue

@@ -0,0 +1,141 @@
+<template>
+	<view class="bg">
+
+        <button
+            class="btn"
+            hover-class="button-hover"
+            @click="login"
+            :disabled="disabled"
+            v-show="!showGetPhoenBtn"
+        >
+          微信登录  
+        </button>
+        <button class="btn" :disabled="disabledPhone" open-type="getPhoneNumber" v-show="showGetPhoenBtn"
+        @getphonenumber="getPhoneNumber">授权手机号</button>
+
+    </view>
+</template>
+
+<script>
+import {
+  login,bindphone
+} from '@/http/api/common.js'
+import env from "@/http/config/config.js"
+import * as util from '@/pages/util/util.js'
+
+export default {
+
+data() {
+    return {
+        showGetPhoenBtn:false,
+        disabled:false,
+        disabledPhone:false,
+    }
+},
+onLoad(e) {
+
+},
+
+methods: {
+    async login(){
+        //先去获取微信code
+        await this.getWexinCode()
+        if (uni.getStorageSync('wxcode')) {
+            this.disabled = true
+            let res = await login(uni.getStorageSync('wxcode'))
+            if (res.data.code == 200) {
+                this.disabled = false
+                uni.setStorageSync("AppAuthorization",res.data.data.token);
+                //成功获取code 然后需要用户点击 获取手机号
+                if (res.data.data.hasMobile == false) {
+                    //判断是否绑定过手机号 如果false则去绑定
+                    this.showGetPhoenBtn = true
+                }else{
+                    util.toastFunc('登录成功',()=>{
+                        // 返回上一级
+                        uni.navigateBack({
+                            delta: 1
+                        });
+                    })
+                }
+            }else{
+                this.disabled = false
+            }
+        }else{
+            //先去获取微信code
+            await this.getWexinCode()
+        }
+        
+        
+    },
+    async getWexinCode(){
+        let that = this
+        uni.login({ 
+            "provider": "weixin",
+            "onlyAuthorize": true, // 微信登录仅请求授权认证
+            success: function(event){
+                const {code} = event
+                //客户端成功获取授权临时票据(code),向业务服务器发起登录请求。
+                uni.setStorageSync('wxcode',code)
+
+            }
+        })
+
+    },
+    // 获取用户手机号
+	getPhoneNumber(e){
+		console.log(e.detail)
+		if(e.detail.errMsg == "getPhoneNumber:ok"){ // 用户允许或去手机号
+            this.getphone(e.detail.code)
+		}
+	},
+    async getphone(code){
+        this.disabledPhone = true
+        let res = await bindphone(code)
+        if (res.data.code == 200) {
+            this.disabledPhone = false
+            util.toastFunc('登录成功',()=>{
+                // 返回上一级
+                uni.navigateBack({
+                    delta: 1
+                });
+            })
+        }else{
+            this.disabledPhone = false
+            util.toastFunc('绑定手机号失败,请重新操作')
+        }
+    },
+			
+
+
+}
+}
+</script>
+
+<style lang="scss">
+.bg{
+    width: 750rpx;
+    height: auto;
+    min-height: 100vh;
+    background: #F1F1F1;
+    border-radius: 0rpx 0rpx 0rpx 0rpx;
+
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+.btn{
+    width: 702rpx;
+    height: 80rpx;
+    background: #46A6FF;
+    border-radius: 64rpx 64rpx 64rpx 64rpx;
+    opacity: 1;
+    margin-top: 200rpx;
+
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #FFFFFF;
+    line-height: 80rpx;
+    text-align: center;
+}
+</style>

+ 275 - 0
pages/myinfo/myinfo.vue

@@ -0,0 +1,275 @@
+<template>
+  <view class="myinfo">
+    <!-- 顶部信息 -->
+    <view class="myinfo_top">
+      <view class="userImg">
+        <u--image width='128rpx' height="128rpx" :src="myinfo.img" shape="circle"></u--image>
+      </view>  
+      <view @click="tologin()" class="myinfo_text">
+        <view class="myinfo_name">
+          <text class="userName" >{{myinfo.name}}</text>
+          <!-- <view class="myinfo_id">
+            id:{{myinfo.id}}
+          </view> -->
+        </view>
+        <!-- <view class="myinfo_qm">
+          {{myinfo.qm}}
+        </view> -->
+      </view>
+      
+        <view @click="toUserInfo()">
+            <u--image width="40rpx" height="40rpx" src="/static/myinfo/iconm_bianj.png" ></u--image>
+        </view>
+    </view>
+
+    <!-- 中段菜单 -->
+    <view class="myinfo_menus">
+          <view class="myinfo_title">
+            常用功能
+          </view>
+        <view class="menus">
+          <view v-for="item in list" :key="item.id">
+            <view class="menus_item" @click="openLink(item)">
+              <u-badge v-if="item.name == '我的订单'" :absolute="true" :offset='offset' 
+              numberType="overflow" type="error" max="99" :value="myinfo.orderCount"></u-badge>
+              <u--image width="64rpx" height="64rpx" :src="item.url" ></u--image>
+              {{item.name}}
+            </view>
+          </view>
+        </view>
+    </view>
+
+    <!-- 下段菜单 -->
+    <view class="myinfo_menus">
+          <view class="myinfo_title">
+            其他
+          </view>
+        <view class="menus_foot">
+          <view @click="openLink(item)" v-for="item in list2" :key="item.id">
+            <view class="menus_foot_item">
+              <view style="display: flex;align-items: center;">
+                <u--image width="48rpx" height="48rpx" :src="item.url" ></u--image>
+                <view style="margin-left: 20rpx;">{{item.name}}</view>
+              </view>
+              <u--image width="48rpx" height="48rpx" src="/static/myinfo/btn_right.png" ></u--image>
+            </view>
+          </view>
+        </view>
+    </view>
+  </view>
+</template>
+
+<script>
+import {myInfo} from '@/http/api/common.js'
+export default {
+  data() {
+    return {
+      offset:[-10,-10],
+      myinfo:{
+        name:'未登录',
+        id:'0',
+        qm:'无',
+        orderCount:'0',
+        img:'https://cdn.uviewui.com/uview/album/1.jpg',
+      },
+      list:[
+        {
+          id:1,
+          url:'/static/myinfo/iconm_xiaoxi.png',
+          name:'消息中心',
+          linkto:'/pages/myinfo/notifiesPage'
+        },
+        {
+          id:2,
+          url:'/static/myinfo/iconm_gouwu.png',
+          name:'购物车',
+          openType:'switchTab',
+          linkto:'/pages/market/market'
+        },
+        {
+          id:3,
+          url:'/static/myinfo/icon_dingdang.png',
+          name:'我的订单',
+          linkto:'/pages/market/allOrder'
+        },
+        {
+          id:4,
+          url:'/static/myinfo/icomm_jilu.png',
+          name:'浏览记录',
+          linkto:'/pages/market/BrowsingHistory?showType=jilu'
+        },
+      ],
+      list2:[
+        {
+          id:1,
+          url:'/static/myinfo/icomx_souc.png',
+          name:'我的收藏',
+          linkto:'/pages/market/BrowsingHistory?showType=shouchang'
+        },
+        {
+          id:2,
+          url:'/static/myinfo/icomx_dizhi.png',
+          name:'我的地址',
+          linkto:'/pages/myinfo/address'
+        },
+        {
+          id:3,
+          url:'/static/myinfo/icomx_message.png',
+          name:'意见反馈',
+          linkto:'/pages/myinfo/userInfo?showType=fangkui'
+        },
+        // {
+        //   id:4,
+        //   url:'/static/myinfo/iconx_xitongg.png',
+        //   name:'设置'
+        // },
+      ]
+    }
+  },
+  onShow() {
+    if(uni.getStorageSync('AppAuthorization')){
+      // 获取个人信息
+      this.getmyInfo()
+    }
+  },
+  methods: {
+    async getmyInfo(){
+      let res = await myInfo()
+      if (res.data.code == 200) {
+        this.myinfo.name = res.data.data.nickName
+        this.myinfo.img = res.data.data.image
+        this.myinfo.orderCount = res.data.data?.orderCount || 0
+        
+      }
+    },
+    tologin(){
+      if(uni.getStorageSync('AppAuthorization')){
+        //登录
+        return
+      }
+      uni.navigateTo({
+          url: '/pages/myinfo/login'
+      });
+    },
+    toUserInfo(){
+      uni.navigateTo({
+          url: '/pages/myinfo/userInfo'
+      });
+    },
+    openLink(data){
+      console.log(data.name,data.openType);
+      if (data?.linkto) {
+          if (data.openType == 'switchTab') {
+             uni.switchTab({
+                url: data.linkto
+            });
+          }else{
+              uni.navigateTo({
+                  url: data.linkto
+              });
+          }
+      }
+    }
+  }
+}
+</script>
+
+<style>
+.myinfo{
+  background: linear-gradient(180deg, #D3E5FF 0%, rgba(246,246,246,0.2) 100%);
+}
+.userImg{
+  width: 128rpx;
+  height: 128rpx;
+}
+.userName{
+  min-width: 64rpx;
+  height: 45rpx;
+  font-size: 32rpx;
+  font-weight: bold;
+  color: #333333;
+  line-height: 36rpx;
+}
+.myinfo_top{
+    display: flex;
+    width: 90vw;
+    margin: 0 auto;
+    align-items: center;
+    padding-top: 40rpx;
+}
+.myinfo_text{
+  margin-left: 40rpx;
+  min-width: 460rpx;
+
+}
+.myinfo_name{
+  display: flex;
+  align-items: center;
+}
+.myinfo_id{
+  margin-left: 20rpx;
+  width: 145rpx;
+  height: 40rpx;
+  background: linear-gradient(180deg, #46A6FF 0%, #96CBFB 100%);
+  border-radius: 24rpx 24rpx 24rpx 24rpx;
+  opacity: 1;
+
+  text-align: center;
+  font-size: 24rpx;
+  font-weight: 400;
+  color: #FFFFFF;
+  line-height: 36rpx;
+}
+.myinfo_qm{
+  height: 40rpx;
+  font-size: 28rpx;
+  font-weight: 400;
+  color: #999999;
+  line-height: 36rpx;
+}
+.myinfo_menus{
+  width: 90vw;
+  margin: 0 auto;
+  background-color: white;
+  margin-top: 40rpx;
+  
+  border-radius: 24rpx 24rpx 24rpx 24rpx;
+  opacity: 1;
+}
+.myinfo_title{
+  font-size: 40rpx;
+  padding: 30rpx 0 30rpx 40rpx;
+
+  width: 128rpx;
+  height: 45rpx;
+  font-size: 32rpx;
+  font-weight: bold;
+  color: #333333;
+  line-height: 45rpx;
+}
+.menus_item{
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  font-size: 28rpx;
+  font-weight: 400;
+  color: #333333;
+  line-height: 36rpx;
+  position: relative
+}
+.menus{
+  padding-bottom: 40rpx;
+  display: flex;
+  justify-content: space-around;
+}
+.menus_foot{
+  width: 90%;
+  margin: 0 auto;
+}
+.menus_foot_item{
+  display: flex;
+  align-items: center;
+  height: 100rpx;
+  justify-content: space-between;
+}
+</style>

+ 122 - 0
pages/myinfo/notifiesPage.vue

@@ -0,0 +1,122 @@
+<template>
+	<view class="bg">
+        <view class="notifies" @click="openDetails(item)" v-for="item in dataList" :key="item.id">
+            {{item.title}}
+            
+        </view>
+
+        <view class="loadmore" @click="loadmore()" >
+            {{jiazaitext}}
+        </view>
+    </view>
+</template>
+
+<script>
+import {
+  notifiesPage
+} from '@/http/api/common.js'
+import env from "@/http/config/config.js"
+import * as util from '@/pages/util/util.js'
+
+export default {
+
+data() {
+    return {
+        dataList:[],
+        status:'',
+        pageSize:10,
+        pageNum:1,
+        jiazaitext:'加载更多',
+    }
+},
+onLoad(e) {
+    this.getnotifiesPage()
+},
+onReachBottom() {
+    this.loadmore()
+},
+methods: {
+     //加载更多
+     loadmore(){
+        console.log('下拉加载',this.jiazaitext);
+        if (this.jiazaitext=="加载更多") {
+            this.pageNum=this.pageNum+1
+            this.jiazaitext="加载中..."
+            this.getnotifiesPage()
+        }
+    },
+    async getnotifiesPage(){
+        let res = await notifiesPage({
+            pageSize:this.pageSize,
+            pageNum:this.pageNum,
+        })
+        if (res.data.code == 200) {
+            let newrows = res.data.data?.rows || []
+
+            this.dataList.push(...newrows)
+            
+            if(this.dataList.length!=res.data.data.total){
+                this.jiazaitext="加载更多"
+            }else{
+                this.jiazaitext="已经到底"
+            }
+        }
+    },
+    openDetails(item){
+        uni.navigateTo({
+             url: '/pages/myinfo/notifiesPageDetails?id=' + item.id
+        });
+    }
+			
+
+
+}
+}
+</script>
+
+<style lang="scss">
+.bg{
+    width: 750rpx;
+    height: auto;
+    min-height: 100vh;
+    background: #F1F1F1;
+    border-radius: 0rpx 0rpx 0rpx 0rpx;
+
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+.btn{
+    width: 702rpx;
+    height: 80rpx;
+    background: #46A6FF;
+    border-radius: 64rpx 64rpx 64rpx 64rpx;
+    opacity: 1;
+    margin-top: 200rpx;
+
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #FFFFFF;
+    line-height: 80rpx;
+    text-align: center;
+}
+.loadmore{
+    height:200rpx;
+    text-align: center;
+    font-size: 28rpx;
+    font-weight: 400;
+    color: #999;
+    padding-top: 24rpx;
+}
+.notifies{
+    width: 750rpx;
+    min-height: 100rpx;
+    line-height: 100rpx;
+    background-color: white;
+
+    text-align: left;
+    font-size: 28rpx;
+    margin-top: 24rpx;
+    padding-left: 24rpx;
+}
+</style>

+ 83 - 0
pages/myinfo/notifiesPageDetails.vue

@@ -0,0 +1,83 @@
+<template>
+	<view class="bg">
+        <view class="Articletitle">
+            {{ info.title }}
+        </view>
+        <view class="vHtml">
+            <u-parse class="vHtml" :content="info.content"></u-parse>
+        </view>
+    </view>
+</template>
+
+<script>
+import {
+  notifiesDetails
+} from '@/http/api/common.js'
+
+export default {
+
+data() {
+    return {
+        info:null
+    }
+},
+onLoad(e) {
+    if (e.id) {
+        this.getnotifiesDetails(e.id)
+    }
+},
+
+methods: {
+    async getnotifiesDetails(id){
+        let res = await notifiesDetails(id)
+        if (res.data.code == 200) {
+            this.info = res.data.data
+        }
+    },
+			
+
+
+}
+}
+</script>
+
+<style lang="scss">
+.bg{
+     width: 750rpx;
+    margin: 0 auto;
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+    padding-left: 20rpx;
+}
+.Articletitle{
+    width: 710rpx;
+    height: 112rpx;
+    font-size: 40rpx;
+    font-family: PingFang SC, PingFang SC;
+    font-weight: bold;
+    color: #333333;
+    line-height: 56rpx;
+
+    display: -webkit-box;
+    word-break: break-all;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp:2;
+
+}
+.vHtml{
+    width: 710rpx;
+}
+.vHtml img {
+    vertical-align: middle;
+    border-style: none;
+    width: 100%;
+    height: auto;
+}
+.vHtml p {
+    margin-top: 30rpx;
+    margin-bottom: 30rpx;
+}
+</style>

+ 248 - 0
pages/myinfo/userInfo.vue

@@ -0,0 +1,248 @@
+<template>
+<view class="bg">
+        <view v-if="showType == '1'" class="scrollview">
+            <u--form :rules="rules" labelPosition="left" :model="form"  ref="uForm">
+                <u-form-item prop="username" :labelWidth="labelWidth" label="用户名"  borderBottom >
+                    <u--input placeholder="请输入用户名" v-model="form.username" border="none" ></u--input>
+                </u-form-item>
+                <!-- 
+                <u-form-item prop="address" :labelWidth="labelWidth" label="签名"  borderBottom >
+                    <u--input placeholder="签名" v-model="form.address" border="none" ></u--input>
+                </u-form-item> -->
+                <u-form-item  :labelWidth="labelWidth" label="头像"  borderBottom >
+                    <u-upload
+                        :fileList="fileList1"
+                        @afterRead="afterRead"
+                        @delete="deletePic"
+                        name="1"
+                        multiple
+                        :maxCount="1"
+                    ></u-upload>
+                </u-form-item>
+            </u--form>
+        </view>
+
+        <view v-if="showType == 'fangkui'" class="scrollview">
+            <u--form :rules="rules" labelPosition="left" :model="form"  ref="uForm">
+                <u-form-item prop="fangkuiyijian" :labelWidth="labelWidth" label="反馈意见"  borderBottom >
+                    <u--textarea  v-model="form.fangkuiyijian" placeholder="请输入反馈意见" 
+                    count  maxlength="200" ></u--textarea>
+                </u-form-item>
+                <u-form-item prop="phone" :labelWidth="labelWidth" label="手机号" borderBottom >
+                    <u--input placeholder="请输入手机号" v-model="form.phone" border="none" ></u--input>
+                </u-form-item>
+            </u--form>
+        </view>
+        <view class="btnbox" style="left: 24rpx;">
+            <view @click="submit" class="btn">
+                保存
+            </view>
+        </view>
+
+</view>
+</template>
+
+<script>
+import {
+    modifyInfo,myInfo,feedback
+    } from '@/http/api/common.js'
+import env from "@/http/config/config.js"
+import {toastFunc} from '@/pages/util/util.js'
+export default {
+
+data() {
+    return {
+        form:{
+            username:'',
+            phone:'',
+            address:'',
+            address2:'',
+            check:false,
+            fangkuiyijian:''
+        },
+        fileList1:[],
+        fileList:[],
+        file:[],
+        labelWidth:100,
+        popupShow:false,
+        rules: {
+            'username': {
+                type: 'string',
+                required: true,
+                message: '请填写用户名',
+                trigger: ['blur', 'change']
+            },
+            'fangkuiyijian': {
+                type: 'string',
+                required: true,
+                message: '请填写反馈意见',
+                trigger: ['blur', 'change']
+            },
+            'phone':[ 
+                {
+                    type: 'string',
+                    required: true,
+                    message: '请输入手机号',
+                    trigger: ['blur', 'change']
+                },
+                {
+                    validator: (rule, value, callback) => {
+                        return uni.$u.test.mobile(value);
+                    },
+                    message: '手机号码格式不正确',
+                    // 触发器可以同时用blur和change
+                    trigger: ['blur'],
+                }
+            ]
+        },
+        showType:'1',
+    }
+},
+components: {
+    // appitem,
+},
+
+onLoad(e) {
+    if (e?.showType) {
+        uni.setNavigationBarTitle({
+            title:  "意见反馈"
+        })
+        this.showType = e?.showType
+    }
+    if (this.showType == '1') {
+        //获取个人信息
+        this.getmyInfo()
+    }
+    
+},
+onReady() {
+    //如果需要兼容微信小程序,并且校验规则中含有方法等,只能通过setRules方法设置规则。
+    this.$refs.uForm?.setRules(this.rules)
+},
+
+methods: {
+    async getmyInfo(){
+      let res = await myInfo()
+      if (res.data.code == 200) {
+        this.form.username = res.data.data.nickName
+
+        this.fileList1.push({
+            url:res.data.data.image
+        })
+        
+      }
+    },
+    submit(){
+        this.$refs.uForm.validate().then(async res1 => {
+
+            if (this.showType == '1') {
+                //修改个人信息
+                let images = this.fileList1[0].url
+                let res = await modifyInfo({
+                    nickname:this.form.username,
+                    images:images
+                })
+                if (res.data.code == 200) {
+                    toastFunc('修改成功',()=>{
+                        uni.switchTab({
+                            url: '/pages/myinfo/myinfo',
+                        });
+                    })
+                }
+            }else{
+                //意见反馈
+                let res = await feedback({
+                    content:this.form.fangkuiyijian,
+                    contact:this.form.phone
+                })
+                if (res.data.code == 200) {
+                    toastFunc('反馈成功',()=>{
+                        uni.switchTab({
+                            url: '/pages/myinfo/myinfo',
+                        });
+                    })
+                }
+            }
+        }).catch(errors => {
+            // uni.$u.toast('校验失败')
+        })
+    },
+    // 删除图片
+    deletePic(event) {
+        this[`fileList${event.name}`].splice(event.index, 1)
+    },
+    // 新增图片
+    async afterRead(event) {
+        // 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
+        let lists = [].concat(event.file)
+        let fileListLen = this[`fileList${event.name}`].length
+        lists.map((item) => {
+            this[`fileList${event.name}`].push({
+                ...item,
+                status: 'uploading',
+                message: '上传中'
+            })
+        })
+        for (let i = 0; i < lists.length; i++) {
+            const result = await this.uploadFilePromise(lists[i])
+            console.log('result',result);
+            let item = this[`fileList${event.name}`][fileListLen]
+            this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
+                status: 'success',
+                message: '',
+                url: result
+            }))
+            fileListLen++
+        }
+    },
+    uploadFilePromise(file) {
+        return new Promise((resolve, reject) => {
+            let a = uni.uploadFile({
+                url: env.BASEURL + '/open/upload/uploadFile', // 仅为示例,非真实的接口地址
+                filePath: file.url,
+                name: 'file',
+                success: (res) => {
+                    const fileData = JSON.parse(res.data)
+                    resolve(fileData.data.fileUrl)
+                }
+            });
+        })
+    },
+  
+
+}
+}
+</script>
+
+<style lang="scss">
+.bg{
+    width: 750rpx;
+    height: auto;
+    // min-height: 100vh;
+    // background: #F1F1F1;
+    border-radius: 0rpx 0rpx 0rpx 0rpx;
+
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+
+.btnbox{
+    position: fixed;
+    bottom: 20rpx;
+}
+.btn{
+    width: 702rpx;
+    height: 80rpx;
+    background: #46A6FF;
+    border-radius: 64rpx 64rpx 64rpx 64rpx;
+    opacity: 1;
+
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #FFFFFF;
+    line-height: 80rpx;
+    text-align: center;
+}
+
+</style>

+ 876 - 0
pages/util/util.js

@@ -0,0 +1,876 @@
+
+import env from "@/http/config/config.js"
+/**
+ * 判断字符串是否为空
+ * @param obj
+ * @returns {boolean}
+ */
+
+export const isStringEmpty = (obj) => {
+	if (typeof obj == "undefined" || obj == null || obj === "") {
+		return true;
+	} else {
+		return false;
+	}
+}
+
+/**
+ * 判断对象、字符串是否为空
+ * @param obj
+ * @returns {boolean}
+ */
+export const isObjStringEmpty = (obj) => {
+	if (typeof obj == "object" && JSON.stringify(obj) == "{}") {
+		return true;
+	} else {
+		return isStringEmpty(obj);
+	}
+}
+
+/**
+ * 判断字符串是否非空
+ * @param obj
+ * @returns {boolean}
+ */
+export const isStringNotEmpty = (obj) => {
+	return !isStringEmpty(obj);
+}
+
+/**
+ * 判断对象、字符串是否非空
+ * @param obj
+ * @returns {boolean}
+ */
+export const isObjStringNotEmpty = (obj) => {
+	return !isObjStringEmpty(obj);
+}
+
+/**
+ * 字符串如果为空,转换字符串为null
+ * @param obj
+ * @returns {boolean}
+ */
+export const changeStringEmptyToNull = (obj) => {
+	if (isStringEmpty(obj)) {
+		obj = null;
+	}
+	return obj;
+}
+
+/**
+ * 字符串如果为空,转换字符串为""
+ * @param obj
+ * @returns {boolean}
+ */
+export const changeStringNullToEmpty = (obj) => {
+	if (typeof obj == "undefined" || obj == null) {
+		obj = "";
+	}
+	return obj;
+}
+
+/**
+ * 字符串如果为空,转换字符串为""
+ * @param obj
+ * @returns {boolean}
+ */
+export const stringEndWith = (str) => {
+	if (str == null || str == "" || this.length == 0 || str.length > this.length)
+		return false;
+	if (this.substring(this.length - str.length) == str)
+		return true;
+	else
+		return false;
+};
+
+
+export const formatDate = (shijianchuo) => {
+	//shijianchuo是整数,否则要parseInt转换
+	function add0(m) {
+		return m < 10 ? '0' + m : m
+	}
+	var time = new Date(shijianchuo);
+	var y = time.getFullYear();
+	var m = time.getMonth() + 1;
+	var d = time.getDate();
+	var h = time.getHours();
+	var mm = time.getMinutes();
+	var s = time.getSeconds();
+	return y + '-' + add0(m) + '-' + add0(d) + ' ' + add0(h) + ':' + add0(mm) + ':' + add0(s);
+}
+/**
+ * 格式化时间对象
+ * @param {string}  fmt Date对象的格式化格式:如yyyy-MM-dd HH:mm:ss
+ * @param {date}  date 需要格式化的时间对象
+ * @return {string} 返回格式化后的字符串,如2020-0101 00:00:00
+ * */
+export const formatDateToStr = function (fmt, date) {
+	fmt = fmt.replace("hh", "HH")
+	let ret;
+	// debugger
+	const opt = {
+		"y+": date.getFullYear().toString(),
+		"M+": (date.getMonth() + 1).toString(),
+		"d+": date.getDate().toString(),
+		"H+": date.getHours().toString(),
+		"m+": date.getMinutes().toString(),
+		"s+": date.getSeconds().toString(),
+	};
+	for (let k in opt) {
+		ret = new RegExp(`(${k})`).exec(fmt);
+		if (ret) {
+			fmt = fmt.replace(ret[1], ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, "0"))
+		}
+	}
+	return fmt
+}
+/**
+ * 格式化时间对象
+ * @param {string}  str 要转换成时间对象的字符串,如2020-0101 00:00:00
+ * @return {date} 转换后的时间对象
+ * */
+export function formatStrToDate(str) {
+	return new Date(Date.parse(str.replace(/-/g, "/")));
+}
+
+
+//数字校验
+export const digits = (str, bol) => {
+	var regexp = /^[0-9]*$/;
+
+	if (bol) {
+		if (regexp.test(str)) {
+			return false;
+		}
+		return true;
+	} else {
+		if (typeof str != "undefined" && str.length > 0) {
+			if (regexp.test(str)) {
+				return false;
+			}
+			return true;
+		} else {
+			return false
+		}
+	}
+};
+
+//校验只能输入大于0的正整数
+export const checkNum0 = (str, bol) => {
+	var regexp = /^[1-9]\d*$/;
+	if (bol) {
+		if (regexp.test(str)) {
+			return false;
+		}
+		return true;
+	} else {
+		if (typeof str != "undefined" && str.length > 0) {
+			if (regexp.test(str)) {
+				return false;
+			}
+			return true;
+		} else {
+			return false
+		}
+	}
+};
+
+//校验只能输入大于1的正整数
+export const checkNum1 = (str) => {
+	var regexp = /^[2-9]\d*$/;
+	if (bol) {
+		if (regexp.test(str)) {
+			return false;
+		}
+		return true;
+	} else {
+		if (typeof str != "undefined" && str.length > 0) {
+			if (regexp.test(str)) {
+				return false;
+			}
+			return true;
+		} else {
+			return false
+		}
+	}
+};
+
+//校验金额(精确到小数点2位)
+export const moneyvalid = (str, bol) => {
+	var reg = /^^\d+(\.\d{2})+$/;
+	if (bol) {
+		if (reg.test(str)) {
+			return false;
+		}
+		return true;
+	} else {
+		if (typeof str != "undefined" && str.length > 0) {
+			if (reg.test(str)) {
+				return false;
+			}
+			return true;
+		} else {
+			return false
+		}
+	}
+};
+
+//校验只能输入字母
+export const english = (str, bol) => {
+	var regexp = /^[A-Za-z]+$/;
+	if (bol) {
+		if (regexp.test(str)) {
+			return false;
+		}
+		return true;
+	} else {
+		if (typeof str != "undefined" && str.length > 0) {
+			if (regexp.test(str)) {
+				return false;
+			}
+			return true;
+		} else {
+			return false
+		}
+	}
+};
+
+//检验只能输入汉字
+export const chinese = (str, bol) => {
+	var regexp = /^[\u4e00-\u9fa5]{0,}$/;
+	if (bol) {
+		if (regexp.test(str)) {
+			return false;
+		}
+		return true;
+	} else {
+		if (typeof str != "undefined" && str.length > 0) {
+			if (regexp.test(str)) {
+				return false;
+			}
+			return true;
+		} else {
+			return false
+		}
+	}
+};
+
+
+//校验数字和字母
+export const letterOrNumberonly = (str, bol) => {
+	var regexp = /^[A-Za-z0-9]+$/;
+	if (bol) {
+		if (regexp.test(str)) {
+			return false;
+		}
+		return true;
+	} else {
+		if (typeof str != "undefined" && str.length > 0) {
+			if (regexp.test(str)) {
+				return false;
+			}
+			return true;
+		} else {
+			return false
+		}
+	}
+
+
+};
+
+//校验数字、字母及下划线
+export const letterOrNumberOrUnderline = (str, bol) => {
+	var regexp = /^\w+$/;
+	if (bol) {
+		if (regexp.test(str)) {
+			return false;
+		}
+		return true;
+	} else {
+		if (typeof str != "undefined" && str.length > 0) {
+			if (regexp.test(str)) {
+				return false;
+			}
+			return true;
+		} else {
+			return false
+		}
+	}
+
+};
+//邮箱校验
+export const email = (str, bol) => {
+	var regexp = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
+	var regexp2 = /^[A-Za-z0-9._%-]+@([A-Za-z0-9-]+\.)+[A-Za-z]{2,4}$/;
+	if (bol) {
+		if (regexp.test(str) || regexp2.test(str)) {
+			return false;
+		}
+		return true;
+	} else {
+		if (typeof str != "undefined" && str.length > 0) {
+			if (regexp.test(str) || regexp2.test(str)) {
+				return false;
+			}
+			return true;
+		} else {
+			return false
+		}
+
+	}
+
+};
+
+//校验手机号码
+export const mobile = (str, bol) => {
+	var isMobile = /^1(3|4|5|6|7|8|9)\d{9}$/;
+	if (bol) {
+		if (isMobile.test(str))
+			return false
+		else
+			return true;
+	} else {
+		if (typeof str != "undefined" && str.length > 0) {
+			if (isMobile.test(str))
+				return false
+			else
+				return true;
+		} else {
+			return false
+		}
+
+	}
+
+};
+
+//校验固定电话
+export const phone = (str, bol) => {
+	var homeMobile = /^((0\d{2,3})-)(\d{7,8})(-(\d{3,}))?$/;
+	if (bol) {
+		if (homeMobile.test(str))
+			return false
+		else
+			return true;
+	} else {
+		if (typeof str != "undefined" && str.length > 0) {
+			if (homeMobile.test(str))
+				return false
+			else
+				return true;
+		} else {
+			return false
+		}
+
+	}
+
+};
+
+//校验电话号码
+export const mobileOrPhone = (str, bol) => {
+	var homeMobile = /^((0\d{2,3})-)(\d{7,8})(-(\d{3,}))?$/;
+	var isMobile = /^1(3|4|5|6|7|8|9)\d{9}$/;
+	if (bol) {
+		if (homeMobile.test(str) || isMobile.test(str))
+			return false
+		else
+			return true;
+	} else {
+		if (typeof str != "undefined" && str.length > 0) {
+			if (homeMobile.test(str) || isMobile.test(str))
+				return false
+			else
+				return true;
+		} else {
+			return false
+		}
+
+	}
+
+};
+
+//校验身份证号
+export const idcard = (str) => {
+	var idcard1 = /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/;
+	var idcard2 = /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/;
+	if (idcard1.test(str) || idcard2.test(str))
+		return false
+	else
+		return true;
+};
+
+//获取本周
+export const getCurrentWeek = (str) => {
+	//获取当前时间
+	const currentDate = new Date(str)
+	//返回date是一周中的某一天
+	const week = currentDate.getDay()
+	//一天的毫秒数
+	const millisecond = 1000 * 60 * 60 * 24
+	//减去的天数
+	const minusDay = week != 0 ? week - 1 : 6
+	//本周 周一
+	const monday = new Date(currentDate.getTime() - minusDay * millisecond)
+	//本周 周日
+	const sunday = new Date(monday.getTime() + 6 * millisecond)
+	return [monday, sunday]
+};
+
+//获取上一周
+export const handleGetPrevWeek = (str) => {
+	const Time = new Date(str)
+	let weekNum = Time.getDay()
+	weekNum = weekNum == 0 ? 7 : weekNum
+	let lastDate = new Date(Time.getTime() - weekNum * 24 * 60 * 60 * 1000)
+	let fitstDate = new Date(
+		Time.getTime() - (weekNum + 6) * 24 * 60 * 60 * 1000
+	)
+	let startDate =
+		`${fitstDate.getFullYear()}-${fitstDate.getMonth() + 1 < 10
+			? '0' + (fitstDate.getMonth() + 1)
+			: fitstDate.getMonth() + 1
+		}-${fitstDate.getDate() < 10
+			? '0' + fitstDate.getDate()
+			: fitstDate.getDate()
+		}`
+	let endDate =
+		`${lastDate.getFullYear()}-${lastDate.getMonth() + 1 < 10
+			? '0' + (lastDate.getMonth() + 1)
+			: lastDate.getMonth() + 1
+		}-${lastDate.getDate() < 10 ? '0' + lastDate.getDate() : lastDate.getDate()
+		}`
+	return [startDate, endDate]
+};
+
+
+//获取下一周
+export const handleGetNextvWeek = (str) => {
+	const Time = new Date(str)
+	let weekNum = Time.getDay()
+	weekNum = weekNum == 0 ? 7 : weekNum
+
+	let fitstDate = new Date(
+		Time.getTime() + (7 - weekNum + 1) * 24 * 60 * 60 * 1000
+	)
+	let lastDate = new Date(
+		Time.getTime() + (7 - weekNum + 7) * 24 * 60 * 60 * 1000
+	)
+	let startDate =
+		`${fitstDate.getFullYear()}-${fitstDate.getMonth() + 1 < 10
+			? '0' + (fitstDate.getMonth() + 1)
+			: fitstDate.getMonth() + 1
+		}-${fitstDate.getDate() < 10
+			? '0' + fitstDate.getDate()
+			: fitstDate.getDate()
+		}`
+	let endDate =
+		`${lastDate.getFullYear()}-${lastDate.getMonth() + 1 < 10
+			? '0' + (lastDate.getMonth() + 1)
+			: lastDate.getMonth() + 1
+		}-${lastDate.getDate() < 10 ? '0' + lastDate.getDate() : lastDate.getDate()
+		}`
+	return [startDate, endDate]
+}
+
+// url参数解析
+export const getUrlkey = (url) => {
+	var params = {};
+	var urls = url.split("?");
+	var arr = urls[1].split("&");
+	for (var i = 0, l = arr.length; i < l; i++) {
+		var a = arr[i].split("=");
+		params[a[0]] = a[1];
+	}
+	return params;
+}
+
+//获取上一个年月
+export const getPreMonth = () => {
+	var date = new Date();
+	var year = date.getFullYear();
+	var month = date.getMonth()
+	if (month == 0) {
+		year = year - 1;
+		month = 12;
+	}
+	month = month <= 9 ? "0" + month : month
+	return year + '年' + month + '月'
+}
+
+//解决IOS日期显示问题
+export const formateIOS = (str, pattern) => {
+	var format = str.replace(/\-/g, "/"); //把“-”,替换成‘/’
+	var date = new Date(format),
+		y = date.getFullYear(),
+		m = (date.getMonth() + 1).toString().padStart(2, 0),
+		d = date.getDate().toString().padStart(2, 0),
+		h = date.getHours().toString().padStart(2, 0),
+		mi = date.getMinutes().toString().padStart(2, 0),
+		se = date.getSeconds().toString().padStart(2, 0);
+	if (pattern == "yyyy.mm.dd") {
+		return `${y}.${m}.${d}`;
+	} else {
+		return y + '-' + m + '-' + d;
+	}
+}
+
+//小写金额转大写
+export const DX = (n) => {
+	var newchar = "";
+	var Num = n;
+	if (Num == "") {
+		//输入框删减为空时,将大写金额的内容值设为原始状态,当然也可以根据需求进行修改
+		newchar = "零元整";
+		return newchar;
+	}
+	var part = String(Num).split(".");
+	for (let i = part[0].length - 1; i >= 0; i--) {
+		if (part[0].length > 10) {
+			newchar = "位数过大,无法计算"; //前面如果有验证位数的,此处判断可去掉
+			return newchar;
+		}
+		var tmpnewchar = ""
+		var perchar = part[0].charAt(i);
+		switch (perchar) {
+			case "0":
+				tmpnewchar = "零" + tmpnewchar;
+				break;
+			case "1":
+				tmpnewchar = "壹" + tmpnewchar;
+				break;
+			case "2":
+				tmpnewchar = "贰" + tmpnewchar;
+				break;
+			case "3":
+				tmpnewchar = "叁" + tmpnewchar;
+				break;
+			case "4":
+				tmpnewchar = "肆" + tmpnewchar;
+				break;
+			case "5":
+				tmpnewchar = "伍" + tmpnewchar;
+				break;
+			case "6":
+				tmpnewchar = "陆" + tmpnewchar;
+				break;
+			case "7":
+				tmpnewchar = "柒" + tmpnewchar;
+				break;
+			case "8":
+				tmpnewchar = "捌" + tmpnewchar;
+				break;
+			case "9":
+				tmpnewchar = "玖" + tmpnewchar;
+				break;
+		}
+		switch (part[0].length - i - 1) {
+			case 0:
+				tmpnewchar = tmpnewchar + "元";
+				break;
+			case 1:
+				if (perchar != 0) tmpnewchar = tmpnewchar + "拾";
+				break;
+			case 2:
+				if (perchar != 0) tmpnewchar = tmpnewchar + "佰";
+				break;
+			case 3:
+				if (perchar != 0) tmpnewchar = tmpnewchar + "仟";
+				break;
+			case 4:
+				tmpnewchar = tmpnewchar + "万";
+				break;
+			case 5:
+				if (perchar != 0) tmpnewchar = tmpnewchar + "拾";
+				break;
+			case 6:
+				if (perchar != 0) tmpnewchar = tmpnewchar + "佰";
+				break;
+			case 7:
+				if (perchar != 0) tmpnewchar = tmpnewchar + "仟";
+				break;
+			case 8:
+				tmpnewchar = tmpnewchar + "亿";
+				break;
+			case 9:
+				tmpnewchar = tmpnewchar + "拾";
+				break;
+		}
+		newchar = tmpnewchar + newchar;
+	}
+	if (("" + Num).indexOf(".") != -1) {
+		if (part[1].length > 2) {
+			part[1] = part[1].substr(0, 2)
+		}
+		for (i = 0; i < part[1].length; i++) {
+			tmpnewchar = ""
+			var perchar = part[1].charAt(i)
+			switch (perchar) {
+				case "0":
+					tmpnewchar = "零" + tmpnewchar;
+					break;
+				case "1":
+					tmpnewchar = "壹" + tmpnewchar;
+					break;
+				case "2":
+					tmpnewchar = "贰" + tmpnewchar;
+					break;
+				case "3":
+					tmpnewchar = "叁" + tmpnewchar;
+					break;
+				case "4":
+					tmpnewchar = "肆" + tmpnewchar;
+					break;
+				case "5":
+					tmpnewchar = "伍" + tmpnewchar;
+					break;
+				case "6":
+					tmpnewchar = "陆" + tmpnewchar;
+					break;
+				case "7":
+					tmpnewchar = "柒" + tmpnewchar;
+					break;
+				case "8":
+					tmpnewchar = "捌" + tmpnewchar;
+					break;
+				case "9":
+					tmpnewchar = "玖" + tmpnewchar;
+					break;
+			}
+			if (i == 0) tmpnewchar = tmpnewchar + "角";
+			if (i == 1) tmpnewchar = tmpnewchar + "分";
+			newchar = newchar + tmpnewchar;
+		}
+	}
+	while (newchar.search("零元") != -1) {
+		newchar = newchar.replace("零零", "零");
+		newchar = newchar.replace("零亿", "亿");
+		newchar = newchar.replace("亿万", "亿");
+		newchar = newchar.replace("零万", "万");
+		newchar = newchar.replace("零元", "元");
+		newchar = newchar.replace("零角", "");
+		newchar = newchar.replace("零分", "");
+	}
+	if (newchar.charAt(newchar.length - 1) == "元" || newchar.charAt(newchar.length - 1) == "角") {
+		newchar = newchar + "整";
+	}
+	return newchar;
+}
+//计算数组对象某个属性的总和
+export const countTotal = (arr, keyName) => {
+	let $total = 0;
+	$total = arr.reduce(function (total, currentValue, currentIndex, arr) {
+		return parseFloat(currentValue[keyName]) ? (total + parseFloat(currentValue[keyName])) : total;
+	}, 0);
+	return $total;
+}
+
+//防抖函数
+let timeout = null;
+export const debounce = (fn, wait) => {
+	if (timeout != null) clearTimeout(timeout)
+	timeout = setTimeout(fn, wait)
+}
+
+
+//对象深拷贝
+export const deepClone = (obj) => {
+	let objClone = Array.isArray(obj) ? [] : {};
+	if (obj && typeof obj === "object") {
+		for (var key in obj) {
+			if (obj.hasOwnProperty(key)) {
+				//判断ojb子元素是否为对象,如果是,递归复制
+				if (obj[key] && typeof obj[key] === "object") {
+					objClone[key] = deepClone(obj[key]);
+				} else {
+					//如果不是,简单复制
+					objClone[key] = obj[key];
+				}
+			}
+		}
+	}
+	return objClone;
+}
+
+
+//字母大写转小写
+export const  strChange = (arg) => {
+    var str=arg.split('');
+    for(var i = 0; i < str.length; i++) {
+        if (str[i].charAt() >= "a" && str[i].charAt() <= "z") {
+			//转换成大写
+            // str[i] = str[i].toUpperCase();
+        } else {
+			//转换成小写
+            str[i] = str[i].toLowerCase();
+        }
+    }
+    return str.join('');
+}
+
+//创建unid
+export const createUnid = () => {
+	var unid = "";
+	const str = "0 1 2 3 4 5 6 7 8 9 A B C D E F"
+	var arr = str.split(" ");
+	var dateStr = getCurDateStr();
+	for (let i = 0; i < 18; i++) {
+		unid += arr[Math.round(Math.random() * (arr.length - 1))];
+	}
+	return dateStr + unid;
+}
+
+
+const getCurDateStr = () => {
+	//获取当前时间
+	var mydate = new Date();
+	var newyear = mydate.getFullYear();
+	var newmonth = mydate.getMonth() + 1;
+	newmonth = (newmonth < 10 ? "0" + newmonth : newmonth);
+	var newDate = mydate.getDate();
+	newDate = (newDate < 10 ? "0" + newDate : newDate);
+	var hours = mydate.getHours(); //获取当前小时数(0-23)
+	hours = (hours < 10 ? "0" + hours : hours);
+	var minutes = mydate.getMinutes(); //获取当前分钟数(0-59)
+	minutes = (minutes < 10 ? "0" + minutes : minutes);
+	var seconds = mydate.getSeconds(); //获取当前秒数(0-59)
+	seconds = (seconds < 10 ? "0" + seconds : seconds);
+	var datetime = "" + newyear + newmonth + newDate + hours + minutes + seconds;
+	return datetime;
+}
+
+//获取短信模板消息体 已使用
+export const getmestemplate = async (e) => {
+	const res = await getSmsTemplate(e)
+	return res.data.data
+}
+
+//通过字典获取值
+export const queryType = async (e) => {
+	const res = await queryByType(e)
+	return res.data.data[e.dictTypes].map(item => {
+		return {
+			label: item.dictname,
+			value: item.dictvalue,
+		}
+	});
+}
+
+
+//把年月日时间格式转换成可以识别的时间格式
+export const getDateToNum = (date) => {
+	let redate = ""
+	if (date.indexOf("年") > 1) {
+		redate = date.substring(0, date.indexOf("年"))
+	}
+	if (date.indexOf("月") > 1) {
+		redate = redate + "-" + date.substring(date.indexOf("月") - 2, date.indexOf("月"))
+	}
+	if (date.indexOf("日") > 1) {
+		redate = redate + "-" + date.substring(date.indexOf("日") - 2, date.indexOf("日"))
+	}
+	return redate
+}
+/**
+ * 弹窗提示方法
+ * @param {String} msg 提示的消息
+ * @param {Function} func 成功后执行的方法
+ */
+export async function toastFunc(msg = '', func = null) {
+	uni.showToast({
+		icon: "none",
+		title: msg,
+		complete() {
+			setTimeout(async () => {
+				func && await func()
+			}, 1000)
+		}
+	})
+}
+
+
+/**
+ * 模态框提示方法
+ * @param {String} msg 提示的消息
+ * @param {Function} func 点击确定后执行的方法
+ */
+export function modalFunc(msg = '', func = null, func2 = null) {
+	uni.showModal({
+		title: '提示',
+		content: msg,
+		complete(e) {
+			if (e.confirm) {
+				//点击确定执行的方法
+				func && func()
+			}else if(e.cancel){
+				//点击取消执行的方法
+				func2 && func2()
+			}
+		}
+	})
+}
+
+// 跳转缺省页面
+export function jumpResponseHandle(code, msg) {
+	uni.redirectTo({
+		url: '/pages/commonview/responceHandle?code=' + code + '&msg=' + msg
+	})
+}
+
+// 判断日期大小
+export function computingDate(startDate, endDate) {
+	startDate = new Date(startDate).getTime()
+	endDate = new Date(endDate).getTime()
+	if (startDate == endDate) {
+		return '等于'
+	} else if (startDate < endDate) {
+		return '小于'
+	} else {
+		return '大于'
+	}
+}
+
+//获取本周日期 i传0 返回本周第一天
+export function getWeek(i) {
+	var now = new Date();
+	var firstDay = new Date(now - (now.getDay() - 1) * 86400000);
+	firstDay.setDate(firstDay.getDate() + i);
+	let mon = Number(firstDay.getMonth()) + 1;
+	let day = firstDay.getDate();
+	if (mon < 10) {
+		mon = '0' + mon
+	}
+	if (day < 10) {
+		day = '0' + day
+	}
+	return now.getFullYear() + "-" + mon + "-" + day;
+}
+
+export function changeNumToHan(num) {
+	var arr1 = new Array('零', '一', '二', '三', '四', '五', '六', '七', '八', '九');
+	var arr2 = new Array('', '十', '百', '千', '万', '十', '百', '千', '亿', '十', '百', '千', '万', '十', '百', '千', '亿');//可继续追加更高位转换值
+	if (!num || isNaN(num)) {
+		return "零";
+	}
+	var english = num.toString().split("")
+	var result = "";
+	for (var i = 0; i < english.length; i++) {
+		var des_i = english.length - 1 - i;//倒序排列设值
+		result = arr2[i] + result;
+		var arr1_index = english[des_i];
+		result = arr1[arr1_index] + result;
+	}
+	//将【零千、零百】换成【零】 【十零】换成【十】
+	result = result.replace(/零(千|百|十)/g, '零').replace(/十零/g, '十');
+	//合并中间多个零为一个零
+	result = result.replace(/零+/g, '零');
+	//将【零亿】换成【亿】【零万】换成【万】
+	result = result.replace(/零亿/g, '亿').replace(/零万/g, '万');
+	//将【亿万】换成【亿】
+	result = result.replace(/亿万/g, '亿');
+	//移除末尾的零
+	result = result.replace(/零+$/, '')
+	//将【零一十】换成【零十】
+	//result = result.replace(/零一十/g, '零十');//貌似正规读法是零一十
+	//将【一十】换成【十】
+	result = result.replace(/^一十/g, '十')
+	return result;
+}

BIN
static/btn_fenlei.png


BIN
static/btn_fenlei2.png


BIN
static/btn_gouwc.png


BIN
static/btn_gouwc2.png


BIN
static/btn_mine.png


BIN
static/btn_mine2.png


BIN
static/btn_shouy.png


BIN
static/btn_shouy2.png


BIN
static/iconm_gongys.png


BIN
static/iconm_gongys2.png


BIN
static/index/btn_xiaox.png


BIN
static/index/btn_yagnzhi@2x.png


BIN
static/index/icomx_sahnchu1.png


BIN
static/index/icon_baoyujg@2x.png


BIN
static/index/icon_baoyym.png


BIN
static/index/icon_haicfl@2x.png


BIN
static/index/icon_penren@2x.png


BIN
static/index/iconm_goutong.png


BIN
static/index/iconm_message.png


BIN
static/index/iconm_play.png


BIN
static/index/iconm_shitu.png


BIN
static/index/img_tianqcx.png


BIN
static/index/sp.png


BIN
static/logo.png


BIN
static/market/btn_chanpfl.png


BIN
static/market/btn_chanpxx.png


BIN
static/market/btn_gouwc.png


BIN
static/market/btn_kefu.png


BIN
static/market/btn_screening.png


BIN
static/market/btn_shoucang.png


BIN
static/market/btn_up.png


BIN
static/market/icomm_dizhi.png


BIN
static/market/icomx_quertj1.png


BIN
static/market/iconm_shoucang.png


BIN
static/market/iconx__caidan1.png


BIN
static/myinfo/btn_right.png


BIN
static/myinfo/icomm_jilu.png


BIN
static/myinfo/icomx_banli.png


BIN
static/myinfo/icomx_dizhi.png


BIN
static/myinfo/icomx_message.png


BIN
static/myinfo/icomx_souc.png


BIN
static/myinfo/icon_dingdang.png


BIN
static/myinfo/iconm_bianj.png


BIN
static/myinfo/iconm_gouwu.png


BIN
static/myinfo/iconm_xiaoxi.png


BIN
static/myinfo/iconx_xitongg.png


+ 10 - 0
uni.promisify.adaptor.js

@@ -0,0 +1,10 @@
+uni.addInterceptor({
+  returnValue (res) {
+    if (!(!!res && (typeof res === "object" || typeof res === "function") && typeof res.then === "function")) {
+      return res;
+    }
+    return new Promise((resolve, reject) => {
+      res.then((res) => res[0] ? reject(res[0]) : resolve(res[1]));
+    });
+  },
+});

+ 163 - 0
uni.scss

@@ -0,0 +1,163 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+
+/* 颜色变量 */
+
+.w700{
+    width: 702rpx;
+}
+.w750{
+    width: 750rpx;
+}
+.popupView{
+    height: 1000rpx;
+    display: flex;
+    padding-top: 100rpx;
+    flex-direction: column;
+    align-items: center;
+}
+.scrollview{
+    width: 702rpx;
+    height: 850rpx;
+    overflow: auto;
+}
+.flex{
+    display: flex;
+    justify-content: space-evenly;
+}
+.flexac{
+    display: flex;
+    align-items: center;
+}
+.flexfend{
+    display: flex;
+    align-items: flex-end;
+}
+.flexjc{
+    display: flex;
+    justify-content: center;
+}
+.search{
+    width: 702rpx;
+    height: 80rpx;
+    background: #FFFFFF;
+    border-radius: 40rpx 40rpx 40rpx 40rpx;
+    opacity: 1;
+
+    display: flex;
+    align-items: center;
+}
+.searchBtn{
+    width: 100rpx;
+    color: #333;
+    font-size: 28rpx;
+    font-weight: 500;
+    padding-left: 16rpx;
+    border-left: 1rpx solid #ccc;
+}
+
+.subsection{
+    width: 272rpx;
+    height: 72rpx;
+    background: #F6F6F6;
+    border-radius: 40rpx 40rpx 40rpx 40rpx;
+    opacity: 1;
+
+    display: flex;
+    align-items: center;
+    justify-content: center;
+
+    font-size: 28rpx;
+    font-weight: 400;
+    color: #333333;
+}
+.checksub{
+    width: 120rpx;
+    height: 56rpx;
+    background: #46A6FF;
+    border-radius: 32rpx 32rpx 32rpx 32rpx;
+    color: #fff;
+
+    text-align: center;
+    line-height: 56rpx;
+}
+.nocheck{
+    width: 120rpx;
+    height: 56rpx;
+    text-align: center;
+    line-height: 56rpx;
+}
+/* 行为相关颜色 */
+/* uni.scss */
+@import '@/uni_modules/uview-ui/theme.scss';
+
+$uni-color-primary: #007aff;
+$uni-color-success: #4cd964;
+$uni-color-warning: #f0ad4e;
+$uni-color-error: #dd524d;
+
+/* 文字基本颜色 */
+$uni-text-color:#333;//基本色
+$uni-text-color-inverse:#fff;//反色
+$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息
+$uni-text-color-placeholder: #808080;
+$uni-text-color-disable:#c0c0c0;
+
+/* 背景颜色 */
+$uni-bg-color:#ffffff;
+$uni-bg-color-grey:#f8f8f8;
+$uni-bg-color-hover:#f1f1f1;//点击状态颜色
+$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色
+
+/* 边框颜色 */
+$uni-border-color:#c8c7cc;
+
+/* 尺寸变量 */
+
+/* 文字尺寸 */
+$uni-font-size-sm:12px;
+$uni-font-size-base:14px;
+$uni-font-size-lg:16;
+
+/* 图片尺寸 */
+$uni-img-size-sm:20px;
+$uni-img-size-base:26px;
+$uni-img-size-lg:40px;
+
+/* Border Radius */
+$uni-border-radius-sm: 2px;
+$uni-border-radius-base: 3px;
+$uni-border-radius-lg: 6px;
+$uni-border-radius-circle: 50%;
+
+/* 水平间距 */
+$uni-spacing-row-sm: 5px;
+$uni-spacing-row-base: 10px;
+$uni-spacing-row-lg: 15px;
+
+/* 垂直间距 */
+$uni-spacing-col-sm: 4px;
+$uni-spacing-col-base: 8px;
+$uni-spacing-col-lg: 12px;
+
+/* 透明度 */
+$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
+
+/* 文章场景相关 */
+$uni-color-title: #2C405A; // 文章标题颜色
+$uni-font-size-title:20px;
+$uni-color-subtitle: #555555; // 二级标题颜色
+$uni-font-size-subtitle:26px;
+$uni-color-paragraph: #3F536E; // 文章段落颜色
+$uni-font-size-paragraph:15px;

+ 21 - 0
uni_modules/uview-ui/LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 www.uviewui.com
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 66 - 0
uni_modules/uview-ui/README.md

@@ -0,0 +1,66 @@
+<p align="center">
+    <img alt="logo" src="https://uviewui.com/common/logo.png" width="120" height="120" style="margin-bottom: 10px;">
+</p>
+<h3 align="center" style="margin: 30px 0 30px;font-weight: bold;font-size:40px;">uView 2.0</h3>
+<h3 align="center">多平台快速开发的UI框架</h3>
+
+[![stars](https://img.shields.io/github/stars/umicro/uView2.0?style=flat-square&logo=GitHub)](https://github.com/umicro/uView2.0)
+[![forks](https://img.shields.io/github/forks/umicro/uView2.0?style=flat-square&logo=GitHub)](https://github.com/umicro/uView2.0)
+[![issues](https://img.shields.io/github/issues/umicro/uView2.0?style=flat-square&logo=GitHub)](https://github.com/umicro/uView2.0/issues)
+[![Website](https://img.shields.io/badge/uView-up-blue?style=flat-square)](https://uviewui.com)
+[![release](https://img.shields.io/github/v/release/umicro/uView2.0?style=flat-square)](https://gitee.com/umicro/uView2.0/releases)
+[![license](https://img.shields.io/github/license/umicro/uView2.0?style=flat-square)](https://en.wikipedia.org/wiki/MIT_License)
+
+## 说明
+
+uView UI,是[uni-app](https://uniapp.dcloud.io/)全面兼容nvue的uni-app生态框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水
+
+## [官方文档:https://uviewui.com](https://uviewui.com)
+
+
+## 预览
+
+您可以通过**微信**扫码,查看最佳的演示效果。
+<br>
+<br>
+<img src="https://uviewui.com/common/weixin_mini_qrcode.png" width="220" height="220" >
+
+
+## 链接
+
+- [官方文档](https://www.uviewui.com/)
+- [更新日志](https://www.uviewui.com/components/changelog.html)
+- [升级指南](https://www.uviewui.com/components/changeGuide.html)
+- [关于我们](https://www.uviewui.com/cooperation/about.html)
+
+## 交流反馈
+
+欢迎加入我们的QQ群交流反馈:[点此跳转](https://www.uviewui.com/components/addQQGroup.html)
+
+## 关于PR
+
+> 我们非常乐意接受各位的优质PR,但在此之前我希望您了解uView2.0是一个需要兼容多个平台的(小程序、h5、ios app、android app)包括nvue页面、vue页面。
+> 所以希望在您修复bug并提交之前尽可能的去这些平台测试一下兼容性。最好能携带测试截图以方便审核。非常感谢!
+
+## 安装
+
+#### **uni-app插件市场链接** —— [https://ext.dcloud.net.cn/plugin?id=1593](https://ext.dcloud.net.cn/plugin?id=1593)
+
+请通过[官网安装文档](https://www.uviewui.com/components/install.html)了解更详细的内容
+
+## 快速上手
+
+请通过[快速上手](https://uviewui.com/components/quickstart.html)了解更详细的内容
+
+## 使用方法
+配置easycom规则后,自动按需引入,无需`import`组件,直接引用即可。
+
+```html
+<template>
+	<u-button text="按钮"></u-button>
+</template>
+```
+
+## 版权信息
+uView遵循[MIT](https://en.wikipedia.org/wiki/MIT_License)开源协议,意味着您无需支付任何费用,也无需授权,即可将uView应用到您的产品中。
+

+ 362 - 0
uni_modules/uview-ui/changelog.md

@@ -0,0 +1,362 @@
+## 2.0.36(2023-03-27)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 重构`deepClone` & `deepMerge`方法
+2. 其他优化
+## 2.0.34(2022-09-24)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. `u-input`、`u-textarea`增加`ignoreCompositionEvent`属性
+2. 修复`route`方法调用可能报错的问题
+3. 修复`u-no-network`组件`z-index`无效的问题
+4. 修复`textarea`组件在h5上confirmType=""报错的问题
+5. `u-rate`适配`nvue`
+6. 优化验证手机号码的正则表达式(根据工信部发布的《电信网编号计划(2017年版)》进行修改。)
+7. `form-item`添加`labelPosition`属性
+8. `u-calendar`修复`maxDate`设置为当前日期,并且当前时间大于08:00时无法显示日期列表的问题 (#724)
+9. `u-radio`增加一个默认插槽用于自定义修改label内容 (#680)
+10. 修复`timeFormat`函数在safari重的兼容性问题 (#664)
+## 2.0.33(2022-06-17)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复`loadmore`组件`lineColor`类型错误问题
+2. 修复`u-parse`组件`imgtap`、`linktap`不生效问题
+## 2.0.32(2022-06-16)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+1. `u-loadmore`新增自定义颜色、虚/实线
+2. 修复`u-swiper-action`组件部分平台不能上下滑动的问题
+3. 修复`u-list`回弹问题
+4. 修复`notice-bar`组件动画在低端安卓机可能会抖动的问题
+5. `u-loading-page`添加控制图标大小的属性`iconSize`
+6. 修复`u-tooltip`组件`color`参数不生效的问题
+7. 修复`u--input`组件使用`blur`事件输出为`undefined`的bug
+8. `u-code-input`组件新增键盘弹起时,是否自动上推页面参数`adjustPosition`
+9. 修复`image`组件`load`事件无回调对象问题
+10. 修复`button`组件`loadingSize`设置无效问题
+10. 其他修复
+## 2.0.31(2022-04-19)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复`upload`在`vue`页面上传成功后没有成功标志的问题
+2. 解决演示项目中微信小程序模拟上传图片一直出于上传中问题
+3. 修复`u-code-input`组件在`nvue`页面编译到`app`平台上光标异常问题(`app`去除此功能)
+4. 修复`actionSheet`组件标题关闭按钮点击事件名称错误的问题
+5. 其他修复
+## 2.0.30(2022-04-04)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. `u-rate`增加`readonly`属性
+2. `tabs`滑块支持设置背景图片
+3. 修复`u-subsection` `mode`为`subsection`时,滑块样式不正确的问题
+4. `u-code-input`添加光标效果动画
+5. 修复`popup`的`open`事件不触发
+6. 修复`u-flex-column`无效的问题
+7. 修复`u-datetime-picker`索引在特定场合异常问题
+8. 修复`u-datetime-picker`最小时间字符串模板错误问题
+9. `u-swiper`添加`m3u8`验证
+10. `u-swiper`修改判断image和video逻辑
+11. 修复`swiper`无法使用本地图片问题,增加`type`参数
+12. 修复`u-row-notice`格式错误问题
+13. 修复`u-switch`组件当`unit`为`rpx`时,`nodeStyle`消失的问题
+14. 修复`datetime-picker`组件`showToolbar`与`visibleItemCount`属性无效的问题
+15. 修复`upload`组件条件编译位置判断错误,导致`previewImage`属性设置为`false`时,整个组件都会被隐藏的问题
+16. 修复`u-checkbox-group`设置`shape`属性无效的问题
+17. 修复`u-upload`的`capture`传入字符串的时候不生效的问题
+18. 修复`u-action-sheet`组件,关闭事件逻辑错误的问题
+19. 修复`u-list`触顶事件的触发错误的问题
+20. 修复`u-text`只有手机号可拨打的问题
+21. 修复`u-textarea`不能换行的问题
+22. 其他修复
+## 2.0.29(2022-03-13)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复`u--text`组件设置`decoration`属性未生效的问题
+2. 修复`u-datetime-picker`使用`formatter`后返回值不正确
+3. 修复`u-datetime-picker` `intercept` 可能为undefined
+4. 修复已设置单位 uni..config.unit = 'rpx'时,线型指示器 `transform` 的位置翻倍,导致指示器超出宽度
+5. 修复mixin中bem方法生成的类名在支付宝和字节小程序中失效
+6. 修复默认值传值为空的时候,打开`u-datetime-picker`报错,不能选中第一列时间的bug
+7. 修复`u-datetime-picker`使用`formatter`后返回值不正确
+8. 修复`u-image`组件`loading`无效果的问题
+9. 修复`config.unit`属性设为`rpx`时,导航栏占用高度不足导致塌陷的问题
+10. 修复`u-datetime-picker`组件`itemHeight`无效问题
+11. 其他修复
+## 2.0.28(2022-02-22)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. search组件新增searchIconSize属性
+2. 兼容Safari/Webkit中传入时间格式如2022-02-17 12:00:56
+3. 修复text value.js 判断日期出format错误问题
+4. priceFormat格式化金额出现精度错误
+5. priceFormat在部分情况下出现精度损失问题
+6. 优化表单rules提示
+7. 修复avatar组件src为空时,展示状态不对
+8. 其他修复
+## 2.0.27(2022-01-28)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1.样式修复
+## 2.0.26(2022-01-28)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1.样式修复
+## 2.0.25(2022-01-27)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复text组件mode=price时,可能会导致精度错误的问题
+2. 添加$u.setConfig()方法,可设置uView内置的config, props, zIndex, color属性,详见:[修改uView内置配置方案](https://uviewui.com/components/setting.html#%E9%BB%98%E8%AE%A4%E5%8D%95%E4%BD%8D%E9%85%8D%E7%BD%AE)
+3. 优化form组件在errorType=toast时,如果输入错误页面会有抖动的问题
+4. 修复$u.addUnit()对配置默认单位可能无效的问题
+## 2.0.24(2022-01-25)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复swiper在current指定非0时缩放有误
+2. 修复u-icon添加stop属性的时候报错
+3. 优化遗留的通过正则判断rpx单位的问题
+4. 优化Layout布局 vue使用gutter时,会超出固定区域
+5. 优化search组件高度单位问题(rpx -> px)
+6. 修复u-image slot 加载和错误的图片失去了高度
+7. 修复u-index-list中footer插槽与header插槽存在性判断错误
+8. 修复部分机型下u-popup关闭时会闪烁
+9. 修复u-image在nvue-app下失去宽高
+10. 修复u-popup运行报错
+11. 修复u-tooltip报错
+12. 修复box-sizing在app下的警告
+13. 修复u-navbar在小程序中报运行时错误
+14. 其他修复
+## 2.0.23(2022-01-24)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复image组件在hx3.3.9的nvue下可能会显示异常的问题
+2. 修复col组件gutter参数带rpx单位处理不正确的问题
+3. 修复text组件单行时无法显示省略号的问题
+4. navbar添加titleStyle参数
+5. 升级到hx3.3.9可消除nvue下控制台样式警告的问题
+## 2.0.22(2022-01-19)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. $u.page()方法优化,避免在特殊场景可能报错的问题
+2. picker组件添加immediateChange参数
+3. 新增$u.pages()方法
+## 2.0.21(2022-01-19)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 优化:form组件在用户设置rules的时候提示用户model必传
+2. 优化遗留的通过正则判断rpx单位的问题
+3. 修复微信小程序环境中tabbar组件开启safeAreaInsetBottom属性后,placeholder高度填充不正确
+4. 修复swiper在current指定非0时缩放有误
+5. 修复u-icon添加stop属性的时候报错
+6. 修复upload组件在accept=all的时候没有作用
+7. 修复在text组件mode为phone时call属性无效的问题
+8. 处理u-form clearValidate方法
+9. 其他修复
+## 2.0.20(2022-01-14)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复calendar默认会选择一个日期,如果直接点确定的话,无法取到值的问题
+2. 修复Slider缺少disabled props 还有注释
+3. 修复u-notice-bar点击事件无法拿到index索引值的问题
+4. 修复u-collapse-item在vue文件下,app端自定义插槽不生效的问题
+5. 优化头像为空时显示默认头像 
+6. 修复图片地址赋值后判断加载状态为完成问题
+7. 修复日历滚动到默认日期月份区域
+8. search组件暴露点击左边icon事件
+9. 修复u-form clearValidate方法不生效
+10. upload h5端增加返回文件参数(文件的name参数)
+11. 处理upload选择文件后url为blob类型无法预览的问题
+12. u-code-input 修复输入框没有往左移出一半屏幕
+13. 修复Upload上传 disabled为true时,控制台报hoverClass类型错误
+14. 临时处理ios app下grid点击坍塌问题
+15. 其他修复
+## 2.0.19(2021-12-29)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 优化微信小程序包体积可在微信中预览,请升级HbuilderX3.3.4,同时在“运行->运行到小程序模拟器”中勾选“运行时是否压缩代码”
+2. 优化微信小程序setData性能,处理某些方法如$u.route()无法在模板中使用的问题
+3. navbar添加autoBack参数
+4. 允许avatar组件的事件冒泡
+5. 修复cell组件报错问题
+6. 其他修复
+## 2.0.18(2021-12-28)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复app端编译报错问题
+2. 重新处理微信小程序端setData过大的性能问题
+3. 修复边框问题
+4. 修复最大最小月份不大于0则没有数据出现的问题
+5. 修复SwipeAction微信小程序端无法上下滑动问题
+6. 修复input的placeholder在小程序端默认显示为true问题
+7. 修复divider组件click事件无效问题
+8. 修复u-code-input maxlength 属性值为 String 类型时显示异常
+9. 修复当 grid只有 1到2时 在小程序端algin设置无效的问题
+10. 处理form-item的label为top时,取消错误提示的左边距
+11. 其他修复
+## 2.0.17(2021-12-26)
+## uView正在参与开源中国的“年度最佳项目”评选,之前投过票的现在也可以投票,恳请同学们投一票,[点此帮助uView](https://www.oschina.net/project/top_cn_2021/?id=583)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 解决HBuilderX3.3.3.20211225版本导致的样式问题
+2. calendar日历添加monthNum参数
+3. navbar添加center slot
+## 2.0.16(2021-12-25)
+## uView正在参与开源中国的“年度最佳项目”评选,之前投过票的现在也可以投票,恳请同学们投一票,[点此帮助uView](https://www.oschina.net/project/top_cn_2021/?id=583)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 解决微信小程序setData性能问题
+2. 修复count-down组件change事件不触发问题
+## 2.0.15(2021-12-21)
+## uView正在参与开源中国的“年度最佳项目”评选,之前投过票的现在也可以投票,恳请同学们投一票,[点此帮助uView](https://www.oschina.net/project/top_cn_2021/?id=583)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复Cell单元格titleWidth无效
+2. 修复cheakbox组件ischecked不更新
+3. 修复keyboard是否显示"."按键默认值问题
+4. 修复number-keyboard是否显示键盘的"."符号问题
+5. 修复Input输入框 readonly无效
+6. 修复u-avatar 导致打包app、H5时候报错问题
+7. 修复Upload上传deletable无效
+8. 修复upload当设置maxSize时无效的问题
+9. 修复tabs lineWidth传入带单位的字符串的时候偏移量计算错误问题
+10. 修复rate组件在有padding的view内,显示的星星位置和可触摸区域不匹配,无法正常选中星星
+## 2.0.13(2021-12-14)
+## [点击加群交流反馈:364463526](https://jq.qq.com/?_chanwv=1027&k=mCxS3TGY)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复配置默认单位为rpx可能会导致自定义导航栏高度异常的问题
+## 2.0.12(2021-12-14)
+## [点击加群交流反馈:364463526](https://jq.qq.com/?_chanwv=1027&k=mCxS3TGY)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复tabs组件在vue环境下划线消失的问题
+2. 修复upload组件在安卓小程序无法选择视频的问题
+3. 添加uni.$u.config.unit配置,用于配置参数默认单位,详见:[默认单位配置](https://www.uviewui.com/components/setting.html#%E9%BB%98%E8%AE%A4%E5%8D%95%E4%BD%8D%E9%85%8D%E7%BD%AE)
+4. 修复textarea组件在没绑定v-model时,字符统计不生效问题
+5. 修复nvue下控制是否出现滚动条失效问题
+## 2.0.11(2021-12-13)
+## [点击加群交流反馈:364463526](https://jq.qq.com/?_chanwv=1027&k=mCxS3TGY)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. text组件align参数无效的问题
+2. subsection组件添加keyName参数
+3. upload组件无法判断[Object file]类型的问题
+4. 处理notify层级过低问题
+5. codeInput组件添加disabledDot参数
+6. 处理actionSheet组件round参数无效的问题
+7. calendar组件添加round参数用于控制圆角值
+8. 处理swipeAction组件在vue环境下默认被打开的问题
+9. button组件的throttleTime节流参数无效的问题
+10. 解决u-notify手动关闭方法close()无效的问题
+11. input组件readonly不生效问题
+12. tag组件type参数为info不生效问题
+## 2.0.10(2021-12-08)
+## [点击加群交流反馈:364463526](https://jq.qq.com/?_chanwv=1027&k=mCxS3TGY)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复button sendMessagePath属性不生效
+2. 修复DatetimePicker选择器title无效
+3. 修复u-toast设置loading=true不生效
+4. 修复u-text金额模式传0报错
+5. 修复u-toast组件的icon属性配置不生效
+6. button的icon在特殊场景下的颜色优化
+7. IndexList优化,增加#
+## 2.0.9(2021-12-01)
+## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 优化swiper的height支持100%值(仅vue有效),修复嵌入视频时click事件无法触发的问题
+2. 优化tabs组件对list值为空的判断,或者动态变化list时重新计算相关尺寸的问题
+3. 优化datetime-picker组件逻辑,让其后续打开的默认值为上一次的选中值,需要通过v-model绑定值才有效
+4. 修复upload内嵌在其他组件中,选择图片可能不会换行的问题
+## 2.0.8(2021-12-01)
+## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复toast的position参数无效问题
+2. 处理input在ios nvue上无法获得焦点的问题
+3. avatar-group组件添加extraValue参数,让剩余展示数量可手动控制
+4. tabs组件添加keyName参数用于配置从对象中读取的键名
+5. 处理text组件名字脱敏默认配置无效的问题
+6. 处理picker组件item文本太长换行问题
+## 2.0.7(2021-11-30)
+## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复radio和checkbox动态改变v-model无效的问题。
+2. 优化form规则validator在微信小程序用法
+3. 修复backtop组件mode参数在微信小程序无效的问题
+4. 处理Album的previewFullImage属性无效的问题
+5. 处理u-datetime-picker组件mode='time'在选择改变时间时,控制台报错的问题
+## 2.0.6(2021-11-27)
+## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 处理tag组件在vue下边框无效的问题。
+2. 处理popup组件圆角参数可能无效的问题。
+3. 处理tabs组件lineColor参数可能无效的问题。
+4. propgress组件在值很小时,显示异常的问题。
+## 2.0.5(2021-11-25)
+## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. calendar在vue下显示异常问题。 
+2. form组件labelPosition和errorType参数无效的问题
+3. input组件inputAlign无效的问题
+4. 其他一些修复
+## 2.0.4(2021-11-23)
+## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+0. input组件缺失@confirm事件,以及subfix和prefix无效问题
+1. component.scss文件样式在vue下干扰全局布局问题
+2. 修复subsection在vue环境下表现异常的问题
+3. tag组件的bgColor等参数无效的问题
+4. upload组件不换行的问题
+5. 其他的一些修复处理
+## 2.0.3(2021-11-16)
+## [点击加群交流反馈:1129077272](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. uView2.0已实现全面兼容nvue
+2. uView2.0对1.x进行了架构重构,细节和性能都有极大提升
+3. 目前uView2.0为公测阶段,相关细节可能会有变动
+4. 我们写了一份与1.x的对比指南,详见[对比1.x](https://www.uviewui.com/components/diff1.x.html)
+5. 处理modal的confirm回调事件拼写错误问题
+6. 处理input组件@input事件参数错误问题
+7. 其他一些修复
+## 2.0.2(2021-11-16)
+## [点击加群交流反馈:1129077272](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. uView2.0已实现全面兼容nvue
+2. uView2.0对1.x进行了架构重构,细节和性能都有极大提升
+3. 目前uView2.0为公测阶段,相关细节可能会有变动
+4. 我们写了一份与1.x的对比指南,详见[对比1.x](https://www.uviewui.com/components/diff1.x.html)
+5. 修复input组件formatter参数缺失问题
+6. 优化loading-icon组件的scss写法问题,防止不兼容新版本scss
+## 2.0.0(2020-11-15)
+## [点击加群交流反馈:1129077272](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. uView2.0已实现全面兼容nvue
+2. uView2.0对1.x进行了架构重构,细节和性能都有极大提升
+3. 目前uView2.0为公测阶段,相关细节可能会有变动
+4. 我们写了一份与1.x的对比指南,详见[对比1.x](https://www.uviewui.com/components/diff1.x.html)
+5. 修复input组件formatter参数缺失问题
+
+

+ 78 - 0
uni_modules/uview-ui/components/u--form/u--form.vue

@@ -0,0 +1,78 @@
+<template>
+	<uvForm
+		ref="uForm"
+		:model="model"
+		:rules="rules"
+		:errorType="errorType"
+		:borderBottom="borderBottom"
+		:labelPosition="labelPosition"
+		:labelWidth="labelWidth"
+		:labelAlign="labelAlign"
+		:labelStyle="labelStyle"
+		:customStyle="customStyle"
+	>
+		<slot />
+	</uvForm>
+</template>
+
+<script>
+	/**
+	 * 此组件存在的理由是,在nvue下,u-form被uni-app官方占用了,u-form在nvue中相当于form组件
+	 * 所以在nvue下,取名为u--form,内部其实还是u-form.vue,只不过做一层中转
+	 */
+	import uvForm from '../u-form/u-form.vue';
+	import props from '../u-form/props.js'
+	export default {
+		// #ifdef MP-WEIXIN
+		name: 'u-form',
+		// #endif
+		// #ifndef MP-WEIXIN
+		name: 'u--form',
+		// #endif
+		mixins: [uni.$u.mpMixin, props, uni.$u.mixin],
+		components: {
+			uvForm
+		},
+		created() {
+			this.children = []
+		},
+		methods: {
+			// 手动设置校验的规则,如果规则中有函数的话,微信小程序中会过滤掉,所以只能手动调用设置规则
+			setRules(rules) {
+				this.$refs.uForm.setRules(rules)
+			},
+			validate() {
+				/**
+				 * 在微信小程序中,通过this.$parent拿到的父组件是u--form,而不是其内嵌的u-form
+				 * 导致在u-form组件中,拿不到对应的children数组,从而校验无效,所以这里每次调用u-form组件中的
+				 * 对应方法的时候,在小程序中都先将u--form的children赋值给u-form中的children
+				 */
+				// #ifdef MP-WEIXIN
+				this.setMpData()
+				// #endif
+				return this.$refs.uForm.validate()
+			},
+			validateField(value, callback) {
+				// #ifdef MP-WEIXIN
+				this.setMpData()
+				// #endif
+				return this.$refs.uForm.validateField(value, callback)
+			},
+			resetFields() {
+				// #ifdef MP-WEIXIN
+				this.setMpData()
+				// #endif
+				return this.$refs.uForm.resetFields()
+			},
+			clearValidate(props) {
+				// #ifdef MP-WEIXIN
+				this.setMpData()
+				// #endif
+				return this.$refs.uForm.clearValidate(props)
+			},
+			setMpData() {
+				this.$refs.uForm.children = this.children
+			}
+		},
+	}
+</script>

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels