Install
openclaw skills install @urselect/miniprogram-mall-ushopun-skill基于 Ushopun(优社云AI)官方 miniProgramV2 真实项目构建的微信小程序商城前端,覆盖首页、分类、商品详情、购物车、结算、订单、个人中心等 50+ 页面与完整交易链路。内置 dev.ushopun.com OpenAPI(接口前缀 /api/v2,返回体 code/content/data,guid/token/shopId 鉴权)完整接口对接规范与每个方法的调用示例。当用户需要开发对接 Ushopun 后端(优社云)的微信小程序商城时调用此 Skill。后端接口文档参考同目录 openapi.json(#File ./openapi.json,servers 为 {tenant}.ushopun.com 泛域名模板,开发填 dev,正式替换租户子域名)。
openclaw skills install @urselect/miniprogram-mall-ushopun-skill本 Skill 定位:微信小程序商城前端开发工具,基于 Ushopun 官方
miniProgramV2真实项目提炼,聚焦「首页 → 分类 → 详情 → 购物车 → 结算 → 订单 → 个人中心」完整交易闭环,并原生对接 Ushopun 后端 OpenAPI。后端数据源:
dev.ushopun.com(优社云 OpenAPI,openapi.json为接口权威文档)。接口前缀统一为/api/v2,返回体统一为{ code, content, data, success },鉴权通过请求头guid(用户 GUID)+authorization(JWT Token)+shopId(店铺/自提点)完成。示例站点:正式对接前,请先在
https://dev.ushopun.com示例站点 / 后台开通对应模块并确认接口可达(域名、鉴权、模块开关)。本 Skill 不负责引导付款,付款与账号开通请直接联系优社云AI官方。连接器 ApiToken(Agent 前置授权):本 Skill 被 workbuddy / trae 等 AI Agent 使用时,Agent 需先引导用户到
ushopun.com登录账号 → 在后台/控制台创建连接器并复制「连接器 ApiToken」→ 提供给 Agent,用于读取接口文档、验证字段或联调。该凭证为租户级敏感凭证,禁止写死进生成的小程序源码,仅通过配置占位符/环境变量承载。
api/api.js + api/conf.js)guid(用户标识)+ authorization(JWT Token)+ shopId(店铺/自提点)rpx(750rpx = 屏幕宽度),图标用 iconfontfull 字段 HTML 渲染)#950000(Ushopun 品牌深红),导航栏白字标题「Ushopun商城」miniProgramV2/
├── api/
│ ├── conf.js # 所有 API 端点常量(统一管理,禁止硬编码 URL)
│ └── api.js # HTTP 请求封装(自动注入 guid/token/shopId)
├── pages/ # 业务页面(每页 .js/.wxml/.wxss/.json 四件套)
│ ├── index/ # 首页(轮播、分类入口、热卖推荐、优惠券弹窗)
│ ├── category/ # 一级分类 + 二级分类
│ ├── subcategory/ # 分类商品列表(触底加载)
│ ├── detail/ # 商品详情(SKU 联动、收藏、加购、立即购买)
│ ├── search/ # 搜索
│ ├── cart/ # 购物车(全选/单选、数量加减、结算)
│ ├── checkout/ # 结算/提交订单(地址、优惠券、支付方式)
│ ├── checkoutdetail/ # 订单详情
│ ├── order/ # 订单(分状态)
│ ├── orderList/ # 订单列表(Tab 切换)
│ ├── payFinish/ # 支付成功
│ ├── my/ # 个人中心
│ ├── login/ # 账号密码登录
│ ├── souquan/ # 微信授权登录引导
│ ├── address/ # 地址管理
│ ├── address-edit/ # 地址编辑
│ ├── collect/ # 收藏夹
│ ├── comment/ # 商品评价
│ ├── commentDetail/ # 评价详情
│ ├── mycomment/ # 我的评价
│ ├── available_coupon/ # 可用优惠券
│ ├── youhuijuan/ # 优惠券中心
│ ├── usedcunpond/ # 优惠券(已使用)
│ ├── point/ # 积分
│ ├── recharge/ # 充值
│ ├── rechargeList/ # 充值记录
│ ├── cashout/ # 提现
│ ├── distribution/ # 分销中心
│ ├── dividend/ # 分红明细
│ ├── bonusDetail/ # 奖金明细
│ ├── myCustomer/ # 我的客户
│ ├── myinvitre/ # 我的邀请
│ ├── partner/ # 合伙人
│ ├── saleOrder/ # 销售订单
│ ├── salePage/ # 销售页
│ ├── returnrequests/ # 退换货申请
│ ├── returndetail/ # 退货详情
│ ├── wuliuxinxi/ # 物流信息
│ ├── platform/ # 平台页
│ ├── supplier/ # 供应商
│ ├── options/ # 分店/自提点选择
│ ├── sharepage/ # 分享推广页
│ ├── question/ # 常见问题
│ ├── questionList/ # 问题列表
│ ├── welcome/ # 欢迎页
│ ├── warrant/ # 授权/售后
│ ├── idcar/ # 身份证
│ ├── pwdset/ # 密码设置
│ └── logs/ # 日志/调试
├── templates/ # 可复用 WXML 模板(swiper/product-view/order-state/my-view 等)
├── style/ # 公共样式(color/template/iconfont/weui/empower)
├── utils/util.js # 工具函数
├── libs/ # 第三方库(qqmap-wx-jssdk.min.js)
├── wxParse/ # 富文本解析
├── data/ # 静态数据(省市区等)
├── images/ # 图片资源
├── app.js # 应用入口(globalData + onLaunch)
├── app.json # 应用配置(页面路由、TabBar、窗口样式)
└── app.wxss # 全局样式入口
// app.js globalData
globalData: {
host: 'https://dev.ushopun.com/api', // 后端 API 基础地址(已含 /api,生产可替换租户域名)
// 本地调试:http://localhost:5136/api
token: '', // 登录后写入的 JWT Token
guid: '', // 登录后写入的用户 GUID
customer: null // 当前用户信息
}
conf.js中的端点以/v2/...开头,api.js通过host + url拼接出完整地址https://dev.ushopun.com/api/v2/...。
{ "code": 200, "content": "请求成功!", "data": { }, "success": true }
| code | 含义 | 前端处理 |
|---|---|---|
| 200 | 成功,业务数据在 data | 取 data 渲染 |
| 250 | 业务警告,content 为提示语 | wx.showToast({ title: content, icon: 'none' }) |
| 301 | 跳转新地址,content 为 URL | wx.redirectTo / wx.navigateTo |
| 400 | 错误请求 | 提示 content |
| 401 | 未授权/未登录 | 清 token 跳登录页 |
| 403 | 模块未开启(module not open) | 提示「功能未开启」 |
| 404 | 找不到(not found) | 提示「数据不存在」 |
| 220 | 升级/需审核(is's update) | 引导用户申请升级(如代理升级) |
| 350 | 未批准(disapproved) | 提示「审核未通过」 |
特殊:
/account/checkaccount接口code为1(可用)/0(已存在),非标准码,需单独处理。
| Header | 说明 | 来源 |
|---|---|---|
guid | 用户 GUID | 登录后由 JWT 解析,或注册/登录接口返回 |
authorization | JWT Token | /account/login 或 /weixinopen/login 返回的 token |
shopId | 店铺/自提点 ID | 用户选择门店后本地缓存(adress.id) |
鉴权标记(对应后端控制器标注):
| 标记 | 含义 |
|---|---|
[ApiAuthorize] | 必须登录(header authorization 为有效 JWT),失败返回 { code: 401 } |
[ApiAuthorize(false)] | 匿名可访问,但会尝试解析 JWT 注入 guid |
| 无标记 | 公开接口,无需登录 |
// api/api.js
const app = getApp()
const request = (url, options) => {
return new Promise((resolve, reject) => {
const fullUrl = `${app.globalData.host}${url}` // host 已含 /api,url 以 /v2 开头
let shopId = 0
if (wx.getStorageSync('adress')) {
shopId = wx.getStorageSync('adress').id
}
wx.request({
url: fullUrl,
method: options.method,
data: options.method === 'GET' ? options.data : JSON.stringify(options.data),
header: {
'Content-Type': 'application/json; charset=UTF-8',
guid: wx.getStorageSync('guid') || '',
authorization: wx.getStorageSync('token') || '',
shopId
},
success(request) {
const res = request.data || {}
if (res.code === 200) {
resolve(res) // 成功,调用方取 res.data
} else if (res.code === 401) {
wx.removeStorageSync('token')
wx.removeStorageSync('guid')
wx.navigateTo({ url: '/pages/login/login' })
reject(res)
} else {
reject(res) // 250 业务警告 / 404 等,调用方用 content 提示
}
},
fail(error) {
wx.showToast({ title: '网络异常,请稍后重试', icon: 'none' })
reject(error)
}
})
})
}
const get = (url, options = {}) => request(url, { method: 'GET', data: options })
const post = (url, options) => request(url, { method: 'POST', data: options })
const put = (url, options) => request(url, { method: 'PUT', data: options })
const remove = (url, options) => request(url, { method: 'DELETE', data: options })
module.exports = { get, post, put, remove }
import api from '../../api/api'
import { productId, orderList } from '../../api/conf'
Page({
data: { model: {}, list: [] },
onLoad(options) {
// GET 调用
api.get(productId, { id: options.id })
.then(res => this.setData({ model: res.data }))
.catch(err => wx.showToast({ title: err.content || '加载失败', icon: 'none' }))
// POST 调用
api.post(orderList, { orderstatus: 0, page: 1 })
.then(res => this.setData({ list: res.data.items }))
.catch(err => wx.showToast({ title: err.content || '加载失败', icon: 'none' }))
}
})
下表均来自
openapi.json(dev.ushopun.com真实后端 V2),路径前缀统一/api/v2。「鉴权」列:✔= 必须登录([ApiAuthorize]),○= 匿名可访问([ApiAuthorize(false)]),-= 公开。所有接口统一用api.get(conf.xxx, params)/api.post(conf.xxx, data)调用。
| 端点常量 | HTTP | 子路由 | 参数 | 返回 | 鉴权 |
|---|---|---|---|---|---|
login | POST | /login | model: MoLogin(name, password) | { guid, token, nickname } | - |
online | GET | /online | guid | 1 已注册 / 0 未注册 | ○ |
logout | GET | /logout | - | - | - |
register | POST | /register | model: MoRegister(phone, password, token, inviteCode) | - | - |
sendsmsforregister | POST | /sendsmsforregister | phone | - | - |
chanagepwd | POST | /chanagepwd | model: MoChangePassword | - | ○ |
sendsmsforfindpwd | POST | /sendsmsforfindpwd | phone | - | - |
pwdset | POST | /pwdset | model: MoPasswordRecovery | - | - |
checkaccount | GET | /checkaccount | account | code=1 可用 / 0 不可用 | - |
调用示例:
// 账号密码登录
api.post(login, { name: '13800138000', password: '123456' })
.then(res => {
// res.data = { guid, token, nickname }
wx.setStorageSync('guid', res.data.guid)
wx.setStorageSync('token', res.data.token)
})
// 注册(先发验证码)
api.post(sendsmsforregister, { phone: '13800138000' })
api.post(register, { phone: '13800138000', password: '123456', token: '短信码', inviteCode: '邀请码' })
| 端点常量 | HTTP | 子路由 | 参数 | 返回 | 鉴权 |
|---|---|---|---|---|---|
weixinminilogin | GET | /login | code, state, encryptedData="", iv="" | TokenEntity { guid, token, openId } | - |
weixinminiphone | GET | /phonenumber | code, encryptedData, iv | { phone } | - |
weixininfosubmit | POST | /customer_nextstep | model: MoNextStep | TokenEntity | - |
微信登录流程:
// 1. wx.login 获取 code → 微信授权登录
api.get(weixinminilogin, { code, state, encryptedData, iv })
.then(res => {
wx.setStorageSync('guid', res.data.guid)
wx.setStorageSync('token', res.data.token)
wx.setStorageSync('openId', res.data.openId)
})
// 2. 绑定手机号(open-type="getPhoneNumber")
api.get(weixinminiphone, { code, encryptedData, iv })
.then(res => wx.setStorageSync('phone', res.data.phone))
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
getcustomer | GET | /get | - | MoInfo |
customerinfo | GET | /info | - | MoCustomerInfo |
customersubmit | POST | /submit | model: MoCustomerRequest | - |
customerpoints | GET | /points | page=1, size=12 | MoPoints |
uploadavatar | POST | /uploadavatar | uploadAvatar | MoAvatar |
checkshop | POST | /checkshop | Id | - |
myinvitecode | GET | /myinvitecode | - | MoInviteCode |
myinvitees | GET | /myinvitees | page=1, size=12 | MoInvitees |
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
addressList | GET | /list | - | List<MoAddress> |
addressdelete | POST | /delete | addressId | - |
addressadd | POST | /add | model: MoAddressEdit | - |
addressdefault | POST | /default | addressId | - |
addressedit | POST | /edit | addressId, model: MoAddressEdit | - |
| 端点常量 | HTTP | 子路由 | 参数 | 返回 | 鉴权 |
|---|---|---|---|---|---|
featuredbycid | GET | /featuredbycid | cid, count, picsize?, specshow/tagshow/fullshow | List<MoProductOverview> | - |
homePro | GET | /homeproducts | picsize?, specshow/tagshow/fullshow | List<MoProductOverview> | - |
specialproducts | GET | /specialproducts | count, picsize?, ... | List<MoProductOverview> | - |
alsopurchased | GET | /alsopurchased | pId, count, picsize?, ... | List<MoProductOverview> | - |
taglist | GET | /taglist | count | List<MoProductTag> | - |
productbytag | GET | /getbytag | tagName, count, picsize?, ... | List<MoProductOverview> | - |
getproductattr | GET | /getproductattr | pId | MoProductAttrList(SKU 联动) | - |
getproductspec | GET | /getproductspec | pId | List<MoProductSpec> | - |
productId | GET | /getbyid | id | MoProduct | - |
productbysku | GET | /getbysku | sku | MoProduct | - |
productpost | POST | /post | mo: MoProductRequest | long | ✔ |
调用示例:
api.get(productId, { id: 123 }).then(res => this.setData({ product: res.data }))
api.get(homePro, { picsize: 200 }).then(res => this.setData({ products: res.data }))
api.get(getproductattr, { pId: 123 }).then(res => this.setData({ attrs: res.data.attrs, tables: res.data.tables }))
Category(/api/v2/category)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
homecategories | GET | /homecategories | - | List<MoCategory> |
categoryget | GET | /get | id | MoCategory |
category | GET | /sublist | loadsub=false, catId=0 | List<MoCategoryList> |
Brand(/api/v2/brand)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
brandlist | GET | /list | name="", picsize?, page=1, size=12 | MoBrandList |
brandfeaturelist | GET | /featurelist | picsize? | List<MoSimpleBrand> |
brandget | GET | /get | mid, picsize? | MoSimpleBrand |
brandfeaturedproducts | GET | /featuredproducts | mid, count, ... | List<MoProductOverview> |
Search(/api/v2/search)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
search | GET | /find | q, sid, mid, cid, minPrice, maxPrice, page, size, orderBy | MoSearch |
searCate | GET | /findbycid | cid, mid, tagName, minPrice/maxPrice, page, size, orderBy | MoCategory |
findbymid | GET | /findbymid | mid, cid, tagName, minPrice/maxPrice, page, size, orderBy | MoBrand |
findbyoid | GET | /findbyoid | oid, mid, cid, tagName, minPrice/maxPrice, page, size, orderBy | MoCustomerSearch |
hotcategory | GET | /hotcategory | - | List<KeyValueModel> |
hotsearch | GET | /hot | - | List<string> |
searchhistory | GET | /history | - | List<string> |
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
getShoppingcart | GET | /get | - | MoCart |
cartCount | GET | /count | - | int |
producttocart | POST | /producttocart | model: MoAddCart(pId, qty, attrValue) | long |
productstocart | POST | /productstocart | model: List<MoAddCart> | - |
producttocheckout | POST | /producttocheckout | model: MoAddCart | long |
cartallselected | POST | /cartallselected | selected | - |
updatecartitem | POST | /updatecartitem | item: MoUpdateCart | MoUpdateCart |
removecartitem | POST | /removecartitem | id | - |
removecart | POST | /removecart | - | - |
wishlist | GET | /wishlist | page=1, size=12 | MoCart |
removewishlistitem | POST | /removewishlistitem | id | - |
iscollect | POST | /iscollect | pid | int(1 已收藏 / 0 未收藏) |
towishlist | POST | /towishlist | model: MoAddCart | long |
tocheckout | POST | /tocheckout | - | - |
调用示例:
api.get(getShoppingcart).then(res => this.setData({ cart: res.data }))
api.post(producttocart, { pId: 123, qty: 1, attrValue: 'combination_1_2' })
api.post(updatecartitem, { id: 1, quantity: 2, selected: true })
api.get(cartCount).then(res => this.setData({ count: res.data }))
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
checkminsubtotal | GET | /checkminsubtotal | - | - |
getcheckout | GET | /get | - | MoCheckout |
getpaymentmethod | GET | /getpaymentmethod | - | List<MoPaymentMethod> |
getshippingmethod | GET | /getshippingmethod | - | List<MoShippingMethod> |
submitcheckout | POST | /submit | request: MoCheckoutRequest | MoCheckoutResponse |
quicksubmit | POST | /quicksubmit | request: MoQuickOrderRequest | MoQuickOrderResponse |
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
returnrequests | GET | /returnrequests | typeId=0, page=1, size=12 | MoReturnList |
returnpost | POST | /returnpost | moReturn: MoReturn | - |
orderList | GET | /list | startTime, endTime, orderstatus=0, page=1, size=12 | MoOrderList |
orderDetail | GET | /detail | oid | MoOrderDetail |
orderconfirm | POST | /complete | mo: MoOrderCancel | - |
orderdeliver | POST | /deliver | mo: MoOrderDeliver | - |
ordercancel | POST | /cancel | mo: MoOrderCancel | - |
Plugin(/api/v2/plugin)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 | 鉴权 |
|---|---|---|---|---|---|
weixinwaploginenabled | GET | /weixinwaploginenabled | - | - | - |
weixinwaploginurl | GET | /weixinwaploginurl | callback | object | ✔ |
weixinopenloginenabled | GET | /weixinopenloginenabled | - | - | - |
weixinopenlogin | GET | /weixinopenlogin | code, state, encryptedData, iv | TokenEntity | - |
weixinopenphonenumber | GET | /weixinopenphonenumber | code, encryptedData, iv | PhoneEntity | - |
weixinwappaymentenabled | GET | /weixinwappaymentenabled | - | - | - |
weixinwapaymenturl | GET | /weixinwapaymenturl | orderId, paytype | MoPayment | ✔ |
weixinopenpaymentenabled | GET | /weixinopenpaymentenabled | - | - | - |
weixinopenpaymenturl | GET | /weixinopenpaymenturl | orderId, paytype | MoPayment | ✔ |
alipaywappaymentenabled | GET | /alipaywappaymentenabled | - | - | - |
alipaywappaymenturl | GET | /alipaywappaymenturl | orderId, paytype | MoPayment | ✔ |
WeixinOpenPayment(/api/v2/weixinopenpayment)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
weixinminipay | GET | /paying | orderId, paytype, openId="" | MoWeixinOpenPayment |
支付对接流程:
api.get(weixinopenpaymenturl, { orderId: 123, paytype: 'Order' }).then(res => {
const p = res.data // MoPayment 含支付参数
wx.requestPayment({
timeStamp: p.timeStamp, nonceStr: p.nonceStr,
package: p.package, signType: p.signType, paySign: p.paySign,
success() { /* 支付成功 */ },
fail() { /* 支付失败 */ }
})
})
Coupon(/api/v2/coupon)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 | 鉴权 |
|---|---|---|---|---|---|
couponshow | POST | /show | account | List<MoCoupon> | - |
couponlist | GET | /couponlist | type, page=1, size=12 | MoCouponList | ✔ |
coupon_center | GET | /center | page=1, size=12 | MoCouponList | ✔ |
getcoupon | POST | /getcoupon | code | - | ✔ |
usablecoupon | GET | /usablecoupon | orderTotal | List<MoCoupon> | ✔ |
PointsExchange(/api/v2/pointsexchange,类级 ✔)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
pointsexchangelist | GET | /list | - | object |
pointsexchange | POST | /exchange | ruleId | object |
Wallet(/api/v2/wallet,类级 ✔)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
wallet | GET | /get | - | MoWallet |
walletrecharge | POST | /recharge | model: MoRechargePost | MoRecharge |
walletrechargelist | POST | /rechargelist | ps=0, page=1, size=10 | MoRechargeList |
walletexchange | POST | /exchange | model: MoExchange | MoExchange |
walletexchangelist | POST | /exchangelist | page, size | MoExchangeList |
walletcardexchange | POST | /cardexchange | moCard: MoCardExchange | - |
walletrecordlist | GET | /recordlist | page, size | MoWalletRecordList |
RechargeCard(/api/v2/rechargecard)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
rechargecardlist | GET | /list | page=1, size=12 | MoRechargeCardList |
rechargecarditem | GET | /item | id | MoRechargeCard |
RechargeCardItem(/api/v2/rechargecarditem)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
rechargecarditemlist | GET | /list | cardId, page=1, size=12 | MoRechargeCardItemList |
rechargecarditemget | GET | /item | id | MoRechargeCardItem |
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
agentupgrade | GET | /upgrade | - | code=220 需审核 |
agentmyinfo | GET | /myinfo | - | MyAgentInfo |
agentspostinfo | POST | /postinfo | moPostInfo: MoPostInfo | - |
agentmysummary | GET | /mysummary | - | MoBonusSummary |
agentmyusers | GET | /myusers | page=1, size=12 | MoInvitees |
agentmyorders | GET | /myorders | page=1, size=12 | MoAgentOrder |
agentmybonus | GET | /mybonus | page=1, size=12 | MoAgentBonus |
| 端点常量 | HTTP | 子路由 | 参数 | 返回 | 鉴权 |
|---|---|---|---|---|---|
commentlist | GET | /list | pId, page=1, size=12 | MoProductReviewList | - |
myreviews | GET | /myreviews | page=1, size=12 | MoMyReviewList | ✔ |
productreviewing | GET | /productreviewing | page=1, size=12 | MoOrderNoReviewList | ✔ |
commentsubmit | POST | /submit | model: MoReviewRequest | - | ✔ |
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
favoriteslist | GET | /list | picsize?, specshow/tagshow/fullshow, page=1, size=12 | MoFavoritesList |
favoritessubmit | POST | /submit | model: MoFavoritesRequest(productId) | - |
favoritesremove | POST | /remove | id | - |
recentproductlist | GET | /list-recentproduct | 同上 | MoFavoritesList |
recentproductsubmit | POST | /submit-recentproduct | model | - |
recentproductremove | POST | /remove-recentproduct | id | - |
| 端点常量 | HTTP | 子路由 | 参数 | 返回 | 鉴权 |
|---|---|---|---|---|---|
referrerinfo | GET | /referrerinfo | code | MoReferrerInfo | - |
referrerauto | GET | /referrerauto | - | MoReferrerInfo | ✔ |
banner | GET | /banner | name, picsize=50 | MoBannerZone | - |
forminfo | GET | /forminfo | name | MoFormInfo | - |
formsubmit | POST | /formsubmit | name, model: MoFormSubmit | int | - |
getform | POST | /getform | id | MoFormData | - |
levels | GET | /levels | - | List<MoAllLevel> | - |
allprovinces | POST | /allprovinces | - | List<MoProvinces> | - |
uploadpicture | POST | /uploadpicture | upload: MoBase64 | MoPictureResponse | ✔ |
picturepost | POST | /picturepost | form | MoPictureResponse | ✔ |
producttype | GET | /producttype | - | List<KeyValueStrModel> | - |
orderstatus | GET | /orderstatus | - | List<KeyValueStrModel> | - |
ordertype | GET | /ordertype | - | List<KeyValueStrModel> | - |
returnreasons | GET | /returnreasons | - | List<string> | - |
returnactions | GET | /returnactions | - | List<string> | - |
requesttypes | GET | /requesttypes | - | List<KeyValueStrModel> | - |
paymentstatus | GET | /paymentstatus | - | List<KeyValueStrModel> | - |
shippingstatus | GET | /shippingstatus | - | List<KeyValueStrModel> | - |
pluginscenes | GET | /pluginscenes | - | List<KeyValueStrModel> | - |
customattrtype | GET | /customattrtype | - | List<KeyValueStrModel> | - |
messagetype | GET | /messagetype | - | List<KeyValueStrModel> | - |
Topic(/api/v2/topic)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
topiclist | GET | /list | page=1, size=12 | MoTopicList |
topicdetail | GET | /detail | systemName | MoTopic(含富文本 body) |
News(/api/v2/news)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
newslist | GET | /list | page=1, size=12 | MoNewsList |
newsitem | GET | /item | id | MoNews |
Blog(/api/v2/blog)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 | 鉴权 |
|---|---|---|---|---|---|
bloglist | GET | /list | customerId, page=1, size=12 | MoBlogList | - |
blogitem | GET | /item | id | MoBlog | - |
blogpost | POST | /post | model: MoBlogPost | MoBlog | ✔ |
blogcategories | GET | /categories | - | List<MoPaperCategory> | - |
blogpapers | GET | /papers | categoryId | List<MoPaper> | - |
PM(/api/v2/pm,类级 ✔)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
pmmarkRead | POST | /markRead | msgIds | - |
pmsend | POST | /send | model: MoSendMessage | - |
pmlist | GET | /list | type=0, page=1, size=12 | MoMessageList |
pmdelpm | GET | /delpm | msgId | - |
Shipping(/api/v2/shipping)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 | 鉴权 |
|---|---|---|---|---|---|
pickuplist | GET | /pickuplist | - | List<MoPickupPoint> | - |
shopsearch | GET | /shopsearch | keyword, lat, lng, page=1, size=20 | object | - |
shipments | GET | /shipments | oid | MoShipmentBrief | ✔ |
Kdniao(/api/v2/kdniao)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 | 鉴权 |
|---|---|---|---|---|---|
expresskdniaoapiurl | GET | /expresskdniaoapiurl | company, number | MoExpressInfo | ✔ |
Seckill(/api/v2/seckill)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
seckillstatus | GET | /status | - | MoSeckillStatus |
seckilllist | GET | /list | page=1, size=10 | List<MoSeckillProduct> |
seckilldetail | GET | /{id} | id | MoSeckillDetail |
PinTuan(/api/v2/pintuan)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 | 鉴权 |
|---|---|---|---|---|---|
pintuanproduct | GET | /product | pId, ptcId=0 | MoPinTuanProduct | ✔ |
pintuangroup | GET | /group | - | MoPinTuan | - |
pintuankaituan | POST | /kaituan | kaituan: MoKaiTuan | object | ✔ |
SignIn(/api/v2/signin,类级 ✔)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
signinstatus | GET | /status | - | SignInStatusResponse |
signin | POST | /signin | - | SignInResultResponse |
signinrecords | GET | /records | page=1, size=10 | MoSignInRecords |
signincalendar | GET | /calendar | year, month | MoSignInCalendar |
Task(/api/v2/task,类级 ✔)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
tasklist | GET | /list | - | object |
taskclaim | POST | /claim | taskRecordId | object |
taskunclaimed | GET | /unclaimed | - | object |
Share(/api/v2/share,类级 ✔)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
sharereward | POST | /reward | - | MoShareReward |
PreOrder(/api/v2/preorder,类级 ✔)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
preorderpayrest | POST | /pay-rest | orderId, paymentMethod | MoPayRestResult |
preorderrestinfo | GET | /rest-info | orderId | MoPreOrderRest |
TierPrice(/api/v2/tierprice,类级 ✔)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
tierprices | GET | /tierprices | productId | List<MoTierPrice> |
Bundle(/api/v2/bundle)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
bundlelist | GET | /list | - | object |
bundledetail | GET | /{id} | id | object |
Page(/api/v2/page)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 |
|---|---|---|---|---|
pageindex | GET | /index | - | MoBrandList |
pagefeaturelist | GET | /featurelist | picsize? | List<MoSimpleBrand> |
pageget | GET | /get | mid, picsize? | MoSimpleBrand |
pagefeaturedproducts | GET | /featuredproducts | mid, count, ... | List<MoProductOverview> |
AuthWeixinMini(/api/v2/authweixinmini)
| 端点常量 | HTTP | 子路由 | 参数 | 返回 | 鉴权 |
|---|---|---|---|---|---|
nicknameupdate | POST | /update | model: MoUpdate | ApiResponse | ✔ |
所有端点均不含
/api前缀(由api.js拼接,host已含/api),端点以/v2/...开头,直接复制即可对接全部后端接口。
// ============ 账号 Account ============
const login = '/v2/account/login'
const online = '/v2/account/online'
const logout = '/v2/account/logout'
const register = '/v2/account/register'
const sendsmsforregister = '/v2/account/sendsmsforregister'
const chanagepwd = '/v2/account/chanagepwd'
const sendsmsforfindpwd = '/v2/account/sendsmsforfindpwd'
const pwdset = '/v2/account/pwdset'
const checkaccount = '/v2/account/checkaccount'
// ============ 微信授权 WeixinOpen ============
const weixinminilogin = '/v2/weixinopen/login'
const weixinminiphone = '/v2/weixinopen/phonenumber'
const weixininfosubmit = '/v2/weixinopen/customer_nextstep'
// ============ 用户 Customer ============
const getcustomer = '/v2/customer/get'
const customerinfo = '/v2/customer/info'
const customersubmit = '/v2/customer/submit'
const customerpoints = '/v2/customer/points'
const uploadavatar = '/v2/customer/uploadavatar'
const checkshop = '/v2/customer/checkshop'
const myinvitecode = '/v2/customer/myinvitecode'
const myinvitees = '/v2/customer/myinvitees'
// ============ 地址 Address ============
const addressList = '/v2/address/list'
const addressdelete = '/v2/address/delete'
const addressadd = '/v2/address/add'
const addressdefault = '/v2/address/default'
const addressedit = '/v2/address/edit'
// ============ 商品 Product ============
const featuredbycid = '/v2/product/featuredbycid'
const homePro = '/v2/product/homeproducts'
const specialproducts = '/v2/product/specialproducts'
const alsopurchased = '/v2/product/alsopurchased'
const taglist = '/v2/product/taglist'
const productbytag = '/v2/product/getbytag'
const getproductattr = '/v2/product/getproductattr'
const getproductspec = '/v2/product/getproductspec'
const productId = '/v2/product/getbyid'
const productbysku = '/v2/product/getbysku'
const productpost = '/v2/product/post'
// ============ 分类 / 品牌 / 搜索 ============
const homecategories = '/v2/category/homecategories'
const categoryget = '/v2/category/get'
const category = '/v2/category/sublist'
const brandlist = '/v2/brand/list'
const brandfeaturelist = '/v2/brand/featurelist'
const brandget = '/v2/brand/get'
const brandfeaturedproducts = '/v2/brand/featuredproducts'
const search = '/v2/search/find'
const searCate = '/v2/search/findbycid'
const findbymid = '/v2/search/findbymid'
const findbyoid = '/v2/search/findbyoid'
const hotcategory = '/v2/search/hotcategory'
const hotsearch = '/v2/search/hot'
const searchhistory = '/v2/search/history'
// ============ 购物车 ShoppingCart ============
const getShoppingcart = '/v2/shoppingcart/get'
const cartCount = '/v2/shoppingcart/count'
const producttocart = '/v2/shoppingcart/producttocart'
const productstocart = '/v2/shoppingcart/productstocart'
const producttocheckout = '/v2/shoppingcart/producttocheckout'
const cartallselected = '/v2/shoppingcart/cartallselected'
const updatecartitem = '/v2/shoppingcart/updatecartitem'
const removecartitem = '/v2/shoppingcart/removecartitem'
const removecart = '/v2/shoppingcart/removecart'
const wishlist = '/v2/shoppingcart/wishlist'
const removewishlistitem = '/v2/shoppingcart/removewishlistitem'
const iscollect = '/v2/shoppingcart/iscollect'
const towishlist = '/v2/shoppingcart/towishlist'
const tocheckout = '/v2/shoppingcart/tocheckout'
// ============ 结算 Checkout ============
const checkminsubtotal = '/v2/checkout/checkminsubtotal'
const getcheckout = '/v2/checkout/get'
const getpaymentmethod = '/v2/checkout/getpaymentmethod'
const getshippingmethod = '/v2/checkout/getshippingmethod'
const submitcheckout = '/v2/checkout/submit'
const quicksubmit = '/v2/checkout/quicksubmit'
// ============ 订单 Order ============
const returnrequests = '/v2/order/returnrequests'
const returnpost = '/v2/order/returnpost'
const orderList = '/v2/order/list'
const orderDetail = '/v2/order/detail'
const orderconfirm = '/v2/order/complete'
const orderdeliver = '/v2/order/deliver'
const ordercancel = '/v2/order/cancel'
// ============ 支付 Plugin / WeixinOpenPayment ============
const weixinwaploginenabled = '/v2/plugin/weixinwaploginenabled'
const weixinwaploginurl = '/v2/plugin/weixinwaploginurl'
const weixinopenloginenabled = '/v2/plugin/weixinopenloginenabled'
const weixinopenlogin = '/v2/plugin/weixinopenlogin'
const weixinopenphonenumber = '/v2/plugin/weixinopenphonenumber'
const weixinwappaymentenabled = '/v2/plugin/weixinwappaymentenabled'
const weixinwapaymenturl = '/v2/plugin/weixinwapaymenturl'
const weixinopenpaymentenabled = '/v2/plugin/weixinopenpaymentenabled'
const weixinopenpaymenturl = '/v2/plugin/weixinopenpaymenturl'
const alipaywappaymentenabled = '/v2/plugin/alipaywappaymentenabled'
const alipaywappaymenturl = '/v2/plugin/alipaywappaymenturl'
const weixinminipay = '/v2/weixinopenpayment/paying'
// ============ 优惠券 Coupon ============
const couponshow = '/v2/coupon/show'
const couponlist = '/v2/coupon/couponlist'
const coupon_center = '/v2/coupon/center'
const getcoupon = '/v2/coupon/getcoupon'
const usablecoupon = '/v2/coupon/usablecoupon'
// ============ 积分 / 钱包 / 充值卡 ============
const pointsexchangelist = '/v2/pointsexchange/list'
const pointsexchange = '/v2/pointsexchange/exchange'
const wallet = '/v2/wallet/get'
const walletrecharge = '/v2/wallet/recharge'
const walletrechargelist = '/v2/wallet/rechargelist'
const walletexchange = '/v2/wallet/exchange'
const walletexchangelist = '/v2/wallet/exchangelist'
const walletcardexchange = '/v2/wallet/cardexchange'
const walletrecordlist = '/v2/wallet/recordlist'
const rechargecardlist = '/v2/rechargecard/list'
const rechargecarditem = '/v2/rechargecard/item'
const rechargecarditemlist = '/v2/rechargecarditem/list'
const rechargecarditemget = '/v2/rechargecarditem/item'
// ============ 分销代理 Agents ============
const agentupgrade = '/v2/agents/upgrade'
const agentmyinfo = '/v2/agents/myinfo'
const agentspostinfo = '/v2/agents/postinfo'
const agentmysummary = '/v2/agents/mysummary'
const agentmyusers = '/v2/agents/myusers'
const agentmyorders = '/v2/agents/myorders'
const agentmybonus = '/v2/agents/mybonus'
// ============ 评价 Review ============
const commentlist = '/v2/productreview/list'
const myreviews = '/v2/productreview/myreviews'
const productreviewing = '/v2/productreview/productreviewing'
const commentsubmit = '/v2/productreview/submit'
// ============ 收藏 Favorites ============
const favoriteslist = '/v2/favorites/list'
const favoritessubmit = '/v2/favorites/submit'
const favoritesremove = '/v2/favorites/remove'
const recentproductlist = '/v2/favorites/list-recentproduct'
const recentproductsubmit = '/v2/favorites/submit-recentproduct'
const recentproductremove = '/v2/favorites/remove-recentproduct'
// ============ 通用 Common ============
const referrerinfo = '/v2/common/referrerinfo'
const referrerauto = '/v2/common/referrerauto'
const banner = '/v2/common/banner'
const forminfo = '/v2/common/forminfo'
const formsubmit = '/v2/common/formsubmit'
const getform = '/v2/common/getform'
const levels = '/v2/common/levels'
const allprovinces = '/v2/common/allprovinces'
const uploadpicture = '/v2/common/uploadpicture'
const picturepost = '/v2/common/picturepost'
const producttype = '/v2/common/producttype'
const orderstatus = '/v2/common/orderstatus'
const ordertype = '/v2/common/ordertype'
const returnreasons = '/v2/common/returnreasons'
const returnactions = '/v2/common/returnactions'
const requesttypes = '/v2/common/requesttypes'
const paymentstatus = '/v2/common/paymentstatus'
const shippingstatus = '/v2/common/shippingstatus'
const pluginscenes = '/v2/common/pluginscenes'
const customattrtype = '/v2/common/customattrtype'
const messagetype = '/v2/common/messagetype'
// ============ 内容资讯 Topic / News / Blog ============
const topiclist = '/v2/topic/list'
const topicdetail = '/v2/topic/detail'
const newslist = '/v2/news/list'
const newsitem = '/v2/news/item'
const bloglist = '/v2/blog/list'
const blogitem = '/v2/blog/item'
const blogpost = '/v2/blog/post'
const blogcategories = '/v2/blog/categories'
const blogpapers = '/v2/blog/papers'
// ============ 消息 PM ============
const pmmarkRead = '/v2/pm/markRead'
const pmsend = '/v2/pm/send'
const pmlist = '/v2/pm/list'
const pmdelpm = '/v2/pm/delpm'
// ============ 物流 Shipping / Kdniao ============
const pickuplist = '/v2/shipping/pickuplist'
const shopsearch = '/v2/shipping/shopsearch'
const shipments = '/v2/shipping/shipments'
const expresskdniaoapiurl = '/v2/kdniao/expresskdniaoapiurl'
// ============ 营销 Seckill / PinTuan / SignIn / Task / Share / PreOrder / TierPrice / Bundle / Page ============
const seckillstatus = '/v2/seckill/status'
const seckilllist = '/v2/seckill/list'
const pintuanproduct = '/v2/pintuan/product'
const pintuangroup = '/v2/pintuan/group'
const pintuankaituan = '/v2/pintuan/kaituan'
const signinstatus = '/v2/signin/status'
const signin = '/v2/signin/signin'
const signinrecords = '/v2/signin/records'
const signincalendar = '/v2/signin/calendar'
const tasklist = '/v2/task/list'
const taskclaim = '/v2/task/claim'
const taskunclaimed = '/v2/task/unclaimed'
const sharereward = '/v2/share/reward'
const preorderpayrest = '/v2/preorder/pay-rest'
const preorderrestinfo = '/v2/preorder/rest-info'
const tierprices = '/v2/tierprice/tierprices'
const bundlelist = '/v2/bundle/list'
const pageindex = '/v2/page/index'
const pagefeaturelist = '/v2/page/featurelist'
const pageget = '/v2/page/get'
const pagefeaturedproducts = '/v2/page/featuredproducts'
const nicknameupdate = '/v2/authweixinmini/update'
module.exports = {
// Account
login, online, logout, register, sendsmsforregister, chanagepwd,
sendsmsforfindpwd, pwdset, checkaccount,
// WeixinOpen
weixinminilogin, weixinminiphone, weixininfosubmit,
// Customer
getcustomer, customerinfo, customersubmit, customerpoints, uploadavatar,
checkshop, myinvitecode, myinvitees,
// Address
addressList, addressdelete, addressadd, addressdefault, addressedit,
// Product
featuredbycid, homePro, specialproducts, alsopurchased, taglist, productbytag,
getproductattr, getproductspec, productId, productbysku, productpost,
// Category/Brand/Search
homecategories, categoryget, category, brandlist, brandfeaturelist, brandget,
brandfeaturedproducts, search, searCate, findbymid, findbyoid, hotcategory,
hotsearch, searchhistory,
// ShoppingCart
getShoppingcart, cartCount, producttocart, productstocart, producttocheckout,
cartallselected, updatecartitem, removecartitem, removecart, wishlist,
removewishlistitem, iscollect, towishlist, tocheckout,
// Checkout
checkminsubtotal, getcheckout, getpaymentmethod, getshippingmethod,
submitcheckout, quicksubmit,
// Order
returnrequests, returnpost, orderList, orderDetail, orderconfirm, orderdeliver,
ordercancel,
// Plugin/Payment
weixinwaploginenabled, weixinwaploginurl, weixinopenloginenabled,
weixinopenlogin, weixinopenphonenumber, weixinwappaymentenabled,
weixinwapaymenturl, weixinopenpaymentenabled, weixinopenpaymenturl,
alipaywappaymentenabled, alipaywappaymenturl, weixinminipay,
// Coupon
couponshow, couponlist, coupon_center, getcoupon, usablecoupon,
// Points/Wallet/RechargeCard
pointsexchangelist, pointsexchange, wallet, walletrecharge, walletrechargelist,
walletexchange, walletexchangelist, walletcardexchange, walletrecordlist,
rechargecardlist, rechargecarditem, rechargecarditemlist, rechargecarditemget,
// Agents
agentupgrade, agentmyinfo, agentspostinfo, agentmysummary, agentmyusers,
agentmyorders, agentmybonus,
// Review
commentlist, myreviews, productreviewing, commentsubmit,
// Favorites
favoriteslist, favoritessubmit, favoritesremove, recentproductlist,
recentproductsubmit, recentproductremove,
// Common
referrerinfo, referrerauto, banner, forminfo, formsubmit, getform, levels,
allprovinces, uploadpicture, picturepost, producttype, orderstatus, ordertype,
returnreasons, returnactions, requesttypes, paymentstatus, shippingstatus,
pluginscenes, customattrtype, messagetype,
// Topic/News/Blog
topiclist, topicdetail, newslist, newsitem, bloglist, blogitem, blogpost,
blogcategories, blogpapers,
// PM
pmmarkRead, pmsend, pmlist, pmdelpm,
// Shipping/Kdniao
pickuplist, shopsearch, shipments, expresskdniaoapiurl,
// Marketing
seckillstatus, seckilllist, pintuanproduct, pintuangroup, pintuankaituan,
signinstatus, signin, signinrecords, signincalendar, tasklist, taskclaim,
taskunclaimed, sharereward, preorderpayrest, preorderrestinfo, tierprices,
bundlelist, pageindex, pagefeaturelist, pageget, pagefeaturedproducts,
nicknameupdate
}
① 账号密码登录:
api.post(login, { name, password })
→ res.data = { guid, token, nickname }
→ wx.setStorageSync('guid', guid); wx.setStorageSync('token', token)
② 微信授权登录:
wx.login() → code
→ api.get(weixinminilogin, { code, state, encryptedData, iv })
→ res.data = { guid, token, openId }(TokenEntity)
→ 存储 guid + token
③ 绑定手机号:
<button open-type="getPhoneNumber">
→ api.get(weixinminiphone, { code, encryptedData, iv })
→ res.data = { phone }
详情选 SKU → 加入购物车(producttocart) / 立即购买(producttocheckout)
→ 购物车列表勾选(getShoppingcart + cartallselected)
→ 结算页(getcheckout)选地址/优惠券/支付方式
→ api.post(submitcheckout, { request: {...} }) → 创建订单
→ api.get(weixinopenpaymenturl, { orderId, paytype }) → 支付参数
→ wx.requestPayment → 支付成功 → 跳转支付成功页
用户分享(path 携带 code)→ 新用户进入存储 code
→ api.get(referrerauto) → 自动绑定推荐关系
→ 新用户下单 → 推荐人获佣金/分红
→ 代理中心(agentmyinfo/mysummary/mybonus)查看收益
同一套
miniProgramV2页面 +openapi.json接口,可按业务场景裁剪组合。生成前先确认目标场景,再决定启用哪些页面与接口模块;未指定时默认生成「标准 B2C 商城」核心链路。场景可叠加(如「分销 + 社区团购」)。
banner + 公告 topic + 金刚区分类入口 homecategories + 热卖/新品商品卡 homePro/productbytag + 优惠券弹窗 couponshowshopId(自提点,adress.id 注入 header);checkout 展示自提点而非收货地址;配送方式走 getshippingmethodreferrerauto;分享 path 携带 code;我的页突出「收益/我的客户/邀请」signin / 任务 task 引导每日活跃;积分商城 pointsexchange 兑换商品seckill / 进度条 pintuan;拼团需「开团/参团」交互| 文件 | 作用 |
|---|---|
页面名.js | 页面逻辑(数据、生命周期、事件、导航) |
页面名.wxml | 页面结构(WXML 模板语法、组件引用) |
页面名.wxss | 页面样式 |
页面名.json | 页面配置(导航栏标题、组件注册) |
import api from '../../api/api'
import { /* 需要的端点 */ } from '../../api/conf'
Page({
data: { /* 响应式变量 */ },
onLoad(options) { /* 页面加载,处理路由参数 */ },
onShow() { /* 页面显示/切回前台 */ },
onReady() { /* 初次渲染完成 */ },
getData() { /* 业务方法,驼峰命名,动词开头 */ },
onPullDownRefresh() { this.onShow(); wx.stopPullDownRefresh() },
onReachBottom() { /* 触底分页 page++ */ },
onShareAppMessage() { return { title: '分享标题', path: '/pages/xxx/xxx?id=' + this.data.id } }
})
| 页面 | 结构说明 |
|---|---|
| index 首页 | 轮播(banner) + 公告(topic) + 分类入口(homecategories) + 热卖商品(productbytag) + 优惠券弹窗(couponshow/getcoupon) |
| category 分类 | 左侧一级分类,右侧二级分类+商品 |
| subcategory 二级分类 | 商品列表,触底加载 |
| detail 商品详情 | 商品图轮播 + 价格 + SKU 面板(getproductattr/getproductspec) + 富文本详情(wxParse) + 底部操作栏 |
| cart 购物车 | 商品列表 + 全选/单选 + 数量加减(updatecartitem) + 删除(removecartitem) + 结算 |
| checkout 结算 | 地址 + 商品清单 + 优惠券 + 支付方式 + 提交订单(submitcheckout) |
| order/orderList 订单 | Tab 切换(待付款/待发货/待收货/已完成) + 订单卡片 + 操作按钮 |
| checkoutdetail 订单详情 | 状态 + 地址 + 商品 + 订单信息 + 操作按钮 |
| my 个人中心 | 用户信息卡片 + 功能入口网格 + 分销/订单/收藏/地址/优惠券入口 |
| search 搜索 | 搜索框 + 热门搜索(hotsearch) + 搜索结果(search) |
所有列表/详情页必须覆盖四种状态:加载中 / 空数据 / 错误 / 正常;按钮需覆盖业务状态(如商品:正常、售罄、下架、即将开卖)。
| 场景 | 实现 |
|---|---|
| 加载中 | wx.showLoading({ title: '加载中', mask: true }) / wx.hideLoading() |
| 成功 | wx.showToast({ title: '成功' }) |
| 失败 | `wx.showToast({ title: err.content |
| 确认 | wx.showModal({ title, content, success }) |
| 下拉刷新 | onPullDownRefresh + wx.stopPullDownRefresh() |
| 触底加载 | onReachBottom + page++ |
| 分享 | onShareAppMessage 返回 { title, path } |
app.js 中 globalData.host 为后端 API 地址(开发用 https://dev.ushopun.com/api,正式替换为租户域名 https://{tenant}.ushopun.com/api)project.config.json 填写小程序 AppIDdev.ushopun.com 与正式租户域名)对接前必读:先在
https://dev.ushopun.com示例站点确认目标模块已开通、接口可达(域名白名单、鉴权、模块开关)。若模块返回code: 403(module not open)或code: 220(需升级),说明需在后台开通对应功能,具体开通与付费请直接联系优社云AI官方。
conf.js 定义常量,禁止在页面中硬编码 URLapi.js 封装方法调用,禁止直接 wx.requestguid(用户标识)、authorization(JWT Token)、shopId(店铺/自提点)this.setData() 更新数据,数组项更新用字符串 key:['arr[' + i + '].field']mode 属性(推荐 widthFix)wx:keycode === 200 成功(取 data),code === 250 业务警告(提示 content),code === 401 未授权(跳登录),code === 220 需审核,code === 404 找不到err.content,成功数据统一从 res.data 读取;checkaccount 接口特殊:code === 1 可用、code === 0 已存在Number(x).toFixed(2) 保留两位小数;分页默认每页 12 条(个别接口按后端默认值),触底加载 page++rpx(750rpx = 屏幕宽度);图片必须设置 mode