allen 2 years ago
commit
ad2d2b1a31
100 changed files with 10225 additions and 0 deletions
  1. 65 0
      api/bill.js
  2. 29 0
      api/category.js
  3. 115 0
      api/goods.js
  4. 48 0
      api/logistic.js
  5. 12 0
      api/member.js
  6. 49 0
      api/order.js
  7. 178 0
      api/passport.js
  8. 46 0
      api/rebateShop.js
  9. 36 0
      api/refund.js
  10. 14 0
      api/region.js
  11. 201 0
      api/shop.js
  12. 34 0
      api/statistic.js
  13. 72 0
      api/withdrawAccount.js
  14. 99 0
      app.js
  15. 93 0
      app.json
  16. 22 0
      app.wxss
  17. 1226 0
      assets/styles/icon.wxss
  18. 3941 0
      assets/styles/main.wxss
  19. 118 0
      assets/styles/skyvow.wxss
  20. 1019 0
      assets/styles/weui.wxss
  21. 71 0
      custom-tab-bar/index.js
  22. 7 0
      custom-tab-bar/index.json
  23. 13 0
      custom-tab-bar/index.wxml
  24. 135 0
      ec-canvas/ec-canvas.js
  25. 4 0
      ec-canvas/ec-canvas.json
  26. 4 0
      ec-canvas/ec-canvas.wxml
  27. 4 0
      ec-canvas/ec-canvas.wxss
  28. 12 0
      ec-canvas/echarts.js
  29. 97 0
      ec-canvas/wx-canvas.js
  30. 18 0
      lib/formats.js
  31. 10 0
      lib/index.js
  32. 174 0
      lib/parse.js
  33. 210 0
      lib/stringify.js
  34. 213 0
      lib/utils.js
  35. 1 0
      miniprogram_npm/vant-weapp/action-sheet/index.d.ts
  36. 62 0
      miniprogram_npm/vant-weapp/action-sheet/index.js
  37. 8 0
      miniprogram_npm/vant-weapp/action-sheet/index.json
  38. 67 0
      miniprogram_npm/vant-weapp/action-sheet/index.wxml
  39. 1 0
      miniprogram_npm/vant-weapp/action-sheet/index.wxss
  40. 1 0
      miniprogram_npm/vant-weapp/area/index.d.ts
  41. 229 0
      miniprogram_npm/vant-weapp/area/index.js
  42. 6 0
      miniprogram_npm/vant-weapp/area/index.json
  43. 18 0
      miniprogram_npm/vant-weapp/area/index.wxml
  44. 1 0
      miniprogram_npm/vant-weapp/area/index.wxss
  45. 1 0
      miniprogram_npm/vant-weapp/button/index.d.ts
  46. 79 0
      miniprogram_npm/vant-weapp/button/index.js
  47. 7 0
      miniprogram_npm/vant-weapp/button/index.json
  48. 68 0
      miniprogram_npm/vant-weapp/button/index.wxml
  49. 1 0
      miniprogram_npm/vant-weapp/button/index.wxss
  50. 57 0
      miniprogram_npm/vant-weapp/calendar/calendar.wxml
  51. 1 0
      miniprogram_npm/vant-weapp/calendar/components/header/index.d.ts
  52. 16 0
      miniprogram_npm/vant-weapp/calendar/components/header/index.js
  53. 3 0
      miniprogram_npm/vant-weapp/calendar/components/header/index.json
  54. 16 0
      miniprogram_npm/vant-weapp/calendar/components/header/index.wxml
  55. 1 0
      miniprogram_npm/vant-weapp/calendar/components/header/index.wxss
  56. 1 0
      miniprogram_npm/vant-weapp/calendar/components/month/index.d.ts
  57. 157 0
      miniprogram_npm/vant-weapp/calendar/components/month/index.js
  58. 3 0
      miniprogram_npm/vant-weapp/calendar/components/month/index.json
  59. 39 0
      miniprogram_npm/vant-weapp/calendar/components/month/index.wxml
  60. 67 0
      miniprogram_npm/vant-weapp/calendar/components/month/index.wxs
  61. 1 0
      miniprogram_npm/vant-weapp/calendar/components/month/index.wxss
  62. 1 0
      miniprogram_npm/vant-weapp/calendar/index.d.ts
  63. 290 0
      miniprogram_npm/vant-weapp/calendar/index.js
  64. 9 0
      miniprogram_npm/vant-weapp/calendar/index.json
  65. 31 0
      miniprogram_npm/vant-weapp/calendar/index.wxml
  66. 37 0
      miniprogram_npm/vant-weapp/calendar/index.wxs
  67. 1 0
      miniprogram_npm/vant-weapp/calendar/index.wxss
  68. 17 0
      miniprogram_npm/vant-weapp/calendar/utils.d.ts
  69. 78 0
      miniprogram_npm/vant-weapp/calendar/utils.js
  70. 25 0
      miniprogram_npm/vant-weapp/calendar/utils.wxs
  71. 1 0
      miniprogram_npm/vant-weapp/card/index.d.ts
  72. 49 0
      miniprogram_npm/vant-weapp/card/index.js
  73. 6 0
      miniprogram_npm/vant-weapp/card/index.json
  74. 50 0
      miniprogram_npm/vant-weapp/card/index.wxml
  75. 1 0
      miniprogram_npm/vant-weapp/card/index.wxss
  76. 1 0
      miniprogram_npm/vant-weapp/cell-group/index.d.ts
  77. 10 0
      miniprogram_npm/vant-weapp/cell-group/index.js
  78. 3 0
      miniprogram_npm/vant-weapp/cell-group/index.json
  79. 9 0
      miniprogram_npm/vant-weapp/cell-group/index.wxml
  80. 1 0
      miniprogram_npm/vant-weapp/cell-group/index.wxss
  81. 1 0
      miniprogram_npm/vant-weapp/cell/index.d.ts
  82. 38 0
      miniprogram_npm/vant-weapp/cell/index.js
  83. 6 0
      miniprogram_npm/vant-weapp/cell/index.json
  84. 45 0
      miniprogram_npm/vant-weapp/cell/index.wxml
  85. 1 0
      miniprogram_npm/vant-weapp/cell/index.wxss
  86. 1 0
      miniprogram_npm/vant-weapp/checkbox-group/index.d.ts
  87. 35 0
      miniprogram_npm/vant-weapp/checkbox-group/index.js
  88. 3 0
      miniprogram_npm/vant-weapp/checkbox-group/index.json
  89. 1 0
      miniprogram_npm/vant-weapp/checkbox-group/index.wxml
  90. 1 0
      miniprogram_npm/vant-weapp/checkbox-group/index.wxss
  91. 1 0
      miniprogram_npm/vant-weapp/checkbox/index.d.ts
  92. 74 0
      miniprogram_npm/vant-weapp/checkbox/index.js
  93. 6 0
      miniprogram_npm/vant-weapp/checkbox/index.json
  94. 20 0
      miniprogram_npm/vant-weapp/checkbox/index.wxml
  95. 20 0
      miniprogram_npm/vant-weapp/checkbox/index.wxs
  96. 1 0
      miniprogram_npm/vant-weapp/checkbox/index.wxss
  97. 6 0
      miniprogram_npm/vant-weapp/circle/canvas.d.ts
  98. 43 0
      miniprogram_npm/vant-weapp/circle/canvas.js
  99. 1 0
      miniprogram_npm/vant-weapp/circle/index.d.ts
  100. 0 0
      miniprogram_npm/vant-weapp/circle/index.js

+ 65 - 0
api/bill.js

@@ -0,0 +1,65 @@
+import request from '../utils/request'
+const app=getApp()
+/**
+ * 获取结算账单列表
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function getSettleMentList(params) {
+  return request({
+    url: 'seller/order/bills',
+    method: 'get',
+    loading: false,
+    needToken: true,
+    params
+  })
+}
+
+/**
+ * 商家查看某详细账单
+ * @param ids
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function getBillDetails(ids, params) {
+  return request({
+    url: `seller/order/bills/${ids}`,
+    method: 'get',
+    loading: false,
+    needToken: true,
+    params
+  })
+}
+
+/**
+ * 查看本期账单中的订单列表或者退款单列表
+ * @param id
+ * @param type
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function getOrderList(id, type, params) {
+  return request({
+    url: `seller/order/bills/${id}/${type}`,
+    method: 'get',
+    loading: false,
+    needToken: true,
+    params
+  })
+}
+
+/**
+ * 卖家对账单进行下一步操作 确认结算
+ * @param id
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function confirmSettle(id, params) {
+  return request({
+    url: `seller/order/bills/${id}/next`,
+    method: 'put',
+    needToken: true,
+    loading: false,
+    params
+  })
+}

+ 29 - 0
api/category.js

@@ -0,0 +1,29 @@
+import request from '../utils/request'
+const app=getApp()
+/**
+ * 发布商品 查询商品品类 分级查询(商城商品品类)
+ * @param ids
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function getGoodsCategoryLevelList(ids, params) {
+  return request({
+    url: `seller/goods/category/${ids}/children`,
+    method: 'get',
+    loading: false,
+    needToken:true,
+    params
+  })
+}
+/**
+ * 获取商品分类
+ * @param parent_id
+ */
+export function getCategory(parent_id = 0) {
+  return request({
+    baseUrl:app.globalData.api_domain.api_buyer,
+    url: `goods/categories/${parent_id}/children`,
+    method: 'get',
+    loading: false
+  })
+}

+ 115 - 0
api/goods.js

@@ -0,0 +1,115 @@
+
+import request from '../utils/request'
+const app = getApp()
+/**
+ * 获取商品列表
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function getGoodsList(params) {
+  return request({
+    url: 'seller/goods',
+    method: 'get',
+    loading: false,
+    needToken:true,
+    params
+  })
+}
+
+
+/**
+ * 上架正常商品 商品相关API-添加商品
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function aboveGoods(params) {
+  return request({
+    url: 'seller/goods',
+    method: 'post',
+    needToken:true,
+    data:params,
+    headers: { 'Content-Type': 'application/json' }
+  })
+}
+
+/**
+ * 修改正常商品 编辑商品时用到
+ * @param id
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function editGoods(id, params) {
+  return request({
+    url: `seller/goods/${id}`,
+    method: 'put',
+    needToken:true,
+    data:params,
+    headers: { 'Content-Type': 'application/json' }
+  })
+}
+
+
+
+/**
+ * 查询单个商品信息 商品列表 编辑
+ * @param ids
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function getGoodData(ids, params) {
+  return request({
+    url: `seller/goods/${ids}`,
+    method: 'get',
+    loading: false,
+    needToken:true,
+    params
+  })
+}
+
+/**
+ * 商家下架商品
+ * @param ids
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function underGoods(ids, params) {
+  return request({
+    url: `seller/goods/${ids}/under`,
+    method: 'put',
+    needToken:true,
+    data:params
+  })
+}
+
+
+/**
+ * 查询库存商品数据  查询商品sku(规格)信息
+ * @param ids
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function getGoodsStockList(ids, params) {
+  return request({
+    url: `seller/goods/${ids}/skus`,
+    method: 'get',
+    needToken:true,
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 保存库存商品
+ * @param goods_id
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function reserveStockGoods(goods_id, params) {
+  return request({
+    url: `seller/goods/${goods_id}/quantity`,
+    method: 'put',
+    needToken:true,
+    data:params,
+    headers: { 'Content-Type': 'application/json' }
+  })
+}

+ 48 - 0
api/logistic.js

@@ -0,0 +1,48 @@
+import request from '../utils/request'
+const app=getApp()
+/**
+ * 获取物流公司列表
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function getExpressCompanyList(params) {
+  return request({
+    url: 'seller/shops/logi-companies',
+    method: 'get',
+    loading: false,
+    needToken:true,
+    params
+  })
+}
+
+/**
+ * 开启 物流公司
+ * @param ids
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function openExpressPower(ids, params) {
+  return request({
+    url: `seller/shops/logi-companies/${ids}`,
+    method: 'post',
+    loading: false,
+    needToken:true,
+    data: params
+  })
+}
+
+/**
+ * 关闭 物流公司
+ * @param ids
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function closeExpressPower(ids, params) {
+  return request({
+    url: `seller/shops/logi-companies/${ids}`,
+    method: 'delete',
+    loading: false,
+    needToken:true,
+    params
+  })
+}

+ 12 - 0
api/member.js

@@ -0,0 +1,12 @@
+import request from '../utils/request'
+const app=getApp()
+/** 查询用户信息 */
+export function getCareMember(id, params) {
+  return request({
+    url: `care/members/${id}`,
+    method: 'get',
+    needToken:true,
+    loading: false,
+    params
+  })
+}

+ 49 - 0
api/order.js

