From 686c1ae304244a6825d858da9b66ed4777e66c02 Mon Sep 17 00:00:00 2001 From: weicw <594098497@qq.com> Date: Mon, 23 Oct 2023 15:21:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B9=B1=E4=B8=83=E5=85=AB=E7=B3=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + config.js | 6 +- pages/checkout/cashier/index.vue | 16 +- pages/checkout/checkout.vue | 174 +++-- pages/checkout/index.vue | 3 + pages/equipment/equipment.vue | 10 +- pages/index/index.vue | 30 + pages/order/delivery.vue | 24 +- pages/order/detail.vue | 219 ++---- pages/order/index.vue | 97 +-- pages/user/equipment/index.vue | 3 +- static/order/checkout.png | Bin 0 -> 7331 bytes static/zhimamianya.png | Bin 0 -> 35861 bytes uni_modules/uni-data-picker/changelog.md | 75 +++ .../components/uni-data-picker/keypress.js | 45 ++ .../uni-data-picker/uni-data-picker.vue | 551 ++++++++++++++++ .../uni-data-pickerview/uni-data-picker.js | 622 ++++++++++++++++++ .../uni-data-pickerview.vue | 323 +++++++++ uni_modules/uni-data-picker/package.json | 90 +++ uni_modules/uni-data-picker/readme.md | 22 + uni_modules/uni-load-more/changelog.md | 19 + .../components/uni-load-more/i18n/en.json | 5 + .../components/uni-load-more/i18n/index.js | 8 + .../uni-load-more/i18n/zh-Hans.json | 5 + .../uni-load-more/i18n/zh-Hant.json | 5 + .../uni-load-more/uni-load-more.vue | 399 +++++++++++ uni_modules/uni-load-more/package.json | 86 +++ uni_modules/uni-load-more/readme.md | 14 + websoft/api/order.js | 13 +- 29 files changed, 2571 insertions(+), 294 deletions(-) create mode 100644 static/order/checkout.png create mode 100644 static/zhimamianya.png create mode 100644 uni_modules/uni-data-picker/changelog.md create mode 100644 uni_modules/uni-data-picker/components/uni-data-picker/keypress.js create mode 100644 uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue create mode 100644 uni_modules/uni-data-picker/package.json create mode 100644 uni_modules/uni-data-picker/readme.md create mode 100644 uni_modules/uni-load-more/changelog.md create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/en.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/index.js create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue create mode 100644 uni_modules/uni-load-more/package.json create mode 100644 uni_modules/uni-load-more/readme.md diff --git a/.gitignore b/.gitignore index 17fa7b4..eb6c89d 100755 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /unpackage +/node_modules /utils/request-1.js diff --git a/config.js b/config.js index bd5ce00..b08c1eb 100755 --- a/config.js +++ b/config.js @@ -2,9 +2,9 @@ module.exports = { // 系统名称 name: "云芯威BMS", - // apiUrl: "https://yxw.wsdns.cn/api", // 生产环境 - apiUrl: "http://127.0.0.1:9090/api", // 开发环境 - // apiUrl: "http://1.14.132.108:10050/api", + apiUrl: "https://yxw.wsdns.cn/api", // 生产环境 + // apiUrl: "http://127.0.0.1:9090/api", // 开发环境 + // apiUrl: "http://1.14.132.108:10090/api",// 内网穿透 uploadUrl: 'https://file.wsdns.cn', fileUrl: 'https://oss-yunxinwei.oss-cn-shenzhen.aliyuncs.com', diff --git a/pages/checkout/cashier/index.vue b/pages/checkout/cashier/index.vue index f043427..68e9ff5 100755 --- a/pages/checkout/cashier/index.vue +++ b/pages/checkout/cashier/index.vue @@ -76,7 +76,7 @@ PayStatusEnum } from '@/common/enum/order' import { - getOrder, + getOrderPay, setPayStatus } from '@/websoft/api/order.js' import { @@ -181,7 +181,7 @@ } = this app.isLoading = true // 加载订单 - getOrder(orderId) + getOrderPay(orderId) .then(res => { app.order = res.data app.isLoading = false @@ -271,7 +271,7 @@ handleSubmit() { const app = this const { - orderId + id } = app.order // 判断是否选择了支付方式 if (!app.curPaymentItem) { @@ -284,10 +284,10 @@ // .js console.log("curPaymentItem: ",app.curPaymentItem); if(app.curPaymentItem.method == '余额支付'){ - balance(orderId).then(result => app.onSubmitCallback(result)).catch(err => app.$error(err.message)) + balance(id).then(result => app.onSubmitCallback(result)).catch(err => app.$error(err.message)) } if(app.curPaymentItem.method == '支付宝'){ - alipay(orderId).then(result => app.onSubmitCallback(result)).catch(err => app.$error(err.message)) + alipay(id).then(result => app.onSubmitCallback(result)).catch(err => app.$error(err.message)) } @@ -334,7 +334,7 @@ payQuery(app.orderId).then(result => { if(result.code == 0) { app.$success('支付成功') - app.$navTo('pages/order/index') + uni.navigateBack() } }) @@ -348,7 +348,7 @@ // }) } if (res.resultCode == "6001") { - app.$navTo('pages/order/index') + uni.navigateBack() } // my.alert({ // content: JSON.stringify(res), @@ -441,7 +441,7 @@ if (lastPage && inArray(lastPage.route, backRoutes)) { uni.navigateBack() } else { - this.$navTo('pages/order/index', {}, 'redirectTo') + uni.navigateBack() } }, 1200) }, diff --git a/pages/checkout/checkout.vue b/pages/checkout/checkout.vue index 2ca6b30..4a69c62 100644 --- a/pages/checkout/checkout.vue +++ b/pages/checkout/checkout.vue @@ -63,10 +63,14 @@ ¥{{ (record.batteryRent + record.batteryDeposit + record.batteryInsurance).toFixed(2) }}元 - - - - + + + + @@ -87,7 +91,7 @@ 电动车保险 {{ record.batteryInsurance }} 元 - + - + - 我已同意并阅读
《服务协议》
《隐私协议》
+ 我已同意并阅读
《服务协议》
《隐私协议》
@@ -106,7 +111,8 @@ - 立即下单 + + - + @@ -31,7 +31,8 @@ - 已完成 + 已完成 待支付 待绑定 进行中 @@ -199,36 +200,6 @@ - - - 下单方式 - - 分期 - - - - - - 下单方式 - - 已租代购 - - - - - 可用天数 - - {{ Math.abs(order.expirationDay) }}天 - - - - - 下单方式 - - 租赁 - - - 所属门店 @@ -247,25 +218,19 @@ {{ equipment.batteryModel }} + 订单金额 ¥{{ order.totalPrice }} 元 - - - + 销售价格 @@ -373,83 +338,8 @@ - - - - 当前期数 - - 首期 - 第 1 期 - - - - 订单金额 - - ¥{{ orderPrice }} - - - - 优惠券抵扣 - - -¥{{ order.couponMoney }} - - - - {{ setting.pointsName }}抵扣 - - -¥{{ order.pointsMoney }} - - - - {{ priceTitle1 }} - - +¥{{ orderPrice1 }} - - - - {{ priceTitle2 }} - - +¥{{ orderPrice2 }} - - - - {{ priceTitle3 }} - - +¥{{ orderPrice3 }} - - - - 付款时间 - {{ order.payTime }} - - - 到期时间 - - {{ order.expirationTime }} - (已逾期 - {{ Math.abs(order.expirationDay) }}天) - - - - - - - - {{ freeTitle }} - - - {{ orderPrice }} - - - - -- 续费订单 -- + + -- 缴费记录 -- - - 确认收货 - + @@ -810,14 +705,14 @@ const { orderId } = app.order - listOrder({ + OrderApi.getOrderPayList({ rentOrderId: orderId, - payStatus: 20 }) .then(res => { console.log(res); - res.data.sort((a,b) => { - return new Date(a.createTime.replace(/-/gi, '/')) - new Date(b.createTime.replace(/-/gi, '/')) + res.data.sort((a, b) => { + return new Date(a.createTime.replace(/-/gi, '/')) - new Date(b.createTime.replace( + /-/gi, '/')) }) app.renewOrderList = res.data; if (res.data.length >= app.equipmentGoods.periods && (this.order.orderSource == 20 || this @@ -943,9 +838,12 @@ // 点击去支付 onPay(orderId) { - this.$navTo('pages/checkout/cashier/index', { - orderId + OrderApi.getOrderPayByOrderId(orderId).then(res => { + this.$navTo('pages/checkout/cashier/index', { + orderId: res.data.id + }) }) + }, // 跳转到订单评价页 @@ -960,7 +858,7 @@ title: '提示', content: '是否退租', success: (result) => { - if(result.confirm) { + if (result.confirm) { const { orderId, equipmentId @@ -980,7 +878,7 @@ } } }) - + }, // 跳转到设备详情页 @@ -990,51 +888,12 @@ }) }, handleHireEquipment(orderId) { - const app = this - const { - order - } = this - const orderNo = createOrderNo() - var time = new Date().getTime() + 60 * 60 * 1000 * 24 - const expirationTime = dateFormat('YYYY-mm-dd HH:MM:SS', new Date(time)) - addOrder({ - orderNo: createOrderNo(), - merchantCode: order.merchantCode, - goodsId: app.goodsId, - totalPrice: app.orderPrice, - orderPrice: app.orderPrice, - payPrice: app.orderPrice, - month: app.month, - expirationTime, - isRenew: 1, - rentOrderId: orderId, - batteryRent: order.batteryRent, - batteryDeposit: order.batteryDeposit, - batteryInsurance: order.batteryInsurance, - orderSource: order.orderSource, - orderSourceId: order.goodsId, - equipmentId: order.equipmentId, - dealerPhone: order.dealerPhone, - comments: '续租订单' + order.orderNo - }).then(res => { - const { - orderId - } = res.data - app.$success("下单成功") - setTimeout(() => { - this.$navTo('pages/checkout/cashier/index', { - orderId - }) - }, 100) + OrderApi.getOrderPayByOrderId(orderId).then(res => { + this.$navTo('pages/checkout/cashier/index', { + orderId: res.data.id + }) }) - // alipayReLet({ - // orderId, - // orderNo, - // tenantId, - // payPrice: 0.01, - // merchantName: app.order.merchantName, - // userId: app.order.userId - // }).then(result => app.onSubmitCallback(result)).catch(err => app.$error(err.message)) + }, // 订单提交成功后回调 onSubmitCallback(result) { diff --git a/pages/order/index.vue b/pages/order/index.vue index e2b0708..826bee3 100755 --- a/pages/order/index.vue +++ b/pages/order/index.vue @@ -13,12 +13,14 @@ {{ item.merchantName }} - 已完成 + 已完成 待支付 - 待绑定 - 进行中 + 待绑定 + 进行中 进行中 - + @@ -48,8 +50,10 @@ v-if="item.orderStatus == 30">设备编号:{{ item.equipment.equipmentCode }} 设备名称:{{ item.equipmentGoods.goodsName }} 设备型号:{{ item.equipmentGoods.batteryModel }} - 逾期状态: (已逾期{{ Math.abs(item.expirationDay) }}天) - 逾期状态: 即将过期 + 逾期状态: + (已逾期{{ Math.abs(item.expirationDay) }}天) + 逾期状态: 即将过期 - 绑定设备 + 绑定设备 确认收货 @@ -120,7 +126,7 @@ v-if="item.orderStatus == OrderStatusEnum.COMPLETED.value && item.isComment == 0 && item.receiptStatus != 30"> 我要续费 - + @@ -189,7 +195,8 @@ pageOrder, removeOrder, receiptOrder, - addOrder + addOrder, + getOrderPayByOrderId } from '@/websoft/api/order.js' import { bindEquipment @@ -197,33 +204,37 @@ import { uploadFile } from '@/websoft/api/upload.js' - import { fileUrl } from '@/config.js'; -import { - createOrderNo,dateFormat + import { + fileUrl + } from '@/config.js'; + import { + createOrderNo, + dateFormat } from '@/utils/util.js' // 每页记录数量 const pageSize = 15 // tab栏数据 const tabs = [{ - name: `全部`, - value: 'all' - }, { - name: `待支付`, - value: 'payment' - }, - { - name: `待绑定`, - value: 'delivery' - }, - { - name: `进行中`, - value: 'comment' - }, - { - name: `已完成`, - value: 'refund' - }] + name: `全部`, + value: 'all' + }, { + name: `待支付`, + value: 'payment' + }, + { + name: `待绑定`, + value: 'delivery' + }, + { + name: `进行中`, + value: 'comment' + }, + { + name: `已完成`, + value: 'refund' + } + ] export default { components: { @@ -319,7 +330,7 @@ import { app.curTab = index > -1 ? index : 0 } }, - + /** * 上拉加载的回调 (页面初始化时也会执行一次) * 其中page.num:当前页 从1开始, page.size:每页数据条数,默认10 @@ -367,20 +378,21 @@ import { app.where.userId = uni.getStorageSync('userId'); app.where.isRenew = 0; app.where.isApp = true; + app.where.isFreeze = 1; pageOrder(app.where).then(res => { app.list = res.data.list const curPageLen = res.data.list.length const totalSize = res.data.count console.log("totalSize: ", totalSize); app.mescroll.endBySize(curPageLen, totalSize) - - app.list.map((d,index) => { + + app.list.map((d, index) => { const setTime = new Date(d.expirationTime); const nowTime = new Date(); const restSec = setTime.getTime() - nowTime.getTime(); // 剩余天数 - const day = parseInt(restSec / (60*60*24*1000)); - console.log("逾期天数: ",Math.abs(day)); + const day = parseInt(restSec / (60 * 60 * 24 * 1000)); + console.log("逾期天数: ", Math.abs(day)); app.list[index].expirationDay = day }) }) @@ -561,9 +573,14 @@ import { // 点击去支付 onPay(orderId) { - this.$navTo('pages/checkout/cashier/index', { - orderId + + getOrderPayByOrderId(orderId).then(res => { + this.$navTo('pages/checkout/cashier/index', { + orderId: res.data.id + }) }) + + }, // 跳转到订单详情页 @@ -821,8 +838,8 @@ import { margin-top: 30rpx; } } - - .yuqi-text{ + + .yuqi-text { color: #ff0000; } - + \ No newline at end of file diff --git a/pages/user/equipment/index.vue b/pages/user/equipment/index.vue index 7f8bcb1..70dd12f 100644 --- a/pages/user/equipment/index.vue +++ b/pages/user/equipment/index.vue @@ -120,7 +120,8 @@ getEquipmentList() { const app = this EquipmentApi.pageEquipment({ - userId: storage.get("userId") + userId: storage.get("userId"), + equipmentId: app.options.equipmentId }).then(res => { this.list = res.data.list console.log(res); diff --git a/static/order/checkout.png b/static/order/checkout.png new file mode 100644 index 0000000000000000000000000000000000000000..a66ac2b27525ba5fa407955b514c4816e3a37162 GIT binary patch literal 7331 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 Dk}|zn literal 0 HcmV?d00001 diff --git a/static/zhimamianya.png b/static/zhimamianya.png new file mode 100644 index 0000000000000000000000000000000000000000..f694e6b9056d757b5d61e1f04eef55d380b638fb GIT binary patch literal 35861 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

9$dEdz-HP${HO6D+M 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 literal 0 HcmV?d00001 diff --git a/uni_modules/uni-data-picker/changelog.md b/uni_modules/uni-data-picker/changelog.md new file mode 100644 index 0000000..1dd79f7 --- /dev/null +++ b/uni_modules/uni-data-picker/changelog.md @@ -0,0 +1,75 @@ +## 1.1.2(2023-04-11) +- 修复 更改 modelValue 报错的 bug +- 修复 v-for 未使用 key 值控制台 warning +## 1.1.1(2023-02-21) +- 修复代码合并时引发 value 属性为空时不渲染数据的问题 +## 1.1.0(2023-02-15) +- 修复 localdata 不支持动态更新的bug +## 1.0.9(2023-02-15) +- 修复 localdata 不支持动态更新的bug +## 1.0.8(2022-09-16) +- 可以使用 uni-scss 控制主题色 +## 1.0.7(2022-07-06) +- 优化 pc端图标位置不正确的问题 +## 1.0.6(2022-07-05) +- 优化 显示样式 +## 1.0.5(2022-07-04) +- 修复 uni-data-picker 在 uni-forms-item 中宽度不正确的bug +## 1.0.4(2022-04-19) +- 修复 字节小程序 本地数据无法选择下一级的Bug +## 1.0.3(2022-02-25) +- 修复 nvue 不支持的 v-show 的 bug +## 1.0.2(2022-02-25) +- 修复 条件编译 nvue 不支持的 css 样式 +## 1.0.1(2021-11-23) +- 修复 由上个版本引发的map、v-model等属性不生效的bug +## 1.0.0(2021-11-19) +- 优化 组件 UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-data-picker](https://uniapp.dcloud.io/component/uniui/uni-data-picker) +## 0.4.9(2021-10-28) +- 修复 VUE2 v-model 概率无效的 bug +## 0.4.8(2021-10-27) +- 修复 v-model 概率无效的 bug +## 0.4.7(2021-10-25) +- 新增 属性 spaceInfo 服务空间配置 HBuilderX 3.2.11+ +- 修复 树型 uniCloud 数据类型为 int 时报错的 bug +## 0.4.6(2021-10-19) +- 修复 非 VUE3 v-model 为 0 时无法选中的 bug +## 0.4.5(2021-09-26) +- 新增 清除已选项的功能(通过 clearIcon 属性配置是否显示按钮),同时提供 clear 方法以供调用,二者等效 +- 修复 readonly 为 true 时报错的 bug +## 0.4.4(2021-09-26) +- 修复 上一版本造成的 map 属性失效的 bug +- 新增 ellipsis 属性,支持配置 tab 选项长度过长时是否自动省略 +## 0.4.3(2021-09-24) +- 修复 某些情况下级联未触发的 bug +## 0.4.2(2021-09-23) +- 新增 提供 show 和 hide 方法,开发者可以通过 ref 调用 +- 新增 选项内容过长自动添加省略号 +## 0.4.1(2021-09-15) +- 新增 map 属性 字段映射,将 text/value 映射到数据中的其他字段 +## 0.4.0(2021-07-13) +- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 0.3.5(2021-06-04) +- 修复 无法加载云端数据的问题 +## 0.3.4(2021-05-28) +- 修复 v-model 无效问题 +- 修复 loaddata 为空数据组时加载时间过长问题 +- 修复 上个版本引出的本地数据无法选择带有 children 的 2 级节点 +## 0.3.3(2021-05-12) +- 新增 组件示例地址 +## 0.3.2(2021-04-22) +- 修复 非树形数据有 where 属性查询报错的问题 +## 0.3.1(2021-04-15) +- 修复 本地数据概率无法回显时问题 +## 0.3.0(2021-04-07) +- 新增 支持云端非树形表结构数据 +- 修复 根节点 parent_field 字段等于 null 时选择界面错乱问题 +## 0.2.0(2021-03-15) +- 修复 nodeclick、popupopened、popupclosed 事件无法触发的问题 +## 0.1.9(2021-03-09) +- 修复 微信小程序某些情况下无法选择的问题 +## 0.1.8(2021-02-05) +- 优化 部分样式在 nvue 上的兼容表现 +## 0.1.7(2021-02-05) +- 调整为 uni_modules 目录规范 diff --git a/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js b/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js new file mode 100644 index 0000000..6ef26a2 --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js @@ -0,0 +1,45 @@ +// #ifdef H5 +export default { + name: 'Keypress', + props: { + disable: { + type: Boolean, + default: false + } + }, + mounted () { + const keyNames = { + esc: ['Esc', 'Escape'], + tab: 'Tab', + enter: 'Enter', + space: [' ', 'Spacebar'], + up: ['Up', 'ArrowUp'], + left: ['Left', 'ArrowLeft'], + right: ['Right', 'ArrowRight'], + down: ['Down', 'ArrowDown'], + delete: ['Backspace', 'Delete', 'Del'] + } + const listener = ($event) => { + if (this.disable) { + return + } + const keyName = Object.keys(keyNames).find(key => { + const keyName = $event.key + const value = keyNames[key] + return value === keyName || (Array.isArray(value) && value.includes(keyName)) + }) + if (keyName) { + // 避免和其他按键事件冲突 + setTimeout(() => { + this.$emit(keyName, {}) + }, 0) + } + } + document.addEventListener('keyup', listener) + this.$once('hook:beforeDestroy', () => { + document.removeEventListener('keyup', listener) + }) + }, + render: () => {} +} +// #endif diff --git a/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue b/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue new file mode 100644 index 0000000..179a4e0 --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue @@ -0,0 +1,551 @@ + + + + + diff --git a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js new file mode 100644 index 0000000..cfae22a --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js @@ -0,0 +1,622 @@ +export default { + props: { + localdata: { + type: [Array, Object], + default () { + return [] + } + }, + spaceInfo: { + type: Object, + default () { + return {} + } + }, + collection: { + type: String, + default: '' + }, + action: { + type: String, + default: '' + }, + field: { + type: String, + default: '' + }, + orderby: { + type: String, + default: '' + }, + where: { + type: [String, Object], + default: '' + }, + pageData: { + type: String, + default: 'add' + }, + pageCurrent: { + type: Number, + default: 1 + }, + pageSize: { + type: Number, + default: 500 + }, + getcount: { + type: [Boolean, String], + default: false + }, + getone: { + type: [Boolean, String], + default: false + }, + gettree: { + type: [Boolean, String], + default: false + }, + manual: { + type: Boolean, + default: false + }, + value: { + type: [Array, String, Number], + default () { + return [] + } + }, + modelValue: { + type: [Array, String, Number], + default () { + return [] + } + }, + preload: { + type: Boolean, + default: false + }, + stepSearh: { + type: Boolean, + default: true + }, + selfField: { + type: String, + default: '' + }, + parentField: { + type: String, + default: '' + }, + multiple: { + type: Boolean, + default: false + }, + map: { + type: Object, + default () { + return { + text: "text", + value: "value" + } + } + } + }, + data() { + return { + loading: false, + errorMessage: '', + loadMore: { + contentdown: '', + contentrefresh: '', + contentnomore: '' + }, + dataList: [], + selected: [], + selectedIndex: 0, + page: { + current: this.pageCurrent, + size: this.pageSize, + count: 0 + } + } + }, + computed: { + isLocalData() { + return !this.collection.length; + }, + isCloudData() { + return this.collection.length > 0; + }, + isCloudDataList() { + return (this.isCloudData && (!this.parentField && !this.selfField)); + }, + isCloudDataTree() { + return (this.isCloudData && this.parentField && this.selfField); + }, + dataValue() { + let isModelValue = Array.isArray(this.modelValue) ? (this.modelValue.length > 0) : (this.modelValue !== null || + this.modelValue !== undefined); + return isModelValue ? this.modelValue : this.value; + }, + hasValue() { + if (typeof this.dataValue === 'number') { + return true + } + return (this.dataValue != null) && (this.dataValue.length > 0) + } + }, + created() { + this.$watch(() => { + var al = []; + ['pageCurrent', + 'pageSize', + 'spaceInfo', + 'value', + 'modelValue', + 'localdata', + 'collection', + 'action', + 'field', + 'orderby', + 'where', + 'getont', + 'getcount', + 'gettree' + ].forEach(key => { + al.push(this[key]) + }); + return al + }, (newValue, oldValue) => { + let needReset = false + for (let i = 2; i < newValue.length; i++) { + if (newValue[i] != oldValue[i]) { + needReset = true + break + } + } + if (newValue[0] != oldValue[0]) { + this.page.current = this.pageCurrent + } + this.page.size = this.pageSize + + this.onPropsChange() + }) + this._treeData = [] + }, + methods: { + onPropsChange() { + this._treeData = []; + }, + + // 填充 pickview 数据 + async loadData() { + if (this.isLocalData) { + this.loadLocalData(); + } else if (this.isCloudDataList) { + this.loadCloudDataList(); + } else if (this.isCloudDataTree) { + this.loadCloudDataTree(); + } + }, + + // 加载本地数据 + async loadLocalData() { + this._treeData = []; + this._extractTree(this.localdata, this._treeData); + + let inputValue = this.dataValue; + if (inputValue === undefined) { + return; + } + + if (Array.isArray(inputValue)) { + inputValue = inputValue[inputValue.length - 1]; + if (typeof inputValue === 'object' && inputValue[this.map.value]) { + inputValue = inputValue[this.map.value]; + } + } + + this.selected = this._findNodePath(inputValue, this.localdata); + }, + + // 加载 Cloud 数据 (单列) + async loadCloudDataList() { + if (this.loading) { + return; + } + this.loading = true; + + try { + let response = await this.getCommand(); + let responseData = response.result.data; + + this._treeData = responseData; + + this._updateBindData(); + this._updateSelected(); + + this.onDataChange(); + } catch (e) { + this.errorMessage = e; + } finally { + this.loading = false; + } + }, + + // 加载 Cloud 数据 (树形) + async loadCloudDataTree() { + if (this.loading) { + return; + } + this.loading = true; + + try { + let commandOptions = { + field: this._cloudDataPostField(), + where: this._cloudDataTreeWhere() + }; + if (this.gettree) { + commandOptions.startwith = `${this.selfField}=='${this.dataValue}'`; + } + + let response = await this.getCommand(commandOptions); + let responseData = response.result.data; + + this._treeData = responseData; + this._updateBindData(); + this._updateSelected(); + + this.onDataChange(); + } catch (e) { + this.errorMessage = e; + } finally { + this.loading = false; + } + }, + + // 加载 Cloud 数据 (节点) + async loadCloudDataNode(callback) { + if (this.loading) { + return; + } + this.loading = true; + + try { + let commandOptions = { + field: this._cloudDataPostField(), + where: this._cloudDataNodeWhere() + }; + + let response = await this.getCommand(commandOptions); + let responseData = response.result.data; + + callback(responseData); + } catch (e) { + this.errorMessage = e; + } finally { + this.loading = false; + } + }, + + // 回显 Cloud 数据 + getCloudDataValue() { + if (this.isCloudDataList) { + return this.getCloudDataListValue(); + } + + if (this.isCloudDataTree) { + return this.getCloudDataTreeValue(); + } + }, + + // 回显 Cloud 数据 (单列) + getCloudDataListValue() { + // 根据 field's as value标识匹配 where 条件 + let where = []; + let whereField = this._getForeignKeyByField(); + if (whereField) { + where.push(`${whereField} == '${this.dataValue}'`) + } + + where = where.join(' || '); + + if (this.where) { + where = `(${this.where}) && (${where})` + } + + return this.getCommand({ + field: this._cloudDataPostField(), + where + }).then((res) => { + this.selected = res.result.data; + return res.result.data; + }); + }, + + // 回显 Cloud 数据 (树形) + getCloudDataTreeValue() { + return this.getCommand({ + field: this._cloudDataPostField(), + getTreePath: { + startWith: `${this.selfField}=='${this.dataValue}'` + } + }).then((res) => { + let treePath = []; + this._extractTreePath(res.result.data, treePath); + this.selected = treePath; + return treePath; + }); + }, + + getCommand(options = {}) { + /* eslint-disable no-undef */ + let db = uniCloud.database(this.spaceInfo) + + const action = options.action || this.action + if (action) { + db = db.action(action) + } + + const collection = options.collection || this.collection + db = db.collection(collection) + + const where = options.where || this.where + if (!(!where || !Object.keys(where).length)) { + db = db.where(where) + } + + const field = options.field || this.field + if (field) { + db = db.field(field) + } + + const orderby = options.orderby || this.orderby + if (orderby) { + db = db.orderBy(orderby) + } + + const current = options.pageCurrent !== undefined ? options.pageCurrent : this.page.current + const size = options.pageSize !== undefined ? options.pageSize : this.page.size + const getCount = options.getcount !== undefined ? options.getcount : this.getcount + const getTree = options.gettree !== undefined ? options.gettree : this.gettree + + const getOptions = { + getCount, + getTree + } + if (options.getTreePath) { + getOptions.getTreePath = options.getTreePath + } + + db = db.skip(size * (current - 1)).limit(size).get(getOptions) + + return db + }, + + _cloudDataPostField() { + let fields = [this.field]; + if (this.parentField) { + fields.push(`${this.parentField} as parent_value`); + } + return fields.join(','); + }, + + _cloudDataTreeWhere() { + let result = [] + let selected = this.selected + let parentField = this.parentField + if (parentField) { + result.push(`${parentField} == null || ${parentField} == ""`) + } + if (selected.length) { + for (var i = 0; i < selected.length - 1; i++) { + result.push(`${parentField} == '${selected[i].value}'`) + } + } + + let where = [] + if (this.where) { + where.push(`(${this.where})`) + } + + if (result.length) { + where.push(`(${result.join(' || ')})`) + } + + return where.join(' && ') + }, + + _cloudDataNodeWhere() { + let where = [] + let selected = this.selected; + if (selected.length) { + where.push(`${this.parentField} == '${selected[selected.length - 1].value}'`); + } + + where = where.join(' || '); + + if (this.where) { + return `(${this.where}) && (${where})` + } + + return where + }, + + _getWhereByForeignKey() { + let result = [] + let whereField = this._getForeignKeyByField(); + if (whereField) { + result.push(`${whereField} == '${this.dataValue}'`) + } + + if (this.where) { + return `(${this.where}) && (${result.join(' || ')})` + } + + return result.join(' || ') + }, + + _getForeignKeyByField() { + let fields = this.field.split(','); + let whereField = null; + for (let i = 0; i < fields.length; i++) { + const items = fields[i].split('as'); + if (items.length < 2) { + continue; + } + if (items[1].trim() === 'value') { + whereField = items[0].trim(); + break; + } + } + return whereField; + }, + + _updateBindData(node) { + const { + dataList, + hasNodes + } = this._filterData(this._treeData, this.selected) + + let isleaf = this._stepSearh === false && !hasNodes + + if (node) { + node.isleaf = isleaf + } + + this.dataList = dataList + this.selectedIndex = dataList.length - 1 + + if (!isleaf && this.selected.length < dataList.length) { + this.selected.push({ + value: null, + text: "请选择" + }) + } + + return { + isleaf, + hasNodes + } + }, + + _updateSelected() { + let dl = this.dataList + let sl = this.selected + let textField = this.map.text + let valueField = this.map.value + for (let i = 0; i < sl.length; i++) { + let value = sl[i].value + let dl2 = dl[i] + for (let j = 0; j < dl2.length; j++) { + let item2 = dl2[j] + if (item2[valueField] === value) { + sl[i].text = item2[textField] + break + } + } + } + }, + + _filterData(data, paths) { + let dataList = [] + let hasNodes = true + + dataList.push(data.filter((item) => { + return (item.parent_value === null || item.parent_value === undefined || item.parent_value === '') + })) + for (let i = 0; i < paths.length; i++) { + let value = paths[i].value + let nodes = data.filter((item) => { + return item.parent_value === value + }) + + if (nodes.length) { + dataList.push(nodes) + } else { + hasNodes = false + } + } + + return { + dataList, + hasNodes + } + }, + + _extractTree(nodes, result, parent_value) { + let list = result || [] + let valueField = this.map.value + for (let i = 0; i < nodes.length; i++) { + let node = nodes[i] + + let child = {} + for (let key in node) { + if (key !== 'children') { + child[key] = node[key] + } + } + if (parent_value !== null && parent_value !== undefined && parent_value !== '') { + child.parent_value = parent_value + } + result.push(child) + + let children = node.children + if (children) { + this._extractTree(children, result, node[valueField]) + } + } + }, + + _extractTreePath(nodes, result) { + let list = result || [] + for (let i = 0; i < nodes.length; i++) { + let node = nodes[i] + + let child = {} + for (let key in node) { + if (key !== 'children') { + child[key] = node[key] + } + } + result.push(child) + + let children = node.children + if (children) { + this._extractTreePath(children, result) + } + } + }, + + _findNodePath(key, nodes, path = []) { + let textField = this.map.text + let valueField = this.map.value + for (let i = 0; i < nodes.length; i++) { + let node = nodes[i] + let children = node.children + let text = node[textField] + let value = node[valueField] + + path.push({ + value, + text + }) + + if (value === key) { + return path + } + + if (children) { + const p = this._findNodePath(key, children, path) + if (p.length) { + return p + } + } + + path.pop() + } + return [] + } + } +} diff --git a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue new file mode 100644 index 0000000..6ebced9 --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue @@ -0,0 +1,323 @@ + + + + + diff --git a/uni_modules/uni-data-picker/package.json b/uni_modules/uni-data-picker/package.json new file mode 100644 index 0000000..038f9ce --- /dev/null +++ b/uni_modules/uni-data-picker/package.json @@ -0,0 +1,90 @@ +{ + "id": "uni-data-picker", + "displayName": "uni-data-picker 数据驱动的picker选择器", + "version": "1.1.2", + "description": "单列、多列级联选择器,常用于省市区城市选择、公司部门选择、多级分类等场景", + "keywords": [ + "uni-ui", + "uniui", + "picker", + "级联", + "省市区", + "" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": [ + "uni-load-more", + "uni-icons", + "uni-scss" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "u" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-data-picker/readme.md b/uni_modules/uni-data-picker/readme.md new file mode 100644 index 0000000..6cda224 --- /dev/null +++ b/uni_modules/uni-data-picker/readme.md @@ -0,0 +1,22 @@ +## DataPicker 级联选择 +> **组件名:uni-data-picker** +> 代码块: `uDataPicker` +> 关联组件:`uni-data-pickerview`、`uni-load-more`。 + + +`` 是一个选择类[datacom组件](https://uniapp.dcloud.net.cn/component/datacom)。 + +支持单列、和多列级联选择。列数没有限制,如果屏幕显示不全,顶部tab区域会左右滚动。 + +候选数据支持一次性加载完毕,也支持懒加载,比如示例图中,选择了“北京”后,动态加载北京的区县数据。 + +`` 组件尤其适用于地址选择、分类选择等选择类。 + +`` 支持本地数据、云端静态数据(json),uniCloud云数据库数据。 + +`` 可以通过JQL直连uniCloud云数据库,配套[DB Schema](https://uniapp.dcloud.net.cn/uniCloud/schema),可在schema2code中自动生成前端页面,还支持服务器端校验。 + +在uniCloud数据表中新建表“uni-id-address”和“opendb-city-china”,这2个表的schema自带foreignKey关联。在“uni-id-address”表的表结构页面使用schema2code生成前端页面,会自动生成地址管理的维护页面,自动从“opendb-city-china”表包含的中国所有省市区信息里选择地址。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-data-picker) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-load-more/changelog.md b/uni_modules/uni-load-more/changelog.md new file mode 100644 index 0000000..8f03f1d --- /dev/null +++ b/uni_modules/uni-load-more/changelog.md @@ -0,0 +1,19 @@ +## 1.3.3(2022-01-20) +- 新增 showText属性 ,是否显示文本 +## 1.3.2(2022-01-19) +- 修复 nvue 平台下不显示文本的bug +## 1.3.1(2022-01-19) +- 修复 微信小程序平台样式选择器报警告的问题 +## 1.3.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-load-more](https://uniapp.dcloud.io/component/uniui/uni-load-more) +## 1.2.1(2021-08-24) +- 新增 支持国际化 +## 1.2.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.8(2021-05-12) +- 新增 组件示例地址 +## 1.1.7(2021-03-30) +- 修复 uni-load-more 在首页使用时,h5 平台报 'uni is not defined' 的 bug +## 1.1.6(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json new file mode 100644 index 0000000..a4f14a5 --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json @@ -0,0 +1,5 @@ +{ + "uni-load-more.contentdown": "Pull up to show more", + "uni-load-more.contentrefresh": "loading...", + "uni-load-more.contentnomore": "No more data" +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js b/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json new file mode 100644 index 0000000..f15d510 --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json @@ -0,0 +1,5 @@ +{ + "uni-load-more.contentdown": "上拉显示更多", + "uni-load-more.contentrefresh": "正在加载...", + "uni-load-more.contentnomore": "没有更多数据了" +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json new file mode 100644 index 0000000..a255c6d --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json @@ -0,0 +1,5 @@ +{ + "uni-load-more.contentdown": "上拉顯示更多", + "uni-load-more.contentrefresh": "正在加載...", + "uni-load-more.contentnomore": "沒有更多數據了" +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue b/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue new file mode 100644 index 0000000..e5eff4d --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue @@ -0,0 +1,399 @@ + + + + + diff --git a/uni_modules/uni-load-more/package.json b/uni_modules/uni-load-more/package.json new file mode 100644 index 0000000..2fa6f04 --- /dev/null +++ b/uni_modules/uni-load-more/package.json @@ -0,0 +1,86 @@ +{ + "id": "uni-load-more", + "displayName": "uni-load-more 加载更多", + "version": "1.3.3", + "description": "LoadMore 组件,常用在列表里面,做滚动加载使用。", + "keywords": [ + "uni-ui", + "uniui", + "加载更多", + "load-more" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-load-more/readme.md b/uni_modules/uni-load-more/readme.md new file mode 100644 index 0000000..54dc1fa --- /dev/null +++ b/uni_modules/uni-load-more/readme.md @@ -0,0 +1,14 @@ + + +### LoadMore 加载更多 +> **组件名:uni-load-more** +> 代码块: `uLoadMore` + + +用于列表中,做滚动加载使用,展示 loading 的各种状态。 + + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-load-more) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/websoft/api/order.js b/websoft/api/order.js index 8d9e701..f8ba473 100644 --- a/websoft/api/order.js +++ b/websoft/api/order.js @@ -8,6 +8,9 @@ export const listOrder = (params) => http.get('/shop/order', {params}) // 查询订单 export const getOrder = (orderId) => http.get('/shop/order/' + orderId) +export const getOrderPay = (id) => http.get('/shop/order-pay/' + id) +export const getOrderPayByOrderId = (orderId) => http.get('/shop/order-pay/getByOrderId/' + orderId) +export const getOrderPayList = (params) => http.get('/shop/order-pay/', {params}) // 添加订单 export const addOrder = (data) => http.post('/shop/order', data) @@ -20,6 +23,9 @@ export const removeOrder = (id) => http.get('/open/order/remove/' + id) export const setPayStatus = (data) => http.post('/shop/order/setPayStatus', data) +export const freeze = (data) => http.get('/shop/order/freeze', {}) +export const checkFreeze = (orderId) => http.post('/shop/freeze-order/checkFreeze/' + orderId, {}) + export default { pageOrder, listOrder, @@ -27,5 +33,10 @@ export default { addOrder, receiptOrder, removeOrder, - setPayStatus + setPayStatus, + freeze, + checkFreeze, + getOrderPay, + getOrderPayByOrderId, + getOrderPayList }