From bfe0c09242b505e1148ceb8e4d4e9d50594557e1 Mon Sep 17 00:00:00 2001 From: chenghuan Date: Mon, 24 Nov 2025 17:15:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=EF=BC=9A=E8=AF=BE=E7=A8=8B?= =?UTF-8?q?=E7=A1=AE=E8=AE=A4=E8=AE=A2=E5=8D=95=E5=92=8C=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=8A=9F=E8=83=BD=E5=88=9D=E6=AD=A5=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/modules/order.ts | 97 +- api/modules/user.ts | 4 +- components/order/GoodsSelector.vue | 2 +- components/order/Payment.vue | 0 components/order/Price.vue | 229 +++++ locale/en.json | 62 +- locale/zh-Hans.json | 62 +- pages.json | 4 +- pages/course/details/course.vue | 15 +- pages/order/confirmOrder.vue | 1419 ++++++++++++++++++++++++++++ static/icon/jifen.png | Bin 0 -> 6382 bytes static/icon/pay_3.png | Bin 0 -> 11219 bytes style/tailwind.css | 31 + style/ui.scss | 10 +- types/order.d.ts | 148 ++- utils/index.ts | 2 +- 16 files changed, 2022 insertions(+), 63 deletions(-) create mode 100644 components/order/Payment.vue create mode 100644 components/order/Price.vue create mode 100644 static/icon/jifen.png create mode 100644 static/icon/pay_3.png diff --git a/api/modules/order.ts b/api/modules/order.ts index 3fd6fe8..2b66a02 100644 --- a/api/modules/order.ts +++ b/api/modules/order.ts @@ -4,7 +4,11 @@ import type { IApiResponse } from '@/api/types' import type { ICreateOrderParams, IGooglePayVerifyParams, - ICreateOrderResponse + ICreateOrderResponse, + IOrderGoods, + ICoupon, + ICourseOrderCreateParams, + IOrderInitData } from '@/types/order' import type { IUserInfo } from '@/types/user' @@ -59,5 +63,96 @@ export const orderApi = { method: 'POST' }) return res + }, + + /** + * 初始化订单准备数据 + * @param params 初始化参数 + */ + async initPrepareOrder(params: { uid: number; productList: Array<{ productId: number; quantity: number }> }) { + const res = await mainClient.request>({ + url: 'common/buyOrder/initPrepareOrder', + method: 'POST', + data: params + }) + return res + }, + + /** + * 根据商品ID获取商品详情列表 + * @param productIds 商品ID字符串(逗号分隔) + */ + async getShopProductListByIds(productIds: string) { + const res = await mainClient.request>({ + url: 'book/buyOrder/getShopProductListByIds', + method: 'POST', + data: { productIds } + }) + return res + }, + + /** + * 获取VIP优惠金额 + * @param productList 商品列表 + */ + async getVipDiscountAmount(productList: Array<{ productId: number; quantity: number }>) { + const res = await mainClient.request>({ + url: 'book/buyOrder/getVipDiscountAmount', + method: 'POST', + data: { productList } + }) + return res + }, + + /** + * 获取地区优惠金额 + * @param productList 商品列表 + */ + async getDistrictAmount(productList: Array<{ productId: number; quantity: number }>) { + const res = await mainClient.request>({ + url: 'book/buyOrder/getDistrictAmount', + method: 'POST', + data: { productList } + }) + return res + }, + + /** + * 获取可用优惠券列表 + * @param shopProductInfos 商品信息字符串(格式:productId:price:quantity,productId:price:quantity) + */ + async getCouponListPayment(shopProductInfos: string) { + const res = await mainClient.request>({ + url: 'common/coupon/getCouponListPayment', + method: 'POST', + data: { shopProductInfos } + }) + return res + }, + + /** + * 更新购物车商品 + * @param data 商品数据 + */ + async updateCart(data: { productId: number; productAmount: number; price: number }) { + const res = await mainClient.request({ + url: 'book/ordercart/update', + method: 'POST', + data + }) + return res + }, + + /** + * 创建课程订单 + * @param data 订单数据 + */ + async placeCourseOrder(data: ICourseOrderCreateParams) { + const res = await mainClient.request>({ + url: 'book/buyOrder/placeOrder', + method: 'POST', + data + }) + return res } } diff --git a/api/modules/user.ts b/api/modules/user.ts index 0b1fbd8..bfb928d 100644 --- a/api/modules/user.ts +++ b/api/modules/user.ts @@ -39,11 +39,11 @@ export async function getVipInfo() { * @param current 当前页码 * @param limit 每页数量 */ -export async function getOrderList(current: number, limit: number, orderStatus: string) { +export async function getOrderList(page: number, limit: number, orderStatus: string) { const res = await mainClient.request }>>({ url: 'common/buyOrder/commonBuyOrderList', method: 'POST', - data: { current, limit, orderStatus, come: '10', userId: uni.getStorageSync('userInfo').id } + data: { page, limit, orderStatus, come: '10', userId: uni.getStorageSync('userInfo').id } }) return res } diff --git a/components/order/GoodsSelector.vue b/components/order/GoodsSelector.vue index 0f3a675..92c0c72 100644 --- a/components/order/GoodsSelector.vue +++ b/components/order/GoodsSelector.vue @@ -31,7 +31,7 @@ {{ parseFloat(item.vipPrice).toFixed(2) }} 天医币 - VIP到手价 + VIP优惠价 {{ parseFloat(item.price).toFixed(2) }} 天医币 diff --git a/components/order/Payment.vue b/components/order/Payment.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/order/Price.vue b/components/order/Price.vue new file mode 100644 index 0000000..44f183b --- /dev/null +++ b/components/order/Price.vue @@ -0,0 +1,229 @@ + + + + + \ No newline at end of file diff --git a/locale/en.json b/locale/en.json index cd62f5d..5e6ce41 100644 --- a/locale/en.json +++ b/locale/en.json @@ -412,6 +412,66 @@ }, "order": { "selectFuduScheme": "Select Fudu Scheme", - "selectPurchaseScheme": "Select Purchase Scheme" + "selectPurchaseScheme": "Select Purchase Scheme", + "confirmTitle": "Confirm Order", + "goodsInfo": "Product Information", + "priceDetail": "Price Details", + "totalPrice": "Subtotal", + "coupon": "Coupon", + "points": "Points", + "vipDiscount": "VIP Exclusive Discount", + "activityDiscount": "Activity Discount", + "districtDiscount": "Regional Discount", + "actualPayment": "Total", + "paymentMethod": "Payment Method", + "virtualCoin": "Virtual Coin", + "balance": "Balance", + "recharge": "Recharge Now", + "remark": "Order Remark", + "remarkPlaceholder": "Optional: Leave a message", + "remarkTitle": "Order Remark", + "submit": "Pay Now", + "submitting": "Submitting...", + "total": "Total", + "noCoupon": "No coupons available", + "unavailable": "Unavailable", + "selectCoupon": "Please select a coupon", + "notUseCoupon": "Don't use coupon", + "reselect": "Reselect", + "selected": "Confirm", + "maxPoints": "Available Points ({max} pts)", + "pointsPlaceholder": "Enter points", + "allPoints": "Total Points", + "insufficientBalance": "Insufficient virtual coin balance", + "orderCreating": "Creating order", + "orderSuccess": "Purchase successful", + "orderFailed": "Failed, please try again", + "tooFrequent": "Too frequent, please wait", + "duplicateOrder": "You have a similar order recently. Continue?", + "duplicateConfirm": "Continue", + "duplicateCancel": "Cancel", + "customerService": "Customer Service", + "paymentTip": "1 Virtual Coin = 1 CNY", + "paymentTipTitle": "Notes", + "paymentTip1": "1. 1 Virtual Coin = 1 CNY", + "paymentTip2": "2. For questions, please call customer service", + "paymentTip3": "3. Non-mainland China users can pay by credit card. Simple and fast, recommended! Credit cards with Visa or MasterCard logos are accepted. Please send payment request to email", + "paymentTip3_1": "(click to copy) with course name, amount, registered name and phone number, or add WeChat customer service (", + "paymentTip3_2": ") (click to copy). We will send payment link within 24 hours.", + "ensureBalance": "Ensure sufficient virtual coin balance", + "vipLabel": "VIP Discount", + "activityLabel": "Activity Price", + "vipPriceLabel": "VIP Price", + "quantity": "Quantity", + "couponAmount": "¥", + "couponUseLevel": "Min. {level} CNY", + "couponExpiry": "Valid until", + "couponForever": "Permanent", + "couponReason": "Reason", + "couponUsage": "Usage", + "couponType0": "All Products", + "couponType1": "Specific Courses", + "couponType2": "Course Categories", + "couponCount": "{count} coupons" } } diff --git a/locale/zh-Hans.json b/locale/zh-Hans.json index cd690a3..20a81de 100644 --- a/locale/zh-Hans.json +++ b/locale/zh-Hans.json @@ -413,6 +413,66 @@ }, "order": { "selectFuduScheme": "选择复读方案", - "selectPurchaseScheme": "选择购买方案" + "selectPurchaseScheme": "选择购买方案", + "confirmTitle": "确认订单", + "goodsInfo": "商品信息", + "priceDetail": "价格明细", + "totalPrice": "商品总价", + "coupon": "优惠券", + "points": "积分", + "vipDiscount": "VIP专享立减", + "activityDiscount": "活动立减", + "districtDiscount": "地区优惠", + "actualPayment": "实付款", + "paymentMethod": "支付方式", + "virtualCoin": "天医币", + "balance": "余额", + "recharge": "立即充值", + "remark": "订单备注", + "remarkPlaceholder": "选填:给商家留言", + "remarkTitle": "订单备注", + "submit": "立即支付", + "submitting": "提交中...", + "total": "合计", + "noCoupon": "暂无可用优惠券", + "unavailable": "不可用", + "selectCoupon": "请选择优惠券", + "notUseCoupon": "不使用优惠券", + "reselect": "重新选择", + "selected": "选好了", + "maxPoints": "可用积分({max}分)", + "pointsPlaceholder": "请输入积分", + "allPoints": "全部积分", + "insufficientBalance": "天医币余额不足", + "orderCreating": "正在请求订单", + "orderSuccess": "购买成功", + "orderFailed": "失败,请重新下单", + "tooFrequent": "操作太频繁了,休息下吧", + "duplicateOrder": "您短时间内有一笔相同金额的订单,是否确定继续下单?", + "duplicateConfirm": "继续操作", + "duplicateCancel": "点错了", + "customerService": "客服", + "paymentTip": "1天医币 = 1元人民币", + "paymentTipTitle": "说明", + "paymentTip1": "1. 1天医币 = 1元人民币", + "paymentTip2": "2.若有疑问或意见请致电客服", + "paymentTip3": "3.非中国大陆用户可以信用卡支付。简单快捷,推荐使用!支付时使用的信用卡需要带有Visa或MasterCard的标识。请向邮箱", + "paymentTip3_1": "(点击复制)发送支付请求,内容需包含:拟购买的课程名称、支付金额、APP注册姓名及手机号码,或者加一路健康客服微信(", + "paymentTip3_2": ")(点击复制)联系我们,我们将在24小时内向您的邮箱或者微信发送支付链接,根据提示即可完成信用卡支付,无需兑换外币。", + "ensureBalance": "确保您的天医币足够支付", + "vipLabel": "VIP优惠", + "activityLabel": "活动价", + "vipPriceLabel": "VIP到手价", + "quantity": "数量", + "couponAmount": "¥", + "couponUseLevel": "满{level}元可用", + "couponExpiry": "有效期至", + "couponForever": "永久有效", + "couponReason": "不可用原因", + "couponUsage": "使用说明", + "couponType0": "全场通用", + "couponType1": "指定课程可用", + "couponType2": "指定课程品类可用", + "couponCount": "共 {count} 张" } } diff --git a/pages.json b/pages.json index 98b8be9..a563e23 100644 --- a/pages.json +++ b/pages.json @@ -152,10 +152,10 @@ "navigationBarTitleText": "%courseDetails.chapter%" } }, { - "path": "pages/course/order", + "path": "pages/order/confirmOrder", "style": { "navigationStyle": "custom", - "navigationBarTitleText": "%courseOrder.orderTitle%" + "navigationBarTitleText": "%order.confirmTitle%" } } ], diff --git a/pages/course/details/course.vue b/pages/course/details/course.vue index 6b7f211..daff58a 100644 --- a/pages/course/details/course.vue +++ b/pages/course/details/course.vue @@ -449,8 +449,6 @@ const closeGoodsSelector = () => { */ const confirmPurchase = () => { showProtocol.value = false - uni.showToast({ icon: 'none', title: '订单及支付功能开发中' }) - return false if (!selectedGoods.value) return showProtocol.value = false @@ -458,15 +456,16 @@ const confirmPurchase = () => { // 跳转到确认订单页 const orderData = { goods: [{ ...selectedGoods.value, productAmount: 1 }], - typeId: 0, - navTitle: courseDetail.value?.title, - title: courseDetail.value?.title, - isFudu: isFudu.value, - fuduId: isFudu.value ? fuduCatalogueId.value : undefined + // typeId: 0, + // navTitle: courseDetail.value?.title, + // title: courseDetail.value?.title, + // isFudu: isFudu.value, + // fuduId: isFudu.value ? fuduCatalogueId.value : undefined } uni.navigateTo({ - url: `/pages/course/order?data=${encodeURIComponent(JSON.stringify(orderData))}` + // url: `/pages/order/confirmOrder?data=${encodeURIComponent(JSON.stringify(orderData))}` + url: `/pages/order/confirmOrder?goods=${selectedGoods.value.productId}` }) } diff --git a/pages/order/confirmOrder.vue b/pages/order/confirmOrder.vue index e69de29..056eb52 100644 --- a/pages/order/confirmOrder.vue +++ b/pages/order/confirmOrder.vue @@ -0,0 +1,1419 @@ + + + + + diff --git a/static/icon/jifen.png b/static/icon/jifen.png new file mode 100644 index 0000000000000000000000000000000000000000..5319e4de942ad1f7eb91f695e4424e5f0669ad06 GIT binary patch literal 6382 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 CTigQx literal 0 HcmV?d00001 diff --git a/style/tailwind.css b/style/tailwind.css index 057e99a..243f738 100644 --- a/style/tailwind.css +++ b/style/tailwind.css @@ -10,6 +10,7 @@ --color-red-500: oklch(63.7% 0.237 25.331); --color-white: #fff; --spacing: 0.25rem; + --font-weight-bold: 700; --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1); --default-transition-duration: 150ms; --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); @@ -293,15 +294,40 @@ .bg-red-500 { background-color: var(--color-red-500); } + .p-0 { + padding: calc(var(--spacing) * 0); + } + .p-0\! { + padding: calc(var(--spacing) * 0) !important; + } .pt-\[40px\] { padding-top: 40px; } + .pb-0 { + padding-bottom: calc(var(--spacing) * 0); + } + .pb-0\! { + padding-bottom: calc(var(--spacing) * 0) !important; + } .text-center { text-align: center; } + .text-right { + text-align: right; + } + .font-bold { + --tw-font-weight: var(--font-weight-bold); + font-weight: var(--font-weight-bold); + } .text-\[\#000\] { color: #000; } + .text-\[\#7dc1f0\] { + color: #7dc1f0; + } + .text-\[\#f94f04\] { + color: #f94f04; + } .text-\[\#fff\] { color: #fff; } @@ -393,6 +419,10 @@ inherits: false; initial-value: solid; } +@property --tw-font-weight { + syntax: "*"; + inherits: false; +} @property --tw-ordinal { syntax: "*"; inherits: false; @@ -585,6 +615,7 @@ --tw-skew-x: initial; --tw-skew-y: initial; --tw-border-style: solid; + --tw-font-weight: initial; --tw-ordinal: initial; --tw-slashed-zero: initial; --tw-numeric-figure: initial; diff --git a/style/ui.scss b/style/ui.scss index 6c8f50f..8975596 100644 --- a/style/ui.scss +++ b/style/ui.scss @@ -1,10 +1,10 @@ :root, page { /* 文字字号 */ - --wot-fs-title: 18px; // 标题字号/重要正文字号 - --wot-fs-content: 16px; // 普通正文 - --wot-fs-secondary: 14px; // 次要信息,注释/补充/正文 - --wot-fs-tertiary: 12px; // 次次要信息,注释/补充/正文 + --wot-fs-title: 36rpx; // 标题字号/重要正文字号 + --wot-fs-content: 28rpx; // 普通正文 + --wot-fs-secondary: 24rpx; // 次要信息,注释/补充/正文 + --wot-fs-tertiary: 20rpx; // 次次要信息,注释/补充/正文 // 导航栏 --wot-navbar-background: #fff; @@ -16,7 +16,7 @@ page { // --wot-tabbar-item-title-font-size: 16px; // cell - --wot-cell-title-fs: 16px; + --wot-cell-title-fs: 28rpx; // dropdown // --wot-drop-menu-selected-color: #5355C8; diff --git a/types/order.d.ts b/types/order.d.ts index 764c247..9dfe4b3 100644 --- a/types/order.d.ts +++ b/types/order.d.ts @@ -26,61 +26,127 @@ export interface IOrder { } /** - * 订单创建参数接口 + * 课程订单商品信息 */ -export interface ICreateOrderParams { - paymentMethod: '4' | '5' // 支付方式: 4-虚拟币, 5-Google Pay - orderMoney: number | string // 订单金额 - abroadBookId: number // 图书ID - orderType: 'abroadBook' // 订单类型 +export interface IOrderGoods { + productId: number + productName: string + productImages: string + price: number + vipPrice: number | null + activityPrice: number | null + isVipPrice: number // 是否有VIP优惠 0-否 1-是 + productAmount: number // 购买数量 + goodsType: string // 商品类型 "05" for course } /** - * Google Pay 验证参数接口 + * 优惠券实体信息 */ -export interface IGooglePayVerifyParams { - purchaseToken: string // 购买凭证 - orderSn: string // 订单号 - productId: string // 产品ID +export interface ICouponEntity { + id: number + couponName: string + couponAmount: number + useLevel: number // 满多少可用 + couponRange: number // 0-全场 1-指定课程 2-指定品类 + remark?: string } /** - * 订单创建响应接口 + * 优惠券信息 */ -export interface ICreateOrderResponse { - code: number - orderSn: string // 订单号 - msg?: string +export interface ICoupon { + id: number + couponId: number + canUse: number // 0-不可用 1-可用 + canUseReason?: string + effectType: number // 0-永久有效 + endTime?: string + couponEntity: ICouponEntity } /** - * Google Pay SKU 信息接口 + * 课程订单创建参数 */ -export interface IGooglePaySku { - productId: string - type: string - price: string - price_amount_micros: number - price_currency_code: string - title: string - description: string -} - -/** - * Google Pay 支付结果接口 - */ -export interface IGooglePayResult { - code: number - data?: Array<{ - original: { - purchaseToken: string - orderId: string - packageName: string - productId: string - purchaseTime: number - purchaseState: number - } +export interface ICourseOrderCreateParams { + buyType: number // 0-商品页直接下单 1-购物车结算 + userId: number + paymentMethod: number // 4-天医币 + orderMoney: number // 订单金额 + realMoney: number // 实收金额 + jfDeduction: number // 积分抵扣 + couponId?: number // 优惠券ID + couponName?: string // 优惠券名称 + vipDiscountAmount: number // VIP折扣金额 + districtMoney: number // 地区优惠金额 + remark?: string // 备注 + productList: Array<{ + productId: number + quantity: number }> + orderType: string // "order" + addressId: number // 0 for course products + appName: string // "wumen" + come: number // 2 +} + +/** + * 订单初始化数据 + */ +export interface IOrderInitData { + user: { + id: number + jf: number // 积分 + peanutCoin: number // 天医币余额 + vip?: number // VIP状态 + } + is_course: boolean +} + +/** + * 订单路由参数 + */ +export interface IOrderRouteParams { + goods: IOrderGoods[] + typeId: number + sourceType?: string + navTitle?: string + title?: string +} + +/** + * 价格明细项 + */ +export interface IPriceBreakdownItem { + type: number // 1-商品总价 2-运费 3-优惠券 4-积分 5-活动立减 6-VIP立减 + text: string + imgUrl?: string + icon?: string +} + +/** + * 订单状态 + */ +export interface IOrderState { + orderData: IOrderRouteParams + goodsList: IOrderGoods[] + initData: IOrderInitData | null + totalPrice: number + vipPrice: number + districtAmount: number + actualPayment: number + jfNumber: number + jfNumberMax: number + jfNumberShow: string + couponList: ICoupon[] + selectedCoupon: ICoupon | null + showCouponPopup: boolean + remark: string + showRemarkPopup: boolean + payType: number + loading: boolean + submitting: boolean + buyingFlag: boolean } /** diff --git a/utils/index.ts b/utils/index.ts index dbb5a0f..7490f19 100644 --- a/utils/index.ts +++ b/utils/index.ts @@ -18,7 +18,7 @@ export const onPageBack = () => { /** * 拨打电话 */ -export const makePhoneCall = (phoneNumber: string, title: string) => { +export const makePhoneCall = (phoneNumber: string, title: string = '') => { uni.showModal({ title: title, content: phoneNumber,