@@ -0,0 +1,49 @@
+
+import request from '../utils/request'
+const app = getApp()
+/**
+ * 获取订单列表
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function getOrderList(params) {
+  return request({
+    url: 'seller/trade/orders',
+    method: 'get',
+    needToken:true,
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 根据订单sn获取订单详情
+ * @param sn
+ * @returns {Promise<any>}
+ */
+export function getOrderDetail(sn) {
+  return request({
+    url: `seller/trade/orders/${sn}`,
+    method: 'get',
+    needToken:true,
+    loading: false
+  })
+}
+
+
+/**
+ * 发货
+ * @param ids
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function deliveryGoods(sn, params) {
+  return request({
+    url: `seller/trade/orders/${sn}/delivery`,
+    method: 'post',
+    loading: false,
+    needToken:true,
+    data:params
+  })
+}
+

+ 178 - 0
api/passport.js

@@ -0,0 +1,178 @@
+import request from '../utils/request'
+import md5 from '../utils/js-md5'
+const app=getApp()
+/**
+ * 普通登录
+ * @param params
+ */
+export function login(params) {
+  params.password = md5(params.password)
+  return request({
+    baseUrl: app.globalData.api_domain.api_seller,
+    url: `passport/mini-program/seller-login`,
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 手机验证码登陆
+ * @param params
+ */
+export function smslogin(params) {
+  return request({
+    baseUrl: app.globalData.api_domain.api_seller,
+    url: `passport/mini-program/smscode-login`,
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+export function logout(params) {
+  return request({
+    baseUrl: app.globalData.api_domain.api_seller,
+    url: `passport/mini-program/logout`,
+    method: 'post',
+    loading: false,
+    data:params
+  })
+}
+
+/**
+ * 小程序绑定已有用户
+ */
+export function bindUser(params){
+  return request({
+    baseUrl:app.globalData.api_domain.api_seller,
+    url: `passport/mini-program/bind-user`,
+    method: 'post',
+    loading: false,
+    data:params
+  })
+}
+/**
+ * 小程序解绑用户
+ */
+export function unbindUser(params){
+  return request({
+    baseUrl:app.globalData.api_domain.api_seller,
+    url: `passport/mini-program/unbind-user`,
+    method: 'post',
+    loading: false,
+    data:params
+  })
+}
+
+
+/**
+ * 小程序注册用户
+ */
+export function registerBind(uuid,params) {
+  params.password = md5(params.password)
+  return request({
+    baseUrl: app.globalData.api_domain.api_seller,
+    url: `passport/mini-program/register-bind/${uuid}`,
+    method: 'post',
+    loading: false,
+    data:params
+  })
+}
+
+/**
+ * 小程序自动登陆过
+ */
+export function autoLogin(params) {
+  return request({
+    baseUrl: app.globalData.api_domain.api_seller,
+    url: `passport/mini-program/auto-login`,
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+/**
+ * 加密数据解密验证
+ * @param params
+ */
+export function accessUnionID(params) {
+  return request({
+    baseUrl: app.globalData.api_domain.api_seller,
+    url: 'passport/mini-program/decryptUserinfo',
+    method: 'get',
+    loading:false,
+    params
+  })
+}
+
+/**
+ * 发送会员注册手机验证码
+ * @param mobile
+ * @param captcha
+ */
+export function sendRegisterSms(mobile, captcha) {
+  return request({
+    baseUrl:app.globalData.api_domain.api_buyer,
+    url: `passport/register/smscode/${mobile}`,
+    method:'post',
+    data: {
+      captcha,
+      uuid: app.globalData.uuid
+    }
+  })
+}
+
+export function saveFormId(params) {
+  return request({
+    baseUrl: app.globalData.api_domain.api_seller,
+    url: `passport/mini-program/formid`,
+    method: 'post',
+    loading: false,
+    data:params
+  })
+}
+
+
+/**
+ * 刷新token
+ * @param params
+ * @returns {Promise<unknown>}
+ */
+
+export function refreshToken(params) {
+  return request({
+    baseUrl: app.globalData.api_domain.api_seller,
+    url: `passport/mini-program/token`,
+    method: 'post',
+    needToken:false,
+    loading: false,
+    data:params
+  })
+}
+
+/**
+ * 发送会员登陆验证码
+ * @param mobile
+ * @param captcha
+ */
+export function sendLoginSms(mobile) {
+  return request({
+	baseUrl: app.globalData.api_domain.api_seller,
+    url: `passport/mini-program/smslogin/${mobile}`,
+    method:'post',
+    loading:false
+  })
+}
+/**
+ * 解密微信用户
+ */
+export function decryptWxUser(param) {
+  return request({
+	baseUrl: app.globalData.api_domain.api_seller,
+    url: `passport/mini-program/decryptWxUser`,
+    method:'get',
+    loading:false,
+    params:param
+  })
+}

+ 46 - 0
api/rebateShop.js

@@ -0,0 +1,46 @@
+import request from '../utils/request'
+const app=getApp()
+/**
+ * 获取账户金额
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function getRebateShop(shopId) {
+  return request({
+    url: `care/shopWithdraw/rebateshop/${shopId}`,
+    method: 'get',
+    loading: false,
+    needToken: true,
+  })
+}
+
+/**
+ * 获取提现记录
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function getList(params) {
+  return request({
+    url: 'care/shopWithdraw/page',
+    method: 'get',
+    loading: false,
+    needToken: true,
+    params
+  })
+}
+
+/**
+ * 新增提现记录
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function applyWithdraw(params) {
+  return request({
+    url: 'care/shopWithdraw/apply-withdraw',
+    method: 'post',
+    loading: false,
+    needToken: true,
+    data: params,
+    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
+  })
+}

+ 36 - 0
api/refund.js

@@ -0,0 +1,36 @@
+
+import request from '../utils/request'
+const app = getApp()
+/**
+ * 获取订单列表
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function getRefundList(params) {
+  return request({
+    url: 'seller/after-sales/refundetails',
+    method: 'get',
+    needToken: true,
+    loading: false,
+    params
+  })
+}
+
+
+
+/**
+ * 审核退款
+ * @param ids
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function refundAuth(sn, params) {
+  return request({
+    url: `seller/after-sales/audits/${sn}`,
+    method: 'post',
+    loading: false,
+    needToken: true,
+    data: params
+  })
+}
+

+ 14 - 0
api/region.js

@@ -0,0 +1,14 @@
+import request from '../utils/request'
+const app = getApp()
+/**
+ * 区域信息
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function getChildRegions(id) {
+  return request({
+    baseUrl:app.globalData.api_domain.api_base,
+    url: `regions/${id}/children`,
+    method: 'get',
+  })
+}

+ 201 - 0
api/shop.js

@@ -0,0 +1,201 @@
+
+import request from '../utils/request'
+const app = getApp()
+/**
+ * 获取店铺信息
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function getShopData() {
+  return request({
+    url: 'seller/shops',
+    method: 'get',
+    needToken:true
+  })
+  }
+/**
+* 获取店铺状态
+*/
+export function getShopStatus() {
+  return request({
+    url: 'seller/shops/status',
+    method: 'get',
+    loading: 0.2,
+    needToken:true
+  })
+}
+
+/**
+ * 获取用户店铺列表
+ * @param params
+ */
+export function getShopList(params) {
+  return request({
+    baseUrl:app.globalData.api_domain.api_buyer,
+    url: 'shops/list',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取店铺可设定的机构列表
+ */
+export function getShopByCountyId(params) {
+  return request({
+    baseUrl:app.globalData.api_domain.api_buyer,
+    url: 'shops/getShopListByCountyId',
+    method: 'get',
+    loading: false,
+    needToken: true,
+    params
+  })
+}
+
+
+
+/**
+ * 根据店铺Id查找该店铺已设定的机构
+ * @param shopid
+ */
+export function getShopServiceMappings(shopId) {
+  return request({
+    baseUrl: app.globalData.api_domain.api_buyer,
+    url: `shops/es_shop_service_mapping/${shopId}/services`,
+    method: 'get',
+    loading: false
+  })
+}
+
+
+/**
+ * 设置店铺与医院关系链
+ * @param param
+ */
+export function setShopServiceMapping(shopId,param) {
+  return request({
+    baseUrl:app.globalData.api_domain.api_buyer,
+    url: `shops/es_shop_service_mapping/${shopId}/setting`,
+    method: 'post',
+    loading: false,
+    data: param,
+    headers: { 'Content-Type': 'application/json' }
+  })
+}
+
+/** 申请o2o店铺 */
+export function applyO2OShop(param) {
+  return request({
+    url: 'seller/shops/o2o/apply',
+    method: 'post',
+    loading: false,
+    needToken: true,
+    data: param
+  })
+}
+
+/** 申请o2o店铺 */
+export function applyB2b2cShop(param) {
+  return request({
+    url: 'seller/shops/b2b2c/apply',
+    method: 'post',
+    loading: false,
+    needToken: true,
+    data: param
+  })
+}
+/** 买家申请o2o店铺 无店铺用户初次申请店铺*/
+export function buyerApplyO2OShop(param) {
+  return request({
+    baseUrl:app.globalData.api_domain.api_buyer,
+    url: 'shops/o2o/apply',
+    method: 'post',
+    loading: false,
+    needToken: true,
+    data: param
+  })
+}
+
+/** 买家申请b2b2c店铺 无店铺用户初次申请店铺*/
+export function buyerApplyB2b2cShop(param) {
+  return request({
+    baseUrl:app.globalData.api_domain.api_buyer,
+    url: 'shops/b2b2c/apply',
+    method: 'post',
+    loading: false,
+    needToken: true,
+    data: param
+  })
+}
+/** 获取用户的O2O店铺列表 */
+
+
+export function getO2OShops(param) {
+  return request({
+    url: 'seller/shops/getSellerO2OShops',
+    method: 'get',
+    loading: false,
+    needToken: true,
+    params: param
+  })
+}
+
+
+/**
+ * 用户切换登陆机构
+ * @param shopid
+ */
+export function changeLoginShop(shopid) {
+  return request({
+    url: `seller/login/changeLoginShop/${shopid}`,
+    method: 'get',
+    needToken:true,
+    loading: false
+  })
+}
+
+
+/**
+ * 店铺营业时间设置
+ * @param params
+ */
+export function setShopBusinessHour(params) {
+  return request({
+    url: 'seller/shops/updateShopState',
+    method: 'put',
+    loading: false,
+    needToken:true,
+    data:params
+  })
+}
+
+
+/**
+ * 获取首页统计信息
+ * @returns {Promise<any>}
+ */
+export function getDashboardData() {
+  return request({
+    url: 'seller/statistics/dashboard/shop',
+    method: 'get',
+    needToken:true,
+    loading: false
+  })
+}
+
+/**
+ * 保存店铺设置
+ * @param ids
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function saveShopSettings(params) {
+  return request({
+    url: 'seller/shops',
+    method: 'put',
+    loading: false,
+    needToken:true,
+    data:params
+  })
+}

+ 34 - 0
api/statistic.js

@@ -0,0 +1,34 @@
+import request from '../utils/request'
+const app = getApp()
+/**
+ * 获取店铺销售业绩统计数据
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function getMonthStatistic(params) {
+  return request({
+    url: 'seller/statistics/reports/sales_money',
+    method: 'get',
+    needToken: true,
+    params
+  })
+}
+
+
+export function getSalesStatisticsNum(params) {
+  return request({
+    url: 'seller/statistics/reports/sales_num',
+    method: 'get',
+    needToken: true,
+    params
+  })
+}
+
+export function getSalesSummary(params) {
+  return request({
+    url: 'seller/statistics/reports/sales_summary_date_range',
+    method: 'get',
+    needToken: true,
+    params
+  })
+}

+ 72 - 0
api/withdrawAccount.js

@@ -0,0 +1,72 @@
+import request from '../utils/request'
+const app=getApp()
+/**
+ * 获取账户列表
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function getList(params) {
+  return request({
+    url: 'care/seller/rebate/rebate_account/page',
+    method: 'POST',
+    loading: false,
+    needToken:true,
+    data: params,
+    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
+  })
+}
+
+/**
+ *  获取机构提现账户列表
+ * @param shopid
+ */
+export function getListByShopId(shopid) {
+  return request({
+    url: `care/seller/rebate/rebate_account/list/${shopid}`,
+    needToken:true,
+    method: 'get'
+  })
+}
+
+/** 新增账户 */
+export function add(params) {
+  return request({
+    url: 'care/seller/rebate/rebate_account',
+    method: 'POST',
+    needToken:true,
+    loading: true,
+    data: params
+  })
+}
+
+/** 删除账户  */
+export function deletes(params) {
+  const ids = params.toString()
+  return request({
+    url: `care/seller/rebate/rebate_account/${ids}`,
+    method: 'DELETE',
+    needToken:true,
+    loading: true,
+    data: params
+  })
+}
+
+/** 更新账户 */
+export function update(id, params) {
+  return request({
+    url: `care/seller/rebate/rebate_account/${id}`,
+    method: 'put',
+    needToken:true,
+    data: params
+  })
+}
+/** 查询单个账户 */
+export function get(id, params) {
+  return request({
+    url: `care/seller/rebate/rebate_account/${id}`,
+    method: 'get',
+    needToken:true,
+    loading: false,
+    params
+  })
+}

+ 99 - 0
app.js

@@ -0,0 +1,99 @@
+//app.js
+import {
+  guid
+} from '/utils/util.js'
+App({
+  onLaunch: function() {
+   /** 检查版本更新 */
+    const updateManager = wx.getUpdateManager();
+    updateManager.onCheckForUpdate(function (res) {
+      if (res.hasUpdate)
+        wx.clearStorageSync();
+    })
+    updateManager.onUpdateReady(function () {
+      wx.showModal({
+        title: '更新提示',
+        content: '新版本已经准备好,是否重启应用?',
+        success: function (res) {
+          if (res.confirm) {
+            // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
+            updateManager.applyUpdate()
+          }
+        }
+      })
+
+    })
+    
+    //加载本地存储数据
+   this.globalData.authorInfo = wx.getStorageSync('authorInfo')
+   this.globalData.sellerUser = wx.getStorageSync('sellerUser')
+   this.globalData.sellerShop = wx.getStorageSync('sellerShop')
+   
+
+    // 检查uuid参数,生成一个并写入本地存储
+    var uuid = wx.getStorageSync('uuid')
+    if (!uuid) {
+      uuid = guid()
+      this.globalData.uuid = uuid
+      wx.setStorageSync('uuid', uuid)
+    }
+    else{
+      this.globalData.uuid=uuid
+    }
+   
+  },
+  onShow(){
+    //加载本地存储数据
+	  this.globalData.authorInfo = wx.getStorageSync('authorInfo')
+	  this.globalData.sellerUser = wx.getStorageSync('sellerUser')
+    this.globalData.sellerShop = wx.getStorageSync('sellerShop')
+    
+  
+	  // 检查uuid参数,生成一个并写入本地存储
+	  var uuid = wx.getStorageSync('uuid')
+	  if (!uuid) {
+	    uuid = guid()
+	    this.globalData.uuid = uuid
+	    wx.setStorageSync('uuid', uuid)
+	  }
+	  else{
+	    this.globalData.uuid=uuid
+	  }
+	  
+  },
+  globalData: {
+    /** 小程序类型 */
+    miniProgramType:'miniprogramo2oseller',
+    /** 用户uuid */
+    uuid: null,
+	/**  登陆授权信息 */
+    authorInfo:null,
+    /** 卖家用户 */
+    sellerUser: null,
+    /** 卖家店铺 */
+    sellerShop: null,
+    /** 待处理订单角标 */
+    orderNum:0,
+    /** 今日订单数 */
+    todayOrderNum:0,
+    /** 今日订单金额 */
+    todayOrderTotal:0,
+    /** api 模式 */
+    api_mode: 'dev',
+    /** api域名 */
+	api_domain:{
+		api_base: 'http://127.0.0.1:7000/',//''https://dev.base.wdklian.com/',//,
+		api_buyer: 'http://127.0.0.1:7002/',//'https://api.buyer.wdklian.com/',//
+		api_seller: 'http://127.0.0.1:7003/',//'https://api.seller.wdklian.com/',//
+		api_admin: 'http://127.0.0.1:7004/',//'https://api.admin.wdklian.com/', //
+  }
+  // api_domain:{
+  //   api_base: 'https://api.base.wdklian.com/',//,'https://api.base.wdklian.com/',//''https://dev.base.wdklian.com/',//,
+	// 	api_buyer: 'https://api.buyer.wdklian.com/',//'http://127.0.0.1:7002/',//'https://api.buyer.wdklian.com/',///'https://api.buyer.wdklian.com/',//
+	// 	api_seller: 'https://api.seller.wdklian.com/',//'http://127.0.0.1:7003/',//'https://api.seller.wdklian.com/',//
+	// 	api_admin: 'https://api.admin.wdklian.com/', //'http://127.0.0.1:7004/',//'https://api.admin.wdklian.com/', //
+  // }
+    
+  }
+
+})

+ 93 - 0
app.json

@@ -0,0 +1,93 @@
+{
+  "tabBar": {
+    "custom": true,
+    "color": "#000000",
+    "selectedColor": "#000000",
+    "backgroundColor": "#000000",
+    "list": [
+      {
+        "pagePath": "pages/index/index"
+      },
+      {
+        "pagePath": "pages/order/index"
+      },
+      {
+        "pagePath": "pages/member/index"
+      },
+      {
+        "pagePath": "pages/store/index"
+      },
+      {
+        "pagePath": "pages/goods/goods-list"
+      }
+    ]
+  },
+  "pages": [
+    "pages/welcome/index",
+    "pages/index/index",
+    "pages/member/index",
+    "pages/store/index",
+    "pages/order/index",
+    "pages/login/index",
+    "pages/goods/goods-list",
+    "pages/goods/edit",
+    "pages/shop/shop-apply",
+    "pages/shop/myshop-list",
+    "pages/store/businessSetting",
+    "pages/shop/shop-edit",
+    "pages/login/login",
+    "pages/aftersale/index",
+    "pages/statistic/index",
+    "pages/noshop/index",
+    "pages/statistic/dateRange",
+    "pages/statistic/statisticNav",
+    "pages/bill/index",
+    "pages/bill/billDetail",
+    "pages/fund/withdrawAccount",
+    "pages/fund/withdrawApply",
+    "pages/fund/withdrawAccountEdit",
+    "pages/fund/addWithdrawApply"
+  ],
+  "window": {
+    "backgroundTextStyle": "light",
+    "navigationBarBackgroundColor": "#fff",
+    "navigationBarTitleText": "WeChat",
+    "navigationBarTextStyle": "black"
+  },
+  "sitemapLocation": "sitemap.json",
+  "usingComponents": {
+    "wux-cell-group": "./wux/cell-group/index",
+    "wux-cell": "./wux/cell/index",
+    "van-field": "./miniprogram_npm/vant-weapp/field/index",
+    "wux-input": "./wux/input/index",
+    "van-button": "./miniprogram_npm/vant-weapp/button/index",
+    "wux-button": "./wux/button/index",
+    "van-tab": "./miniprogram_npm/vant-weapp/tab/index",
+    "van-tabs": "./miniprogram_npm/vant-weapp/tabs/index",
+    "van-toast": "./miniprogram_npm/vant-weapp/toast/index",
+    "van-panel": "./miniprogram_npm/vant-weapp/panel/index",
+    "van-row": "./miniprogram_npm/vant-weapp/row/index",
+    "van-switch": "./miniprogram_npm/vant-weapp/switch/index",
+    "van-col": "./miniprogram_npm/vant-weapp/col/index",
+    "van-icon": "./miniprogram_npm/vant-weapp/icon/index",
+    "van-popup": "./miniprogram_npm/vant-weapp/popup/index",
+    "van-skeleton": "./miniprogram_npm/vant-weapp/skeleton/index",
+    "van-count-down": "./miniprogram_npm/vant-weapp/count-down/index",
+    "van-sticky": "./miniprogram_npm/vant-weapp/sticky/index",
+    "van-picker": "./miniprogram_npm/vant-weapp/picker/index",
+    "wux-icon": "./wux/icon/index",
+    "wux-row": "./wux/row/index",
+    "wux-col": "./wux/col/index",
+    "wux-toptips": "./wux/toptips/index",
+    "wux-toast": "./wux/toast/index",
+    "wux-loading": "./wux/loading/index",
+    "wux-notification": "./wux/notification/index",
+    "wux-dialog": "./wux/dialog/index",
+    "wux-result": "./wux/result/index",
+    "van-calendar": "./miniprogram_npm/vant-weapp/calendar/index",
+    "van-cell": "./miniprogram_npm/vant-weapp/cell/index",
+    "van-radio": "./miniprogram_npm/vant-weapp/radio/index",
+    "van-radio-group": "./miniprogram_npm/vant-weapp/radio-group/index",
+    "van-cell-group": "./miniprogram_npm/vant-weapp/cell-group/index"
+  }
+}

+ 22 - 0
app.wxss

@@ -0,0 +1,22 @@
+/**app.wxss**/
+@import "/miniprogram_npm/vant-weapp/common/index.wxss";
+@import 'miniprogram_npm/vant-weapp/button/index.wxss';
+@import 'assets/styles/weui.wxss';
+@import 'assets/styles/skyvow.wxss';
+@import 'assets/styles/main.wxss';
+@import 'assets/styles/icon.wxss';
+
+page{
+  color:#323233;
+  font-size: 14px;
+  padding-bottom: 50px;
+}
+.container {
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: space-between;
+  padding: 200rpx 0;
+  box-sizing: border-box;
+} 

File diff suppressed because it is too large
+ 1226 - 0
assets/styles/icon.wxss


File diff suppressed because it is too large
+ 3941 - 0
assets/styles/main.wxss


+ 118 - 0
assets/styles/skyvow.wxss

@@ -0,0 +1,118 @@
+page{
+	width: 100%;
+	/* height: 100%; */
+	position: relative;
+	color: #333;
+    background-color: #f8f8f8;
+    font-size: 16px;
+    /*font-family: -apple-system-font,Helvetica Neue,Helvetica,sans-serif;*/
+    font-family: PingFang SC,Helvetica Neue,Hiragino Sans GB,Helvetica,Microsoft YaHei,Arial;
+    -ms-text-size-adjust: 100%;
+	-webkit-text-size-adjust: 100%;
+	-webkit-tap-highlight-color: transparent;
+}
+
+.page__hd {
+    padding: 40px;
+}
+
+.page__bd {
+    padding-bottom: 40px;
+}
+
+.page__bd_spacing {
+    padding-left: 15px;
+    padding-right: 15px;
+}
+
+.page__ft{
+    padding-bottom: 10px;
+    text-align: center;
+}
+
+.page__title {
+    text-align: left;
+    font-size: 20px;
+    font-weight: 400;
+}
+
+.page__desc {
+    margin-top: 5px;
+    color: #888888;
+    text-align: left;
+    font-size: 14px;
+}
+
+.placeholder {
+    background-color: #ebebef;
+    color: #bbb;
+    text-align: center;
+    height: 30px;
+    line-height: 30px;
+    width: 100%;
+    box-sizing: border-box;
+}
+
+.sub-title {
+    padding: 30rpx 30rpx 18rpx;
+    font-size: 28rpx;
+    color: #888;
+    width: 100%;
+    box-sizing: border-box;
+}
+
+.button-sp-area {
+    margin: 20px auto 0;
+    width: 80%;
+    text-align: center;
+}
+
+.btn-area {
+    margin: 1.17647059em 15px 0.3em;
+}
+
+.btn-area button {
+    margin-bottom: 10px;
+}
+
+.btn-area button:last-child {
+    margin-bottom: 0;
+}
+
+.text-left {
+    text-align: left;
+}
+
+.text-center {
+    text-align: center;
+}
+
+.text-right {
+    text-align: right;
+}
+
+.btn-group {
+    position: relative;
+    z-index: 1010;
+    margin-bottom: 50px;
+}
+
+.logo {
+    padding: 30rpx;
+    text-align: center;
+}
+
+.logo image {
+    width: 200rpx;
+    height: 200rpx;
+}
+
+.logo__text {
+    font-size: 48rpx;
+    font-weight: bold;
+    font-style: italic;
+    background: -webkit-linear-gradient(left, #04BE02 , #2d8cf0);
+    -webkit-background-clip: text;
+    -webkit-text-fill-color: transparent;
+    text-align: center;
+}

File diff suppressed because it is too large
+ 1019 - 0
assets/styles/weui.wxss


+ 71 - 0
custom-tab-bar/index.js

@@ -0,0 +1,71 @@
+// custom-tab-bar/index.js
+const app=getApp()
+Component({
+  /**
+   * 组件的属性列表
+   */
+  properties: {
+
+  },
+
+  /**
+   * 组件的初始数据
+   */
+  data: {
+    active: 0,
+    list: [
+      {
+        icon: 'todo-list-o',
+        text: '订单处理',
+        url: '/pages/index/index'
+      },
+      {
+        icon: 'search',
+        text: '订单查询',
+        url: '/pages/order/index'
+      },
+      {
+        icon:'shop-o',
+        text:'店铺管理',
+        url:'/pages/store/index'
+      },{
+        icon:'contact',
+        text:'我的',
+        url:'/pages/member/index'
+      }
+    ]
+  },
+
+  /**
+   * 组件的方法列表
+   */
+  methods: {
+    onChange(event) {
+      this.setData({ active: event.detail });
+      wx.switchTab({
+        url: this.data.list[event.detail].url
+      });
+    },
+
+    
+
+    init() {
+      const page = getCurrentPages().pop();
+      if(app.globalData.orderNum>0){
+        this.setData({
+          ['list[0].info']:app.globalData.orderNum
+        })
+      }
+      else{
+        let {list}=this.data
+        delete list[0].info
+        this.setData({
+         list:list
+        })
+      }
+      this.setData({
+        active: this.data.list.findIndex(item => item.url === `/${page.route}`)
+      });
+    }
+  }
+})

+ 7 - 0
custom-tab-bar/index.json

@@ -0,0 +1,7 @@
+{
+  "component": true,
+  "usingComponents": {
+    "van-tabbar": "../miniprogram_npm/vant-weapp/tabbar/index",
+    "van-tabbar-item": "../miniprogram_npm/vant-weapp/tabbar-item/index"
+  }
+}

+ 13 - 0
custom-tab-bar/index.wxml

@@ -0,0 +1,13 @@
+<van-tabbar active="{{ active }}" 
+   bind:change="onChange">
+  <van-tabbar-item wx:for="{{ list }}" wx:key="index" icon="{{ item.icon }}" info="{{item.info}}">{{
+    item.text
+  }}</van-tabbar-item>
+</van-tabbar>
+
+ <!-- <wux-tabbar defaultCurrent="{{active}}" bindchange="onChange">
+  <wux-tabbar-item key="{{index}}" data-url="{{item.url}}" title="{{item.text}}" wx:for="{{list}}" wx:key="{{index}}">
+                <wux-icon wux-class="icon" type="{{item.icon}}" size="22" slot="icon-on" />
+                <wux-icon wux-class="icon" type="{{item.icon}}" size="22" slot="icon-off" />
+            </wux-tabbar-item>
+ </wux-tabbar> -->

+ 135 - 0
ec-canvas/ec-canvas.js

@@ -0,0 +1,135 @@
+import WxCanvas from './wx-canvas';
+import * as echarts from './echarts';
+
+let ctx;
+
+Component({
+  properties: {
+    canvasId: {
+      type: String,
+      value: 'ec-canvas'
+    },
+
+    ec: {
+      type: Object
+    }
+  },
+
+  data: {
+
+  },
+
+  ready: function () {
+    if (!this.data.ec) {
+      console.warn('组件需绑定 ec 变量,例:<ec-canvas id="mychart-dom-bar" '
+        + 'canvas-id="mychart-bar" ec="{{ ec }}"></ec-canvas>');
+      return;
+    }
+
+    if (!this.data.ec.lazyLoad) {
+      this.init();
+    }
+  },
+
+  methods: {
+    init: function (callback) {
+      const version = wx.version.version.split('.').map(n => parseInt(n, 10));
+      const isValid = version[0] > 1 || (version[0] === 1 && version[1] > 9)
+        || (version[0] === 1 && version[1] === 9 && version[2] >= 91);
+      if (!isValid) {
+        console.error('微信基础库版本过低,需大于等于 1.9.91。'
+          + '参见:https://github.com/ecomfe/echarts-for-weixin'
+          + '#%E5%BE%AE%E4%BF%A1%E7%89%88%E6%9C%AC%E8%A6%81%E6%B1%82');
+        return;
+      }
+
+      ctx = wx.createCanvasContext(this.data.canvasId, this);
+
+      const canvas = new WxCanvas(ctx, this.data.canvasId);
+
+      echarts.setCanvasCreator(() => {
+        return canvas;
+      });
+
+      var query = wx.createSelectorQuery().in(this);
+      query.select('.ec-canvas').boundingClientRect(res => {
+        if (typeof callback === 'function') {
+          this.chart = callback(canvas, res.width, res.height);
+        }
+        else if (this.data.ec && typeof this.data.ec.onInit === 'function') {
+          this.chart = this.data.ec.onInit(canvas, res.width, res.height);
+        }
+        else {
+          this.triggerEvent('init', {
+            canvas: canvas,
+            width: res.width,
+            height: res.height
+          });
+        }
+      }).exec();
+    },
+
+    canvasToTempFilePath(opt) {
+      if (!opt.canvasId) {
+        opt.canvasId = this.data.canvasId;
+      }
+
+      ctx.draw(true, () => {
+        wx.canvasToTempFilePath(opt, this);
+      });
+    },
+
+    touchStart(e) {
+      if (this.chart && e.touches.length > 0) {
+        var touch = e.touches[0];
+        var handler = this.chart.getZr().handler;
+        handler.dispatch('mousedown', {
+          zrX: touch.x,
+          zrY: touch.y
+        });
+        handler.dispatch('mousemove', {
+          zrX: touch.x,
+          zrY: touch.y
+        });
+        handler.processGesture(wrapTouch(e), 'start');
+      }
+    },
+
+    touchMove(e) {
+      if (this.chart && e.touches.length > 0) {
+        var touch = e.touches[0];
+        var handler = this.chart.getZr().handler;
+        handler.dispatch('mousemove', {
+          zrX: touch.x,
+          zrY: touch.y
+        });
+        handler.processGesture(wrapTouch(e), 'change');
+      }
+    },
+
+    touchEnd(e) {
+      if (this.chart) {
+        const touch = e.changedTouches ? e.changedTouches[0] : {};
+        var handler = this.chart.getZr().handler;
+        handler.dispatch('mouseup', {
+          zrX: touch.x,
+          zrY: touch.y
+        });
+        handler.dispatch('click', {
+          zrX: touch.x,
+          zrY: touch.y
+        });
+        handler.processGesture(wrapTouch(e), 'end');
+      }
+    }
+  }
+});
+
+function wrapTouch(event) {
+  for (let i = 0; i < event.touches.length; ++i) {
+    const touch = event.touches[i];
+    touch.offsetX = touch.x;
+    touch.offsetY = touch.y;
+  }
+  return event;
+}

+ 4 - 0
ec-canvas/ec-canvas.json

@@ -0,0 +1,4 @@
+{
+  "component": true,
+  "usingComponents": {}
+}

+ 4 - 0
ec-canvas/ec-canvas.wxml

@@ -0,0 +1,4 @@
+<canvas class="ec-canvas" canvas-id="{{ canvasId }}"
+bindinit="init"
+bindtouchstart="{{ ec.disableTouch ? '' : 'touchStart' }}" bindtouchmove="{{ ec.disableTouch ? '' : 'touchMove' }}" bindtouchend="{{ ec.disableTouch ? '' : 'touchEnd' }}">
+</canvas>

+ 4 - 0
ec-canvas/ec-canvas.wxss

@@ -0,0 +1,4 @@
+.ec-canvas {
+  width: 100%;
+  height: 100%;
+}

File diff suppressed because it is too large
+ 12 - 0
ec-canvas/echarts.js


+ 97 - 0
ec-canvas/wx-canvas.js

@@ -0,0 +1,97 @@
+export default class WxCanvas {
+  constructor(ctx, canvasId) {
+    this.ctx = ctx;
+    this.canvasId = canvasId;
+    this.chart = null;
+
+    // this._initCanvas(zrender, ctx);
+    this._initStyle(ctx);
+    this._initEvent();
+  }
+
+  getContext(contextType) {
+    if (contextType === '2d') {
+      return this.ctx;
+    }
+  }
+
+  // canvasToTempFilePath(opt) {
+  //   if (!opt.canvasId) {
+  //     opt.canvasId = this.canvasId;
+  //   }
+
+  //   return wx.canvasToTempFilePath(opt, this);
+  // }
+
+  setChart(chart) {
+    this.chart = chart;
+  }
+
+  attachEvent () {
+    // noop
+  }
+
+  detachEvent() {
+    // noop
+  }
+
+  _initCanvas(zrender, ctx) {
+    zrender.util.getContext = function () {
+      return ctx;
+    };
+
+    zrender.util.$override('measureText', function (text, font) {
+      ctx.font = font || '12px sans-serif';
+      return ctx.measureText(text);
+    });
+  }
+
+  _initStyle(ctx) {
+    var styles = ['fillStyle', 'strokeStyle', 'globalAlpha', 
+      'textAlign', 'textBaseAlign', 'shadow', 'lineWidth',
+      'lineCap', 'lineJoin', 'lineDash', 'miterLimit', 'fontSize'];
+
+    styles.forEach(style => {
+      Object.defineProperty(ctx, style, {
+        set: value => {
+          if (style !== 'fillStyle' && style !== 'strokeStyle' 
+            || value !== 'none' && value !== null
+          ) {
+            ctx['set' + style.charAt(0).toUpperCase() + style.slice(1)](value);
+          }
+        }
+      });
+    });
+
+    ctx.createRadialGradient = () => {
+      return ctx.createCircularGradient(arguments);
+    };
+  }
+
+  _initEvent() {
+    this.event = {};
+    const eventNames = [{
+      wxName: 'touchStart',
+      ecName: 'mousedown'
+    }, {
+      wxName: 'touchMove',
+      ecName: 'mousemove'
+    }, {
+      wxName: 'touchEnd',
+      ecName: 'mouseup'
+    }, {
+      wxName: 'touchEnd',
+      ecName: 'click'
+    }];
+
+    eventNames.forEach(name => {
+      this.event[name.wxName] = e => {
+        const touch = e.touches[0];
+        this.chart.getZr().handler.dispatch(name.ecName, {
+          zrX: name.wxName === 'tap' ? touch.clientX : touch.x,
+          zrY: name.wxName === 'tap' ? touch.clientY : touch.y
+        });
+      };
+    });
+  }
+}

+ 18 - 0
lib/formats.js

@@ -0,0 +1,18 @@
+'use strict';
+
+var replace = String.prototype.replace;
+var percentTwenties = /%20/g;
+
+module.exports = {
+    'default': 'RFC3986',
+    formatters: {
+        RFC1738: function (value) {
+            return replace.call(value, percentTwenties, '+');
+        },
+        RFC3986: function (value) {
+            return value;
+        }
+    },
+    RFC1738: 'RFC1738',
+    RFC3986: 'RFC3986'
+};

+ 10 - 0
lib/index.js

@@ -0,0 +1,10 @@
+'use strict'
+var stringify = require('./stringify');
+var parse = require('./parse');
+var formats = require('./formats');
+
+module.exports = {
+    formats: formats,
+    parse: parse,
+    stringify: stringify
+};

+ 174 - 0
lib/parse.js

@@ -0,0 +1,174 @@
+'use strict';
+
+var utils = require('./utils');
+
+var has = Object.prototype.hasOwnProperty;
+
+var defaults = {
+    allowDots: false,
+    allowPrototypes: false,
+    arrayLimit: 20,
+    decoder: utils.decode,
+    delimiter: '&',
+    depth: 5,
+    parameterLimit: 1000,
+    plainObjects: false,
+    strictNullHandling: false
+};
+
+var parseValues = function parseQueryStringValues(str, options) {
+    var obj = {};
+    var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str;
+    var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;
+    var parts = cleanStr.split(options.delimiter, limit);
+
+    for (var i = 0; i < parts.length; ++i) {
+        var part = parts[i];
+
+        var bracketEqualsPos = part.indexOf(']=');
+        var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;
+
+        var key, val;
+        if (pos === -1) {
+            key = options.decoder(part, defaults.decoder);
+            val = options.strictNullHandling ? null : '';
+        } else {
+            key = options.decoder(part.slice(0, pos), defaults.decoder);
+            val = options.decoder(part.slice(pos + 1), defaults.decoder);
+        }
+        if (has.call(obj, key)) {
+            obj[key] = [].concat(obj[key]).concat(val);
+        } else {
+            obj[key] = val;
+        }
+    }
+
+    return obj;
+};
+
+var parseObject = function (chain, val, options) {
+    var leaf = val;
+
+    for (var i = chain.length - 1; i >= 0; --i) {
+        var obj;
+        var root = chain[i];
+
+        if (root === '[]') {
+            obj = [];
+            obj = obj.concat(leaf);
+        } else {
+            obj = options.plainObjects ? Object.create(null) : {};
+            var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;
+            var index = parseInt(cleanRoot, 10);
+            if (
+                !isNaN(index)
+                && root !== cleanRoot
+                && String(index) === cleanRoot
+                && index >= 0
+                && (options.parseArrays && index <= options.arrayLimit)
+            ) {
+                obj = [];
+                obj[index] = leaf;
+            } else {
+                obj[cleanRoot] = leaf;
+            }
+        }
+
+        leaf = obj;
+    }
+
+    return leaf;
+};
+
+var parseKeys = function parseQueryStringKeys(givenKey, val, options) {
+    if (!givenKey) {
+        return;
+    }
+
+    // Transform dot notation to bracket notation
+    var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey;
+
+    // The regex chunks
+
+    var brackets = /(\[[^[\]]*])/;
+    var child = /(\[[^[\]]*])/g;
+
+    // Get the parent
+
+    var segment = brackets.exec(key);
+    var parent = segment ? key.slice(0, segment.index) : key;
+
+    // Stash the parent if it exists
+
+    var keys = [];
+    if (parent) {
+        // If we aren't using plain objects, optionally prefix keys
+        // that would overwrite object prototype properties
+        if (!options.plainObjects && has.call(Object.prototype, parent)) {
+            if (!options.allowPrototypes) {
+                return;
+            }
+        }
+
+        keys.push(parent);
+    }
+
+    // Loop through children appending to the array until we hit depth
+
+    var i = 0;
+    while ((segment = child.exec(key)) !== null && i < options.depth) {
+        i += 1;
+        if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {
+            if (!options.allowPrototypes) {
+                return;
+            }
+        }
+        keys.push(segment[1]);
+    }
+
+    // If there's a remainder, just add whatever is left
+
+    if (segment) {
+        keys.push('[' + key.slice(segment.index) + ']');
+    }
+
+    return parseObject(keys, val, options);
+};
+
+module.exports = function (str, opts) {
+    var options = opts ? utils.assign({}, opts) : {};
+
+    if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') {
+        throw new TypeError('Decoder has to be a function.');
+    }
+
+    options.ignoreQueryPrefix = options.ignoreQueryPrefix === true;
+    options.delimiter = typeof options.delimiter === 'string' || utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter;
+    options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth;
+    options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit;
+    options.parseArrays = options.parseArrays !== false;
+    options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder;
+    options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots;
+    options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects;
+    options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes;
+    options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit;
+    options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;
+
+    if (str === '' || str === null || typeof str === 'undefined') {
+        return options.plainObjects ? Object.create(null) : {};
+    }
+
+    var tempObj = typeof str === 'string' ? parseValues(str, options) : str;
+    var obj = options.plainObjects ? Object.create(null) : {};
+
+    // Iterate over the keys and setup the new object
+
+    var keys = Object.keys(tempObj);
+    for (var i = 0; i < keys.length; ++i) {
+        var key = keys[i];
+        var newObj = parseKeys(key, tempObj[key], options);
+        obj = utils.merge(obj, newObj, options);
+    }
+
+    return utils.compact(obj);
+};

+ 210 - 0
lib/stringify.js

@@ -0,0 +1,210 @@
+'use strict';
+
+var utils = require('./utils');
+var formats = require('./formats');
+
+var arrayPrefixGenerators = {
+    brackets: function brackets(prefix) { // eslint-disable-line func-name-matching
+        return prefix + '[]';
+    },
+    indices: function indices(prefix, key) { // eslint-disable-line func-name-matching
+        return prefix + '[' + key + ']';
+    },
+    repeat: function repeat(prefix) { // eslint-disable-line func-name-matching
+        return prefix;
+    }
+};
+
+var toISO = Date.prototype.toISOString;
+
+var defaults = {
+    delimiter: '&',
+    encode: true,
+    encoder: utils.encode,
+    encodeValuesOnly: false,
+    serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching
+        return toISO.call(date);
+    },
+    skipNulls: false,
+    strictNullHandling: false
+};
+
+var stringify = function stringify( // eslint-disable-line func-name-matching
+    object,
+    prefix,
+    generateArrayPrefix,
+    strictNullHandling,
+    skipNulls,
+    encoder,
+    filter,
+    sort,
+    allowDots,
+    serializeDate,
+    formatter,
+    encodeValuesOnly
+) {
+    var obj = object;
+    if (typeof filter === 'function') {
+        obj = filter(prefix, obj);
+    } else if (obj instanceof Date) {
+        obj = serializeDate(obj);
+    } else if (obj === null) {
+        if (strictNullHandling) {
+            return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder) : prefix;
+        }
+
+        obj = '';
+    }
+
+    if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) {
+        if (encoder) {
+            var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder);
+            return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder))];
+        }
+        return [formatter(prefix) + '=' + formatter(String(obj))];
+    }
+
+    var values = [];
+
+    if (typeof obj === 'undefined') {
+        return values;
+    }
+
+    var objKeys;
+    if (Array.isArray(filter)) {
+        objKeys = filter;
+    } else {
+        var keys = Object.keys(obj);
+        objKeys = sort ? keys.sort(sort) : keys;
+    }
+
+    for (var i = 0; i < objKeys.length; ++i) {
+        var key = objKeys[i];
+
+        if (skipNulls && obj[key] === null) {
+            continue;
+        }
+
+        if (Array.isArray(obj)) {
+            values = values.concat(stringify(
+                obj[key],
+                generateArrayPrefix(prefix, key),
+                generateArrayPrefix,
+                strictNullHandling,
+                skipNulls,
+                encoder,
+                filter,
+                sort,
+                allowDots,
+                serializeDate,
+                formatter,
+                encodeValuesOnly
+            ));
+        } else {
+            values = values.concat(stringify(
+                obj[key],
+                prefix + (allowDots ? '.' + key : '[' + key + ']'),
+                generateArrayPrefix,
+                strictNullHandling,
+                skipNulls,
+                encoder,
+                filter,
+                sort,
+                allowDots,
+                serializeDate,
+                formatter,
+                encodeValuesOnly
+            ));
+        }
+    }
+
+    return values;
+};
+
+module.exports = function (object, opts) {
+    var obj = object;
+    var options = opts ? utils.assign({}, opts) : {};
+
+    if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') {
+        throw new TypeError('Encoder has to be a function.');
+    }
+
+    var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter;
+    var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;
+    var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls;
+    var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode;
+    var encoder = typeof options.encoder === 'function' ? options.encoder : defaults.encoder;
+    var sort = typeof options.sort === 'function' ? options.sort : null;
+    var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots;
+    var serializeDate = typeof options.serializeDate === 'function' ? options.serializeDate : defaults.serializeDate;
+    var encodeValuesOnly = typeof options.encodeValuesOnly === 'boolean' ? options.encodeValuesOnly : defaults.encodeValuesOnly;
+    if (typeof options.format === 'undefined') {
+        options.format = formats['default'];
+    } else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) {
+        throw new TypeError('Unknown format option provided.');
+    }
+    var formatter = formats.formatters[options.format];
+    var objKeys;
+    var filter;
+
+    if (typeof options.filter === 'function') {
+        filter = options.filter;
+        obj = filter('', obj);
+    } else if (Array.isArray(options.filter)) {
+        filter = options.filter;
+        objKeys = filter;
+    }
+
+    var keys = [];
+
+    if (typeof obj !== 'object' || obj === null) {
+        return '';
+    }
+
+    var arrayFormat;
+    if (options.arrayFormat in arrayPrefixGenerators) {
+        arrayFormat = options.arrayFormat;
+    } else if ('indices' in options) {
+        arrayFormat = options.indices ? 'indices' : 'repeat';
+    } else {
+        arrayFormat = 'indices';
+    }
+
+    var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];
+
+    if (!objKeys) {
+        objKeys = Object.keys(obj);
+    }
+
+    if (sort) {
+        objKeys.sort(sort);
+    }
+
+    for (var i = 0; i < objKeys.length; ++i) {
+        var key = objKeys[i];
+
+        if (skipNulls && obj[key] === null) {
+            continue;
+        }
+
+        keys = keys.concat(stringify(
+            obj[key],
+            key,
+            generateArrayPrefix,
+            strictNullHandling,
+            skipNulls,
+            encode ? encoder : null,
+            filter,
+            sort,
+            allowDots,
+            serializeDate,
+            formatter,
+            encodeValuesOnly
+        ));
+    }
+
+    var joined = keys.join(delimiter);
+    var prefix = options.addQueryPrefix === true ? '?' : '';
+
+    return joined.length > 0 ? prefix + joined : '';
+};

+ 213 - 0
lib/utils.js

@@ -0,0 +1,213 @@
+'use strict';
+
+var has = Object.prototype.hasOwnProperty;
+
+var hexTable = (function () {
+    var array = [];
+    for (var i = 0; i < 256; ++i) {
+        array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());
+    }
+
+    return array;
+}());
+
+var compactQueue = function compactQueue(queue) {
+    var obj;
+
+    while (queue.length) {
+        var item = queue.pop();
+        obj = item.obj[item.prop];
+
+        if (Array.isArray(obj)) {
+            var compacted = [];
+
+            for (var j = 0; j < obj.length; ++j) {
+                if (typeof obj[j] !== 'undefined') {
+                    compacted.push(obj[j]);
+                }
+            }
+
+            item.obj[item.prop] = compacted;
+        }
+    }
+
+    return obj;
+};
+
+var arrayToObject = function arrayToObject(source, options) {
+    var obj = options && options.plainObjects ? Object.create(null) : {};
+    for (var i = 0; i < source.length; ++i) {
+        if (typeof source[i] !== 'undefined') {
+            obj[i] = source[i];
+        }
+    }
+
+    return obj;
+};
+
+var merge = function merge(target, source, options) {
+    if (!source) {
+        return target;
+    }
+
+    if (typeof source !== 'object') {
+        if (Array.isArray(target)) {
+            target.push(source);
+        } else if (typeof target === 'object') {
+            if (options.plainObjects || options.allowPrototypes || !has.call(Object.prototype, source)) {
+                target[source] = true;
+            }
+        } else {
+            return [target, source];
+        }
+
+        return target;
+    }
+
+    if (typeof target !== 'object') {
+        return [target].concat(source);
+    }
+
+    var mergeTarget = target;
+    if (Array.isArray(target) && !Array.isArray(source)) {
+        mergeTarget = arrayToObject(target, options);
+    }
+
+    if (Array.isArray(target) && Array.isArray(source)) {
+        source.forEach(function (item, i) {
+            if (has.call(target, i)) {
+                if (target[i] && typeof target[i] === 'object') {
+                    target[i] = merge(target[i], item, options);
+                } else {
+                    target.push(item);
+                }
+            } else {
+                target[i] = item;
+            }
+        });
+        return target;
+    }
+
+    return Object.keys(source).reduce(function (acc, key) {
+        var value = source[key];
+
+        if (has.call(acc, key)) {
+            acc[key] = merge(acc[key], value, options);
+        } else {
+            acc[key] = value;
+        }
+        return acc;
+    }, mergeTarget);
+};
+
+var assign = function assignSingleSource(target, source) {
+    return Object.keys(source).reduce(function (acc, key) {
+        acc[key] = source[key];
+        return acc;
+    }, target);
+};
+
+var decode = function (str) {
+    try {
+        return decodeURIComponent(str.replace(/\+/g, ' '));
+    } catch (e) {
+        return str;
+    }
+};
+
+var encode = function encode(str) {
+    // This code was originally written by Brian White (mscdex) for the io.js core querystring library.
+    // It has been adapted here for stricter adherence to RFC 3986
+    if (str.length === 0) {
+        return str;
+    }
+
+    var string = typeof str === 'string' ? str : String(str);
+
+    var out = '';
+    for (var i = 0; i < string.length; ++i) {
+        var c = string.charCodeAt(i);
+
+        if (
+            c === 0x2D // -
+            || c === 0x2E // .
+            || c === 0x5F // _
+            || c === 0x7E // ~
+            || (c >= 0x30 && c <= 0x39) // 0-9
+            || (c >= 0x41 && c <= 0x5A) // a-z
+            || (c >= 0x61 && c <= 0x7A) // A-Z
+        ) {
+            out += string.charAt(i);
+            continue;
+        }
+
+        if (c < 0x80) {
+            out = out + hexTable[c];
+            continue;
+        }
+
+        if (c < 0x800) {
+            out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);
+            continue;
+        }
+
+        if (c < 0xD800 || c >= 0xE000) {
+            out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);
+            continue;
+        }
+
+        i += 1;
+        c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));
+        out += hexTable[0xF0 | (c >> 18)]
+            + hexTable[0x80 | ((c >> 12) & 0x3F)]
+            + hexTable[0x80 | ((c >> 6) & 0x3F)]
+            + hexTable[0x80 | (c & 0x3F)];
+    }
+
+    return out;
+};
+
+var compact = function compact(value) {
+    var queue = [{ obj: { o: value }, prop: 'o' }];
+    var refs = [];
+
+    for (var i = 0; i < queue.length; ++i) {
+        var item = queue[i];
+        var obj = item.obj[item.prop];
+
+        var keys = Object.keys(obj);
+        for (var j = 0; j < keys.length; ++j) {
+            var key = keys[j];
+            var val = obj[key];
+            if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {
+                queue.push({ obj: obj, prop: key });
+                refs.push(val);
+            }
+        }
+    }
+
+    return compactQueue(queue);
+};
+
+var isRegExp = function isRegExp(obj) {
+    return Object.prototype.toString.call(obj) === '[object RegExp]';
+};
+
+var isBuffer = function isBuffer(obj) {
+    if (obj === null || typeof obj === 'undefined') {
+        return false;
+    }
+
+    return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));
+};
+
+module.exports = {
+    arrayToObject: arrayToObject,
+    assign: assign,
+    compact: compact,
+    decode: decode,
+    encode: encode,
+    isBuffer: isBuffer,
+    isRegExp: isRegExp,
+    merge: merge
+};

+ 1 - 0
miniprogram_npm/vant-weapp/action-sheet/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 62 - 0
miniprogram_npm/vant-weapp/action-sheet/index.js

@@ -0,0 +1,62 @@
+import { VantComponent } from '../common/component';
+import { button } from '../mixins/button';
+import { openType } from '../mixins/open-type';
+VantComponent({
+  mixins: [button, openType],
+  props: {
+    show: Boolean,
+    title: String,
+    cancelText: String,
+    description: String,
+    round: {
+      type: Boolean,
+      value: true,
+    },
+    zIndex: {
+      type: Number,
+      value: 100,
+    },
+    actions: {
+      type: Array,
+      value: [],
+    },
+    overlay: {
+      type: Boolean,
+      value: true,
+    },
+    closeOnClickOverlay: {
+      type: Boolean,
+      value: true,
+    },
+    closeOnClickAction: {
+      type: Boolean,
+      value: true,
+    },
+    safeAreaInsetBottom: {
+      type: Boolean,
+      value: true,
+    },
+  },
+  methods: {
+    onSelect(event) {
+      const { index } = event.currentTarget.dataset;
+      const item = this.data.actions[index];
+      if (item && !item.disabled && !item.loading) {
+        this.$emit('select', item);
+        if (this.data.closeOnClickAction) {
+          this.onClose();
+        }
+      }
+    },
+    onCancel() {
+      this.$emit('cancel');
+    },
+    onClose() {
+      this.$emit('close');
+    },
+    onClickOverlay() {
+      this.$emit('click-overlay');
+      this.onClose();
+    },
+  },
+});

+ 8 - 0
miniprogram_npm/vant-weapp/action-sheet/index.json

@@ -0,0 +1,8 @@
+{
+  "component": true,
+  "usingComponents": {
+    "van-icon": "../icon/index",
+    "van-popup": "../popup/index",
+    "van-loading": "../loading/index"
+  }
+}

+ 67 - 0
miniprogram_npm/vant-weapp/action-sheet/index.wxml

@@ -0,0 +1,67 @@
+<wxs src="../wxs/utils.wxs" module="utils" />
+
+<van-popup
+  show="{{ show }}"
+  position="bottom"
+  round="{{ round }}"
+  z-index="{{ zIndex }}"
+  overlay="{{ overlay }}"
+  custom-class="van-action-sheet"
+  safe-area-inset-bottom="{{ safeAreaInsetBottom }}"
+  close-on-click-overlay="{{ closeOnClickOverlay }}"
+  bind:close="onClickOverlay"
+>
+  <view wx:if="{{ title }}" class="van-hairline--bottom van-action-sheet__header">
+    {{ title }}
+    <van-icon
+      name="close"
+      custom-class="van-action-sheet__close"
+      bind:click="onClose"
+    />
+  </view>
+  <view wx:if="{{ description }}" class="van-action-sheet__description">
+    {{ description }}
+  </view>
+  <view wx:if="{{ actions && actions.length }}">
+    <!-- button外包一层view,防止actions动态变化,导致渲染时button被打散 -->
+    <button
+      wx:for="{{ actions }}"
+      wx:key="index"
+      open-type="{{ item.openType }}"
+      style="{{ item.color ? 'color: ' + item.color : '' }}"
+      class="{{ utils.bem('action-sheet__item', { disabled: item.disabled || item.loading }) }} van-hairline--top {{ item.className || '' }}"
+      hover-class="van-action-sheet__item--hover"
+      data-index="{{ index }}"
+      bind:tap="onSelect"
+      bindgetuserinfo="bindGetUserInfo"
+      bindcontact="bindContact"
+      bindgetphonenumber="bindGetPhoneNumber"
+      binderror="bindError"
+      bindlaunchapp="bindLaunchApp"
+      bindopensetting="bindOpenSetting"
+      lang="{{ lang }}"
+      session-from="{{ sessionFrom }}"
+      send-message-title="{{ sendMessageTitle }}"
+      send-message-path="{{ sendMessagePath }}"
+      send-message-img="{{ sendMessageImg }}"
+      show-message-card="{{ showMessageCard }}"
+      app-parameter="{{ appParameter }}"
+    >
+      <block wx:if="{{ !item.loading }}">
+        {{ item.name }}
+        <text wx:if="{{ item.subname }}" class="van-action-sheet__subname" >{{ item.subname }}</text>
+      </block>
+      <van-loading wx:else custom-class="van-action-sheet__loading" size="20px" />
+    </button>
+  </view>
+  <slot />
+  <view
+    wx:if="{{ cancelText }}"
+    class="van-action-sheet__cancel"
+    hover-class="van-action-sheet__cancel--hover"
+    hover-stay-time="70"
+    bind:tap="onCancel"
+  >
+    {{ cancelText }}
+  </view>
+</van-popup>

File diff suppressed because it is too large
+ 1 - 0
miniprogram_npm/vant-weapp/action-sheet/index.wxss


+ 1 - 0
miniprogram_npm/vant-weapp/area/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 229 - 0
miniprogram_npm/vant-weapp/area/index.js

@@ -0,0 +1,229 @@
+import { VantComponent } from '../common/component';
+import { pickerProps } from '../picker/shared';
+const COLUMNSPLACEHOLDERCODE = '000000';
+VantComponent({
+  classes: ['active-class', 'toolbar-class', 'column-class'],
+  props: Object.assign(Object.assign({}, pickerProps), {
+    value: {
+      type: String,
+      observer(value) {
+        this.code = value;
+        this.setValues();
+      },
+    },
+    areaList: {
+      type: Object,
+      value: {},
+      observer: 'setValues',
+    },
+    columnsNum: {
+      type: null,
+      value: 3,
+      observer(value) {
+        this.setData({
+          displayColumns: this.data.columns.slice(0, +value),
+        });
+      },
+    },
+    columnsPlaceholder: {
+      type: Array,
+      observer(val) {
+        this.setData({
+          typeToColumnsPlaceholder: {
+            province: val[0] || '',
+            city: val[1] || '',
+            county: val[2] || '',
+          },
+        });
+      },
+    },
+  }),
+  data: {
+    columns: [{ values: [] }, { values: [] }, { values: [] }],
+    displayColumns: [{ values: [] }, { values: [] }, { values: [] }],
+    typeToColumnsPlaceholder: {},
+  },
+  mounted() {
+    setTimeout(() => {
+      this.setValues();
+    }, 0);
+  },
+  methods: {
+    getPicker() {
+      if (this.picker == null) {
+        this.picker = this.selectComponent('.van-area__picker');
+      }
+      return this.picker;
+    },
+    onCancel(event) {
+      this.emit('cancel', event.detail);
+    },
+    onConfirm(event) {
+      const { index } = event.detail;
+      let { value } = event.detail;
+      value = this.parseOutputValues(value);
+      this.emit('confirm', { value, index });
+    },
+    emit(type, detail) {
+      detail.values = detail.value;
+      delete detail.value;
+      this.$emit(type, detail);
+    },
+    // parse output columns data
+    parseOutputValues(values) {
+      const { columnsPlaceholder } = this.data;
+      return values.map((value, index) => {
+        // save undefined value
+        if (!value) return value;
+        value = JSON.parse(JSON.stringify(value));
+        if (!value.code || value.name === columnsPlaceholder[index]) {
+          value.code = '';
+          value.name = '';
+        }
+        return value;
+      });
+    },
+    onChange(event) {
+      const { index, picker, value } = event.detail;
+      this.code = value[index].code;
+      this.setValues().then(() => {
+        this.$emit('change', {
+          picker,
+          values: this.parseOutputValues(picker.getValues()),
+          index,
+        });
+      });
+    },
+    getConfig(type) {
+      const { areaList } = this.data;
+      return (areaList && areaList[`${type}_list`]) || {};
+    },
+    getList(type, code) {
+      const { typeToColumnsPlaceholder } = this.data;
+      let result = [];
+      if (type !== 'province' && !code) {
+        return result;
+      }
+      const list = this.getConfig(type);
+      result = Object.keys(list).map((code) => ({
+        code,
+        name: list[code],
+      }));
+      if (code) {
+        // oversea code
+        if (code[0] === '9' && type === 'city') {
+          code = '9';
+        }
+        result = result.filter((item) => item.code.indexOf(code) === 0);
+      }
+      if (typeToColumnsPlaceholder[type] && result.length) {
+        // set columns placeholder
+        const codeFill =
+          type === 'province'
+            ? ''
+            : type === 'city'
+            ? COLUMNSPLACEHOLDERCODE.slice(2, 4)
+            : COLUMNSPLACEHOLDERCODE.slice(4, 6);
+        result.unshift({
+          code: `${code}${codeFill}`,
+          name: typeToColumnsPlaceholder[type],
+        });
+      }
+      return result;
+    },
+    getIndex(type, code) {
+      let compareNum = type === 'province' ? 2 : type === 'city' ? 4 : 6;
+      const list = this.getList(type, code.slice(0, compareNum - 2));
+      // oversea code
+      if (code[0] === '9' && type === 'province') {
+        compareNum = 1;
+      }
+      code = code.slice(0, compareNum);
+      for (let i = 0; i < list.length; i++) {
+        if (list[i].code.slice(0, compareNum) === code) {
+          return i;
+        }
+      }
+      return 0;
+    },
+    setValues() {
+      const county = this.getConfig('county');
+      let { code } = this;
+      if (!code) {
+        if (this.data.columnsPlaceholder.length) {
+          code = COLUMNSPLACEHOLDERCODE;
+        } else if (Object.keys(county)[0]) {
+          code = Object.keys(county)[0];
+        } else {
+          code = '';
+        }
+      }
+      const province = this.getList('province');
+      const city = this.getList('city', code.slice(0, 2));
+      const picker = this.getPicker();
+      if (!picker) {
+        return;
+      }
+      const stack = [];
+      const indexes = [];
+      const { columnsNum } = this.data;
+      if (columnsNum >= 1) {
+        stack.push(picker.setColumnValues(0, province, false));
+        indexes.push(this.getIndex('province', code));
+      }
+      if (columnsNum >= 2) {
+        stack.push(picker.setColumnValues(1, city, false));
+        indexes.push(this.getIndex('city', code));
+        if (city.length && code.slice(2, 4) === '00') {
+          [{ code }] = city;
+        }
+      }
+      if (columnsNum === 3) {
+        stack.push(
+          picker.setColumnValues(
+            2,
+            this.getList('county', code.slice(0, 4)),
+            false
+          )
+        );
+        indexes.push(this.getIndex('county', code));
+      }
+      return Promise.all(stack)
+        .catch(() => {})
+        .then(() => picker.setIndexes(indexes))
+        .catch(() => {});
+    },
+    getValues() {
+      const picker = this.getPicker();
+      return picker ? picker.getValues().filter((value) => !!value) : [];
+    },
+    getDetail() {
+      const values = this.getValues();
+      const area = {
+        code: '',
+        country: '',
+        province: '',
+        city: '',
+        county: '',
+      };
+      if (!values.length) {
+        return area;
+      }
+      const names = values.map((item) => item.name);
+      area.code = values[values.length - 1].code;
+      if (area.code[0] === '9') {
+        area.country = names[1] || '';
+        area.province = names[2] || '';
+      } else {
+        area.province = names[0] || '';
+        area.city = names[1] || '';
+        area.county = names[2] || '';
+      }
+      return area;
+    },
+    reset(code) {
+      this.code = code || '';
+      return this.setValues();
+    },
+  },
+});

+ 6 - 0
miniprogram_npm/vant-weapp/area/index.json

@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "van-picker": "../picker/index"
+  }
+}

+ 18 - 0
miniprogram_npm/vant-weapp/area/index.wxml

@@ -0,0 +1,18 @@
+<van-picker
+  class="van-area__picker"
+  active-class="active-class"
+  toolbar-class="toolbar-class"
+  column-class="column-class"
+  show-toolbar
+  value-key="name"
+  title="{{ title }}"
+  loading="{{ loading }}"
+  columns="{{ displayColumns }}"
+  item-height="{{ itemHeight }}"
+  visible-item-count="{{ visibleItemCount }}"
+  cancel-button-text="{{ cancelButtonText }}"
+  confirm-button-text="{{ confirmButtonText }}"
+  bind:change="onChange"
+  bind:confirm="onConfirm"
+  bind:cancel="onCancel"
+/>

+ 1 - 0
miniprogram_npm/vant-weapp/area/index.wxss

@@ -0,0 +1 @@
+@import '../common/index.wxss';

+ 1 - 0
miniprogram_npm/vant-weapp/button/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 79 - 0
miniprogram_npm/vant-weapp/button/index.js

@@ -0,0 +1,79 @@
+import { VantComponent } from '../common/component';
+import { button } from '../mixins/button';
+import { openType } from '../mixins/open-type';
+import { canIUseFormFieldButton } from '../common/version';
+const mixins = [button, openType];
+if (canIUseFormFieldButton()) {
+  mixins.push('wx://form-field-button');
+}
+VantComponent({
+  mixins,
+  classes: ['hover-class', 'loading-class'],
+  data: {
+    baseStyle: '',
+  },
+  props: {
+    formType: String,
+    icon: String,
+    classPrefix: {
+      type: String,
+      value: 'van-icon',
+    },
+    plain: Boolean,
+    block: Boolean,
+    round: Boolean,
+    square: Boolean,
+    loading: Boolean,
+    hairline: Boolean,
+    disabled: Boolean,
+    loadingText: String,
+    customStyle: String,
+    loadingType: {
+      type: String,
+      value: 'circular',
+    },
+    type: {
+      type: String,
+      value: 'default',
+    },
+    dataset: null,
+    size: {
+      type: String,
+      value: 'normal',
+    },
+    loadingSize: {
+      type: String,
+      value: '20px',
+    },
+    color: {
+      type: String,
+      observer(color) {
+        let style = '';
+        if (color) {
+          style += `color: ${this.data.plain ? color : 'white'};`;
+          if (!this.data.plain) {
+            // Use background instead of backgroundColor to make linear-gradient work
+            style += `background: ${color};`;
+          }
+          // hide border when color is linear-gradient
+          if (color.indexOf('gradient') !== -1) {
+            style += 'border: 0;';
+          } else {
+            style += `border-color: ${color};`;
+          }
+        }
+        if (style !== this.data.baseStyle) {
+          this.setData({ baseStyle: style });
+        }
+      },
+    },
+  },
+  methods: {
+    onClick() {
+      if (!this.data.loading) {
+        this.$emit('click');
+      }
+    },
+    noop() {},
+  },
+});

+ 7 - 0
miniprogram_npm/vant-weapp/button/index.json

@@ -0,0 +1,7 @@
+{
+  "component": true,
+  "usingComponents": {
+    "van-icon": "../icon/index",
+    "van-loading": "../loading/index"
+  }
+}

+ 68 - 0
miniprogram_npm/vant-weapp/button/index.wxml

@@ -0,0 +1,68 @@
+<wxs src="../wxs/utils.wxs" module="utils" />
+
+<button
+  id="{{ id }}"
+  data-detail="{{ dataset }}"
+  class="custom-class {{ utils.bem('button', [type, size, { block, round, plain, square, loading, disabled, hairline, unclickable: disabled || loading }]) }} {{ hairline ? 'van-hairline--surround' : '' }}"
+  hover-class="van-button--active hover-class"
+  lang="{{ lang }}"
+  form-type="{{ formType }}"
+  style="{{ baseStyle }} {{ customStyle }}"
+  open-type="{{ disabled ? '' : openType }}"
+  business-id="{{ businessId }}"
+  session-from="{{ sessionFrom }}"
+  send-message-title="{{ sendMessageTitle }}"
+  send-message-path="{{ sendMessagePath }}"
+  send-message-img="{{ sendMessageImg }}"
+  show-message-card="{{ showMessageCard }}"
+  app-parameter="{{ appParameter }}"
+  aria-label="{{ ariaLabel }}"
+  bindtap="{{ !disabled ? 'onClick' : 'noop' }}"
+  bindgetuserinfo="bindGetUserInfo"
+  bindcontact="bindContact"
+  bindgetphonenumber="bindGetPhoneNumber"
+  binderror="bindError"
+  bindlaunchapp="bindLaunchApp"
+  bindopensetting="bindOpenSetting"
+>
+  <block wx:if="{{ loading }}">
+    <van-loading
+      custom-class="loading-class"
+      size="{{ loadingSize }}"
+      type="{{ loadingType }}"
+      color="{{ loadingColor(type,color,plain) }}"
+    />
+    <view wx:if="{{ loadingText }}" class="van-button__loading-text">
+      {{ loadingText }}
+    </view>
+  </block>
+  <block wx:else>
+    <van-icon
+      wx:if="{{ icon }}"
+      size="1.2em"
+      name="{{ icon }}"
+      class-prefix="{{ classPrefix }}"
+      class="van-button__icon"
+      custom-style="line-height: inherit;"
+    />
+    <view class="van-button__text">
+      <slot />
+    </view>
+  </block>
+</button>
+
+
+<wxs module="loadingColor">
+function get(type, color,plain) {
+  if(plain) {
+    return color ? color: '#c9c9c9';
+  }
+
+  if(type === 'default') {
+    return '#c9c9c9';
+  }
+  return 'white';
+}
+
+module.exports = get;
+</wxs>

File diff suppressed because it is too large
+ 1 - 0
miniprogram_npm/vant-weapp/button/index.wxss


+ 57 - 0
miniprogram_npm/vant-weapp/calendar/calendar.wxml

@@ -0,0 +1,57 @@
+<wxs src="./index.wxs" module="computed"></wxs>
+
+<template name="calendar">
+  <view class="van-calendar">
+    <header
+      title="{{ title }}"
+      showTitle="{{ showTitle }}"
+      subtitle="{{ subtitle }}"
+      showSubtitle="{{ showSubtitle }}"
+    >
+      <slot name="title" slot="title"></slot>
+    </header>
+
+    <scroll-view class="van-calendar__body" scroll-y scroll-into-view="{{ scrollIntoView }}">
+      <month
+        wx:for="{{ computed.getMonths(minDate, maxDate) }}"
+        wx:key="index"
+        id="month{{ index }}"
+        class="month"
+        data-date="{{ item }}"
+        date="{{ item }}"
+        type="{{ type }}"
+        color="{{ color }}"
+        minDate="{{ minDate }}"
+        maxDate="{{ maxDate }}"
+        showMark="{{ showMark }}"
+        formatter="{{ formatter }}"
+        rowHeight="{{ rowHeight }}"
+        currentDate="{{ currentDate }}"
+        showSubtitle="{{ showSubtitle }}"
+        allowSameDay="{{ allowSameDay }}"
+        showMonthTitle="{{ index !== 0 || !showSubtitle }}"
+        bind:click="onClickDay"
+      />
+    </scroll-view>
+
+    <view class="van-calendar__footer {{ safeAreaInsetBottom ? 'van-calendar__footer--safe-area-inset-bottom' : '' }}">
+      <slot name="footer"></slot>
+    </view>
+
+    <view class="van-calendar__footer {{ safeAreaInsetBottom ? 'van-calendar__footer--safe-area-inset-bottom' : '' }}">
+      <van-button
+        wx:if="{{ showConfirm }}"
+        round
+        block
+        type="danger"
+        color="{{ color }}"
+        custom-class="van-calendar__confirm"
+        disabled="{{ computed.getButtonDisabled(type, currentDate) }}"
+        nativeType="text"
+        bind:click="onConfirm"
+      >
+        {{ computed.getButtonDisabled(type, currentDate) ? confirmDisabledText : confirmText }}
+      </van-button>
+    </view>
+  </view>
+</template>

+ 1 - 0
miniprogram_npm/vant-weapp/calendar/components/header/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 16 - 0
miniprogram_npm/vant-weapp/calendar/components/header/index.js

@@ -0,0 +1,16 @@
+import { VantComponent } from '../../../common/component';
+VantComponent({
+  props: {
+    title: {
+      type: String,
+      value: '日期选择',
+    },
+    subtitle: String,
+    showTitle: Boolean,
+    showSubtitle: Boolean,
+  },
+  data: {
+    weekdays: ['日', '一', '二', '三', '四', '五', '六'],
+  },
+  methods: {},
+});

+ 3 - 0
miniprogram_npm/vant-weapp/calendar/components/header/index.json

@@ -0,0 +1,3 @@
+{
+  "component": true
+}

+ 16 - 0
miniprogram_npm/vant-weapp/calendar/components/header/index.wxml

@@ -0,0 +1,16 @@
+<view class="van-calendar__header">
+  <block wx:if="{{ showTitle }}">
+    <view class="van-calendar__header-title"><slot name="title"></slot></view>
+    <view class="van-calendar__header-title">{{ title }}</view>
+  </block>
+
+  <view wx:if="{{ showSubtitle }}" class="van-calendar__header-subtitle">
+    {{ subtitle }}
+  </view>
+
+  <view class="van-calendar__weekdays">
+    <view wx:for="{{ weekdays }}" wx:key="index" class="van-calendar__weekday">
+      {{ item }}
+    </view>
+  </view>
+</view>

File diff suppressed because it is too large
+ 1 - 0
miniprogram_npm/vant-weapp/calendar/components/header/index.wxss


+ 1 - 0
miniprogram_npm/vant-weapp/calendar/components/month/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 157 - 0
miniprogram_npm/vant-weapp/calendar/components/month/index.js

@@ -0,0 +1,157 @@
+import { VantComponent } from '../../../common/component';
+import {
+  getMonthEndDay,
+  compareDay,
+  getPrevDay,
+  getNextDay,
+} from '../../utils';
+VantComponent({
+  props: {
+    date: {
+      type: null,
+      observer: 'setDays',
+    },
+    type: {
+      type: String,
+      observer: 'setDays',
+    },
+    color: String,
+    minDate: {
+      type: null,
+      observer: 'setDays',
+    },
+    maxDate: {
+      type: null,
+      observer: 'setDays',
+    },
+    showMark: Boolean,
+    rowHeight: [Number, String],
+    formatter: {
+      type: null,
+      observer: 'setDays',
+    },
+    currentDate: {
+      type: [null, Array],
+      observer: 'setDays',
+    },
+    allowSameDay: Boolean,
+    showSubtitle: Boolean,
+    showMonthTitle: Boolean,
+  },
+  data: {
+    visible: true,
+    days: [],
+  },
+  methods: {
+    onClick(event) {
+      const { index } = event.currentTarget.dataset;
+      const item = this.data.days[index];
+      if (item.type !== 'disabled') {
+        this.$emit('click', item);
+      }
+    },
+    setDays() {
+      const days = [];
+      const startDate = new Date(this.data.date);
+      const year = startDate.getFullYear();
+      const month = startDate.getMonth();
+      const totalDay = getMonthEndDay(
+        startDate.getFullYear(),
+        startDate.getMonth() + 1
+      );
+      for (let day = 1; day <= totalDay; day++) {
+        const date = new Date(year, month, day);
+        const type = this.getDayType(date);
+        let config = {
+          date,
+          type,
+          text: day,
+          bottomInfo: this.getBottomInfo(type),
+        };
+        if (this.data.formatter) {
+          config = this.data.formatter(config);
+        }
+        days.push(config);
+      }
+      this.setData({ days });
+    },
+    getMultipleDayType(day) {
+      const { currentDate } = this.data;
+      if (!Array.isArray(currentDate)) {
+        return '';
+      }
+      const isSelected = (date) =>
+        currentDate.some((item) => compareDay(item, date) === 0);
+      if (isSelected(day)) {
+        const prevDay = getPrevDay(day);
+        const nextDay = getNextDay(day);
+        const prevSelected = isSelected(prevDay);
+        const nextSelected = isSelected(nextDay);
+        if (prevSelected && nextSelected) {
+          return 'multiple-middle';
+        }
+        if (prevSelected) {
+          return 'end';
+        }
+        return nextSelected ? 'start' : 'multiple-selected';
+      }
+      return '';
+    },
+    getRangeDayType(day) {
+      const { currentDate, allowSameDay } = this.data;
+      if (!Array.isArray(currentDate)) {
+        return;
+      }
+      const [startDay, endDay] = currentDate;
+      if (!startDay) {
+        return;
+      }
+      const compareToStart = compareDay(day, startDay);
+      if (!endDay) {
+        return compareToStart === 0 ? 'start' : '';
+      }
+      const compareToEnd = compareDay(day, endDay);
+      if (compareToStart === 0 && compareToEnd === 0 && allowSameDay) {
+        return 'start-end';
+      }
+      if (compareToStart === 0) {
+        return 'start';
+      }
+      if (compareToEnd === 0) {
+        return 'end';
+      }
+      if (compareToStart > 0 && compareToEnd < 0) {
+        return 'middle';
+      }
+    },
+    getDayType(day) {
+      const { type, minDate, maxDate, currentDate } = this.data;
+      if (compareDay(day, minDate) < 0 || compareDay(day, maxDate) > 0) {
+        return 'disabled';
+      }
+      if (type === 'single') {
+        return compareDay(day, currentDate) === 0 ? 'selected' : '';
+      }
+      if (type === 'multiple') {
+        return this.getMultipleDayType(day);
+      }
+      /* istanbul ignore else */
+      if (type === 'range') {
+        return this.getRangeDayType(day);
+      }
+    },
+    getBottomInfo(type) {
+      if (this.data.type === 'range') {
+        if (type === 'start') {
+          return '开始';
+        }
+        if (type === 'end') {
+          return '结束';
+        }
+        if (type === 'start-end') {
+          return '开始/结束';
+        }
+      }
+    },
+  },
+});

+ 3 - 0
miniprogram_npm/vant-weapp/calendar/components/month/index.json

@@ -0,0 +1,3 @@
+{
+  "component": true
+}

+ 39 - 0
miniprogram_npm/vant-weapp/calendar/components/month/index.wxml

@@ -0,0 +1,39 @@
+<wxs src="./index.wxs" module="computed"></wxs>
+<wxs src="../../../wxs/utils.wxs" module="utils" />
+
+<view class="van-calendar__month" style="{{ computed.getMonthStyle(visible, date, rowHeight) }}">
+  <view wx:if="{{ showMonthTitle }}" class="van-calendar__month-title">
+    {{ computed.formatMonthTitle(date) }}
+  </view>
+
+  <view wx:if="{{ visible }}" class="van-calendar__days">
+    <view wx:if="{{ showMark }}" class="van-calendar__month-mark">
+      {{ computed.getMark(date) }}
+    </view>
+
+    <view
+      wx:for="{{ days }}"
+      wx:key="index"
+      style="{{ computed.getDayStyle(item.type, index, date, rowHeight, color) }}"
+      class="{{ utils.bem('calendar__day', [item.type]) }} {{ item.className }}"
+      data-index="{{ index }}"
+      bindtap="onClick"
+    >
+      <view wx:if="{{ item.type === 'selected' }}" class="van-calendar__selected-day" style="background: {{ color }}">
+        <view wx:if="{{ item.topInfo }}" class="van-calendar__top-info">{{ item.topInfo }}</view>
+        {{ item.text }}
+        <view wx:if="{{ item.bottomInfo }}" class="van-calendar__bottom-info">
+          {{ item.bottomInfo }}
+        </view>
+      </view>
+
+      <view wx:else>
+        <view wx:if="{{ item.topInfo }}" class="van-calendar__top-info">{{ item.topInfo }}</view>
+        {{ item.text }}
+        <view wx:if="{{ item.bottomInfo }}" class="van-calendar__bottom-info">
+          {{ item.bottomInfo }}
+        </view>
+      </view>
+    </view>
+  </view>
+</view>

+ 67 - 0
miniprogram_npm/vant-weapp/calendar/components/month/index.wxs

@@ -0,0 +1,67 @@
+/* eslint-disable */
+var utils = require('../../utils.wxs');
+
+function getMark(date) {
+  return getDate(date).getMonth() + 1;
+}
+
+var ROW_HEIGHT = 64;
+
+function getDayStyle(type, index, date, rowHeight, color) {
+  var style = [];
+  var offset = getDate(date).getDay();
+
+  if (index === 0) {
+    style.push(['margin-left', (100 * offset) / 7 + '%']);
+  }
+
+  if (rowHeight !== ROW_HEIGHT) {
+    style.push(['height', rowHeight + 'px']);
+  }
+
+  if (color) {
+    if (
+      type === 'start' ||
+      type === 'end' ||
+      type === 'multiple-selected' ||
+      type === 'multiple-middle'
+    ) {
+      style.push(['background', color]);
+    } else if (type === 'middle') {
+      style.push(['color', color]);
+    }
+  }
+
+  return style
+    .map(function(item) {
+      return item.join(':');
+    })
+    .join(';');
+}
+
+function formatMonthTitle(date) {
+  date = getDate(date);
+  return date.getFullYear() + '年' + (date.getMonth() + 1) + '月';
+}
+
+function getMonthStyle(visible, date, rowHeight) {
+  if (!visible) {
+    date = getDate(date);
+
+    var totalDay = utils.getMonthEndDay(
+      date.getFullYear(),
+      date.getMonth() + 1
+    );
+    var offset = getDate(date).getDay();
+    var padding = Math.ceil((totalDay + offset) / 7) * rowHeight;
+
+    return 'padding-bottom:' + padding + 'px';
+  }
+}
+
+module.exports = {
+  getMark: getMark,
+  getDayStyle: getDayStyle,
+  formatMonthTitle: formatMonthTitle,
+  getMonthStyle: getMonthStyle
+};

File diff suppressed because it is too large
+ 1 - 0
miniprogram_npm/vant-weapp/calendar/components/month/index.wxss


+ 1 - 0
miniprogram_npm/vant-weapp/calendar/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 290 - 0
miniprogram_npm/vant-weapp/calendar/index.js

@@ -0,0 +1,290 @@
+import { VantComponent } from '../common/component';
+import {
+  ROW_HEIGHT,
+  getNextDay,
+  compareDay,
+  copyDates,
+  calcDateNum,
+  formatMonthTitle,
+  compareMonth,
+  getMonths,
+  getDayByOffset,
+} from './utils';
+import Toast from '../toast/toast';
+VantComponent({
+  props: {
+    title: {
+      type: String,
+      value: '日期选择',
+    },
+    color: String,
+    show: {
+      type: Boolean,
+      observer(val) {
+        if (val) {
+          this.initRect();
+          this.scrollIntoView();
+        }
+      },
+    },
+    formatter: null,
+    confirmText: {
+      type: String,
+      value: '确定',
+    },
+    rangePrompt: String,
+    defaultDate: {
+      type: [Number, Array],
+      observer(val) {
+        this.setData({ currentDate: val });
+        this.scrollIntoView();
+      },
+    },
+    allowSameDay: Boolean,
+    confirmDisabledText: String,
+    type: {
+      type: String,
+      value: 'single',
+      observer: 'reset',
+    },
+    minDate: {
+      type: null,
+      value: Date.now(),
+    },
+    maxDate: {
+      type: null,
+      value: new Date(
+        new Date().getFullYear(),
+        new Date().getMonth() + 6,
+        new Date().getDate()
+      ).getTime(),
+    },
+    position: {
+      type: String,
+      value: 'bottom',
+    },
+    rowHeight: {
+      type: [Number, String],
+      value: ROW_HEIGHT,
+    },
+    round: {
+      type: Boolean,
+      value: true,
+    },
+    poppable: {
+      type: Boolean,
+      value: true,
+    },
+    showMark: {
+      type: Boolean,
+      value: true,
+    },
+    showTitle: {
+      type: Boolean,
+      value: true,
+    },
+    showConfirm: {
+      type: Boolean,
+      value: true,
+    },
+    showSubtitle: {
+      type: Boolean,
+      value: true,
+    },
+    safeAreaInsetBottom: {
+      type: Boolean,
+      value: true,
+    },
+    closeOnClickOverlay: {
+      type: Boolean,
+      value: true,
+    },
+    maxRange: {
+      type: [Number, String],
+      value: null,
+    },
+  },
+  data: {
+    subtitle: '',
+    currentDate: null,
+    scrollIntoView: '',
+  },
+  created() {
+    this.setData({
+      currentDate: this.getInitialDate(),
+    });
+  },
+  mounted() {
+    if (this.data.show || !this.data.poppable) {
+      this.initRect();
+      this.scrollIntoView();
+    }
+  },
+  methods: {
+    reset() {
+      this.setData({ currentDate: this.getInitialDate() });
+      this.scrollIntoView();
+    },
+    initRect() {
+      if (this.contentObserver != null) {
+        this.contentObserver.disconnect();
+      }
+      const contentObserver = this.createIntersectionObserver({
+        thresholds: [0, 0.1, 0.9, 1],
+        observeAll: true,
+      });
+      this.contentObserver = contentObserver;
+      contentObserver.relativeTo('.van-calendar__body');
+      contentObserver.observe('.month', (res) => {
+        if (res.boundingClientRect.top <= res.relativeRect.top) {
+          // @ts-ignore
+          this.setData({ subtitle: formatMonthTitle(res.dataset.date) });
+        }
+      });
+    },
+    getInitialDate() {
+      const { type, defaultDate, minDate } = this.data;
+      if (type === 'range') {
+        const [startDay, endDay] = defaultDate || [];
+        return [
+          startDay || minDate,
+          endDay || getNextDay(new Date(minDate)).getTime(),
+        ];
+      }
+      if (type === 'multiple') {
+        return defaultDate || [minDate];
+      }
+      return defaultDate || minDate;
+    },
+    scrollIntoView() {
+      setTimeout(() => {
+        const {
+          currentDate,
+          type,
+          show,
+          poppable,
+          minDate,
+          maxDate,
+        } = this.data;
+        const targetDate = type === 'single' ? currentDate : currentDate[0];
+        const displayed = show || !poppable;
+        if (!targetDate || !displayed) {
+          return;
+        }
+        const months = getMonths(minDate, maxDate);
+        months.some((month, index) => {
+          if (compareMonth(month, targetDate) === 0) {
+            this.setData({ scrollIntoView: `month${index}` });
+            return true;
+          }
+          return false;
+        });
+      }, 100);
+    },
+    onOpen() {
+      this.$emit('open');
+    },
+    onOpened() {
+      this.$emit('opened');
+    },
+    onClose() {
+      this.$emit('close');
+    },
+    onClosed() {
+      this.$emit('closed');
+    },
+    onClickDay(event) {
+      const { date } = event.detail;
+      const { type, currentDate, allowSameDay } = this.data;
+      if (type === 'range') {
+        const [startDay, endDay] = currentDate;
+        if (startDay && !endDay) {
+          const compareToStart = compareDay(date, startDay);
+          if (compareToStart === 1) {
+            this.select([startDay, date], true);
+          } else if (compareToStart === -1) {
+            this.select([date, null]);
+          } else if (allowSameDay) {
+            this.select([date, date]);
+          }
+        } else {
+          this.select([date, null]);
+        }
+      } else if (type === 'multiple') {
+        let selectedIndex;
+        const selected = currentDate.some((dateItem, index) => {
+          const equal = compareDay(dateItem, date) === 0;
+          if (equal) {
+            selectedIndex = index;
+          }
+          return equal;
+        });
+        if (selected) {
+          const cancelDate = currentDate.splice(selectedIndex, 1);
+          this.setData({ currentDate });
+          this.unselect(cancelDate);
+        } else {
+          this.select([...currentDate, date]);
+        }
+      } else {
+        this.select(date, true);
+      }
+    },
+    unselect(dateArray) {
+      const date = dateArray[0];
+      if (date) {
+        this.$emit('unselect', copyDates(date));
+      }
+    },
+    select(date, complete) {
+      if (complete && this.data.type === 'range') {
+        const valid = this.checkRange(date);
+        if (!valid) {
+          // auto selected to max range if showConfirm
+          if (this.data.showConfirm) {
+            this.emit([
+              date[0],
+              getDayByOffset(date[0], this.data.maxRange - 1),
+            ]);
+          } else {
+            this.emit(date);
+          }
+          return;
+        }
+      }
+      this.emit(date);
+      if (complete && !this.data.showConfirm) {
+        this.onConfirm();
+      }
+    },
+    emit(date) {
+      const getTime = (date) => (date instanceof Date ? date.getTime() : date);
+      this.setData({
+        currentDate: Array.isArray(date) ? date.map(getTime) : getTime(date),
+      });
+      this.$emit('select', copyDates(date));
+    },
+    checkRange(date) {
+      const { maxRange, rangePrompt } = this.data;
+      if (maxRange && calcDateNum(date) > maxRange) {
+        Toast({
+          context: this,
+          message: rangePrompt || `选择天数不能超过 ${maxRange} 天`,
+        });
+        return false;
+      }
+      return true;
+    },
+    onConfirm() {
+      if (
+        this.data.type === 'range' &&
+        !this.checkRange(this.data.currentDate)
+      ) {
+        return;
+      }
+      wx.nextTick(() => {
+        this.$emit('confirm', copyDates(this.data.currentDate));
+      });
+    },
+  },
+});

+ 9 - 0
miniprogram_npm/vant-weapp/calendar/index.json

@@ -0,0 +1,9 @@
+{
+  "component": true,
+  "usingComponents": {
+    "header": "./components/header/index",
+    "month": "./components/month/index",
+    "van-button": "../button/index",
+    "van-popup": "../popup/index"
+  }
+}

+ 31 - 0
miniprogram_npm/vant-weapp/calendar/index.wxml

@@ -0,0 +1,31 @@
+<wxs src="./index.wxs" module="computed" />
+
+<import src="./calendar.wxml" />
+
+<van-popup
+  wx:if="{{ poppable }}"
+  custom-class="van-calendar__popup--{{ position }}"
+  close-icon-class="van-calendar__close-icon"
+  show="{{ show }}"
+  round="{{ round }}"
+  position="{{ position }}"
+  closeable="{{ showTitle || showSubtitle }}"
+  close-on-click-overlay="{{ closeOnClickOverlay }}"
+  bind:enter="onOpen"
+  bind:close="onClose"
+  bind:after-enter="onOpened"
+  bind:after-leave="onClosed"
+>
+  <template
+    is="calendar"
+    data="{{ title, subtitle, showTitle, showSubtitle, minDate, maxDate, type, color, showMark, formatter, rowHeight, currentDate, safeAreaInsetBottom, showConfirm, confirmDisabledText, confirmText, scrollIntoView, allowSameDay }}"
+  />
+</van-popup>
+
+<template
+  wx:else
+  is="calendar"
+  data="{{ title, subtitle, showTitle, showSubtitle, minDate, maxDate, type, color, showMark, formatter, rowHeight, currentDate, safeAreaInsetBottom, showConfirm, confirmDisabledText, confirmText, scrollIntoView, allowSameDay }}"
+/>
+
+<van-toast id="van-toast" />

+ 37 - 0
miniprogram_npm/vant-weapp/calendar/index.wxs

@@ -0,0 +1,37 @@
+/* eslint-disable */
+var utils = require('./utils.wxs');
+
+function getMonths(minDate, maxDate) {
+  var months = [];
+  var cursor = getDate(minDate);
+
+  cursor.setDate(1);
+
+  do {
+    months.push(cursor.getTime());
+    cursor.setMonth(cursor.getMonth() + 1);
+  } while (utils.compareMonth(cursor, getDate(maxDate)) !== 1);
+
+  return months;
+}
+
+function getButtonDisabled(type, currentDate) {
+  if (currentDate == null) {
+    return true;
+  }
+
+  if (type === 'range') {
+    return !currentDate[0] || !currentDate[1];
+  }
+
+  if (type === 'multiple') {
+    return !currentDate.length;
+  }
+
+  return !currentDate;
+}
+
+module.exports = {
+  getMonths: getMonths,
+  getButtonDisabled: getButtonDisabled
+};

File diff suppressed because it is too large
+ 1 - 0
miniprogram_npm/vant-weapp/calendar/index.wxss


+ 17 - 0
miniprogram_npm/vant-weapp/calendar/utils.d.ts

@@ -0,0 +1,17 @@
+export declare const ROW_HEIGHT = 64;
+export declare function formatMonthTitle(date: Date): string;
+export declare function compareMonth(
+  date1: Date | number,
+  date2: Date | number
+): 0 | 1 | -1;
+export declare function compareDay(
+  day1: Date | number,
+  day2: Date | number
+): 0 | 1 | -1;
+export declare function getDayByOffset(date: Date, offset: number): Date;
+export declare function getPrevDay(date: Date): Date;
+export declare function getNextDay(date: Date): Date;
+export declare function calcDateNum(date: [Date, Date]): number;
+export declare function copyDates(dates: Date | Date[]): Date | Date[];
+export declare function getMonthEndDay(year: number, month: number): number;
+export declare function getMonths(minDate: number, maxDate: number): any[];

+ 78 - 0
miniprogram_npm/vant-weapp/calendar/utils.js

@@ -0,0 +1,78 @@
+export const ROW_HEIGHT = 64;
+export function formatMonthTitle(date) {
+  if (!(date instanceof Date)) {
+    date = new Date(date);
+  }
+  return `${date.getFullYear()}年${date.getMonth() + 1}月`;
+}
+export function compareMonth(date1, date2) {
+  if (!(date1 instanceof Date)) {
+    date1 = new Date(date1);
+  }
+  if (!(date2 instanceof Date)) {
+    date2 = new Date(date2);
+  }
+  const year1 = date1.getFullYear();
+  const year2 = date2.getFullYear();
+  const month1 = date1.getMonth();
+  const month2 = date2.getMonth();
+  if (year1 === year2) {
+    return month1 === month2 ? 0 : month1 > month2 ? 1 : -1;
+  }
+  return year1 > year2 ? 1 : -1;
+}
+export function compareDay(day1, day2) {
+  if (!(day1 instanceof Date)) {
+    day1 = new Date(day1);
+  }
+  if (!(day2 instanceof Date)) {
+    day2 = new Date(day2);
+  }
+  const compareMonthResult = compareMonth(day1, day2);
+  if (compareMonthResult === 0) {
+    const date1 = day1.getDate();
+    const date2 = day2.getDate();
+    return date1 === date2 ? 0 : date1 > date2 ? 1 : -1;
+  }
+  return compareMonthResult;
+}
+export function getDayByOffset(date, offset) {
+  date = new Date(date);
+  date.setDate(date.getDate() + offset);
+  return date;
+}
+export function getPrevDay(date) {
+  return getDayByOffset(date, -1);
+}
+export function getNextDay(date) {
+  return getDayByOffset(date, 1);
+}
+export function calcDateNum(date) {
+  const day1 = new Date(date[0]).getTime();
+  const day2 = new Date(date[1]).getTime();
+  return (day2 - day1) / (1000 * 60 * 60 * 24) + 1;
+}
+export function copyDates(dates) {
+  if (Array.isArray(dates)) {
+    return dates.map((date) => {
+      if (date === null) {
+        return date;
+      }
+      return new Date(date);
+    });
+  }
+  return new Date(dates);
+}
+export function getMonthEndDay(year, month) {
+  return 32 - new Date(year, month - 1, 32).getDate();
+}
+export function getMonths(minDate, maxDate) {
+  const months = [];
+  const cursor = new Date(minDate);
+  cursor.setDate(1);
+  do {
+    months.push(cursor.getTime());
+    cursor.setMonth(cursor.getMonth() + 1);
+  } while (compareMonth(cursor, maxDate) !== 1);
+  return months;
+}

+ 25 - 0
miniprogram_npm/vant-weapp/calendar/utils.wxs

@@ -0,0 +1,25 @@
+/* eslint-disable */
+function getMonthEndDay(year, month) {
+  return 32 -  getDate(year, month - 1, 32).getDate();
+}
+
+function compareMonth(date1, date2) {
+  date1 = getDate(date1);
+  date2 = getDate(date2);
+
+  var year1 = date1.getFullYear();
+  var year2 = date2.getFullYear();
+  var month1 = date1.getMonth();
+  var month2 = date2.getMonth();
+
+  if (year1 === year2) {
+    return month1 === month2 ? 0 : month1 > month2 ? 1 : -1;
+  }
+
+  return year1 > year2 ? 1 : -1;
+}
+
+module.exports = {
+  getMonthEndDay: getMonthEndDay,
+  compareMonth: compareMonth
+};

+ 1 - 0
miniprogram_npm/vant-weapp/card/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 49 - 0
miniprogram_npm/vant-weapp/card/index.js

@@ -0,0 +1,49 @@
+import { link } from '../mixins/link';
+import { VantComponent } from '../common/component';
+VantComponent({
+  classes: [
+    'num-class',
+    'desc-class',
+    'thumb-class',
+    'title-class',
+    'price-class',
+    'origin-price-class',
+  ],
+  mixins: [link],
+  props: {
+    tag: String,
+    num: String,
+    desc: String,
+    thumb: String,
+    title: String,
+    price: {
+      type: String,
+      observer: 'updatePrice',
+    },
+    centered: Boolean,
+    lazyLoad: Boolean,
+    thumbLink: String,
+    originPrice: String,
+    thumbMode: {
+      type: String,
+      value: 'aspectFit',
+    },
+    currency: {
+      type: String,
+      value: '¥',
+    },
+  },
+  methods: {
+    updatePrice() {
+      const { price } = this.data;
+      const priceArr = price.toString().split('.');
+      this.setData({
+        integerStr: priceArr[0],
+        decimalStr: priceArr[1] ? `.${priceArr[1]}` : '',
+      });
+    },
+    onClickThumb() {
+      this.jumpLink('thumbLink');
+    },
+  },
+});

+ 6 - 0
miniprogram_npm/vant-weapp/card/index.json

@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "van-tag": "../tag/index"
+  }
+}

+ 50 - 0
miniprogram_npm/vant-weapp/card/index.wxml

@@ -0,0 +1,50 @@
+<wxs src="../wxs/utils.wxs" module="utils" />
+
+<view class="custom-class van-card">
+  <view class="{{ utils.bem('card__header', { center: centered }) }}">
+    <view class="van-card__thumb" bind:tap="onClickThumb">
+      <image
+        wx:if="{{ thumb }}"
+        src="{{ thumb }}"
+        mode="{{ thumbMode }}"
+        lazy-load="{{ lazyLoad }}"
+        class="van-card__img thumb-class"
+      />
+      <slot name="thumb" />
+      <van-tag
+        wx:if="{{ tag }}"
+        mark
+        type="danger"
+        custom-class="van-card__tag"
+      >
+        {{ tag }}
+      </van-tag>
+    </view>
+
+    <view class="van-card__content {{ utils.bem('card__content', { center: centered }) }}">
+      <view>
+        <view wx:if="{{ title }}" class="van-card__title title-class">{{ title }}</view>
+        <slot wx:else name="title" />
+
+        <view wx:if="{{ desc }}" class="van-card__desc desc-class">{{ desc }}</view>
+        <slot wx:else name="desc" />
+
+        <slot name="tags" />
+      </view>
+
+      <view class="van-card__bottom">
+        <slot name="price-top" />
+        <view wx:if="{{ price || price === 0 }}" class="van-card__price price-class">{{ currency }}<text class="van-card__price-integer">{{ integerStr }}</text><text class="van-card__price-decimal">{{ decimalStr }}</text></view>
+        <slot wx:else name="price" />
+        <view wx:if="{{ originPrice || originPrice === 0 }}" class="van-card__origin-price origin-price-class">{{ currency }} {{ originPrice }}</view>
+        <view wx:if="{{ num }}" class="van-card__num num-class">x {{ num }}</view>
+        <slot wx:else  name="num" />
+        <slot name="bottom" />
+      </view>
+    </view>
+  </view>
+
+  <view class="van-card__footer">
+    <slot name="footer" />
+  </view>
+</view>

File diff suppressed because it is too large
+ 1 - 0
miniprogram_npm/vant-weapp/card/index.wxss


+ 1 - 0
miniprogram_npm/vant-weapp/cell-group/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 10 - 0
miniprogram_npm/vant-weapp/cell-group/index.js

@@ -0,0 +1,10 @@
+import { VantComponent } from '../common/component';
+VantComponent({
+  props: {
+    title: String,
+    border: {
+      type: Boolean,
+      value: true,
+    },
+  },
+});

+ 3 - 0
miniprogram_npm/vant-weapp/cell-group/index.json

@@ -0,0 +1,3 @@
+{
+  "component": true
+}

+ 9 - 0
miniprogram_npm/vant-weapp/cell-group/index.wxml

@@ -0,0 +1,9 @@
+<view
+  wx:if="{{ title }}"
+  class="van-cell-group__title"
+>
+  {{ title }}
+</view>
+<view class="custom-class van-cell-group {{ border ? 'van-hairline--top-bottom' : '' }}">
+  <slot />
+</view>

+ 1 - 0
miniprogram_npm/vant-weapp/cell-group/index.wxss

@@ -0,0 +1 @@
+@import '../common/index.wxss';.van-cell-group__title{padding:16px 16px 8px;padding:var(--cell-group-title-padding,16px 16px 8px);font-size:14px;font-size:var(--cell-group-title-font-size,14px);line-height:16px;line-height:var(--cell-group-title-line-height,16px);color:#969799;color:var(--cell-group-title-color,#969799)}

+ 1 - 0
miniprogram_npm/vant-weapp/cell/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 38 - 0
miniprogram_npm/vant-weapp/cell/index.js

@@ -0,0 +1,38 @@
+import { link } from '../mixins/link';
+import { VantComponent } from '../common/component';
+VantComponent({
+  classes: [
+    'title-class',
+    'label-class',
+    'value-class',
+    'right-icon-class',
+    'hover-class',
+  ],
+  mixins: [link],
+  props: {
+    title: null,
+    value: null,
+    icon: String,
+    size: String,
+    label: String,
+    center: Boolean,
+    isLink: Boolean,
+    required: Boolean,
+    clickable: Boolean,
+    titleWidth: String,
+    customStyle: String,
+    arrowDirection: String,
+    useLabelSlot: Boolean,
+    border: {
+      type: Boolean,
+      value: true,
+    },
+    titleStyle: String,
+  },
+  methods: {
+    onClick(event) {
+      this.$emit('click', event.detail);
+      this.jumpLink();
+    },
+  },
+});

+ 6 - 0
miniprogram_npm/vant-weapp/cell/index.json

@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "van-icon": "../icon/index"
+  }
+}

+ 45 - 0
miniprogram_npm/vant-weapp/cell/index.wxml

@@ -0,0 +1,45 @@
+<wxs src="../wxs/utils.wxs" module="utils" />
+
+<view
+  class="custom-class {{ utils.bem('cell', [size, { center, required, borderless: !border, clickable: isLink || clickable }]) }}"
+  hover-class="van-cell--hover hover-class"
+  hover-stay-time="70"
+  style="{{ customStyle }}"
+  bind:tap="onClick"
+>
+  <van-icon
+    wx:if="{{ icon }}"
+    name="{{ icon }}"
+    class="van-cell__left-icon-wrap"
+    custom-class="van-cell__left-icon"
+  />
+  <slot wx:else name="icon" />
+
+  <view
+    style="{{ (titleWidth ? 'max-width:' + titleWidth + ';min-width:' + titleWidth + ';' : '') + titleStyle }}"
+    class="van-cell__title title-class"
+  >
+    <block wx:if="{{ title }}">{{ title }}</block>
+    <slot wx:else name="title" />
+
+    <view wx:if="{{ label || useLabelSlot }}" class="van-cell__label label-class">
+      <slot wx:if="{{ useLabelSlot }}" name="label" />
+      <block wx:elif="{{ label }}">{{ label }}</block>
+    </view>
+  </view>
+
+  <view class="van-cell__value value-class">
+    <block wx:if="{{ value || value === 0 }}">{{ value }}</block>
+    <slot wx:else />
+  </view>
+
+  <van-icon
+    wx:if="{{ isLink }}"
+    name="{{ arrowDirection ? 'arrow' + '-' + arrowDirection : 'arrow' }}"
+    class="van-cell__right-icon-wrap right-icon-class"
+    custom-class="van-cell__right-icon"
+  />
+  <slot wx:else name="right-icon" />
+
+  <slot name="extra" />
+</view>

File diff suppressed because it is too large
+ 1 - 0
miniprogram_npm/vant-weapp/cell/index.wxss


+ 1 - 0
miniprogram_npm/vant-weapp/checkbox-group/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 35 - 0
miniprogram_npm/vant-weapp/checkbox-group/index.js

@@ -0,0 +1,35 @@
+import { VantComponent } from '../common/component';
+VantComponent({
+  field: true,
+  relation: {
+    name: 'checkbox',
+    type: 'descendant',
+    current: 'checkbox-group',
+    linked(target) {
+      this.updateChild(target);
+    },
+  },
+  props: {
+    max: Number,
+    value: {
+      type: Array,
+      observer: 'updateChildren',
+    },
+    disabled: {
+      type: Boolean,
+      observer: 'updateChildren',
+    },
+  },
+  methods: {
+    updateChildren() {
+      (this.children || []).forEach((child) => this.updateChild(child));
+    },
+    updateChild(child) {
+      const { value, disabled } = this.data;
+      child.setData({
+        value: value.indexOf(child.data.name) !== -1,
+        parentDisabled: disabled,
+      });
+    },
+  },
+});

+ 3 - 0
miniprogram_npm/vant-weapp/checkbox-group/index.json

@@ -0,0 +1,3 @@
+{
+  "component": true
+}

+ 1 - 0
miniprogram_npm/vant-weapp/checkbox-group/index.wxml

@@ -0,0 +1 @@
+<slot />

+ 1 - 0
miniprogram_npm/vant-weapp/checkbox-group/index.wxss

@@ -0,0 +1 @@
+@import '../common/index.wxss';

+ 1 - 0
miniprogram_npm/vant-weapp/checkbox/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 74 - 0
miniprogram_npm/vant-weapp/checkbox/index.js

@@ -0,0 +1,74 @@
+import { VantComponent } from '../common/component';
+function emit(target, value) {
+  target.$emit('input', value);
+  target.$emit('change', value);
+}
+VantComponent({
+  field: true,
+  relation: {
+    name: 'checkbox-group',
+    type: 'ancestor',
+    current: 'checkbox',
+  },
+  classes: ['icon-class', 'label-class'],
+  props: {
+    value: Boolean,
+    disabled: Boolean,
+    useIconSlot: Boolean,
+    checkedColor: String,
+    labelPosition: String,
+    labelDisabled: Boolean,
+    shape: {
+      type: String,
+      value: 'round',
+    },
+    iconSize: {
+      type: null,
+      value: 20,
+    },
+  },
+  data: {
+    parentDisabled: false,
+  },
+  methods: {
+    emitChange(value) {
+      if (this.parent) {
+        this.setParentValue(this.parent, value);
+      } else {
+        emit(this, value);
+      }
+    },
+    toggle() {
+      const { parentDisabled, disabled, value } = this.data;
+      if (!disabled && !parentDisabled) {
+        this.emitChange(!value);
+      }
+    },
+    onClickLabel() {
+      const { labelDisabled, parentDisabled, disabled, value } = this.data;
+      if (!disabled && !labelDisabled && !parentDisabled) {
+        this.emitChange(!value);
+      }
+    },
+    setParentValue(parent, value) {
+      const parentValue = parent.data.value.slice();
+      const { name } = this.data;
+      const { max } = parent.data;
+      if (value) {
+        if (max && parentValue.length >= max) {
+          return;
+        }
+        if (parentValue.indexOf(name) === -1) {
+          parentValue.push(name);
+          emit(parent, parentValue);
+        }
+      } else {
+        const index = parentValue.indexOf(name);
+        if (index !== -1) {
+          parentValue.splice(index, 1);
+          emit(parent, parentValue);
+        }
+      }
+    },
+  },
+});

+ 6 - 0
miniprogram_npm/vant-weapp/checkbox/index.json

@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "van-icon": "../icon/index"
+  }
+}

+ 20 - 0
miniprogram_npm/vant-weapp/checkbox/index.wxml

@@ -0,0 +1,20 @@
+<wxs src="../wxs/utils.wxs" module="utils" />
+<wxs src="./index.wxs" module="computed" />
+
+<view class="van-checkbox custom-class">
+  <view class="van-checkbox__icon-wrap" bindtap="toggle">
+    <slot wx:if="{{ useIconSlot }}" name="icon" />
+    <van-icon
+      wx:else
+      name="success"
+      size="0.8em"
+      class="{{ utils.bem('checkbox__icon', [shape, { disabled: disabled || parentDisabled, checked: value }]) }}"
+      style="{{ computed.iconStyle(checkedColor, value, disabled, parentDisabled, iconSize) }}"
+      custom-class="icon-class"
+      custom-style="line-height: 1.25em;"
+    />
+  </view>
+  <view class="label-class {{ utils.bem('checkbox__label', [labelPosition, { disabled: disabled || parentDisabled }]) }}" bindtap="onClickLabel">
+    <slot />
+  </view>
+</view>

+ 20 - 0
miniprogram_npm/vant-weapp/checkbox/index.wxs

@@ -0,0 +1,20 @@
+/* eslint-disable */
+var utils = require('../wxs/utils.wxs');
+
+function iconStyle(checkedColor, value, disabled, parentDisabled, iconSize) {
+  var styles = [['font-size', utils.addUnit(iconSize)]];
+  if (checkedColor && value && !disabled && !parentDisabled) {
+    styles.push(['border-color', checkedColor]);
+    styles.push(['background-color', checkedColor]);
+  }
+
+  return styles
+    .map(function(item) {
+      return item.join(':');
+    })
+    .join(';');
+}
+
+module.exports = {
+  iconStyle: iconStyle
+};

File diff suppressed because it is too large
+ 1 - 0
miniprogram_npm/vant-weapp/checkbox/index.wxss


+ 6 - 0
miniprogram_npm/vant-weapp/circle/canvas.d.ts

@@ -0,0 +1,6 @@
+/// <reference types="miniprogram-api-typings" />
+declare type CanvasContext = WechatMiniprogram.CanvasContext;
+export declare function adaptor(
+  ctx: CanvasRenderingContext2D
+): CanvasContext & CanvasRenderingContext2D;
+export {};

+ 43 - 0
miniprogram_npm/vant-weapp/circle/canvas.js

@@ -0,0 +1,43 @@
+export function adaptor(ctx) {
+  // @ts-ignore
+  return Object.assign(ctx, {
+    setStrokeStyle(val) {
+      ctx.strokeStyle = val;
+    },
+    setLineWidth(val) {
+      ctx.lineWidth = val;
+    },
+    setLineCap(val) {
+      ctx.lineCap = val;
+    },
+    setFillStyle(val) {
+      ctx.fillStyle = val;
+    },
+    setFontSize(val) {
+      ctx.font = String(val);
+    },
+    setGlobalAlpha(val) {
+      ctx.globalAlpha = val;
+    },
+    setLineJoin(val) {
+      ctx.lineJoin = val;
+    },
+    setTextAlign(val) {
+      ctx.textAlign = val;
+    },
+    setMiterLimit(val) {
+      ctx.miterLimit = val;
+    },
+    setShadow(offsetX, offsetY, blur, color) {
+      ctx.shadowOffsetX = offsetX;
+      ctx.shadowOffsetY = offsetY;
+      ctx.shadowBlur = blur;
+      ctx.shadowColor = color;
+    },
+    setTextBaseline(val) {
+      ctx.textBaseline = val;
+    },
+    createCircularGradient() {},
+    draw() {},
+  });
+}

+ 1 - 0
miniprogram_npm/vant-weapp/circle/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 0 - 0
miniprogram_npm/vant-weapp/circle/index.js


Some files were not shown because too many files changed in this diff