Leo 3 жил өмнө
commit
48d0bc7817
100 өөрчлөгдсөн 31169 нэмэгдсэн , 0 устгасан
  1. 2 0
      .env.development
  2. 10 0
      .env.production
  3. 27 0
      .eslintrc.js
  4. 31 0
      .gitignore
  5. 3 0
      .husky/commit-msg
  6. 4 0
      .husky/pre-commit
  7. 27 0
      README.md
  8. 86 0
      babel.config.js
  9. 12 0
      jest.config.js
  10. 4 0
      lint-staged.config.js
  11. 15 0
      mock/README.md
  12. 24 0
      mock/index.js
  13. 21 0
      mock/mock.config.js
  14. 10 0
      mock/utils.js
  15. 137 0
      package.json
  16. 27 0
      postcss.config.js
  17. 1 0
      prettier.config.js
  18. BIN
      public/favicon.ico
  19. 39 0
      public/index.html
  20. 77 0
      scripts/.vsc-commitizen.json
  21. 168 0
      scripts/upload-mp-weixin.js
  22. 216 0
      scripts/validate-commit-msg.js
  23. 51 0
      src/App.vue
  24. 185 0
      src/components/activity/activity.vue
  25. 203 0
      src/components/buy-btns/buy-btns.vue
  26. 277 0
      src/components/coupon/coupon.vue
  27. 137 0
      src/components/home-sale-item/home-sale-item.vue
  28. 174 0
      src/components/level-item/level-item.vue
  29. 477 0
      src/components/lff-barrage/lff-barrage.vue
  30. 18 0
      src/components/lff-barrage/markdown.md
  31. 236 0
      src/components/list-item/list-item.vue
  32. 274 0
      src/components/paypop/paypop.scss
  33. 594 0
      src/components/paypop/paypop.vue
  34. 385 0
      src/components/payresult/payresult.scss
  35. 274 0
      src/components/payresult/payresult.vue
  36. 116 0
      src/components/popup-dialog/popup-dialog.vue
  37. 94 0
      src/components/popup-img-detail/popup-img-detail.vue
  38. 220 0
      src/components/popup-signin/popup-signin.vue
  39. 41 0
      src/components/task-btn/task-btn.vue
  40. 13950 0
      src/components/wangding-pickerAddress/data.js
  41. 110 0
      src/components/wangding-pickerAddress/wangding-pickerAddress.vue
  42. 176 0
      src/components/yfs-item/yfs-item.vue
  43. 116 0
      src/components/yfs-record-item/yfs-record-item.vue
  44. 117 0
      src/components/yfs-result-item/yfs-result-item.vue
  45. BIN
      src/fonts/UnidreamLED/UnidreamLED.ttf
  46. 1 0
      src/fonts/ysbth/chars.txt
  47. BIN
      src/fonts/ysbth/ysbth.TTF
  48. 268 0
      src/lib/api/api.js
  49. 5 0
      src/lib/utils/errcode.js
  50. 20 0
      src/lib/utils/jumpToUrl.js
  51. 151 0
      src/lib/utils/login.js
  52. 186 0
      src/lib/utils/request.js
  53. 75 0
      src/lib/utils/showRewardedVideoAd.js
  54. 107 0
      src/lib/utils/wxSubscribe.js
  55. 21 0
      src/main.js
  56. 168 0
      src/manifest.json
  57. 279 0
      src/pages.json
  58. 411 0
      src/pages/activity/detail.vue
  59. 113 0
      src/pages/activity/index.vue
  60. 268 0
      src/pages/address/add.vue
  61. 457 0
      src/pages/address/address.vue
  62. 410 0
      src/pages/beto/beto.vue
  63. 310 0
      src/pages/community/community.vue
  64. 344 0
      src/pages/detail/detail.scss
  65. 462 0
      src/pages/detail/detail.vue
  66. 164 0
      src/pages/help/help.vue
  67. 70 0
      src/pages/help/help_about.vue
  68. 80 0
      src/pages/help/help_contact.vue
  69. 110 0
      src/pages/help/help_rule.vue
  70. 331 0
      src/pages/help/help_user.vue
  71. 406 0
      src/pages/index/index.scss
  72. 558 0
      src/pages/index/index.vue
  73. 149 0
      src/pages/index/list.scss
  74. 107 0
      src/pages/index/list.vue
  75. 42 0
      src/pages/my/coupon.scss
  76. 94 0
      src/pages/my/coupon.vue
  77. 349 0
      src/pages/my/invite.vue
  78. 200 0
      src/pages/my/messages.vue
  79. 425 0
      src/pages/my/my.vue
  80. 456 0
      src/pages/my/recharge.vue
  81. 194 0
      src/pages/my/wallet.vue
  82. 248 0
      src/pages/order/order.vue
  83. 387 0
      src/pages/order/sended.vue
  84. 515 0
      src/pages/order/unsend.scss
  85. 764 0
      src/pages/order/unsend.vue
  86. 518 0
      src/pages/reward/detail.scss
  87. 879 0
      src/pages/reward/detail.vue
  88. 67 0
      src/pages/reward/index.scss
  89. 228 0
      src/pages/reward/index.vue
  90. 98 0
      src/pages/rule/rule.vue
  91. 484 0
      src/pages/task/index.vue
  92. 24 0
      src/pages/webview/webview.vue
  93. BIN
      src/static/activity/label-end.png
  94. BIN
      src/static/activity/label-notstarted.png
  95. BIN
      src/static/activity/label-progress.png
  96. BIN
      src/static/app-icon.png
  97. BIN
      src/static/bullet/avatar-R.png
  98. BIN
      src/static/bullet/avatar-SP.png
  99. BIN
      src/static/bullet/avatar-SR.png
  100. BIN
      src/static/bullet/avatar-SSR.png

+ 2 - 0
.env.development

@@ -0,0 +1,2 @@
+# 指定构建模式
+NODE_ENV = development

+ 10 - 0
.env.production

@@ -0,0 +1,10 @@
+# 生产环境
+# 重写 .env 环境变量
+
+# 指定构建模式
+NODE_ENV = production
+BABEL_ENV = production
+
+# 是否生成 source map
+GENERATE_SOURCEMAP = false
+

+ 27 - 0
.eslintrc.js

@@ -0,0 +1,27 @@
+module.exports = {
+  root: true,
+  env: {
+    node: true,
+  },
+  extends: [
+    "plugin:vue/essential",
+    "eslint:recommended",
+    "@vue/typescript/recommended",
+    "plugin:prettier/recommended",
+  ],
+  parserOptions: {
+    ecmaVersion: 2020,
+  },
+  rules: {
+    "no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
+    "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off",
+    "no-empty": ["error", { allowEmptyCatch: true }],
+    "vue/no-v-text-v-html-on-component": "off",
+  },
+  globals: {
+    uni: true,
+    wx: true,
+    getCurrentPages: true,
+    getApp: true,
+  },
+};

+ 31 - 0
.gitignore

@@ -0,0 +1,31 @@
+.DS_Store
+_html/
+node_modules/
+unpackage/
+dist/
+build/
+package-lock.json
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Editor directories and files
+.project
+.idea
+.vscode
+.history
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw*
+
+.env.local
+.env.*.local
+mock_url.json

+ 3 - 0
.husky/commit-msg

@@ -0,0 +1,3 @@
+#!/usr/bin/env sh
+
+node scripts/validate-commit-msg.js

+ 4 - 0
.husky/pre-commit

@@ -0,0 +1,4 @@
+#!/usr/bin/env sh
+. "$(dirname -- "$0")/_/husky.sh"
+
+yarn run lint-staged

+ 27 - 0
README.md

@@ -0,0 +1,27 @@
+# 伴鱼国学
+
+## 初始化
+```
+yarn install
+```
+
+## 开发H5
+```
+yarn dev:h5
+```
+
+## 开发小程序
+```
+yarn dev:mp-weixin
+```
+开发者工具载入目录:./dist/dev/mp-weixin
+
+## 打包H5
+```
+yarn build:h5
+```
+
+## 打包小程序
+```
+yarn build:mp-weixin
+```

+ 86 - 0
babel.config.js

@@ -0,0 +1,86 @@
+const webpack = require("webpack");
+const plugins = [];
+
+if (process.env.UNI_OPT_TREESHAKINGNG) {
+  plugins.push(
+    require("@dcloudio/vue-cli-plugin-uni-optimize/packages/babel-plugin-uni-api/index.js")
+  );
+}
+
+if (
+  (process.env.UNI_PLATFORM === "app-plus" && process.env.UNI_USING_V8) ||
+  (process.env.UNI_PLATFORM === "h5" &&
+    process.env.UNI_H5_BROWSER === "builtin")
+) {
+  const path = require("path");
+
+  const isWin = /^win/.test(process.platform);
+
+  const normalizePath = (path) => (isWin ? path.replace(/\\/g, "/") : path);
+
+  const input = normalizePath(process.env.UNI_INPUT_DIR);
+  try {
+    plugins.push([
+      require("@dcloudio/vue-cli-plugin-hbuilderx/packages/babel-plugin-console"),
+      {
+        file(file) {
+          file = normalizePath(file);
+          if (file.indexOf(input) === 0) {
+            return path.relative(input, file);
+          }
+          return false;
+        },
+      },
+    ]);
+  } catch (e) {}
+}
+
+process.UNI_LIBRARIES = process.UNI_LIBRARIES || ["@dcloudio/uni-ui"];
+process.UNI_LIBRARIES.forEach((libraryName) => {
+  plugins.push([
+    "import",
+    {
+      libraryName: libraryName,
+      customName: (name) => {
+        return `${libraryName}/lib/${name}/${name}`;
+      },
+    },
+  ]);
+});
+
+if (process.env.UNI_PLATFORM !== "h5") {
+  plugins.push("@babel/plugin-transform-runtime");
+}
+
+const config = {
+  presets: [
+    [
+      "@vue/app",
+      {
+        modules: webpack.version[0] > 4 ? "auto" : "commonjs",
+        useBuiltIns: process.env.UNI_PLATFORM === "h5" ? "usage" : "entry",
+        exclude: ["h5", "app-plus"].includes(process.env.UNI_PLATFORM)
+          ? undefined
+          : [
+              "@babel/plugin-transform-async-to-generator",
+              "@babel/plugin-transform-regenerator",
+            ],
+      },
+    ],
+  ],
+  plugins,
+};
+
+const UNI_H5_TEST = "**/@dcloudio/uni-h5/dist/index.umd.min.js";
+if (process.env.NODE_ENV === "production") {
+  config.overrides = [
+    {
+      test: UNI_H5_TEST,
+      compact: true,
+    },
+  ];
+} else {
+  config.ignore = [UNI_H5_TEST];
+}
+
+module.exports = config;

+ 12 - 0
jest.config.js

@@ -0,0 +1,12 @@
+module.exports = {
+  globalTeardown: "@dcloudio/uni-automator/dist/teardown.js",
+  testEnvironment: "@dcloudio/uni-automator/dist/environment.js",
+  testEnvironmentOptions: {},
+  testTimeout: 15000,
+  reporters: ["default"],
+  watchPathIgnorePatterns: ["/node_modules/", "/dist/", "/.git/"],
+  moduleFileExtensions: ["js", "json"],
+  rootDir: __dirname,
+  testMatch: ["<rootDir>/src/**/*test.[jt]s?(x)"],
+  testPathIgnorePatterns: ["/node_modules/"],
+};

+ 4 - 0
lint-staged.config.js

@@ -0,0 +1,4 @@
+module.exports = {
+  "*.{ts,vue,js,ts,less,scss}": "prettier --write",
+  "*.{js,jsx,vue,ts,tsx}": "vue-cli-service lint",
+};

+ 15 - 0
mock/README.md

@@ -0,0 +1,15 @@
+# MOCK 系统
+>  无第三方库依赖,利用webpack dev server的特性进行请求的mock
+
+# HOW TO USE
+
+ * 开关:在mock.config.js中 设置enable属性进行全局的开关控制 true启用mock ,false 不启用mock
+
+ * 编写mock数据
+
+## 目录结构
+-- index.js mock 入口文件 一般情况下勿动
+-- mock.config.js mock 配置文件
+-- utils.js 一些配置文件
+-- klian 对应的api路径
+

+ 24 - 0
mock/index.js

@@ -0,0 +1,24 @@
+const utils = require("./utils");
+
+function mocker(middlewares, { app }) {
+  app.use(async function middleware(req, res, next) {
+    const mockConfig = utils.requireUncached("./mock.config");
+    if (mockConfig.enable) {
+      const path = req.path.split("?")[0];
+      if (mockConfig.api[path]) {
+        console.log("Mocker enter");
+        console.log("mock:", req.path);
+        const data = await mockConfig.api[path](req);
+        data._debug = {
+          msg: "这是一个mock数据",
+        };
+        res.json(data);
+        return;
+      }
+    }
+    next();
+  });
+  return middlewares;
+}
+
+module.exports = mocker;

+ 21 - 0
mock/mock.config.js

@@ -0,0 +1,21 @@
+const utils = require("./utils");
+
+function getApi(path) {
+  return async (req) => {
+    const data = await utils.requireUncached(path)(req);
+    return data;
+  };
+}
+
+const mockConfig = {
+  enable: false, // 是否启用mock
+  api: {},
+};
+
+Object.keys(mockConfig.api).forEach((key) => {
+  if (mockConfig.api[key] === true) {
+    mockConfig.api[key] = getApi(`.${key}`);
+  }
+});
+
+module.exports = mockConfig;

+ 10 - 0
mock/utils.js

@@ -0,0 +1,10 @@
+function requireUncached(path) {
+  delete require.cache[require.resolve(path)];
+  return require(path);
+}
+
+module.exports = {
+  requireUncached,
+};
+
+module.exports.default = module.exports;

+ 137 - 0
package.json

@@ -0,0 +1,137 @@
+{
+  "name": "chinese",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "serve": "npm run dev:h5",
+    "build": "npm run build:h5",
+    "build:app-plus": "cross-env NODE_ENV=production UNI_PLATFORM=app-plus vue-cli-service uni-build",
+    "build:custom": "cross-env NODE_ENV=production uniapp-cli custom",
+    "build:h5": "cross-env NODE_ENV=production UNI_PLATFORM=h5 vue-cli-service uni-build",
+    "build:mp-360": "cross-env NODE_ENV=production UNI_PLATFORM=mp-360 vue-cli-service uni-build",
+    "build:mp-alipay": "cross-env NODE_ENV=production UNI_PLATFORM=mp-alipay vue-cli-service uni-build",
+    "build:mp-baidu": "cross-env NODE_ENV=production UNI_PLATFORM=mp-baidu vue-cli-service uni-build",
+    "build:mp-jd": "cross-env NODE_ENV=production UNI_PLATFORM=mp-jd vue-cli-service uni-build",
+    "build:mp-kuaishou": "cross-env NODE_ENV=production UNI_PLATFORM=mp-kuaishou vue-cli-service uni-build",
+    "build:mp-lark": "cross-env NODE_ENV=production UNI_PLATFORM=mp-lark vue-cli-service uni-build",
+    "build:mp-qq": "cross-env NODE_ENV=production UNI_PLATFORM=mp-qq vue-cli-service uni-build",
+    "build:mp-toutiao": "cross-env NODE_ENV=production UNI_PLATFORM=mp-toutiao vue-cli-service uni-build",
+    "build:mp-weixin": "cross-env NODE_ENV=production UNI_PLATFORM=mp-weixin vue-cli-service uni-build",
+    "build:mp-xhs": "cross-env NODE_ENV=production UNI_PLATFORM=mp-xhs vue-cli-service uni-build",
+    "build:quickapp-native": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-native vue-cli-service uni-build",
+    "build:quickapp-webview": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-webview vue-cli-service uni-build",
+    "build:quickapp-webview-huawei": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-webview-huawei vue-cli-service uni-build",
+    "build:quickapp-webview-union": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-webview-union vue-cli-service uni-build",
+    "dev:app-plus": "cross-env NODE_ENV=development UNI_PLATFORM=app-plus vue-cli-service uni-build --watch",
+    "dev:custom": "cross-env NODE_ENV=development uniapp-cli custom",
+    "dev:h5": "cross-env NODE_ENV=development UNI_PLATFORM=h5 vue-cli-service uni-serve",
+    "dev:mp-360": "cross-env NODE_ENV=development UNI_PLATFORM=mp-360 vue-cli-service uni-build --watch",
+    "dev:mp-alipay": "cross-env NODE_ENV=development UNI_PLATFORM=mp-alipay vue-cli-service uni-build --watch",
+    "dev:mp-baidu": "cross-env NODE_ENV=development UNI_PLATFORM=mp-baidu vue-cli-service uni-build --watch",
+    "dev:mp-jd": "cross-env NODE_ENV=development UNI_PLATFORM=mp-jd vue-cli-service uni-build --watch",
+    "dev:mp-kuaishou": "cross-env NODE_ENV=development UNI_PLATFORM=mp-kuaishou vue-cli-service uni-build --watch",
+    "dev:mp-lark": "cross-env NODE_ENV=development UNI_PLATFORM=mp-lark vue-cli-service uni-build --watch",
+    "dev:mp-qq": "cross-env NODE_ENV=development UNI_PLATFORM=mp-qq vue-cli-service uni-build --watch",
+    "dev:mp-toutiao": "cross-env NODE_ENV=development UNI_PLATFORM=mp-toutiao vue-cli-service uni-build --watch",
+    "dev:mp-weixin": "cross-env NODE_ENV=development UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch",
+    "dev:mp-xhs": "cross-env NODE_ENV=development UNI_PLATFORM=mp-xhs vue-cli-service uni-build --watch",
+    "dev:quickapp-native": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-native vue-cli-service uni-build --watch",
+    "dev:quickapp-webview": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-webview vue-cli-service uni-build --watch",
+    "dev:quickapp-webview-huawei": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-webview-huawei vue-cli-service uni-build --watch",
+    "dev:quickapp-webview-union": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-webview-union vue-cli-service uni-build --watch",
+    "info": "node node_modules/@dcloudio/vue-cli-plugin-uni/commands/info.js",
+    "serve:quickapp-native": "node node_modules/@dcloudio/uni-quickapp-native/bin/serve.js",
+    "test:android": "cross-env UNI_PLATFORM=app-plus UNI_OS_NAME=android jest -i",
+    "test:h5": "cross-env UNI_PLATFORM=h5 jest -i",
+    "test:ios": "cross-env UNI_PLATFORM=app-plus UNI_OS_NAME=ios jest -i",
+    "test:mp-baidu": "cross-env UNI_PLATFORM=mp-baidu jest -i",
+    "test:mp-weixin": "cross-env UNI_PLATFORM=mp-weixin jest -i",
+    "lint": "vue-cli-service lint",
+    "format": "prettier --write {scripts,types,src}/**/*.{ts,vue,js,less,scss} types/**/*.ts",
+    "prepare": "husky install",
+    "upload": "node scripts/upload.js",
+    "upload:mp-weixin": "node scripts/upload-mp-weixin.js"
+  },
+  "dependencies": {
+    "@dcloudio/uni-app": "2.0.2-alpha-3061220221207001",
+    "@dcloudio/uni-app-plus": "2.0.1-36520221121002",
+    "@dcloudio/uni-h5": "2.0.1-36520221121002",
+    "@dcloudio/uni-i18n": "2.0.1-36520221121002",
+    "@dcloudio/uni-mp-360": "2.0.1-36520221121002",
+    "@dcloudio/uni-mp-alipay": "2.0.1-36520221121002",
+    "@dcloudio/uni-mp-baidu": "2.0.1-36520221121002",
+    "@dcloudio/uni-mp-jd": "2.0.1-36520221121002",
+    "@dcloudio/uni-mp-kuaishou": "2.0.1-36520221121002",
+    "@dcloudio/uni-mp-lark": "2.0.1-36520221121002",
+    "@dcloudio/uni-mp-qq": "2.0.1-36520221121002",
+    "@dcloudio/uni-mp-toutiao": "2.0.1-36520221121002",
+    "@dcloudio/uni-mp-vue": "2.0.1-36520221121002",
+    "@dcloudio/uni-mp-weixin": "2.0.1-36520221121002",
+    "@dcloudio/uni-mp-xhs": "2.0.1-36520221121002",
+    "@dcloudio/uni-quickapp-native": "2.0.1-36520221121002",
+    "@dcloudio/uni-quickapp-webview": "2.0.1-36520221121002",
+    "@dcloudio/uni-stacktracey": "2.0.1-36520221121002",
+    "@dcloudio/uni-stat": "2.0.1-36520221121002",
+    "@dcloudio/uni-ui": "^1.4.23",
+    "@vue/shared": "^3.0.0",
+    "core-js": "^3.8.3",
+    "dayjs": "^1.11.7",
+    "decimal.js": "^10.4.3",
+    "flyio": "^0.6.2",
+    "qs": "^6.11.0",
+    "vue": ">= 2.6.14 < 2.7",
+    "vuex": "^3.2.0"
+  },
+  "devDependencies": {
+    "@babel/plugin-syntax-typescript": "^7.2.0",
+    "@dcloudio/types": "^3.0.4",
+    "@dcloudio/uni-automator": "2.0.1-36520221121002",
+    "@dcloudio/uni-cli-i18n": "2.0.1-36520221121002",
+    "@dcloudio/uni-cli-shared": "2.0.1-36520221121002",
+    "@dcloudio/uni-helper-json": "*",
+    "@dcloudio/uni-migration": "2.0.1-36520221121002",
+    "@dcloudio/uni-template-compiler": "2.0.1-36520221121002",
+    "@dcloudio/vue-cli-plugin-hbuilderx": "2.0.1-36520221121002",
+    "@dcloudio/vue-cli-plugin-uni": "2.0.1-36520221121002",
+    "@dcloudio/vue-cli-plugin-uni-optimize": "2.0.1-36520221121002",
+    "@dcloudio/webpack-uni-mp-loader": "2.0.1-36520221121002",
+    "@dcloudio/webpack-uni-pages-loader": "2.0.1-36520221121002",
+    "@vue/babel-preset-app": "^5.0.8",
+    "@vue/cli-plugin-babel": "~5.0.0",
+    "@vue/cli-plugin-eslint": "~5.0.0",
+    "@vue/cli-plugin-typescript": "~5.0.8",
+    "@vue/cli-service": "~5.0.0",
+    "@vue/eslint-config-typescript": "^11.0.2",
+    "babel-loader": "^9.1.2",
+    "babel-plugin-import": "^1.11.0",
+    "copy-webpack-plugin": "^5.1.2",
+    "cross-env": "^7.0.2",
+    "eslint": "^8.29.0",
+    "eslint-config-prettier": "^8.5.0",
+    "eslint-plugin-prettier": "^4.2.1",
+    "eslint-plugin-vue": "^9.8.0",
+    "findup": "^0.1.5",
+    "husky": "^8.0.2",
+    "jest": "^25.4.0",
+    "lint-staged": "^13.1.0",
+    "mini-types": "*",
+    "miniprogram-api-typings": "*",
+    "miniprogram-ci": "^1.9.3",
+    "postcss-comment": "^2.0.0",
+    "postcss-cssnext": "^3.1.1",
+    "prettier": "^2.8.1",
+    "raw-loader": "^4.0.2",
+    "sass": "^1.56.2",
+    "sass-loader": "^13.2.0",
+    "typescript": "~4.5.5",
+    "uni-read-pages": "^1.0.5",
+    "vue-template-compiler": ">= 2.6.14 < 2.7"
+  },
+  "browserslist": [
+    "Android >= 4.4",
+    "ios >= 9"
+  ],
+  "uni-app": {
+    "scripts": {}
+  }
+}

+ 27 - 0
postcss.config.js

@@ -0,0 +1,27 @@
+const path = require("path");
+const webpack = require("webpack");
+const config = {
+  parser: require("postcss-comment"),
+  plugins: [
+    require("postcss-import")({
+      resolve(id) {
+        if (id.startsWith("~@/")) {
+          return path.resolve(process.env.UNI_INPUT_DIR, id.substr(3));
+        } else if (id.startsWith("@/")) {
+          return path.resolve(process.env.UNI_INPUT_DIR, id.substr(2));
+        } else if (id.startsWith("/") && !id.startsWith("//")) {
+          return path.resolve(process.env.UNI_INPUT_DIR, id.substr(1));
+        }
+        return id;
+      },
+    }),
+    require("autoprefixer")({
+      remove: process.env.UNI_PLATFORM !== "h5",
+    }),
+    require("@dcloudio/vue-cli-plugin-uni/packages/postcss"),
+  ],
+};
+if (webpack.version[0] > 4) {
+  delete config.parser;
+}
+module.exports = config;

+ 1 - 0
prettier.config.js

@@ -0,0 +1 @@
+module.exports = {};

BIN
public/favicon.ico


+ 39 - 0
public/index.html

@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <meta
+      name="viewport"
+      content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, viewport-fit=cover"
+    />
+    <link rel="icon" href="<%= BASE_URL %>favicon.ico" />
+    <title><%= htmlWebpackPlugin.options.title %></title>
+    <meta name="description" content="" />
+    <meta name="keywords" content="" />
+    <!-- OG -->
+    <meta property="og:locale" content="en" />
+    <meta property="og:type" content="website" />
+    <meta property="og:url" content="" />
+    <meta property="og:site_name" content="" />
+    <meta property="og:title" content="" />
+    <meta property="og:description" content="" />
+    <meta property="og:image" content="" />
+    <meta property="og:image:alt" content="" />
+    <meta property="og:image:type" content="image/png" />
+    <meta property="og:image:width" content="128" />
+    <meta property="og:image:height" content="128" />
+    <link
+      rel="stylesheet"
+      href="<%= BASE_URL %>static/index.<%= VUE_APP_INDEX_CSS_HASH %>.css"
+    />
+  </head>
+
+  <body>
+    <noscript>
+      <strong>您需要在浏览器的设置中启用 JavaScript 才能运行此页面。</strong>
+    </noscript>
+    <div id="app"></div>
+    <!-- built files will be auto injected -->
+  </body>
+</html>

+ 77 - 0
scripts/.vsc-commitizen.json

@@ -0,0 +1,77 @@
+{
+  "scopes": [
+    {
+      "label": "build",
+      "description": "Layout/下文件"
+    },
+    {
+      "label": "lint",
+      "description": "components/下文件"
+    },
+    {
+      "label": "server",
+      "description": "cli/下文件"
+    },
+    {
+      "label": "env",
+      "description": "环境配置"
+    },
+    {
+      "label": "utils",
+      "description": "utils/下文件"
+    }
+  ],
+  "types": [
+    {
+      "description": "有新功能",
+      "title": "Features",
+      "label": "feat"
+    },
+    { "description": "修复了一个bug", "title": "Bug Fixes", "label": "fix" },
+    {
+      "description": "只更新了文档",
+      "title": "Documentation",
+      "label": "docs"
+    },
+    {
+      "description": "更改不影响代码的含义(例如:空白、格式化、添加分号等)",
+      "title": "Styles",
+      "label": "style"
+    },
+    {
+      "description": "重构代码(即不是新增功能,也不是修改bug的代码变动)",
+      "title": "Code Refactoring",
+      "label": "refactor"
+    },
+    {
+      "description": "优化代码,提高性能",
+      "title": "Performance Improvements",
+      "label": "perf"
+    },
+    {
+      "description": "添加缺失的测试或修正现有的测试",
+      "title": "Tests",
+      "label": "test"
+    },
+    {
+      "description": "更改影响构建系统或外部依赖 (例如'scopes'为: gulp, webpack, npm)",
+      "title": "Builds",
+      "label": "build"
+    },
+    {
+      "description": "更改我们的CI配置或脚本 (例如'scopes'为: Travis, Circle, BrowserStack, SauceLabs)",
+      "title": "Continuous Integrations",
+      "label": "ci"
+    },
+    {
+      "description": "其他修改,没有改动业务代码等目录的代码",
+      "title": "Chores",
+      "label": "chore"
+    },
+    {
+      "description": "回滚到前一个 commit",
+      "title": "Reverts",
+      "label": "revert"
+    }
+  ]
+}

+ 168 - 0
scripts/upload-mp-weixin.js

@@ -0,0 +1,168 @@
+const fs = require("fs");
+const path = require("path");
+const https = require("https");
+const ci = require("miniprogram-ci");
+const execSync = require("child_process").execSync;
+
+const distDir = path.resolve(__dirname, "../dist");
+
+// 实例化小程序 ci
+const project = new ci.Project({
+  appid: "",
+  type: "miniProgram",
+  projectPath: path.resolve(distDir, "./build/mp-weixin"),
+  privateKeyPath: path.resolve(__dirname, "./private..key"),
+  ignores: [],
+});
+
+// 钉钉webhook
+const dingTalkWebHook = `https://oapi.dingtalk.com/robot/send?access_token=${
+  process.env.DINGTALK_WEBHOOK_TOKEN || ""
+}`;
+
+const gitShortKey = execSync("git rev-parse --short HEAD").toString().trim();
+const gitCommitMsg = execSync("git log --pretty=format:“%s” -1")
+  .toString()
+  .trim()
+  .replace(/(^["“])|(["”]$)/g, "");
+const gitCommitName = execSync("git log --pretty=format:“%cn” -1")
+  .toString()
+  .trim()
+  .replace(/(^["“])|(["”]$)/g, "");
+
+let desc = `${gitCommitName}: ${gitCommitMsg}`;
+
+if (process.env.change_desc && process.env.operator) {
+  desc = `${process.env.operator}: ${process.env.change_desc}`;
+}
+
+// 发布钉钉通知
+const postDingTalk = (qrcode, isPro = false, version) => {
+  const ver = isPro ? "体验版" : "开发版";
+
+  const data = JSON.stringify({
+    msgtype: "markdown",
+    markdown: {
+      title: `小程序 【${ver}】上传成功`,
+      text: `# [小程序 【${ver}】](${qrcode})上传成功 \n\n @13718996400 \n\n > ${desc} ${
+        version ? `\n\n > version: ${version}` : ""
+      } \n\n ![小程序二维码](${qrcode})${
+        isPro
+          ? " \n\n 小程序发布请前往[小程序版本管理](https://mp.weixin.qq.com/)"
+          : ""
+      }`,
+    },
+    at: {
+      atMobiles: ["13718996400"],
+      atUserIds: [""],
+      isAtAll: false,
+    },
+  });
+  return new Promise((resolve, reject) => {
+    const req = https.request(
+      {
+        hostname: "oapi.dingtalk.com",
+        port: 443,
+        path: dingTalkWebHook,
+        method: "POST",
+        headers: {
+          "Content-Type": "application/json",
+        },
+      },
+      (res) => {
+        res.on("data", (d) => {
+          const resData = JSON.parse(d.toString());
+          if (res.statusCode === 200 && resData.errcode === 0) {
+            resolve(resData);
+          } else {
+            reject(resData);
+          }
+        });
+      }
+    );
+
+    req.on("error", (e) => {
+      reject(e);
+    });
+
+    req.write(data);
+    req.end();
+  });
+};
+
+const onProgressUpdate = (taskStatus) => {
+  switch (taskStatus._status) {
+    case "doing":
+      console.log("上传中: ", taskStatus._msg);
+      break;
+    case "done":
+      console.log("上传完成: ", taskStatus._msg);
+      break;
+  }
+};
+
+// 测试环境用开发版,不上传至小程序后台
+const preview = async () => {
+  try {
+    fs.mkdirSync(path.resolve(distDir, `./qrcode`));
+  } catch (e) {}
+  const previewResult = await ci.preview({
+    project,
+    desc,
+    setting: {},
+    qrcodeFormat: "image",
+    qrcodeOutputDest: path.resolve(distDir, `./qrcode/${gitShortKey}.jpg`),
+    onProgressUpdate,
+    pagePath: "pages/index/index", // 预览页面
+    // searchQuery: 'a=1&b=2',  // 预览参数 [注意!]这里的`&`字符在命令行中应写成转义字符`\&`
+  });
+
+  console.log("小程序上传完成🚀 ", previewResult);
+
+  try {
+    console.info("上传二维码完成 🚀", `/${gitShortKey}.jpg`);
+  } catch (e) {
+    console.info("上传出错,请检查网络或过会再试 ❌", e);
+    throw new Error(e);
+  }
+  try {
+    await postDingTalk(`/${gitShortKey}.jpg`);
+  } catch (e) {}
+};
+
+// 正式环境用体验版,上传至小程序后台
+const publish = async () => {
+  const version =
+    process.env.MP_VERSON || process.env.version
+      ? `1.0.${process.env.version}`
+      : "1.0.0";
+  try {
+    const uploadResult = await ci.upload({
+      project,
+      version,
+      desc,
+      setting: {},
+      onProgressUpdate,
+    });
+    console.log("小程序上传完成🚀 ", uploadResult);
+  } catch (e) {
+    console.info("上传出错,请检查网络或过会再试 ❌", e);
+    throw new Error(e);
+  }
+
+  try {
+    await postDingTalk(`.jpg`, true, version);
+  } catch (e) {
+    console.log("钉钉通知失败:", e);
+  }
+};
+
+(async () => {
+  if (process.argv.includes("--publish")) {
+    console.log("发布小程序🚀");
+    publish();
+  } else {
+    console.log("上传预览小程序🚀");
+    preview();
+  }
+})();

+ 216 - 0
scripts/validate-commit-msg.js

@@ -0,0 +1,216 @@
+#!/usr/bin/env node
+
+/**
+ * Git COMMIT-MSG hook for validating commit message
+ * See https://docs.google.com/document/d/1rk04jEuGfk9kYzfqCuOlPTSJw3hEDZJTBN5E5f1SALo/edit
+ *
+ * Installation:
+ * >> use ghooks, config in package.json
+ */
+
+const fs = require("fs");
+const util = require("util");
+const resolve = require("path").resolve;
+const findup = require("findup");
+
+function semverRegex() {
+  return /(?<=^v?|\sv?)(?:(?:0|[1-9]\d{0,9}?)\.){2}(?:0|[1-9]\d{0,9})(?:-(?:--+)?(?:0|[1-9]\d*|\d*[a-z]+\d*)){0,100}(?=$| |\+|\.)(?:(?<=-\S+)(?:\.(?:--?|[\da-z-]*[a-z-]\d*|0|[1-9]\d*)){1,100}?)?(?!\.)(?:\+(?:[\da-z]\.?-?){1,100}?(?!\w))?(?!\+)/gi;
+}
+
+const config = getConfig();
+const MAX_LENGTH = config.maxSubjectLength || 100;
+// 忽略commit msg 中 以 ‘WIP、v’开头的字符串或语义化字符串
+const IGNORED = new RegExp(
+  util.format("(^WIP)|(^v)|(^%s$)", semverRegex().source)
+);
+
+function log(...content) {
+  return console.log("validate commit msg:", ...content);
+}
+
+log("校验 commit message");
+
+// fixup! and squash! are part of Git, commits tagged with them are not intended
+// to be merged, cf. https://git-scm.com/docs/git-commit
+const PATTERN = /^((fixup! |squash! )?(\w+)(?:\(([^)\s]+)\))?: (.+))(?:\n|$)/;
+const MERGE_COMMIT_PATTERN = /^Merge /;
+const error = function (title, ...argv) {
+  // gitx does not display it
+  // http://gitx.lighthouseapp.com/projects/17830/tickets/294-feature-display-hook
+  // - error-message-when-hook-fails
+  // https://groups.google.com/group/gitx/browse_thread/thread/a03bcab60844b812
+  const type = config.warnOnFail ? "warn" : "error";
+  console[type](`validate commit msg: commit message 不符合规范`);
+  console[type](`validate commit msg: ${title}`, ...argv);
+};
+
+const validateMessage = function (raw) {
+  console.log(raw);
+  // config.types = config.types || resolve(process.cwd(), '.vsc-commitizen.json');
+  const types = config.types ? config.types.map((item) => item.label) : null;
+  const scopes = config.scopes ? config.scopes.map((item) => item.label) : null;
+
+  const messageWithBody = (raw || "")
+    .split("\n")
+    .filter((str) => str.indexOf("#") !== 0)
+    .join("\n");
+
+  const message = messageWithBody.split("\n").shift();
+
+  if (message === "") {
+    log("由于 commit message 为空,所以中止提交。");
+    return false;
+  }
+
+  let isValid = true;
+
+  if (MERGE_COMMIT_PATTERN.test(message)) {
+    log("检测到有 Merge commit。");
+    return true;
+  }
+
+  if (IGNORED.test(message)) {
+    log("忽略 Commit message。");
+    return true;
+  }
+
+  const match = PATTERN.exec(message);
+
+  if (!match) {
+    error(
+      `与规范不相符:
+             <类型 *>[(<作用域>)]: [<emoji>] <主题 *>
+             [空行]
+             [详细描述]
+             [空行]
+             [底部信息]
+ 
+             规范地址:http://confluence.pri.ibanyu.com/pages/viewpage.action?pageId=1737437#Git&Gitlab工作流-4、Git提交信息格式规范
+             类型、作用域 查看:./.vsc-commitizen.json`
+    );
+    isValid = false;
+  } else {
+    const firstLine = match[1];
+    const squashing = !!match[2];
+    const type = match[3];
+    const scope = match[4];
+    const subject = match[5];
+
+    const SUBJECT_PATTERN = new RegExp(config.subjectPattern || ".+");
+    const SUBJECT_PATTERN_ERROR_MSG =
+      config.subjectPatternErrorMsg || "主题不符合规范!";
+
+    if (firstLine.length > MAX_LENGTH && !squashing) {
+      error("主题超过 %d 字符限制!", MAX_LENGTH);
+      isValid = false;
+    }
+
+    if (scopes !== null && scope !== void 0 && scopes.indexOf(scope) === -1) {
+      error('"%s" 是无效的scope!请选择以下范围: %s', scope, scopes.join(", "));
+      isValid = false;
+    }
+
+    if (types !== null && types.indexOf(type) === -1) {
+      error('"%s" 是无效的type!请选择以下类型: %s', type, types.join(", "));
+      isValid = false;
+    }
+
+    if (!SUBJECT_PATTERN.exec(subject)) {
+      error(SUBJECT_PATTERN_ERROR_MSG);
+      isValid = false;
+    }
+  }
+
+  // Some more ideas, do want anything like this ?
+  // - Validate the rest of the message (body, footer, BREAKING CHANGE
+  // annotations)
+  // - allow only specific scopes (eg. fix(docs) should not be allowed ?
+  // - auto correct the type to lower case ?
+  // - auto correct first letter of the subject to lower case ?
+  // - auto add empty line after subject ?
+  // - auto remove empty () ?
+  // - auto correct typos in type ?
+  // - store incorrect messages, so that we can learn
+
+  isValid = isValid || config.warnOnFail;
+
+  if (isValid) {
+    // exit early and skip messaging logics
+    log("校验完成!👏 👏 👏");
+    return true;
+  }
+
+  const argInHelp =
+    config.helpMessage && config.helpMessage.indexOf("%s") !== -1;
+
+  if (argInHelp) {
+    log(config.helpMessage, messageWithBody);
+  } else if (message) {
+    log(message);
+  }
+
+  if (!argInHelp && config.helpMessage) {
+    log(config.helpMessage);
+  }
+
+  return false;
+};
+
+// publish for testing
+exports.validateMessage = validateMessage;
+exports.getGitFolder = getGitFolder;
+exports.config = config;
+
+// hacky start if not run by mocha :-D istanbul ignore next
+if (process.argv.join("").indexOf("mocha") === -1) {
+  const commitMsgFile = `${getGitFolder()}/COMMIT_EDITMSG`;
+  // const incorrectLogFile = commitMsgFile.replace('COMMIT_EDITMSG', 'logs/incorrect-commit-msgs');
+
+  const hasToString = function hasToString(x) {
+    return x && typeof x.toString === "function";
+  };
+
+  fs.readFile(commitMsgFile, (err, buffer) => {
+    const msg = getCommitMessage(buffer);
+
+    if (!validateMessage(msg)) {
+      console.log(`提交信息:\n${msg}\n`);
+      process.exit(1);
+    } else {
+      process.exit(0);
+    }
+
+    function getCommitMessage(buf) {
+      return hasToString(buf) && buf.toString();
+    }
+  });
+}
+
+function getConfig() {
+  const pkgFile = findup.sync(process.cwd(), "package.json");
+  const pkg = JSON.parse(fs.readFileSync(resolve(pkgFile, "package.json")));
+  if (pkg && pkg.config) {
+    return pkg.config["validate-commit-msg"];
+  }
+  const vsc = resolve(process.cwd(), "scripts/.vsc-commitizen.json");
+  const config = fs.existsSync(vsc) ? require(vsc) : {};
+  return config;
+}
+
+function getGitFolder() {
+  let gitDirLocation = "./.git";
+  if (!fs.existsSync(gitDirLocation)) {
+    throw new Error(`Cannot find file ${gitDirLocation}`);
+  }
+
+  if (!fs.lstatSync(gitDirLocation).isDirectory()) {
+    const unparsedText = `${fs.readFileSync(gitDirLocation)}`;
+    gitDirLocation = unparsedText.substring("gitdir: ".length).trim();
+  }
+
+  if (!fs.existsSync(gitDirLocation)) {
+    throw new Error(`Cannot find file ${gitDirLocation}`);
+  }
+
+  return gitDirLocation;
+}

+ 51 - 0
src/App.vue

@@ -0,0 +1,51 @@
+<script>
+export default {
+  globalData: {
+    fuid: 0,
+  },
+  onLaunch(data) {
+    if (data && data.query && data.query.fuid) {
+      this.globalData.fuid = data.query.fuid;
+    }
+
+    // #ifdef MP-WEIXIN
+    const updateManager = wx.getUpdateManager();
+
+    updateManager.onCheckForUpdate(function (res) {
+      // 请求完新版本信息的回调
+      console.log("请求完新版本信息的回调", res.hasUpdate);
+    });
+
+    updateManager.onUpdateReady(function () {
+      wx.showModal({
+        title: "更新提示",
+        content: "新版本已经准备好,是否重启应用?",
+        success: function (res) {
+          if (res.confirm) {
+            // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
+            updateManager.applyUpdate();
+          }
+        },
+      });
+    });
+
+    updateManager.onUpdateFailed(function () {
+      console.log("新版本下载失败");
+    });
+    // #endif
+  },
+  onShow(data) {
+    if (data && data.query && data.query.fuid) {
+      this.globalData.fuid = data.query.fuid;
+    }
+  },
+  onHide() {
+    console.log("App Hide");
+  },
+};
+</script>
+
+<style lang="scss">
+@import "@/static/css/style.css";
+@import "@/static/css/common.scss";
+</style>

+ 185 - 0
src/components/activity/activity.vue

@@ -0,0 +1,185 @@
+<template>
+  <view class="act-item" @click="handleClick">
+    <image class="act-cover" :src="activity.img" mode="widthFix"></image>
+    <image
+      v-if="activity.status === 0"
+      class="act-label"
+      src="@/static/activity/label-notstarted.png"
+      mode=""
+    ></image>
+    <image
+      v-else-if="activity.status === 1"
+      class="act-label"
+      src="@/static/activity/label-progress.png"
+      mode=""
+    ></image>
+    <image
+      v-else-if="activity.status === 2"
+      class="act-label"
+      src="@/static/activity/label-end.png"
+      mode=""
+    ></image>
+    <view class="act-content">
+      <view v-if="activity.title" class="act-desc">{{ activity.title }}</view>
+      <view class="act-title">
+        奖品价值:<text class="color"
+          >{{
+            activity.unit === "元" || activity.unit === "¥"
+              ? `&yen; ${activity.price}`
+              : `${activity.price}${activity.unit}`
+          }}&nbsp;({{ activity.num }}件商品)
+        </text>
+      </view>
+      <view v-if="activity.status === 1" class="act-cd"
+        >距离开奖仅剩:{{ timeStr }}</view
+      >
+      <view v-else class="act-cd">开奖时间:{{ activity.open_time }}</view>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  name: "ActivityItem",
+  props: {
+    activity: {
+      type: Object,
+      default: () => ({}),
+    },
+  },
+  data() {
+    return {
+      timeStr: "",
+    };
+  },
+  created() {
+    this.runCd();
+  },
+  beforeDestroy() {
+    clearTimeout(this.timer);
+  },
+  methods: {
+    handleClick() {
+      this.$emit("click", this.activity);
+    },
+    runCd() {
+      clearTimeout(this.timer);
+      if (this.activity.status !== 1) {
+        return;
+      }
+      const time =
+        new Date(this.activity.open_time.replace(/-/g, "/")).getTime() -
+        Date.now();
+
+      if (time <= 0) {
+        this.$emit("end");
+        return;
+      }
+
+      let str = "";
+      let d = parseInt(time / (1000 * 60 * 60 * 24));
+
+      if (time > 1000 * 60 * 60) {
+        d = parseInt(time / (1000 * 60 * 60 * 24));
+        if (d > 0) {
+          str += `${d}天`;
+        }
+        d = parseInt((time % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
+        str += `${d}小时`;
+      }
+
+      d = parseInt((time % (1000 * 60 * 60)) / (1000 * 60));
+      str += `${d}分`;
+
+      if (time <= 1000 * 60 * 60) {
+        d = parseInt(time / 1000);
+        str += `${d}秒`;
+      }
+
+      this.timeStr = str;
+
+      this.timer = setTimeout(
+        () => {
+          this.runCd();
+        },
+        time <= 1000 * 60 * 60 ? 1000 : 1000 * 60
+      );
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+.act-item {
+  position: relative;
+  margin: 24rpx 0;
+  background: #fff;
+  border-radius: 10rpx;
+
+  .act-cover {
+    width: 100%;
+    height: 240rpx;
+    border-top-left-radius: 10rpx;
+    border-top-right-radius: 10rpx;
+  }
+
+  .act-label {
+    width: 92rpx;
+    height: 92rpx;
+    position: absolute;
+    left: 0;
+    top: 0;
+  }
+
+  .act-content {
+    padding: 16rpx;
+    color: #292d3b;
+
+    .color {
+      color: #08c2c3;
+    }
+
+    .act-title {
+      height: 40rpx;
+      font-size: 28rpx;
+      line-height: 40rpx;
+      white-space: nowrap;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      margin-bottom: 8rpx;
+      // letter-spacing: 0.5rpx;
+    }
+
+    .act-cd {
+      height: 34rpx;
+      font-size: 28rpx;
+      // color: #9496a5;
+      line-height: 34rpx;
+      white-space: nowrap;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      margin: 8rpx 0;
+      // letter-spacing: 0.5rpx;
+    }
+
+    .act-desc {
+      font-weight: 500;
+      // height: 40rpx;
+      font-size: 28rpx;
+      line-height: 40rpx;
+      // white-space: nowrap;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      // margin-top: 4rpx;
+      margin-bottom: 8rpx;
+      white-space: wrap;
+      display: -webkit-box;
+      word-break: break-all;
+      -webkit-box-orient: vertical;
+      -webkit-line-clamp: 2;
+      letter-spacing: 0.3rpx;
+      font-weight: 600;
+    }
+  }
+}
+</style>

+ 203 - 0
src/components/buy-btns/buy-btns.vue

@@ -0,0 +1,203 @@
+<template>
+  <view class="buy-btns">
+    <template v-if="isLogin && !userInfo.phone">
+      <button
+        v-for="item in buyBtns"
+        :key="item.num"
+        :class="[
+          'btn',
+          {
+            'btn-level-2': item.num > 3,
+            'btn-level-3': item.num > 5,
+            'btn-noprice': !item.price,
+          },
+        ]"
+        open-type="getPhoneNumber"
+        @getphonenumber="handlePhoneNumber($event, item)"
+      >
+        <text v-if="item.pop" class="btn-pop">{{ item.pop }}</text>
+        <text class="btn-buy">{{ item.title }}</text>
+        <template v-if="item.price"
+          ><text class="small">&yen;</text> {{ item.price }}</template
+        >
+      </button>
+    </template>
+    <template v-else>
+      <button
+        v-for="item in buyBtns"
+        :key="item.num"
+        :class="[
+          'btn',
+          {
+            'btn-level-2': item.num > 3,
+            'btn-level-3': item.num > 5 || item.num === 0,
+            'btn-noprice': !item.price,
+          },
+        ]"
+        @click="handleClick(item)"
+      >
+        <text v-if="item.pop" class="btn-pop">{{ item.pop }}</text>
+        <text class="btn-buy">{{ item.title }}</text>
+        <template v-if="item.price"
+          ><text class="small">&yen;</text> {{ item.price }}</template
+        >
+      </button>
+    </template>
+  </view>
+</template>
+
+<script>
+import login from "@/lib/utils/login";
+
+export default {
+  props: {
+    userInfo: {
+      type: Object,
+      default: null,
+    },
+    buyBtns: {
+      type: Array,
+      default: () => [], // {'num', 'pop', 'title', 'price'}
+    },
+  },
+  data() {
+    return {};
+  },
+  computed: {
+    isLogin() {
+      return !!this.userInfo && !!this.userInfo.session;
+    },
+  },
+  methods: {
+    // 获取联系方式
+    handlePhoneNumber(e, item) {
+      if (e.detail.code) {
+        login.setPhoneData({
+          phone_code: e.detail.code,
+          session: this.userInfo.session,
+          callback: (data) => {
+            this.$emit("login", data);
+            if (data.phone) {
+              uni.showToast({
+                icon: "none",
+                title: "绑定手机号码成功",
+                duration: 2e3,
+              });
+            }
+
+            this.$emit("click", item, true);
+          },
+          fail: () => {
+            this.$emit("click", item);
+          },
+        });
+      } else {
+        this.$emit("click", item);
+      }
+    },
+    handleClick(item) {
+      if (this.isLogin) {
+        return this.$emit("click", item);
+      }
+
+      uni.showLoading({
+        title: "加载中",
+        mask: true,
+      });
+      login.wxLogin((userInfo) => {
+        uni.hideLoading();
+        this.$emit("login", userInfo);
+        const msg =
+          userInfo.coupons && userInfo.coupons.is_bind_coupon === 1
+            ? userInfo.coupons.is_bind_info
+            : "";
+
+        if (!userInfo.phone || msg) {
+          uni.showToast({
+            icon: "none",
+            title: msg || "登录成功~",
+            duration: 2e3,
+          });
+          if (!userInfo.phone) return;
+        }
+
+        this.$emit("click", item, true);
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+.buy-btns {
+  width: 100%;
+  display: flex;
+  justify-content: space-between;
+  box-sizing: border-box;
+  .btn {
+    box-sizing: border-box;
+    width: 170rpx;
+    height: 88rpx;
+    border: 0;
+    border-radius: 0;
+    background: url(@/static/detail/btn-buy.png) no-repeat;
+    background-size: contain;
+    font-size: 24rpx;
+    line-height: 1;
+    font-weight: 500;
+    color: #000000;
+    padding: 24rpx 0 0;
+    font-family: unidreamledregular, Helvetica Neue, Helvetica, Arial,
+      Hiragino Sans GB, Hiragino Sans GB W3, Microsoft YaHei UI, Microsoft YaHei,
+      WenQuanYi Micro Hei, sans-serif;
+    overflow: visible;
+
+    .btn-pop {
+      position: absolute;
+      top: -20rpx;
+      left: 12rpx;
+      width: 100rpx;
+      height: 32rpx;
+      background: url(@/static/detail/btn-buy-pop-2.png) no-repeat center top;
+      background-size: contain;
+      text-align: center;
+      font-size: 16rpx;
+      font-weight: 500;
+      color: #ff69a8;
+      line-height: 28rpx;
+    }
+    &.btn-level-2 {
+      background-image: url(@/static/detail/btn-buy-2.png);
+    }
+    &.btn-level-3 {
+      background-image: url(@/static/detail/btn-buy-3.png);
+      .btn-pop {
+        background-image: url(@/static/detail/btn-buy-pop-3.png);
+        color: #ffcd2f;
+      }
+    }
+    .small {
+      font-size: 16rpx;
+      margin-right: 4rpx;
+    }
+    .btn-buy {
+      font-family: ysbth, Helvetica Neue, Helvetica, Arial, Hiragino Sans GB,
+        Hiragino Sans GB W3, Microsoft YaHei UI, Microsoft YaHei,
+        WenQuanYi Micro Hei, sans-serif;
+      font-size: 34rpx;
+      color: #000000;
+      line-height: 1;
+      display: block;
+    }
+    &::after {
+      display: none;
+    }
+    &.btn-noprice {
+      padding-top: 32rpx;
+      .btn-buy {
+        font-size: 40rpx;
+      }
+    }
+  }
+}
+</style>

+ 277 - 0
src/components/coupon/coupon.vue

@@ -0,0 +1,277 @@
+<template>
+  <view
+    :class="[
+      'coupon',
+      {
+        'coupon-active': active,
+        disabled: '' + coupon.use_type !== 'undefined' && coupon.use_type !== 1,
+        expired: coupon.use_type === 0,
+        used: coupon.use_type === 2,
+      },
+    ]"
+  >
+    <view :class="['coupon-card', { checked: checked }]" @click="handleClick">
+      <view class="coupon-label">
+        <view class="coupon-title">
+          <text
+            v-if="coupon.unit === '元' || coupon.unit === '¥'"
+            class="small"
+            >&yen;</text
+          >
+          <text class="big">{{ coupon.reduce }}</text>
+          <text
+            v-if="coupon.unit !== '元' && coupon.unit !== '¥'"
+            class="small"
+            >{{ coupon.unit }}</text
+          >
+        </view>
+        <text class="coupon-desc">{{ coupon.satisfy_notice }}</text>
+      </view>
+      <view class="coupon-body">
+        <text class="coupon-title">{{ coupon.coupon_name }}</text>
+        <text class="coupon-desc">{{ coupon.date }}</text>
+        <view class="rule-btn" @click.stop="active = !active">
+          <text class="text">使用规则</text>
+          <image class="arrow" src="@/static/coupon/icon-arrow.png"></image>
+        </view>
+      </view>
+    </view>
+    <view class="rule-text" v-html="coupon.rule"></view>
+  </view>
+</template>
+
+<script>
+export default {
+  name: "CouponItem",
+  props: {
+    coupon: {
+      type: Object,
+      default: () => ({}),
+    },
+    checked: {
+      type: Boolean,
+      default: false,
+    },
+  },
+  data() {
+    return {
+      active: false,
+    };
+  },
+
+  methods: {
+    handleClick() {
+      this.$emit("click", this.coupon);
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+.coupon {
+  margin: 0 atuo;
+  .coupon-card {
+    position: relative;
+    z-index: 1;
+    width: 690rpx;
+    height: 222rpx;
+    box-sizing: border-box;
+    background: url(@/static/coupon/bg.png) no-repeat center bottom;
+    background-size: 100% 100%;
+    display: flex;
+    align-items: center;
+    color: #979797;
+    margin: 0 auto 20rpx;
+
+    .coupon-label {
+      width: 226rpx;
+      height: 164rpx;
+      font-weight: 600;
+      text-align: center;
+      border-right: 2rpx dashed #3d3d53;
+      display: flex;
+      flex-direction: column;
+      justify-content: center;
+
+      .coupon-title {
+        font-size: 36rpx;
+        color: #4efbff;
+
+        .big {
+          font-size: 80rpx;
+        }
+      }
+
+      .coupon-desc {
+        font-size: 28rpx;
+        font-weight: 500;
+      }
+    }
+
+    .coupon-body {
+      flex: 1;
+      padding: 0 24rpx 0 22rpx;
+
+      .coupon-title {
+        display: block;
+        height: 48rpx;
+        font-size: 34rpx;
+        font-weight: 600;
+        line-height: 48rpx;
+        color: #fff;
+        margin-top: 20rpx;
+      }
+      .coupon-desc {
+        display: block;
+        font-size: 24rpx;
+        font-weight: 400;
+        line-height: 34rpx;
+        margin-top: 16rpx;
+      }
+      .rule-btn {
+        border-top: 2rpx dashed #3d3d53;
+        margin-top: 12rpx;
+        padding-top: 14rpx;
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        .text {
+          font-size: 24rpx;
+          font-weight: 400;
+          color: #9496a5;
+          line-height: 34rpx;
+        }
+        .arrow {
+          width: 22rpx;
+          height: 14rpx;
+        }
+      }
+    }
+    &.checked {
+      &::before {
+        content: "";
+        width: 44rpx;
+        height: 44rpx;
+        background: url(@/static/coupon/icon-checked.png) no-repeat center;
+        position: absolute;
+        right: 20rpx;
+        top: 20rpx;
+        background-size: contain;
+      }
+    }
+  }
+  .rule-text {
+    display: none;
+    box-sizing: border-box;
+    width: 690rpx;
+    background: #2c2c38;
+    position: relative;
+    z-index: 0;
+    margin: -20rpx auto 20rpx;
+    padding: 24rpx 24rpx 16rpx;
+    line-height: 42rpx;
+    font-size: 24rpx;
+    font-weight: 400;
+    color: #9496a5;
+    &::before {
+      content: "";
+      position: absolute;
+      width: 50%;
+      height: 30rpx;
+      top: -20rpx;
+      left: 25%;
+      background: #2c2c38;
+    }
+  }
+  &.coupon-active {
+    .coupon-card {
+      // background-image: url(@/static/coupon/bg-active.png);
+      .coupon-body {
+        .rule-btn {
+          .arrow {
+            transform: rotate(180deg);
+          }
+        }
+      }
+    }
+
+    .rule-text {
+      display: block;
+    }
+  }
+  &.disabled {
+    .coupon-card {
+      background-image: url(@/static/coupon/bg-expired.png);
+      color: #979797;
+      .coupon-label {
+        border-color: #d1d1d1;
+        .coupon-title {
+          color: #979797;
+        }
+      }
+      .coupon-body {
+        .coupon-title {
+          color: #979797;
+        }
+        .coupon-desc {
+          color: #9496a5;
+        }
+        .rule-btn {
+          border-color: #d1d1d1;
+          .text {
+            color: #9496a5;
+          }
+        }
+      }
+    }
+    .rule-text {
+      color: #979797;
+      background: #e4e3e9;
+      &::before {
+        content: "";
+        background: #e4e3e9;
+      }
+    }
+    &.coupon-active {
+      .coupon-card {
+        // background-image: url(@/static/coupon/bg-expired-active.png);
+        .coupon-body {
+          .rule-btn {
+            .arrow {
+              transform: rotate(180deg);
+            }
+          }
+        }
+      }
+    }
+  }
+  &.expired {
+    .coupon-card {
+      &::after {
+        content: "";
+        position: absolute;
+        width: 156rpx;
+        height: 156rpx;
+        background: url(@/static/coupon/icon-expired.png) no-repeat center top;
+        background-size: contain;
+        right: 0;
+        top: 0;
+      }
+    }
+  }
+  &.used {
+    .coupon-card {
+      &::after {
+        content: "";
+        position: absolute;
+        width: 156rpx;
+        height: 156rpx;
+        background: url(@/static/coupon/icon-used.png) no-repeat center top;
+        background-size: contain;
+        right: 0;
+        top: 0;
+      }
+    }
+  }
+}
+</style>

+ 137 - 0
src/components/home-sale-item/home-sale-item.vue

@@ -0,0 +1,137 @@
+<template>
+  <view @click="handleClick">
+    <view class="sale-pic">
+      <image class="sale-img" :src="item.img" mode=""></image>
+      <text v-if="endTime > 0" class="sale-text"
+        >限时优惠:
+        <template v-if="saleTime.d">{{ saleTime.d }}天</template>
+        {{ saleTime.h }}:{{ saleTime.m }}:{{ saleTime.s }}
+      </text>
+    </view>
+    <text class="sale-title">{{ item.name }}</text>
+    <view class="sale-sub">
+      <text class="sale-label">&yen;</text>
+      <text class="sale-price">{{ item.price }}</text>
+      <text
+        v-if="
+          Number(item.SourcePrice) &&
+          Number(item.price) < Number(item.SourcePrice)
+        "
+        class="sale-origin"
+        >&yen; {{ item.SourcePrice }}</text
+      >
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  props: {
+    item: {
+      type: Object,
+      default: () => ({}),
+    },
+  },
+  data() {
+    return {
+      endTime: 0,
+      saleTime: {
+        d: 0,
+        h: 0,
+        m: 0,
+        s: 0,
+      },
+    };
+  },
+  created() {
+    this.endTime = (this.item.end_timestamp || 0) - parseInt(Date.now() / 1000);
+    if (this.endTime > 0) {
+      this.runCd();
+    }
+  },
+  methods: {
+    handleClick(e) {
+      this.$emit("click", e);
+    },
+    runCd() {
+      clearTimeout(this.cdTimer);
+      const saleTime = {
+        d: parseInt(this.endTime / 24 / 60 / 60),
+        h: parseInt((this.endTime % (24 * 60 * 60)) / 60 / 60),
+        m: parseInt((this.endTime % (60 * 60)) / 60),
+        s: this.endTime % 60,
+      };
+
+      if (saleTime.h < 10) saleTime.h = `0${saleTime.h}`;
+      if (saleTime.m < 10) saleTime.m = `0${saleTime.m}`;
+      if (saleTime.s < 10) saleTime.s = `0${saleTime.s}`;
+
+      this.saleTime = saleTime;
+
+      if (this.endTime > 0) {
+        this.cdTimer = setTimeout(() => {
+          this.endTime--;
+          this.runCd();
+        }, 1000);
+      }
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+.sale-pic,
+.sale-img {
+  position: relative;
+  width: 256rpx;
+  height: 256rpx;
+  display: block;
+}
+.sale-text {
+  position: absolute;
+  left: 0;
+  bottom: 0;
+  width: 100%;
+  font-size: 22rpx;
+  font-weight: 500;
+  color: #ffffff;
+  height: 36rpx;
+  background: linear-gradient(95deg, #fc5e94 0%, rgba(252, 94, 148, 0.47) 100%);
+  line-height: 36rpx;
+  text-align: center;
+}
+
+.sale-title {
+  font-size: 24rpx;
+  font-weight: 500;
+  color: #292d3b;
+  line-height: 34rpx;
+  height: 68rpx;
+  display: block;
+  white-space: normal;
+  margin: 8rpx 0;
+}
+.sale-sub {
+  color: #08c2c3;
+  line-height: 34rpx;
+  display: block;
+  font-family: unidreamledregular, Helvetica Neue, Helvetica, Arial,
+    Hiragino Sans GB, Hiragino Sans GB W3, Microsoft YaHei UI, Microsoft YaHei,
+    WenQuanYi Micro Hei, sans-serif;
+  .sale-label {
+    font-size: 24rpx;
+    margin-right: 5rpx;
+    font-weight: bolder;
+  }
+  .sale-price {
+    font-size: 32rpx;
+  }
+  .sale-origin {
+    font-size: 20rpx;
+    font-weight: 400;
+    color: #a6a7ac;
+    text-decoration: line-through;
+    margin-left: 10rpx;
+  }
+}
+</style>

+ 174 - 0
src/components/level-item/level-item.vue

@@ -0,0 +1,174 @@
+<template>
+  <view :class="['level-wrap', `level-wrap-${item.level}`]">
+    <view class="level-title"
+      ><text class="level-title-type">{{ item.level }}</text
+      >概率:{{ item.percent }}</view
+    >
+    <view class="level-item-list">
+      <view
+        v-for="goods in item.data"
+        :key="goods.id"
+        class="level-item"
+        @click="handleClick(goods)"
+      >
+        <image
+          :src="goods.img"
+          mode="aspectFill"
+          class="level-item-img"
+        ></image>
+        <view class="level-item-name">{{ goods.name }}</view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  name: "LevelItem",
+  props: {
+    item: {
+      type: Object,
+      default: () => null,
+    },
+  },
+  data() {
+    return {};
+  },
+
+  methods: {
+    handleClick(item) {
+      this.$emit("click", item);
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+.level-wrap {
+  width: 702rpx;
+  background: #1b1c1e;
+  box-shadow: 0rpx 0rpx 14rpx 0rpx rgba(242, 83, 83, 0.25);
+  border: 2rpx solid rgba(242, 83, 83, 0.3);
+  margin: 0 auto 20rpx;
+  .level-title {
+    height: 42rpx;
+    width: 100%;
+    background: left center no-repeat;
+    background-image: linear-gradient(
+      90deg,
+      rgba(188, 69, 70, 0.5) 0%,
+      rgba(242, 83, 83, 0) 80%
+    );
+    background-size: 246rpx 100%;
+    padding: 0 18rpx;
+    line-height: 42rpx;
+    font-size: 24rpx;
+    font-family: ysbth;
+    color: #ffffff;
+    .level-title-type {
+      font-size: 34rpx;
+      color: #fc5e94;
+      margin-right: 18rpx;
+    }
+  }
+  .level-item-list {
+    display: flex;
+    justify-content: start;
+    align-items: flex-start;
+    overflow: auto;
+    padding: 8rpx;
+    .level-item {
+      flex-shrink: 0;
+      box-sizing: border-box;
+      width: 150rpx;
+      height: 180rpx;
+      background: url(@/static/detail/level-item-bg.png) no-repeat center;
+      background-size: contain;
+      margin: 8rpx 5rpx;
+      padding-top: 26rpx;
+      .level-item-img {
+        width: 96rpx;
+        height: 96rpx;
+        display: block;
+        margin: 0 auto 12rpx;
+      }
+      .level-item-name {
+        text-align: center;
+        width: 120rpx;
+        margin: 0 auto;
+        text-overflow: ellipsis;
+        overflow: hidden;
+        white-space: nowrap;
+        font-size: 20rpx;
+        color: #ffffff;
+        line-height: 23rpx;
+      }
+    }
+  }
+  &.level-wrap-sp,
+  &.level-wrap-SP {
+    .level-title {
+      background-image: linear-gradient(
+        90deg,
+        rgba(188, 69, 70, 0.5) 0%,
+        rgba(242, 83, 83, 0) 100%
+      );
+      .level-title-type {
+        color: #f25353;
+      }
+    }
+  }
+  &.level-wrap-ssr,
+  &.level-wrap-SSR {
+    .level-title {
+      background-image: linear-gradient(
+        90deg,
+        rgba(255, 217, 82, 0.51) 0%,
+        rgba(255, 217, 82, 0) 100%
+      );
+      .level-title-type {
+        color: #ffd952;
+      }
+    }
+  }
+  &.level-wrap-sr,
+  &.level-wrap-SR {
+    .level-title {
+      background-image: linear-gradient(
+        90deg,
+        rgba(252, 94, 148, 0.5) 0%,
+        rgba(252, 94, 148, 0) 100%
+      );
+      .level-title-type {
+        color: #fc5e94;
+      }
+    }
+  }
+  &.level-wrap-r,
+  &.level-wrap-R {
+    .level-title {
+      background-image: linear-gradient(
+        90deg,
+        rgba(78, 251, 255, 0.5) 0%,
+        rgba(78, 251, 255, 0) 100%
+      );
+      .level-title-type {
+        color: #4efbff;
+      }
+    }
+  }
+  &.level-wrap-n,
+  &.level-wrap-N {
+    .level-title {
+      background-image: linear-gradient(
+        90deg,
+        rgba(0, 199, 119, 0.6) 0%,
+        rgba(75, 216, 90, 0) 100%
+      );
+      .level-title-type {
+        color: #4bd85a;
+      }
+    }
+  }
+}
+</style>

+ 477 - 0
src/components/lff-barrage/lff-barrage.vue

@@ -0,0 +1,477 @@
+<template>
+  <view class="danmu-wrap">
+    <view
+      v-for="item in listData"
+      :key="item.id"
+      class="danmu-li"
+      :class="item.type"
+      :style="[item.style]"
+    >
+      <view class="danmu-inner" @tap="jumpDtail(item.link)">
+        <!-- <view :class="[`danmu-${(['R','SR','SSR','SP'])[index%4]}`]" v-if="item.level"> -->
+        <view
+          v-if="item.level && item.level !== 'N'"
+          :class="[`danmu-${item.level}`]"
+        >
+          <image :src="item.img" class="avatar" mode="aspectFill"></image>
+          恭喜{{ item.name }}抽到<text class="level">{{ item.level }}</text>
+          <image class="sku" :src="item.img2" mode="aspectFit"></image>
+        </view>
+        <view v-else-if="item.t == '0'" class="user-box">
+          <view class="user">
+            <image class="img" :src="item.img"></image
+            ><text>{{ item.name }}</text>
+          </view>
+          <view class="danmu-content">
+            <text class="danmu-text">{{ item.content }}</text>
+            <image class="img" :src="item.img2"></image>
+          </view>
+        </view>
+        <view v-else class="user-box" style="padding-left: 24rpx">
+          <view class="user-status cl1">
+            {{ item.content }}
+          </view>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+<script>
+export default {
+  props: {
+    //rightToLeft leftToRight leftBottom
+    type: {
+      type: String,
+      default: "rightToLeft",
+    },
+    minTime: {
+      type: Number,
+      default: 16,
+    },
+    maxTime: {
+      type: Number,
+      default: 21,
+    },
+    minTop: {
+      type: Number,
+      default: 0,
+    },
+    maxTop: {
+      type: Number,
+      default: 240,
+    },
+    hrackH: {
+      //轨道高度
+      type: Number,
+      default: 40,
+    },
+  },
+  data() {
+    return {
+      listData: [],
+    };
+  },
+  mounted() {
+    this.hrackNum = Math.floor((this.maxTop - this.minTop) / this.hrackH);
+  },
+  methods: {
+    add(obj) {
+      const data = {
+        img: obj.img,
+        img2: obj.img2,
+        content: obj.content,
+        link: obj.link,
+        top: obj.top,
+        level: obj.level,
+        t: obj.type,
+        name: obj.name,
+        id: Date.now(),
+        // time: Math.ceil(Math.floor(Math.random() * (this.maxTime - this.minTime + 1) + this.minTime)),
+        time: Math.ceil(
+          Math.floor(
+            Math.random() * (this.maxTime - this.minTime + 1) + this.minTime
+          )
+        ),
+        // time: 5,
+        type: this.type,
+      };
+      // console.log(data.time, Math.random())
+      // if (this.type === 'leftBottom') {
+      // 	let objData = {
+      // 		item: data.item,
+      // 		type: 'leftBottomEnter',
+      // 		style: {
+      // 			transition: `all 0.5s`,
+      // 			animationDuration: `0.5s`,
+      // 			transform: `translateX(0%)`,
+      // 			bottom: `${this.minTop}px`
+      // 		}
+      // 	}
+      // 	let listLen = this.listData.length;
+      // 	let hrackNum = this.hrackNum;
+      // 	for (let i in this.listData) {
+      // 		if(this.listData[i].status === 'reuse'){ //重用
+      // 			this.$set(this.listData,i,objData);
+      // 		}else if(this.listData[i].status === 'reset'){ //重置
+      // 			this.listData[i].style.transition = 'none';
+      // 			this.listData[i].style.bottom = 0;
+      // 			this.listData[i].status = 'reuse';
+      // 		}else if(this.listData[i].status === 'recycle'){ //回收
+      // 			this.listData[i].type = 'leftBottomExit';
+      // 			this.listData[i].status = 'reset';
+      // 		}else{
+      // 			this.listData[i].style.bottom = parseInt(this.listData[i].style.bottom) + this.hrackH + 'px';
+      // 		}
+      // 		if(parseInt(this.listData[i].style.bottom) >= (this.maxTop - this.hrackH) && this.listData[i].status !== 'reset'){ //需要回收
+      // 			this.listData[i].status = 'recycle';
+      // 		}
+      // 	}
+      // 	if(listLen < hrackNum + 2){
+      // 		this.listData.push(objData);
+      // 	}
+      // } else
+      if (this.type === "rightToLeft" || this.type === "leftToRight") {
+        const objData = this.horStacked(data);
+        for (const i in this.listData) {
+          if (this.listData[i].delTime <= Date.parse(new Date())) {
+            this.repaint(i, objData.type);
+            objData.type = "";
+            this.$set(this.listData, i, objData);
+            return;
+          }
+        }
+        this.listData.push(objData);
+      }
+    },
+    // 弹幕跳转
+    jumpDtail(link) {
+      if (link) {
+        uni.navigateTo({
+          url: "../../pages" + link,
+        });
+      }
+    },
+    horStacked(data) {
+      return {
+        img: data.img,
+        img2: data.img2,
+        content: data.content,
+        link: data.link,
+        t: data.t,
+        name: data.name,
+        level: data.level,
+        id: data.id,
+        type: this.type,
+        style: {
+          animationDuration: `${data.time}s`,
+          // top: `${Math.ceil(Math.random() * (this.maxTop - this.minTop + 1) + this.minTop)}px`
+          top: `${data.top}rpx`, // 0
+        },
+        delTime: Date.parse(new Date()) + data.time * 1200,
+      };
+    },
+    repaint(index, type) {
+      setTimeout(() => {
+        this.listData[index].type = type;
+      }, 100);
+    },
+  },
+};
+</script>
+<style lang="scss">
+@keyframes leftBottomEnter {
+  0% {
+    transform: translateY(100%);
+    opacity: 0;
+  }
+
+  100% {
+    transform: translateY(0%);
+    opacity: 1;
+  }
+}
+
+@keyframes leftBottomExit {
+  0% {
+    transform: translateY(0%);
+    opacity: 1;
+  }
+
+  100% {
+    transform: translateY(-200%);
+    opacity: 0;
+  }
+}
+
+@keyframes leftToRight {
+  0% {
+    transform: translateX(-100%);
+    opacity: 0;
+  }
+
+  100% {
+    transform: translateX(100%);
+    opacity: 1;
+  }
+}
+
+@keyframes rightToLeft {
+  0% {
+    transform: translateX(100%);
+  }
+
+  100% {
+    transform: translateX(-100%);
+  }
+}
+.danmu-wrap {
+  overflow: hidden;
+  position: absolut;
+  width: 100%;
+  z-index: 2;
+  transform: translate3d(0, 0, 0);
+  top: 0;
+  pointer-events: none;
+  height: 240rpx;
+}
+.danmu-li {
+  position: absolute;
+  width: 100%;
+  transform: translateX(100%);
+  animation-fill-mode: both;
+  animation-timing-function: linear;
+
+  &.leftBottomEnter {
+    animation-name: leftBottomEnter;
+  }
+
+  &.leftBottomExit {
+    animation-name: leftBottomExit;
+    animation-fill-mode: forwards;
+  }
+
+  &.rightToLeft {
+    animation-name: rightToLeft;
+  }
+
+  &.leftToRight {
+    animation-name: leftToRight;
+  }
+
+  .danmu-inner {
+    display: inline-block;
+
+    .user-box {
+      display: flex;
+      box-sizing: border-box;
+      padding: 0rpx 24rpx 0 16rpx;
+      background: rgba(0, 0, 0, 0.6);
+      align-items: center;
+      justify-content: space-between;
+      width: 296rpx;
+      height: 52rpx;
+      background: url(@/static/detail/bg-bullet.png) no-repeat;
+      background-size: contain;
+
+      .user-img {
+        .img-box {
+          display: flex;
+
+          image {
+            width: 48rpx;
+            height: 48rpx;
+            color: #ffffff;
+            border-radius: 50%;
+          }
+        }
+      }
+
+      .user-status {
+        margin-left: 10rpx;
+        white-space: nowrap;
+        font-size: 20rpx;
+        // font-weight: 400;
+        color: #ffffff;
+        letter-spacing: 2rpx;
+        height: 48rpx;
+        line-height: 48rpx;
+      }
+
+      .user-text {
+        margin-left: 10rpx;
+        font-size: 20rpx;
+        // font-weight: 400;
+        color: #ffffff;
+        line-height: 48rpx;
+        letter-spacing: 2rpx;
+      }
+
+      .user,
+      .danmu-content {
+        display: flex;
+        align-items: center;
+        font-size: 20rpx;
+        font-weight: 500;
+        color: #ffffff;
+        white-space: nowrap;
+        .img {
+          width: 32rpx;
+          height: 32rpx;
+          font-size: 20rpx;
+          font-weight: 500;
+          color: #ffffff;
+        }
+      }
+
+      .user {
+        .img {
+          margin-right: 6rpx;
+          border-radius: 100%;
+        }
+      }
+      .danmu-content {
+        flex: 1;
+        width: 0;
+        .danmu-text {
+          flex: 1;
+          width: 0;
+          white-space: nowrap;
+          overflow: hidden;
+          text-overflow: ellipsis;
+          text-align: right;
+        }
+        .img {
+          margin-left: 8rpx;
+        }
+      }
+    }
+  }
+}
+.danmu-R,
+.danmu-SR,
+.danmu-SSR,
+.danmu-SP {
+  box-sizing: border-box;
+  display: flex;
+  align-items: center;
+  white-space: nowrap;
+  font-size: 20rpx;
+  color: #ffffff;
+  background: no-repeat center;
+  background-size: contain;
+  position: relative;
+  margin-left: 20rpx;
+
+  &::before,
+  &::after {
+    content: "";
+    position: absolute;
+    background: no-repeat center;
+    background-size: contain;
+  }
+  &::before {
+    z-index: 0;
+  }
+  &::after {
+    z-index: 10;
+    width: 66rpx;
+    height: 24rpx;
+    margin-top: -4rpx;
+  }
+  .avatar {
+    width: 54rpx;
+    height: 54rpx;
+    position: relative;
+    z-index: 5;
+    display: block;
+    border-radius: 100%;
+    margin-right: 50rpx;
+  }
+  .sku {
+    display: block;
+    width: 32rpx * 1.8;
+    height: 32rpx * 1.8;
+    margin-left: 14rpx;
+  }
+  .level {
+    font-style: italic;
+    font-weight: bold;
+    margin-left: 14rpx;
+    font-size: 34rpx;
+    font-weight: bold;
+  }
+}
+.danmu-R {
+  width: 426rpx;
+  height: 87rpx;
+  background-image: url(@/static/bullet/bg-R.png);
+  padding: 14rpx 0 19rpx 6rpx;
+
+  &::before {
+    background-image: url(@/static/bullet/avatar-R.png);
+    width: 102rpx;
+    height: 80rpx;
+    left: -18rpx;
+    top: 1rpx;
+  }
+  &::after {
+    background-image: url(@/static/bullet/label-R.png);
+    left: 0rpx;
+    top: 62rpx;
+  }
+}
+.danmu-SR {
+  width: 523rpx;
+  height: 96rpx;
+  background-image: url(@/static/bullet/bg-SR.png);
+  padding: 21rpx 0 21rpx 48rpx;
+  &::before {
+    background-image: url(@/static/bullet/avatar-SR.png);
+    width: 138rpx;
+    height: 88rpx;
+    left: 7rpx;
+    top: 0;
+  }
+  &::after {
+    background-image: url(@/static/bullet/label-SR.png);
+    left: 43rpx;
+    top: 69rpx;
+  }
+}
+.danmu-SSR {
+  width: 537rpx;
+  height: 116rpx;
+  background-image: url(@/static/bullet/bg-SSR.png);
+  padding: 37rpx 0 25rpx 44rpx;
+  &::before {
+    background-image: url(@/static/bullet/avatar-SSR.png);
+    width: 137rpx;
+    height: 95rpx;
+    left: 3rpx;
+    top: 9rpx;
+  }
+  &::after {
+    background-image: url(@/static/bullet/label-SSR.png);
+    left: 38rpx;
+    top: 85rpx;
+  }
+}
+.danmu-SP {
+  width: 556rpx;
+  height: 145rpx;
+  background-image: url(@/static/bullet/bg-SP.png);
+  padding: 46rpx 0 45rpx 56rpx;
+  &::before {
+    background-image: url(@/static/bullet/avatar-SP.png);
+    width: 137rpx;
+    height: 103rpx;
+    left: 14rpx;
+    top: 10rpx;
+  }
+  &::after {
+    background-image: url(@/static/bullet/label-SP.png);
+    left: 49rpx;
+    top: 97rpx;
+  }
+}
+</style>

+ 18 - 0
src/components/lff-barrage/markdown.md

@@ -0,0 +1,18 @@
+#如何使用
+###js
+
+```javascript
+import lffBarrage from '@/components/lff-barrage/lff-barrage.vue'
+components:{lffBarrage},
+methods:{
+	colrdo(){ //插入一条弹幕
+		this.$refs.lffBarrage.add({item:'你好呀小伙子'});
+	}
+}
+```
+
+###HTML
+
+```html
+<lff-barrage ref="lffBarrage"></lff-barrage>
+```

+ 236 - 0
src/components/list-item/list-item.vue

@@ -0,0 +1,236 @@
+<template>
+  <view class="list-item" @click="handleClick">
+    <view v-if="item" class="list-img-wrap">
+      <image class="list-img" :src="item.img"></image
+    ></view>
+    <view v-else class="list-img-wrap skeleton"></view>
+    <image
+      v-if="item && item.is_cheap === 1"
+      class="list-lable"
+      src="@/static/icon/icon-sale.png"
+      mode="heightFix"
+    ></image>
+    <image
+      v-else-if="item && item.is_new === 1"
+      class="list-lable"
+      src="@/static/icon/icon-new.png"
+      mode="heightFix"
+    ></image>
+    <view class="list-item-body">
+      <text v-if="item" class="list-title">{{ item.name }}</text>
+      <view v-else class="list-title">
+        <view class="skeleton"></view>
+        <view class="skeleton"></view>
+      </view>
+      <view v-if="item" class="list-sub">
+        <view class="list-sub-main">
+          <text class="list-label">&yen;</text>
+          <text class="list-price">{{ item.price }}</text>
+          <text
+            v-if="
+              Number(item.source_price) &&
+              Number(item.price) < Number(item.source_price)
+            "
+            class="list-source"
+            >&yen;{{ item.source_price }}</text
+          >
+        </view>
+        <view
+          v-if="item.curr_batch && item.total_batch && item.total_batch > 1"
+          class="list-num"
+          >{{ item.curr_batch }}/{{ item.total_batch }}箱</view
+        >
+      </view>
+      <view v-else class="list-sub">
+        <view class="skeleton"></view>
+      </view>
+      <view
+        v-if="item.tag1 || item.tag2 || (item.tags && item.tags.length > 0)"
+        class="list-tags"
+      >
+        <view v-if="item.tag1" class="list-tag list-tag1">{{ item.tag1 }}</view>
+        <view v-if="item.tag2" class="list-tag list-tag2">{{ item.tag2 }}</view>
+        <view v-for="tag in item.tags" :key="tag" class="list-tag list-tag2">{{
+          tag
+        }}</view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  name: "ListItem",
+  props: {
+    item: {
+      type: Object,
+      default: () => null,
+    },
+  },
+  data() {
+    return {};
+  },
+
+  methods: {
+    handleClick() {
+      this.$emit("click", this.item);
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+.list-item {
+  overflow: hidden;
+  position: relative;
+  background-color: #fff;
+  height: 100%;
+  width: 344rpx;
+  box-sizing: border-box;
+  .skeleton {
+    // background-color: #f1f1f1;
+    background-image: linear-gradient(
+      90deg,
+      #f1f1f1 25%,
+      #fafafa 37%,
+      #f1f1f1 63%
+    );
+    width: 100%;
+    height: 0.6rem;
+    list-style: none;
+    background-size: 400% 100%;
+    background-position: 100% 50%;
+    animation: skeleton-loading 1.4s ease infinite;
+  }
+  .list-lable {
+    position: absolute;
+    left: 0;
+    top: 0;
+    height: 40rpx;
+  }
+  .list-img-wrap {
+    position: relative;
+    width: 100%;
+    display: block;
+    height: 0;
+    padding-top: 100%;
+  }
+  .list-img {
+    position: absolute;
+    width: 100%;
+    height: 100%;
+    left: 0;
+    top: 0;
+  }
+  .list-item-body {
+    padding: 18rpx 20rpx 20rpx;
+  }
+  .list-title {
+    font-weight: 500;
+    color: #292d3b;
+    display: block;
+    white-space: nowrap;
+    width: 100%;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    height: 36rpx;
+    font-size: 30rpx;
+    line-height: 36rpx;
+    .skeleton {
+      height: 24rpx;
+      margin: 5rpx 0;
+      border-radius: 10rpx;
+      &:nth-child(2) {
+        width: 70%;
+        margin-top: 10rpx;
+      }
+    }
+  }
+  .list-sub {
+    margin-top: 30rpx;
+    height: 30rpx;
+    overflow: visible;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    font-size: 22rpx;
+    color: #555;
+    .list-sub-main {
+      height: 30rpx;
+      display: flex;
+      align-items: center;
+    }
+    .list-price {
+      font-size: 40rpx;
+      font-weight: bold;
+      color: #222;
+      line-height: 47rpx;
+      transform: translate(0, -4rpx);
+      margin: 0 4rpx;
+    }
+    .list-source {
+      font-size: 24rpx;
+      color: #a6a7ac;
+      line-height: 28rpx;
+      text-decoration: line-through;
+      margin-left: 10rpx;
+    }
+  }
+  .list-tags {
+    margin-top: 22rpx;
+    display: flex;
+    justify-content: flex-start;
+    .list-tag {
+      height: 32rpx;
+      font-size: 22rpx;
+      font-weight: 400;
+      color: #08c2c3;
+      line-height: 26rpx;
+      background: rgba(8, 194, 195, 0.12);
+      display: flex;
+      margin-right: 16rpx;
+      align-items: center;
+      padding: 0 8rpx;
+      &.list-tag2 {
+        color: #fc5e94;
+        background: rgba(255, 78, 149, 0.1);
+      }
+    }
+  }
+  // .list-sub {
+  //   position: absolute;
+  //   left: 12rpx;
+  //   bottom: 8rpx;
+  //   color: #08c2c3;
+  //   line-height: 34rpx;
+  //   display: block;
+  //   .list-label {
+  //     font-size: 28rpx;
+  //     margin-right: 5rpx;
+  //     font-weight: bolder;
+  //     font-family: unidreamledregular, Helvetica Neue, Helvetica, Arial,
+  //       Hiragino Sans GB, Hiragino Sans GB W3, Microsoft YaHei UI,
+  //       Microsoft YaHei, WenQuanYi Micro Hei, sans-serif;
+  //   }
+  //   .list-price {
+  //     font-size: 36rpx;
+  //     font-family: unidreamledregular, Helvetica Neue, Helvetica, Arial,
+  //       Hiragino Sans GB, Hiragino Sans GB W3, Microsoft YaHei UI,
+  //       Microsoft YaHei, WenQuanYi Micro Hei, sans-serif;
+  //   }
+  // .list-source {
+  //   font-size: 24rpx;
+  //   color: #a6a7ac;
+  //   line-height: 28rpx;
+  //   text-decoration: line-through;
+  //   margin-left: 10rpx;
+  // }
+  //   .skeleton {
+  //     border-radius: 10rpx;
+  //     height: 30rpx;
+  //     margin: 0 0 5rpx;
+  //     width: 100rpx;
+  //   }
+  // }
+}
+</style>

+ 274 - 0
src/components/paypop/paypop.scss

@@ -0,0 +1,274 @@
+.yfs-cd-bar {
+  width: 100%;
+  height: 52rpx;
+  line-height: 56rpx;
+  overflow: hidden;
+  display: flex;
+  justify-content: space-between;
+  border-bottom: 4rpx solid #4efbff;
+  padding-right: 28rpx;
+  .yfs-cd-main {
+    position: relative;
+    width: 434rpx;
+    height: 52rpx;
+    font-family: ysbth;
+    background: #4efbff;
+    font-size: 30rpx;
+    color: #000000;
+    text-align: center;
+    line-height: 56rpx;
+
+    &::after {
+      content: "";
+      position: absolute;
+      left: 100%;
+      width: 0;
+      height: 0;
+      overflow: hidden;
+      border-style: solid;
+      border-color: transparent transparent transparent #4efbff;
+      border-width: 54rpx 0 0 26rpx;
+    }
+    .yfs-cd-time {
+      margin-left: 34rpx;
+    }
+  }
+}
+
+.popup-buy {
+  padding: 24rpx;
+  position: relative;
+  background-color: #fff;
+  .title {
+    height: 44rpx;
+    font-size: 32rpx;
+    font-weight: 500;
+    color: #505050;
+    line-height: 44rpx;
+    margin-bottom: 18rpx;
+    display: block;
+  }
+  .close {
+    width: 32rpx;
+    height: 32rpx;
+    position: absolute;
+    right: 24rpx;
+    top: 24rpx;
+  }
+  .detail {
+    display: flex;
+    margin-bottom: 40rpx;
+    .cover {
+      width: 232rpx;
+      height: 232rpx;
+      margin-right: 22rpx;
+    }
+    .body {
+      display: flex;
+      flex: 1;
+      flex-direction: column;
+      justify-content: space-between;
+    }
+    .detail-name {
+      display: block;
+      font-size: 28rpx;
+      font-weight: 500;
+      color: #505050;
+      line-height: 40rpx;
+    }
+    .bottom {
+      .color {
+        height: 46rpx;
+        font-size: 28rpx;
+        font-weight: bold;
+        color: #08c2c3;
+        font-family: unidreamledregular, Helvetica Neue, Helvetica, Arial,
+          Hiragino Sans GB, Hiragino Sans GB W3, Microsoft YaHei UI,
+          Microsoft YaHei, WenQuanYi Micro Hei, sans-serif;
+        .big {
+          font-size: 36rpx;
+          font-weight: normal;
+          margin-left: 4rpx;
+        }
+      }
+      .tips {
+        display: flex;
+        height: 34rpx;
+        font-size: 24rpx;
+        font-weight: 500;
+        color: #9496a5;
+        line-height: 34rpx;
+        justify-content: space-between;
+        .big {
+          font-size: 28rpx;
+          font-weight: 500;
+          color: #08c2c3;
+        }
+      }
+    }
+  }
+  .line-wrap {
+    border-top: 2rpx solid #efefef;
+    padding: 16rpx 0;
+    align-items: center;
+    font-size: 28rpx;
+    font-weight: 500;
+    line-height: 28rpx;
+    color: #292d3b;
+    .line {
+      min-height: 72rpx;
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      &.disabled {
+        color: #9496a5;
+      }
+      .label-icon {
+        width: 32rpx;
+        height: 32rpx;
+        margin-right: 18rpx;
+      }
+      .label {
+        display: flex;
+        align-items: center;
+        .checkbox {
+          margin-right: 8rpx;
+        }
+        .small {
+          font-size: 24rpx;
+          font-weight: 400;
+          color: #9496a5;
+        }
+      }
+      .line-body {
+        width: 0;
+        flex: 1;
+        font-size: 24rpx;
+        color: #292d3b;
+      }
+      .right {
+        display: flex;
+        align-items: center;
+        .more {
+          width: 24rpx;
+          height: 24rpx;
+          margin-left: 8rpx;
+        }
+        &.color {
+          color: #08c2c3;
+        }
+      }
+    }
+    .score-switch {
+      width: 100rpx;
+      transform: scale(0.76);
+      transform-origin: 100% 50%;
+    }
+    &.agreement {
+      border: 0;
+      padding: 0 24rpx;
+      background: #f9f9f9;
+      margin: 0 -24rpx;
+    }
+    &.integral {
+      padding: 24rpx 24rpx;
+      margin: 0 -24rpx;
+      border-top: 20rpx solid #f9f9f9;
+    }
+    .integral-title {
+      height: 44rpx;
+      font-size: 32rpx;
+      font-weight: 500;
+      color: #292d3b;
+      line-height: 44rpx;
+      display: flex;
+      align-items: center;
+    }
+    .integral-desc {
+      margin-top: 14rpx;
+      line-height: 48rpx;
+      font-size: 28rpx;
+      font-weight: 400;
+      color: #888888;
+      display: flex;
+      align-items: center;
+      .big {
+        font-size: 34rpx;
+        font-weight: 500;
+        color: #000000;
+      }
+    }
+    .icon-help {
+      width: 30rpx;
+      height: 30rpx;
+      margin-left: 6rpx;
+    }
+    .icon-edit {
+      width: 32rpx;
+      height: 32rpx;
+      margin-left: 12rpx;
+    }
+  }
+  .checkbox {
+    box-sizing: border-box;
+    width: 32rpx;
+    height: 32rpx;
+    border: 2rpx solid #08c2c3;
+    background-color: #fff;
+    border-radius: 100%;
+    &.disabled {
+      border: 2rpx solid #9496a5;
+    }
+    &.checked {
+      background: url(@/static/icon/icon-checked.png) no-repeat;
+      background-size: contain;
+      border: none;
+    }
+  }
+  .pay-footer {
+    margin-top: 16rpx;
+    display: flex;
+    justify-content: space-between;
+    .text {
+      font-size: 28rpx;
+      font-weight: 500;
+      color: #292d3b;
+      .color {
+        font-size: 36rpx;
+        color: #08c2c3;
+        font-weight: bold;
+        font-family: unidreamledregular, Helvetica Neue, Helvetica, Arial,
+          Hiragino Sans GB, Hiragino Sans GB W3, Microsoft YaHei UI,
+          Microsoft YaHei, WenQuanYi Micro Hei, sans-serif;
+        &.big {
+          font-size: 48rpx;
+          font-weight: normal;
+          margin-left: 6rpx;
+        }
+      }
+    }
+    .btn {
+      width: 220rpx;
+      height: 80rpx;
+      line-height: 80rpx;
+      border-radius: 0;
+      margin: 0;
+      padding: 0;
+      font-size: 32rpx;
+      font-weight: 500;
+      background: #08c2c3;
+      color: #292d3b;
+      &.btn-gray {
+        background: #9496a5;
+        color: #e4e8ff;
+      }
+      &::after {
+        display: none;
+      }
+    }
+  }
+  .coupon-list {
+    max-height: 1000rpx;
+    overflow: auto;
+  }
+}

+ 594 - 0
src/components/paypop/paypop.vue

@@ -0,0 +1,594 @@
+<template>
+  <view>
+    <uni-popup
+      ref="popup_buy"
+      type="bottom"
+      mask-background-color="rgba(0,0,0,0.8)"
+      :is-mask-click="true"
+    >
+      <view>
+        <view v-if="cdTime" class="yfs-cd-bar">
+          <view class="yfs-cd-main">
+            {{ cdText }}<text class="yfs-cd-time">{{ cdTime }}</text>
+          </view>
+        </view>
+        <view class="popup-buy">
+          <text class="title">确认支付</text>
+          <image
+            class="close"
+            src="@/static/icon/icon-close-dark.png"
+            @click="handlePopupClose('popup_buy')"
+          >
+          </image>
+          <view class="detail">
+            <image class="cover" :src="img" mode="aspectFill"></image>
+            <view class="body">
+              <text class="detail-name">{{ title }}</text>
+              <view class="bottom">
+                <text class="color"
+                  >&yen;<text class="big">{{ originPrice }}</text></text
+                >
+                <view class="tips">
+                  <text>该商品不支持7天无理由退换</text>
+                  <text class="big">x{{ buyNum }}</text>
+                </view>
+              </view>
+            </view>
+          </view>
+          <view class="line-wrap">
+            <view
+              class="line"
+              @click="currentCoupon ? handlePopupShow('popup_coupon') : ''"
+            >
+              <image
+                class="label-icon"
+                src="../../static/detail/icon-coupon.png"
+              ></image>
+              <view class="label">
+                <text>优惠券</text>
+              </view>
+              <view class="line-body"></view>
+              <view v-if="currentCoupon" class="right color">
+                <text>已使用优惠 &yen; {{ currentCoupon.reduce_price }}</text>
+                <image class="more" src="@/static/icon/icon-more.png"></image>
+              </view>
+              <view v-else class="right">
+                <text>暂无可用优惠券</text>
+              </view>
+            </view>
+          </view>
+          <view class="line-wrap">
+            <view
+              :class="['line', { disabled: disabledBalance }]"
+              @click="handleChangePaytype('1')"
+            >
+              <image
+                class="label-icon"
+                src="../../static/detail/icon-balance.png"
+              ></image>
+              <view class="label">余额支付</view>
+              <view class="line-body">
+                (可用余额:&yen;{{ userInfo.show_price }})
+              </view>
+              <view
+                :class="[
+                  'checkbox',
+                  { disabled: disabledBalance, checked: payType === '1' },
+                ]"
+              ></view>
+            </view>
+            <view class="line" @click="handleChangePaytype('2')">
+              <image
+                class="label-icon"
+                src="../../static/detail/icon-wechat.png"
+              ></image>
+              <view class="label">微信支付</view>
+              <view class="line-body"
+                >(注:连续支付可能被拦截,建议充值购买)</view
+              >
+              <view :class="['checkbox', { checked: payType === '2' }]"></view>
+            </view>
+          </view>
+          <view v-if="isScore" class="line-wrap integral">
+            <view class="line">
+              <view class="line-body">
+                <view class="integral-desc"
+                  >可用积分:<text class="big">{{ canUseScore }}</text
+                  ><image
+                    src="../../static/detail/icon-help.png"
+                    class="icon-help"
+                    @click="handlePopupShow('popup_integral')"
+                  ></image>
+                  <!-- <image
+                  src="../../static/detail/icon-edit.png"
+                  class="icon-edit"
+                ></image> -->
+                </view>
+              </view>
+              <switch
+                class="score-switch"
+                :checked="useScore"
+                color="#08C2C3"
+                @change="handleChangeUseScore"
+              />
+            </view>
+          </view>
+          <view class="line-wrap agreement">
+            <view class="line">
+              <view class="label" @click="selectAgreement = !selectAgreement">
+                <view
+                  :class="['checkbox', { checked: selectAgreement }]"
+                ></view>
+                <text class="small"
+                  >同意《初见潮玩玩法说明》,未成年不可购买</text
+                >
+              </view>
+            </view>
+          </view>
+          <view class="pay-footer">
+            <view class="text">
+              <text>应付:</text>
+              <text class="color">&yen;</text>
+              <text class="color big">{{ realPrice }}</text>
+            </view>
+            <button
+              :class="[
+                'btn',
+                {
+                  'btn-gray': !selectAgreement,
+                },
+              ]"
+              @click="pay"
+            >
+              立即支付
+            </button>
+          </view>
+        </view>
+      </view>
+    </uni-popup>
+    <uni-popup
+      ref="popup_coupon"
+      type="bottom"
+      mask-background-color="rgba(0,0,0,0.8)"
+      :is-mask-click="true"
+    >
+      <view class="popup-buy">
+        <text class="title">选择优惠券</text>
+        <image
+          class="close"
+          src="@/static/icon/icon-close-dark.png"
+          @click="handlePopupClose('popup_coupon')"
+        >
+        </image>
+        <view class="coupon-list">
+          <coupon
+            v-for="item in coupons"
+            :key="item.id"
+            :coupon="item"
+            :checked="currentCoupon.id === item.id"
+            @click="handleSelectCoupon(item.id)"
+          >
+          </coupon>
+        </view>
+      </view>
+    </uni-popup>
+    <uni-popup
+      ref="popup_integral"
+      type="center"
+      mask-background-color="rgba(0,0,0,0.8)"
+      :is-mask-click="true"
+    >
+      <view class="popup-wrap">
+        <view class="popup-content">
+          <view class="h1"><text>积分说明</text></view>
+          <view class="p" v-html="scoreText || ''"></view>
+        </view>
+        <image
+          class="popup_close"
+          src="@/static/icon/icon-close.png"
+          @click="handlePopupClose('popup_integral')"
+        ></image>
+      </view>
+    </uni-popup>
+  </view>
+</template>
+
+<script>
+import Decimal from "decimal.js";
+import api from "@/lib/api/api";
+import login from "@/lib/utils/login";
+import coupon from "@/components/coupon/coupon.vue";
+
+export default {
+  name: "PayPop",
+  components: {
+    coupon,
+  },
+  props: {
+    title: {
+      type: String,
+      default: "",
+    },
+    img: {
+      type: String,
+      default: "",
+    },
+    detailId: {
+      type: String,
+      default: "0",
+    },
+    type: {
+      type: Number,
+      default: 1, // 1:福袋; 2:一番赏;
+    },
+    scoreText: {
+      type: String,
+      default: "",
+    },
+    cdText: {
+      type: String,
+      default: "",
+    },
+    cdTime: {
+      type: String,
+      default: "",
+    },
+    isScore: {
+      type: Boolean,
+      default: true,
+    },
+  },
+  data() {
+    return {
+      userInfo: null,
+      useScore: true,
+      scoreInfo: null,
+      balanceCoupons: [],
+      wxCoupons: [],
+      couponIdx: 0,
+      payType: "1", // 1-余额;2-微信
+      buyNum: 0,
+      originPrice: 0,
+      selectAgreement: false,
+      //   bagData: null,
+    };
+  },
+  computed: {
+    coupons() {
+      if (this.payType === "1") return this.balanceCoupons;
+      else return this.wxCoupons;
+    },
+    currentCoupon() {
+      const current = this.coupons[this.couponIdx];
+      return current
+        ? {
+            ...this.coupons[this.couponIdx],
+          }
+        : null;
+    },
+    isLogin() {
+      return !!this.userInfo && !!this.userInfo.session;
+    },
+    disabledBalance() {
+      // 优惠券不能单买
+      if (!this.userInfo?.show_price) return true;
+
+      let coupons = 0;
+      if (this.balanceCoupons && this.balanceCoupons[0]) {
+        coupons = this.balanceCoupons[0]?.reduce_price || 0;
+      }
+
+      let score = 0;
+      if (this.useScore && this.canUseScore) {
+        score = new Decimal(this.canUseScore).div(this.scoreProportion);
+      }
+
+      return (
+        new Decimal(this.userInfo.show_price)
+          .plus(coupons)
+          .plus(score)
+          .toNumber() < this.originPrice
+      );
+    },
+    salePrice() {
+      if (this.currentCoupon) {
+        return new Decimal(this.currentCoupon.real_price)
+          .minus(this.currentCoupon.reduce_price_sort)
+          .div(100)
+          .toNumber();
+      }
+      return this.originPrice;
+    },
+    scoreProportion() {
+      if (!this.scoreInfo || !this.scoreInfo.score_price) return 0;
+      return new Decimal(this.scoreInfo.score)
+        .div(this.scoreInfo.score_price)
+        .toNumber();
+    },
+    canUseScore() {
+      if (this.salePrice === 0 || !this.scoreInfo || !this.isScore) {
+        return 0;
+      }
+      const decimal = new Decimal(this.salePrice).mul(100);
+      const maxScore = decimal
+        .minus(decimal.mul(this.scoreInfo.percent).div(10))
+        .div(new Decimal(this.scoreProportion).div(100))
+        .floor()
+        .toNumber();
+      return Math.min(this.scoreInfo.score, maxScore);
+    },
+    realPrice() {
+      let decimal = new Decimal(this.salePrice).mul(100);
+
+      if (this.useScore && this.canUseScore) {
+        decimal = decimal.minus(
+          new Decimal(this.canUseScore).mul(
+            new Decimal(this.scoreProportion).div(100)
+          )
+        );
+      }
+
+      return decimal.div(100).toNumber();
+    },
+  },
+  methods: {
+    handlePopupShow(popup_ref) {
+      if (this.$refs[popup_ref]) this.$refs[popup_ref].open();
+    },
+    handlePopupClose(popup_ref) {
+      if (this.$refs[popup_ref]) this.$refs[popup_ref].close();
+    },
+    closeAll() {
+      this.handlePopupClose("popup_buy");
+      this.handlePopupClose("popup_coupon");
+      this.handlePopupClose("popup_integral");
+    },
+    handleChangeUseScore(e) {
+      this.useScore = e.detail.value;
+    },
+    async getUserInfo() {
+      try {
+        const data = await api.userInfo(this.userInfo.session);
+        data.data.show_price = Number(data.data.show_price);
+        this.userInfo = { ...this.userInfo, ...data.data };
+      } catch (e) {
+        uni.showToast({
+          icon: "none",
+          title: "用户信息失效,请重新登录",
+          duration: 2e3,
+        });
+        login.logout();
+        this.userInfo = null;
+        throw e;
+      }
+    },
+
+    // 获取可用优惠券
+    async getUserCoupons() {
+      const data = await api.getUserCoupons({
+        kuji_id: this.detailId,
+        session: this.userInfo.session,
+        num: "" + this.buyNum,
+        pay_type: this.payType,
+      });
+
+      if (data.data) {
+        this.scoreInfo = data.data.score_info;
+        this.balanceCoupons = data.data.balance_pay;
+        this.wxCoupons = data.data.wx_pay;
+        this.couponIdx = 0;
+      } else {
+        this.scoreInfo = null;
+        this.balanceCoupons = [];
+        this.wxCoupons = [];
+      }
+    },
+
+    async buy(num = 1, originPrice, loading = true) {
+      this.buyNum = num;
+      this.originPrice = originPrice;
+
+      const uinfoStr = uni.getStorageSync("userinfo");
+      if (uinfoStr) {
+        this.userInfo = JSON.parse(uinfoStr);
+      }
+
+      if (loading) {
+        uni.showLoading({
+          title: "加载中",
+          mask: true,
+        });
+      }
+      try {
+        await this.getUserInfo();
+        await this.getUserCoupons();
+
+        this.payType = !this.disabledBalance ? "1" : "2";
+
+        this.handlePopupShow("popup_buy");
+      } catch (e) {
+        uni.showToast({
+          icon: "none",
+          title: e.message || "请求失败,请重试",
+          duration: 2e3,
+        });
+      }
+      if (loading) {
+        uni.hideLoading();
+      }
+    },
+    handleChangePaytype(payType) {
+      if (this.disabledBalance && payType === "1") {
+        uni.showToast({
+          icon: "none",
+          title: "余额不足",
+          duration: 2e3,
+        });
+        return;
+      }
+      this.couponIdx = 0;
+      this.payType = payType;
+    },
+    async pay() {
+      if (this.disabledBalance && this.payType === "1") {
+        uni.showToast({
+          icon: "none",
+          title: "余额不足",
+          duration: 2e3,
+        });
+        return;
+      }
+      if (!this.selectAgreement) {
+        uni.showToast({
+          icon: "none",
+          title: "请先勾选和同意用户协议",
+          duration: 2e3,
+        });
+        return;
+      }
+      try {
+        this.showCard = false;
+        const data = await (this.payType === "1" ||
+        (this.payType === "2" && this.realPrice === 0)
+          ? this.balancePay()
+          : this.wechatPay());
+        this.handlePopupClose("popup_buy");
+        this.$emit("paySuccess", data);
+      } catch (e) {
+        uni.hideLoading();
+        uni.showToast({
+          title: e.message || "支付失败",
+          icon: "none",
+          mask: true,
+          duration: 2e3,
+        });
+      }
+    },
+    async wechatPay() {
+      uni.showLoading({
+        title: "加载中",
+        mask: true,
+      });
+
+      const { errno, errmsg, data } = await (this.type === 2
+        ? api.yfsPrePay
+        : api.prePay)({
+        session: this.userInfo.session,
+        id: "" + this.detailId,
+        account_coupon_id: this.currentCoupon?.id || 0,
+        num: "" + this.buyNum,
+        score: Number(this.useScore ? this.canUseScore : 0),
+      });
+
+      uni.hideLoading();
+
+      if (errno !== 10000) {
+        throw new Error(errmsg);
+      }
+      const {
+        timeStamp,
+        nonceStr,
+        package: pkg,
+        signType,
+        paySign,
+        order_id,
+      } = data;
+
+      return new Promise((resolve, reject) => {
+        uni.requestPayment({
+          provider: "wxpay",
+          timeStamp,
+          nonceStr,
+          package: pkg,
+          signType,
+          paySign,
+          success: async (res) => {
+            if (res.errMsg === "requestPayment:ok") {
+              resolve();
+            } else {
+              const type =
+                res.errMsg === "requestPayment:fail cancel" ? "3" : "2";
+              await (this.type === 2 ? api.yfsCompletePay : api.completePay)({
+                session: this.userInfo.session,
+                order_id,
+                type,
+              }).catch((e) => {
+                console.log(e);
+              });
+              reject(new Error(type === "3" ? "取消支付" : "支付失败"));
+            }
+          },
+          fail: async (err) => {
+            const type =
+              err.errMsg === "requestPayment:fail cancel" ? "3" : "2";
+            await api
+              .completePay({
+                session: this.userInfo.session,
+                order_id,
+                type,
+              })
+              .catch((e) => {
+                console.log(e);
+              });
+            reject(new Error(type === "3" ? "取消支付" : "支付失败"));
+          },
+        });
+      }).then(() => this.loopPayRes("" + order_id));
+    },
+    async loopPayRes(order_id) {
+      uni.showLoading({
+        title: "加载中",
+        mask: true,
+      });
+      const data = await (this.type === 2 ? api.yfsQueryPay : api.queryPay)({
+        session: this.userInfo.session,
+        order_id,
+      });
+      if (data.errno == 90000) {
+        return new Promise((r) => {
+          setTimeout(() => r(), 1000);
+        }).then(() => this.loopPayRes(order_id));
+      }
+
+      uni.hideLoading();
+
+      if (data.errno == 10000) {
+        return data.data;
+      }
+
+      throw new Error("订单查询失败");
+    },
+    async balancePay() {
+      uni.showLoading({
+        title: "加载中",
+        mask: true,
+      });
+      const data = await (this.type === 2 ? api.yfsBalancePay : api.balancePay)(
+        {
+          session: this.userInfo.session,
+          id: "" + this.detailId,
+          account_coupon_id: this.currentCoupon?.id || 0,
+          num: "" + this.buyNum,
+          score: Number(this.useScore ? this.canUseScore : 0),
+        }
+      );
+      uni.hideLoading();
+
+      if (data.errno !== 10000) {
+        throw new Error(data.errmsg);
+      }
+
+      return data.data;
+    },
+    handleSelectCoupon(id) {
+      const i = this.coupons.findIndex((item) => item.id === id);
+      this.couponIdx = i;
+      this.handlePopupClose("popup_coupon");
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+@import "./paypop.scss";
+</style>

+ 385 - 0
src/components/payresult/payresult.scss

@@ -0,0 +1,385 @@
+@keyframes showCard {
+  0% {
+    transform: translate3d(0, 0, -2400rpx) scale(0) rotateY(-720deg);
+  }
+  100% {
+    transform: translate3d(0, 0, 0) scale(1) rotateY(0);
+  }
+}
+.popup-fudai-cards {
+  text-align: center;
+  color: #ffffff;
+  .fudai-title {
+    display: flex;
+    margin: 0 auto;
+    text-align: center;
+    flex-direction: column;
+    align-items: center;
+    .fudai-title-text {
+      font-family: ysbth, Helvetica Neue, Helvetica, Arial, Hiragino Sans GB,
+        Hiragino Sans GB W3, Microsoft YaHei UI, Microsoft YaHei,
+        WenQuanYi Micro Hei, sans-serif;
+      font-size: 48rpx;
+      background: linear-gradient(to right, #de7a58, #e31c66);
+      -webkit-background-clip: text;
+      color: transparent;
+      display: inline-block;
+    }
+    .fudai-title-cd {
+      box-sizing: border-box;
+      padding: 0 36rpx;
+      height: 52rpx;
+      line-height: 48rpx;
+      border-radius: 54rpx 54rpx 54rpx 54rpx;
+      opacity: 1;
+      border: 2rpx solid #4efbff;
+      font-size: 30rpx;
+      font-family: ysbth;
+      color: #4efbff;
+      margin-top: 12rpx;
+      .fudai-title-time {
+        margin-left: 36rpx;
+      }
+    }
+  }
+  .fudai-cards {
+    margin-top: 14rpx;
+    display: flex;
+    height: 760rpx;
+    justify-content: center;
+    align-items: center;
+    flex-wrap: wrap;
+    perspective: 1200rpx;
+    transform-style: preserve-3d;
+    padding-bottom: 46rpx;
+    overflow-y: auto;
+    overflow-x: hidden;
+    .card-item {
+      box-sizing: border-box;
+      width: 560rpx;
+      height: 760rpx;
+      background: no-repeat center top;
+      background-size: 100% auto;
+      padding: 132rpx 98rpx 0;
+      position: relative;
+      animation: showCard 1s ease-in-out both;
+
+      &.checked {
+        &::before {
+          content: "";
+          position: absolute;
+          width: 71%;
+          height: 50%;
+          background: no-repeat center top;
+          background-size: 100% auto;
+          left: 50%;
+          top: 45%;
+          transform: translate(-50%, 0);
+          z-index: 0;
+        }
+        &::after {
+          content: "";
+          position: absolute;
+          width: 93rpx;
+          height: 98rpx;
+          background: url(@/static/detail/card-checked.png) no-repeat center;
+          background-size: contain;
+          right: 82rpx;
+          top: 82rpx;
+          z-index: 10;
+        }
+
+        &.card-item-SP {
+          &::before {
+            background-image: url(@/static/detail/card-checked-SP.png);
+          }
+        }
+        &.card-item-SSR {
+          &::before {
+            background-image: url(@/static/detail/card-checked-SSR.png);
+            top: 50%;
+          }
+        }
+        &.card-item-SR {
+          &::before {
+            background-image: url(@/static/detail/card-checked-SR.png);
+          }
+        }
+        &.card-item-N {
+          &::before {
+            background-image: url(@/static/detail/card-checked-N.png);
+          }
+        }
+        &.card-item-R {
+          &::before {
+            background-image: url(@/static/detail/card-checked-R.png);
+          }
+        }
+      }
+
+      &.card-item-SP {
+        background-image: url(@/static/detail/card-SP.png);
+        .label {
+          width: 72rpx;
+        }
+      }
+      &.card-item-SSR {
+        background-image: url(@/static/detail/card-SSR.png);
+        .label {
+          width: 112rpx;
+        }
+      }
+      &.card-item-SR {
+        background-image: url(@/static/detail/card-SR.png);
+        .label {
+          width: 74rpx;
+        }
+      }
+      &.card-item-N {
+        background-image: url(@/static/detail/card-N.png);
+        .label {
+          width: 38rpx;
+        }
+      }
+      &.card-item-R {
+        background-image: url(@/static/detail/card-R.png);
+        .label {
+          width: 36rpx;
+        }
+      }
+      &:nth-child(1) {
+        animation-delay: 0;
+      }
+      &:nth-child(2) {
+        animation-delay: 0.1s;
+      }
+      &:nth-child(3) {
+        animation-delay: 0.2s;
+      }
+      &:nth-child(4) {
+        animation-delay: 0.3s;
+      }
+      &:nth-child(5) {
+        animation-delay: 0.4s;
+      }
+      &:nth-child(6) {
+        animation-delay: 0.5s;
+      }
+      &:nth-child(7) {
+        animation-delay: 0.6s;
+      }
+      &:nth-child(8) {
+        animation-delay: 0.7s;
+      }
+      &:nth-child(9) {
+        animation-delay: 0.8s;
+      }
+      &:nth-child(10) {
+        animation-delay: 0.9s;
+      }
+      .label {
+        position: absolute;
+        left: 112rpx;
+        top: 116rpx;
+        height: 36rpx;
+        z-index: 10;
+      }
+      .label-text {
+        font-size: 68rpx;
+        font-family: ysbth;
+        color: #4efbff;
+        line-height: 80rpx;
+        position: absolute;
+        top: 96rpx;
+        left: 110rpx;
+        z-index: 10;
+      }
+      .sku-num {
+        font-size: 52rpx;
+        font-family: ysbth;
+        color: #4efbff;
+        line-height: 70rpx;
+        -webkit-text-stroke: 2rpx #1a3c48;
+        text-stroke: 2rpx #1a3c48;
+        position: absolute;
+        top: 440rpx;
+        right: 130rpx;
+        z-index: 10;
+        .big {
+          font-size: 60rpx;
+        }
+      }
+      .sku-img {
+        position: relative;
+        width: 364rpx;
+        height: 364rpx;
+        display: block;
+        margin: 0 auto;
+        z-index: 9;
+      }
+      .sku-name {
+        position: relative;
+        display: block;
+        margin: 24rpx auto 0;
+        width: 336rpx;
+        height: 112rpx;
+        font-size: 32rpx;
+        font-weight: 600;
+        color: #ffffff;
+        line-height: 56rpx;
+        display: -webkit-box;
+        overflow: hidden;
+        -webkit-line-clamp: 2;
+        -webkit-box-orient: vertical;
+        z-index: 9;
+      }
+      .sku-price {
+        position: relative;
+        margin-top: 70rpx;
+        display: block;
+        width: 100%;
+        text-align: center;
+        height: 56rpx;
+        font-size: 32rpx;
+        font-weight: 500;
+        color: #ffffff;
+        line-height: 56rpx;
+        z-index: 9;
+      }
+      &.card-item-small {
+        width: 280rpx;
+        height: 380rpx;
+        padding: 66rpx 49rpx 0;
+        margin: 0 -22rpx;
+        &.card-item-SP {
+          .label {
+            width: 36rpx;
+          }
+        }
+        &.card-item-SSR {
+          .label {
+            width: 56rpx;
+          }
+        }
+        &.card-item-SR {
+          .label {
+            width: 37rpx;
+          }
+        }
+        &.card-item-N {
+          .label {
+            width: 19rpx;
+          }
+        }
+        &.card-item-R {
+          .label {
+            width: 18rpx;
+          }
+        }
+        &.checked {
+          &::after {
+            width: 42rpx;
+            height: 42rpx;
+            right: 40rpx;
+            top: 41rpx;
+          }
+        }
+        .label {
+          left: 56rpx;
+          top: 58rpx;
+          height: 18rpx;
+        }
+        .label-text {
+          font-size: 34rpx;
+          line-height: 40rpx;
+          top: 48rpx;
+          left: 55rpx;
+        }
+        .sku-num {
+          font-size: 36rpx;
+          line-height: 35rpx;
+          top: 220rpx;
+          right: 65rpx;
+          .big {
+            font-size: 44rpx;
+          }
+        }
+        .sku-img {
+          width: 182rpx;
+          height: 182rpx;
+        }
+        .sku-name {
+          margin: 12rpx auto 0;
+          width: 168rpx;
+          height: 56rpx;
+          font-size: 20rpx;
+          font-weight: 600;
+          line-height: 28rpx;
+        }
+        .sku-price {
+          margin-top: 36rpx;
+          height: 28rpx;
+          font-size: 20rpx;
+          font-weight: 500;
+          line-height: 28rpx;
+        }
+      }
+    }
+  }
+  .fudai-tips {
+    font-size: 24rpx;
+    font-weight: 500;
+    line-height: 34rpx;
+    margin-top: 40rpx;
+    .img {
+      display: inline-block;
+      border-radius: 100%;
+      width: 32rpx;
+      height: 32rpx;
+      margin: 0 4rpx;
+      vertical-align: middle;
+    }
+    .text {
+      display: inline;
+    }
+  }
+  .fudai-btns {
+    margin-top: 52rpx;
+    display: flex;
+    justify-content: center;
+    .fudai-btn {
+      box-sizing: border-box;
+      display: flex;
+      flex-direction: column;
+      justify-content: center;
+      align-items: center;
+      background: url(@/static/detail/card-btn.png) no-repeat center;
+      background-size: contain;
+      font-weight: 500;
+      width: 222rpx;
+      height: 80rpx;
+      font-size: 32rpx;
+      margin: 0 38rpx;
+      color: #292d3b;
+      border-radius: 0;
+      overflow: hidden;
+
+      &::after {
+        display: none;
+      }
+      &.fudai-btn-border {
+        background-image: url(@/static/detail/card-btn-2.png);
+        color: #4efbff;
+      }
+      .btntext-1 {
+        font-size: 32rpx;
+        line-height: 1;
+      }
+      .btntext-2 {
+        font-size: 24rpx;
+        line-height: 1;
+        margin-top: 4rpx;
+      }
+    }
+  }
+}

+ 274 - 0
src/components/payresult/payresult.vue

@@ -0,0 +1,274 @@
+<template>
+  <view>
+    <uni-popup
+      ref="popup_result"
+      type="center"
+      mask-background-color="rgba(0,0,0,0.9)"
+      :is-mask-click="false"
+    >
+      <view v-if="bagData" class="popup-fudai-cards">
+        <view class="fudai-title">
+          <text class="fudai-title-text">恭喜您抽到以下商品</text>
+          <view v-if="cdTime" class="fudai-title-cd"
+            >{{ cdText
+            }}<text class="fudai-title-time">{{ cdTime }}</text></view
+          >
+        </view>
+        <view class="fudai-cards">
+          <view
+            v-for="item in bagData.relations2"
+            :key="item.id"
+            :class="[
+              'card-item',
+              `card-item-${item.card_style}`,
+              {
+                'card-item-small': bagData.relations2.length > 1,
+                checked: item.select && bagData.can_retrive === 1,
+              },
+            ]"
+            @click="handleChangeSelect(item)"
+          >
+            <image class="sku-img" :src="item.img"></image>
+            <image v-if="item.label" class="label" :src="item.label"></image>
+            <view v-else class="label-text">{{ item.level_name }}</view>
+            <view class="sku-num"
+              >x<text class="big">{{ item.num }}</text></view
+            >
+            <text class="sku-name">{{ item.name }}</text>
+            <text class="sku-price">回血: &yen; {{ item.retrive_price }}</text>
+          </view>
+        </view>
+        <view
+          v-if="bagData.retrive && bagData.can_retrive === 1"
+          class="fudai-tips"
+          >用户<image class="img" :src="bagData.retrive.avatar"></image
+          ><text class="text"
+            >{{ bagData.retrive.nickname }}{{ bagData.retrive.info }}</text
+          ></view
+        >
+        <view class="fudai-btns">
+          <view
+            v-if="bagData.can_retrive === 1"
+            class="fudai-btn"
+            @click="handleRetrive"
+            ><text class="btntext-1">{{
+              Number(bagData.total_retrive_price) === retrivePrice
+                ? "全部回血"
+                : "回血"
+            }}</text
+            ><text class="btntext-2">&yen; {{ retrivePrice }}</text></view
+          >
+          <button class="fudai-btn fudai-btn-border" @click="handleBuy">
+            继续购买
+          </button>
+        </view>
+        <image
+          class="popup_close"
+          src="@/static/icon/icon-close.png"
+          @click="handlePopupClose('popup_result')"
+        ></image>
+      </view>
+      <view v-else class="popup-fudai-cards">
+        <view class="fudai-title">
+          <text class="fudai-title-text">没有回血商品</text>
+        </view>
+        <image
+          class="popup_close"
+          src="@/static/icon/icon-close.png"
+          @click="handlePopupClose('popup_result')"
+        ></image>
+      </view>
+    </uni-popup>
+    <popup-dialog ref="popupDialog" />
+  </view>
+</template>
+
+<script>
+import Decimal from "decimal.js";
+import api from "@/lib/api/api";
+import popupDialog from "@/components/popup-dialog/popup-dialog.vue";
+
+import cardLabelN from "@/static/detail/card-label-N.png";
+import cardLabelR from "@/static/detail/card-label-R.png";
+import cardLabelSP from "@/static/detail/card-label-SP.png";
+import cardLabelSR from "@/static/detail/card-label-SR.png";
+import cardLabelSSR from "@/static/detail/card-label-SSR.png";
+
+export default {
+  name: "PayResult",
+  components: {
+    popupDialog,
+  },
+  props: {
+    id: {
+      type: String,
+      default: "0",
+    },
+    type: {
+      type: Number,
+      default: 1, // 1:福袋; 2:一番赏;
+    },
+    cdText: {
+      type: String,
+      default: "",
+    },
+    cdTime: {
+      type: String,
+      default: "",
+    },
+  },
+  data() {
+    return {
+      bagData: null,
+    };
+  },
+  computed: {
+    // 回血金额
+    retrivePrice() {
+      if (
+        !this.bagData ||
+        this.bagData.can_retrive !== 1 ||
+        this.bagData.relations2.length === 0
+      ) {
+        return 0;
+      }
+
+      let price = new Decimal(0);
+      this.bagData.relations2.forEach((item) => {
+        if (item.select)
+          price = price.plus(new Decimal(item.retrive_price).mul(item.num));
+      });
+
+      return price.toNumber();
+    },
+  },
+  methods: {
+    handlePopupShow(popup_ref) {
+      this.$refs[popup_ref].open();
+    },
+    handlePopupClose(popup_ref) {
+      this.$refs[popup_ref].close();
+    },
+    open(bagData) {
+      const now = Date.now();
+      bagData.relations2.forEach((item, i) => {
+        item.select = true;
+        item.id = now + i;
+        if (this.type === 1) {
+          switch (item.level_name) {
+            case "N":
+              item.label = cardLabelN;
+              break;
+            case "R":
+              item.label = cardLabelR;
+              break;
+            case "SP":
+              item.label = cardLabelSP;
+              break;
+            case "SR":
+              item.label = cardLabelSR;
+              break;
+            case "SSR":
+              item.label = cardLabelSSR;
+              break;
+            default:
+              item.label = "";
+          }
+        }
+      });
+      this.bagData = bagData;
+      this.handlePopupShow("popup_result");
+    },
+    handleChangeSelect(sku) {
+      if (!this.bagData || this.bagData.relations2.length < 2) {
+        return;
+      }
+      sku.select = !sku.select;
+    },
+    async handleRetrive() {
+      if (this.retriving) return;
+      this.retriving = true;
+
+      if (this.retrivePrice === 0) {
+        uni.showToast({
+          icon: "none",
+          title: "请选择回血商品",
+          duration: 3000,
+        });
+        return;
+      }
+
+      const skus = this.bagData.relations2.filter((item) => item.select);
+
+      const levels = Array.from(
+        new Set(
+          skus
+            .filter((item) => ["SR", "SSR", "SP"].includes(item.level_name))
+            .map((item) => item.level_name)
+        )
+      );
+
+      if (levels.length && this.type === 1) {
+        const confirm = await this.$refs.popupDialog
+          .open(`你抽到${levels.join(",")}卡, 确定要全部回血吗?`)
+          .then(() => true)
+          .catch(() => false);
+        this.retriving = false;
+        if (!confirm) return;
+      }
+
+      uni.showLoading({
+        title: "回血中",
+        mask: true,
+      });
+
+      const skuIds = skus
+        .map((item) => new Array(item.num).fill("" + item.sku_id))
+        .flat();
+
+      let userInfo = uni.getStorageSync("userinfo");
+      if (userInfo) {
+        userInfo = JSON.parse(userInfo);
+      }
+
+      try {
+        const data = await api.orderRecovery({
+          session: userInfo.session,
+          order_id: "" + (this.bagData.order_id || "none"),
+          sku_id: skuIds,
+          retrive_user_id: this.bagData.retrive?.user_id || "-1",
+        });
+        uni.hideLoading();
+        if (data.errno === 10000) {
+          uni.showToast({
+            icon: "none",
+            title: `回血成功,当前余额${data.data.balance}元`,
+            duration: 3e3,
+          });
+          this.handlePopupClose("popup_result");
+        } else {
+          throw new Error(data.errmsg);
+        }
+      } catch (e) {
+        uni.hideLoading();
+        uni.showToast({
+          icon: "none",
+          title: e.message || "请求失败,请稍后重试",
+          duration: 2e3,
+        });
+      }
+      setTimeout(() => {
+        this.retriving = false;
+      }, 500);
+    },
+    handleBuy() {
+      this.handlePopupClose("popup_result");
+      this.$emit("buy", this.bagData.num);
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+@import "./payresult.scss";
+</style>

+ 116 - 0
src/components/popup-dialog/popup-dialog.vue

@@ -0,0 +1,116 @@
+<template>
+  <uni-popup
+    ref="popup_dialog"
+    type="center"
+    mask-background-color="rgba(0,0,0,0.8)"
+    :is-mask-click="false"
+  >
+    <view class="popup-dialog">
+      <view class="popup-dialog-msg">
+        <text class="popup-dialog-text">{{ text }}</text>
+      </view>
+      <view class="popup-dialog-btns">
+        <button class="popup-dialog-btn cancel" @click="handleClick">
+          取消
+        </button>
+        <button
+          class="popup-dialog-btn confirm"
+          @click="handleClick($event, 'confirm')"
+        >
+          确定
+        </button>
+      </view>
+      <!-- <image
+        class="popup_close"
+        src="@/static/icon/icon-close.png"
+        @click="close()"
+      >
+      </image> -->
+    </view>
+  </uni-popup>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      text: "",
+    };
+  },
+
+  methods: {
+    open(text) {
+      this.text = text;
+      this.$refs.popup_dialog.open();
+      return new Promise((resolve, reject) => {
+        this.resolve = resolve;
+        this.reject = reject;
+      });
+    },
+    close() {
+      this.$refs.popup_dialog.close();
+    },
+    handleClick(e, type) {
+      if (type === "confirm") {
+        this.$emit("confirm", e);
+        this.resolve && this.resolve();
+      } else {
+        this.$emit("cancel", e);
+        this.reject && this.reject();
+      }
+      this.close();
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+.popup-dialog {
+  width: 459rpx;
+  height: 397rpx;
+  background: url(@/static/popup/bg.png) no-repeat;
+  background-size: contain;
+  padding: 72rpx 54rpx 0;
+  box-sizing: border-box;
+
+  .popup-dialog-msg {
+    min-height: 136rpx;
+    margin-bottom: 24rpx;
+    display: flex;
+    align-items: center;
+    justify-items: center;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #ffffff;
+    line-height: 44rpx;
+    text-align: center;
+    max-height: 176rpx;
+    overflow: hidden;
+  }
+  .popup-dialog-btns {
+    display: flex;
+    justify-content: space-between;
+    .popup-dialog-btn {
+      width: 162rpx;
+      height: 64rpx;
+      font-size: 28rpx;
+      font-weight: 500;
+      line-height: 64rpx;
+      background: no-repeat center;
+      background-size: contain;
+      margin: 0;
+      &::after {
+        display: none;
+      }
+      &.cancel {
+        color: #1d2130;
+        background-image: url(@/static/popup/cancel.png);
+      }
+      &.confirm {
+        color: #4efbff;
+        background-image: url(@/static/popup/confirm.png);
+      }
+    }
+  }
+}
+</style>

+ 94 - 0
src/components/popup-img-detail/popup-img-detail.vue

@@ -0,0 +1,94 @@
+<template>
+  <uni-popup
+    ref="popup_detail"
+    type="bottom"
+    mask-background-color="rgba(0,0,0,0.8)"
+    :is-mask-click="true"
+  >
+    <view class="popup-img-detail">
+      <image
+        class="close"
+        src="@/static/icon/icon-close-dark.png"
+        @click="close"
+      >
+      </image>
+      <text class="title">{{ title }}</text>
+      <text class="desc">图片仅供参考,请以实物为准</text>
+      <view class="popup-img-detail-content">
+        <image
+          v-for="item in list"
+          :key="item"
+          class="img"
+          :src="item"
+          mode="widthFix"
+        ></image>
+      </view>
+    </view>
+  </uni-popup>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      title: "商品详情",
+      list: [],
+    };
+  },
+
+  methods: {
+    open(data) {
+      this.title = data.title || "商品详情";
+      this.list = data.list;
+      this.$refs.popup_detail.open();
+    },
+    close() {
+      this.$refs.popup_detail.close();
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+.popup-img-detail {
+  padding: 32rpx 24rpx 64rpx;
+  background-color: #fff;
+  display: flex;
+  flex-direction: column;
+  height: 80vh;
+  .title {
+    display: block;
+    min-height: 44rpx;
+    font-size: 32rpx;
+    font-weight: 500;
+    color: #505050;
+    line-height: 44rpx;
+    padding-right: 80rpx;
+  }
+  .desc {
+    display: block;
+    height: 34rpx;
+    font-size: 24rpx;
+    font-weight: 500;
+    color: #9496a5;
+    line-height: 34rpx;
+    margin-top: 8rpx;
+  }
+  .popup-img-detail-content {
+    margin-top: 24rpx;
+    flex: 1;
+    overflow-y: auto;
+    .img {
+      display: block;
+      width: 100%;
+    }
+  }
+}
+.close {
+  width: 32rpx;
+  height: 32rpx;
+  position: absolute;
+  right: 24rpx;
+  top: 24rpx;
+}
+</style>

+ 220 - 0
src/components/popup-signin/popup-signin.vue

@@ -0,0 +1,220 @@
+<template>
+  <uni-popup
+    ref="popup_signin"
+    type="center"
+    mask-background-color="rgba(0,0,0,0.8)"
+    :is-mask-click="false"
+  >
+    <view class="popup_signin">
+      <view class="title"
+        ><text>连续签到,好礼</text><text class="color">免费拿</text></view
+      >
+      <view class="signin-list">
+        <view v-for="item in list" :key="item.date" class="signin-item">
+          <view
+            :class="[
+              'card',
+              {
+                'card-current': item.is_signin,
+              },
+            ]"
+          >
+            <text class="reward"
+              >{{ item.price }}<text class="unit">{{ item.unit }}</text></text
+            >
+            <text class="status">{{ item.signin_name }}</text>
+          </view>
+          <text
+            :class="[
+              'day',
+              {
+                today: item.is_current,
+              },
+            ]"
+            >{{ item.day }}</text
+          >
+        </view>
+      </view>
+      <button
+        :class="[
+          'btn-signin',
+          {
+            'btn-disabled': isCurrentSignin,
+          },
+        ]"
+        :disabled="isCurrentSignin === 1"
+        @click="handleSignin"
+      >
+        {{ isCurrentSignin ? "已签到" : "立即签到" }}
+      </button>
+      <image
+        class="popup_close"
+        src="@/static/icon/icon-close.png"
+        @click="close()"
+      >
+      </image>
+    </view>
+  </uni-popup>
+</template>
+
+<script>
+import api from "@/lib/api/api";
+import {
+  requestSubscribeMessage,
+  defaultTemplateIds,
+} from "@/lib/utils/wxSubscribe";
+
+export default {
+  props: {
+    list: {
+      type: Array,
+      default: () => [],
+    },
+    isCurrentSignin: {
+      type: Number,
+      default: 0,
+    },
+    session: {
+      type: String,
+      default: "",
+    },
+  },
+  data() {
+    return {
+      active: false,
+    };
+  },
+
+  methods: {
+    open() {
+      this.$refs.popup_signin.open();
+    },
+    close() {
+      this.$refs.popup_signin.close();
+    },
+    async handleSignin() {
+      uni.showLoading();
+      // #ifdef MP-WEIXIN
+      await requestSubscribeMessage(defaultTemplateIds).catch(() => void 0);
+      // #endif
+      try {
+        const data = await api.userSingIn({
+          session: this.session,
+        });
+        if (data.errno === 10000) {
+          // this.singInfo = data;
+          this.$emit("change", data);
+
+          uni.hideLoading();
+        } else {
+          throw new Error(data.errmsg);
+        }
+      } catch (e) {
+        uni.hideLoading();
+        uni.showToast({
+          icon: "none",
+          title: e.message || "签到失败,请重试",
+          duration: 3000,
+        });
+      }
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+.popup_signin {
+  box-sizing: border-box;
+  position: relative;
+  width: 560rpx;
+  height: 832rpx;
+  padding: 242rpx 20rpx 0;
+  background: url(https://chujianchaowan.oss-cn-beijing.aliyuncs.com/images/04ba6a176c50dc8e27a023a6b1d9a84d.png)
+    no-repeat center;
+  background-size: contain;
+
+  .title {
+    height: 50rpx;
+    font-size: 36rpx;
+    font-weight: 600;
+    color: #292d3b;
+    line-height: 50rpx;
+    display: block;
+    text-align: center;
+    .color {
+      color: #08c2c3;
+    }
+  }
+  .signin-list {
+    margin: 0 -10rpx;
+    display: flex;
+    flex-wrap: wrap;
+    overflow: hidden;
+    justify-content: center;
+    padding: 12rpx 0;
+    .signin-item {
+      width: 116rpx;
+      height: 182rpx;
+      text-align: center;
+      margin: 12rpx 9rpx;
+    }
+    .card {
+      box-sizing: border-box;
+      width: 116rpx;
+      height: 132rpx;
+      overflow: hidden;
+      padding-top: 16rpx;
+      background: url(@/static/home/sign-item.png) no-repeat;
+      background-size: contain;
+      color: #fff;
+      &.card-current {
+        background-image: url(@/static/home/sign-item-active.png);
+      }
+      .reward {
+        display: block;
+        height: 44rpx;
+        font-size: 32rpx;
+        font-weight: 500;
+        line-height: 44rpx;
+        .unit {
+          font-size: 22rpx;
+        }
+      }
+      .status {
+        display: block;
+        font-size: 26rpx;
+        font-weight: 500;
+        line-height: 36rpx;
+        margin-top: 26rpx;
+      }
+    }
+    .day {
+      display: block;
+      margin-top: 16rpx;
+      font-size: 24rpx;
+      font-weight: 500;
+      color: #292d3b;
+      line-height: 34rpx;
+      &.today {
+        color: #08c2c3;
+      }
+    }
+  }
+  .btn-signin {
+    border-radius: 0;
+    margin-top: 8rpx;
+    width: 512rpx;
+    height: 80rpx;
+    background: #08c2c3;
+    font-size: 32rpx;
+    font-weight: 500;
+    color: #ffffff;
+    &.btn-disabled {
+      background: rgba(8, 194, 195, 0.5);
+    }
+    &::after {
+      display: none;
+    }
+  }
+}
+</style>

+ 41 - 0
src/components/task-btn/task-btn.vue

@@ -0,0 +1,41 @@
+<template>
+  <button class="task-btn" @click="handleClick">领积分</button>
+</template>
+
+<script>
+export default {
+  data() {
+    return {};
+  },
+
+  methods: {
+    handleClick() {
+      uni.navigateTo({
+        url: "/pages/task/index",
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+.task-btn {
+  box-sizing: border-box;
+  width: 132rpx;
+  height: 129rpx;
+  font-size: 24rpx;
+  font-weight: 500;
+  color: #ffffff;
+  line-height: 28rpx;
+  background: url(../../static/task/btn-sign.png) no-repeat;
+  background-size: contain;
+  position: fixed;
+  bottom: 130rpx;
+  right: 22rpx;
+  padding: 95rpx 0 0 24rpx;
+  border-radius: 0;
+  &::after {
+    display: none;
+  }
+}
+</style>

+ 13950 - 0
src/components/wangding-pickerAddress/data.js

@@ -0,0 +1,13950 @@
+export default [
+  {
+    provinceCode: "110000",
+    provinceName: "北京",
+    city: [
+      {
+        cityCode: "110000-1",
+        cityName: "北京市",
+        county: [
+          {
+            countyCode: "110115",
+            countyName: "大兴区",
+          },
+          {
+            countyCode: "110116",
+            countyName: "怀柔区",
+          },
+          {
+            countyCode: "110105",
+            countyName: "朝阳区",
+          },
+          {
+            countyCode: "110229",
+            countyName: "延庆区",
+          },
+          {
+            countyCode: "110114",
+            countyName: "昌平区",
+          },
+          {
+            countyCode: "110108",
+            countyName: "海淀区",
+          },
+          {
+            countyCode: "110107",
+            countyName: "石景山区",
+          },
+          {
+            countyCode: "110112",
+            countyName: "通州区",
+          },
+          {
+            countyCode: "110228",
+            countyName: "密云区",
+          },
+          {
+            countyCode: "110117",
+            countyName: "平谷区",
+          },
+          {
+            countyCode: "110109",
+            countyName: "门头沟区",
+          },
+          {
+            countyCode: "110113",
+            countyName: "顺义区",
+          },
+          {
+            countyCode: "110106",
+            countyName: "丰台区",
+          },
+          {
+            countyCode: "110111",
+            countyName: "房山区",
+          },
+          {
+            countyCode: "110101",
+            countyName: "东城区",
+          },
+          {
+            countyCode: "110102",
+            countyName: "西城区",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "120000",
+    provinceName: "天津",
+    city: [
+      {
+        cityCode: "120000-1",
+        cityName: "天津市",
+        county: [
+          {
+            countyCode: "120103",
+            countyName: "河西区",
+          },
+          {
+            countyCode: "120106",
+            countyName: "红桥区",
+          },
+          {
+            countyCode: "120223",
+            countyName: "静海区",
+          },
+          {
+            countyCode: "120114",
+            countyName: "武清区",
+          },
+          {
+            countyCode: "120110",
+            countyName: "东丽区",
+          },
+          {
+            countyCode: "120111",
+            countyName: "西青区",
+          },
+          {
+            countyCode: "120225",
+            countyName: "蓟州区",
+          },
+          {
+            countyCode: "120116",
+            countyName: "滨海新区",
+          },
+          {
+            countyCode: "120113",
+            countyName: "北辰区",
+          },
+          {
+            countyCode: "120115",
+            countyName: "宝坻区",
+          },
+          {
+            countyCode: "120101",
+            countyName: "和平区",
+          },
+          {
+            countyCode: "120112",
+            countyName: "津南区",
+          },
+          {
+            countyCode: "120221",
+            countyName: "宁河区",
+          },
+          {
+            countyCode: "120104",
+            countyName: "南开区",
+          },
+          {
+            countyCode: "120105",
+            countyName: "河北区",
+          },
+          {
+            countyCode: "120102",
+            countyName: "河东区",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "130000",
+    provinceName: "河北省",
+    city: [
+      {
+        cityCode: "130400",
+        cityName: "邯郸市",
+        county: [
+          {
+            countyCode: "130404",
+            countyName: "复兴区",
+          },
+          {
+            countyCode: "130424",
+            countyName: "成安县",
+          },
+          {
+            countyCode: "130403",
+            countyName: "丛台区",
+          },
+          {
+            countyCode: "130402",
+            countyName: "邯山区",
+          },
+          {
+            countyCode: "130434",
+            countyName: "魏县",
+          },
+          {
+            countyCode: "130429",
+            countyName: "永年区",
+          },
+          {
+            countyCode: "130427",
+            countyName: "磁县",
+          },
+          {
+            countyCode: "130433",
+            countyName: "馆陶县",
+          },
+          {
+            countyCode: "130421",
+            countyName: "邯郸县",
+          },
+          {
+            countyCode: "130435",
+            countyName: "曲周县",
+          },
+          {
+            countyCode: "130425",
+            countyName: "大名县",
+          },
+          {
+            countyCode: "130426",
+            countyName: "涉县",
+          },
+          {
+            countyCode: "130423",
+            countyName: "临漳县",
+          },
+          {
+            countyCode: "130431",
+            countyName: "鸡泽县",
+          },
+          {
+            countyCode: "130406",
+            countyName: "峰峰矿区",
+          },
+          {
+            countyCode: "130430",
+            countyName: "邱县",
+          },
+          {
+            countyCode: "130428",
+            countyName: "肥乡区",
+          },
+          {
+            countyCode: "130432",
+            countyName: "广平县",
+          },
+          {
+            countyCode: "130481",
+            countyName: "武安市",
+          },
+        ],
+      },
+      {
+        cityCode: "131100",
+        cityName: "衡水市",
+        county: [
+          {
+            countyCode: "131127",
+            countyName: "景县",
+          },
+          {
+            countyCode: "131102",
+            countyName: "桃城区",
+          },
+          {
+            countyCode: "131128",
+            countyName: "阜城县",
+          },
+          {
+            countyCode: "131125",
+            countyName: "安平县",
+          },
+          {
+            countyCode: "131121",
+            countyName: "枣强县",
+          },
+          {
+            countyCode: "131123",
+            countyName: "武强县",
+          },
+          {
+            countyCode: "131122",
+            countyName: "武邑县",
+          },
+          {
+            countyCode: "131181",
+            countyName: "冀州区",
+          },
+          {
+            countyCode: "131126",
+            countyName: "故城县",
+          },
+          {
+            countyCode: "131124",
+            countyName: "饶阳县",
+          },
+          {
+            countyCode: "131182",
+            countyName: "深州市",
+          },
+        ],
+      },
+      {
+        cityCode: "130900",
+        cityName: "沧州市",
+        county: [
+          {
+            countyCode: "130930",
+            countyName: "孟村回族自治县",
+          },
+          {
+            countyCode: "130923",
+            countyName: "东光县",
+          },
+          {
+            countyCode: "130981",
+            countyName: "泊头市",
+          },
+          {
+            countyCode: "130924",
+            countyName: "海兴县",
+          },
+          {
+            countyCode: "130927",
+            countyName: "南皮县",
+          },
+          {
+            countyCode: "130922",
+            countyName: "青县",
+          },
+          {
+            countyCode: "130902",
+            countyName: "新华区",
+          },
+          {
+            countyCode: "130925",
+            countyName: "盐山县",
+          },
+          {
+            countyCode: "130903",
+            countyName: "运河区",
+          },
+          {
+            countyCode: "130921",
+            countyName: "沧县",
+          },
+          {
+            countyCode: "130984",
+            countyName: "河间市",
+          },
+          {
+            countyCode: "130926",
+            countyName: "肃宁县",
+          },
+          {
+            countyCode: "130982",
+            countyName: "任丘市",
+          },
+          {
+            countyCode: "130983",
+            countyName: "黄骅市",
+          },
+          {
+            countyCode: "130928",
+            countyName: "吴桥县",
+          },
+          {
+            countyCode: "130929",
+            countyName: "献县",
+          },
+        ],
+      },
+      {
+        cityCode: "130200",
+        cityName: "唐山市",
+        county: [
+          {
+            countyCode: "130207",
+            countyName: "丰南区",
+          },
+          {
+            countyCode: "130204",
+            countyName: "古冶区",
+          },
+          {
+            countyCode: "130224",
+            countyName: "滦南县",
+          },
+          {
+            countyCode: "130209",
+            countyName: "曹妃甸区",
+          },
+          {
+            countyCode: "130202",
+            countyName: "路南区",
+          },
+          {
+            countyCode: "130208",
+            countyName: "丰润区",
+          },
+          {
+            countyCode: "130203",
+            countyName: "路北区",
+          },
+          {
+            countyCode: "130281",
+            countyName: "遵化市",
+          },
+          {
+            countyCode: "130205",
+            countyName: "开平区",
+          },
+          {
+            countyCode: "130283",
+            countyName: "迁安市",
+          },
+          {
+            countyCode: "130227",
+            countyName: "迁西县",
+          },
+          {
+            countyCode: "130229",
+            countyName: "玉田县",
+          },
+          {
+            countyCode: "130225",
+            countyName: "乐亭县",
+          },
+          {
+            countyCode: "130223",
+            countyName: "滦州市",
+          },
+        ],
+      },
+      {
+        cityCode: "130700",
+        cityName: "张家口市",
+        county: [
+          {
+            countyCode: "130728",
+            countyName: "怀安县",
+          },
+          {
+            countyCode: "130723",
+            countyName: "康保县",
+          },
+          {
+            countyCode: "130702",
+            countyName: "桥东区",
+          },
+          {
+            countyCode: "130732",
+            countyName: "赤城县",
+          },
+          {
+            countyCode: "130733",
+            countyName: "崇礼区",
+          },
+          {
+            countyCode: "130727",
+            countyName: "阳原县",
+          },
+          {
+            countyCode: "130731",
+            countyName: "涿鹿县",
+          },
+          {
+            countyCode: "130705",
+            countyName: "宣化区",
+          },
+          {
+            countyCode: "130722",
+            countyName: "张北县",
+          },
+          {
+            countyCode: "130729",
+            countyName: "万全区",
+          },
+          {
+            countyCode: "130724",
+            countyName: "沽源县",
+          },
+          {
+            countyCode: "130703",
+            countyName: "桥西区",
+          },
+          {
+            countyCode: "130706",
+            countyName: "下花园区",
+          },
+          {
+            countyCode: "130730",
+            countyName: "怀来县",
+          },
+          {
+            countyCode: "130725",
+            countyName: "尚义县",
+          },
+          {
+            countyCode: "130726",
+            countyName: "蔚县",
+          },
+          {
+            countyCode: "130721",
+            countyName: "宣化县",
+          },
+        ],
+      },
+      {
+        cityCode: "131000",
+        cityName: "廊坊市",
+        county: [
+          {
+            countyCode: "131002",
+            countyName: "安次区",
+          },
+          {
+            countyCode: "131082",
+            countyName: "三河市",
+          },
+          {
+            countyCode: "131025",
+            countyName: "大城县",
+          },
+          {
+            countyCode: "131023",
+            countyName: "永清县",
+          },
+          {
+            countyCode: "131028",
+            countyName: "大厂回族自治县",
+          },
+          {
+            countyCode: "131022",
+            countyName: "固安县",
+          },
+          {
+            countyCode: "131003",
+            countyName: "广阳区",
+          },
+          {
+            countyCode: "131081",
+            countyName: "霸州市",
+          },
+          {
+            countyCode: "131026",
+            countyName: "文安县",
+          },
+          {
+            countyCode: "131024",
+            countyName: "香河县",
+          },
+        ],
+      },
+      {
+        cityCode: "130300",
+        cityName: "秦皇岛市",
+        county: [
+          {
+            countyCode: "130323",
+            countyName: "抚宁区",
+          },
+          {
+            countyCode: "130321",
+            countyName: "青龙满族自治县",
+          },
+          {
+            countyCode: "130303",
+            countyName: "山海关区",
+          },
+          {
+            countyCode: "130304",
+            countyName: "北戴河区",
+          },
+          {
+            countyCode: "130302",
+            countyName: "海港区",
+          },
+          {
+            countyCode: "130322",
+            countyName: "昌黎县",
+          },
+          {
+            countyCode: "130324",
+            countyName: "卢龙县",
+          },
+        ],
+      },
+      {
+        cityCode: "130500",
+        cityName: "邢台市",
+        county: [
+          {
+            countyCode: "130533",
+            countyName: "威县",
+          },
+          {
+            countyCode: "130532",
+            countyName: "平乡县",
+          },
+          {
+            countyCode: "130527",
+            countyName: "南和县",
+          },
+          {
+            countyCode: "130521",
+            countyName: "邢台县",
+          },
+          {
+            countyCode: "130524",
+            countyName: "柏乡县",
+          },
+          {
+            countyCode: "130522",
+            countyName: "临城县",
+          },
+          {
+            countyCode: "130530",
+            countyName: "新河县",
+          },
+          {
+            countyCode: "130534",
+            countyName: "清河县",
+          },
+          {
+            countyCode: "130582",
+            countyName: "沙河市",
+          },
+          {
+            countyCode: "130531",
+            countyName: "广宗县",
+          },
+          {
+            countyCode: "130525",
+            countyName: "隆尧县",
+          },
+          {
+            countyCode: "130529",
+            countyName: "巨鹿县",
+          },
+          {
+            countyCode: "130523",
+            countyName: "内丘县",
+          },
+          {
+            countyCode: "130528",
+            countyName: "宁晋县",
+          },
+          {
+            countyCode: "130526",
+            countyName: "任县",
+          },
+          {
+            countyCode: "130581",
+            countyName: "南宫市",
+          },
+          {
+            countyCode: "130535",
+            countyName: "临西县",
+          },
+          {
+            countyCode: "130502",
+            countyName: "桥东区",
+          },
+          {
+            countyCode: "130503",
+            countyName: "桥西区",
+          },
+        ],
+      },
+      {
+        cityCode: "130100",
+        cityName: "石家庄市",
+        county: [
+          {
+            countyCode: "130125",
+            countyName: "行唐县",
+          },
+          {
+            countyCode: "130185",
+            countyName: "鹿泉区",
+          },
+          {
+            countyCode: "130123",
+            countyName: "正定县",
+          },
+          {
+            countyCode: "130107",
+            countyName: "井陉矿区",
+          },
+          {
+            countyCode: "130102",
+            countyName: "长安区",
+          },
+          {
+            countyCode: "130184",
+            countyName: "新乐市",
+          },
+          {
+            countyCode: "130183",
+            countyName: "晋州市",
+          },
+          {
+            countyCode: "130128",
+            countyName: "深泽县",
+          },
+          {
+            countyCode: "130181",
+            countyName: "辛集市",
+          },
+          {
+            countyCode: "130124",
+            countyName: "栾城区",
+          },
+          {
+            countyCode: "130126",
+            countyName: "灵寿县",
+          },
+          {
+            countyCode: "130104",
+            countyName: "桥西区",
+          },
+          {
+            countyCode: "130130",
+            countyName: "无极县",
+          },
+          {
+            countyCode: "130108",
+            countyName: "裕华区",
+          },
+          {
+            countyCode: "130129",
+            countyName: "赞皇县",
+          },
+          {
+            countyCode: "130133",
+            countyName: "赵县",
+          },
+          {
+            countyCode: "130182",
+            countyName: "藁城区",
+          },
+          {
+            countyCode: "130127",
+            countyName: "高邑县",
+          },
+          {
+            countyCode: "130132",
+            countyName: "元氏县",
+          },
+          {
+            countyCode: "130131",
+            countyName: "平山县",
+          },
+          {
+            countyCode: "130121",
+            countyName: "井陉县",
+          },
+          {
+            countyCode: "130105",
+            countyName: "新华区",
+          },
+        ],
+      },
+      {
+        cityCode: "130800",
+        cityName: "承德市",
+        county: [
+          {
+            countyCode: "130803",
+            countyName: "双滦区",
+          },
+          {
+            countyCode: "130827",
+            countyName: "宽城满族自治县",
+          },
+          {
+            countyCode: "130802",
+            countyName: "双桥区",
+          },
+          {
+            countyCode: "130826",
+            countyName: "丰宁满族自治县",
+          },
+          {
+            countyCode: "130821",
+            countyName: "承德县",
+          },
+          {
+            countyCode: "130828",
+            countyName: "围场满族蒙古族自治县",
+          },
+          {
+            countyCode: "130822",
+            countyName: "兴隆县",
+          },
+          {
+            countyCode: "130825",
+            countyName: "隆化县",
+          },
+          {
+            countyCode: "130823",
+            countyName: "平泉市",
+          },
+          {
+            countyCode: "130804",
+            countyName: "鹰手营子矿区",
+          },
+          {
+            countyCode: "130824",
+            countyName: "滦平县",
+          },
+        ],
+      },
+      {
+        cityCode: "130600",
+        cityName: "保定市",
+        county: [
+          {
+            countyCode: "130638",
+            countyName: "雄县",
+          },
+          {
+            countyCode: "130625",
+            countyName: "徐水区",
+          },
+          {
+            countyCode: "130682",
+            countyName: "定州市",
+          },
+          {
+            countyCode: "130631",
+            countyName: "望都县",
+          },
+          {
+            countyCode: "130630",
+            countyName: "涞源县",
+          },
+          {
+            countyCode: "130621",
+            countyName: "满城区",
+          },
+          {
+            countyCode: "130626",
+            countyName: "定兴县",
+          },
+          {
+            countyCode: "130624",
+            countyName: "阜平县",
+          },
+          {
+            countyCode: "130636",
+            countyName: "顺平县",
+          },
+          {
+            countyCode: "130627",
+            countyName: "唐县",
+          },
+          {
+            countyCode: "130623",
+            countyName: "涞水县",
+          },
+          {
+            countyCode: "130629",
+            countyName: "容城县",
+          },
+          {
+            countyCode: "130634",
+            countyName: "曲阳县",
+          },
+          {
+            countyCode: "130637",
+            countyName: "博野县",
+          },
+          {
+            countyCode: "130622",
+            countyName: "清苑区",
+          },
+          {
+            countyCode: "130632",
+            countyName: "安新县",
+          },
+          {
+            countyCode: "130684",
+            countyName: "高碑店市",
+          },
+          {
+            countyCode: "130633",
+            countyName: "易县",
+          },
+          {
+            countyCode: "130628",
+            countyName: "高阳县",
+          },
+          {
+            countyCode: "130683",
+            countyName: "安国市",
+          },
+          {
+            countyCode: "130604",
+            countyName: "南市区",
+          },
+          {
+            countyCode: "130603",
+            countyName: "北市区",
+          },
+          {
+            countyCode: "130681",
+            countyName: "涿州市",
+          },
+          {
+            countyCode: "130635",
+            countyName: "蠡县",
+          },
+          {
+            countyCode: "130602",
+            countyName: "竞秀区",
+          },
+          {
+            countyCode: "130606",
+            countyName: "莲池区",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "140000",
+    provinceName: "山西省",
+    city: [
+      {
+        cityCode: "141000",
+        cityName: "临汾市",
+        county: [
+          {
+            countyCode: "141033",
+            countyName: "蒲县",
+          },
+          {
+            countyCode: "141025",
+            countyName: "古县",
+          },
+          {
+            countyCode: "141034",
+            countyName: "汾西县",
+          },
+          {
+            countyCode: "141027",
+            countyName: "浮山县",
+          },
+          {
+            countyCode: "141021",
+            countyName: "曲沃县",
+          },
+          {
+            countyCode: "141032",
+            countyName: "永和县",
+          },
+          {
+            countyCode: "141082",
+            countyName: "霍州市",
+          },
+          {
+            countyCode: "141028",
+            countyName: "吉县",
+          },
+          {
+            countyCode: "141022",
+            countyName: "翼城县",
+          },
+          {
+            countyCode: "141030",
+            countyName: "大宁县",
+          },
+          {
+            countyCode: "141081",
+            countyName: "侯马市",
+          },
+          {
+            countyCode: "141002",
+            countyName: "尧都区",
+          },
+          {
+            countyCode: "141026",
+            countyName: "安泽县",
+          },
+          {
+            countyCode: "141024",
+            countyName: "洪洞县",
+          },
+          {
+            countyCode: "141023",
+            countyName: "襄汾县",
+          },
+          {
+            countyCode: "141029",
+            countyName: "乡宁县",
+          },
+          {
+            countyCode: "141031",
+            countyName: "隰县",
+          },
+        ],
+      },
+      {
+        cityCode: "140200",
+        cityName: "大同市",
+        county: [
+          {
+            countyCode: "140223",
+            countyName: "广灵县",
+          },
+          {
+            countyCode: "140203",
+            countyName: "矿区",
+          },
+          {
+            countyCode: "140212",
+            countyName: "新荣区",
+          },
+          {
+            countyCode: "140224",
+            countyName: "灵丘县",
+          },
+          {
+            countyCode: "140222",
+            countyName: "天镇县",
+          },
+          {
+            countyCode: "140213",
+            countyName: "平城区",
+          },
+          {
+            countyCode: "140227",
+            countyName: "云州区",
+          },
+          {
+            countyCode: "140202",
+            countyName: "城区",
+          },
+          {
+            countyCode: "140225",
+            countyName: "浑源县",
+          },
+          {
+            countyCode: "140221",
+            countyName: "阳高县",
+          },
+          {
+            countyCode: "140211",
+            countyName: "南郊区",
+          },
+          {
+            countyCode: "140214",
+            countyName: "云冈区",
+          },
+          {
+            countyCode: "140226",
+            countyName: "左云县",
+          },
+        ],
+      },
+      {
+        cityCode: "140700",
+        cityName: "晋中市",
+        county: [
+          {
+            countyCode: "140722",
+            countyName: "左权县",
+          },
+          {
+            countyCode: "140721",
+            countyName: "榆社县",
+          },
+          {
+            countyCode: "140728",
+            countyName: "平遥县",
+          },
+          {
+            countyCode: "140723",
+            countyName: "和顺县",
+          },
+          {
+            countyCode: "140726",
+            countyName: "太谷县",
+          },
+          {
+            countyCode: "140781",
+            countyName: "介休市",
+          },
+          {
+            countyCode: "140725",
+            countyName: "寿阳县",
+          },
+          {
+            countyCode: "140727",
+            countyName: "祁县",
+          },
+          {
+            countyCode: "140724",
+            countyName: "昔阳县",
+          },
+          {
+            countyCode: "140702",
+            countyName: "榆次区",
+          },
+          {
+            countyCode: "140729",
+            countyName: "灵石县",
+          },
+        ],
+      },
+      {
+        cityCode: "140500",
+        cityName: "晋城市",
+        county: [
+          {
+            countyCode: "140521",
+            countyName: "沁水县",
+          },
+          {
+            countyCode: "140581",
+            countyName: "高平市",
+          },
+          {
+            countyCode: "140524",
+            countyName: "陵川县",
+          },
+          {
+            countyCode: "140522",
+            countyName: "阳城县",
+          },
+          {
+            countyCode: "140525",
+            countyName: "泽州县",
+          },
+          {
+            countyCode: "140502",
+            countyName: "城区",
+          },
+        ],
+      },
+      {
+        cityCode: "140600",
+        cityName: "朔州市",
+        county: [
+          {
+            countyCode: "140621",
+            countyName: "山阴县",
+          },
+          {
+            countyCode: "140623",
+            countyName: "右玉县",
+          },
+          {
+            countyCode: "140603",
+            countyName: "平鲁区",
+          },
+          {
+            countyCode: "140602",
+            countyName: "朔城区",
+          },
+          {
+            countyCode: "140622",
+            countyName: "应县",
+          },
+          {
+            countyCode: "140624",
+            countyName: "怀仁市",
+          },
+        ],
+      },
+      {
+        cityCode: "141100",
+        cityName: "吕梁市",
+        county: [
+          {
+            countyCode: "141125",
+            countyName: "柳林县",
+          },
+          {
+            countyCode: "141127",
+            countyName: "岚县",
+          },
+          {
+            countyCode: "141122",
+            countyName: "交城县",
+          },
+          {
+            countyCode: "141128",
+            countyName: "方山县",
+          },
+          {
+            countyCode: "141129",
+            countyName: "中阳县",
+          },
+          {
+            countyCode: "141102",
+            countyName: "离石区",
+          },
+          {
+            countyCode: "141126",
+            countyName: "石楼县",
+          },
+          {
+            countyCode: "141182",
+            countyName: "汾阳市",
+          },
+          {
+            countyCode: "141130",
+            countyName: "交口县",
+          },
+          {
+            countyCode: "141124",
+            countyName: "临县",
+          },
+          {
+            countyCode: "141181",
+            countyName: "孝义市",
+          },
+          {
+            countyCode: "141123",
+            countyName: "兴县",
+          },
+          {
+            countyCode: "141121",
+            countyName: "文水县",
+          },
+        ],
+      },
+      {
+        cityCode: "140900",
+        cityName: "忻州市",
+        county: [
+          {
+            countyCode: "140902",
+            countyName: "忻府区",
+          },
+          {
+            countyCode: "140922",
+            countyName: "五台县",
+          },
+          {
+            countyCode: "140981",
+            countyName: "原平市",
+          },
+          {
+            countyCode: "140932",
+            countyName: "偏关县",
+          },
+          {
+            countyCode: "140927",
+            countyName: "神池县",
+          },
+          {
+            countyCode: "140925",
+            countyName: "宁武县",
+          },
+          {
+            countyCode: "140924",
+            countyName: "繁峙县",
+          },
+          {
+            countyCode: "140931",
+            countyName: "保德县",
+          },
+          {
+            countyCode: "140926",
+            countyName: "静乐县",
+          },
+          {
+            countyCode: "140930",
+            countyName: "河曲县",
+          },
+          {
+            countyCode: "140921",
+            countyName: "定襄县",
+          },
+          {
+            countyCode: "140923",
+            countyName: "代县",
+          },
+          {
+            countyCode: "140928",
+            countyName: "五寨县",
+          },
+          {
+            countyCode: "140929",
+            countyName: "岢岚县",
+          },
+        ],
+      },
+      {
+        cityCode: "140100",
+        cityName: "太原市",
+        county: [
+          {
+            countyCode: "140107",
+            countyName: "杏花岭区",
+          },
+          {
+            countyCode: "140109",
+            countyName: "万柏林区",
+          },
+          {
+            countyCode: "140105",
+            countyName: "小店区",
+          },
+          {
+            countyCode: "140181",
+            countyName: "古交市",
+          },
+          {
+            countyCode: "140110",
+            countyName: "晋源区",
+          },
+          {
+            countyCode: "140122",
+            countyName: "阳曲县",
+          },
+          {
+            countyCode: "140108",
+            countyName: "尖草坪区",
+          },
+          {
+            countyCode: "140121",
+            countyName: "清徐县",
+          },
+          {
+            countyCode: "140123",
+            countyName: "娄烦县",
+          },
+          {
+            countyCode: "140106",
+            countyName: "迎泽区",
+          },
+        ],
+      },
+      {
+        cityCode: "140300",
+        cityName: "阳泉市",
+        county: [
+          {
+            countyCode: "140302",
+            countyName: "城区",
+          },
+          {
+            countyCode: "140321",
+            countyName: "平定县",
+          },
+          {
+            countyCode: "140311",
+            countyName: "郊区",
+          },
+          {
+            countyCode: "140303",
+            countyName: "矿区",
+          },
+          {
+            countyCode: "140322",
+            countyName: "盂县",
+          },
+        ],
+      },
+      {
+        cityCode: "140800",
+        cityName: "运城市",
+        county: [
+          {
+            countyCode: "140802",
+            countyName: "盐湖区",
+          },
+          {
+            countyCode: "140829",
+            countyName: "平陆县",
+          },
+          {
+            countyCode: "140828",
+            countyName: "夏县",
+          },
+          {
+            countyCode: "140825",
+            countyName: "新绛县",
+          },
+          {
+            countyCode: "140830",
+            countyName: "芮城县",
+          },
+          {
+            countyCode: "140823",
+            countyName: "闻喜县",
+          },
+          {
+            countyCode: "140826",
+            countyName: "绛县",
+          },
+          {
+            countyCode: "140822",
+            countyName: "万荣县",
+          },
+          {
+            countyCode: "140821",
+            countyName: "临猗县",
+          },
+          {
+            countyCode: "140827",
+            countyName: "垣曲县",
+          },
+          {
+            countyCode: "140824",
+            countyName: "稷山县",
+          },
+          {
+            countyCode: "140881",
+            countyName: "永济市",
+          },
+          {
+            countyCode: "140882",
+            countyName: "河津市",
+          },
+        ],
+      },
+      {
+        cityCode: "140400",
+        cityName: "长治市",
+        county: [
+          {
+            countyCode: "140428",
+            countyName: "长子县",
+          },
+          {
+            countyCode: "140430",
+            countyName: "沁县",
+          },
+          {
+            countyCode: "140426",
+            countyName: "黎城县",
+          },
+          {
+            countyCode: "140481",
+            countyName: "潞城市",
+          },
+          {
+            countyCode: "140403",
+            countyName: "潞州区",
+          },
+          {
+            countyCode: "140402",
+            countyName: "城区",
+          },
+          {
+            countyCode: "140427",
+            countyName: "壶关县",
+          },
+          {
+            countyCode: "140429",
+            countyName: "武乡县",
+          },
+          {
+            countyCode: "140425",
+            countyName: "平顺县",
+          },
+          {
+            countyCode: "140421",
+            countyName: "长治县",
+          },
+          {
+            countyCode: "140424",
+            countyName: "屯留县",
+          },
+          {
+            countyCode: "140431",
+            countyName: "沁源县",
+          },
+          {
+            countyCode: "140411",
+            countyName: "郊区",
+          },
+          {
+            countyCode: "140423",
+            countyName: "襄垣县",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "150000",
+    provinceName: "内蒙古自治区",
+    city: [
+      {
+        cityCode: "150100",
+        cityName: "呼和浩特市",
+        county: [
+          {
+            countyCode: "150125",
+            countyName: "武川县",
+          },
+          {
+            countyCode: "150124",
+            countyName: "清水河县",
+          },
+          {
+            countyCode: "150105",
+            countyName: "赛罕区",
+          },
+          {
+            countyCode: "150122",
+            countyName: "托克托县",
+          },
+          {
+            countyCode: "150121",
+            countyName: "土默特左旗",
+          },
+          {
+            countyCode: "150102",
+            countyName: "新城区",
+          },
+          {
+            countyCode: "150104",
+            countyName: "玉泉区",
+          },
+          {
+            countyCode: "150123",
+            countyName: "和林格尔县",
+          },
+          {
+            countyCode: "150103",
+            countyName: "回民区",
+          },
+        ],
+      },
+      {
+        cityCode: "150300",
+        cityName: "乌海市",
+        county: [
+          {
+            countyCode: "150303",
+            countyName: "海南区",
+          },
+          {
+            countyCode: "150302",
+            countyName: "海勃湾区",
+          },
+          {
+            countyCode: "150304",
+            countyName: "乌达区",
+          },
+        ],
+      },
+      {
+        cityCode: "150500",
+        cityName: "通辽市",
+        county: [
+          {
+            countyCode: "150502",
+            countyName: "科尔沁区",
+          },
+          {
+            countyCode: "150526",
+            countyName: "扎鲁特旗",
+          },
+          {
+            countyCode: "150522",
+            countyName: "科尔沁左翼后旗",
+          },
+          {
+            countyCode: "150523",
+            countyName: "开鲁县",
+          },
+          {
+            countyCode: "150524",
+            countyName: "库伦旗",
+          },
+          {
+            countyCode: "150525",
+            countyName: "奈曼旗",
+          },
+          {
+            countyCode: "150521",
+            countyName: "科尔沁左翼中旗",
+          },
+          {
+            countyCode: "150581",
+            countyName: "霍林郭勒市",
+          },
+        ],
+      },
+      {
+        cityCode: "150400",
+        cityName: "赤峰市",
+        county: [
+          {
+            countyCode: "150422",
+            countyName: "巴林左旗",
+          },
+          {
+            countyCode: "150429",
+            countyName: "宁城县",
+          },
+          {
+            countyCode: "150421",
+            countyName: "阿鲁科尔沁旗",
+          },
+          {
+            countyCode: "150423",
+            countyName: "巴林右旗",
+          },
+          {
+            countyCode: "150425",
+            countyName: "克什克腾旗",
+          },
+          {
+            countyCode: "150426",
+            countyName: "翁牛特旗",
+          },
+          {
+            countyCode: "150402",
+            countyName: "红山区",
+          },
+          {
+            countyCode: "150430",
+            countyName: "敖汉旗",
+          },
+          {
+            countyCode: "150428",
+            countyName: "喀喇沁旗",
+          },
+          {
+            countyCode: "150404",
+            countyName: "松山区",
+          },
+          {
+            countyCode: "150424",
+            countyName: "林西县",
+          },
+          {
+            countyCode: "150403",
+            countyName: "元宝山区",
+          },
+        ],
+      },
+      {
+        cityCode: "150200",
+        cityName: "包头市",
+        county: [
+          {
+            countyCode: "150203",
+            countyName: "昆都仑区",
+          },
+          {
+            countyCode: "150204",
+            countyName: "青山区",
+          },
+          {
+            countyCode: "150205",
+            countyName: "石拐区",
+          },
+          {
+            countyCode: "150221",
+            countyName: "土默特右旗",
+          },
+          {
+            countyCode: "150222",
+            countyName: "固阳县",
+          },
+          {
+            countyCode: "150223",
+            countyName: "达尔罕茂明安联合旗",
+          },
+          {
+            countyCode: "150206",
+            countyName: "白云鄂博矿区",
+          },
+          {
+            countyCode: "150202",
+            countyName: "东河区",
+          },
+          {
+            countyCode: "150207",
+            countyName: "九原区",
+          },
+        ],
+      },
+      {
+        cityCode: "150700",
+        cityName: "呼伦贝尔市",
+        county: [
+          {
+            countyCode: "150721",
+            countyName: "阿荣旗",
+          },
+          {
+            countyCode: "150723",
+            countyName: "鄂伦春自治旗",
+          },
+          {
+            countyCode: "150785",
+            countyName: "根河市",
+          },
+          {
+            countyCode: "150782",
+            countyName: "牙克石市",
+          },
+          {
+            countyCode: "150783",
+            countyName: "扎兰屯市",
+          },
+          {
+            countyCode: "150724",
+            countyName: "鄂温克族自治旗",
+          },
+          {
+            countyCode: "150784",
+            countyName: "额尔古纳市",
+          },
+          {
+            countyCode: "150727",
+            countyName: "新巴尔虎右旗",
+          },
+          {
+            countyCode: "150726",
+            countyName: "新巴尔虎左旗",
+          },
+          {
+            countyCode: "150702",
+            countyName: "海拉尔区",
+          },
+          {
+            countyCode: "150703",
+            countyName: "扎赉诺尔区",
+          },
+          {
+            countyCode: "150781",
+            countyName: "满洲里市",
+          },
+          {
+            countyCode: "150725",
+            countyName: "陈巴尔虎旗",
+          },
+          {
+            countyCode: "150722",
+            countyName: "莫力达瓦达斡尔族自治旗",
+          },
+        ],
+      },
+      {
+        cityCode: "152500",
+        cityName: "锡林郭勒盟",
+        county: [
+          {
+            countyCode: "152529",
+            countyName: "正镶白旗",
+          },
+          {
+            countyCode: "152501",
+            countyName: "二连浩特市",
+          },
+          {
+            countyCode: "152525",
+            countyName: "东乌珠穆沁旗",
+          },
+          {
+            countyCode: "152524",
+            countyName: "苏尼特右旗",
+          },
+          {
+            countyCode: "152523",
+            countyName: "苏尼特左旗",
+          },
+          {
+            countyCode: "152526",
+            countyName: "西乌珠穆沁旗",
+          },
+          {
+            countyCode: "152531",
+            countyName: "多伦县",
+          },
+          {
+            countyCode: "152528",
+            countyName: "镶黄旗",
+          },
+          {
+            countyCode: "152530",
+            countyName: "正蓝旗",
+          },
+          {
+            countyCode: "152522",
+            countyName: "阿巴嘎旗",
+          },
+          {
+            countyCode: "152502",
+            countyName: "锡林浩特市",
+          },
+          {
+            countyCode: "152527",
+            countyName: "太仆寺旗",
+          },
+        ],
+      },
+      {
+        cityCode: "152200",
+        cityName: "兴安盟",
+        county: [
+          {
+            countyCode: "152221",
+            countyName: "科尔沁右翼前旗",
+          },
+          {
+            countyCode: "152223",
+            countyName: "扎赉特旗",
+          },
+          {
+            countyCode: "152201",
+            countyName: "乌兰浩特市",
+          },
+          {
+            countyCode: "152224",
+            countyName: "突泉县",
+          },
+          {
+            countyCode: "152222",
+            countyName: "科尔沁右翼中旗",
+          },
+          {
+            countyCode: "152202",
+            countyName: "阿尔山市",
+          },
+        ],
+      },
+      {
+        cityCode: "150900",
+        cityName: "乌兰察布市",
+        county: [
+          {
+            countyCode: "150902",
+            countyName: "集宁区",
+          },
+          {
+            countyCode: "150921",
+            countyName: "卓资县",
+          },
+          {
+            countyCode: "150922",
+            countyName: "化德县",
+          },
+          {
+            countyCode: "150923",
+            countyName: "商都县",
+          },
+          {
+            countyCode: "150928",
+            countyName: "察哈尔右翼后旗",
+          },
+          {
+            countyCode: "150926",
+            countyName: "察哈尔右翼前旗",
+          },
+          {
+            countyCode: "150927",
+            countyName: "察哈尔右翼中旗",
+          },
+          {
+            countyCode: "150929",
+            countyName: "四子王旗",
+          },
+          {
+            countyCode: "150981",
+            countyName: "丰镇市",
+          },
+          {
+            countyCode: "150925",
+            countyName: "凉城县",
+          },
+          {
+            countyCode: "150924",
+            countyName: "兴和县",
+          },
+        ],
+      },
+      {
+        cityCode: "150600",
+        cityName: "鄂尔多斯市",
+        county: [
+          {
+            countyCode: "150624",
+            countyName: "鄂托克旗",
+          },
+          {
+            countyCode: "150621",
+            countyName: "达拉特旗",
+          },
+          {
+            countyCode: "150626",
+            countyName: "乌审旗",
+          },
+          {
+            countyCode: "150602",
+            countyName: "东胜区",
+          },
+          {
+            countyCode: "150603",
+            countyName: "康巴什区",
+          },
+          {
+            countyCode: "150623",
+            countyName: "鄂托克前旗",
+          },
+          {
+            countyCode: "150622",
+            countyName: "准格尔旗",
+          },
+          {
+            countyCode: "150625",
+            countyName: "杭锦旗",
+          },
+          {
+            countyCode: "150627",
+            countyName: "伊金霍洛旗",
+          },
+        ],
+      },
+      {
+        cityCode: "152900",
+        cityName: "阿拉善盟",
+        county: [
+          {
+            countyCode: "152923",
+            countyName: "额济纳旗",
+          },
+          {
+            countyCode: "152921",
+            countyName: "阿拉善左旗",
+          },
+          {
+            countyCode: "152922",
+            countyName: "阿拉善右旗",
+          },
+        ],
+      },
+      {
+        cityCode: "150800",
+        cityName: "巴彦淖尔市",
+        county: [
+          {
+            countyCode: "150802",
+            countyName: "临河区",
+          },
+          {
+            countyCode: "150823",
+            countyName: "乌拉特前旗",
+          },
+          {
+            countyCode: "150821",
+            countyName: "五原县",
+          },
+          {
+            countyCode: "150826",
+            countyName: "杭锦后旗",
+          },
+          {
+            countyCode: "150825",
+            countyName: "乌拉特后旗",
+          },
+          {
+            countyCode: "150824",
+            countyName: "乌拉特中旗",
+          },
+          {
+            countyCode: "150822",
+            countyName: "磴口县",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "210000",
+    provinceName: "辽宁省",
+    city: [
+      {
+        cityCode: "211200",
+        cityName: "铁岭市",
+        county: [
+          {
+            countyCode: "211281",
+            countyName: "调兵山市",
+          },
+          {
+            countyCode: "211221",
+            countyName: "铁岭县",
+          },
+          {
+            countyCode: "211224",
+            countyName: "昌图县",
+          },
+          {
+            countyCode: "211223",
+            countyName: "西丰县",
+          },
+          {
+            countyCode: "211282",
+            countyName: "开原市",
+          },
+          {
+            countyCode: "211202",
+            countyName: "银州区",
+          },
+          {
+            countyCode: "211204",
+            countyName: "清河区",
+          },
+        ],
+      },
+      {
+        cityCode: "210500",
+        cityName: "本溪市",
+        county: [
+          {
+            countyCode: "210522",
+            countyName: "桓仁满族自治县",
+          },
+          {
+            countyCode: "210502",
+            countyName: "平山区",
+          },
+          {
+            countyCode: "210503",
+            countyName: "溪湖区",
+          },
+          {
+            countyCode: "210505",
+            countyName: "南芬区",
+          },
+          {
+            countyCode: "210504",
+            countyName: "明山区",
+          },
+          {
+            countyCode: "210521",
+            countyName: "本溪满族自治县",
+          },
+        ],
+      },
+      {
+        cityCode: "211400",
+        cityName: "葫芦岛市",
+        county: [
+          {
+            countyCode: "211421",
+            countyName: "绥中县",
+          },
+          {
+            countyCode: "211481",
+            countyName: "兴城市",
+          },
+          {
+            countyCode: "211403",
+            countyName: "龙港区",
+          },
+          {
+            countyCode: "211404",
+            countyName: "南票区",
+          },
+          {
+            countyCode: "211422",
+            countyName: "建昌县",
+          },
+          {
+            countyCode: "211402",
+            countyName: "连山区",
+          },
+        ],
+      },
+      {
+        cityCode: "210100",
+        cityName: "沈阳市",
+        county: [
+          {
+            countyCode: "210122",
+            countyName: "辽中区",
+          },
+          {
+            countyCode: "210104",
+            countyName: "大东区",
+          },
+          {
+            countyCode: "210105",
+            countyName: "皇姑区",
+          },
+          {
+            countyCode: "210123",
+            countyName: "康平县",
+          },
+          {
+            countyCode: "210124",
+            countyName: "法库县",
+          },
+          {
+            countyCode: "210181",
+            countyName: "新民市",
+          },
+          {
+            countyCode: "210103",
+            countyName: "沈河区",
+          },
+          {
+            countyCode: "210111",
+            countyName: "苏家屯区",
+          },
+          {
+            countyCode: "210106",
+            countyName: "铁西区",
+          },
+          {
+            countyCode: "210102",
+            countyName: "和平区",
+          },
+          {
+            countyCode: "210113",
+            countyName: "沈北新区",
+          },
+          {
+            countyCode: "210114",
+            countyName: "于洪区",
+          },
+          {
+            countyCode: "210112",
+            countyName: "浑南区",
+          },
+        ],
+      },
+      {
+        cityCode: "210900",
+        cityName: "阜新市",
+        county: [
+          {
+            countyCode: "210905",
+            countyName: "清河门区",
+          },
+          {
+            countyCode: "210911",
+            countyName: "细河区",
+          },
+          {
+            countyCode: "210921",
+            countyName: "阜新蒙古族自治县",
+          },
+          {
+            countyCode: "210902",
+            countyName: "海州区",
+          },
+          {
+            countyCode: "210903",
+            countyName: "新邱区",
+          },
+          {
+            countyCode: "210922",
+            countyName: "彰武县",
+          },
+          {
+            countyCode: "210904",
+            countyName: "太平区",
+          },
+        ],
+      },
+      {
+        cityCode: "210800",
+        cityName: "营口市",
+        county: [
+          {
+            countyCode: "210802",
+            countyName: "站前区",
+          },
+          {
+            countyCode: "210804",
+            countyName: "鲅鱼圈区",
+          },
+          {
+            countyCode: "210811",
+            countyName: "老边区",
+          },
+          {
+            countyCode: "210882",
+            countyName: "大石桥市",
+          },
+          {
+            countyCode: "210881",
+            countyName: "盖州市",
+          },
+          {
+            countyCode: "210803",
+            countyName: "西市区",
+          },
+        ],
+      },
+      {
+        cityCode: "210300",
+        cityName: "鞍山市",
+        county: [
+          {
+            countyCode: "210304",
+            countyName: "立山区",
+          },
+          {
+            countyCode: "210381",
+            countyName: "海城市",
+          },
+          {
+            countyCode: "210321",
+            countyName: "台安县",
+          },
+          {
+            countyCode: "210311",
+            countyName: "千山区",
+          },
+          {
+            countyCode: "210302",
+            countyName: "铁东区",
+          },
+          {
+            countyCode: "210303",
+            countyName: "铁西区",
+          },
+          {
+            countyCode: "210323",
+            countyName: "岫岩满族自治县",
+          },
+        ],
+      },
+      {
+        cityCode: "210700",
+        cityName: "锦州市",
+        county: [
+          {
+            countyCode: "210727",
+            countyName: "义县",
+          },
+          {
+            countyCode: "210781",
+            countyName: "凌海市",
+          },
+          {
+            countyCode: "210711",
+            countyName: "太和区",
+          },
+          {
+            countyCode: "210726",
+            countyName: "黑山县",
+          },
+          {
+            countyCode: "210782",
+            countyName: "北镇市",
+          },
+          {
+            countyCode: "210702",
+            countyName: "古塔区",
+          },
+          {
+            countyCode: "210703",
+            countyName: "凌河区",
+          },
+        ],
+      },
+      {
+        cityCode: "210400",
+        cityName: "抚顺市",
+        county: [
+          {
+            countyCode: "210403",
+            countyName: "东洲区",
+          },
+          {
+            countyCode: "210411",
+            countyName: "顺城区",
+          },
+          {
+            countyCode: "210404",
+            countyName: "望花区",
+          },
+          {
+            countyCode: "210402",
+            countyName: "新抚区",
+          },
+          {
+            countyCode: "210421",
+            countyName: "抚顺县",
+          },
+          {
+            countyCode: "210423",
+            countyName: "清原满族自治县",
+          },
+          {
+            countyCode: "210422",
+            countyName: "新宾满族自治县",
+          },
+        ],
+      },
+      {
+        cityCode: "210200",
+        cityName: "大连市",
+        county: [
+          {
+            countyCode: "210213",
+            countyName: "金州区",
+          },
+          {
+            countyCode: "210202",
+            countyName: "中山区",
+          },
+          {
+            countyCode: "210282",
+            countyName: "普兰店区",
+          },
+          {
+            countyCode: "210204",
+            countyName: "沙河口区",
+          },
+          {
+            countyCode: "210203",
+            countyName: "西岗区",
+          },
+          {
+            countyCode: "210281",
+            countyName: "瓦房店市",
+          },
+          {
+            countyCode: "210211",
+            countyName: "甘井子区",
+          },
+          {
+            countyCode: "210212",
+            countyName: "旅顺口区",
+          },
+          {
+            countyCode: "210224",
+            countyName: "长海县",
+          },
+          {
+            countyCode: "210283",
+            countyName: "庄河市",
+          },
+        ],
+      },
+      {
+        cityCode: "211000",
+        cityName: "辽阳市",
+        county: [
+          {
+            countyCode: "211003",
+            countyName: "文圣区",
+          },
+          {
+            countyCode: "211081",
+            countyName: "灯塔市",
+          },
+          {
+            countyCode: "211011",
+            countyName: "太子河区",
+          },
+          {
+            countyCode: "211005",
+            countyName: "弓长岭区",
+          },
+          {
+            countyCode: "211004",
+            countyName: "宏伟区",
+          },
+          {
+            countyCode: "211021",
+            countyName: "辽阳县",
+          },
+          {
+            countyCode: "211002",
+            countyName: "白塔区",
+          },
+        ],
+      },
+      {
+        cityCode: "210600",
+        cityName: "丹东市",
+        county: [
+          {
+            countyCode: "210603",
+            countyName: "振兴区",
+          },
+          {
+            countyCode: "210681",
+            countyName: "东港市",
+          },
+          {
+            countyCode: "210624",
+            countyName: "宽甸满族自治县",
+          },
+          {
+            countyCode: "210682",
+            countyName: "凤城市",
+          },
+          {
+            countyCode: "210604",
+            countyName: "振安区",
+          },
+          {
+            countyCode: "210602",
+            countyName: "元宝区",
+          },
+        ],
+      },
+      {
+        cityCode: "211300",
+        cityName: "朝阳市",
+        county: [
+          {
+            countyCode: "211382",
+            countyName: "凌源市",
+          },
+          {
+            countyCode: "211322",
+            countyName: "建平县",
+          },
+          {
+            countyCode: "211381",
+            countyName: "北票市",
+          },
+          {
+            countyCode: "211303",
+            countyName: "龙城区",
+          },
+          {
+            countyCode: "211302",
+            countyName: "双塔区",
+          },
+          {
+            countyCode: "211324",
+            countyName: "喀喇沁左翼蒙古族自治县",
+          },
+          {
+            countyCode: "211321",
+            countyName: "朝阳县",
+          },
+        ],
+      },
+      {
+        cityCode: "211100",
+        cityName: "盘锦市",
+        county: [
+          {
+            countyCode: "211122",
+            countyName: "盘山县",
+          },
+          {
+            countyCode: "211103",
+            countyName: "兴隆台区",
+          },
+          {
+            countyCode: "211102",
+            countyName: "双台子区",
+          },
+          {
+            countyCode: "211121",
+            countyName: "大洼区",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "220000",
+    provinceName: "吉林省",
+    city: [
+      {
+        cityCode: "220600",
+        cityName: "白山市",
+        county: [
+          {
+            countyCode: "220621",
+            countyName: "抚松县",
+          },
+          {
+            countyCode: "220602",
+            countyName: "浑江区",
+          },
+          {
+            countyCode: "220622",
+            countyName: "靖宇县",
+          },
+          {
+            countyCode: "220605",
+            countyName: "江源区",
+          },
+          {
+            countyCode: "220681",
+            countyName: "临江市",
+          },
+          {
+            countyCode: "220623",
+            countyName: "长白朝鲜族自治县",
+          },
+        ],
+      },
+      {
+        cityCode: "220500",
+        cityName: "通化市",
+        county: [
+          {
+            countyCode: "220523",
+            countyName: "辉南县",
+          },
+          {
+            countyCode: "220521",
+            countyName: "通化县",
+          },
+          {
+            countyCode: "220581",
+            countyName: "梅河口市",
+          },
+          {
+            countyCode: "220502",
+            countyName: "东昌区",
+          },
+          {
+            countyCode: "220524",
+            countyName: "柳河县",
+          },
+          {
+            countyCode: "220503",
+            countyName: "二道江区",
+          },
+          {
+            countyCode: "220582",
+            countyName: "集安市",
+          },
+        ],
+      },
+      {
+        cityCode: "220700",
+        cityName: "松原市",
+        county: [
+          {
+            countyCode: "220722",
+            countyName: "长岭县",
+          },
+          {
+            countyCode: "220702",
+            countyName: "宁江区",
+          },
+          {
+            countyCode: "220724",
+            countyName: "扶余市",
+          },
+          {
+            countyCode: "220721",
+            countyName: "前郭尔罗斯蒙古族自治县",
+          },
+          {
+            countyCode: "220723",
+            countyName: "乾安县",
+          },
+        ],
+      },
+      {
+        cityCode: "220800",
+        cityName: "白城市",
+        county: [
+          {
+            countyCode: "220802",
+            countyName: "洮北区",
+          },
+          {
+            countyCode: "220821",
+            countyName: "镇赉县",
+          },
+          {
+            countyCode: "220822",
+            countyName: "通榆县",
+          },
+          {
+            countyCode: "220881",
+            countyName: "洮南市",
+          },
+          {
+            countyCode: "220882",
+            countyName: "大安市",
+          },
+        ],
+      },
+      {
+        cityCode: "220100",
+        cityName: "长春市",
+        county: [
+          {
+            countyCode: "220105",
+            countyName: "二道区",
+          },
+          {
+            countyCode: "220182",
+            countyName: "榆树市",
+          },
+          {
+            countyCode: "220106",
+            countyName: "绿园区",
+          },
+          {
+            countyCode: "220181",
+            countyName: "九台区",
+          },
+          {
+            countyCode: "220122",
+            countyName: "农安县",
+          },
+          {
+            countyCode: "220103",
+            countyName: "宽城区",
+          },
+          {
+            countyCode: "220102",
+            countyName: "南关区",
+          },
+          {
+            countyCode: "220104",
+            countyName: "朝阳区",
+          },
+          {
+            countyCode: "220183",
+            countyName: "德惠市",
+          },
+          {
+            countyCode: "220112",
+            countyName: "双阳区",
+          },
+        ],
+      },
+      {
+        cityCode: "222400",
+        cityName: "延边朝鲜族自治州",
+        county: [
+          {
+            countyCode: "222424",
+            countyName: "汪清县",
+          },
+          {
+            countyCode: "222401",
+            countyName: "延吉市",
+          },
+          {
+            countyCode: "222404",
+            countyName: "珲春市",
+          },
+          {
+            countyCode: "222405",
+            countyName: "龙井市",
+          },
+          {
+            countyCode: "222402",
+            countyName: "图们市",
+          },
+          {
+            countyCode: "222426",
+            countyName: "安图县",
+          },
+          {
+            countyCode: "222406",
+            countyName: "和龙市",
+          },
+          {
+            countyCode: "222403",
+            countyName: "敦化市",
+          },
+        ],
+      },
+      {
+        cityCode: "220400",
+        cityName: "辽源市",
+        county: [
+          {
+            countyCode: "220422",
+            countyName: "东辽县",
+          },
+          {
+            countyCode: "220402",
+            countyName: "龙山区",
+          },
+          {
+            countyCode: "220421",
+            countyName: "东丰县",
+          },
+          {
+            countyCode: "220403",
+            countyName: "西安区",
+          },
+        ],
+      },
+      {
+        cityCode: "220300",
+        cityName: "四平市",
+        county: [
+          {
+            countyCode: "220381",
+            countyName: "公主岭市",
+          },
+          {
+            countyCode: "220323",
+            countyName: "伊通满族自治县",
+          },
+          {
+            countyCode: "220322",
+            countyName: "梨树县",
+          },
+          {
+            countyCode: "220382",
+            countyName: "双辽市",
+          },
+          {
+            countyCode: "220302",
+            countyName: "铁西区",
+          },
+          {
+            countyCode: "220303",
+            countyName: "铁东区",
+          },
+        ],
+      },
+      {
+        cityCode: "220200",
+        cityName: "吉林市",
+        county: [
+          {
+            countyCode: "220204",
+            countyName: "船营区",
+          },
+          {
+            countyCode: "220283",
+            countyName: "舒兰市",
+          },
+          {
+            countyCode: "220282",
+            countyName: "桦甸市",
+          },
+          {
+            countyCode: "220202",
+            countyName: "昌邑区",
+          },
+          {
+            countyCode: "220281",
+            countyName: "蛟河市",
+          },
+          {
+            countyCode: "220284",
+            countyName: "磐石市",
+          },
+          {
+            countyCode: "220211",
+            countyName: "丰满区",
+          },
+          {
+            countyCode: "220203",
+            countyName: "龙潭区",
+          },
+          {
+            countyCode: "220221",
+            countyName: "永吉县",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "230000",
+    provinceName: "黑龙江省",
+    city: [
+      {
+        cityCode: "230400",
+        cityName: "鹤岗市",
+        county: [
+          {
+            countyCode: "230406",
+            countyName: "东山区",
+          },
+          {
+            countyCode: "230407",
+            countyName: "兴山区",
+          },
+          {
+            countyCode: "230422",
+            countyName: "绥滨县",
+          },
+          {
+            countyCode: "230403",
+            countyName: "工农区",
+          },
+          {
+            countyCode: "230404",
+            countyName: "南山区",
+          },
+          {
+            countyCode: "230421",
+            countyName: "萝北县",
+          },
+          {
+            countyCode: "230402",
+            countyName: "向阳区",
+          },
+          {
+            countyCode: "230405",
+            countyName: "兴安区",
+          },
+        ],
+      },
+      {
+        cityCode: "230700",
+        cityName: "伊春市",
+        county: [
+          {
+            countyCode: "230708",
+            countyName: "美溪区",
+          },
+          {
+            countyCode: "230705",
+            countyName: "西林区",
+          },
+          {
+            countyCode: "230722",
+            countyName: "嘉荫县",
+          },
+          {
+            countyCode: "230709",
+            countyName: "金山屯区",
+          },
+          {
+            countyCode: "230711",
+            countyName: "乌马河区",
+          },
+          {
+            countyCode: "230707",
+            countyName: "新青区",
+          },
+          {
+            countyCode: "230702",
+            countyName: "伊春区",
+          },
+          {
+            countyCode: "230704",
+            countyName: "友好区",
+          },
+          {
+            countyCode: "230703",
+            countyName: "南岔区",
+          },
+          {
+            countyCode: "230710",
+            countyName: "五营区",
+          },
+          {
+            countyCode: "230716",
+            countyName: "上甘岭区",
+          },
+          {
+            countyCode: "230712",
+            countyName: "汤旺河区",
+          },
+          {
+            countyCode: "230781",
+            countyName: "铁力市",
+          },
+          {
+            countyCode: "230714",
+            countyName: "乌伊岭区",
+          },
+          {
+            countyCode: "230715",
+            countyName: "红星区",
+          },
+          {
+            countyCode: "230706",
+            countyName: "翠峦区",
+          },
+          {
+            countyCode: "230713",
+            countyName: "带岭区",
+          },
+        ],
+      },
+      {
+        cityCode: "230800",
+        cityName: "佳木斯市",
+        county: [
+          {
+            countyCode: "230881",
+            countyName: "同江市",
+          },
+          {
+            countyCode: "230805",
+            countyName: "东风区",
+          },
+          {
+            countyCode: "230811",
+            countyName: "郊区",
+          },
+          {
+            countyCode: "230882",
+            countyName: "富锦市",
+          },
+          {
+            countyCode: "230828",
+            countyName: "汤原县",
+          },
+          {
+            countyCode: "230833",
+            countyName: "抚远市",
+          },
+          {
+            countyCode: "230804",
+            countyName: "前进区",
+          },
+          {
+            countyCode: "230803",
+            countyName: "向阳区",
+          },
+          {
+            countyCode: "230826",
+            countyName: "桦川县",
+          },
+          {
+            countyCode: "230822",
+            countyName: "桦南县",
+          },
+        ],
+      },
+      {
+        cityCode: "230200",
+        cityName: "齐齐哈尔市",
+        county: [
+          {
+            countyCode: "230207",
+            countyName: "碾子山区",
+          },
+          {
+            countyCode: "230203",
+            countyName: "建华区",
+          },
+          {
+            countyCode: "230204",
+            countyName: "铁锋区",
+          },
+          {
+            countyCode: "230208",
+            countyName: "梅里斯达斡尔族区",
+          },
+          {
+            countyCode: "230230",
+            countyName: "克东县",
+          },
+          {
+            countyCode: "230227",
+            countyName: "富裕县",
+          },
+          {
+            countyCode: "230205",
+            countyName: "昂昂溪区",
+          },
+          {
+            countyCode: "230221",
+            countyName: "龙江县",
+          },
+          {
+            countyCode: "230206",
+            countyName: "富拉尔基区",
+          },
+          {
+            countyCode: "230223",
+            countyName: "依安县",
+          },
+          {
+            countyCode: "230225",
+            countyName: "甘南县",
+          },
+          {
+            countyCode: "230229",
+            countyName: "克山县",
+          },
+          {
+            countyCode: "230281",
+            countyName: "讷河市",
+          },
+          {
+            countyCode: "230202",
+            countyName: "龙沙区",
+          },
+          {
+            countyCode: "230231",
+            countyName: "拜泉县",
+          },
+          {
+            countyCode: "230224",
+            countyName: "泰来县",
+          },
+        ],
+      },
+      {
+        cityCode: "230500",
+        cityName: "双鸭山市",
+        county: [
+          {
+            countyCode: "230524",
+            countyName: "饶河县",
+          },
+          {
+            countyCode: "230506",
+            countyName: "宝山区",
+          },
+          {
+            countyCode: "230503",
+            countyName: "岭东区",
+          },
+          {
+            countyCode: "230505",
+            countyName: "四方台区",
+          },
+          {
+            countyCode: "230523",
+            countyName: "宝清县",
+          },
+          {
+            countyCode: "230521",
+            countyName: "集贤县",
+          },
+          {
+            countyCode: "230522",
+            countyName: "友谊县",
+          },
+          {
+            countyCode: "230502",
+            countyName: "尖山区",
+          },
+        ],
+      },
+      {
+        cityCode: "230100",
+        cityName: "哈尔滨市",
+        county: [
+          {
+            countyCode: "230109",
+            countyName: "松北区",
+          },
+          {
+            countyCode: "230127",
+            countyName: "木兰县",
+          },
+          {
+            countyCode: "230124",
+            countyName: "方正县",
+          },
+          {
+            countyCode: "230103",
+            countyName: "南岗区",
+          },
+          {
+            countyCode: "230183",
+            countyName: "尚志市",
+          },
+          {
+            countyCode: "230129",
+            countyName: "延寿县",
+          },
+          {
+            countyCode: "230126",
+            countyName: "巴彦县",
+          },
+          {
+            countyCode: "230125",
+            countyName: "宾县",
+          },
+          {
+            countyCode: "230102",
+            countyName: "道里区",
+          },
+          {
+            countyCode: "230111",
+            countyName: "呼兰区",
+          },
+          {
+            countyCode: "230112",
+            countyName: "阿城区",
+          },
+          {
+            countyCode: "230110",
+            countyName: "香坊区",
+          },
+          {
+            countyCode: "230108",
+            countyName: "平房区",
+          },
+          {
+            countyCode: "230182",
+            countyName: "双城区",
+          },
+          {
+            countyCode: "230123",
+            countyName: "依兰县",
+          },
+          {
+            countyCode: "230184",
+            countyName: "五常市",
+          },
+          {
+            countyCode: "230104",
+            countyName: "道外区",
+          },
+          {
+            countyCode: "230128",
+            countyName: "通河县",
+          },
+        ],
+      },
+      {
+        cityCode: "231000",
+        cityName: "牡丹江市",
+        county: [
+          {
+            countyCode: "231003",
+            countyName: "阳明区",
+          },
+          {
+            countyCode: "231005",
+            countyName: "西安区",
+          },
+          {
+            countyCode: "231025",
+            countyName: "林口县",
+          },
+          {
+            countyCode: "231024",
+            countyName: "东宁市",
+          },
+          {
+            countyCode: "231004",
+            countyName: "爱民区",
+          },
+          {
+            countyCode: "231084",
+            countyName: "宁安市",
+          },
+          {
+            countyCode: "231083",
+            countyName: "海林市",
+          },
+          {
+            countyCode: "231002",
+            countyName: "东安区",
+          },
+          {
+            countyCode: "231085",
+            countyName: "穆棱市",
+          },
+          {
+            countyCode: "231081",
+            countyName: "绥芬河市",
+          },
+        ],
+      },
+      {
+        cityCode: "230900",
+        cityName: "七台河市",
+        county: [
+          {
+            countyCode: "230904",
+            countyName: "茄子河区",
+          },
+          {
+            countyCode: "230921",
+            countyName: "勃利县",
+          },
+          {
+            countyCode: "230902",
+            countyName: "新兴区",
+          },
+          {
+            countyCode: "230903",
+            countyName: "桃山区",
+          },
+        ],
+      },
+      {
+        cityCode: "231100",
+        cityName: "黑河市",
+        county: [
+          {
+            countyCode: "231102",
+            countyName: "爱辉区",
+          },
+          {
+            countyCode: "231182",
+            countyName: "五大连池市",
+          },
+          {
+            countyCode: "231181",
+            countyName: "北安市",
+          },
+          {
+            countyCode: "231124",
+            countyName: "孙吴县",
+          },
+          {
+            countyCode: "231123",
+            countyName: "逊克县",
+          },
+          {
+            countyCode: "231121",
+            countyName: "嫩江县",
+          },
+        ],
+      },
+      {
+        cityCode: "230600",
+        cityName: "大庆市",
+        county: [
+          {
+            countyCode: "230605",
+            countyName: "红岗区",
+          },
+          {
+            countyCode: "230606",
+            countyName: "大同区",
+          },
+          {
+            countyCode: "230623",
+            countyName: "林甸县",
+          },
+          {
+            countyCode: "230622",
+            countyName: "肇源县",
+          },
+          {
+            countyCode: "230621",
+            countyName: "肇州县",
+          },
+          {
+            countyCode: "230624",
+            countyName: "杜尔伯特蒙古族自治县",
+          },
+          {
+            countyCode: "230603",
+            countyName: "龙凤区",
+          },
+          {
+            countyCode: "230602",
+            countyName: "萨尔图区",
+          },
+          {
+            countyCode: "230604",
+            countyName: "让胡路区",
+          },
+        ],
+      },
+      {
+        cityCode: "232700",
+        cityName: "大兴安岭地区",
+        county: [
+          {
+            countyCode: "232703",
+            countyName: "新林区",
+          },
+          {
+            countyCode: "232702",
+            countyName: "松岭区",
+          },
+          {
+            countyCode: "232701",
+            countyName: "加格达奇区",
+          },
+          {
+            countyCode: "232722",
+            countyName: "塔河县",
+          },
+          {
+            countyCode: "232721",
+            countyName: "呼玛县",
+          },
+          {
+            countyCode: "232704",
+            countyName: "呼中区",
+          },
+          {
+            countyCode: "232723",
+            countyName: "漠河市",
+          },
+        ],
+      },
+      {
+        cityCode: "231200",
+        cityName: "绥化市",
+        county: [
+          {
+            countyCode: "231281",
+            countyName: "安达市",
+          },
+          {
+            countyCode: "231224",
+            countyName: "庆安县",
+          },
+          {
+            countyCode: "231282",
+            countyName: "肇东市",
+          },
+          {
+            countyCode: "231283",
+            countyName: "海伦市",
+          },
+          {
+            countyCode: "231225",
+            countyName: "明水县",
+          },
+          {
+            countyCode: "231222",
+            countyName: "兰西县",
+          },
+          {
+            countyCode: "231223",
+            countyName: "青冈县",
+          },
+          {
+            countyCode: "231226",
+            countyName: "绥棱县",
+          },
+          {
+            countyCode: "231221",
+            countyName: "望奎县",
+          },
+          {
+            countyCode: "231202",
+            countyName: "北林区",
+          },
+        ],
+      },
+      {
+        cityCode: "230300",
+        cityName: "鸡西市",
+        county: [
+          {
+            countyCode: "230303",
+            countyName: "恒山区",
+          },
+          {
+            countyCode: "230302",
+            countyName: "鸡冠区",
+          },
+          {
+            countyCode: "230305",
+            countyName: "梨树区",
+          },
+          {
+            countyCode: "230321",
+            countyName: "鸡东县",
+          },
+          {
+            countyCode: "230304",
+            countyName: "滴道区",
+          },
+          {
+            countyCode: "230381",
+            countyName: "虎林市",
+          },
+          {
+            countyCode: "230307",
+            countyName: "麻山区",
+          },
+          {
+            countyCode: "230306",
+            countyName: "城子河区",
+          },
+          {
+            countyCode: "230382",
+            countyName: "密山市",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "310000",
+    provinceName: "上海",
+    city: [
+      {
+        cityCode: "310000-1",
+        cityName: "上海市",
+        county: [
+          {
+            countyCode: "310115",
+            countyName: "浦东新区",
+          },
+          {
+            countyCode: "310110",
+            countyName: "杨浦区",
+          },
+          {
+            countyCode: "310230",
+            countyName: "崇明区",
+          },
+          {
+            countyCode: "310113",
+            countyName: "宝山区",
+          },
+          {
+            countyCode: "310114",
+            countyName: "嘉定区",
+          },
+          {
+            countyCode: "310109",
+            countyName: "虹口区",
+          },
+          {
+            countyCode: "310101",
+            countyName: "黄浦区",
+          },
+          {
+            countyCode: "310120",
+            countyName: "奉贤区",
+          },
+          {
+            countyCode: "310118",
+            countyName: "青浦区",
+          },
+          {
+            countyCode: "310112",
+            countyName: "闵行区",
+          },
+          {
+            countyCode: "310105",
+            countyName: "长宁区",
+          },
+          {
+            countyCode: "310104",
+            countyName: "徐汇区",
+          },
+          {
+            countyCode: "310117",
+            countyName: "松江区",
+          },
+          {
+            countyCode: "310106",
+            countyName: "静安区",
+          },
+          {
+            countyCode: "310107",
+            countyName: "普陀区",
+          },
+          {
+            countyCode: "310116",
+            countyName: "金山区",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "340000",
+    provinceName: "安徽省",
+    city: [
+      {
+        cityCode: "341000",
+        cityName: "黄山市",
+        county: [
+          {
+            countyCode: "341022",
+            countyName: "休宁县",
+          },
+          {
+            countyCode: "341024",
+            countyName: "祁门县",
+          },
+          {
+            countyCode: "341021",
+            countyName: "歙县",
+          },
+          {
+            countyCode: "341003",
+            countyName: "黄山区",
+          },
+          {
+            countyCode: "341023",
+            countyName: "黟县",
+          },
+          {
+            countyCode: "341004",
+            countyName: "徽州区",
+          },
+          {
+            countyCode: "341002",
+            countyName: "屯溪区",
+          },
+        ],
+      },
+      {
+        cityCode: "340200",
+        cityName: "芜湖市",
+        county: [
+          {
+            countyCode: "340208",
+            countyName: "三山区",
+          },
+          {
+            countyCode: "340222",
+            countyName: "繁昌县",
+          },
+          {
+            countyCode: "340207",
+            countyName: "鸠江区",
+          },
+          {
+            countyCode: "340221",
+            countyName: "芜湖县",
+          },
+          {
+            countyCode: "340202",
+            countyName: "镜湖区",
+          },
+          {
+            countyCode: "340203",
+            countyName: "弋江区",
+          },
+          {
+            countyCode: "340225",
+            countyName: "无为县",
+          },
+          {
+            countyCode: "340223",
+            countyName: "南陵县",
+          },
+        ],
+      },
+      {
+        cityCode: "340800",
+        cityName: "安庆市",
+        county: [
+          {
+            countyCode: "340826",
+            countyName: "宿松县",
+          },
+          {
+            countyCode: "340824",
+            countyName: "潜山市",
+          },
+          {
+            countyCode: "340881",
+            countyName: "桐城市",
+          },
+          {
+            countyCode: "340828",
+            countyName: "岳西县",
+          },
+          {
+            countyCode: "340825",
+            countyName: "太湖县",
+          },
+          {
+            countyCode: "340811",
+            countyName: "宜秀区",
+          },
+          {
+            countyCode: "340803",
+            countyName: "大观区",
+          },
+          {
+            countyCode: "340827",
+            countyName: "望江县",
+          },
+          {
+            countyCode: "340802",
+            countyName: "迎江区",
+          },
+          {
+            countyCode: "340822",
+            countyName: "怀宁县",
+          },
+        ],
+      },
+      {
+        cityCode: "341100",
+        cityName: "滁州市",
+        county: [
+          {
+            countyCode: "341103",
+            countyName: "南谯区",
+          },
+          {
+            countyCode: "341102",
+            countyName: "琅琊区",
+          },
+          {
+            countyCode: "341181",
+            countyName: "天长市",
+          },
+          {
+            countyCode: "341125",
+            countyName: "定远县",
+          },
+          {
+            countyCode: "341124",
+            countyName: "全椒县",
+          },
+          {
+            countyCode: "341122",
+            countyName: "来安县",
+          },
+          {
+            countyCode: "341182",
+            countyName: "明光市",
+          },
+          {
+            countyCode: "341126",
+            countyName: "凤阳县",
+          },
+        ],
+      },
+      {
+        cityCode: "340600",
+        cityName: "淮北市",
+        county: [
+          {
+            countyCode: "340621",
+            countyName: "濉溪县",
+          },
+          {
+            countyCode: "340603",
+            countyName: "相山区",
+          },
+          {
+            countyCode: "340602",
+            countyName: "杜集区",
+          },
+          {
+            countyCode: "340604",
+            countyName: "烈山区",
+          },
+        ],
+      },
+      {
+        cityCode: "340700",
+        cityName: "铜陵市",
+        county: [
+          {
+            countyCode: "340711",
+            countyName: "郊区",
+          },
+          {
+            countyCode: "340702",
+            countyName: "铜官山区",
+          },
+          {
+            countyCode: "340823",
+            countyName: "枞阳县",
+          },
+          {
+            countyCode: "340703",
+            countyName: "铜官区",
+          },
+          {
+            countyCode: "340721",
+            countyName: "义安区",
+          },
+        ],
+      },
+      {
+        cityCode: "340300",
+        cityName: "蚌埠市",
+        county: [
+          {
+            countyCode: "340303",
+            countyName: "蚌山区",
+          },
+          {
+            countyCode: "340323",
+            countyName: "固镇县",
+          },
+          {
+            countyCode: "340322",
+            countyName: "五河县",
+          },
+          {
+            countyCode: "340304",
+            countyName: "禹会区",
+          },
+          {
+            countyCode: "340311",
+            countyName: "淮上区",
+          },
+          {
+            countyCode: "340302",
+            countyName: "龙子湖区",
+          },
+          {
+            countyCode: "340321",
+            countyName: "怀远县",
+          },
+        ],
+      },
+      {
+        cityCode: "340400",
+        cityName: "淮南市",
+        county: [
+          {
+            countyCode: "340421",
+            countyName: "凤台县",
+          },
+          {
+            countyCode: "341521",
+            countyName: "寿县",
+          },
+          {
+            countyCode: "340403",
+            countyName: "田家庵区",
+          },
+          {
+            countyCode: "340404",
+            countyName: "谢家集区",
+          },
+          {
+            countyCode: "340406",
+            countyName: "潘集区",
+          },
+          {
+            countyCode: "340405",
+            countyName: "八公山区",
+          },
+          {
+            countyCode: "340402",
+            countyName: "大通区",
+          },
+        ],
+      },
+      {
+        cityCode: "341300",
+        cityName: "宿州市",
+        county: [
+          {
+            countyCode: "341321",
+            countyName: "砀山县",
+          },
+          {
+            countyCode: "341322",
+            countyName: "萧县",
+          },
+          {
+            countyCode: "341324",
+            countyName: "泗县",
+          },
+          {
+            countyCode: "341323",
+            countyName: "灵璧县",
+          },
+          {
+            countyCode: "341302",
+            countyName: "埇桥区",
+          },
+        ],
+      },
+      {
+        cityCode: "341700",
+        cityName: "池州市",
+        county: [
+          {
+            countyCode: "341723",
+            countyName: "青阳县",
+          },
+          {
+            countyCode: "341722",
+            countyName: "石台县",
+          },
+          {
+            countyCode: "341721",
+            countyName: "东至县",
+          },
+          {
+            countyCode: "341702",
+            countyName: "贵池区",
+          },
+        ],
+      },
+      {
+        cityCode: "340500",
+        cityName: "马鞍山市",
+        county: [
+          {
+            countyCode: "340522",
+            countyName: "含山县",
+          },
+          {
+            countyCode: "340503",
+            countyName: "花山区",
+          },
+          {
+            countyCode: "340506",
+            countyName: "博望区",
+          },
+          {
+            countyCode: "340523",
+            countyName: "和县",
+          },
+          {
+            countyCode: "340521",
+            countyName: "当涂县",
+          },
+          {
+            countyCode: "340504",
+            countyName: "雨山区",
+          },
+        ],
+      },
+      {
+        cityCode: "341200",
+        cityName: "阜阳市",
+        county: [
+          {
+            countyCode: "341222",
+            countyName: "太和县",
+          },
+          {
+            countyCode: "341226",
+            countyName: "颍上县",
+          },
+          {
+            countyCode: "341221",
+            countyName: "临泉县",
+          },
+          {
+            countyCode: "341204",
+            countyName: "颍泉区",
+          },
+          {
+            countyCode: "341225",
+            countyName: "阜南县",
+          },
+          {
+            countyCode: "341282",
+            countyName: "界首市",
+          },
+          {
+            countyCode: "341203",
+            countyName: "颍东区",
+          },
+          {
+            countyCode: "341202",
+            countyName: "颍州区",
+          },
+        ],
+      },
+      {
+        cityCode: "341600",
+        cityName: "亳州市",
+        county: [
+          {
+            countyCode: "341621",
+            countyName: "涡阳县",
+          },
+          {
+            countyCode: "341623",
+            countyName: "利辛县",
+          },
+          {
+            countyCode: "341602",
+            countyName: "谯城区",
+          },
+          {
+            countyCode: "341622",
+            countyName: "蒙城县",
+          },
+        ],
+      },
+      {
+        cityCode: "341800",
+        cityName: "宣城市",
+        county: [
+          {
+            countyCode: "341881",
+            countyName: "宁国市",
+          },
+          {
+            countyCode: "341822",
+            countyName: "广德县",
+          },
+          {
+            countyCode: "341821",
+            countyName: "郎溪县",
+          },
+          {
+            countyCode: "341823",
+            countyName: "泾县",
+          },
+          {
+            countyCode: "341825",
+            countyName: "旌德县",
+          },
+          {
+            countyCode: "341802",
+            countyName: "宣州区",
+          },
+          {
+            countyCode: "341824",
+            countyName: "绩溪县",
+          },
+        ],
+      },
+      {
+        cityCode: "340100",
+        cityName: "合肥市",
+        county: [
+          {
+            countyCode: "340181",
+            countyName: "巢湖市",
+          },
+          {
+            countyCode: "340104",
+            countyName: "蜀山区",
+          },
+          {
+            countyCode: "340122",
+            countyName: "肥东县",
+          },
+          {
+            countyCode: "340111",
+            countyName: "包河区",
+          },
+          {
+            countyCode: "340102",
+            countyName: "瑶海区",
+          },
+          {
+            countyCode: "340123",
+            countyName: "肥西县",
+          },
+          {
+            countyCode: "340124",
+            countyName: "庐江县",
+          },
+          {
+            countyCode: "340121",
+            countyName: "长丰县",
+          },
+          {
+            countyCode: "340103",
+            countyName: "庐阳区",
+          },
+        ],
+      },
+      {
+        cityCode: "341500",
+        cityName: "六安市",
+        county: [
+          {
+            countyCode: "341525",
+            countyName: "霍山县",
+          },
+          {
+            countyCode: "341502",
+            countyName: "金安区",
+          },
+          {
+            countyCode: "341503",
+            countyName: "裕安区",
+          },
+          {
+            countyCode: "341522",
+            countyName: "霍邱县",
+          },
+          {
+            countyCode: "341504",
+            countyName: "叶集区",
+          },
+          {
+            countyCode: "341523",
+            countyName: "舒城县",
+          },
+          {
+            countyCode: "341524",
+            countyName: "金寨县",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "350000",
+    provinceName: "福建省",
+    city: [
+      {
+        cityCode: "350200",
+        cityName: "厦门市",
+        county: [
+          {
+            countyCode: "350206",
+            countyName: "湖里区",
+          },
+          {
+            countyCode: "350212",
+            countyName: "同安区",
+          },
+          {
+            countyCode: "350203",
+            countyName: "思明区",
+          },
+          {
+            countyCode: "350213",
+            countyName: "翔安区",
+          },
+          {
+            countyCode: "350205",
+            countyName: "海沧区",
+          },
+          {
+            countyCode: "350211",
+            countyName: "集美区",
+          },
+        ],
+      },
+      {
+        cityCode: "350800",
+        cityName: "龙岩市",
+        county: [
+          {
+            countyCode: "350881",
+            countyName: "漳平市",
+          },
+          {
+            countyCode: "350825",
+            countyName: "连城县",
+          },
+          {
+            countyCode: "350821",
+            countyName: "长汀县",
+          },
+          {
+            countyCode: "350802",
+            countyName: "新罗区",
+          },
+          {
+            countyCode: "350823",
+            countyName: "上杭县",
+          },
+          {
+            countyCode: "350822",
+            countyName: "永定区",
+          },
+          {
+            countyCode: "350824",
+            countyName: "武平县",
+          },
+        ],
+      },
+      {
+        cityCode: "350100",
+        cityName: "福州市",
+        county: [
+          {
+            countyCode: "350124",
+            countyName: "闽清县",
+          },
+          {
+            countyCode: "350103",
+            countyName: "台江区",
+          },
+          {
+            countyCode: "350121",
+            countyName: "闽侯县",
+          },
+          {
+            countyCode: "350182",
+            countyName: "长乐区",
+          },
+          {
+            countyCode: "350125",
+            countyName: "永泰县",
+          },
+          {
+            countyCode: "350111",
+            countyName: "晋安区",
+          },
+          {
+            countyCode: "350123",
+            countyName: "罗源县",
+          },
+          {
+            countyCode: "350102",
+            countyName: "鼓楼区",
+          },
+          {
+            countyCode: "350105",
+            countyName: "马尾区",
+          },
+          {
+            countyCode: "350104",
+            countyName: "仓山区",
+          },
+          {
+            countyCode: "350128",
+            countyName: "平潭县",
+          },
+          {
+            countyCode: "350181",
+            countyName: "福清市",
+          },
+          {
+            countyCode: "350122",
+            countyName: "连江县",
+          },
+        ],
+      },
+      {
+        cityCode: "350700",
+        cityName: "南平市",
+        county: [
+          {
+            countyCode: "350724",
+            countyName: "松溪县",
+          },
+          {
+            countyCode: "350783",
+            countyName: "建瓯市",
+          },
+          {
+            countyCode: "350725",
+            countyName: "政和县",
+          },
+          {
+            countyCode: "350723",
+            countyName: "光泽县",
+          },
+          {
+            countyCode: "350721",
+            countyName: "顺昌县",
+          },
+          {
+            countyCode: "350781",
+            countyName: "邵武市",
+          },
+          {
+            countyCode: "350782",
+            countyName: "武夷山市",
+          },
+          {
+            countyCode: "350722",
+            countyName: "浦城县",
+          },
+          {
+            countyCode: "350784",
+            countyName: "建阳区",
+          },
+          {
+            countyCode: "350702",
+            countyName: "延平区",
+          },
+        ],
+      },
+      {
+        cityCode: "350900",
+        cityName: "宁德市",
+        county: [
+          {
+            countyCode: "350922",
+            countyName: "古田县",
+          },
+          {
+            countyCode: "350924",
+            countyName: "寿宁县",
+          },
+          {
+            countyCode: "350902",
+            countyName: "蕉城区",
+          },
+          {
+            countyCode: "350926",
+            countyName: "柘荣县",
+          },
+          {
+            countyCode: "350925",
+            countyName: "周宁县",
+          },
+          {
+            countyCode: "350982",
+            countyName: "福鼎市",
+          },
+          {
+            countyCode: "350923",
+            countyName: "屏南县",
+          },
+          {
+            countyCode: "350981",
+            countyName: "福安市",
+          },
+          {
+            countyCode: "350921",
+            countyName: "霞浦县",
+          },
+        ],
+      },
+      {
+        cityCode: "350500",
+        cityName: "泉州市",
+        county: [
+          {
+            countyCode: "350526",
+            countyName: "德化县",
+          },
+          {
+            countyCode: "350582",
+            countyName: "晋江市",
+          },
+          {
+            countyCode: "350583",
+            countyName: "南安市",
+          },
+          {
+            countyCode: "350503",
+            countyName: "丰泽区",
+          },
+          {
+            countyCode: "350581",
+            countyName: "石狮市",
+          },
+          {
+            countyCode: "350525",
+            countyName: "永春县",
+          },
+          {
+            countyCode: "350521",
+            countyName: "惠安县",
+          },
+          {
+            countyCode: "350524",
+            countyName: "安溪县",
+          },
+          {
+            countyCode: "350502",
+            countyName: "鲤城区",
+          },
+          {
+            countyCode: "350505",
+            countyName: "泉港区",
+          },
+          {
+            countyCode: "350527",
+            countyName: "金门县",
+          },
+          {
+            countyCode: "350504",
+            countyName: "洛江区",
+          },
+        ],
+      },
+      {
+        cityCode: "350400",
+        cityName: "三明市",
+        county: [
+          {
+            countyCode: "350421",
+            countyName: "明溪县",
+          },
+          {
+            countyCode: "350403",
+            countyName: "三元区",
+          },
+          {
+            countyCode: "350423",
+            countyName: "清流县",
+          },
+          {
+            countyCode: "350426",
+            countyName: "尤溪县",
+          },
+          {
+            countyCode: "350481",
+            countyName: "永安市",
+          },
+          {
+            countyCode: "350424",
+            countyName: "宁化县",
+          },
+          {
+            countyCode: "350425",
+            countyName: "大田县",
+          },
+          {
+            countyCode: "350427",
+            countyName: "沙县",
+          },
+          {
+            countyCode: "350430",
+            countyName: "建宁县",
+          },
+          {
+            countyCode: "350428",
+            countyName: "将乐县",
+          },
+          {
+            countyCode: "350402",
+            countyName: "梅列区",
+          },
+          {
+            countyCode: "350429",
+            countyName: "泰宁县",
+          },
+        ],
+      },
+      {
+        cityCode: "350300",
+        cityName: "莆田市",
+        county: [
+          {
+            countyCode: "350322",
+            countyName: "仙游县",
+          },
+          {
+            countyCode: "350303",
+            countyName: "涵江区",
+          },
+          {
+            countyCode: "350304",
+            countyName: "荔城区",
+          },
+          {
+            countyCode: "350302",
+            countyName: "城厢区",
+          },
+          {
+            countyCode: "350305",
+            countyName: "秀屿区",
+          },
+        ],
+      },
+      {
+        cityCode: "350600",
+        cityName: "漳州市",
+        county: [
+          {
+            countyCode: "350629",
+            countyName: "华安县",
+          },
+          {
+            countyCode: "350623",
+            countyName: "漳浦县",
+          },
+          {
+            countyCode: "350602",
+            countyName: "芗城区",
+          },
+          {
+            countyCode: "350625",
+            countyName: "长泰县",
+          },
+          {
+            countyCode: "350603",
+            countyName: "龙文区",
+          },
+          {
+            countyCode: "350622",
+            countyName: "云霄县",
+          },
+          {
+            countyCode: "350628",
+            countyName: "平和县",
+          },
+          {
+            countyCode: "350627",
+            countyName: "南靖县",
+          },
+          {
+            countyCode: "350681",
+            countyName: "龙海市",
+          },
+          {
+            countyCode: "350624",
+            countyName: "诏安县",
+          },
+          {
+            countyCode: "350626",
+            countyName: "东山县",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "360000",
+    provinceName: "江西省",
+    city: [
+      {
+        cityCode: "361000",
+        cityName: "抚州市",
+        county: [
+          {
+            countyCode: "361002",
+            countyName: "临川区",
+          },
+          {
+            countyCode: "361023",
+            countyName: "南丰县",
+          },
+          {
+            countyCode: "361026",
+            countyName: "宜黄县",
+          },
+          {
+            countyCode: "361028",
+            countyName: "资溪县",
+          },
+          {
+            countyCode: "361029",
+            countyName: "东乡区",
+          },
+          {
+            countyCode: "361027",
+            countyName: "金溪县",
+          },
+          {
+            countyCode: "361022",
+            countyName: "黎川县",
+          },
+          {
+            countyCode: "361021",
+            countyName: "南城县",
+          },
+          {
+            countyCode: "361025",
+            countyName: "乐安县",
+          },
+          {
+            countyCode: "361024",
+            countyName: "崇仁县",
+          },
+          {
+            countyCode: "361030",
+            countyName: "广昌县",
+          },
+        ],
+      },
+      {
+        cityCode: "360900",
+        cityName: "宜春市",
+        county: [
+          {
+            countyCode: "360981",
+            countyName: "丰城市",
+          },
+          {
+            countyCode: "360902",
+            countyName: "袁州区",
+          },
+          {
+            countyCode: "360921",
+            countyName: "奉新县",
+          },
+          {
+            countyCode: "360983",
+            countyName: "高安市",
+          },
+          {
+            countyCode: "360922",
+            countyName: "万载县",
+          },
+          {
+            countyCode: "360926",
+            countyName: "铜鼓县",
+          },
+          {
+            countyCode: "360923",
+            countyName: "上高县",
+          },
+          {
+            countyCode: "360924",
+            countyName: "宜丰县",
+          },
+          {
+            countyCode: "360925",
+            countyName: "靖安县",
+          },
+          {
+            countyCode: "360982",
+            countyName: "樟树市",
+          },
+        ],
+      },
+      {
+        cityCode: "360100",
+        cityName: "南昌市",
+        county: [
+          {
+            countyCode: "360104",
+            countyName: "青云谱区",
+          },
+          {
+            countyCode: "360105",
+            countyName: "湾里区",
+          },
+          {
+            countyCode: "360124",
+            countyName: "进贤县",
+          },
+          {
+            countyCode: "360102",
+            countyName: "东湖区",
+          },
+          {
+            countyCode: "360123",
+            countyName: "安义县",
+          },
+          {
+            countyCode: "360122",
+            countyName: "新建区",
+          },
+          {
+            countyCode: "360121",
+            countyName: "南昌县",
+          },
+          {
+            countyCode: "360111",
+            countyName: "青山湖区",
+          },
+          {
+            countyCode: "360103",
+            countyName: "西湖区",
+          },
+        ],
+      },
+      {
+        cityCode: "360700",
+        cityName: "赣州市",
+        county: [
+          {
+            countyCode: "360725",
+            countyName: "崇义县",
+          },
+          {
+            countyCode: "360727",
+            countyName: "龙南县",
+          },
+          {
+            countyCode: "360728",
+            countyName: "定南县",
+          },
+          {
+            countyCode: "360723",
+            countyName: "大余县",
+          },
+          {
+            countyCode: "360734",
+            countyName: "寻乌县",
+          },
+          {
+            countyCode: "360702",
+            countyName: "章贡区",
+          },
+          {
+            countyCode: "360726",
+            countyName: "安远县",
+          },
+          {
+            countyCode: "360729",
+            countyName: "全南县",
+          },
+          {
+            countyCode: "360735",
+            countyName: "石城县",
+          },
+          {
+            countyCode: "360782",
+            countyName: "南康区",
+          },
+          {
+            countyCode: "360721",
+            countyName: "赣县区",
+          },
+          {
+            countyCode: "360732",
+            countyName: "兴国县",
+          },
+          {
+            countyCode: "360781",
+            countyName: "瑞金市",
+          },
+          {
+            countyCode: "360724",
+            countyName: "上犹县",
+          },
+          {
+            countyCode: "360730",
+            countyName: "宁都县",
+          },
+          {
+            countyCode: "360733",
+            countyName: "会昌县",
+          },
+          {
+            countyCode: "360722",
+            countyName: "信丰县",
+          },
+          {
+            countyCode: "360731",
+            countyName: "于都县",
+          },
+        ],
+      },
+      {
+        cityCode: "360200",
+        cityName: "景德镇市",
+        county: [
+          {
+            countyCode: "360222",
+            countyName: "浮梁县",
+          },
+          {
+            countyCode: "360281",
+            countyName: "乐平市",
+          },
+          {
+            countyCode: "360202",
+            countyName: "昌江区",
+          },
+          {
+            countyCode: "360203",
+            countyName: "珠山区",
+          },
+        ],
+      },
+      {
+        cityCode: "360800",
+        cityName: "吉安市",
+        county: [
+          {
+            countyCode: "360829",
+            countyName: "安福县",
+          },
+          {
+            countyCode: "360821",
+            countyName: "吉安县",
+          },
+          {
+            countyCode: "360827",
+            countyName: "遂川县",
+          },
+          {
+            countyCode: "360803",
+            countyName: "青原区",
+          },
+          {
+            countyCode: "360828",
+            countyName: "万安县",
+          },
+          {
+            countyCode: "360826",
+            countyName: "泰和县",
+          },
+          {
+            countyCode: "360823",
+            countyName: "峡江县",
+          },
+          {
+            countyCode: "360822",
+            countyName: "吉水县",
+          },
+          {
+            countyCode: "360802",
+            countyName: "吉州区",
+          },
+          {
+            countyCode: "360824",
+            countyName: "新干县",
+          },
+          {
+            countyCode: "360830",
+            countyName: "永新县",
+          },
+          {
+            countyCode: "360881",
+            countyName: "井冈山市",
+          },
+          {
+            countyCode: "360825",
+            countyName: "永丰县",
+          },
+        ],
+      },
+      {
+        cityCode: "360400",
+        cityName: "九江市",
+        county: [
+          {
+            countyCode: "360423",
+            countyName: "武宁县",
+          },
+          {
+            countyCode: "360421",
+            countyName: "柴桑区",
+          },
+          {
+            countyCode: "360429",
+            countyName: "湖口县",
+          },
+          {
+            countyCode: "360427",
+            countyName: "庐山市",
+          },
+          {
+            countyCode: "360426",
+            countyName: "德安县",
+          },
+          {
+            countyCode: "360428",
+            countyName: "都昌县",
+          },
+          {
+            countyCode: "360430",
+            countyName: "彭泽县",
+          },
+          {
+            countyCode: "360403",
+            countyName: "浔阳区",
+          },
+          {
+            countyCode: "360402",
+            countyName: "濂溪区",
+          },
+          {
+            countyCode: "360424",
+            countyName: "修水县",
+          },
+          {
+            countyCode: "360481",
+            countyName: "瑞昌市",
+          },
+          {
+            countyCode: "360425",
+            countyName: "永修县",
+          },
+          {
+            countyCode: "360482",
+            countyName: "共青城市",
+          },
+        ],
+      },
+      {
+        cityCode: "360600",
+        cityName: "鹰潭市",
+        county: [
+          {
+            countyCode: "360602",
+            countyName: "月湖区",
+          },
+          {
+            countyCode: "360622",
+            countyName: "余江区",
+          },
+          {
+            countyCode: "360681",
+            countyName: "贵溪市",
+          },
+        ],
+      },
+      {
+        cityCode: "360500",
+        cityName: "新余市",
+        county: [
+          {
+            countyCode: "360521",
+            countyName: "分宜县",
+          },
+          {
+            countyCode: "360502",
+            countyName: "渝水区",
+          },
+        ],
+      },
+      {
+        cityCode: "361100",
+        cityName: "上饶市",
+        county: [
+          {
+            countyCode: "361181",
+            countyName: "德兴市",
+          },
+          {
+            countyCode: "361102",
+            countyName: "信州区",
+          },
+          {
+            countyCode: "361130",
+            countyName: "婺源县",
+          },
+          {
+            countyCode: "361128",
+            countyName: "鄱阳县",
+          },
+          {
+            countyCode: "361129",
+            countyName: "万年县",
+          },
+          {
+            countyCode: "361123",
+            countyName: "玉山县",
+          },
+          {
+            countyCode: "361122",
+            countyName: "广丰区",
+          },
+          {
+            countyCode: "361124",
+            countyName: "铅山县",
+          },
+          {
+            countyCode: "361121",
+            countyName: "上饶县",
+          },
+          {
+            countyCode: "361127",
+            countyName: "余干县",
+          },
+          {
+            countyCode: "361126",
+            countyName: "弋阳县",
+          },
+          {
+            countyCode: "361125",
+            countyName: "横峰县",
+          },
+        ],
+      },
+      {
+        cityCode: "360300",
+        cityName: "萍乡市",
+        county: [
+          {
+            countyCode: "360322",
+            countyName: "上栗县",
+          },
+          {
+            countyCode: "360313",
+            countyName: "湘东区",
+          },
+          {
+            countyCode: "360302",
+            countyName: "安源区",
+          },
+          {
+            countyCode: "360323",
+            countyName: "芦溪县",
+          },
+          {
+            countyCode: "360321",
+            countyName: "莲花县",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "370000",
+    provinceName: "山东省",
+    city: [
+      {
+        cityCode: "370400",
+        cityName: "枣庄市",
+        county: [
+          {
+            countyCode: "370402",
+            countyName: "市中区",
+          },
+          {
+            countyCode: "370481",
+            countyName: "滕州市",
+          },
+          {
+            countyCode: "370406",
+            countyName: "山亭区",
+          },
+          {
+            countyCode: "370405",
+            countyName: "台儿庄区",
+          },
+          {
+            countyCode: "370403",
+            countyName: "薛城区",
+          },
+          {
+            countyCode: "370404",
+            countyName: "峄城区",
+          },
+        ],
+      },
+      {
+        cityCode: "371100",
+        cityName: "日照市",
+        county: [
+          {
+            countyCode: "371121",
+            countyName: "五莲县",
+          },
+          {
+            countyCode: "371102",
+            countyName: "东港区",
+          },
+          {
+            countyCode: "371122",
+            countyName: "莒县",
+          },
+          {
+            countyCode: "371103",
+            countyName: "岚山区",
+          },
+        ],
+      },
+      {
+        cityCode: "371700",
+        cityName: "菏泽市",
+        county: [
+          {
+            countyCode: "371722",
+            countyName: "单县",
+          },
+          {
+            countyCode: "371724",
+            countyName: "巨野县",
+          },
+          {
+            countyCode: "371721",
+            countyName: "曹县",
+          },
+          {
+            countyCode: "371702",
+            countyName: "牡丹区",
+          },
+          {
+            countyCode: "371727",
+            countyName: "定陶区",
+          },
+          {
+            countyCode: "371728",
+            countyName: "东明县",
+          },
+          {
+            countyCode: "371723",
+            countyName: "成武县",
+          },
+          {
+            countyCode: "371725",
+            countyName: "郓城县",
+          },
+          {
+            countyCode: "371726",
+            countyName: "鄄城县",
+          },
+        ],
+      },
+      {
+        cityCode: "371500",
+        cityName: "聊城市",
+        county: [
+          {
+            countyCode: "371524",
+            countyName: "东阿县",
+          },
+          {
+            countyCode: "371521",
+            countyName: "阳谷县",
+          },
+          {
+            countyCode: "371526",
+            countyName: "高唐县",
+          },
+          {
+            countyCode: "371502",
+            countyName: "东昌府区",
+          },
+          {
+            countyCode: "371581",
+            countyName: "临清市",
+          },
+          {
+            countyCode: "371522",
+            countyName: "莘县",
+          },
+          {
+            countyCode: "371525",
+            countyName: "冠县",
+          },
+          {
+            countyCode: "371523",
+            countyName: "茌平县",
+          },
+        ],
+      },
+      {
+        cityCode: "371000",
+        cityName: "威海市",
+        county: [
+          {
+            countyCode: "371002",
+            countyName: "环翠区",
+          },
+          {
+            countyCode: "371083",
+            countyName: "乳山市",
+          },
+          {
+            countyCode: "371082",
+            countyName: "荣成市",
+          },
+          {
+            countyCode: "371081",
+            countyName: "文登区",
+          },
+        ],
+      },
+      {
+        cityCode: "370300",
+        cityName: "淄博市",
+        county: [
+          {
+            countyCode: "370322",
+            countyName: "高青县",
+          },
+          {
+            countyCode: "370321",
+            countyName: "桓台县",
+          },
+          {
+            countyCode: "370305",
+            countyName: "临淄区",
+          },
+          {
+            countyCode: "370306",
+            countyName: "周村区",
+          },
+          {
+            countyCode: "370323",
+            countyName: "沂源县",
+          },
+          {
+            countyCode: "370304",
+            countyName: "博山区",
+          },
+          {
+            countyCode: "370302",
+            countyName: "淄川区",
+          },
+          {
+            countyCode: "370303",
+            countyName: "张店区",
+          },
+        ],
+      },
+      {
+        cityCode: "370800",
+        cityName: "济宁市",
+        county: [
+          {
+            countyCode: "370811",
+            countyName: "任城区",
+          },
+          {
+            countyCode: "370802",
+            countyName: "市中区",
+          },
+          {
+            countyCode: "370882",
+            countyName: "兖州区",
+          },
+          {
+            countyCode: "370830",
+            countyName: "汶上县",
+          },
+          {
+            countyCode: "370883",
+            countyName: "邹城市",
+          },
+          {
+            countyCode: "370828",
+            countyName: "金乡县",
+          },
+          {
+            countyCode: "370829",
+            countyName: "嘉祥县",
+          },
+          {
+            countyCode: "370826",
+            countyName: "微山县",
+          },
+          {
+            countyCode: "370881",
+            countyName: "曲阜市",
+          },
+          {
+            countyCode: "370827",
+            countyName: "鱼台县",
+          },
+          {
+            countyCode: "370831",
+            countyName: "泗水县",
+          },
+          {
+            countyCode: "370832",
+            countyName: "梁山县",
+          },
+        ],
+      },
+      {
+        cityCode: "371200",
+        cityName: "莱芜市",
+        county: [
+          {
+            countyCode: "371202",
+            countyName: "莱城区",
+          },
+          {
+            countyCode: "371203",
+            countyName: "钢城区",
+          },
+        ],
+      },
+      {
+        cityCode: "370500",
+        cityName: "东营市",
+        county: [
+          {
+            countyCode: "370523",
+            countyName: "广饶县",
+          },
+          {
+            countyCode: "370521",
+            countyName: "垦利区",
+          },
+          {
+            countyCode: "370502",
+            countyName: "东营区",
+          },
+          {
+            countyCode: "370522",
+            countyName: "利津县",
+          },
+          {
+            countyCode: "370503",
+            countyName: "河口区",
+          },
+        ],
+      },
+      {
+        cityCode: "371600",
+        cityName: "滨州市",
+        county: [
+          {
+            countyCode: "371625",
+            countyName: "博兴县",
+          },
+          {
+            countyCode: "371622",
+            countyName: "阳信县",
+          },
+          {
+            countyCode: "371621",
+            countyName: "惠民县",
+          },
+          {
+            countyCode: "371626",
+            countyName: "邹平市",
+          },
+          {
+            countyCode: "371602",
+            countyName: "滨城区",
+          },
+          {
+            countyCode: "371623",
+            countyName: "无棣县",
+          },
+          {
+            countyCode: "371624",
+            countyName: "沾化区",
+          },
+        ],
+      },
+      {
+        cityCode: "371300",
+        cityName: "临沂市",
+        county: [
+          {
+            countyCode: "371328",
+            countyName: "蒙阴县",
+          },
+          {
+            countyCode: "371302",
+            countyName: "兰山区",
+          },
+          {
+            countyCode: "371329",
+            countyName: "临沭县",
+          },
+          {
+            countyCode: "371321",
+            countyName: "沂南县",
+          },
+          {
+            countyCode: "371311",
+            countyName: "罗庄区",
+          },
+          {
+            countyCode: "371325",
+            countyName: "费县",
+          },
+          {
+            countyCode: "371326",
+            countyName: "平邑县",
+          },
+          {
+            countyCode: "371327",
+            countyName: "莒南县",
+          },
+          {
+            countyCode: "371312",
+            countyName: "河东区",
+          },
+          {
+            countyCode: "371324",
+            countyName: "兰陵县",
+          },
+          {
+            countyCode: "371323",
+            countyName: "沂水县",
+          },
+          {
+            countyCode: "371322",
+            countyName: "郯城县",
+          },
+        ],
+      },
+      {
+        cityCode: "370200",
+        cityName: "青岛市",
+        county: [
+          {
+            countyCode: "370211",
+            countyName: "黄岛区",
+          },
+          {
+            countyCode: "370203",
+            countyName: "市北区",
+          },
+          {
+            countyCode: "370281",
+            countyName: "胶州市",
+          },
+          {
+            countyCode: "370212",
+            countyName: "崂山区",
+          },
+          {
+            countyCode: "370202",
+            countyName: "市南区",
+          },
+          {
+            countyCode: "370282",
+            countyName: "即墨区",
+          },
+          {
+            countyCode: "370205",
+            countyName: "四方区",
+          },
+          {
+            countyCode: "370214",
+            countyName: "城阳区",
+          },
+          {
+            countyCode: "370283",
+            countyName: "平度市",
+          },
+          {
+            countyCode: "370213",
+            countyName: "李沧区",
+          },
+          {
+            countyCode: "370285",
+            countyName: "莱西市",
+          },
+        ],
+      },
+      {
+        cityCode: "370100",
+        cityName: "济南市",
+        county: [
+          {
+            countyCode: "370124",
+            countyName: "平阴县",
+          },
+          {
+            countyCode: "370103",
+            countyName: "市中区",
+          },
+          {
+            countyCode: "370181",
+            countyName: "章丘区",
+          },
+          {
+            countyCode: "370126",
+            countyName: "商河县",
+          },
+          {
+            countyCode: "370125",
+            countyName: "济阳区",
+          },
+          {
+            countyCode: "370113",
+            countyName: "长清区",
+          },
+          {
+            countyCode: "370102",
+            countyName: "历下区",
+          },
+          {
+            countyCode: "370112",
+            countyName: "历城区",
+          },
+          {
+            countyCode: "370105",
+            countyName: "天桥区",
+          },
+          {
+            countyCode: "370104",
+            countyName: "槐荫区",
+          },
+        ],
+      },
+      {
+        cityCode: "371400",
+        cityName: "德州市",
+        county: [
+          {
+            countyCode: "371481",
+            countyName: "乐陵市",
+          },
+          {
+            countyCode: "371423",
+            countyName: "庆云县",
+          },
+          {
+            countyCode: "371421",
+            countyName: "陵城区",
+          },
+          {
+            countyCode: "371482",
+            countyName: "禹城市",
+          },
+          {
+            countyCode: "371424",
+            countyName: "临邑县",
+          },
+          {
+            countyCode: "371426",
+            countyName: "平原县",
+          },
+          {
+            countyCode: "371425",
+            countyName: "齐河县",
+          },
+          {
+            countyCode: "371427",
+            countyName: "夏津县",
+          },
+          {
+            countyCode: "371422",
+            countyName: "宁津县",
+          },
+          {
+            countyCode: "371428",
+            countyName: "武城县",
+          },
+          {
+            countyCode: "371402",
+            countyName: "德城区",
+          },
+        ],
+      },
+      {
+        cityCode: "370900",
+        cityName: "泰安市",
+        county: [
+          {
+            countyCode: "370911",
+            countyName: "岱岳区",
+          },
+          {
+            countyCode: "370923",
+            countyName: "东平县",
+          },
+          {
+            countyCode: "370983",
+            countyName: "肥城市",
+          },
+          {
+            countyCode: "370921",
+            countyName: "宁阳县",
+          },
+          {
+            countyCode: "370982",
+            countyName: "新泰市",
+          },
+          {
+            countyCode: "370902",
+            countyName: "泰山区",
+          },
+        ],
+      },
+      {
+        cityCode: "370600",
+        cityName: "烟台市",
+        county: [
+          {
+            countyCode: "370686",
+            countyName: "栖霞市",
+          },
+          {
+            countyCode: "370634",
+            countyName: "长岛县",
+          },
+          {
+            countyCode: "370613",
+            countyName: "莱山区",
+          },
+          {
+            countyCode: "370612",
+            countyName: "牟平区",
+          },
+          {
+            countyCode: "370681",
+            countyName: "龙口市",
+          },
+          {
+            countyCode: "370683",
+            countyName: "莱州市",
+          },
+          {
+            countyCode: "370602",
+            countyName: "芝罘区",
+          },
+          {
+            countyCode: "370682",
+            countyName: "莱阳市",
+          },
+          {
+            countyCode: "370685",
+            countyName: "招远市",
+          },
+          {
+            countyCode: "370611",
+            countyName: "福山区",
+          },
+          {
+            countyCode: "370684",
+            countyName: "蓬莱市",
+          },
+          {
+            countyCode: "370687",
+            countyName: "海阳市",
+          },
+        ],
+      },
+      {
+        cityCode: "370700",
+        cityName: "潍坊市",
+        county: [
+          {
+            countyCode: "370781",
+            countyName: "青州市",
+          },
+          {
+            countyCode: "370782",
+            countyName: "诸城市",
+          },
+          {
+            countyCode: "370703",
+            countyName: "寒亭区",
+          },
+          {
+            countyCode: "370785",
+            countyName: "高密市",
+          },
+          {
+            countyCode: "370702",
+            countyName: "潍城区",
+          },
+          {
+            countyCode: "370725",
+            countyName: "昌乐县",
+          },
+          {
+            countyCode: "370704",
+            countyName: "坊子区",
+          },
+          {
+            countyCode: "370784",
+            countyName: "安丘市",
+          },
+          {
+            countyCode: "370705",
+            countyName: "奎文区",
+          },
+          {
+            countyCode: "370724",
+            countyName: "临朐县",
+          },
+          {
+            countyCode: "370786",
+            countyName: "昌邑市",
+          },
+          {
+            countyCode: "370783",
+            countyName: "寿光市",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "410000",
+    provinceName: "河南省",
+    city: [
+      {
+        cityCode: "411500",
+        cityName: "信阳市",
+        county: [
+          {
+            countyCode: "411523",
+            countyName: "新县",
+          },
+          {
+            countyCode: "411525",
+            countyName: "固始县",
+          },
+          {
+            countyCode: "411524",
+            countyName: "商城县",
+          },
+          {
+            countyCode: "411528",
+            countyName: "息县",
+          },
+          {
+            countyCode: "411502",
+            countyName: "浉河区",
+          },
+          {
+            countyCode: "411521",
+            countyName: "罗山县",
+          },
+          {
+            countyCode: "411522",
+            countyName: "光山县",
+          },
+          {
+            countyCode: "411503",
+            countyName: "平桥区",
+          },
+          {
+            countyCode: "411526",
+            countyName: "潢川县",
+          },
+          {
+            countyCode: "411527",
+            countyName: "淮滨县",
+          },
+        ],
+      },
+      {
+        cityCode: "410300",
+        cityName: "洛阳市",
+        county: [
+          {
+            countyCode: "410323",
+            countyName: "新安县",
+          },
+          {
+            countyCode: "410306",
+            countyName: "吉利区",
+          },
+          {
+            countyCode: "410328",
+            countyName: "洛宁县",
+          },
+          {
+            countyCode: "410325",
+            countyName: "嵩县",
+          },
+          {
+            countyCode: "410302",
+            countyName: "老城区",
+          },
+          {
+            countyCode: "410322",
+            countyName: "孟津县",
+          },
+          {
+            countyCode: "410311",
+            countyName: "洛龙区",
+          },
+          {
+            countyCode: "410304",
+            countyName: "瀍河回族区",
+          },
+          {
+            countyCode: "410327",
+            countyName: "宜阳县",
+          },
+          {
+            countyCode: "410381",
+            countyName: "偃师市",
+          },
+          {
+            countyCode: "410326",
+            countyName: "汝阳县",
+          },
+          {
+            countyCode: "410329",
+            countyName: "伊川县",
+          },
+          {
+            countyCode: "410305",
+            countyName: "涧西区",
+          },
+          {
+            countyCode: "410324",
+            countyName: "栾川县",
+          },
+          {
+            countyCode: "410303",
+            countyName: "西工区",
+          },
+        ],
+      },
+      {
+        cityCode: "411200",
+        cityName: "三门峡市",
+        county: [
+          {
+            countyCode: "411222",
+            countyName: "陕州区",
+          },
+          {
+            countyCode: "411281",
+            countyName: "义马市",
+          },
+          {
+            countyCode: "411282",
+            countyName: "灵宝市",
+          },
+          {
+            countyCode: "411221",
+            countyName: "渑池县",
+          },
+          {
+            countyCode: "411202",
+            countyName: "湖滨区",
+          },
+          {
+            countyCode: "411224",
+            countyName: "卢氏县",
+          },
+        ],
+      },
+      {
+        cityCode: "411700",
+        cityName: "驻马店市",
+        county: [
+          {
+            countyCode: "411729",
+            countyName: "新蔡县",
+          },
+          {
+            countyCode: "411728",
+            countyName: "遂平县",
+          },
+          {
+            countyCode: "411727",
+            countyName: "汝南县",
+          },
+          {
+            countyCode: "411724",
+            countyName: "正阳县",
+          },
+          {
+            countyCode: "411723",
+            countyName: "平舆县",
+          },
+          {
+            countyCode: "411725",
+            countyName: "确山县",
+          },
+          {
+            countyCode: "411722",
+            countyName: "上蔡县",
+          },
+          {
+            countyCode: "411702",
+            countyName: "驿城区",
+          },
+          {
+            countyCode: "411721",
+            countyName: "西平县",
+          },
+          {
+            countyCode: "411726",
+            countyName: "泌阳县",
+          },
+        ],
+      },
+      {
+        cityCode: "410500",
+        cityName: "安阳市",
+        county: [
+          {
+            countyCode: "410505",
+            countyName: "殷都区",
+          },
+          {
+            countyCode: "410527",
+            countyName: "内黄县",
+          },
+          {
+            countyCode: "410522",
+            countyName: "安阳县",
+          },
+          {
+            countyCode: "410526",
+            countyName: "滑县",
+          },
+          {
+            countyCode: "410502",
+            countyName: "文峰区",
+          },
+          {
+            countyCode: "410503",
+            countyName: "北关区",
+          },
+          {
+            countyCode: "410506",
+            countyName: "龙安区",
+          },
+          {
+            countyCode: "410523",
+            countyName: "汤阴县",
+          },
+          {
+            countyCode: "410581",
+            countyName: "林州市",
+          },
+        ],
+      },
+      {
+        cityCode: "411300",
+        cityName: "南阳市",
+        county: [
+          {
+            countyCode: "411325",
+            countyName: "内乡县",
+          },
+          {
+            countyCode: "411328",
+            countyName: "唐河县",
+          },
+          {
+            countyCode: "411381",
+            countyName: "邓州市",
+          },
+          {
+            countyCode: "411322",
+            countyName: "方城县",
+          },
+          {
+            countyCode: "411330",
+            countyName: "桐柏县",
+          },
+          {
+            countyCode: "411321",
+            countyName: "南召县",
+          },
+          {
+            countyCode: "411323",
+            countyName: "西峡县",
+          },
+          {
+            countyCode: "411327",
+            countyName: "社旗县",
+          },
+          {
+            countyCode: "411302",
+            countyName: "宛城区",
+          },
+          {
+            countyCode: "411303",
+            countyName: "卧龙区",
+          },
+          {
+            countyCode: "411326",
+            countyName: "淅川县",
+          },
+          {
+            countyCode: "411329",
+            countyName: "新野县",
+          },
+          {
+            countyCode: "411324",
+            countyName: "镇平县",
+          },
+        ],
+      },
+      {
+        cityCode: "410700",
+        cityName: "新乡市",
+        county: [
+          {
+            countyCode: "410711",
+            countyName: "牧野区",
+          },
+          {
+            countyCode: "410721",
+            countyName: "新乡县",
+          },
+          {
+            countyCode: "410704",
+            countyName: "凤泉区",
+          },
+          {
+            countyCode: "410781",
+            countyName: "卫辉市",
+          },
+          {
+            countyCode: "410727",
+            countyName: "封丘县",
+          },
+          {
+            countyCode: "410702",
+            countyName: "红旗区",
+          },
+          {
+            countyCode: "410726",
+            countyName: "延津县",
+          },
+          {
+            countyCode: "410703",
+            countyName: "卫滨区",
+          },
+          {
+            countyCode: "410782",
+            countyName: "辉县市",
+          },
+          {
+            countyCode: "410728",
+            countyName: "长垣县",
+          },
+          {
+            countyCode: "410724",
+            countyName: "获嘉县",
+          },
+          {
+            countyCode: "410725",
+            countyName: "原阳县",
+          },
+        ],
+      },
+      {
+        cityCode: "410200",
+        cityName: "开封市",
+        county: [
+          {
+            countyCode: "410205",
+            countyName: "禹王台区",
+          },
+          {
+            countyCode: "410222",
+            countyName: "通许县",
+          },
+          {
+            countyCode: "410225",
+            countyName: "兰考县",
+          },
+          {
+            countyCode: "410223",
+            countyName: "尉氏县",
+          },
+          {
+            countyCode: "410203",
+            countyName: "顺河回族区",
+          },
+          {
+            countyCode: "410204",
+            countyName: "鼓楼区",
+          },
+          {
+            countyCode: "410224",
+            countyName: "祥符区",
+          },
+          {
+            countyCode: "410221",
+            countyName: "杞县",
+          },
+          {
+            countyCode: "410211",
+            countyName: "金明区",
+          },
+          {
+            countyCode: "410202",
+            countyName: "龙亭区",
+          },
+        ],
+      },
+      {
+        cityCode: "411400",
+        cityName: "商丘市",
+        county: [
+          {
+            countyCode: "411402",
+            countyName: "梁园区",
+          },
+          {
+            countyCode: "411422",
+            countyName: "睢县",
+          },
+          {
+            countyCode: "411423",
+            countyName: "宁陵县",
+          },
+          {
+            countyCode: "411421",
+            countyName: "民权县",
+          },
+          {
+            countyCode: "411424",
+            countyName: "柘城县",
+          },
+          {
+            countyCode: "411425",
+            countyName: "虞城县",
+          },
+          {
+            countyCode: "411426",
+            countyName: "夏邑县",
+          },
+          {
+            countyCode: "411481",
+            countyName: "永城市",
+          },
+          {
+            countyCode: "411403",
+            countyName: "睢阳区",
+          },
+        ],
+      },
+      {
+        cityCode: "411000",
+        cityName: "许昌市",
+        county: [
+          {
+            countyCode: "411024",
+            countyName: "鄢陵县",
+          },
+          {
+            countyCode: "411082",
+            countyName: "长葛市",
+          },
+          {
+            countyCode: "411002",
+            countyName: "魏都区",
+          },
+          {
+            countyCode: "411081",
+            countyName: "禹州市",
+          },
+          {
+            countyCode: "411025",
+            countyName: "襄城县",
+          },
+          {
+            countyCode: "411023",
+            countyName: "建安区",
+          },
+        ],
+      },
+      {
+        cityCode: "410100",
+        cityName: "郑州市",
+        county: [
+          {
+            countyCode: "410185",
+            countyName: "登封市",
+          },
+          {
+            countyCode: "410182",
+            countyName: "荥阳市",
+          },
+          {
+            countyCode: "410104",
+            countyName: "管城回族区",
+          },
+          {
+            countyCode: "410108",
+            countyName: "惠济区",
+          },
+          {
+            countyCode: "410122",
+            countyName: "中牟县",
+          },
+          {
+            countyCode: "410105",
+            countyName: "金水区",
+          },
+          {
+            countyCode: "410183",
+            countyName: "新密市",
+          },
+          {
+            countyCode: "410184",
+            countyName: "新郑市",
+          },
+          {
+            countyCode: "410181",
+            countyName: "巩义市",
+          },
+          {
+            countyCode: "410106",
+            countyName: "上街区",
+          },
+          {
+            countyCode: "410103",
+            countyName: "二七区",
+          },
+          {
+            countyCode: "410102",
+            countyName: "中原区",
+          },
+        ],
+      },
+      {
+        cityCode: "419001",
+        cityName: "济源市",
+        county: [
+          {
+            countyCode: "419001-1",
+            countyName: "济源市",
+          },
+        ],
+      },
+      {
+        cityCode: "410400",
+        cityName: "平顶山市",
+        county: [
+          {
+            countyCode: "410481",
+            countyName: "舞钢市",
+          },
+          {
+            countyCode: "410421",
+            countyName: "宝丰县",
+          },
+          {
+            countyCode: "410482",
+            countyName: "汝州市",
+          },
+          {
+            countyCode: "410404",
+            countyName: "石龙区",
+          },
+          {
+            countyCode: "410403",
+            countyName: "卫东区",
+          },
+          {
+            countyCode: "410411",
+            countyName: "湛河区",
+          },
+          {
+            countyCode: "410402",
+            countyName: "新华区",
+          },
+          {
+            countyCode: "410423",
+            countyName: "鲁山县",
+          },
+          {
+            countyCode: "410422",
+            countyName: "叶县",
+          },
+          {
+            countyCode: "410425",
+            countyName: "郏县",
+          },
+        ],
+      },
+      {
+        cityCode: "410900",
+        cityName: "濮阳市",
+        county: [
+          {
+            countyCode: "410902",
+            countyName: "华龙区",
+          },
+          {
+            countyCode: "410922",
+            countyName: "清丰县",
+          },
+          {
+            countyCode: "410926",
+            countyName: "范县",
+          },
+          {
+            countyCode: "410927",
+            countyName: "台前县",
+          },
+          {
+            countyCode: "410923",
+            countyName: "南乐县",
+          },
+          {
+            countyCode: "410928",
+            countyName: "濮阳县",
+          },
+        ],
+      },
+      {
+        cityCode: "410600",
+        cityName: "鹤壁市",
+        county: [
+          {
+            countyCode: "410603",
+            countyName: "山城区",
+          },
+          {
+            countyCode: "410611",
+            countyName: "淇滨区",
+          },
+          {
+            countyCode: "410602",
+            countyName: "鹤山区",
+          },
+          {
+            countyCode: "410621",
+            countyName: "浚县",
+          },
+          {
+            countyCode: "410622",
+            countyName: "淇县",
+          },
+        ],
+      },
+      {
+        cityCode: "411100",
+        cityName: "漯河市",
+        county: [
+          {
+            countyCode: "411102",
+            countyName: "源汇区",
+          },
+          {
+            countyCode: "411122",
+            countyName: "临颍县",
+          },
+          {
+            countyCode: "411103",
+            countyName: "郾城区",
+          },
+          {
+            countyCode: "411104",
+            countyName: "召陵区",
+          },
+          {
+            countyCode: "411121",
+            countyName: "舞阳县",
+          },
+        ],
+      },
+      {
+        cityCode: "411600",
+        cityName: "周口市",
+        county: [
+          {
+            countyCode: "411626",
+            countyName: "淮阳县",
+          },
+          {
+            countyCode: "411681",
+            countyName: "项城市",
+          },
+          {
+            countyCode: "411624",
+            countyName: "沈丘县",
+          },
+          {
+            countyCode: "411622",
+            countyName: "西华县",
+          },
+          {
+            countyCode: "411627",
+            countyName: "太康县",
+          },
+          {
+            countyCode: "411623",
+            countyName: "商水县",
+          },
+          {
+            countyCode: "411628",
+            countyName: "鹿邑县",
+          },
+          {
+            countyCode: "411602",
+            countyName: "川汇区",
+          },
+          {
+            countyCode: "411621",
+            countyName: "扶沟县",
+          },
+          {
+            countyCode: "411625",
+            countyName: "郸城县",
+          },
+        ],
+      },
+      {
+        cityCode: "410800",
+        cityName: "焦作市",
+        county: [
+          {
+            countyCode: "410883",
+            countyName: "孟州市",
+          },
+          {
+            countyCode: "410823",
+            countyName: "武陟县",
+          },
+          {
+            countyCode: "410882",
+            countyName: "沁阳市",
+          },
+          {
+            countyCode: "410822",
+            countyName: "博爱县",
+          },
+          {
+            countyCode: "410821",
+            countyName: "修武县",
+          },
+          {
+            countyCode: "410825",
+            countyName: "温县",
+          },
+          {
+            countyCode: "410804",
+            countyName: "马村区",
+          },
+          {
+            countyCode: "410802",
+            countyName: "解放区",
+          },
+          {
+            countyCode: "410811",
+            countyName: "山阳区",
+          },
+          {
+            countyCode: "410803",
+            countyName: "中站区",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "420000",
+    provinceName: "湖北省",
+    city: [
+      {
+        cityCode: "429004",
+        cityName: "仙桃市",
+        county: [
+          {
+            countyCode: "429004-1",
+            countyName: "仙桃市",
+          },
+        ],
+      },
+      {
+        cityCode: "421200",
+        cityName: "咸宁市",
+        county: [
+          {
+            countyCode: "421223",
+            countyName: "崇阳县",
+          },
+          {
+            countyCode: "421224",
+            countyName: "通山县",
+          },
+          {
+            countyCode: "421202",
+            countyName: "咸安区",
+          },
+          {
+            countyCode: "421222",
+            countyName: "通城县",
+          },
+          {
+            countyCode: "421221",
+            countyName: "嘉鱼县",
+          },
+          {
+            countyCode: "421281",
+            countyName: "赤壁市",
+          },
+        ],
+      },
+      {
+        cityCode: "421300",
+        cityName: "随州市",
+        county: [
+          {
+            countyCode: "421381",
+            countyName: "广水市",
+          },
+          {
+            countyCode: "421303",
+            countyName: "曾都区",
+          },
+          {
+            countyCode: "421321",
+            countyName: "随县",
+          },
+        ],
+      },
+      {
+        cityCode: "422800",
+        cityName: "恩施土家族苗族自治州",
+        county: [
+          {
+            countyCode: "422828",
+            countyName: "鹤峰县",
+          },
+          {
+            countyCode: "422825",
+            countyName: "宣恩县",
+          },
+          {
+            countyCode: "422801",
+            countyName: "恩施市",
+          },
+          {
+            countyCode: "422822",
+            countyName: "建始县",
+          },
+          {
+            countyCode: "422823",
+            countyName: "巴东县",
+          },
+          {
+            countyCode: "422826",
+            countyName: "咸丰县",
+          },
+          {
+            countyCode: "422827",
+            countyName: "来凤县",
+          },
+          {
+            countyCode: "422802",
+            countyName: "利川市",
+          },
+        ],
+      },
+      {
+        cityCode: "420900",
+        cityName: "孝感市",
+        county: [
+          {
+            countyCode: "420902",
+            countyName: "孝南区",
+          },
+          {
+            countyCode: "420981",
+            countyName: "应城市",
+          },
+          {
+            countyCode: "420923",
+            countyName: "云梦县",
+          },
+          {
+            countyCode: "420982",
+            countyName: "安陆市",
+          },
+          {
+            countyCode: "420922",
+            countyName: "大悟县",
+          },
+          {
+            countyCode: "420921",
+            countyName: "孝昌县",
+          },
+          {
+            countyCode: "420984",
+            countyName: "汉川市",
+          },
+        ],
+      },
+      {
+        cityCode: "420100",
+        cityName: "武汉市",
+        county: [
+          {
+            countyCode: "420104",
+            countyName: "硚口区",
+          },
+          {
+            countyCode: "420107",
+            countyName: "青山区",
+          },
+          {
+            countyCode: "420116",
+            countyName: "黄陂区",
+          },
+          {
+            countyCode: "420102",
+            countyName: "江岸区",
+          },
+          {
+            countyCode: "420115",
+            countyName: "江夏区",
+          },
+          {
+            countyCode: "420114",
+            countyName: "蔡甸区",
+          },
+          {
+            countyCode: "420106",
+            countyName: "武昌区",
+          },
+          {
+            countyCode: "420112",
+            countyName: "东西湖区",
+          },
+          {
+            countyCode: "420105",
+            countyName: "汉阳区",
+          },
+          {
+            countyCode: "420113",
+            countyName: "汉南区",
+          },
+          {
+            countyCode: "420111",
+            countyName: "洪山区",
+          },
+          {
+            countyCode: "420103",
+            countyName: "江汉区",
+          },
+          {
+            countyCode: "420117",
+            countyName: "新洲区",
+          },
+        ],
+      },
+      {
+        cityCode: "420500",
+        cityName: "宜昌市",
+        county: [
+          {
+            countyCode: "420502",
+            countyName: "西陵区",
+          },
+          {
+            countyCode: "420505",
+            countyName: "猇亭区",
+          },
+          {
+            countyCode: "420503",
+            countyName: "伍家岗区",
+          },
+          {
+            countyCode: "420581",
+            countyName: "宜都市",
+          },
+          {
+            countyCode: "420504",
+            countyName: "点军区",
+          },
+          {
+            countyCode: "420526",
+            countyName: "兴山县",
+          },
+          {
+            countyCode: "420525",
+            countyName: "远安县",
+          },
+          {
+            countyCode: "420527",
+            countyName: "秭归县",
+          },
+          {
+            countyCode: "420583",
+            countyName: "枝江市",
+          },
+          {
+            countyCode: "420529",
+            countyName: "五峰土家族自治县",
+          },
+          {
+            countyCode: "420582",
+            countyName: "当阳市",
+          },
+          {
+            countyCode: "420506",
+            countyName: "夷陵区",
+          },
+          {
+            countyCode: "420528",
+            countyName: "长阳土家族自治县",
+          },
+        ],
+      },
+      {
+        cityCode: "420800",
+        cityName: "荆门市",
+        county: [
+          {
+            countyCode: "420804",
+            countyName: "掇刀区",
+          },
+          {
+            countyCode: "420822",
+            countyName: "沙洋县",
+          },
+          {
+            countyCode: "420802",
+            countyName: "东宝区",
+          },
+          {
+            countyCode: "420881",
+            countyName: "钟祥市",
+          },
+          {
+            countyCode: "420821",
+            countyName: "京山市",
+          },
+        ],
+      },
+      {
+        cityCode: "429006",
+        cityName: "天门市",
+        county: [
+          {
+            countyCode: "429006-1",
+            countyName: "天门市",
+          },
+        ],
+      },
+      {
+        cityCode: "421000",
+        cityName: "荆州市",
+        county: [
+          {
+            countyCode: "421003",
+            countyName: "荆州区",
+          },
+          {
+            countyCode: "421023",
+            countyName: "监利县",
+          },
+          {
+            countyCode: "421087",
+            countyName: "松滋市",
+          },
+          {
+            countyCode: "421022",
+            countyName: "公安县",
+          },
+          {
+            countyCode: "421002",
+            countyName: "沙市区",
+          },
+          {
+            countyCode: "421024",
+            countyName: "江陵县",
+          },
+          {
+            countyCode: "421081",
+            countyName: "石首市",
+          },
+          {
+            countyCode: "421083",
+            countyName: "洪湖市",
+          },
+        ],
+      },
+      {
+        cityCode: "420600",
+        cityName: "襄阳市",
+        county: [
+          {
+            countyCode: "420625",
+            countyName: "谷城县",
+          },
+          {
+            countyCode: "420607",
+            countyName: "襄州区",
+          },
+          {
+            countyCode: "420606",
+            countyName: "樊城区",
+          },
+          {
+            countyCode: "420602",
+            countyName: "襄城区",
+          },
+          {
+            countyCode: "420626",
+            countyName: "保康县",
+          },
+          {
+            countyCode: "420624",
+            countyName: "南漳县",
+          },
+          {
+            countyCode: "420683",
+            countyName: "枣阳市",
+          },
+          {
+            countyCode: "420682",
+            countyName: "老河口市",
+          },
+          {
+            countyCode: "420684",
+            countyName: "宜城市",
+          },
+        ],
+      },
+      {
+        cityCode: "420700",
+        cityName: "鄂州市",
+        county: [
+          {
+            countyCode: "420702",
+            countyName: "梁子湖区",
+          },
+          {
+            countyCode: "420703",
+            countyName: "华容区",
+          },
+          {
+            countyCode: "420704",
+            countyName: "鄂城区",
+          },
+        ],
+      },
+      {
+        cityCode: "429021",
+        cityName: "神农架林区",
+        county: [
+          {
+            countyCode: "429021-1",
+            countyName: "神农架林区",
+          },
+        ],
+      },
+      {
+        cityCode: "420200",
+        cityName: "黄石市",
+        county: [
+          {
+            countyCode: "420202",
+            countyName: "黄石港区",
+          },
+          {
+            countyCode: "420281",
+            countyName: "大冶市",
+          },
+          {
+            countyCode: "420205",
+            countyName: "铁山区",
+          },
+          {
+            countyCode: "420222",
+            countyName: "阳新县",
+          },
+          {
+            countyCode: "420203",
+            countyName: "西塞山区",
+          },
+          {
+            countyCode: "420204",
+            countyName: "下陆区",
+          },
+        ],
+      },
+      {
+        cityCode: "421100",
+        cityName: "黄冈市",
+        county: [
+          {
+            countyCode: "421181",
+            countyName: "麻城市",
+          },
+          {
+            countyCode: "421125",
+            countyName: "浠水县",
+          },
+          {
+            countyCode: "421121",
+            countyName: "团风县",
+          },
+          {
+            countyCode: "421182",
+            countyName: "武穴市",
+          },
+          {
+            countyCode: "421124",
+            countyName: "英山县",
+          },
+          {
+            countyCode: "421122",
+            countyName: "红安县",
+          },
+          {
+            countyCode: "421102",
+            countyName: "黄州区",
+          },
+          {
+            countyCode: "421123",
+            countyName: "罗田县",
+          },
+          {
+            countyCode: "421126",
+            countyName: "蕲春县",
+          },
+          {
+            countyCode: "421127",
+            countyName: "黄梅县",
+          },
+        ],
+      },
+      {
+        cityCode: "420300",
+        cityName: "十堰市",
+        county: [
+          {
+            countyCode: "420322",
+            countyName: "郧西县",
+          },
+          {
+            countyCode: "420321",
+            countyName: "郧阳区",
+          },
+          {
+            countyCode: "420323",
+            countyName: "竹山县",
+          },
+          {
+            countyCode: "420324",
+            countyName: "竹溪县",
+          },
+          {
+            countyCode: "420325",
+            countyName: "房县",
+          },
+          {
+            countyCode: "420302",
+            countyName: "茅箭区",
+          },
+          {
+            countyCode: "420303",
+            countyName: "张湾区",
+          },
+          {
+            countyCode: "420381",
+            countyName: "丹江口市",
+          },
+        ],
+      },
+      {
+        cityCode: "429005",
+        cityName: "潜江市",
+        county: [
+          {
+            countyCode: "429005-1",
+            countyName: "潜江市",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "430000",
+    provinceName: "湖南省",
+    city: [
+      {
+        cityCode: "430300",
+        cityName: "湘潭市",
+        county: [
+          {
+            countyCode: "430381",
+            countyName: "湘乡市",
+          },
+          {
+            countyCode: "430302",
+            countyName: "雨湖区",
+          },
+          {
+            countyCode: "430382",
+            countyName: "韶山市",
+          },
+          {
+            countyCode: "430321",
+            countyName: "湘潭县",
+          },
+          {
+            countyCode: "430304",
+            countyName: "岳塘区",
+          },
+        ],
+      },
+      {
+        cityCode: "430600",
+        cityName: "岳阳市",
+        county: [
+          {
+            countyCode: "430623",
+            countyName: "华容县",
+          },
+          {
+            countyCode: "430682",
+            countyName: "临湘市",
+          },
+          {
+            countyCode: "430603",
+            countyName: "云溪区",
+          },
+          {
+            countyCode: "430681",
+            countyName: "汨罗市",
+          },
+          {
+            countyCode: "430624",
+            countyName: "湘阴县",
+          },
+          {
+            countyCode: "430602",
+            countyName: "岳阳楼区",
+          },
+          {
+            countyCode: "430626",
+            countyName: "平江县",
+          },
+          {
+            countyCode: "430611",
+            countyName: "君山区",
+          },
+          {
+            countyCode: "430621",
+            countyName: "岳阳县",
+          },
+        ],
+      },
+      {
+        cityCode: "430100",
+        cityName: "长沙市",
+        county: [
+          {
+            countyCode: "430111",
+            countyName: "雨花区",
+          },
+          {
+            countyCode: "430103",
+            countyName: "天心区",
+          },
+          {
+            countyCode: "430104",
+            countyName: "岳麓区",
+          },
+          {
+            countyCode: "430181",
+            countyName: "浏阳市",
+          },
+          {
+            countyCode: "430124",
+            countyName: "宁乡市",
+          },
+          {
+            countyCode: "430112",
+            countyName: "望城区",
+          },
+          {
+            countyCode: "430121",
+            countyName: "长沙县",
+          },
+          {
+            countyCode: "430105",
+            countyName: "开福区",
+          },
+          {
+            countyCode: "430102",
+            countyName: "芙蓉区",
+          },
+        ],
+      },
+      {
+        cityCode: "430200",
+        cityName: "株洲市",
+        county: [
+          {
+            countyCode: "430202",
+            countyName: "荷塘区",
+          },
+          {
+            countyCode: "430225",
+            countyName: "炎陵县",
+          },
+          {
+            countyCode: "430281",
+            countyName: "醴陵市",
+          },
+          {
+            countyCode: "430203",
+            countyName: "芦淞区",
+          },
+          {
+            countyCode: "430224",
+            countyName: "茶陵县",
+          },
+          {
+            countyCode: "430211",
+            countyName: "天元区",
+          },
+          {
+            countyCode: "430221",
+            countyName: "株洲县",
+          },
+          {
+            countyCode: "430223",
+            countyName: "攸县",
+          },
+          {
+            countyCode: "430204",
+            countyName: "石峰区",
+          },
+        ],
+      },
+      {
+        cityCode: "431000",
+        cityName: "郴州市",
+        county: [
+          {
+            countyCode: "431028",
+            countyName: "安仁县",
+          },
+          {
+            countyCode: "431021",
+            countyName: "桂阳县",
+          },
+          {
+            countyCode: "431002",
+            countyName: "北湖区",
+          },
+          {
+            countyCode: "431027",
+            countyName: "桂东县",
+          },
+          {
+            countyCode: "431024",
+            countyName: "嘉禾县",
+          },
+          {
+            countyCode: "431026",
+            countyName: "汝城县",
+          },
+          {
+            countyCode: "431023",
+            countyName: "永兴县",
+          },
+          {
+            countyCode: "431025",
+            countyName: "临武县",
+          },
+          {
+            countyCode: "431022",
+            countyName: "宜章县",
+          },
+          {
+            countyCode: "431003",
+            countyName: "苏仙区",
+          },
+          {
+            countyCode: "431081",
+            countyName: "资兴市",
+          },
+        ],
+      },
+      {
+        cityCode: "431200",
+        cityName: "怀化市",
+        county: [
+          {
+            countyCode: "431223",
+            countyName: "辰溪县",
+          },
+          {
+            countyCode: "431202",
+            countyName: "鹤城区",
+          },
+          {
+            countyCode: "431224",
+            countyName: "溆浦县",
+          },
+          {
+            countyCode: "431226",
+            countyName: "麻阳苗族自治县",
+          },
+          {
+            countyCode: "431229",
+            countyName: "靖州苗族侗族自治县",
+          },
+          {
+            countyCode: "431230",
+            countyName: "通道侗族自治县",
+          },
+          {
+            countyCode: "431281",
+            countyName: "洪江市",
+          },
+          {
+            countyCode: "431228",
+            countyName: "芷江侗族自治县",
+          },
+          {
+            countyCode: "431221",
+            countyName: "中方县",
+          },
+          {
+            countyCode: "431225",
+            countyName: "会同县",
+          },
+          {
+            countyCode: "431227",
+            countyName: "新晃侗族自治县",
+          },
+          {
+            countyCode: "431222",
+            countyName: "沅陵县",
+          },
+        ],
+      },
+      {
+        cityCode: "431100",
+        cityName: "永州市",
+        county: [
+          {
+            countyCode: "431123",
+            countyName: "双牌县",
+          },
+          {
+            countyCode: "431125",
+            countyName: "江永县",
+          },
+          {
+            countyCode: "431102",
+            countyName: "零陵区",
+          },
+          {
+            countyCode: "431129",
+            countyName: "江华瑶族自治县",
+          },
+          {
+            countyCode: "431124",
+            countyName: "道县",
+          },
+          {
+            countyCode: "431127",
+            countyName: "蓝山县",
+          },
+          {
+            countyCode: "431103",
+            countyName: "冷水滩区",
+          },
+          {
+            countyCode: "431122",
+            countyName: "东安县",
+          },
+          {
+            countyCode: "431128",
+            countyName: "新田县",
+          },
+          {
+            countyCode: "431121",
+            countyName: "祁阳县",
+          },
+          {
+            countyCode: "431126",
+            countyName: "宁远县",
+          },
+        ],
+      },
+      {
+        cityCode: "430700",
+        cityName: "常德市",
+        county: [
+          {
+            countyCode: "430703",
+            countyName: "鼎城区",
+          },
+          {
+            countyCode: "430725",
+            countyName: "桃源县",
+          },
+          {
+            countyCode: "430724",
+            countyName: "临澧县",
+          },
+          {
+            countyCode: "430781",
+            countyName: "津市市",
+          },
+          {
+            countyCode: "430702",
+            countyName: "武陵区",
+          },
+          {
+            countyCode: "430721",
+            countyName: "安乡县",
+          },
+          {
+            countyCode: "430726",
+            countyName: "石门县",
+          },
+          {
+            countyCode: "430722",
+            countyName: "汉寿县",
+          },
+          {
+            countyCode: "430723",
+            countyName: "澧县",
+          },
+        ],
+      },
+      {
+        cityCode: "431300",
+        cityName: "娄底市",
+        county: [
+          {
+            countyCode: "431322",
+            countyName: "新化县",
+          },
+          {
+            countyCode: "431302",
+            countyName: "娄星区",
+          },
+          {
+            countyCode: "431321",
+            countyName: "双峰县",
+          },
+          {
+            countyCode: "431381",
+            countyName: "冷水江市",
+          },
+          {
+            countyCode: "431382",
+            countyName: "涟源市",
+          },
+        ],
+      },
+      {
+        cityCode: "430800",
+        cityName: "张家界市",
+        county: [
+          {
+            countyCode: "430821",
+            countyName: "慈利县",
+          },
+          {
+            countyCode: "430822",
+            countyName: "桑植县",
+          },
+          {
+            countyCode: "430802",
+            countyName: "永定区",
+          },
+          {
+            countyCode: "430811",
+            countyName: "武陵源区",
+          },
+        ],
+      },
+      {
+        cityCode: "430400",
+        cityName: "衡阳市",
+        county: [
+          {
+            countyCode: "430423",
+            countyName: "衡山县",
+          },
+          {
+            countyCode: "430408",
+            countyName: "蒸湘区",
+          },
+          {
+            countyCode: "430405",
+            countyName: "珠晖区",
+          },
+          {
+            countyCode: "430481",
+            countyName: "耒阳市",
+          },
+          {
+            countyCode: "430422",
+            countyName: "衡南县",
+          },
+          {
+            countyCode: "430426",
+            countyName: "祁东县",
+          },
+          {
+            countyCode: "430407",
+            countyName: "石鼓区",
+          },
+          {
+            countyCode: "430482",
+            countyName: "常宁市",
+          },
+          {
+            countyCode: "430424",
+            countyName: "衡东县",
+          },
+          {
+            countyCode: "430406",
+            countyName: "雁峰区",
+          },
+          {
+            countyCode: "430421",
+            countyName: "衡阳县",
+          },
+          {
+            countyCode: "430412",
+            countyName: "南岳区",
+          },
+        ],
+      },
+      {
+        cityCode: "430500",
+        cityName: "邵阳市",
+        county: [
+          {
+            countyCode: "430524",
+            countyName: "隆回县",
+          },
+          {
+            countyCode: "430503",
+            countyName: "大祥区",
+          },
+          {
+            countyCode: "430528",
+            countyName: "新宁县",
+          },
+          {
+            countyCode: "430529",
+            countyName: "城步苗族自治县",
+          },
+          {
+            countyCode: "430581",
+            countyName: "武冈市",
+          },
+          {
+            countyCode: "430502",
+            countyName: "双清区",
+          },
+          {
+            countyCode: "430523",
+            countyName: "邵阳县",
+          },
+          {
+            countyCode: "430522",
+            countyName: "新邵县",
+          },
+          {
+            countyCode: "430521",
+            countyName: "邵东县",
+          },
+          {
+            countyCode: "430525",
+            countyName: "洞口县",
+          },
+          {
+            countyCode: "430511",
+            countyName: "北塔区",
+          },
+          {
+            countyCode: "430527",
+            countyName: "绥宁县",
+          },
+        ],
+      },
+      {
+        cityCode: "433100",
+        cityName: "湘西土家族苗族自治州",
+        county: [
+          {
+            countyCode: "433123",
+            countyName: "凤凰县",
+          },
+          {
+            countyCode: "433126",
+            countyName: "古丈县",
+          },
+          {
+            countyCode: "433125",
+            countyName: "保靖县",
+          },
+          {
+            countyCode: "433124",
+            countyName: "花垣县",
+          },
+          {
+            countyCode: "433127",
+            countyName: "永顺县",
+          },
+          {
+            countyCode: "433122",
+            countyName: "泸溪县",
+          },
+          {
+            countyCode: "433101",
+            countyName: "吉首市",
+          },
+          {
+            countyCode: "433130",
+            countyName: "龙山县",
+          },
+        ],
+      },
+      {
+        cityCode: "430900",
+        cityName: "益阳市",
+        county: [
+          {
+            countyCode: "430923",
+            countyName: "安化县",
+          },
+          {
+            countyCode: "430921",
+            countyName: "南县",
+          },
+          {
+            countyCode: "430902",
+            countyName: "资阳区",
+          },
+          {
+            countyCode: "430981",
+            countyName: "沅江市",
+          },
+          {
+            countyCode: "430903",
+            countyName: "赫山区",
+          },
+          {
+            countyCode: "430922",
+            countyName: "桃江县",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "450000",
+    provinceName: "广西壮族自治区",
+    city: [
+      {
+        cityCode: "450400",
+        cityName: "梧州市",
+        county: [
+          {
+            countyCode: "450481",
+            countyName: "岑溪市",
+          },
+          {
+            countyCode: "450423",
+            countyName: "蒙山县",
+          },
+          {
+            countyCode: "450421",
+            countyName: "苍梧县",
+          },
+          {
+            countyCode: "450422",
+            countyName: "藤县",
+          },
+          {
+            countyCode: "450403",
+            countyName: "万秀区",
+          },
+          {
+            countyCode: "450405",
+            countyName: "长洲区",
+          },
+          {
+            countyCode: "450424",
+            countyName: "龙圩区",
+          },
+          {
+            countyCode: "450404",
+            countyName: "蝶山区",
+          },
+        ],
+      },
+      {
+        cityCode: "450500",
+        cityName: "北海市",
+        county: [
+          {
+            countyCode: "450521",
+            countyName: "合浦县",
+          },
+          {
+            countyCode: "450512",
+            countyName: "铁山港区",
+          },
+          {
+            countyCode: "450502",
+            countyName: "海城区",
+          },
+          {
+            countyCode: "450503",
+            countyName: "银海区",
+          },
+        ],
+      },
+      {
+        cityCode: "450300",
+        cityName: "桂林市",
+        county: [
+          {
+            countyCode: "450327",
+            countyName: "灌阳县",
+          },
+          {
+            countyCode: "450305",
+            countyName: "七星区",
+          },
+          {
+            countyCode: "450326",
+            countyName: "永福县",
+          },
+          {
+            countyCode: "450325",
+            countyName: "兴安县",
+          },
+          {
+            countyCode: "450321",
+            countyName: "阳朔县",
+          },
+          {
+            countyCode: "450332",
+            countyName: "恭城瑶族自治县",
+          },
+          {
+            countyCode: "450302",
+            countyName: "秀峰区",
+          },
+          {
+            countyCode: "450304",
+            countyName: "象山区",
+          },
+          {
+            countyCode: "450330",
+            countyName: "平乐县",
+          },
+          {
+            countyCode: "450331",
+            countyName: "荔浦县",
+          },
+          {
+            countyCode: "450329",
+            countyName: "资源县",
+          },
+          {
+            countyCode: "450323",
+            countyName: "灵川县",
+          },
+          {
+            countyCode: "450324",
+            countyName: "全州县",
+          },
+          {
+            countyCode: "450322",
+            countyName: "临桂区",
+          },
+          {
+            countyCode: "450303",
+            countyName: "叠彩区",
+          },
+          {
+            countyCode: "450311",
+            countyName: "雁山区",
+          },
+          {
+            countyCode: "450328",
+            countyName: "龙胜各族自治县",
+          },
+        ],
+      },
+      {
+        cityCode: "451100",
+        cityName: "贺州市",
+        county: [
+          {
+            countyCode: "451121",
+            countyName: "昭平县",
+          },
+          {
+            countyCode: "451122",
+            countyName: "钟山县",
+          },
+          {
+            countyCode: "451102",
+            countyName: "八步区",
+          },
+          {
+            countyCode: "451123",
+            countyName: "富川瑶族自治县",
+          },
+          {
+            countyCode: "451103",
+            countyName: "平桂区",
+          },
+        ],
+      },
+      {
+        cityCode: "450800",
+        cityName: "贵港市",
+        county: [
+          {
+            countyCode: "450804",
+            countyName: "覃塘区",
+          },
+          {
+            countyCode: "450881",
+            countyName: "桂平市",
+          },
+          {
+            countyCode: "450821",
+            countyName: "平南县",
+          },
+          {
+            countyCode: "450803",
+            countyName: "港南区",
+          },
+          {
+            countyCode: "450802",
+            countyName: "港北区",
+          },
+        ],
+      },
+      {
+        cityCode: "450900",
+        cityName: "玉林市",
+        county: [
+          {
+            countyCode: "450921",
+            countyName: "容县",
+          },
+          {
+            countyCode: "450924",
+            countyName: "兴业县",
+          },
+          {
+            countyCode: "450902",
+            countyName: "玉州区",
+          },
+          {
+            countyCode: "450903",
+            countyName: "福绵区",
+          },
+          {
+            countyCode: "450981",
+            countyName: "北流市",
+          },
+          {
+            countyCode: "450923",
+            countyName: "博白县",
+          },
+          {
+            countyCode: "450922",
+            countyName: "陆川县",
+          },
+        ],
+      },
+      {
+        cityCode: "450200",
+        cityName: "柳州市",
+        county: [
+          {
+            countyCode: "450225",
+            countyName: "融水苗族自治县",
+          },
+          {
+            countyCode: "450202",
+            countyName: "城中区",
+          },
+          {
+            countyCode: "450223",
+            countyName: "鹿寨县",
+          },
+          {
+            countyCode: "450226",
+            countyName: "三江侗族自治县",
+          },
+          {
+            countyCode: "450204",
+            countyName: "柳南区",
+          },
+          {
+            countyCode: "450203",
+            countyName: "鱼峰区",
+          },
+          {
+            countyCode: "450222",
+            countyName: "柳城县",
+          },
+          {
+            countyCode: "450224",
+            countyName: "融安县",
+          },
+          {
+            countyCode: "450205",
+            countyName: "柳北区",
+          },
+          {
+            countyCode: "450221",
+            countyName: "柳江区",
+          },
+        ],
+      },
+      {
+        cityCode: "451000",
+        cityName: "百色市",
+        county: [
+          {
+            countyCode: "451002",
+            countyName: "右江区",
+          },
+          {
+            countyCode: "451031",
+            countyName: "隆林各族自治县",
+          },
+          {
+            countyCode: "451027",
+            countyName: "凌云县",
+          },
+          {
+            countyCode: "451023",
+            countyName: "平果县",
+          },
+          {
+            countyCode: "451026",
+            countyName: "那坡县",
+          },
+          {
+            countyCode: "451030",
+            countyName: "西林县",
+          },
+          {
+            countyCode: "451024",
+            countyName: "德保县",
+          },
+          {
+            countyCode: "451022",
+            countyName: "田东县",
+          },
+          {
+            countyCode: "451021",
+            countyName: "田阳县",
+          },
+          {
+            countyCode: "451028",
+            countyName: "乐业县",
+          },
+          {
+            countyCode: "451029",
+            countyName: "田林县",
+          },
+          {
+            countyCode: "451025",
+            countyName: "靖西市",
+          },
+        ],
+      },
+      {
+        cityCode: "451300",
+        cityName: "来宾市",
+        county: [
+          {
+            countyCode: "451381",
+            countyName: "合山市",
+          },
+          {
+            countyCode: "451322",
+            countyName: "象州县",
+          },
+          {
+            countyCode: "451324",
+            countyName: "金秀瑶族自治县",
+          },
+          {
+            countyCode: "451321",
+            countyName: "忻城县",
+          },
+          {
+            countyCode: "451302",
+            countyName: "兴宾区",
+          },
+          {
+            countyCode: "451323",
+            countyName: "武宣县",
+          },
+        ],
+      },
+      {
+        cityCode: "450100",
+        cityName: "南宁市",
+        county: [
+          {
+            countyCode: "450105",
+            countyName: "江南区",
+          },
+          {
+            countyCode: "450107",
+            countyName: "西乡塘区",
+          },
+          {
+            countyCode: "450109",
+            countyName: "邕宁区",
+          },
+          {
+            countyCode: "450126",
+            countyName: "宾阳县",
+          },
+          {
+            countyCode: "450108",
+            countyName: "良庆区",
+          },
+          {
+            countyCode: "450125",
+            countyName: "上林县",
+          },
+          {
+            countyCode: "450123",
+            countyName: "隆安县",
+          },
+          {
+            countyCode: "450124",
+            countyName: "马山县",
+          },
+          {
+            countyCode: "450122",
+            countyName: "武鸣区",
+          },
+          {
+            countyCode: "450102",
+            countyName: "兴宁区",
+          },
+          {
+            countyCode: "450127",
+            countyName: "横县",
+          },
+          {
+            countyCode: "450103",
+            countyName: "青秀区",
+          },
+        ],
+      },
+      {
+        cityCode: "450700",
+        cityName: "钦州市",
+        county: [
+          {
+            countyCode: "450702",
+            countyName: "钦南区",
+          },
+          {
+            countyCode: "450722",
+            countyName: "浦北县",
+          },
+          {
+            countyCode: "450721",
+            countyName: "灵山县",
+          },
+          {
+            countyCode: "450703",
+            countyName: "钦北区",
+          },
+        ],
+      },
+      {
+        cityCode: "450600",
+        cityName: "防城港市",
+        county: [
+          {
+            countyCode: "450603",
+            countyName: "防城区",
+          },
+          {
+            countyCode: "450621",
+            countyName: "上思县",
+          },
+          {
+            countyCode: "450602",
+            countyName: "港口区",
+          },
+          {
+            countyCode: "450681",
+            countyName: "东兴市",
+          },
+        ],
+      },
+      {
+        cityCode: "451200",
+        cityName: "河池市",
+        county: [
+          {
+            countyCode: "451202",
+            countyName: "金城江区",
+          },
+          {
+            countyCode: "451281",
+            countyName: "宜州区",
+          },
+          {
+            countyCode: "451221",
+            countyName: "南丹县",
+          },
+          {
+            countyCode: "451224",
+            countyName: "东兰县",
+          },
+          {
+            countyCode: "451228",
+            countyName: "都安瑶族自治县",
+          },
+          {
+            countyCode: "451229",
+            countyName: "大化瑶族自治县",
+          },
+          {
+            countyCode: "451222",
+            countyName: "天峨县",
+          },
+          {
+            countyCode: "451225",
+            countyName: "罗城仫佬族自治县",
+          },
+          {
+            countyCode: "451227",
+            countyName: "巴马瑶族自治县",
+          },
+          {
+            countyCode: "451226",
+            countyName: "环江毛南族自治县",
+          },
+          {
+            countyCode: "451223",
+            countyName: "凤山县",
+          },
+        ],
+      },
+      {
+        cityCode: "451400",
+        cityName: "崇左市",
+        county: [
+          {
+            countyCode: "451423",
+            countyName: "龙州县",
+          },
+          {
+            countyCode: "451425",
+            countyName: "天等县",
+          },
+          {
+            countyCode: "451481",
+            countyName: "凭祥市",
+          },
+          {
+            countyCode: "451422",
+            countyName: "宁明县",
+          },
+          {
+            countyCode: "451402",
+            countyName: "江州区",
+          },
+          {
+            countyCode: "451421",
+            countyName: "扶绥县",
+          },
+          {
+            countyCode: "451424",
+            countyName: "大新县",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "460000",
+    provinceName: "海南省",
+    city: [
+      {
+        cityCode: "469005",
+        cityName: "文昌市",
+        county: [
+          {
+            countyCode: "469005-1",
+            countyName: "文昌市",
+          },
+        ],
+      },
+      {
+        cityCode: "460300",
+        cityName: "三沙市",
+        county: [
+          {
+            countyCode: "460321",
+            countyName: "西沙群岛",
+          },
+          {
+            countyCode: "460322",
+            countyName: "南沙群岛",
+          },
+          {
+            countyCode: "469031",
+            countyName: "西沙群岛",
+          },
+          {
+            countyCode: "469032",
+            countyName: "南沙群岛",
+          },
+          {
+            countyCode: "460323",
+            countyName: "中沙群岛的岛礁及其海域",
+          },
+        ],
+      },
+      {
+        cityCode: "469027",
+        cityName: "乐东黎族自治县",
+        county: [
+          {
+            countyCode: "469027-1",
+            countyName: "乐东黎族自治县",
+          },
+        ],
+      },
+      {
+        cityCode: "460200",
+        cityName: "三亚市",
+        county: [
+          {
+            countyCode: "460203",
+            countyName: "吉阳区",
+          },
+          {
+            countyCode: "460202",
+            countyName: "海棠区",
+          },
+          {
+            countyCode: "460205",
+            countyName: "崖州区",
+          },
+          {
+            countyCode: "460204",
+            countyName: "天涯区",
+          },
+        ],
+      },
+      {
+        cityCode: "469002",
+        cityName: "琼海市",
+        county: [
+          {
+            countyCode: "469002-1",
+            countyName: "琼海市",
+          },
+        ],
+      },
+      {
+        cityCode: "469021",
+        cityName: "定安县",
+        county: [
+          {
+            countyCode: "469021-1",
+            countyName: "定安县",
+          },
+        ],
+      },
+      {
+        cityCode: "460100",
+        cityName: "海口市",
+        county: [
+          {
+            countyCode: "460107",
+            countyName: "琼山区",
+          },
+          {
+            countyCode: "460108",
+            countyName: "美兰区",
+          },
+          {
+            countyCode: "460105",
+            countyName: "秀英区",
+          },
+          {
+            countyCode: "460106",
+            countyName: "龙华区",
+          },
+        ],
+      },
+      {
+        cityCode: "469006",
+        cityName: "万宁市",
+        county: [
+          {
+            countyCode: "469006-1",
+            countyName: "万宁市",
+          },
+        ],
+      },
+      {
+        cityCode: "469029",
+        cityName: "保亭黎族苗族自治县",
+        county: [
+          {
+            countyCode: "469029-1",
+            countyName: "保亭黎族苗族自治县",
+          },
+        ],
+      },
+      {
+        cityCode: "469003",
+        cityName: "儋州市",
+        county: [
+          {
+            countyCode: "469003-1",
+            countyName: "儋州市",
+          },
+        ],
+      },
+      {
+        cityCode: "469023",
+        cityName: "澄迈县",
+        county: [
+          {
+            countyCode: "469023-1",
+            countyName: "澄迈县",
+          },
+        ],
+      },
+      {
+        cityCode: "469022",
+        cityName: "屯昌县",
+        county: [
+          {
+            countyCode: "469022-1",
+            countyName: "屯昌县",
+          },
+        ],
+      },
+      {
+        cityCode: "469028",
+        cityName: "陵水黎族自治县",
+        county: [
+          {
+            countyCode: "469028-1",
+            countyName: "陵水黎族自治县",
+          },
+        ],
+      },
+      {
+        cityCode: "469007",
+        cityName: "东方市",
+        county: [
+          {
+            countyCode: "469007-1",
+            countyName: "东方市",
+          },
+        ],
+      },
+      {
+        cityCode: "469001",
+        cityName: "五指山市",
+        county: [
+          {
+            countyCode: "469001-1",
+            countyName: "五指山市",
+          },
+        ],
+      },
+      {
+        cityCode: "469025",
+        cityName: "白沙黎族自治县",
+        county: [
+          {
+            countyCode: "469025-1",
+            countyName: "白沙黎族自治县",
+          },
+        ],
+      },
+      {
+        cityCode: "469026",
+        cityName: "昌江黎族自治县",
+        county: [
+          {
+            countyCode: "469026-1",
+            countyName: "昌江黎族自治县",
+          },
+        ],
+      },
+      {
+        cityCode: "469024",
+        cityName: "临高县",
+        county: [
+          {
+            countyCode: "469024-1",
+            countyName: "临高县",
+          },
+        ],
+      },
+      {
+        cityCode: "469030",
+        cityName: "琼中黎族苗族自治县",
+        county: [
+          {
+            countyCode: "469030-1",
+            countyName: "琼中黎族苗族自治县",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "500000",
+    provinceName: "重庆",
+    city: [
+      {
+        cityCode: "500000-1",
+        cityName: "重庆市",
+        county: [
+          {
+            countyCode: "500108",
+            countyName: "南岸区",
+          },
+          {
+            countyCode: "500101",
+            countyName: "万州区",
+          },
+          {
+            countyCode: "500103",
+            countyName: "渝中区",
+          },
+          {
+            countyCode: "500106",
+            countyName: "沙坪坝区",
+          },
+          {
+            countyCode: "500102",
+            countyName: "涪陵区",
+          },
+          {
+            countyCode: "500226",
+            countyName: "荣昌区",
+          },
+          {
+            countyCode: "500223",
+            countyName: "潼南区",
+          },
+          {
+            countyCode: "500242",
+            countyName: "酉阳土家族苗族自治县",
+          },
+          {
+            countyCode: "500232",
+            countyName: "武隆区",
+          },
+          {
+            countyCode: "500113",
+            countyName: "巴南区",
+          },
+          {
+            countyCode: "500109",
+            countyName: "北碚区",
+          },
+          {
+            countyCode: "500104",
+            countyName: "大渡口区",
+          },
+          {
+            countyCode: "500117",
+            countyName: "合川区",
+          },
+          {
+            countyCode: "500112",
+            countyName: "渝北区",
+          },
+          {
+            countyCode: "500116",
+            countyName: "江津区",
+          },
+          {
+            countyCode: "500228",
+            countyName: "梁平区",
+          },
+          {
+            countyCode: "500119",
+            countyName: "南川区",
+          },
+          {
+            countyCode: "500110",
+            countyName: "綦江区",
+          },
+          {
+            countyCode: "500227",
+            countyName: "璧山区",
+          },
+          {
+            countyCode: "500115",
+            countyName: "长寿区",
+          },
+          {
+            countyCode: "500231",
+            countyName: "垫江县",
+          },
+          {
+            countyCode: "500230",
+            countyName: "丰都县",
+          },
+          {
+            countyCode: "500224",
+            countyName: "铜梁区",
+          },
+          {
+            countyCode: "500243",
+            countyName: "彭水苗族土家族自治县",
+          },
+          {
+            countyCode: "500105",
+            countyName: "江北区",
+          },
+          {
+            countyCode: "500107",
+            countyName: "九龙坡区",
+          },
+          {
+            countyCode: "500236",
+            countyName: "奉节县",
+          },
+          {
+            countyCode: "500111",
+            countyName: "大足区",
+          },
+          {
+            countyCode: "500234",
+            countyName: "开州区",
+          },
+          {
+            countyCode: "500241",
+            countyName: "秀山土家族苗族自治县",
+          },
+          {
+            countyCode: "500229",
+            countyName: "城口县",
+          },
+          {
+            countyCode: "500238",
+            countyName: "巫溪县",
+          },
+          {
+            countyCode: "500118",
+            countyName: "永川区",
+          },
+          {
+            countyCode: "500233",
+            countyName: "忠县",
+          },
+          {
+            countyCode: "500240",
+            countyName: "石柱土家族自治县",
+          },
+          {
+            countyCode: "500114",
+            countyName: "黔江区",
+          },
+          {
+            countyCode: "500237",
+            countyName: "巫山县",
+          },
+          {
+            countyCode: "500235",
+            countyName: "云阳县",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "510000",
+    provinceName: "四川省",
+    city: [
+      {
+        cityCode: "511300",
+        cityName: "南充市",
+        county: [
+          {
+            countyCode: "511304",
+            countyName: "嘉陵区",
+          },
+          {
+            countyCode: "511323",
+            countyName: "蓬安县",
+          },
+          {
+            countyCode: "511322",
+            countyName: "营山县",
+          },
+          {
+            countyCode: "511381",
+            countyName: "阆中市",
+          },
+          {
+            countyCode: "511303",
+            countyName: "高坪区",
+          },
+          {
+            countyCode: "511324",
+            countyName: "仪陇县",
+          },
+          {
+            countyCode: "511302",
+            countyName: "顺庆区",
+          },
+          {
+            countyCode: "511321",
+            countyName: "南部县",
+          },
+          {
+            countyCode: "511325",
+            countyName: "西充县",
+          },
+        ],
+      },
+      {
+        cityCode: "511800",
+        cityName: "雅安市",
+        county: [
+          {
+            countyCode: "511826",
+            countyName: "芦山县",
+          },
+          {
+            countyCode: "511824",
+            countyName: "石棉县",
+          },
+          {
+            countyCode: "511803",
+            countyName: "名山区",
+          },
+          {
+            countyCode: "511827",
+            countyName: "宝兴县",
+          },
+          {
+            countyCode: "511802",
+            countyName: "雨城区",
+          },
+          {
+            countyCode: "511823",
+            countyName: "汉源县",
+          },
+          {
+            countyCode: "511825",
+            countyName: "天全县",
+          },
+          {
+            countyCode: "511822",
+            countyName: "荥经县",
+          },
+        ],
+      },
+      {
+        cityCode: "513400",
+        cityName: "凉山彝族自治州",
+        county: [
+          {
+            countyCode: "513427",
+            countyName: "宁南县",
+          },
+          {
+            countyCode: "513432",
+            countyName: "喜德县",
+          },
+          {
+            countyCode: "513431",
+            countyName: "昭觉县",
+          },
+          {
+            countyCode: "513401",
+            countyName: "西昌市",
+          },
+          {
+            countyCode: "513437",
+            countyName: "雷波县",
+          },
+          {
+            countyCode: "513433",
+            countyName: "冕宁县",
+          },
+          {
+            countyCode: "513434",
+            countyName: "越西县",
+          },
+          {
+            countyCode: "513435",
+            countyName: "甘洛县",
+          },
+          {
+            countyCode: "513429",
+            countyName: "布拖县",
+          },
+          {
+            countyCode: "513430",
+            countyName: "金阳县",
+          },
+          {
+            countyCode: "513436",
+            countyName: "美姑县",
+          },
+          {
+            countyCode: "513428",
+            countyName: "普格县",
+          },
+          {
+            countyCode: "513424",
+            countyName: "德昌县",
+          },
+          {
+            countyCode: "513425",
+            countyName: "会理县",
+          },
+          {
+            countyCode: "513423",
+            countyName: "盐源县",
+          },
+          {
+            countyCode: "513426",
+            countyName: "会东县",
+          },
+          {
+            countyCode: "513422",
+            countyName: "木里藏族自治县",
+          },
+        ],
+      },
+      {
+        cityCode: "511400",
+        cityName: "眉山市",
+        county: [
+          {
+            countyCode: "511422",
+            countyName: "彭山区",
+          },
+          {
+            countyCode: "511424",
+            countyName: "丹棱县",
+          },
+          {
+            countyCode: "511425",
+            countyName: "青神县",
+          },
+          {
+            countyCode: "511402",
+            countyName: "东坡区",
+          },
+          {
+            countyCode: "511423",
+            countyName: "洪雅县",
+          },
+          {
+            countyCode: "511421",
+            countyName: "仁寿县",
+          },
+        ],
+      },
+      {
+        cityCode: "510300",
+        cityName: "自贡市",
+        county: [
+          {
+            countyCode: "510304",
+            countyName: "大安区",
+          },
+          {
+            countyCode: "510302",
+            countyName: "自流井区",
+          },
+          {
+            countyCode: "510321",
+            countyName: "荣县",
+          },
+          {
+            countyCode: "510303",
+            countyName: "贡井区",
+          },
+          {
+            countyCode: "510322",
+            countyName: "富顺县",
+          },
+          {
+            countyCode: "510311",
+            countyName: "沿滩区",
+          },
+        ],
+      },
+      {
+        cityCode: "511900",
+        cityName: "巴中市",
+        county: [
+          {
+            countyCode: "511903",
+            countyName: "恩阳区",
+          },
+          {
+            countyCode: "511921",
+            countyName: "通江县",
+          },
+          {
+            countyCode: "511922",
+            countyName: "南江县",
+          },
+          {
+            countyCode: "511902",
+            countyName: "巴州区",
+          },
+          {
+            countyCode: "511923",
+            countyName: "平昌县",
+          },
+        ],
+      },
+      {
+        cityCode: "513300",
+        cityName: "甘孜藏族自治州",
+        county: [
+          {
+            countyCode: "513328",
+            countyName: "甘孜县",
+          },
+          {
+            countyCode: "513324",
+            countyName: "九龙县",
+          },
+          {
+            countyCode: "513332",
+            countyName: "石渠县",
+          },
+          {
+            countyCode: "513337",
+            countyName: "稻城县",
+          },
+          {
+            countyCode: "513326",
+            countyName: "道孚县",
+          },
+          {
+            countyCode: "513330",
+            countyName: "德格县",
+          },
+          {
+            countyCode: "513336",
+            countyName: "乡城县",
+          },
+          {
+            countyCode: "513325",
+            countyName: "雅江县",
+          },
+          {
+            countyCode: "513334",
+            countyName: "理塘县",
+          },
+          {
+            countyCode: "513329",
+            countyName: "新龙县",
+          },
+          {
+            countyCode: "513338",
+            countyName: "得荣县",
+          },
+          {
+            countyCode: "513331",
+            countyName: "白玉县",
+          },
+          {
+            countyCode: "513323",
+            countyName: "丹巴县",
+          },
+          {
+            countyCode: "513327",
+            countyName: "炉霍县",
+          },
+          {
+            countyCode: "513335",
+            countyName: "巴塘县",
+          },
+          {
+            countyCode: "513321",
+            countyName: "康定市",
+          },
+          {
+            countyCode: "513333",
+            countyName: "色达县",
+          },
+          {
+            countyCode: "513322",
+            countyName: "泸定县",
+          },
+        ],
+      },
+      {
+        cityCode: "511700",
+        cityName: "达州市",
+        county: [
+          {
+            countyCode: "511722",
+            countyName: "宣汉县",
+          },
+          {
+            countyCode: "511781",
+            countyName: "万源市",
+          },
+          {
+            countyCode: "511724",
+            countyName: "大竹县",
+          },
+          {
+            countyCode: "511723",
+            countyName: "开江县",
+          },
+          {
+            countyCode: "511721",
+            countyName: "达川区",
+          },
+          {
+            countyCode: "511702",
+            countyName: "通川区",
+          },
+          {
+            countyCode: "511725",
+            countyName: "渠县",
+          },
+        ],
+      },
+      {
+        cityCode: "510500",
+        cityName: "泸州市",
+        county: [
+          {
+            countyCode: "510524",
+            countyName: "叙永县",
+          },
+          {
+            countyCode: "510521",
+            countyName: "泸县",
+          },
+          {
+            countyCode: "510502",
+            countyName: "江阳区",
+          },
+          {
+            countyCode: "510504",
+            countyName: "龙马潭区",
+          },
+          {
+            countyCode: "510525",
+            countyName: "古蔺县",
+          },
+          {
+            countyCode: "510522",
+            countyName: "合江县",
+          },
+          {
+            countyCode: "510503",
+            countyName: "纳溪区",
+          },
+        ],
+      },
+      {
+        cityCode: "510800",
+        cityName: "广元市",
+        county: [
+          {
+            countyCode: "510802",
+            countyName: "利州区",
+          },
+          {
+            countyCode: "510811",
+            countyName: "昭化区",
+          },
+          {
+            countyCode: "510824",
+            countyName: "苍溪县",
+          },
+          {
+            countyCode: "510812",
+            countyName: "朝天区",
+          },
+          {
+            countyCode: "510823",
+            countyName: "剑阁县",
+          },
+          {
+            countyCode: "510821",
+            countyName: "旺苍县",
+          },
+          {
+            countyCode: "510822",
+            countyName: "青川县",
+          },
+        ],
+      },
+      {
+        cityCode: "512000",
+        cityName: "资阳市",
+        county: [
+          {
+            countyCode: "512022",
+            countyName: "乐至县",
+          },
+          {
+            countyCode: "512021",
+            countyName: "安岳县",
+          },
+          {
+            countyCode: "512002",
+            countyName: "雁江区",
+          },
+        ],
+      },
+      {
+        cityCode: "510400",
+        cityName: "攀枝花市",
+        county: [
+          {
+            countyCode: "510411",
+            countyName: "仁和区",
+          },
+          {
+            countyCode: "510422",
+            countyName: "盐边县",
+          },
+          {
+            countyCode: "510403",
+            countyName: "西区",
+          },
+          {
+            countyCode: "510421",
+            countyName: "米易县",
+          },
+          {
+            countyCode: "510402",
+            countyName: "东区",
+          },
+        ],
+      },
+      {
+        cityCode: "510100",
+        cityName: "成都市",
+        county: [
+          {
+            countyCode: "510115",
+            countyName: "温江区",
+          },
+          {
+            countyCode: "510105",
+            countyName: "青羊区",
+          },
+          {
+            countyCode: "510124",
+            countyName: "郫都区",
+          },
+          {
+            countyCode: "510122",
+            countyName: "双流区",
+          },
+          {
+            countyCode: "510129",
+            countyName: "大邑县",
+          },
+          {
+            countyCode: "510106",
+            countyName: "金牛区",
+          },
+          {
+            countyCode: "510112",
+            countyName: "龙泉驿区",
+          },
+          {
+            countyCode: "512081",
+            countyName: "简阳市",
+          },
+          {
+            countyCode: "510181",
+            countyName: "都江堰市",
+          },
+          {
+            countyCode: "510108",
+            countyName: "成华区",
+          },
+          {
+            countyCode: "510132",
+            countyName: "新津县",
+          },
+          {
+            countyCode: "510113",
+            countyName: "青白江区",
+          },
+          {
+            countyCode: "510182",
+            countyName: "彭州市",
+          },
+          {
+            countyCode: "510114",
+            countyName: "新都区",
+          },
+          {
+            countyCode: "510184",
+            countyName: "崇州市",
+          },
+          {
+            countyCode: "510121",
+            countyName: "金堂县",
+          },
+          {
+            countyCode: "510107",
+            countyName: "武侯区",
+          },
+          {
+            countyCode: "510104",
+            countyName: "锦江区",
+          },
+          {
+            countyCode: "510131",
+            countyName: "蒲江县",
+          },
+          {
+            countyCode: "510183",
+            countyName: "邛崃市",
+          },
+        ],
+      },
+      {
+        cityCode: "511100",
+        cityName: "乐山市",
+        county: [
+          {
+            countyCode: "511132",
+            countyName: "峨边彝族自治县",
+          },
+          {
+            countyCode: "511113",
+            countyName: "金口河区",
+          },
+          {
+            countyCode: "511111",
+            countyName: "沙湾区",
+          },
+          {
+            countyCode: "511181",
+            countyName: "峨眉山市",
+          },
+          {
+            countyCode: "511126",
+            countyName: "夹江县",
+          },
+          {
+            countyCode: "511102",
+            countyName: "市中区",
+          },
+          {
+            countyCode: "511112",
+            countyName: "五通桥区",
+          },
+          {
+            countyCode: "511124",
+            countyName: "井研县",
+          },
+          {
+            countyCode: "511129",
+            countyName: "沐川县",
+          },
+          {
+            countyCode: "511123",
+            countyName: "犍为县",
+          },
+          {
+            countyCode: "511133",
+            countyName: "马边彝族自治县",
+          },
+        ],
+      },
+      {
+        cityCode: "510700",
+        cityName: "绵阳市",
+        county: [
+          {
+            countyCode: "510724",
+            countyName: "安州区",
+          },
+          {
+            countyCode: "510725",
+            countyName: "梓潼县",
+          },
+          {
+            countyCode: "510781",
+            countyName: "江油市",
+          },
+          {
+            countyCode: "510704",
+            countyName: "游仙区",
+          },
+          {
+            countyCode: "510727",
+            countyName: "平武县",
+          },
+          {
+            countyCode: "510723",
+            countyName: "盐亭县",
+          },
+          {
+            countyCode: "510703",
+            countyName: "涪城区",
+          },
+          {
+            countyCode: "510722",
+            countyName: "三台县",
+          },
+          {
+            countyCode: "510726",
+            countyName: "北川羌族自治县",
+          },
+        ],
+      },
+      {
+        cityCode: "511600",
+        cityName: "广安市",
+        county: [
+          {
+            countyCode: "511623",
+            countyName: "邻水县",
+          },
+          {
+            countyCode: "511622",
+            countyName: "武胜县",
+          },
+          {
+            countyCode: "511603000000",
+            countyName: "前锋区",
+          },
+          {
+            countyCode: "511602",
+            countyName: "广安区",
+          },
+          {
+            countyCode: "511621",
+            countyName: "岳池县",
+          },
+          {
+            countyCode: "511681",
+            countyName: "华蓥市",
+          },
+        ],
+      },
+      {
+        cityCode: "511500",
+        cityName: "宜宾市",
+        county: [
+          {
+            countyCode: "511523",
+            countyName: "江安县",
+          },
+          {
+            countyCode: "511521",
+            countyName: "叙州区",
+          },
+          {
+            countyCode: "511525",
+            countyName: "高县",
+          },
+          {
+            countyCode: "511529",
+            countyName: "屏山县",
+          },
+          {
+            countyCode: "511528",
+            countyName: "兴文县",
+          },
+          {
+            countyCode: "511502",
+            countyName: "翠屏区",
+          },
+          {
+            countyCode: "511527",
+            countyName: "筠连县",
+          },
+          {
+            countyCode: "511524",
+            countyName: "长宁县",
+          },
+          {
+            countyCode: "511526",
+            countyName: "珙县",
+          },
+          {
+            countyCode: "511503",
+            countyName: "南溪区",
+          },
+        ],
+      },
+      {
+        cityCode: "511000",
+        cityName: "内江市",
+        county: [
+          {
+            countyCode: "511024",
+            countyName: "威远县",
+          },
+          {
+            countyCode: "511002",
+            countyName: "市中区",
+          },
+          {
+            countyCode: "511011",
+            countyName: "东兴区",
+          },
+          {
+            countyCode: "511028",
+            countyName: "隆昌市",
+          },
+          {
+            countyCode: "511025",
+            countyName: "资中县",
+          },
+        ],
+      },
+      {
+        cityCode: "513200",
+        cityName: "阿坝藏族羌族自治州",
+        county: [
+          {
+            countyCode: "513230",
+            countyName: "壤塘县",
+          },
+          {
+            countyCode: "513225",
+            countyName: "九寨沟县",
+          },
+          {
+            countyCode: "513223",
+            countyName: "茂县",
+          },
+          {
+            countyCode: "513226",
+            countyName: "金川县",
+          },
+          {
+            countyCode: "513227",
+            countyName: "小金县",
+          },
+          {
+            countyCode: "513233",
+            countyName: "红原县",
+          },
+          {
+            countyCode: "513222",
+            countyName: "理县",
+          },
+          {
+            countyCode: "513232",
+            countyName: "若尔盖县",
+          },
+          {
+            countyCode: "513221",
+            countyName: "汶川县",
+          },
+          {
+            countyCode: "513228",
+            countyName: "黑水县",
+          },
+          {
+            countyCode: "513229",
+            countyName: "马尔康市",
+          },
+          {
+            countyCode: "513231",
+            countyName: "阿坝县",
+          },
+          {
+            countyCode: "513224",
+            countyName: "松潘县",
+          },
+        ],
+      },
+      {
+        cityCode: "510900",
+        cityName: "遂宁市",
+        county: [
+          {
+            countyCode: "510904",
+            countyName: "安居区",
+          },
+          {
+            countyCode: "510923",
+            countyName: "大英县",
+          },
+          {
+            countyCode: "510922",
+            countyName: "射洪县",
+          },
+          {
+            countyCode: "510903",
+            countyName: "船山区",
+          },
+          {
+            countyCode: "510921",
+            countyName: "蓬溪县",
+          },
+        ],
+      },
+      {
+        cityCode: "510600",
+        cityName: "德阳市",
+        county: [
+          {
+            countyCode: "510682",
+            countyName: "什邡市",
+          },
+          {
+            countyCode: "510683",
+            countyName: "绵竹市",
+          },
+          {
+            countyCode: "510623",
+            countyName: "中江县",
+          },
+          {
+            countyCode: "510681",
+            countyName: "广汉市",
+          },
+          {
+            countyCode: "510626",
+            countyName: "罗江区",
+          },
+          {
+            countyCode: "510603",
+            countyName: "旌阳区",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "520000",
+    provinceName: "贵州省",
+    city: [
+      {
+        cityCode: "520100",
+        cityName: "贵阳市",
+        county: [
+          {
+            countyCode: "520103",
+            countyName: "云岩区",
+          },
+          {
+            countyCode: "520123",
+            countyName: "修文县",
+          },
+          {
+            countyCode: "520121",
+            countyName: "开阳县",
+          },
+          {
+            countyCode: "520114",
+            countyName: "小河区",
+          },
+          {
+            countyCode: "520122",
+            countyName: "息烽县",
+          },
+          {
+            countyCode: "520113",
+            countyName: "白云区",
+          },
+          {
+            countyCode: "520115",
+            countyName: "观山湖区",
+          },
+          {
+            countyCode: "520102",
+            countyName: "南明区",
+          },
+          {
+            countyCode: "520181",
+            countyName: "清镇市",
+          },
+          {
+            countyCode: "520112",
+            countyName: "乌当区",
+          },
+          {
+            countyCode: "520111",
+            countyName: "花溪区",
+          },
+        ],
+      },
+      {
+        cityCode: "520300",
+        cityName: "遵义市",
+        county: [
+          {
+            countyCode: "520381",
+            countyName: "赤水市",
+          },
+          {
+            countyCode: "520329",
+            countyName: "余庆县",
+          },
+          {
+            countyCode: "520325",
+            countyName: "道真仡佬族苗族自治县",
+          },
+          {
+            countyCode: "520326",
+            countyName: "务川仡佬族苗族自治县",
+          },
+          {
+            countyCode: "520328",
+            countyName: "湄潭县",
+          },
+          {
+            countyCode: "520327",
+            countyName: "凤冈县",
+          },
+          {
+            countyCode: "520302",
+            countyName: "红花岗区",
+          },
+          {
+            countyCode: "520382",
+            countyName: "仁怀市",
+          },
+          {
+            countyCode: "520321",
+            countyName: "播州区",
+          },
+          {
+            countyCode: "520330",
+            countyName: "习水县",
+          },
+          {
+            countyCode: "520324",
+            countyName: "正安县",
+          },
+          {
+            countyCode: "520303",
+            countyName: "汇川区",
+          },
+          {
+            countyCode: "520323",
+            countyName: "绥阳县",
+          },
+          {
+            countyCode: "520322",
+            countyName: "桐梓县",
+          },
+        ],
+      },
+      {
+        cityCode: "522700",
+        cityName: "黔南布依族苗族自治州",
+        county: [
+          {
+            countyCode: "522722",
+            countyName: "荔波县",
+          },
+          {
+            countyCode: "522725",
+            countyName: "瓮安县",
+          },
+          {
+            countyCode: "522702",
+            countyName: "福泉市",
+          },
+          {
+            countyCode: "522728",
+            countyName: "罗甸县",
+          },
+          {
+            countyCode: "522723",
+            countyName: "贵定县",
+          },
+          {
+            countyCode: "522701",
+            countyName: "都匀市",
+          },
+          {
+            countyCode: "522726",
+            countyName: "独山县",
+          },
+          {
+            countyCode: "522731",
+            countyName: "惠水县",
+          },
+          {
+            countyCode: "522732",
+            countyName: "三都水族自治县",
+          },
+          {
+            countyCode: "522727",
+            countyName: "平塘县",
+          },
+          {
+            countyCode: "522729",
+            countyName: "长顺县",
+          },
+          {
+            countyCode: "522730",
+            countyName: "龙里县",
+          },
+        ],
+      },
+      {
+        cityCode: "520200",
+        cityName: "六盘水市",
+        county: [
+          {
+            countyCode: "520222",
+            countyName: "盘州市",
+          },
+          {
+            countyCode: "520203",
+            countyName: "六枝特区",
+          },
+          {
+            countyCode: "520201",
+            countyName: "钟山区",
+          },
+          {
+            countyCode: "520221",
+            countyName: "水城县",
+          },
+        ],
+      },
+      {
+        cityCode: "520400",
+        cityName: "安顺市",
+        county: [
+          {
+            countyCode: "520424",
+            countyName: "关岭布依族苗族自治县",
+          },
+          {
+            countyCode: "520423",
+            countyName: "镇宁布依族苗族自治县",
+          },
+          {
+            countyCode: "520422",
+            countyName: "普定县",
+          },
+          {
+            countyCode: "520421",
+            countyName: "平坝区",
+          },
+          {
+            countyCode: "520425",
+            countyName: "紫云苗族布依族自治县",
+          },
+          {
+            countyCode: "520402",
+            countyName: "西秀区",
+          },
+        ],
+      },
+      {
+        cityCode: "520500",
+        cityName: "毕节市",
+        county: [
+          {
+            countyCode: "520523",
+            countyName: "金沙县",
+          },
+          {
+            countyCode: "520524",
+            countyName: "织金县",
+          },
+          {
+            countyCode: "520525",
+            countyName: "纳雍县",
+          },
+          {
+            countyCode: "520522",
+            countyName: "黔西县",
+          },
+          {
+            countyCode: "520526",
+            countyName: "威宁彝族回族苗族自治县",
+          },
+          {
+            countyCode: "520527",
+            countyName: "赫章县",
+          },
+          {
+            countyCode: "520521",
+            countyName: "大方县",
+          },
+          {
+            countyCode: "520502",
+            countyName: "七星关区",
+          },
+        ],
+      },
+      {
+        cityCode: "522600",
+        cityName: "黔东南苗族侗族自治州",
+        county: [
+          {
+            countyCode: "522626",
+            countyName: "岑巩县",
+          },
+          {
+            countyCode: "522630",
+            countyName: "台江县",
+          },
+          {
+            countyCode: "522624",
+            countyName: "三穗县",
+          },
+          {
+            countyCode: "522625",
+            countyName: "镇远县",
+          },
+          {
+            countyCode: "522636",
+            countyName: "丹寨县",
+          },
+          {
+            countyCode: "522633",
+            countyName: "从江县",
+          },
+          {
+            countyCode: "522634",
+            countyName: "雷山县",
+          },
+          {
+            countyCode: "522623",
+            countyName: "施秉县",
+          },
+          {
+            countyCode: "522629",
+            countyName: "剑河县",
+          },
+          {
+            countyCode: "522628",
+            countyName: "锦屏县",
+          },
+          {
+            countyCode: "522632",
+            countyName: "榕江县",
+          },
+          {
+            countyCode: "522631",
+            countyName: "黎平县",
+          },
+          {
+            countyCode: "522627",
+            countyName: "天柱县",
+          },
+          {
+            countyCode: "522622",
+            countyName: "黄平县",
+          },
+          {
+            countyCode: "522635",
+            countyName: "麻江县",
+          },
+          {
+            countyCode: "522601",
+            countyName: "凯里市",
+          },
+        ],
+      },
+      {
+        cityCode: "522300",
+        cityName: "黔西南布依族苗族自治州",
+        county: [
+          {
+            countyCode: "522326",
+            countyName: "望谟县",
+          },
+          {
+            countyCode: "522327",
+            countyName: "册亨县",
+          },
+          {
+            countyCode: "522323",
+            countyName: "普安县",
+          },
+          {
+            countyCode: "522322",
+            countyName: "兴仁县",
+          },
+          {
+            countyCode: "522301",
+            countyName: "兴义市",
+          },
+          {
+            countyCode: "522328",
+            countyName: "安龙县",
+          },
+          {
+            countyCode: "522324",
+            countyName: "晴隆县",
+          },
+          {
+            countyCode: "522325",
+            countyName: "贞丰县",
+          },
+        ],
+      },
+      {
+        cityCode: "520600",
+        cityName: "铜仁市",
+        county: [
+          {
+            countyCode: "520602",
+            countyName: "碧江区",
+          },
+          {
+            countyCode: "520622",
+            countyName: "玉屏侗族自治县",
+          },
+          {
+            countyCode: "520603",
+            countyName: "万山区",
+          },
+          {
+            countyCode: "520627",
+            countyName: "沿河土家族自治县",
+          },
+          {
+            countyCode: "520624",
+            countyName: "思南县",
+          },
+          {
+            countyCode: "520626",
+            countyName: "德江县",
+          },
+          {
+            countyCode: "520628",
+            countyName: "松桃苗族自治县",
+          },
+          {
+            countyCode: "520621",
+            countyName: "江口县",
+          },
+          {
+            countyCode: "520623",
+            countyName: "石阡县",
+          },
+          {
+            countyCode: "520625",
+            countyName: "印江土家族苗族自治县",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "530000",
+    provinceName: "云南省",
+    city: [
+      {
+        cityCode: "530400",
+        cityName: "玉溪市",
+        county: [
+          {
+            countyCode: "530425",
+            countyName: "易门县",
+          },
+          {
+            countyCode: "530423",
+            countyName: "通海县",
+          },
+          {
+            countyCode: "530421",
+            countyName: "江川区",
+          },
+          {
+            countyCode: "530424",
+            countyName: "华宁县",
+          },
+          {
+            countyCode: "530426",
+            countyName: "峨山彝族自治县",
+          },
+          {
+            countyCode: "530402",
+            countyName: "红塔区",
+          },
+          {
+            countyCode: "530422",
+            countyName: "澄江县",
+          },
+          {
+            countyCode: "530427",
+            countyName: "新平彝族傣族自治县",
+          },
+          {
+            countyCode: "530428",
+            countyName: "元江哈尼族彝族傣族自治县",
+          },
+        ],
+      },
+      {
+        cityCode: "533100",
+        cityName: "德宏傣族景颇族自治州",
+        county: [
+          {
+            countyCode: "533124",
+            countyName: "陇川县",
+          },
+          {
+            countyCode: "533122",
+            countyName: "梁河县",
+          },
+          {
+            countyCode: "533123",
+            countyName: "盈江县",
+          },
+          {
+            countyCode: "533103",
+            countyName: "芒市",
+          },
+          {
+            countyCode: "533102",
+            countyName: "瑞丽市",
+          },
+        ],
+      },
+      {
+        cityCode: "532900",
+        cityName: "大理白族自治州",
+        county: [
+          {
+            countyCode: "532927",
+            countyName: "巍山彝族回族自治县",
+          },
+          {
+            countyCode: "532931",
+            countyName: "剑川县",
+          },
+          {
+            countyCode: "532923",
+            countyName: "祥云县",
+          },
+          {
+            countyCode: "532932",
+            countyName: "鹤庆县",
+          },
+          {
+            countyCode: "532928",
+            countyName: "永平县",
+          },
+          {
+            countyCode: "532929",
+            countyName: "云龙县",
+          },
+          {
+            countyCode: "532930",
+            countyName: "洱源县",
+          },
+          {
+            countyCode: "532924",
+            countyName: "宾川县",
+          },
+          {
+            countyCode: "532925",
+            countyName: "弥渡县",
+          },
+          {
+            countyCode: "532926",
+            countyName: "南涧彝族自治县",
+          },
+          {
+            countyCode: "532901",
+            countyName: "大理市",
+          },
+          {
+            countyCode: "532922",
+            countyName: "漾濞彝族自治县",
+          },
+        ],
+      },
+      {
+        cityCode: "530100",
+        cityName: "昆明市",
+        county: [
+          {
+            countyCode: "530124",
+            countyName: "富民县",
+          },
+          {
+            countyCode: "530114",
+            countyName: "呈贡区",
+          },
+          {
+            countyCode: "530126",
+            countyName: "石林彝族自治县",
+          },
+          {
+            countyCode: "530181",
+            countyName: "安宁市",
+          },
+          {
+            countyCode: "530128",
+            countyName: "禄劝彝族苗族自治县",
+          },
+          {
+            countyCode: "530125",
+            countyName: "宜良县",
+          },
+          {
+            countyCode: "530103",
+            countyName: "盘龙区",
+          },
+          {
+            countyCode: "530102",
+            countyName: "五华区",
+          },
+          {
+            countyCode: "530122",
+            countyName: "晋宁区",
+          },
+          {
+            countyCode: "530113",
+            countyName: "东川区",
+          },
+          {
+            countyCode: "530111",
+            countyName: "官渡区",
+          },
+          {
+            countyCode: "530127",
+            countyName: "嵩明县",
+          },
+          {
+            countyCode: "530112",
+            countyName: "西山区",
+          },
+          {
+            countyCode: "530129",
+            countyName: "寻甸回族彝族自治县",
+          },
+        ],
+      },
+      {
+        cityCode: "530900",
+        cityName: "临沧市",
+        county: [
+          {
+            countyCode: "530921",
+            countyName: "凤庆县",
+          },
+          {
+            countyCode: "530926",
+            countyName: "耿马傣族佤族自治县",
+          },
+          {
+            countyCode: "530922",
+            countyName: "云县",
+          },
+          {
+            countyCode: "530924",
+            countyName: "镇康县",
+          },
+          {
+            countyCode: "530923",
+            countyName: "永德县",
+          },
+          {
+            countyCode: "530927",
+            countyName: "沧源佤族自治县",
+          },
+          {
+            countyCode: "530925",
+            countyName: "双江拉祜族佤族布朗族傣族自治县",
+          },
+          {
+            countyCode: "530902",
+            countyName: "临翔区",
+          },
+        ],
+      },
+      {
+        cityCode: "532300",
+        cityName: "楚雄彝族自治州",
+        county: [
+          {
+            countyCode: "532329",
+            countyName: "武定县",
+          },
+          {
+            countyCode: "532324",
+            countyName: "南华县",
+          },
+          {
+            countyCode: "532327",
+            countyName: "永仁县",
+          },
+          {
+            countyCode: "532328",
+            countyName: "元谋县",
+          },
+          {
+            countyCode: "532331",
+            countyName: "禄丰县",
+          },
+          {
+            countyCode: "532326",
+            countyName: "大姚县",
+          },
+          {
+            countyCode: "532325",
+            countyName: "姚安县",
+          },
+          {
+            countyCode: "532301",
+            countyName: "楚雄市",
+          },
+          {
+            countyCode: "532323",
+            countyName: "牟定县",
+          },
+          {
+            countyCode: "532322",
+            countyName: "双柏县",
+          },
+        ],
+      },
+      {
+        cityCode: "532800",
+        cityName: "西双版纳傣族自治州",
+        county: [
+          {
+            countyCode: "532823",
+            countyName: "勐腊县",
+          },
+          {
+            countyCode: "532801",
+            countyName: "景洪市",
+          },
+          {
+            countyCode: "532822",
+            countyName: "勐海县",
+          },
+        ],
+      },
+      {
+        cityCode: "532600",
+        cityName: "文山壮族苗族自治州",
+        county: [
+          {
+            countyCode: "532601",
+            countyName: "文山市",
+          },
+          {
+            countyCode: "532623",
+            countyName: "西畴县",
+          },
+          {
+            countyCode: "532627",
+            countyName: "广南县",
+          },
+          {
+            countyCode: "532625",
+            countyName: "马关县",
+          },
+          {
+            countyCode: "532622",
+            countyName: "砚山县",
+          },
+          {
+            countyCode: "532628",
+            countyName: "富宁县",
+          },
+          {
+            countyCode: "532624",
+            countyName: "麻栗坡县",
+          },
+          {
+            countyCode: "532626",
+            countyName: "丘北县",
+          },
+        ],
+      },
+      {
+        cityCode: "530300",
+        cityName: "曲靖市",
+        county: [
+          {
+            countyCode: "530302",
+            countyName: "麒麟区",
+          },
+          {
+            countyCode: "530325",
+            countyName: "富源县",
+          },
+          {
+            countyCode: "530326",
+            countyName: "会泽县",
+          },
+          {
+            countyCode: "530324",
+            countyName: "罗平县",
+          },
+          {
+            countyCode: "530328",
+            countyName: "沾益区",
+          },
+          {
+            countyCode: "530323",
+            countyName: "师宗县",
+          },
+          {
+            countyCode: "530321",
+            countyName: "马龙区",
+          },
+          {
+            countyCode: "530322",
+            countyName: "陆良县",
+          },
+          {
+            countyCode: "530381",
+            countyName: "宣威市",
+          },
+        ],
+      },
+      {
+        cityCode: "533400",
+        cityName: "迪庆藏族自治州",
+        county: [
+          {
+            countyCode: "533421",
+            countyName: "香格里拉市",
+          },
+          {
+            countyCode: "533422",
+            countyName: "德钦县",
+          },
+          {
+            countyCode: "533423",
+            countyName: "维西傈僳族自治县",
+          },
+        ],
+      },
+      {
+        cityCode: "530600",
+        cityName: "昭通市",
+        county: [
+          {
+            countyCode: "530629",
+            countyName: "威信县",
+          },
+          {
+            countyCode: "530624",
+            countyName: "大关县",
+          },
+          {
+            countyCode: "530630",
+            countyName: "水富县",
+          },
+          {
+            countyCode: "530626",
+            countyName: "绥江县",
+          },
+          {
+            countyCode: "530628",
+            countyName: "彝良县",
+          },
+          {
+            countyCode: "530623",
+            countyName: "盐津县",
+          },
+          {
+            countyCode: "530602",
+            countyName: "昭阳区",
+          },
+          {
+            countyCode: "530621",
+            countyName: "鲁甸县",
+          },
+          {
+            countyCode: "530627",
+            countyName: "镇雄县",
+          },
+          {
+            countyCode: "530625",
+            countyName: "永善县",
+          },
+          {
+            countyCode: "530622",
+            countyName: "巧家县",
+          },
+        ],
+      },
+      {
+        cityCode: "533300",
+        cityName: "怒江傈僳族自治州",
+        county: [
+          {
+            countyCode: "533323",
+            countyName: "福贡县",
+          },
+          {
+            countyCode: "533324",
+            countyName: "贡山独龙族怒族自治县",
+          },
+          {
+            countyCode: "533321",
+            countyName: "泸水市",
+          },
+          {
+            countyCode: "533325",
+            countyName: "兰坪白族普米族自治县",
+          },
+        ],
+      },
+      {
+        cityCode: "530700",
+        cityName: "丽江市",
+        county: [
+          {
+            countyCode: "530724",
+            countyName: "宁蒗彝族自治县",
+          },
+          {
+            countyCode: "530722",
+            countyName: "永胜县",
+          },
+          {
+            countyCode: "530702",
+            countyName: "古城区",
+          },
+          {
+            countyCode: "530721",
+            countyName: "玉龙纳西族自治县",
+          },
+          {
+            countyCode: "530723",
+            countyName: "华坪县",
+          },
+        ],
+      },
+      {
+        cityCode: "530800",
+        cityName: "普洱市",
+        county: [
+          {
+            countyCode: "530822",
+            countyName: "墨江哈尼族自治县",
+          },
+          {
+            countyCode: "530823",
+            countyName: "景东彝族自治县",
+          },
+          {
+            countyCode: "530827",
+            countyName: "孟连傣族拉祜族佤族自治县",
+          },
+          {
+            countyCode: "530825",
+            countyName: "镇沅彝族哈尼族拉祜族自治县",
+          },
+          {
+            countyCode: "530828",
+            countyName: "澜沧拉祜族自治县",
+          },
+          {
+            countyCode: "530829",
+            countyName: "西盟佤族自治县",
+          },
+          {
+            countyCode: "530821",
+            countyName: "宁洱哈尼族彝族自治县",
+          },
+          {
+            countyCode: "530802",
+            countyName: "思茅区",
+          },
+          {
+            countyCode: "530826",
+            countyName: "江城哈尼族彝族自治县",
+          },
+          {
+            countyCode: "530824",
+            countyName: "景谷傣族彝族自治县",
+          },
+        ],
+      },
+      {
+        cityCode: "532500",
+        cityName: "红河哈尼族彝族自治州",
+        county: [
+          {
+            countyCode: "532525",
+            countyName: "石屏县",
+          },
+          {
+            countyCode: "532530",
+            countyName: "金平苗族瑶族傣族自治县",
+          },
+          {
+            countyCode: "532503",
+            countyName: "蒙自市",
+          },
+          {
+            countyCode: "532528",
+            countyName: "元阳县",
+          },
+          {
+            countyCode: "532527",
+            countyName: "泸西县",
+          },
+          {
+            countyCode: "532502",
+            countyName: "开远市",
+          },
+          {
+            countyCode: "532524",
+            countyName: "建水县",
+          },
+          {
+            countyCode: "532532",
+            countyName: "河口瑶族自治县",
+          },
+          {
+            countyCode: "532529",
+            countyName: "红河县",
+          },
+          {
+            countyCode: "532531",
+            countyName: "绿春县",
+          },
+          {
+            countyCode: "532501",
+            countyName: "个旧市",
+          },
+          {
+            countyCode: "532523",
+            countyName: "屏边苗族自治县",
+          },
+          {
+            countyCode: "532526",
+            countyName: "弥勒市",
+          },
+        ],
+      },
+      {
+        cityCode: "530500",
+        cityName: "保山市",
+        county: [
+          {
+            countyCode: "530523",
+            countyName: "龙陵县",
+          },
+          {
+            countyCode: "530522",
+            countyName: "腾冲市",
+          },
+          {
+            countyCode: "530521",
+            countyName: "施甸县",
+          },
+          {
+            countyCode: "530502",
+            countyName: "隆阳区",
+          },
+          {
+            countyCode: "530524",
+            countyName: "昌宁县",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "540000",
+    provinceName: "西藏自治区",
+    city: [
+      {
+        cityCode: "542100",
+        cityName: "昌都市",
+        county: [
+          {
+            countyCode: "542122",
+            countyName: "江达县",
+          },
+          {
+            countyCode: "542129",
+            countyName: "芒康县",
+          },
+          {
+            countyCode: "542128",
+            countyName: "左贡县",
+          },
+          {
+            countyCode: "542126",
+            countyName: "察雅县",
+          },
+          {
+            countyCode: "542132",
+            countyName: "洛隆县",
+          },
+          {
+            countyCode: "542121",
+            countyName: "卡若区",
+          },
+          {
+            countyCode: "542125",
+            countyName: "丁青县",
+          },
+          {
+            countyCode: "542133",
+            countyName: "边坝县",
+          },
+          {
+            countyCode: "542123",
+            countyName: "贡觉县",
+          },
+          {
+            countyCode: "542127",
+            countyName: "八宿县",
+          },
+          {
+            countyCode: "542124",
+            countyName: "类乌齐县",
+          },
+        ],
+      },
+      {
+        cityCode: "542200",
+        cityName: "山南市",
+        county: [
+          {
+            countyCode: "542229",
+            countyName: "加查县",
+          },
+          {
+            countyCode: "542225",
+            countyName: "琼结县",
+          },
+          {
+            countyCode: "542232",
+            countyName: "错那县",
+          },
+          {
+            countyCode: "542221",
+            countyName: "乃东区",
+          },
+          {
+            countyCode: "542224",
+            countyName: "桑日县",
+          },
+          {
+            countyCode: "542222",
+            countyName: "扎囊县",
+          },
+          {
+            countyCode: "542227",
+            countyName: "措美县",
+          },
+          {
+            countyCode: "542223",
+            countyName: "贡嘎县",
+          },
+          {
+            countyCode: "542228",
+            countyName: "洛扎县",
+          },
+          {
+            countyCode: "542226",
+            countyName: "曲松县",
+          },
+          {
+            countyCode: "542233",
+            countyName: "浪卡子县",
+          },
+          {
+            countyCode: "542231",
+            countyName: "隆子县",
+          },
+        ],
+      },
+      {
+        cityCode: "542400",
+        cityName: "那曲市",
+        county: [
+          {
+            countyCode: "542426",
+            countyName: "申扎县",
+          },
+          {
+            countyCode: "542423",
+            countyName: "比如县",
+          },
+          {
+            countyCode: "542430",
+            countyName: "尼玛县",
+          },
+          {
+            countyCode: "542421",
+            countyName: "色尼区",
+          },
+          {
+            countyCode: "542422",
+            countyName: "嘉黎县",
+          },
+          {
+            countyCode: "542424",
+            countyName: "聂荣县",
+          },
+          {
+            countyCode: "542427",
+            countyName: "索县",
+          },
+          {
+            countyCode: "542425",
+            countyName: "安多县",
+          },
+          {
+            countyCode: "542428",
+            countyName: "班戈县",
+          },
+          {
+            countyCode: "542429",
+            countyName: "巴青县",
+          },
+        ],
+      },
+      {
+        cityCode: "542600",
+        cityName: "林芝市",
+        county: [
+          {
+            countyCode: "542623",
+            countyName: "米林县",
+          },
+          {
+            countyCode: "542626",
+            countyName: "察隅县",
+          },
+          {
+            countyCode: "542627",
+            countyName: "朗县",
+          },
+          {
+            countyCode: "542622",
+            countyName: "工布江达县",
+          },
+          {
+            countyCode: "542625",
+            countyName: "波密县",
+          },
+          {
+            countyCode: "542624",
+            countyName: "墨脱县",
+          },
+          {
+            countyCode: "542621",
+            countyName: "巴宜区",
+          },
+        ],
+      },
+      {
+        cityCode: "540100",
+        cityName: "拉萨市",
+        county: [
+          {
+            countyCode: "540121",
+            countyName: "林周县",
+          },
+          {
+            countyCode: "540124",
+            countyName: "曲水县",
+          },
+          {
+            countyCode: "540126",
+            countyName: "达孜区",
+          },
+          {
+            countyCode: "540125",
+            countyName: "堆龙德庆区",
+          },
+          {
+            countyCode: "540122",
+            countyName: "当雄县",
+          },
+          {
+            countyCode: "540127",
+            countyName: "墨竹工卡县",
+          },
+          {
+            countyCode: "540123",
+            countyName: "尼木县",
+          },
+          {
+            countyCode: "540102",
+            countyName: "城关区",
+          },
+        ],
+      },
+      {
+        cityCode: "542300",
+        cityName: "日喀则市",
+        county: [
+          {
+            countyCode: "542335",
+            countyName: "吉隆县",
+          },
+          {
+            countyCode: "542323",
+            countyName: "江孜县",
+          },
+          {
+            countyCode: "542331",
+            countyName: "康马县",
+          },
+          {
+            countyCode: "542322",
+            countyName: "南木林县",
+          },
+          {
+            countyCode: "542338",
+            countyName: "岗巴县",
+          },
+          {
+            countyCode: "542336",
+            countyName: "聂拉木县",
+          },
+          {
+            countyCode: "542328",
+            countyName: "谢通门县",
+          },
+          {
+            countyCode: "542325",
+            countyName: "萨迦县",
+          },
+          {
+            countyCode: "542329",
+            countyName: "白朗县",
+          },
+          {
+            countyCode: "542326",
+            countyName: "拉孜县",
+          },
+          {
+            countyCode: "542332",
+            countyName: "定结县",
+          },
+          {
+            countyCode: "542327",
+            countyName: "昂仁县",
+          },
+          {
+            countyCode: "542334",
+            countyName: "亚东县",
+          },
+          {
+            countyCode: "542337",
+            countyName: "萨嘎县",
+          },
+          {
+            countyCode: "542324",
+            countyName: "定日县",
+          },
+          {
+            countyCode: "542333",
+            countyName: "仲巴县",
+          },
+          {
+            countyCode: "542301",
+            countyName: "桑珠孜区",
+          },
+          {
+            countyCode: "542330",
+            countyName: "仁布县",
+          },
+        ],
+      },
+      {
+        cityCode: "542500",
+        cityName: "阿里地区",
+        county: [
+          {
+            countyCode: "542523",
+            countyName: "噶尔县",
+          },
+          {
+            countyCode: "542525",
+            countyName: "革吉县",
+          },
+          {
+            countyCode: "542524",
+            countyName: "日土县",
+          },
+          {
+            countyCode: "542527",
+            countyName: "措勤县",
+          },
+          {
+            countyCode: "542521",
+            countyName: "普兰县",
+          },
+          {
+            countyCode: "542526",
+            countyName: "改则县",
+          },
+          {
+            countyCode: "542522",
+            countyName: "札达县",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "610000",
+    provinceName: "陕西省",
+    city: [
+      {
+        cityCode: "610800",
+        cityName: "榆林市",
+        county: [
+          {
+            countyCode: "610831",
+            countyName: "子洲县",
+          },
+          {
+            countyCode: "610825",
+            countyName: "定边县",
+          },
+          {
+            countyCode: "610827",
+            countyName: "米脂县",
+          },
+          {
+            countyCode: "610821",
+            countyName: "神木市",
+          },
+          {
+            countyCode: "610829",
+            countyName: "吴堡县",
+          },
+          {
+            countyCode: "610822",
+            countyName: "府谷县",
+          },
+          {
+            countyCode: "610830",
+            countyName: "清涧县",
+          },
+          {
+            countyCode: "610823",
+            countyName: "横山区",
+          },
+          {
+            countyCode: "610824",
+            countyName: "靖边县",
+          },
+          {
+            countyCode: "610826",
+            countyName: "绥德县",
+          },
+          {
+            countyCode: "610802",
+            countyName: "榆阳区",
+          },
+          {
+            countyCode: "610828",
+            countyName: "佳县",
+          },
+        ],
+      },
+      {
+        cityCode: "610200",
+        cityName: "铜川市",
+        county: [
+          {
+            countyCode: "610202",
+            countyName: "王益区",
+          },
+          {
+            countyCode: "610203",
+            countyName: "印台区",
+          },
+          {
+            countyCode: "610204",
+            countyName: "耀州区",
+          },
+          {
+            countyCode: "610222",
+            countyName: "宜君县",
+          },
+        ],
+      },
+      {
+        cityCode: "611000",
+        cityName: "商洛市",
+        county: [
+          {
+            countyCode: "611022",
+            countyName: "丹凤县",
+          },
+          {
+            countyCode: "611023",
+            countyName: "商南县",
+          },
+          {
+            countyCode: "611026",
+            countyName: "柞水县",
+          },
+          {
+            countyCode: "611025",
+            countyName: "镇安县",
+          },
+          {
+            countyCode: "611024",
+            countyName: "山阳县",
+          },
+          {
+            countyCode: "611021",
+            countyName: "洛南县",
+          },
+          {
+            countyCode: "611002",
+            countyName: "商州区",
+          },
+        ],
+      },
+      {
+        cityCode: "610500",
+        cityName: "渭南市",
+        county: [
+          {
+            countyCode: "610582",
+            countyName: "华阴市",
+          },
+          {
+            countyCode: "610524",
+            countyName: "合阳县",
+          },
+          {
+            countyCode: "610521",
+            countyName: "华州区",
+          },
+          {
+            countyCode: "610581",
+            countyName: "韩城市",
+          },
+          {
+            countyCode: "610526",
+            countyName: "蒲城县",
+          },
+          {
+            countyCode: "610527",
+            countyName: "白水县",
+          },
+          {
+            countyCode: "610522",
+            countyName: "潼关县",
+          },
+          {
+            countyCode: "610528",
+            countyName: "富平县",
+          },
+          {
+            countyCode: "610523",
+            countyName: "大荔县",
+          },
+          {
+            countyCode: "610502",
+            countyName: "临渭区",
+          },
+          {
+            countyCode: "610525",
+            countyName: "澄城县",
+          },
+        ],
+      },
+      {
+        cityCode: "610300",
+        cityName: "宝鸡市",
+        county: [
+          {
+            countyCode: "610328",
+            countyName: "千阳县",
+          },
+          {
+            countyCode: "610330",
+            countyName: "凤县",
+          },
+          {
+            countyCode: "610329",
+            countyName: "麟游县",
+          },
+          {
+            countyCode: "610323",
+            countyName: "岐山县",
+          },
+          {
+            countyCode: "610302",
+            countyName: "渭滨区",
+          },
+          {
+            countyCode: "610327",
+            countyName: "陇县",
+          },
+          {
+            countyCode: "610322",
+            countyName: "凤翔县",
+          },
+          {
+            countyCode: "610324",
+            countyName: "扶风县",
+          },
+          {
+            countyCode: "610304",
+            countyName: "陈仓区",
+          },
+          {
+            countyCode: "610303",
+            countyName: "金台区",
+          },
+          {
+            countyCode: "610326",
+            countyName: "眉县",
+          },
+          {
+            countyCode: "610331",
+            countyName: "太白县",
+          },
+        ],
+      },
+      {
+        cityCode: "610900",
+        cityName: "安康市",
+        county: [
+          {
+            countyCode: "610927",
+            countyName: "镇坪县",
+          },
+          {
+            countyCode: "610923",
+            countyName: "宁陕县",
+          },
+          {
+            countyCode: "610922",
+            countyName: "石泉县",
+          },
+          {
+            countyCode: "610921",
+            countyName: "汉阴县",
+          },
+          {
+            countyCode: "610925",
+            countyName: "岚皋县",
+          },
+          {
+            countyCode: "610926",
+            countyName: "平利县",
+          },
+          {
+            countyCode: "610928",
+            countyName: "旬阳县",
+          },
+          {
+            countyCode: "610929",
+            countyName: "白河县",
+          },
+          {
+            countyCode: "610902",
+            countyName: "汉滨区",
+          },
+          {
+            countyCode: "610924",
+            countyName: "紫阳县",
+          },
+        ],
+      },
+      {
+        cityCode: "610700",
+        cityName: "汉中市",
+        county: [
+          {
+            countyCode: "610724",
+            countyName: "西乡县",
+          },
+          {
+            countyCode: "610721",
+            countyName: "南郑区",
+          },
+          {
+            countyCode: "610722",
+            countyName: "城固县",
+          },
+          {
+            countyCode: "610727",
+            countyName: "略阳县",
+          },
+          {
+            countyCode: "610728",
+            countyName: "镇巴县",
+          },
+          {
+            countyCode: "610702",
+            countyName: "汉台区",
+          },
+          {
+            countyCode: "610729",
+            countyName: "留坝县",
+          },
+          {
+            countyCode: "610723",
+            countyName: "洋县",
+          },
+          {
+            countyCode: "610730",
+            countyName: "佛坪县",
+          },
+          {
+            countyCode: "610726",
+            countyName: "宁强县",
+          },
+          {
+            countyCode: "610725",
+            countyName: "勉县",
+          },
+        ],
+      },
+      {
+        cityCode: "610600",
+        cityName: "延安市",
+        county: [
+          {
+            countyCode: "610628",
+            countyName: "富县",
+          },
+          {
+            countyCode: "610631",
+            countyName: "黄龙县",
+          },
+          {
+            countyCode: "610602",
+            countyName: "宝塔区",
+          },
+          {
+            countyCode: "610630",
+            countyName: "宜川县",
+          },
+          {
+            countyCode: "610624",
+            countyName: "安塞区",
+          },
+          {
+            countyCode: "610629",
+            countyName: "洛川县",
+          },
+          {
+            countyCode: "610621",
+            countyName: "延长县",
+          },
+          {
+            countyCode: "610632",
+            countyName: "黄陵县",
+          },
+          {
+            countyCode: "610626",
+            countyName: "吴起县",
+          },
+          {
+            countyCode: "610623",
+            countyName: "子长县",
+          },
+          {
+            countyCode: "610627",
+            countyName: "甘泉县",
+          },
+          {
+            countyCode: "610625",
+            countyName: "志丹县",
+          },
+          {
+            countyCode: "610622",
+            countyName: "延川县",
+          },
+        ],
+      },
+      {
+        cityCode: "610100",
+        cityName: "西安市",
+        county: [
+          {
+            countyCode: "610116",
+            countyName: "长安区",
+          },
+          {
+            countyCode: "610112",
+            countyName: "未央区",
+          },
+          {
+            countyCode: "610102",
+            countyName: "新城区",
+          },
+          {
+            countyCode: "610114",
+            countyName: "阎良区",
+          },
+          {
+            countyCode: "610111",
+            countyName: "灞桥区",
+          },
+          {
+            countyCode: "610126",
+            countyName: "高陵区",
+          },
+          {
+            countyCode: "610122",
+            countyName: "蓝田县",
+          },
+          {
+            countyCode: "610103",
+            countyName: "碑林区",
+          },
+          {
+            countyCode: "610115",
+            countyName: "临潼区",
+          },
+          {
+            countyCode: "610113",
+            countyName: "雁塔区",
+          },
+          {
+            countyCode: "610124",
+            countyName: "周至县",
+          },
+          {
+            countyCode: "610104",
+            countyName: "莲湖区",
+          },
+          {
+            countyCode: "610125",
+            countyName: "鄠邑区",
+          },
+        ],
+      },
+      {
+        cityCode: "610400",
+        cityName: "咸阳市",
+        county: [
+          {
+            countyCode: "610430",
+            countyName: "淳化县",
+          },
+          {
+            countyCode: "610423",
+            countyName: "泾阳县",
+          },
+          {
+            countyCode: "610481",
+            countyName: "兴平市",
+          },
+          {
+            countyCode: "610422",
+            countyName: "三原县",
+          },
+          {
+            countyCode: "610424",
+            countyName: "乾县",
+          },
+          {
+            countyCode: "610426",
+            countyName: "永寿县",
+          },
+          {
+            countyCode: "610427",
+            countyName: "彬州市",
+          },
+          {
+            countyCode: "610402",
+            countyName: "秦都区",
+          },
+          {
+            countyCode: "610404",
+            countyName: "渭城区",
+          },
+          {
+            countyCode: "610403",
+            countyName: "杨陵区",
+          },
+          {
+            countyCode: "610431",
+            countyName: "武功县",
+          },
+          {
+            countyCode: "610428",
+            countyName: "长武县",
+          },
+          {
+            countyCode: "610425",
+            countyName: "礼泉县",
+          },
+          {
+            countyCode: "610429",
+            countyName: "旬邑县",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "620000",
+    provinceName: "甘肃省",
+    city: [
+      {
+        cityCode: "620500",
+        cityName: "天水市",
+        county: [
+          {
+            countyCode: "620524",
+            countyName: "武山县",
+          },
+          {
+            countyCode: "620502",
+            countyName: "秦州区",
+          },
+          {
+            countyCode: "620521",
+            countyName: "清水县",
+          },
+          {
+            countyCode: "620523",
+            countyName: "甘谷县",
+          },
+          {
+            countyCode: "620522",
+            countyName: "秦安县",
+          },
+          {
+            countyCode: "620503",
+            countyName: "麦积区",
+          },
+          {
+            countyCode: "620525",
+            countyName: "张家川回族自治县",
+          },
+        ],
+      },
+      {
+        cityCode: "620300",
+        cityName: "金昌市",
+        county: [
+          {
+            countyCode: "620302",
+            countyName: "金川区",
+          },
+          {
+            countyCode: "620321",
+            countyName: "永昌县",
+          },
+        ],
+      },
+      {
+        cityCode: "620600",
+        cityName: "武威市",
+        county: [
+          {
+            countyCode: "620602",
+            countyName: "凉州区",
+          },
+          {
+            countyCode: "620623",
+            countyName: "天祝藏族自治县",
+          },
+          {
+            countyCode: "620622",
+            countyName: "古浪县",
+          },
+          {
+            countyCode: "620621",
+            countyName: "民勤县",
+          },
+        ],
+      },
+      {
+        cityCode: "620700",
+        cityName: "张掖市",
+        county: [
+          {
+            countyCode: "620702",
+            countyName: "甘州区",
+          },
+          {
+            countyCode: "620724",
+            countyName: "高台县",
+          },
+          {
+            countyCode: "620725",
+            countyName: "山丹县",
+          },
+          {
+            countyCode: "620723",
+            countyName: "临泽县",
+          },
+          {
+            countyCode: "620722",
+            countyName: "民乐县",
+          },
+          {
+            countyCode: "620721",
+            countyName: "肃南裕固族自治县",
+          },
+        ],
+      },
+      {
+        cityCode: "621200",
+        cityName: "陇南市",
+        county: [
+          {
+            countyCode: "621225",
+            countyName: "西和县",
+          },
+          {
+            countyCode: "621223",
+            countyName: "宕昌县",
+          },
+          {
+            countyCode: "621227",
+            countyName: "徽县",
+          },
+          {
+            countyCode: "621224",
+            countyName: "康县",
+          },
+          {
+            countyCode: "621221",
+            countyName: "成县",
+          },
+          {
+            countyCode: "621228",
+            countyName: "两当县",
+          },
+          {
+            countyCode: "621226",
+            countyName: "礼县",
+          },
+          {
+            countyCode: "621222",
+            countyName: "文县",
+          },
+          {
+            countyCode: "621202",
+            countyName: "武都区",
+          },
+        ],
+      },
+      {
+        cityCode: "620100",
+        cityName: "兰州市",
+        county: [
+          {
+            countyCode: "620121",
+            countyName: "永登县",
+          },
+          {
+            countyCode: "620111",
+            countyName: "红古区",
+          },
+          {
+            countyCode: "620103",
+            countyName: "七里河区",
+          },
+          {
+            countyCode: "620122",
+            countyName: "皋兰县",
+          },
+          {
+            countyCode: "620104",
+            countyName: "西固区",
+          },
+          {
+            countyCode: "620102",
+            countyName: "城关区",
+          },
+          {
+            countyCode: "620105",
+            countyName: "安宁区",
+          },
+          {
+            countyCode: "620123",
+            countyName: "榆中县",
+          },
+        ],
+      },
+      {
+        cityCode: "621000",
+        cityName: "庆阳市",
+        county: [
+          {
+            countyCode: "621025",
+            countyName: "正宁县",
+          },
+          {
+            countyCode: "621026",
+            countyName: "宁县",
+          },
+          {
+            countyCode: "621027",
+            countyName: "镇原县",
+          },
+          {
+            countyCode: "621023",
+            countyName: "华池县",
+          },
+          {
+            countyCode: "621002",
+            countyName: "西峰区",
+          },
+          {
+            countyCode: "621024",
+            countyName: "合水县",
+          },
+          {
+            countyCode: "621022",
+            countyName: "环县",
+          },
+          {
+            countyCode: "621021",
+            countyName: "庆城县",
+          },
+        ],
+      },
+      {
+        cityCode: "620200",
+        cityName: "嘉峪关市",
+        county: [
+          {
+            countyCode: "620200-1",
+            countyName: "嘉峪关市",
+          },
+        ],
+      },
+      {
+        cityCode: "620800",
+        cityName: "平凉市",
+        county: [
+          {
+            countyCode: "620826",
+            countyName: "静宁县",
+          },
+          {
+            countyCode: "620822",
+            countyName: "灵台县",
+          },
+          {
+            countyCode: "620823",
+            countyName: "崇信县",
+          },
+          {
+            countyCode: "620825",
+            countyName: "庄浪县",
+          },
+          {
+            countyCode: "620824",
+            countyName: "华亭县",
+          },
+          {
+            countyCode: "620821",
+            countyName: "泾川县",
+          },
+          {
+            countyCode: "620802",
+            countyName: "崆峒区",
+          },
+        ],
+      },
+      {
+        cityCode: "623000",
+        cityName: "甘南藏族自治州",
+        county: [
+          {
+            countyCode: "623024",
+            countyName: "迭部县",
+          },
+          {
+            countyCode: "623026",
+            countyName: "碌曲县",
+          },
+          {
+            countyCode: "623022",
+            countyName: "卓尼县",
+          },
+          {
+            countyCode: "623021",
+            countyName: "临潭县",
+          },
+          {
+            countyCode: "623025",
+            countyName: "玛曲县",
+          },
+          {
+            countyCode: "623001",
+            countyName: "合作市",
+          },
+          {
+            countyCode: "623027",
+            countyName: "夏河县",
+          },
+          {
+            countyCode: "623023",
+            countyName: "舟曲县",
+          },
+        ],
+      },
+      {
+        cityCode: "620400",
+        cityName: "白银市",
+        county: [
+          {
+            countyCode: "620422",
+            countyName: "会宁县",
+          },
+          {
+            countyCode: "620403",
+            countyName: "平川区",
+          },
+          {
+            countyCode: "620423",
+            countyName: "景泰县",
+          },
+          {
+            countyCode: "620421",
+            countyName: "靖远县",
+          },
+          {
+            countyCode: "620402",
+            countyName: "白银区",
+          },
+        ],
+      },
+      {
+        cityCode: "620900",
+        cityName: "酒泉市",
+        county: [
+          {
+            countyCode: "620921",
+            countyName: "金塔县",
+          },
+          {
+            countyCode: "620924",
+            countyName: "阿克塞哈萨克族自治县",
+          },
+          {
+            countyCode: "620923",
+            countyName: "肃北蒙古族自治县",
+          },
+          {
+            countyCode: "620922",
+            countyName: "瓜州县",
+          },
+          {
+            countyCode: "620981",
+            countyName: "玉门市",
+          },
+          {
+            countyCode: "620902",
+            countyName: "肃州区",
+          },
+          {
+            countyCode: "620982",
+            countyName: "敦煌市",
+          },
+        ],
+      },
+      {
+        cityCode: "621100",
+        cityName: "定西市",
+        county: [
+          {
+            countyCode: "621122",
+            countyName: "陇西县",
+          },
+          {
+            countyCode: "621123",
+            countyName: "渭源县",
+          },
+          {
+            countyCode: "621125",
+            countyName: "漳县",
+          },
+          {
+            countyCode: "621124",
+            countyName: "临洮县",
+          },
+          {
+            countyCode: "621121",
+            countyName: "通渭县",
+          },
+          {
+            countyCode: "621126",
+            countyName: "岷县",
+          },
+          {
+            countyCode: "621102",
+            countyName: "安定区",
+          },
+        ],
+      },
+      {
+        cityCode: "622900",
+        cityName: "临夏回族自治州",
+        county: [
+          {
+            countyCode: "622921",
+            countyName: "临夏县",
+          },
+          {
+            countyCode: "622925",
+            countyName: "和政县",
+          },
+          {
+            countyCode: "622924",
+            countyName: "广河县",
+          },
+          {
+            countyCode: "622901",
+            countyName: "临夏市",
+          },
+          {
+            countyCode: "622926",
+            countyName: "东乡族自治县",
+          },
+          {
+            countyCode: "622923",
+            countyName: "永靖县",
+          },
+          {
+            countyCode: "622927",
+            countyName: "积石山保安族东乡族撒拉族自治县",
+          },
+          {
+            countyCode: "622922",
+            countyName: "康乐县",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "630000",
+    provinceName: "青海省",
+    city: [
+      {
+        cityCode: "632200",
+        cityName: "海北藏族自治州",
+        county: [
+          {
+            countyCode: "632224",
+            countyName: "刚察县",
+          },
+          {
+            countyCode: "632222",
+            countyName: "祁连县",
+          },
+          {
+            countyCode: "632223",
+            countyName: "海晏县",
+          },
+          {
+            countyCode: "632221",
+            countyName: "门源回族自治县",
+          },
+        ],
+      },
+      {
+        cityCode: "632500",
+        cityName: "海南藏族自治州",
+        county: [
+          {
+            countyCode: "632522",
+            countyName: "同德县",
+          },
+          {
+            countyCode: "632525",
+            countyName: "贵南县",
+          },
+          {
+            countyCode: "632524",
+            countyName: "兴海县",
+          },
+          {
+            countyCode: "632523",
+            countyName: "贵德县",
+          },
+          {
+            countyCode: "632521",
+            countyName: "共和县",
+          },
+        ],
+      },
+      {
+        cityCode: "630100",
+        cityName: "西宁市",
+        county: [
+          {
+            countyCode: "630102",
+            countyName: "城东区",
+          },
+          {
+            countyCode: "630122",
+            countyName: "湟中县",
+          },
+          {
+            countyCode: "630105",
+            countyName: "城北区",
+          },
+          {
+            countyCode: "630121",
+            countyName: "大通回族土族自治县",
+          },
+          {
+            countyCode: "630103",
+            countyName: "城中区",
+          },
+          {
+            countyCode: "630104",
+            countyName: "城西区",
+          },
+          {
+            countyCode: "630123",
+            countyName: "湟源县",
+          },
+        ],
+      },
+      {
+        cityCode: "632700",
+        cityName: "玉树藏族自治州",
+        county: [
+          {
+            countyCode: "632726",
+            countyName: "曲麻莱县",
+          },
+          {
+            countyCode: "632721",
+            countyName: "玉树市",
+          },
+          {
+            countyCode: "632723",
+            countyName: "称多县",
+          },
+          {
+            countyCode: "632722",
+            countyName: "杂多县",
+          },
+          {
+            countyCode: "632725",
+            countyName: "囊谦县",
+          },
+          {
+            countyCode: "632724",
+            countyName: "治多县",
+          },
+        ],
+      },
+      {
+        cityCode: "632800",
+        cityName: "海西蒙古族藏族自治州",
+        county: [
+          {
+            countyCode: "632801",
+            countyName: "格尔木市",
+          },
+          {
+            countyCode: "632823",
+            countyName: "天峻县",
+          },
+          {
+            countyCode: "632802",
+            countyName: "德令哈市",
+          },
+          {
+            countyCode: "632822",
+            countyName: "都兰县",
+          },
+          {
+            countyCode: "632821",
+            countyName: "乌兰县",
+          },
+          {
+            countyCode: "632803",
+            countyName: "茫崖市",
+          },
+        ],
+      },
+      {
+        cityCode: "632100",
+        cityName: "海东市",
+        county: [
+          {
+            countyCode: "632128",
+            countyName: "循化撒拉族自治县",
+          },
+          {
+            countyCode: "632126",
+            countyName: "互助土族自治县",
+          },
+          {
+            countyCode: "632127",
+            countyName: "化隆回族自治县",
+          },
+          {
+            countyCode: "632122",
+            countyName: "民和回族土族自治县",
+          },
+          {
+            countyCode: "632121",
+            countyName: "平安区",
+          },
+          {
+            countyCode: "632123",
+            countyName: "乐都区",
+          },
+        ],
+      },
+      {
+        cityCode: "632300",
+        cityName: "黄南藏族自治州",
+        county: [
+          {
+            countyCode: "632322",
+            countyName: "尖扎县",
+          },
+          {
+            countyCode: "632323",
+            countyName: "泽库县",
+          },
+          {
+            countyCode: "632324",
+            countyName: "河南蒙古族自治县",
+          },
+          {
+            countyCode: "632321",
+            countyName: "同仁县",
+          },
+        ],
+      },
+      {
+        cityCode: "632600",
+        cityName: "果洛藏族自治州",
+        county: [
+          {
+            countyCode: "632625",
+            countyName: "久治县",
+          },
+          {
+            countyCode: "632623",
+            countyName: "甘德县",
+          },
+          {
+            countyCode: "632622",
+            countyName: "班玛县",
+          },
+          {
+            countyCode: "632626",
+            countyName: "玛多县",
+          },
+          {
+            countyCode: "632624",
+            countyName: "达日县",
+          },
+          {
+            countyCode: "632621",
+            countyName: "玛沁县",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "640000",
+    provinceName: "宁夏回族自治区",
+    city: [
+      {
+        cityCode: "640200",
+        cityName: "石嘴山市",
+        county: [
+          {
+            countyCode: "640205",
+            countyName: "惠农区",
+          },
+          {
+            countyCode: "640202",
+            countyName: "大武口区",
+          },
+          {
+            countyCode: "640221",
+            countyName: "平罗县",
+          },
+        ],
+      },
+      {
+        cityCode: "640300",
+        cityName: "吴忠市",
+        county: [
+          {
+            countyCode: "640323",
+            countyName: "盐池县",
+          },
+          {
+            countyCode: "640381",
+            countyName: "青铜峡市",
+          },
+          {
+            countyCode: "640302",
+            countyName: "利通区",
+          },
+          {
+            countyCode: "640303",
+            countyName: "红寺堡区",
+          },
+          {
+            countyCode: "640324",
+            countyName: "同心县",
+          },
+        ],
+      },
+      {
+        cityCode: "640500",
+        cityName: "中卫市",
+        county: [
+          {
+            countyCode: "640522",
+            countyName: "海原县",
+          },
+          {
+            countyCode: "640502",
+            countyName: "沙坡头区",
+          },
+          {
+            countyCode: "640521",
+            countyName: "中宁县",
+          },
+        ],
+      },
+      {
+        cityCode: "640400",
+        cityName: "固原市",
+        county: [
+          {
+            countyCode: "640402",
+            countyName: "原州区",
+          },
+          {
+            countyCode: "640423",
+            countyName: "隆德县",
+          },
+          {
+            countyCode: "640424",
+            countyName: "泾源县",
+          },
+          {
+            countyCode: "640422",
+            countyName: "西吉县",
+          },
+          {
+            countyCode: "640425",
+            countyName: "彭阳县",
+          },
+        ],
+      },
+      {
+        cityCode: "640100",
+        cityName: "银川市",
+        county: [
+          {
+            countyCode: "640106",
+            countyName: "金凤区",
+          },
+          {
+            countyCode: "640105",
+            countyName: "西夏区",
+          },
+          {
+            countyCode: "640122",
+            countyName: "贺兰县",
+          },
+          {
+            countyCode: "640104",
+            countyName: "兴庆区",
+          },
+          {
+            countyCode: "640181",
+            countyName: "灵武市",
+          },
+          {
+            countyCode: "640121",
+            countyName: "永宁县",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "650000",
+    provinceName: "新疆维吾尔自治区",
+    city: [
+      {
+        cityCode: "650200",
+        cityName: "克拉玛依市",
+        county: [
+          {
+            countyCode: "650203",
+            countyName: "克拉玛依区",
+          },
+          {
+            countyCode: "650205",
+            countyName: "乌尔禾区",
+          },
+          {
+            countyCode: "650202",
+            countyName: "独山子区",
+          },
+          {
+            countyCode: "650204",
+            countyName: "白碱滩区",
+          },
+        ],
+      },
+      {
+        cityCode: "652800",
+        cityName: "巴音郭楞蒙古自治州",
+        county: [
+          {
+            countyCode: "652829",
+            countyName: "博湖县",
+          },
+          {
+            countyCode: "652824",
+            countyName: "若羌县",
+          },
+          {
+            countyCode: "652826",
+            countyName: "焉耆回族自治县",
+          },
+          {
+            countyCode: "652823",
+            countyName: "尉犁县",
+          },
+          {
+            countyCode: "652822",
+            countyName: "轮台县",
+          },
+          {
+            countyCode: "652825",
+            countyName: "且末县",
+          },
+          {
+            countyCode: "652801",
+            countyName: "库尔勒市",
+          },
+          {
+            countyCode: "652827",
+            countyName: "和静县",
+          },
+          {
+            countyCode: "652828",
+            countyName: "和硕县",
+          },
+        ],
+      },
+      {
+        cityCode: "654200",
+        cityName: "塔城地区",
+        county: [
+          {
+            countyCode: "654223",
+            countyName: "沙湾县",
+          },
+          {
+            countyCode: "654201",
+            countyName: "塔城市",
+          },
+          {
+            countyCode: "654226",
+            countyName: "和布克赛尔蒙古自治县",
+          },
+          {
+            countyCode: "654202",
+            countyName: "乌苏市",
+          },
+          {
+            countyCode: "654224",
+            countyName: "托里县",
+          },
+          {
+            countyCode: "654221",
+            countyName: "额敏县",
+          },
+          {
+            countyCode: "654225",
+            countyName: "裕民县",
+          },
+        ],
+      },
+      {
+        cityCode: "652200",
+        cityName: "哈密市",
+        county: [
+          {
+            countyCode: "652222",
+            countyName: "巴里坤哈萨克自治县",
+          },
+          {
+            countyCode: "652201",
+            countyName: "伊州区",
+          },
+          {
+            countyCode: "652223",
+            countyName: "伊吾县",
+          },
+        ],
+      },
+      {
+        cityCode: "654000",
+        cityName: "伊犁哈萨克自治州",
+        county: [
+          {
+            countyCode: "654027",
+            countyName: "特克斯县",
+          },
+          {
+            countyCode: "654024",
+            countyName: "巩留县",
+          },
+          {
+            countyCode: "654022",
+            countyName: "察布查尔锡伯自治县",
+          },
+          {
+            countyCode: "654004",
+            countyName: "霍尔果斯市",
+          },
+          {
+            countyCode: "654023",
+            countyName: "霍城县",
+          },
+          {
+            countyCode: "654028",
+            countyName: "尼勒克县",
+          },
+          {
+            countyCode: "654003",
+            countyName: "奎屯市",
+          },
+          {
+            countyCode: "654021",
+            countyName: "伊宁县",
+          },
+          {
+            countyCode: "654025",
+            countyName: "新源县",
+          },
+          {
+            countyCode: "654002",
+            countyName: "伊宁市",
+          },
+          {
+            countyCode: "654026",
+            countyName: "昭苏县",
+          },
+        ],
+      },
+      {
+        cityCode: "654300",
+        cityName: "阿勒泰地区",
+        county: [
+          {
+            countyCode: "654325",
+            countyName: "青河县",
+          },
+          {
+            countyCode: "654326",
+            countyName: "吉木乃县",
+          },
+          {
+            countyCode: "654321",
+            countyName: "布尔津县",
+          },
+          {
+            countyCode: "654323",
+            countyName: "福海县",
+          },
+          {
+            countyCode: "654301",
+            countyName: "阿勒泰市",
+          },
+          {
+            countyCode: "654322",
+            countyName: "富蕴县",
+          },
+          {
+            countyCode: "654324",
+            countyName: "哈巴河县",
+          },
+        ],
+      },
+      {
+        cityCode: "652100",
+        cityName: "吐鲁番市",
+        county: [
+          {
+            countyCode: "652122",
+            countyName: "鄯善县",
+          },
+          {
+            countyCode: "652101",
+            countyName: "高昌区",
+          },
+          {
+            countyCode: "652123",
+            countyName: "托克逊县",
+          },
+        ],
+      },
+      {
+        cityCode: "650100",
+        cityName: "乌鲁木齐市",
+        county: [
+          {
+            countyCode: "650121",
+            countyName: "乌鲁木齐县",
+          },
+          {
+            countyCode: "650109",
+            countyName: "米东区",
+          },
+          {
+            countyCode: "650103",
+            countyName: "沙依巴克区",
+          },
+          {
+            countyCode: "650105",
+            countyName: "水磨沟区",
+          },
+          {
+            countyCode: "650107",
+            countyName: "达坂城区",
+          },
+          {
+            countyCode: "650104",
+            countyName: "新市区",
+          },
+          {
+            countyCode: "650102",
+            countyName: "天山区",
+          },
+          {
+            countyCode: "650106",
+            countyName: "头屯河区",
+          },
+        ],
+      },
+      {
+        cityCode: "659002",
+        cityName: "阿拉尔市",
+        county: [
+          {
+            countyCode: "659002-1",
+            countyName: "阿拉尔市",
+          },
+        ],
+      },
+      {
+        cityCode: "653200",
+        cityName: "和田地区",
+        county: [
+          {
+            countyCode: "653222",
+            countyName: "墨玉县",
+          },
+          {
+            countyCode: "653226",
+            countyName: "于田县",
+          },
+          {
+            countyCode: "653223",
+            countyName: "皮山县",
+          },
+          {
+            countyCode: "653221",
+            countyName: "和田县",
+          },
+          {
+            countyCode: "653224",
+            countyName: "洛浦县",
+          },
+          {
+            countyCode: "653225",
+            countyName: "策勒县",
+          },
+          {
+            countyCode: "653227",
+            countyName: "民丰县",
+          },
+          {
+            countyCode: "653201",
+            countyName: "和田市",
+          },
+        ],
+      },
+      {
+        cityCode: "659003",
+        cityName: "图木舒克市",
+        county: [
+          {
+            countyCode: "659003-1",
+            countyName: "图木舒克市",
+          },
+        ],
+      },
+      {
+        cityCode: "695005",
+        cityName: "北屯市",
+        county: [
+          {
+            countyCode: "695005-1",
+            countyName: "北屯市",
+          },
+        ],
+      },
+      {
+        cityCode: "652300",
+        cityName: "昌吉回族自治州",
+        county: [
+          {
+            countyCode: "652302",
+            countyName: "阜康市",
+          },
+          {
+            countyCode: "652324",
+            countyName: "玛纳斯县",
+          },
+          {
+            countyCode: "652325",
+            countyName: "奇台县",
+          },
+          {
+            countyCode: "652323",
+            countyName: "呼图壁县",
+          },
+          {
+            countyCode: "652301",
+            countyName: "昌吉市",
+          },
+          {
+            countyCode: "652327",
+            countyName: "吉木萨尔县",
+          },
+          {
+            countyCode: "652328",
+            countyName: "木垒哈萨克自治县",
+          },
+          {
+            countyCode: "652303",
+            countyName: "准东开发区",
+          },
+        ],
+      },
+      {
+        cityCode: "653100",
+        cityName: "喀什地区",
+        county: [
+          {
+            countyCode: "653128",
+            countyName: "岳普湖县",
+          },
+          {
+            countyCode: "653129",
+            countyName: "伽师县",
+          },
+          {
+            countyCode: "653126",
+            countyName: "叶城县",
+          },
+          {
+            countyCode: "653122",
+            countyName: "疏勒县",
+          },
+          {
+            countyCode: "653124",
+            countyName: "泽普县",
+          },
+          {
+            countyCode: "653121",
+            countyName: "疏附县",
+          },
+          {
+            countyCode: "653131",
+            countyName: "塔什库尔干塔吉克自治县",
+          },
+          {
+            countyCode: "653130",
+            countyName: "巴楚县",
+          },
+          {
+            countyCode: "653123",
+            countyName: "英吉沙县",
+          },
+          {
+            countyCode: "653127",
+            countyName: "麦盖提县",
+          },
+          {
+            countyCode: "653125",
+            countyName: "莎车县",
+          },
+          {
+            countyCode: "653101",
+            countyName: "喀什市",
+          },
+        ],
+      },
+      {
+        cityCode: "659001",
+        cityName: "石河子市",
+        county: [
+          {
+            countyCode: "659001-1",
+            countyName: "石河子市",
+          },
+        ],
+      },
+      {
+        cityCode: "695006",
+        cityName: "铁门关市",
+        county: [
+          {
+            countyCode: "695006-1",
+            countyName: "铁门关市",
+          },
+        ],
+      },
+      {
+        cityCode: "652900",
+        cityName: "阿克苏地区",
+        county: [
+          {
+            countyCode: "652901",
+            countyName: "阿克苏市",
+          },
+          {
+            countyCode: "652922",
+            countyName: "温宿县",
+          },
+          {
+            countyCode: "652928",
+            countyName: "阿瓦提县",
+          },
+          {
+            countyCode: "652929",
+            countyName: "柯坪县",
+          },
+          {
+            countyCode: "652925",
+            countyName: "新和县",
+          },
+          {
+            countyCode: "652924",
+            countyName: "沙雅县",
+          },
+          {
+            countyCode: "652927",
+            countyName: "乌什县",
+          },
+          {
+            countyCode: "652923",
+            countyName: "库车县",
+          },
+          {
+            countyCode: "652926",
+            countyName: "拜城县",
+          },
+        ],
+      },
+      {
+        cityCode: "653000",
+        cityName: "克孜勒苏柯尔克孜自治州",
+        county: [
+          {
+            countyCode: "653023",
+            countyName: "阿合奇县",
+          },
+          {
+            countyCode: "653022",
+            countyName: "阿克陶县",
+          },
+          {
+            countyCode: "653001",
+            countyName: "阿图什市",
+          },
+          {
+            countyCode: "653024",
+            countyName: "乌恰县",
+          },
+        ],
+      },
+      {
+        cityCode: "659004",
+        cityName: "五家渠市",
+        county: [
+          {
+            countyCode: "659004-1",
+            countyName: "五家渠市",
+          },
+        ],
+      },
+      {
+        cityCode: "652700",
+        cityName: "博尔塔拉蒙古自治州",
+        county: [
+          {
+            countyCode: "652701",
+            countyName: "博乐市",
+          },
+          {
+            countyCode: "652723",
+            countyName: "温泉县",
+          },
+          {
+            countyCode: "652722",
+            countyName: "精河县",
+          },
+        ],
+      },
+      {
+        cityCode: "695007",
+        cityName: "双河市",
+        county: [
+          {
+            countyCode: "695007-1",
+            countyName: "双河市",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "330000",
+    provinceName: "浙江省",
+    city: [
+      {
+        cityCode: "330900",
+        cityName: "舟山市",
+        county: [
+          {
+            countyCode: "330922",
+            countyName: "嵊泗县",
+          },
+          {
+            countyCode: "330903",
+            countyName: "普陀区",
+          },
+          {
+            countyCode: "330902",
+            countyName: "定海区",
+          },
+          {
+            countyCode: "330921",
+            countyName: "岱山县",
+          },
+        ],
+      },
+      {
+        cityCode: "330800",
+        cityName: "衢州市",
+        county: [
+          {
+            countyCode: "330824",
+            countyName: "开化县",
+          },
+          {
+            countyCode: "330803",
+            countyName: "衢江区",
+          },
+          {
+            countyCode: "330881",
+            countyName: "江山市",
+          },
+          {
+            countyCode: "330802",
+            countyName: "柯城区",
+          },
+          {
+            countyCode: "330822",
+            countyName: "常山县",
+          },
+          {
+            countyCode: "330825",
+            countyName: "龙游县",
+          },
+        ],
+      },
+      {
+        cityCode: "330700",
+        cityName: "金华市",
+        county: [
+          {
+            countyCode: "330782",
+            countyName: "义乌市",
+          },
+          {
+            countyCode: "330784",
+            countyName: "永康市",
+          },
+          {
+            countyCode: "330727",
+            countyName: "磐安县",
+          },
+          {
+            countyCode: "330702",
+            countyName: "婺城区",
+          },
+          {
+            countyCode: "330726",
+            countyName: "浦江县",
+          },
+          {
+            countyCode: "330783",
+            countyName: "东阳市",
+          },
+          {
+            countyCode: "330781",
+            countyName: "兰溪市",
+          },
+          {
+            countyCode: "330723",
+            countyName: "武义县",
+          },
+          {
+            countyCode: "330703",
+            countyName: "金东区",
+          },
+        ],
+      },
+      {
+        cityCode: "330300",
+        cityName: "温州市",
+        county: [
+          {
+            countyCode: "330302",
+            countyName: "鹿城区",
+          },
+          {
+            countyCode: "330322",
+            countyName: "洞头区",
+          },
+          {
+            countyCode: "330381",
+            countyName: "瑞安市",
+          },
+          {
+            countyCode: "330329",
+            countyName: "泰顺县",
+          },
+          {
+            countyCode: "330324",
+            countyName: "永嘉县",
+          },
+          {
+            countyCode: "330304",
+            countyName: "瓯海区",
+          },
+          {
+            countyCode: "330327",
+            countyName: "苍南县",
+          },
+          {
+            countyCode: "330328",
+            countyName: "文成县",
+          },
+          {
+            countyCode: "330326",
+            countyName: "平阳县",
+          },
+          {
+            countyCode: "330382",
+            countyName: "乐清市",
+          },
+          {
+            countyCode: "330303",
+            countyName: "龙湾区",
+          },
+        ],
+      },
+      {
+        cityCode: "330200",
+        cityName: "宁波市",
+        county: [
+          {
+            countyCode: "330204",
+            countyName: "江东区",
+          },
+          {
+            countyCode: "330225",
+            countyName: "象山县",
+          },
+          {
+            countyCode: "330212",
+            countyName: "鄞州区",
+          },
+          {
+            countyCode: "330226",
+            countyName: "宁海县",
+          },
+          {
+            countyCode: "330283",
+            countyName: "奉化区",
+          },
+          {
+            countyCode: "330282",
+            countyName: "慈溪市",
+          },
+          {
+            countyCode: "330281",
+            countyName: "余姚市",
+          },
+          {
+            countyCode: "330211",
+            countyName: "镇海区",
+          },
+          {
+            countyCode: "330205",
+            countyName: "江北区",
+          },
+          {
+            countyCode: "330206",
+            countyName: "北仑区",
+          },
+          {
+            countyCode: "330203",
+            countyName: "海曙区",
+          },
+        ],
+      },
+      {
+        cityCode: "330100",
+        cityName: "杭州市",
+        county: [
+          {
+            countyCode: "330110",
+            countyName: "余杭区",
+          },
+          {
+            countyCode: "330106",
+            countyName: "西湖区",
+          },
+          {
+            countyCode: "330109",
+            countyName: "萧山区",
+          },
+          {
+            countyCode: "330185",
+            countyName: "临安区",
+          },
+          {
+            countyCode: "330122",
+            countyName: "桐庐县",
+          },
+          {
+            countyCode: "330103",
+            countyName: "下城区",
+          },
+          {
+            countyCode: "330182",
+            countyName: "建德市",
+          },
+          {
+            countyCode: "330102",
+            countyName: "上城区",
+          },
+          {
+            countyCode: "330127",
+            countyName: "淳安县",
+          },
+          {
+            countyCode: "330105",
+            countyName: "拱墅区",
+          },
+          {
+            countyCode: "330104",
+            countyName: "江干区",
+          },
+          {
+            countyCode: "330108",
+            countyName: "滨江区",
+          },
+          {
+            countyCode: "330183",
+            countyName: "富阳区",
+          },
+        ],
+      },
+      {
+        cityCode: "330400",
+        cityName: "嘉兴市",
+        county: [
+          {
+            countyCode: "330482",
+            countyName: "平湖市",
+          },
+          {
+            countyCode: "330402",
+            countyName: "南湖区",
+          },
+          {
+            countyCode: "330481",
+            countyName: "海宁市",
+          },
+          {
+            countyCode: "330421",
+            countyName: "嘉善县",
+          },
+          {
+            countyCode: "330424",
+            countyName: "海盐县",
+          },
+          {
+            countyCode: "330411",
+            countyName: "秀洲区",
+          },
+          {
+            countyCode: "330483",
+            countyName: "桐乡市",
+          },
+        ],
+      },
+      {
+        cityCode: "330600",
+        cityName: "绍兴市",
+        county: [
+          {
+            countyCode: "330681",
+            countyName: "诸暨市",
+          },
+          {
+            countyCode: "330602",
+            countyName: "越城区",
+          },
+          {
+            countyCode: "330682",
+            countyName: "上虞区",
+          },
+          {
+            countyCode: "330683",
+            countyName: "嵊州市",
+          },
+          {
+            countyCode: "330624",
+            countyName: "新昌县",
+          },
+          {
+            countyCode: "330621",
+            countyName: "柯桥区",
+          },
+        ],
+      },
+      {
+        cityCode: "331100",
+        cityName: "丽水市",
+        county: [
+          {
+            countyCode: "331125",
+            countyName: "云和县",
+          },
+          {
+            countyCode: "331121",
+            countyName: "青田县",
+          },
+          {
+            countyCode: "331126",
+            countyName: "庆元县",
+          },
+          {
+            countyCode: "331124",
+            countyName: "松阳县",
+          },
+          {
+            countyCode: "331123",
+            countyName: "遂昌县",
+          },
+          {
+            countyCode: "331122",
+            countyName: "缙云县",
+          },
+          {
+            countyCode: "331127",
+            countyName: "景宁畲族自治县",
+          },
+          {
+            countyCode: "331102",
+            countyName: "莲都区",
+          },
+          {
+            countyCode: "331181",
+            countyName: "龙泉市",
+          },
+        ],
+      },
+      {
+        cityCode: "330500",
+        cityName: "湖州市",
+        county: [
+          {
+            countyCode: "330522",
+            countyName: "长兴县",
+          },
+          {
+            countyCode: "330503",
+            countyName: "南浔区",
+          },
+          {
+            countyCode: "330523",
+            countyName: "安吉县",
+          },
+          {
+            countyCode: "330502",
+            countyName: "吴兴区",
+          },
+          {
+            countyCode: "330521",
+            countyName: "德清县",
+          },
+        ],
+      },
+      {
+        cityCode: "331000",
+        cityName: "台州市",
+        county: [
+          {
+            countyCode: "331024",
+            countyName: "仙居县",
+          },
+          {
+            countyCode: "331021",
+            countyName: "玉环市",
+          },
+          {
+            countyCode: "331082",
+            countyName: "临海市",
+          },
+          {
+            countyCode: "331023",
+            countyName: "天台县",
+          },
+          {
+            countyCode: "331003",
+            countyName: "黄岩区",
+          },
+          {
+            countyCode: "331004",
+            countyName: "路桥区",
+          },
+          {
+            countyCode: "331022",
+            countyName: "三门县",
+          },
+          {
+            countyCode: "331002",
+            countyName: "椒江区",
+          },
+          {
+            countyCode: "331081",
+            countyName: "温岭市",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "320000",
+    provinceName: "江苏省",
+    city: [
+      {
+        cityCode: "320200",
+        cityName: "无锡市",
+        county: [
+          {
+            countyCode: "320282",
+            countyName: "宜兴市",
+          },
+          {
+            countyCode: "320205",
+            countyName: "锡山区",
+          },
+          {
+            countyCode: "320211",
+            countyName: "滨湖区",
+          },
+          {
+            countyCode: "320281",
+            countyName: "江阴市",
+          },
+          {
+            countyCode: "320206",
+            countyName: "惠山区",
+          },
+          {
+            countyCode: "320207",
+            countyName: "梁溪区",
+          },
+          {
+            countyCode: "320214",
+            countyName: "新吴区",
+          },
+        ],
+      },
+      {
+        cityCode: "320400",
+        cityName: "常州市",
+        county: [
+          {
+            countyCode: "320412",
+            countyName: "武进区",
+          },
+          {
+            countyCode: "320405",
+            countyName: "戚墅堰区",
+          },
+          {
+            countyCode: "320481",
+            countyName: "溧阳市",
+          },
+          {
+            countyCode: "320402",
+            countyName: "天宁区",
+          },
+          {
+            countyCode: "320411",
+            countyName: "新北区",
+          },
+          {
+            countyCode: "320404",
+            countyName: "钟楼区",
+          },
+          {
+            countyCode: "320482",
+            countyName: "金坛区",
+          },
+        ],
+      },
+      {
+        cityCode: "320500",
+        cityName: "苏州市",
+        county: [
+          {
+            countyCode: "320509",
+            countyName: "吴江区",
+          },
+          {
+            countyCode: "320506",
+            countyName: "吴中区",
+          },
+          {
+            countyCode: "320582",
+            countyName: "张家港市",
+          },
+          {
+            countyCode: "320508",
+            countyName: "姑苏区",
+          },
+          {
+            countyCode: "320571",
+            countyName: "苏州工业园区",
+          },
+          {
+            countyCode: "320583",
+            countyName: "昆山市",
+          },
+          {
+            countyCode: "320581",
+            countyName: "常熟市",
+          },
+          {
+            countyCode: "320505",
+            countyName: "虎丘区",
+          },
+          {
+            countyCode: "320507",
+            countyName: "相城区",
+          },
+          {
+            countyCode: "320585",
+            countyName: "太仓市",
+          },
+        ],
+      },
+      {
+        cityCode: "320800",
+        cityName: "淮安市",
+        county: [
+          {
+            countyCode: "320811",
+            countyName: "清浦区",
+          },
+          {
+            countyCode: "320829",
+            countyName: "洪泽区",
+          },
+          {
+            countyCode: "320802",
+            countyName: "清江浦区",
+          },
+          {
+            countyCode: "320803",
+            countyName: "淮安区",
+          },
+          {
+            countyCode: "320831",
+            countyName: "金湖县",
+          },
+          {
+            countyCode: "320804",
+            countyName: "淮阴区",
+          },
+          {
+            countyCode: "320830",
+            countyName: "盱眙县",
+          },
+          {
+            countyCode: "320826",
+            countyName: "涟水县",
+          },
+        ],
+      },
+      {
+        cityCode: "320300",
+        cityName: "徐州市",
+        county: [
+          {
+            countyCode: "320381",
+            countyName: "新沂市",
+          },
+          {
+            countyCode: "320324",
+            countyName: "睢宁县",
+          },
+          {
+            countyCode: "320311",
+            countyName: "泉山区",
+          },
+          {
+            countyCode: "320302",
+            countyName: "鼓楼区",
+          },
+          {
+            countyCode: "320305",
+            countyName: "贾汪区",
+          },
+          {
+            countyCode: "320303",
+            countyName: "云龙区",
+          },
+          {
+            countyCode: "320312",
+            countyName: "铜山区",
+          },
+          {
+            countyCode: "320321",
+            countyName: "丰县",
+          },
+          {
+            countyCode: "320322",
+            countyName: "沛县",
+          },
+          {
+            countyCode: "320382",
+            countyName: "邳州市",
+          },
+        ],
+      },
+      {
+        cityCode: "321200",
+        cityName: "泰州市",
+        county: [
+          {
+            countyCode: "321203",
+            countyName: "高港区",
+          },
+          {
+            countyCode: "321202",
+            countyName: "海陵区",
+          },
+          {
+            countyCode: "321283",
+            countyName: "泰兴市",
+          },
+          {
+            countyCode: "321284",
+            countyName: "姜堰区",
+          },
+          {
+            countyCode: "321282",
+            countyName: "靖江市",
+          },
+          {
+            countyCode: "321281",
+            countyName: "兴化市",
+          },
+        ],
+      },
+      {
+        cityCode: "320700",
+        cityName: "连云港市",
+        county: [
+          {
+            countyCode: "320723",
+            countyName: "灌云县",
+          },
+          {
+            countyCode: "320721",
+            countyName: "赣榆区",
+          },
+          {
+            countyCode: "320705",
+            countyName: "新浦区",
+          },
+          {
+            countyCode: "320722",
+            countyName: "东海县",
+          },
+          {
+            countyCode: "320706",
+            countyName: "海州区",
+          },
+          {
+            countyCode: "320703",
+            countyName: "连云区",
+          },
+          {
+            countyCode: "320724",
+            countyName: "灌南县",
+          },
+        ],
+      },
+      {
+        cityCode: "321100",
+        cityName: "镇江市",
+        county: [
+          {
+            countyCode: "321112",
+            countyName: "丹徒区",
+          },
+          {
+            countyCode: "321102",
+            countyName: "京口区",
+          },
+          {
+            countyCode: "321182",
+            countyName: "扬中市",
+          },
+          {
+            countyCode: "321181",
+            countyName: "丹阳市",
+          },
+          {
+            countyCode: "321183",
+            countyName: "句容市",
+          },
+          {
+            countyCode: "321111",
+            countyName: "润州区",
+          },
+        ],
+      },
+      {
+        cityCode: "320600",
+        cityName: "南通市",
+        county: [
+          {
+            countyCode: "320602",
+            countyName: "崇川区",
+          },
+          {
+            countyCode: "320684",
+            countyName: "海门市",
+          },
+          {
+            countyCode: "320681",
+            countyName: "启东市",
+          },
+          {
+            countyCode: "320612",
+            countyName: "通州区",
+          },
+          {
+            countyCode: "320621",
+            countyName: "海安市",
+          },
+          {
+            countyCode: "320623",
+            countyName: "如东县",
+          },
+          {
+            countyCode: "320611",
+            countyName: "港闸区",
+          },
+          {
+            countyCode: "320682",
+            countyName: "如皋市",
+          },
+        ],
+      },
+      {
+        cityCode: "320900",
+        cityName: "盐城市",
+        county: [
+          {
+            countyCode: "320922",
+            countyName: "滨海县",
+          },
+          {
+            countyCode: "320981",
+            countyName: "东台市",
+          },
+          {
+            countyCode: "320925",
+            countyName: "建湖县",
+          },
+          {
+            countyCode: "320903",
+            countyName: "盐都区",
+          },
+          {
+            countyCode: "320921",
+            countyName: "响水县",
+          },
+          {
+            countyCode: "320924",
+            countyName: "射阳县",
+          },
+          {
+            countyCode: "320902",
+            countyName: "亭湖区",
+          },
+          {
+            countyCode: "320923",
+            countyName: "阜宁县",
+          },
+          {
+            countyCode: "320982",
+            countyName: "大丰区",
+          },
+        ],
+      },
+      {
+        cityCode: "320100",
+        cityName: "南京市",
+        county: [
+          {
+            countyCode: "320106",
+            countyName: "鼓楼区",
+          },
+          {
+            countyCode: "320115",
+            countyName: "江宁区",
+          },
+          {
+            countyCode: "320111",
+            countyName: "浦口区",
+          },
+          {
+            countyCode: "320116",
+            countyName: "六合区",
+          },
+          {
+            countyCode: "320104",
+            countyName: "秦淮区",
+          },
+          {
+            countyCode: "320124",
+            countyName: "溧水区",
+          },
+          {
+            countyCode: "320125",
+            countyName: "高淳区",
+          },
+          {
+            countyCode: "320113",
+            countyName: "栖霞区",
+          },
+          {
+            countyCode: "320107",
+            countyName: "下关区",
+          },
+          {
+            countyCode: "320102",
+            countyName: "玄武区",
+          },
+          {
+            countyCode: "320105",
+            countyName: "建邺区",
+          },
+          {
+            countyCode: "320114",
+            countyName: "雨花台区",
+          },
+          {
+            countyCode: "320103",
+            countyName: "白下区",
+          },
+        ],
+      },
+      {
+        cityCode: "321000",
+        cityName: "扬州市",
+        county: [
+          {
+            countyCode: "321084",
+            countyName: "高邮市",
+          },
+          {
+            countyCode: "321023",
+            countyName: "宝应县",
+          },
+          {
+            countyCode: "321012",
+            countyName: "江都区",
+          },
+          {
+            countyCode: "321003",
+            countyName: "邗江区",
+          },
+          {
+            countyCode: "321081",
+            countyName: "仪征市",
+          },
+          {
+            countyCode: "321002",
+            countyName: "广陵区",
+          },
+        ],
+      },
+      {
+        cityCode: "321300",
+        cityName: "宿迁市",
+        county: [
+          {
+            countyCode: "321323",
+            countyName: "泗阳县",
+          },
+          {
+            countyCode: "321302",
+            countyName: "宿城区",
+          },
+          {
+            countyCode: "321311",
+            countyName: "宿豫区",
+          },
+          {
+            countyCode: "321324",
+            countyName: "泗洪县",
+          },
+          {
+            countyCode: "321322",
+            countyName: "沭阳县",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "440000",
+    provinceName: "广东省",
+    city: [
+      {
+        cityCode: "445100",
+        cityName: "潮州市",
+        county: [
+          {
+            countyCode: "445123",
+            countyName: "潮安县",
+          },
+          {
+            countyCode: "445122",
+            countyName: "饶平县",
+          },
+          {
+            countyCode: "445121",
+            countyName: "潮安区",
+          },
+          {
+            countyCode: "445102",
+            countyName: "湘桥区",
+          },
+        ],
+      },
+      {
+        cityCode: "441800",
+        cityName: "清远市",
+        county: [
+          {
+            countyCode: "441802",
+            countyName: "清城区",
+          },
+          {
+            countyCode: "441825",
+            countyName: "连山壮族瑶族自治县",
+          },
+          {
+            countyCode: "441821",
+            countyName: "佛冈县",
+          },
+          {
+            countyCode: "441882",
+            countyName: "连州市",
+          },
+          {
+            countyCode: "441823",
+            countyName: "阳山县",
+          },
+          {
+            countyCode: "441826",
+            countyName: "连南瑶族自治县",
+          },
+          {
+            countyCode: "441827",
+            countyName: "清新区",
+          },
+          {
+            countyCode: "441881",
+            countyName: "英德市",
+          },
+        ],
+      },
+      {
+        cityCode: "441300",
+        cityName: "惠州市",
+        county: [
+          {
+            countyCode: "441303",
+            countyName: "惠阳区",
+          },
+          {
+            countyCode: "441322",
+            countyName: "博罗县",
+          },
+          {
+            countyCode: "441323",
+            countyName: "惠东县",
+          },
+          {
+            countyCode: "441324",
+            countyName: "龙门县",
+          },
+          {
+            countyCode: "441302",
+            countyName: "惠城区",
+          },
+        ],
+      },
+      {
+        cityCode: "445200",
+        cityName: "揭阳市",
+        county: [
+          {
+            countyCode: "445221",
+            countyName: "揭东区",
+          },
+          {
+            countyCode: "445224",
+            countyName: "惠来县",
+          },
+          {
+            countyCode: "445222",
+            countyName: "揭西县",
+          },
+          {
+            countyCode: "445281",
+            countyName: "普宁市",
+          },
+          {
+            countyCode: "445202",
+            countyName: "榕城区",
+          },
+        ],
+      },
+      {
+        cityCode: "440300",
+        cityName: "深圳市",
+        county: [
+          {
+            countyCode: "440303",
+            countyName: "罗湖区",
+          },
+          {
+            countyCode: "440306",
+            countyName: "宝安区",
+          },
+          {
+            countyCode: "440305",
+            countyName: "南山区",
+          },
+          {
+            countyCode: "440307",
+            countyName: "龙岗区",
+          },
+          {
+            countyCode: "440311",
+            countyName: "光明区",
+          },
+          {
+            countyCode: "440309",
+            countyName: "龙华区",
+          },
+          {
+            countyCode: "440308",
+            countyName: "盐田区",
+          },
+          {
+            countyCode: "440304",
+            countyName: "福田区",
+          },
+          {
+            countyCode: "440312",
+            countyName: "坪山区",
+          },
+          {
+            countyCode: "440313",
+            countyName: "大鹏新区",
+          },
+        ],
+      },
+      {
+        cityCode: "441900",
+        cityName: "东莞市",
+        county: [
+          {
+            countyCode: "441900-1",
+            countyName: "东莞市",
+          },
+        ],
+      },
+      {
+        cityCode: "441400",
+        cityName: "梅州市",
+        county: [
+          {
+            countyCode: "441422",
+            countyName: "大埔县",
+          },
+          {
+            countyCode: "441423",
+            countyName: "丰顺县",
+          },
+          {
+            countyCode: "441426",
+            countyName: "平远县",
+          },
+          {
+            countyCode: "441481",
+            countyName: "兴宁市",
+          },
+          {
+            countyCode: "441427",
+            countyName: "蕉岭县",
+          },
+          {
+            countyCode: "441421",
+            countyName: "梅县区",
+          },
+          {
+            countyCode: "441424",
+            countyName: "五华县",
+          },
+          {
+            countyCode: "441402",
+            countyName: "梅江区",
+          },
+        ],
+      },
+      {
+        cityCode: "440500-1",
+        cityName: "汕头市",
+        county: [
+          {
+            countyCode: "440515",
+            countyName: "澄海区",
+          },
+          {
+            countyCode: "440511",
+            countyName: "金平区",
+          },
+          {
+            countyCode: "440523",
+            countyName: "南澳县",
+          },
+          {
+            countyCode: "440513",
+            countyName: "潮阳区",
+          },
+          {
+            countyCode: "440514",
+            countyName: "潮南区",
+          },
+          {
+            countyCode: "440507",
+            countyName: "龙湖区",
+          },
+          {
+            countyCode: "440512",
+            countyName: "濠江区",
+          },
+        ],
+      },
+      {
+        cityCode: "441600",
+        cityName: "河源市",
+        county: [
+          {
+            countyCode: "441602",
+            countyName: "源城区",
+          },
+          {
+            countyCode: "441621",
+            countyName: "紫金县",
+          },
+          {
+            countyCode: "441624",
+            countyName: "和平县",
+          },
+          {
+            countyCode: "441622",
+            countyName: "龙川县",
+          },
+          {
+            countyCode: "441625",
+            countyName: "东源县",
+          },
+          {
+            countyCode: "441623",
+            countyName: "连平县",
+          },
+        ],
+      },
+      {
+        cityCode: "445300",
+        cityName: "云浮市",
+        county: [
+          {
+            countyCode: "445322",
+            countyName: "郁南县",
+          },
+          {
+            countyCode: "445381",
+            countyName: "罗定市",
+          },
+          {
+            countyCode: "445302",
+            countyName: "云城区",
+          },
+          {
+            countyCode: "445321",
+            countyName: "新兴县",
+          },
+          {
+            countyCode: "445323",
+            countyName: "云安区",
+          },
+        ],
+      },
+      {
+        cityCode: "440400",
+        cityName: "珠海市",
+        county: [
+          {
+            countyCode: "440404",
+            countyName: "金湾区",
+          },
+          {
+            countyCode: "440403",
+            countyName: "斗门区",
+          },
+          {
+            countyCode: "440402",
+            countyName: "香洲区",
+          },
+        ],
+      },
+      {
+        cityCode: "440700",
+        cityName: "江门市",
+        county: [
+          {
+            countyCode: "440785",
+            countyName: "恩平市",
+          },
+          {
+            countyCode: "440704",
+            countyName: "江海区",
+          },
+          {
+            countyCode: "440705",
+            countyName: "新会区",
+          },
+          {
+            countyCode: "440784",
+            countyName: "鹤山市",
+          },
+          {
+            countyCode: "440703",
+            countyName: "蓬江区",
+          },
+          {
+            countyCode: "440783",
+            countyName: "开平市",
+          },
+          {
+            countyCode: "440781",
+            countyName: "台山市",
+          },
+        ],
+      },
+      {
+        cityCode: "441500",
+        cityName: "汕尾市",
+        county: [
+          {
+            countyCode: "441523",
+            countyName: "陆河县",
+          },
+          {
+            countyCode: "441502",
+            countyName: "城区",
+          },
+          {
+            countyCode: "441581",
+            countyName: "陆丰市",
+          },
+          {
+            countyCode: "441521",
+            countyName: "海丰县",
+          },
+        ],
+      },
+      {
+        cityCode: "441200",
+        cityName: "肇庆市",
+        county: [
+          {
+            countyCode: "441203",
+            countyName: "鼎湖区",
+          },
+          {
+            countyCode: "441224",
+            countyName: "怀集县",
+          },
+          {
+            countyCode: "441283",
+            countyName: "高要区",
+          },
+          {
+            countyCode: "441284",
+            countyName: "四会市",
+          },
+          {
+            countyCode: "441202",
+            countyName: "端州区",
+          },
+          {
+            countyCode: "441225",
+            countyName: "封开县",
+          },
+          {
+            countyCode: "441226",
+            countyName: "德庆县",
+          },
+          {
+            countyCode: "441223",
+            countyName: "广宁县",
+          },
+        ],
+      },
+      {
+        cityCode: "440200",
+        cityName: "韶关市",
+        county: [
+          {
+            countyCode: "440222",
+            countyName: "始兴县",
+          },
+          {
+            countyCode: "440281",
+            countyName: "乐昌市",
+          },
+          {
+            countyCode: "440203",
+            countyName: "武江区",
+          },
+          {
+            countyCode: "440233",
+            countyName: "新丰县",
+          },
+          {
+            countyCode: "440224",
+            countyName: "仁化县",
+          },
+          {
+            countyCode: "440232",
+            countyName: "乳源瑶族自治县",
+          },
+          {
+            countyCode: "440229",
+            countyName: "翁源县",
+          },
+          {
+            countyCode: "440282",
+            countyName: "南雄市",
+          },
+          {
+            countyCode: "440205",
+            countyName: "曲江区",
+          },
+          {
+            countyCode: "440204",
+            countyName: "浈江区",
+          },
+        ],
+      },
+      {
+        cityCode: "440600",
+        cityName: "佛山市",
+        county: [
+          {
+            countyCode: "440606",
+            countyName: "顺德区",
+          },
+          {
+            countyCode: "440604",
+            countyName: "禅城区",
+          },
+          {
+            countyCode: "440607",
+            countyName: "三水区",
+          },
+          {
+            countyCode: "440608",
+            countyName: "高明区",
+          },
+          {
+            countyCode: "440605",
+            countyName: "南海区",
+          },
+        ],
+      },
+      {
+        cityCode: "440100",
+        cityName: "广州市",
+        county: [
+          {
+            countyCode: "440114",
+            countyName: "花都区",
+          },
+          {
+            countyCode: "440111",
+            countyName: "白云区",
+          },
+          {
+            countyCode: "440115",
+            countyName: "南沙区",
+          },
+          {
+            countyCode: "440113",
+            countyName: "番禺区",
+          },
+          {
+            countyCode: "440183",
+            countyName: "增城区",
+          },
+          {
+            countyCode: "440112",
+            countyName: "黄埔区",
+          },
+          {
+            countyCode: "440106",
+            countyName: "天河区",
+          },
+          {
+            countyCode: "440184",
+            countyName: "从化区",
+          },
+          {
+            countyCode: "440105",
+            countyName: "海珠区",
+          },
+          {
+            countyCode: "440103",
+            countyName: "荔湾区",
+          },
+          {
+            countyCode: "440104",
+            countyName: "越秀区",
+          },
+        ],
+      },
+      {
+        cityCode: "442000",
+        cityName: "中山市",
+        county: [
+          {
+            countyCode: "442000-1",
+            countyName: "中山市",
+          },
+        ],
+      },
+      {
+        cityCode: "440800",
+        cityName: "湛江市",
+        county: [
+          {
+            countyCode: "440881",
+            countyName: "廉江市",
+          },
+          {
+            countyCode: "440804",
+            countyName: "坡头区",
+          },
+          {
+            countyCode: "440882",
+            countyName: "雷州市",
+          },
+          {
+            countyCode: "440823",
+            countyName: "遂溪县",
+          },
+          {
+            countyCode: "440803",
+            countyName: "霞山区",
+          },
+          {
+            countyCode: "440825",
+            countyName: "徐闻县",
+          },
+          {
+            countyCode: "440802",
+            countyName: "赤坎区",
+          },
+          {
+            countyCode: "440811",
+            countyName: "麻章区",
+          },
+          {
+            countyCode: "440883",
+            countyName: "吴川市",
+          },
+        ],
+      },
+      {
+        cityCode: "441700",
+        cityName: "阳江市",
+        county: [
+          {
+            countyCode: "441781",
+            countyName: "阳春市",
+          },
+          {
+            countyCode: "441702",
+            countyName: "江城区",
+          },
+          {
+            countyCode: "441721",
+            countyName: "阳西县",
+          },
+          {
+            countyCode: "441723",
+            countyName: "阳东区",
+          },
+        ],
+      },
+      {
+        cityCode: "440900",
+        cityName: "茂名市",
+        county: [
+          {
+            countyCode: "440902",
+            countyName: "茂南区",
+          },
+          {
+            countyCode: "440923",
+            countyName: "电白区",
+          },
+          {
+            countyCode: "440982",
+            countyName: "化州市",
+          },
+          {
+            countyCode: "440903",
+            countyName: "茂港区 ",
+          },
+          {
+            countyCode: "440981",
+            countyName: "高州市",
+          },
+          {
+            countyCode: "440983",
+            countyName: "信宜市",
+          },
+        ],
+      },
+    ],
+  },
+  {
+    provinceCode: "810000",
+    provinceName: "香港特别行政区",
+    city: [
+      {
+        cityCode: "810000-1",
+        cityName: "香港",
+        county: [
+          {
+            countyCode: "810400",
+            countyName: "离岛",
+          },
+          {
+            countyCode: "810100",
+            countyName: "香港岛",
+          },
+          {
+            countyCode: "810300",
+            countyName: "新界",
+          },
+          {
+            countyCode: "810200",
+            countyName: "九龙",
+          },
+        ],
+      },
+    ],
+  },
+];

+ 110 - 0
src/components/wangding-pickerAddress/wangding-pickerAddress.vue

@@ -0,0 +1,110 @@
+<template>
+  <picker
+    :range="array"
+    range-key="name"
+    :value="value"
+    mode="multiSelector"
+    @change="bindPickerChange"
+    @columnchange="columnchange"
+  >
+    <slot></slot>
+  </picker>
+</template>
+
+<script>
+import AllAddress from "./data.js";
+const selectVal = ["", "", ""];
+
+export default {
+  data() {
+    return {
+      value: [0, 0, 0],
+      array: [],
+      index: 0,
+    };
+  },
+  created() {
+    this.initSelect();
+  },
+  methods: {
+    // 初始化地址选项
+    initSelect() {
+      this.updateSourceDate() // 更新源数据
+        .updateAddressDate() // 更新结果数据
+        .$forceUpdate(); // 触发双向绑定
+    },
+    // 地址控件改变控件
+    columnchange(d) {
+      this.updateSelectIndex(d.detail.column, d.detail.value) // 更新选择索引
+        .updateSourceDate() // 更新源数据
+        .updateAddressDate() // 更新结果数据
+        .$forceUpdate(); // 触发双向绑定
+    },
+
+    /**
+     * 更新源数据
+     * */
+    updateSourceDate() {
+      this.array = [];
+      this.array[0] = AllAddress.map((obj) => {
+        return {
+          name: obj.provinceName,
+        };
+      });
+      this.array[1] = AllAddress[this.value[0]].city.map((obj) => {
+        return {
+          name: obj.cityName,
+        };
+      });
+      this.array[2] = AllAddress[this.value[0]].city[this.value[1]].county.map(
+        (obj) => {
+          return {
+            name: obj.countyName,
+          };
+        }
+      );
+      return this;
+    },
+
+    /**
+     * 更新索引
+     * */
+    updateSelectIndex(column, value) {
+      const arr = JSON.parse(JSON.stringify(this.value));
+      arr[column] = value;
+      if (column === 0) {
+        arr[1] = 0;
+        arr[2] = 0;
+      }
+      if (column === 1) {
+        arr[2] = 0;
+      }
+      this.value = arr;
+      return this;
+    },
+
+    /**
+     * 更新结果数据
+     * */
+    updateAddressDate() {
+      selectVal[0] = this.array[0][this.value[0]].name;
+      selectVal[1] = this.array[1][this.value[1]].name;
+      selectVal[2] = this.array[2][this.value[2]].name;
+      return this;
+    },
+
+    /**
+     * 点击确定
+     * */
+    bindPickerChange() {
+      this.$emit("change", {
+        index: this.value,
+        data: selectVal,
+      });
+      return this;
+    },
+  },
+};
+</script>
+
+<style></style>

+ 176 - 0
src/components/yfs-item/yfs-item.vue

@@ -0,0 +1,176 @@
+<template>
+  <view
+    :class="['yfs-item', { 'yfs-sell-out': item.curr_num === 0 }]"
+    @click="handleClick"
+  >
+    <view v-if="item" class="yfs-item-media">
+      <image class="yfs-item-img" :src="item.img" mode="aspectFill"></image>
+      <view class="yfs-item-bar">
+        <view
+          :class="[
+            'yfs-item-label',
+            {
+              'yfs-item-label-dark': item.is_final,
+            },
+          ]"
+          >{{ item.sub_info }}赏</view
+        >
+        <view class="yfs-item-number"
+          >{{ item.curr_num }}/{{ item.total_num }}</view
+        >
+        <view class="yfs-item-progress">{{ item.percent }}</view>
+      </view>
+    </view>
+    <view v-else class="yfs-item-media skeleton"></view>
+    <view v-if="item" class="yfs-item-body">
+      <view class="yfs-item-title">{{ item.name }}</view>
+      <view class="yfs-item-desc">参考价:&yen;{{ item.sale_price }}</view>
+    </view>
+    <view v-else class="yfs-item-body">
+      <view class="yfs-item-title skeleton"></view>
+      <view class="yfs-item-desc skeleton"></view>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  name: "YfsItem",
+  props: {
+    item: {
+      type: Object,
+      default: () => null,
+    },
+  },
+  data() {
+    return {};
+  },
+
+  methods: {
+    handleClick() {
+      this.$emit("click", this.item);
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+.yfs-item {
+  width: 220rpx;
+  height: 290rpx;
+  background: linear-gradient(180deg, #1c1c20 0%, #252932 100%);
+  border: 2rpx solid;
+  border-image: linear-gradient(
+      180deg,
+      rgba(75, 119, 215, 1),
+      rgba(51, 216, 174, 1),
+      rgba(65, 168, 217, 1),
+      rgba(33, 216, 165, 1),
+      rgba(91, 110, 229, 1)
+    )
+    2 2;
+  position: relative;
+  .skeleton {
+    // background-color: #f1f1f1;
+    background-image: linear-gradient(
+      90deg,
+      #1c1c20 25%,
+      #252932 37%,
+      #1c1c20 63%
+    );
+    width: 100%;
+    height: 0.6rem;
+    list-style: none;
+    background-size: 400% 100%;
+    background-position: 100% 50%;
+    animation: skeleton-loading 1.4s ease infinite;
+  }
+  &.yfs-sell-out::after {
+    content: "";
+    position: absolute;
+    width: 100%;
+    height: 100%;
+    left: 0;
+    top: 0;
+    background: url(@/static/icon/icon-none.png) no-repeat center
+      rgba(0, 0, 0, 0.76);
+    background-size: 145rpx 132rpx;
+  }
+  .yfs-item-media {
+    width: 220rpx;
+    height: 220rpx;
+    position: relative;
+    .yfs-item-img {
+      width: 220rpx;
+      height: 220rpx;
+    }
+    .yfs-item-bar {
+      box-sizing: border-box;
+      width: 100%;
+      height: 32rpx;
+      font-size: 20rpx;
+      color: #ffffff;
+      line-height: 32rpx;
+      display: flex;
+      position: absolute;
+      left: 0;
+      bottom: 0;
+      background: rgba(0, 0, 0, 0.6);
+      padding-right: 8rpx;
+      .yfs-item-number {
+        flex: 1;
+      }
+      .yfs-item-label {
+        background: #4efbff;
+        padding: 0 6rpx;
+        font-weight: 500;
+        color: #222222;
+        position: relative;
+        margin-right: 18rpx;
+
+        &::after {
+          position: absolute;
+          content: "";
+          border-style: solid;
+          border-color: transparent transparent transparent #4efbff;
+          border-width: 32rpx 0 0 12rpx;
+          left: 100%;
+          top: 0;
+        }
+        &.yfs-item-label-dark {
+          background-color: #fc5e94;
+          &::after {
+            border-color: transparent transparent transparent #fc5e94;
+          }
+        }
+      }
+    }
+  }
+  .yfs-item-body {
+    padding: 8rpx 18rpx 0;
+    .yfs-item-title {
+      width: 100%;
+      height: 30rpx;
+      overflow: hidden;
+      white-space: nowrap;
+      font-size: 22rpx;
+      color: #ffffff;
+      line-height: 30rpx;
+      text-overflow: ellipsis;
+    }
+    .yfs-item-desc {
+      width: 100%;
+      height: 26rpx;
+      overflow: hidden;
+      white-space: nowrap;
+      font-size: 22rpx;
+      color: #7f8798;
+      line-height: 26rpx;
+      text-overflow: ellipsis;
+      &.skeleton {
+        width: 70%;
+      }
+    }
+  }
+}
+</style>

+ 116 - 0
src/components/yfs-record-item/yfs-record-item.vue

@@ -0,0 +1,116 @@
+<template>
+  <view class="yfs-record-item">
+    <image
+      v-if="item"
+      class="yfs-record-avatar"
+      :src="item.avatar"
+      mode="aspectFill"
+    ></image>
+    <view v-else class="yfs-record-avatar skeleton"></view>
+    <view v-if="item" class="yfs-record-code">{{ item.nickname }}</view>
+    <view v-else class="yfs-record-code"><view class="skeleton"></view></view>
+    <view v-if="item" class="yfs-record-last">
+      <view
+        :class="[
+          'yfs-record-label',
+          {
+            'yfs-record-label-dark': item.is_final,
+          },
+        ]"
+        >{{ item.level_name }}赏</view
+      >
+      <view class="yfs-record-name">{{ item.name }}</view>
+    </view>
+    <view v-else class="yfs-record-last">
+      <view class="yfs-record-label skeleton"></view>
+      <view class="yfs-record-name skeleton"></view>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  name: "YfsRecordItem",
+  props: {
+    item: {
+      type: Object,
+      default: () => null,
+    },
+  },
+  data() {
+    return {};
+  },
+
+  methods: {
+    handleClick() {
+      this.$emit("click", this.item);
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+.yfs-record-item {
+  display: flex;
+  align-items: center;
+  height: 110rpx;
+  .skeleton {
+    background-image: linear-gradient(
+      90deg,
+      #252932 25%,
+      #2c3241 37%,
+      #252932 63%
+    );
+    list-style: none;
+    background-size: 400% 100%;
+    background-position: 100% 50%;
+    animation: skeleton-loading 1.4s ease infinite;
+  }
+  .yfs-record-avatar {
+    width: 60rpx;
+    height: 60rpx;
+    background-color: #d9d9d9;
+    margin-right: 22rpx;
+    border-radius: 100%;
+  }
+  .yfs-record-code {
+    flex: 1;
+    width: 0;
+    font-size: 26rpx;
+    color: #ffffff;
+    .skeleton {
+      width: 300rpx;
+      height: 36rpx;
+    }
+  }
+  .yfs-record-last {
+    text-align: right;
+    margin-left: 22rpx;
+  }
+  .yfs-record-label {
+    font-family: ysbth;
+    font-size: 32rpx;
+    color: #4efbff;
+    line-height: 42rpx;
+    &.yfs-record-label-dark {
+      color: #fc5e94;
+    }
+    &.skeleton {
+      height: 42rpx;
+      width: 60rpx;
+      margin: 0 0 0 auto;
+    }
+  }
+  .yfs-record-name {
+    white-space: nowrap;
+    font-size: 22rpx;
+    color: #ffffff;
+    line-height: 30rpx;
+    &.skeleton {
+      height: 30rpx;
+      width: 174rpx;
+      margin: 0 0 0 auto;
+    }
+  }
+}
+</style>

+ 117 - 0
src/components/yfs-result-item/yfs-result-item.vue

@@ -0,0 +1,117 @@
+<template>
+  <view class="yfs-result-item">
+    <view class="yfs-result-img-wrap">
+      <image class="yfs-result-img" :src="item.img" mode="aspectFill" />
+    </view>
+    <view class="yfs-result-body">
+      <view class="yfs-result-title">{{ item.nickname }}</view>
+      <view
+        :class="[
+          'yfs-result-label',
+          {
+            'yfs-result-label-dark': item.is_final === 1,
+            'yfs-result-label-dark2': item.is_final === 2,
+          },
+        ]"
+        >{{ item.level_name }}</view
+      >
+      <view class="yfs-result-desc">{{ item.name }}</view>
+    </view>
+    <view class="yfs-result-num">x{{ item.number }}发</view>
+  </view>
+</template>
+
+<script>
+export default {
+  name: "YfsResultItem",
+  props: {
+    item: {
+      type: Object,
+      default: () => null,
+    },
+  },
+  data() {
+    return {};
+  },
+  methods: {
+    handleClick() {
+      this.$emit("click", this.item);
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+.yfs-result-item {
+  display: flex;
+  align-items: center;
+  width: 704rpx;
+  border-bottom: 2rpx solid #262628;
+  margin: 0 auto;
+  padding: 28rpx 0 26rpx;
+  .yfs-result-img-wrap {
+    box-sizing: border-box;
+    width: 150rpx;
+    height: 152rpx;
+    padding: 26rpx 26rpx 30rpx;
+    background: url(@/static/detail/result-bg.png) no-repeat;
+    background-size: contain;
+    overflow: hidden;
+    margin-right: 18rpx;
+  }
+  .yfs-result-img {
+    display: block;
+    width: 100%;
+    height: 100%;
+  }
+  margin-right: 18rpx;
+  .yfs-result-body {
+    width: 0;
+    flex: 1;
+    overflow: hidden;
+    .yfs-result-title {
+      width: 100%;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      white-space: nowrap;
+      height: 40rpx;
+      font-size: 28rpx;
+      font-weight: 500;
+      color: #ffffff;
+      line-height: 40rpx;
+    }
+    .yfs-result-desc {
+      width: 100%;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      white-space: nowrap;
+      height: 34rpx;
+      font-size: 24rpx;
+      color: #ffffff;
+      line-height: 40rpx;
+    }
+  }
+  .yfs-result-num {
+    font-size: 24rpx;
+    color: #4efbff;
+    white-space: nowrap;
+    margin-left: 18rpx;
+  }
+
+  .yfs-result-label {
+    height: 46rpx;
+    font-size: 36rpx;
+    color: #4efbff;
+    line-height: 46rpx;
+    font-family: ysbth, Helvetica Neue, Helvetica, Arial, Hiragino Sans GB,
+      Hiragino Sans GB W3, Microsoft YaHei UI, Microsoft YaHei,
+      WenQuanYi Micro Hei, sans-serif;
+    &.yfs-result-label-dark {
+      color: #fc5e94;
+    }
+    &.yfs-result-label-dark2 {
+      color: #fbff00;
+    }
+  }
+}
+</style>

BIN
src/fonts/UnidreamLED/UnidreamLED.ttf


+ 1 - 0
src/fonts/ysbth/chars.txt

@@ -0,0 +1 @@
+ 0123456789.:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!上下与中买人以任优入全分列到务动单参发取名员品商喜多奖定幸得恭您惠抽推新日时更最查次欧每气活消满看确祝福积签荐表袋豪运近连部限魂一番赏赠览记录剩余间收我要排队当前箱有在登后可信息无,试手吧面还。已完请换购[]号~终结束不了快去退出

BIN
src/fonts/ysbth/ysbth.TTF


+ 268 - 0
src/lib/api/api.js

@@ -0,0 +1,268 @@
+import request from "../utils/request";
+
+export default {
+  homeList(data) {
+    return request.get(
+      `/weapp/kujis/v2/${data.size}/${data.sort}/${data.order}/${data.lastId}`
+    );
+  },
+  homeListV3(data = {}) {
+    return request.get(
+      `/weapp/kujis/v3?play_type=${data.play_type || ""}&last_id=${
+        data.last_id || 0
+      }&session=${data.session || ""}`
+    );
+  },
+  homeModule(id) {
+    return request.get("/weapp/kujis/module/" + id + "?ver=beta");
+  },
+  getSingInfo(session) {
+    return request.get("/weapp/getSingInfo/" + session);
+  },
+  userSingIn(data) {
+    return request.post("/weapp/userSingIn", data);
+  },
+  userNewSingIn(data) {
+    return request.post("/weapp/userNewSingIn", data);
+  },
+  getTaskInfo(session) {
+    return request.get("/weapp/getTaskInfo/" + session);
+  },
+  //首页模块
+  homeModules() {
+    return request.get("/weapp/kujis/module");
+  },
+  // 详情
+  detail(id) {
+    return request.get(`/weapp/kujis/fudai_detail/${id}`);
+  },
+  // 详情
+  detailDanmu(id) {
+    return request.get(`/weapp/kujis/detail_danmu/${id}`);
+  },
+  getFriendsList(session) {
+    return request.get(`/weapp/getFriendsList/${session}`);
+  },
+  beTo() {
+    return request.get("/weapp/kujis/will");
+  },
+  danmu() {
+    return request.get("/weapp/kujis/danmu");
+  },
+  goodsDetail(id, session) {
+    return request.get("/weapp/kujis/" + id + "?session=" + session);
+  },
+  pincheDetail(id, session) {
+    return request.get("/weapp/kujis/pinche/" + id + "?session=" + session);
+  },
+  goodsRecords(id, session) {
+    return request.get("/weapp/kujis/" + id + "/payList?session=" + session);
+  },
+  goodsPay(data) {
+    return request.post("/weapp/kujis/pay", data);
+  },
+  balancePay(data) {
+    return request.post("/weapp/kujis/balance/fudai_pay", data);
+  },
+  pBalancePay(data) {
+    return request.post("/weapp/kujis/pinche/balance/pay", data);
+  },
+  prePay(data) {
+    return request.post("/weapp/kujis/fudai_prepay", data);
+    // return request.post("/weapp/kujis/prepay", data);
+  },
+  pPrePay(data) {
+    return request.post("/weapp/kujis/pinche/prepay", data);
+  },
+  pSubSeats(data) {
+    return request.post("/weapp/kujis/pinche/subSeat", data);
+  },
+  completePay(data) {
+    return request.post("/weapp/kujis/complete/pay", data);
+  },
+  queryPay(data) {
+    return request.post("/weapp/kujis/query/pay", data);
+  },
+  getPrepay(data) {
+    return request.post("/weapp/invest/prepay", data);
+  },
+  getPrepayStatus(data) {
+    return request.post("/weapp/invest/complete/pay", data);
+  },
+  getPrepaySucceed(data) {
+    return request.post("/weapp/invest/query/pay", data);
+  },
+
+  getRealSeat(id, session) {
+    return request.get("/weapp/kujis/carPoolMap/" + id + "?session=" + session);
+  },
+
+  getPrepaySucceedOrder(data) {
+    return request.post("/weapp/sendout/query/pay", data);
+  },
+  getPrepayStatusOrder(data) {
+    return request.post("/weapp/sendout/complete/pay", data);
+  },
+
+  unSendList(token) {
+    return request.get("/weapp/order/skus/unSendList?session=" + token);
+  },
+  userInfo(token) {
+    return request.get("/weapp/userInfo/" + token);
+  },
+  sendList(token) {
+    return request.get("/weapp/order/skus/sendList?session=" + token);
+  },
+  orderList(token) {
+    return request.get("/weapp/order/list?session=" + token);
+  },
+  addressList(token) {
+    return request.get("/weapp/address/list?session=" + token);
+  },
+  balanceRecords(token) {
+    return request.get("/weapp/balance/records/" + token);
+  },
+  addAddress(data) {
+    return request.post("/weapp/address/add", data);
+  },
+  updateAddress(data) {
+    return request.post("/weapp/address/modify", data);
+  },
+  delAddress(data) {
+    return request.post("/weapp/address/del", data);
+  },
+  sendOrder(data) {
+    return request.post("/weapp/order/send", data);
+  },
+  orderRecovery(data) {
+    return request.post("/weapp/order/retrieve", data);
+  },
+  saveUserInfo(data) {
+    return request.post("/weapp/saveUserInfo", data);
+  },
+  getShare(data) {
+    return request.post("/weapp/share", data);
+  },
+  preSkuRetrieve(data) {
+    return request.post("/weapp/order/sku/preRetrieve", data);
+  },
+  finalSkuRetrieve(data) {
+    return request.post("/weapp/order/sku/finalRetrieve", data);
+  },
+  // 查询是否领取过升级大礼包
+  checkCoupons(session) {
+    return request.get("/weapp/checkCoupons/" + session);
+  },
+  // 查询优惠券活动
+  getActivity(session) {
+    return request.get("/weapp/getActivity/" + session);
+  },
+  // 绑定升级大礼包优惠券
+  bindCounpos(data) {
+    return request.post("/weapp/bindCounpos", data);
+  },
+  //查询可用优惠券信息
+  getUserCoupons(data) {
+    return request.post("/weapp/getUserCoupons", data);
+  },
+  //查询新人专享优惠券接口
+  getNewUserActivity() {
+    return request.get("/weapp/getNewUserActivity");
+  },
+  //我的优惠券页面
+  myCouponList(session) {
+    return request.get("/weapp/myCouponList/" + session);
+  },
+  //查询社群分享活动是否结束接口
+  checkCommunal(activity_id) {
+    return request.get("/weapp/kujis/checkCommunalSharing/" + activity_id);
+  },
+  //查询用户是否领取社群分享优惠券
+  communalSharing(activity_id, session) {
+    return request.get(
+      "/weapp/kujis/communalSharing/" + activity_id + "/" + session
+    );
+  },
+  //绑定社群分享优惠券
+  bindCommunalSharing(data) {
+    return request.post("/weapp/kujis/bindCommunalSharing", data);
+  },
+  activityList() {
+    return request.get("/weapp/getFeatureActivity");
+  },
+  activityDetail(id, session = "") {
+    return request.get(
+      `/weapp/getFeatureList/${id}${session ? `/${session}` : ""}`
+    );
+  },
+  joinActivity(data) {
+    return request.post(`/weapp/participateInActivities`, data);
+  },
+  checkIsFreeShipping(data) {
+    return request.post(`/weapp/order/checkIsFreeShipping`, data);
+  },
+  setAdTask(data) {
+    return request.post(`/weapp/getAdTask`, data);
+  },
+  getTaskScore(data) {
+    return request.post(`/weapp/getTaskScore`, data);
+  },
+
+  /* 一番赏 */
+  getYfsList(data) {
+    return request.get(
+      `/weapp/kujis/yfs_v2/${data.size}/${data.sort}/${data.order}/${data.lastId}`
+    );
+  },
+
+  removeLineUp(data) {
+    return request.post(`/weapp/kujis/removeLineUp`, data);
+  },
+
+  addLineUp(data) {
+    return request.post(`/weapp/kujis/addLineUp`, data);
+  },
+
+  getLineUp(id, session) {
+    return request.get(
+      `/weapp/kujis/getLineUp/${id}${session ? `/${session}` : ""}`
+    );
+  },
+  getYfsDetail(id) {
+    return request.get(`/weapp/kujis/${id}`);
+  },
+  getYfsPayList(id) {
+    return request.get(`/weapp/kujis/${id}/payList`);
+  },
+  yfsBalancePay(data) {
+    return request.post("/weapp/kujis/balance/pay", data);
+  },
+  yfsPrePay(data) {
+    return request.post("/weapp/kujis/prepay", data);
+  },
+  yfsQueryPay(data) {
+    return request.post("/weapp/kujis/query/yfs_pay", data);
+  },
+  yfsCompletePay(data) {
+    return request.post("/weapp/kujis/complete/fudai_pay", data);
+  },
+  getMessage(page = 1, sesstion) {
+    return request.get(`/weapp/kujis/notice_info/${page}/${sesstion}`);
+  },
+  readMessage(data) {
+    return request.post("/weapp/kujis/update_notice", data);
+  },
+  getFudaiPayList(id, query) {
+    return request.get(
+      `/weapp/kujis/${id}/fudaiPayList?session=${query.session || ""}&status=${
+        query.status || 0
+      }&last_id=${query.lastId || 0}`
+    );
+  },
+  getDetail(id, session = "") {
+    return request.get(`/weapp/kujis/new_detail/${id}?session=${session}`);
+  },
+  getWxsUsers(id) {
+    return request.get(`/weapp/kujis/wxs_users/${id}`);
+  },
+};

+ 5 - 0
src/lib/utils/errcode.js

@@ -0,0 +1,5 @@
+export default {
+  SUC: 10000,
+  PAY: 90000,
+  SIN: 40001,
+};

+ 20 - 0
src/lib/utils/jumpToUrl.js

@@ -0,0 +1,20 @@
+export default function jumpToUrl(url) {
+  if (!url) return;
+
+  if (/^https?:\/\//i.test(url)) {
+    uni.navigateTo({
+      url: `/pages/webview/webview?url=${encodeURIComponent(url)}`,
+    });
+    return;
+  }
+
+  if (/^\/pages\/(index|activity|my)\/index/.test(url)) {
+    uni.switchTab({ url });
+    return;
+  }
+
+  console.log("switch");
+  uni.navigateTo({
+    url,
+  });
+}

+ 151 - 0
src/lib/utils/login.js

@@ -0,0 +1,151 @@
+import request from "./request";
+
+// 全局变量
+let loginData = {};
+
+// 进行登录
+function getUserInfo(data) {
+  return new Promise((resolve, reject) => {
+    const globalData = getApp().globalData;
+    if (globalData.fuid) data.from = globalData.fuid;
+
+    request
+      .post("/weapp/login/v1", data)
+      .then((res) => {
+        if (res.errno == 10000 && res.data) {
+          uni.setStorageSync("userinfo", JSON.stringify(res.data));
+          resolve({ ...res.data, coupons: res.coupons || null });
+        } else {
+          reject({ errMsg: res.errmsg });
+        }
+      })
+      .catch((e) => {
+        reject(e);
+      });
+  });
+}
+
+// 手机号绑定
+function setPhoneNumber(data) {
+  return new Promise((resolve, reject) => {
+    request
+      .post("/weapp/login/setPhoneNumber", data)
+      .then((res) => {
+        if (res.errno == 10000 && res.data) {
+          uni.setStorageSync("userinfo", JSON.stringify(res.data));
+          resolve(res.data);
+        } else {
+          reject({ errMsg: res.errmsg });
+        }
+      })
+      .catch((e) => {
+        reject(e);
+      });
+  });
+}
+function wxLogout() {
+  return new Promise((resolve) => {
+    uni.removeStorage({
+      key: "userinfo",
+    });
+    resolve();
+  });
+}
+
+//
+function tryLogin() {
+  if (loginData.userInfo && loginData.code) {
+    const xdata = loginData;
+    loginData = {};
+    getUserInfo(xdata)
+      .then((data) => {
+        xdata.callback && xdata.callback(data);
+      })
+      .catch((e) => {
+        uni.showToast({
+          icon: "none",
+          title: "登录失败:" + e.errmsg,
+        });
+      });
+  }
+  if (loginData.phone_code) {
+    const xdata = loginData;
+    loginData = {};
+    setPhoneNumber(xdata)
+      .then((data) => {
+        xdata.callback && xdata.callback(data);
+      })
+      .catch((e) => {
+        xdata.fail && xdata.fail(e);
+        uni.showToast({
+          icon: "none",
+          title: "登录失败:" + e.errmsg,
+        });
+      });
+  }
+}
+
+// 微信授权获取用户手机号
+function setPhoneData(params) {
+  if (params.phone_code) {
+    loginData = params;
+    tryLogin("phone");
+  } else {
+    uni.showToast({
+      icon: "none",
+      title: "手机号授权失败",
+    });
+  }
+}
+
+// 微信授权获取用户信息
+function wxLogin(callback) {
+  loginData.userInfo = null;
+  loginData.code = null;
+
+  loginData.callback = callback;
+  uni.getUserProfile({
+    desc: "获取你的昵称、头像、地区及性别",
+    success(data) {
+      loginData.userInfo = {
+        signature: data.signature,
+        encryptedData: data.encryptedData,
+        iv: data.iv,
+        rawData: data.rawData,
+      };
+      tryLogin("userProfile");
+    },
+    fail() {
+      uni.showToast({
+        icon: "none",
+        title: "授权失败",
+      });
+    },
+  });
+
+  uni.login({
+    success(res) {
+      if (res.code) {
+        loginData.code = res.code;
+        tryLogin("code");
+      } else {
+        uni.showToast({
+          icon: "none",
+          title: "授权失败",
+        });
+      }
+    },
+    fail() {
+      uni.showToast({
+        icon: "none",
+        title: "授权失败",
+      });
+    },
+  });
+}
+
+export default {
+  logout: wxLogout,
+  setPhoneData: setPhoneData,
+  wxLogin: wxLogin,
+};

+ 186 - 0
src/lib/utils/request.js

@@ -0,0 +1,186 @@
+// import errcode from "./errcode";
+// 测试域名
+// const baseUrl = "https://cj.weapp.yergoo.com";
+// 生产域名
+const baseUrl = "https://cj.weapp.yerhao.com";
+
+function getCommonHeader() {
+  let header = {
+    "content-type": "application/json",
+    // 'content-type': 'application/x-www-form-urlencoded;charset=utf-8'
+  };
+
+  // 如果token有值则带上
+  const token = uni.getStorageSync("token");
+  if (token) {
+    header = Object.assign({}, header, {
+      token: token,
+    });
+  }
+  return header;
+}
+// todo 这里的问题,先注释掉
+// Object.defineProperty(Promise.prototype, 'finally', {
+//   get: () => function (callback) {
+//     const P = this.constructor
+//     return this.then(
+//       value => P.resolve(callback()).then(() => value),
+//       reason => P.resolve(callback()).then(() => { throw reason })
+//     )
+//   }
+// })
+
+function request(url, data = {}, header = {}, method = "POST", config = {}) {
+  // header 空值处理
+  let _header = {
+    "content-type": "application/x-www-form-urlencoded",
+  };
+  if (Object.keys(header).length > 0) {
+    _header = header;
+  }
+
+  let showLoading = false,
+    loadingTitle = "加载中...";
+
+  // 默认显示loading
+  if (config["showLoading"] != undefined && config["showLoading"] == true) {
+    showLoading = true;
+  }
+  if (config["loadingTitle"]) {
+    loadingTitle = config["loadingTitle"];
+  }
+
+  return new Promise((resolve, reject) => {
+    // 是否显示loading
+    if (showLoading) {
+      uni.showLoading({ title: loadingTitle, icon: "none", mask: true });
+    }
+
+    uni.request({
+      url: url,
+      data: data,
+      header: _header,
+      method: method,
+      success: ({ data, statusCode }) => {
+        // 服务器 非200 错误
+        if (statusCode && statusCode !== 200) {
+          uni.showToast({
+            title: "服务器 " + statusCode + " 错误",
+            icon: "none",
+          });
+          reject(data);
+          return;
+        }
+        resolve(data);
+        return;
+      },
+      fail: (err) => {
+        if (err.errMsg.indexOf("url not in domain list") > -1) {
+          uni.showToast({
+            title: "请求url不在合法域名中,请打开调试模式",
+            icon: "none",
+          });
+        }
+        reject(err);
+      },
+      complete: () => {
+        if (showLoading) {
+          uni.hideLoading();
+        }
+      },
+    });
+  });
+}
+function upload(url, data = null, header = {}, filePath, config = {}) {
+  // header 空值处理
+  let _header = {
+    "content-type": "multipart/form-data",
+  };
+  if (Object.keys(header).length > 0) {
+    _header = header;
+  }
+
+  let showToast = true,
+    showLoading = false,
+    loadingTitle = "正在上传...";
+  // 默认显示toast
+  if (config["showToast"] !== undefined && config["showToast"] === false) {
+    showToast = false;
+  }
+  // 默认显示loading
+  if (config["showLoading"] != undefined && config["showLoading"] == true) {
+    showLoading = true;
+  }
+  if (config["loadingTitle"]) {
+    loadingTitle = config["loadingTitle"];
+  }
+
+  return new Promise((resolve, reject) => {
+    // 是否显示loading
+    if (showLoading) {
+      uni.showLoading({ title: loadingTitle, icon: "none", mask: true });
+    }
+
+    uni.uploadFile({
+      url,
+      filePath,
+      header: _header,
+      name: "file",
+      formData: data,
+      success: ({ data, statusCode }) => {
+        const parseData = JSON.parse(data);
+        // 服务器 非200 错误
+        if (statusCode && statusCode !== 200) {
+          uni.showToast({
+            title: "服务器 " + statusCode + " 错误",
+            icon: "none",
+          });
+          reject(parseData);
+          return;
+        }
+
+        if (data && parseData.code !== 0) {
+          // 业务状态非0 是否提示
+          if (showToast) {
+            uni.showToast({ title: parseData.msg, icon: "none" });
+          }
+
+          reject(parseData);
+          return;
+        }
+        resolve(parseData.data);
+      },
+      fail: (err) => {
+        if (err.errMsg.indexOf("url not in domain list") > -1) {
+          uni.showToast({
+            title: "请求url不在合法域名中,请打开调试模式",
+            icon: "none",
+          });
+        }
+
+        reject(err);
+      },
+      complete: () => {
+        if (showLoading) {
+          uni.hideLoading();
+        }
+      },
+    });
+  });
+}
+
+function getRequest(url, data = {}, config = {}) {
+  return request(baseUrl + url, data, getCommonHeader(), "GET", config);
+}
+function postRequest(url, data = {}, config = {}) {
+  return request(baseUrl + url, data, getCommonHeader(), "POST", config);
+}
+function uploadFile(url, filePath, data = null, config = {}) {
+  return upload(baseUrl + url, data, getCommonHeader(), filePath, config);
+}
+
+export default {
+  get: getRequest,
+  post: postRequest,
+  upload: uploadFile,
+};

+ 75 - 0
src/lib/utils/showRewardedVideoAd.js

@@ -0,0 +1,75 @@
+export default function createshowRewardedVideoAd() {
+  let videoAd = null;
+  return function showRewardedVideoAd() {
+    uni.showLoading({ title: "拉取广告中", mask: true });
+    return new Promise((resolve, reject) => {
+      if (!videoAd) {
+        videoAd = wx.createRewardedVideoAd({
+          adUnitId: "adunit-fe42214ae308ac05",
+        });
+        videoAd.onError = (e) => {
+          console.log(e);
+        };
+      }
+
+      const onError = (err) => {
+        switch (err?.errCode) {
+          case 1000:
+            err.errMsg = "后端接口调用失败";
+            break;
+          case 1001:
+            err.errMsg = "参数错误";
+            break;
+          case 1002:
+            err.errMsg = "广告单元无效";
+            break;
+          case 1003:
+            err.errMsg = "内部错误";
+            break;
+          case 1004:
+            err.errMsg = "无合适的广告";
+            break;
+          case 1005:
+            err.errMsg = "广告组件审核中";
+            break;
+          case 1006:
+            err.errMsg = "广告组件被驳回";
+            break;
+          case 1007:
+            err.errMsg = "广告组件被封禁";
+            break;
+          case 1008:
+            err.errMsg = "广告单元已关闭";
+            break;
+        }
+        console.log(err);
+        uni.hideLoading();
+        reject(err);
+        offAll();
+      };
+
+      const onClose = (res) => {
+        console.log(res);
+        offAll();
+        resolve(res);
+      };
+
+      function offAll() {
+        videoAd.offClose(onClose);
+        videoAd.offError(onError);
+      }
+
+      videoAd
+        .load()
+        .then(() => videoAd.show())
+        .then(() => uni.hideLoading())
+        .catch((err) => {
+          onError(err);
+        });
+
+      videoAd.onError(onError);
+
+      videoAd.onClose(onClose);
+    });
+  };
+}

+ 107 - 0
src/lib/utils/wxSubscribe.js

@@ -0,0 +1,107 @@
+export const defaultTemplateIds = [
+  // 上新通知
+  "RCG1EiNEzYGGplWonFtNsCm0id2k1xZhZClNm8Y5_7c",
+  // 中奖通知
+  "rVqzI7034PU8M7u3UKjR8Kd-_Wga5wO1BC8hYJ-hDKA",
+  // 签到提醒
+  "RigOXUldAYYOYc00nuL7OfdV3SDg8IEA7qLjLKJfEUE",
+];
+
+export const activityTemplateId = "O7lrNfk59NeQl2LECgHiTi8WSWHXfstdnW5jLW7fO80";
+
+export const queueTemplateId = "SLDlbwLOgAqlueDwoZBNdlXyy8x2aUzzasu2VLUmsYo";
+
+export function filterAcceptSubs(templateIds = []) {
+  // #ifdef MP-WEIXIN
+  return new Promise((resolve) => {
+    wx.getSetting({
+      withSubscriptions: true,
+      success({ subscriptionsSetting }) {
+        const { mainSwitch = false, itemSettings = {} } =
+          subscriptionsSetting || {};
+
+        if (mainSwitch) {
+          resolve(
+            templateIds.filter(
+              (templateId) =>
+                itemSettings[templateId] &&
+                itemSettings[templateId] === "accept"
+            )
+          );
+        } else {
+          resolve([]);
+        }
+      },
+    });
+  });
+  // #endif
+  // #ifndef MP-WEIXIN
+  // eslint-disable-next-line no-unreachable
+  return Promise.resolve([]);
+  // #endif
+}
+
+export function isSubAccept(templateId) {
+  // #ifdef MP-WEIXIN
+  return new Promise((resolve) => {
+    wx.getSetting({
+      withSubscriptions: true,
+      success({ subscriptionsSetting }) {
+        const { mainSwitch = false, itemSettings = {} } =
+          subscriptionsSetting || {};
+        if (
+          mainSwitch &&
+          itemSettings[templateId] &&
+          itemSettings[templateId] === "accept"
+        ) {
+          resolve(true);
+        } else {
+          resolve(false);
+        }
+      },
+    });
+  });
+  // #endif
+  // #ifndef MP-WEIXIN
+  // eslint-disable-next-line no-unreachable
+  return Promise.resolve(false);
+  // #endif
+}
+
+export function requestSubscribeMessage(templateIds) {
+  // #ifdef MP-WEIXIN
+  return new Promise((resolve, reject) => {
+    wx.requestSubscribeMessage({
+      tmplIds: templateIds,
+      success: resolve,
+      fail: reject,
+    });
+  });
+  // #endif
+  // #ifndef MP-WEIXIN
+  // eslint-disable-next-line no-unreachable
+  return Promise.reject();
+  // #endif
+}
+
+export function reqSubMsg(templateId) {
+  return requestSubscribeMessage([templateId]);
+}
+
+export async function reqAcceptSubMsg(templateId) {
+  const isAccept = await isSubAccept(templateId);
+  if (isAccept) {
+    await requestSubscribeMessage([templateId]).catch(() => void 0);
+  }
+  return isAccept;
+}
+
+export async function reqAcceptSubMsgs(templateIds = []) {
+  const acceptTemplateIds = await isSubAccept(templateIds).catch(() => []);
+  if (acceptTemplateIds.length) {
+    await requestSubscribeMessage(acceptTemplateIds).catch(() => void 0);
+  }
+  return acceptTemplateIds;
+}
+
+export default requestSubscribeMessage;

+ 21 - 0
src/main.js

@@ -0,0 +1,21 @@
+import App from "./App";
+
+// #ifndef VUE3
+import Vue from "vue";
+Vue.config.productionTip = false;
+App.mpType = "app";
+const app = new Vue({
+  ...App,
+});
+app.$mount();
+// #endif
+
+// #ifdef VUE3
+import { createSSRApp } from "vue";
+export function createApp() {
+  const app = createSSRApp(App);
+  return {
+    app,
+  };
+}
+// #endif

+ 168 - 0
src/manifest.json

@@ -0,0 +1,168 @@
+{
+    "name" : "初见潮玩",
+    "appid" : "__UNI__847F0D4",
+    "description" : "",
+    "versionName" : "1.0.0",
+    "versionCode" : "100",
+    "transformPx" : false,
+    /* 5+App特有相关 */
+    "app-plus" : {
+        "usingComponents" : true,
+        "nvueStyleCompiler" : "uni-app",
+        "compilerVersion" : 3,
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true,
+            "waiting" : true,
+            "autoclose" : true,
+            "delay" : 0
+        },
+        /* 模块配置 */
+        "modules" : {
+            "OAuth" : {},
+            "Payment" : {},
+            "Share" : {},
+            "UIWebview" : {},
+            "Webview-x5" : {}
+        },
+        /* 应用发布信息 */
+        "distribute" : {
+            /* android打包配置 */
+            "android" : {
+                "permissions" : [
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.INTERNET\"/>",
+                    "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ],
+                "schemes" : "cjcw",
+                "minSdkVersion" : 19
+            },
+            /* ios打包配置 */
+            "ios" : {
+                "urltypes" : "cjcw",
+                "capabilities" : {
+                    "entitlements" : {
+                        "com.apple.developer.associated-domains" : [ "https://yerhao.com" ]
+                    }
+                }
+            },
+            /* SDK配置 */
+            "sdkConfigs" : {
+                "oauth" : {
+                    "weixin" : {
+                        "appid" : "",
+                        "appsecret" : "",
+                        "UniversalLinks" : ""
+                    }
+                },
+                "payment" : {
+                    "alipay" : {
+                        "__platform__" : [ "ios", "android" ]
+                    },
+                    "weixin" : {
+                        "__platform__" : [ "ios", "android" ],
+                        "appid" : "",
+                        "UniversalLinks" : ""
+                    }
+                },
+                "push" : {
+                    "unipush" : {}
+                },
+                "share" : {
+                    "weixin" : {
+                        "appid" : "",
+                        "UniversalLinks" : ""
+                    }
+                },
+                "statics" : {}
+            },
+            "icons" : {
+                "android" : {
+                    "hdpi" : "unpackage/res/icons/72x72.png",
+                    "xhdpi" : "unpackage/res/icons/96x96.png",
+                    "xxhdpi" : "unpackage/res/icons/144x144.png",
+                    "xxxhdpi" : "unpackage/res/icons/192x192.png"
+                },
+                "ios" : {
+                    "appstore" : "unpackage/res/icons/1024x1024.png",
+                    "ipad" : {
+                        "app" : "unpackage/res/icons/76x76.png",
+                        "app@2x" : "unpackage/res/icons/152x152.png",
+                        "notification" : "unpackage/res/icons/20x20.png",
+                        "notification@2x" : "unpackage/res/icons/40x40.png",
+                        "proapp@2x" : "unpackage/res/icons/167x167.png",
+                        "settings" : "unpackage/res/icons/29x29.png",
+                        "settings@2x" : "unpackage/res/icons/58x58.png",
+                        "spotlight" : "unpackage/res/icons/40x40.png",
+                        "spotlight@2x" : "unpackage/res/icons/80x80.png"
+                    },
+                    "iphone" : {
+                        "app@2x" : "unpackage/res/icons/120x120.png",
+                        "app@3x" : "unpackage/res/icons/180x180.png",
+                        "notification@2x" : "unpackage/res/icons/40x40.png",
+                        "notification@3x" : "unpackage/res/icons/60x60.png",
+                        "settings@2x" : "unpackage/res/icons/58x58.png",
+                        "settings@3x" : "unpackage/res/icons/87x87.png",
+                        "spotlight@2x" : "unpackage/res/icons/80x80.png",
+                        "spotlight@3x" : "unpackage/res/icons/120x120.png"
+                    }
+                }
+            },
+            "splashscreen" : {
+                "iosStyle" : "common",
+                "useOriginalMsgbox" : true,
+                "androidStyle" : "common"
+            }
+        },
+        "nvueLaunchMode" : ""
+    },
+    /* 快应用特有相关 */
+    "quickapp" : {},
+    /* 小程序特有相关 */
+    "mp-weixin" : {
+        "appid" : "wx090cc3b016e45bfe",
+        "setting" : {
+            "urlCheck" : false,
+            "postcss" : true,
+            "minified" : true,
+            "es6" : true
+        },
+        "cloudfunctionRoot" : "cloudfunctions/",
+        "usingComponents" : true,
+        "lazyCodeLoading" : "requiredComponents",
+        "plugins" : {},
+        "uniStatistics" : {
+            "enable" : false
+        },
+        "unipush" : {
+            "enable" : false
+        }
+    },
+    "mp-alipay" : {
+        "usingComponents" : true
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "uniStatistics" : {
+        "enable" : false
+    },
+    "vueVersion" : "2"
+}

+ 279 - 0
src/pages.json

@@ -0,0 +1,279 @@
+{
+  "easycom": {
+    "autoscan": true,
+    "custom": {
+      // uni-ui 规则如下配置
+      "^uni-(.*)": "@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue"
+    }
+  },
+  "pages": [
+    {
+      "path": "pages/index/index",
+      "style": {
+        "enablePullDownRefresh": true,
+        "navigationStyle": "custom",
+        "backgroundColor": "#fff",
+        "onReachBottomDistance": 50
+      }
+    },
+    {
+      "path": "pages/index/list",
+      "style": {
+        "enablePullDownRefresh": true
+      }
+    },
+    {
+      "path": "pages/my/my",
+      "style": {
+        "navigationBarTitleText": "我的",
+        "enablePullDownRefresh": true,
+        "navigationBarBackgroundColor": "#F7F7FC",
+        "backgroundColor": "#F7F7FC"
+      }
+    },
+    {
+      "path": "pages/my/wallet",
+      "style": {
+        "navigationBarTitleText": "",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/my/coupon",
+      "style": {
+        "navigationBarTitleText": "红包卡券",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/detail/detail",
+      "style": {
+        "navigationBarTitleText": "初见潮玩",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/rule/rule",
+      "style": {
+        "navigationBarTitleText": "",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/order/order",
+      "style": {
+        "navigationBarTitleText": "消费记录",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/order/unsend",
+      "style": {
+        "navigationBarTitleText": "寄存盒柜",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/order/sended",
+      "style": {
+        "navigationBarTitleText": "发货订单",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/address/address",
+      "style": {
+        "navigationBarTitleText": "收货地址",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/address/add",
+      "style": {
+        "navigationBarTitleText": "新增地址",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/help/help",
+      "style": {
+        "navigationBarTitleText": "问题与帮助",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/help/help_user",
+      "style": {
+        "navigationBarTitleText": "用户服务协议",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/help/help_about",
+      "style": {
+        "navigationBarTitleText": "关于我们",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/help/help_rule",
+      "style": {
+        "navigationBarTitleText": "余额说明",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/help/help_contact",
+      "style": {
+        "navigationBarTitleText": "人工客服",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/beto/beto",
+      "style": {
+        "navigationBarTitleText": "即将上线",
+        "enablePullDownRefresh": true
+      }
+    },
+    {
+      "path": "pages/community/community",
+      "style": {
+        "navigationBarTitleText": "社群专属优惠券",
+        "enablePullDownRefresh": false,
+        "backgroundTextStyle": "light",
+        "navigationBarBackgroundColor": "#FF4D4D"
+      }
+    },
+    {
+      "path": "pages/webview/webview",
+      "style": {
+        "navigationBarTitleText": "",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/my/invite",
+      "style": {
+        "navigationBarTitleText": "邀请好友",
+        "enablePullDownRefresh": false,
+        "navigationBarBackgroundColor": "#FFFFFF",
+        "backgroundColor": "#F7F7FC"
+      }
+    },
+    {
+      "path": "pages/activity/index",
+      "style": {
+        "navigationBarTitleText": "活动中心",
+        "enablePullDownRefresh": true,
+        "navigationBarBackgroundColor": "#FFFFFF",
+        "backgroundColor": "#F5F5F5"
+      }
+    },
+    {
+      "path": "pages/activity/detail",
+      "style": {
+        "navigationBarTitleText": "活动中心",
+        "navigationBarBackgroundColor": "#FFFFFF",
+        "backgroundColor": "#F5F5F5"
+      }
+    },
+    {
+      "path": "pages/task/index",
+      "style": {
+        "navigationBarTitleText": "积分任务",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#30303A",
+        "backgroundColor": "#F6F6F6"
+      }
+    },
+    {
+      "path": "pages/reward/detail",
+      "style": {
+        "navigationBarTitleText": "一番赏",
+        "navigationBarBackgroundColor": "#FFFFFF",
+        "backgroundColor": "#F5F5F5"
+      }
+    },
+    {
+      "path": "pages/my/recharge",
+      "style": {
+        "navigationBarTitleText": "充值",
+        "navigationBarBackgroundColor": "#FFFFFF",
+        "backgroundColor": "#FFFFFF"
+      }
+    },
+    {
+      "path": "pages/my/messages",
+      "style": {
+        "navigationBarTitleText": "消息中心",
+        "navigationBarBackgroundColor": "#FFFFFF",
+        "backgroundColor": "#FFFFFF",
+        "enablePullDownRefresh": true,
+        "onReachBottomDistance": 50
+      }
+    }
+  ],
+  "globalStyle": {
+    "navigationBarTextStyle": "black",
+    "navigationBarTitleText": "初见潮玩",
+    "navigationBarBackgroundColor": "#FFF",
+    "backgroundColor": "#FFF"
+  },
+  "tabBar": {
+    "color": "#292D3B",
+    "selectedColor": "#292D3B",
+    "backgroundColor": "#FFFFFF",
+    "borderStyle": "black",
+    "spacing": "4px",
+    "fontSize": "14px",
+    "iconWidth": "35px",
+    "list": [
+      {
+        "pagePath": "pages/index/index",
+        "text": "首页",
+        "iconPath": "static/icon/icon-home.png",
+        "selectedIconPath": "static/icon/icon-home-selected.png"
+      },
+      {
+        "pagePath": "pages/activity/index",
+        "text": "活动",
+        "iconPath": "static/icon/icon-activity.png",
+        "selectedIconPath": "static/icon/icon-activity-selected.png"
+      },
+      {
+        "pagePath": "pages/my/my",
+        "text": "我的",
+        "iconPath": "static/icon/icon-user.png",
+        "selectedIconPath": "static/icon/icon-user-selected.png"
+      }
+    ]
+  },
+  "condition": {
+    "current": 0,
+    "list": [
+      {
+        "name": "index",
+        "path": "pages/index/index",
+        "query": "id=7"
+      },
+      {
+        "name": "detail",
+        "path": "pages/detail/detail",
+        "query": "id=7"
+      },
+      {
+        "name": "unsend",
+        "path": "pages/order/unsend"
+      },
+      {
+        "name": "sended",
+        "path": "pages/order/sended"
+      },
+      {
+        "name": "address",
+        "path": "pages/address/address"
+      }
+    ]
+  }
+}

+ 411 - 0
src/pages/activity/detail.vue

@@ -0,0 +1,411 @@
+<template>
+  <view class="act-detail">
+    <view v-if="detail" class="detail-head">
+      <view class="detail-head-info" v-html="detail.desc" />
+      <!-- <view class="detail-head-desc"
+        >活动时间:{{ detail.start_time }} 至 {{ detail.open_time }}</view
+      > -->
+      <!-- <view class="detail-head-desc">开奖时间:{{ detail.open_time }}</view> -->
+    </view>
+    <view class="title">奖品列表</view>
+    <template v-if="detail && detail.skus && detail.skus.length">
+      <view class="title-desc">
+        <text class="title-item"
+          >价值:<text class="price">&yen; {{ detail.total_price }}</text></text
+        >
+        <text class="title-item"
+          >数量:<text class="color">{{ detail.sku_num }}</text></text
+        >
+      </view>
+      <view class="prize-list">
+        <view v-for="item in detail.skus" :key="item.id" class="prize-item">
+          <image class="prize-img" :src="item.img" mode="aspectFill"></image>
+          <view class="prize-body">
+            <view class="prize-title">{{ item.name }}</view>
+            <view class="prize-desc">
+              <text class="sale-label">&yen;</text>
+              <text class="big">{{ item.price }}</text>
+            </view>
+          </view>
+        </view>
+      </view>
+    </template>
+    <template v-if="detail && detail.winndr_list && detail.winndr_list.length">
+      <view class="title">中奖名单</view>
+      <view class="win-list">
+        <view
+          v-for="item in detail.winndr_list"
+          :key="item.id"
+          class="win-item"
+        >
+          <image
+            class="win-avatar"
+            :src="item.avatar"
+            mode="aspectFill"
+          ></image>
+          <text class="win-user">{{ item.nick_name }}</text>
+          <text class="win-name">{{ item.sku_name }}</text>
+        </view>
+      </view>
+    </template>
+    <view class="title">
+      参与人员
+      <text>{{ detail.account_num || 0 }}人</text>
+    </view>
+    <view
+      v-if="detail && detail.account_list && detail.account_list.length"
+      class="user-list"
+    >
+      <view
+        v-for="item in detail.account_list"
+        :key="item.id"
+        class="user-item"
+      >
+        <image class="user-avatar" :src="item.avatar" mode="aspectFill">
+        </image>
+        <text class="user-name">{{ item.nick_name }}</text>
+      </view>
+    </view>
+    <view class="act-footer">
+      <button v-if="detail.status === 0" class="btn btn-gray">未开始</button>
+      <button v-else-if="detail.status === 2" class="btn btn-gray">
+        活动已结束
+      </button>
+      <button v-else-if="detail.user_status === 0" class="btn btn-gray">
+        审核中
+      </button>
+      <button v-else-if="detail.user_status === 1" class="btn btn-gray">
+        已参与
+      </button>
+      <button v-else-if="detail.user_status === 2" class="btn btn-gray">
+        已拒绝
+      </button>
+      <button v-else class="btn" @click="handleJoin">立即参与</button>
+      <view class="act-footer-desc">开奖时间: {{ detail.open_time }}</view>
+    </view>
+  </view>
+</template>
+
+<script>
+import login from "@/lib/utils/login";
+import api from "@/lib/api/api";
+import {
+  requestSubscribeMessage,
+  defaultTemplateIds,
+  activityTemplateId,
+} from "@/lib/utils/wxSubscribe";
+
+export default {
+  name: "PageActivityDetail",
+  data() {
+    return {
+      userInfo: null,
+      id: 0,
+      detail: null,
+    };
+  },
+  computed: {
+    isLogin() {
+      return !!this.userInfo && !!this.userInfo.session;
+    },
+  },
+  onLoad(data) {
+    this.id = data.id;
+    const uinfoStr = uni.getStorageSync("userinfo");
+    if (uinfoStr) {
+      this.userInfo = JSON.parse(uinfoStr);
+    }
+  },
+  onShow() {
+    this.loadDetail();
+  },
+  onShareAppMessage() {
+    return {
+      title: this.detail.title,
+      imageUrl:
+        this.detail.img ||
+        "https://chujianchaowan.oss-cn-beijing.aliyuncs.com/images/7c221479f67a19a85ec1b8f5916436c1.jpg",
+      path: "/pages/activity/detail?id=" + this.id,
+    };
+  },
+  onShareTimeline() {
+    return {
+      title: this.detail.title,
+      imageUrl:
+        this.detail.img ||
+        "https://chujianchaowan.oss-cn-beijing.aliyuncs.com/images/7c221479f67a19a85ec1b8f5916436c1.jpg",
+      path: "/pages/activity/detail?id=" + this.id,
+    };
+  },
+  methods: {
+    async loadDetail() {
+      const res = await api.activityDetail(
+        this.id,
+        this.userInfo && this.userInfo.session ? this.userInfo.session : ""
+      );
+      this.detail = res.data;
+      if (res.data.title) {
+        uni.setNavigationBarTitle({
+          title: res.data.title,
+        });
+      }
+    },
+    async handleJoin() {
+      if (!this.isLogin) {
+        await new Promise((resolve) => {
+          login.wxLogin((userInfo) => {
+            this.userInfo = userInfo;
+            resolve();
+          });
+        });
+        await this.loadDetail();
+      }
+
+      // #ifdef MP-WEIXIN
+      if (this.detail.template) {
+        await requestSubscribeMessage([
+          ...defaultTemplateIds,
+          activityTemplateId,
+        ]).catch(() => void 0);
+      }
+      // #endif
+
+      this.joinActivity();
+    },
+    async joinActivity() {
+      const { data, errno, errmsg } = await api.joinActivity({
+        feature_activity_id: this.id,
+        session: this.userInfo.session,
+      });
+      if (errno === 10000) {
+        uni.showToast({
+          icon: "none",
+          title: data.desc,
+          duration: 3000,
+        });
+        this.detail.user_status = data.status;
+      } else {
+        uni.showToast({
+          icon: "none",
+          title: errmsg,
+          duration: 3000,
+        });
+      }
+    },
+  },
+};
+</script>
+<style lang="scss">
+.act-detail {
+  min-height: 100vh;
+  background: #f5f5f5;
+  box-sizing: border-box;
+  padding: 24rpx 24rpx 256rpx;
+  .title {
+    margin: 44rpx 0 16rpx;
+    font-weight: 400;
+    font-family: ysbth;
+    font-size: 46rpx;
+    color: #000;
+    text {
+      font-size: 28rpx;
+      color: #9496a5;
+      margin-left: 18rpx;
+    }
+  }
+  .detail-head {
+    padding: 24rpx;
+    background: #fff;
+    font-size: 28rpx;
+    color: #292d3b;
+    border-radius: 10rpx;
+    line-height: 40rpx;
+    .detail-head-info {
+      color: #9496a5;
+      line-height: 36rpx;
+      letter-spacing: 1.5rpx;
+    }
+    .detail-head-desc {
+      line-height: 34rpx;
+      margin-top: 16rpx;
+      letter-spacing: 0.3rpx;
+    }
+  }
+  .title-desc {
+    height: 40rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #9496a5;
+    line-height: 40rpx;
+    display: flex;
+    justify-content: flex-start;
+    margin: -8rpx 0 9rpx;
+    .title-item {
+      display: block;
+      margin-right: 66rpx;
+      .price {
+        color: #08c2c3;
+      }
+      .color {
+        color: #292d3b;
+      }
+    }
+  }
+  .prize-list {
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: space-between;
+    margin: 0 -7rpx;
+  }
+  .prize-item {
+    display: flex;
+    width: 344rpx;
+    background: #ffffff;
+    margin: 7rpx;
+    border-radius: 5rpx;
+    .prize-img {
+      width: 144rpx;
+      height: 144rpx;
+    }
+    .prize-body {
+      width: 0;
+      flex: 1;
+      display: flex;
+      flex-direction: column;
+      justify-content: space-between;
+      padding: 10rpx 8rpx;
+      .prize-title {
+        width: 184rpx;
+        font-size: 20rpx;
+        font-weight: 500;
+        color: #292d3b;
+        line-height: 28rpx;
+        text-overflow: ellipsis;
+        display: -webkit-box;
+        overflow: hidden;
+        -webkit-line-clamp: 3;
+        -webkit-box-orient: vertical;
+        letter-spacing: 0.1rpx;
+      }
+      .prize-desc {
+        height: 34rpx;
+        line-height: 34rpx;
+        font-size: 20rpx;
+        font-weight: 600;
+        color: #08c2c3;
+        .sale-label {
+          margin-right: 5rpx;
+        }
+        .big {
+          font-size: 26rpx;
+          font-weight: normal;
+        }
+      }
+    }
+  }
+  .win-list {
+    padding: 24rpx 18rpx;
+    margin: 20rpx 0;
+    background-color: #fff;
+    .win-item {
+      display: flex;
+      align-items: center;
+      font-size: 28rpx;
+      font-weight: 500;
+      color: #292d3b;
+      margin: 32rpx 0;
+      &:first-child {
+        margin-top: 0;
+      }
+      &:last-child {
+        margin-bottom: 0;
+      }
+      .win-avatar {
+        width: 40rpx;
+        height: 40rpx;
+        margin-right: 8rpx;
+        border-radius: 100%;
+      }
+      .win-user,
+      .win-name {
+        display: block;
+        white-space: nowrap;
+        text-overflow: ellipsis;
+        overflow: hidden;
+      }
+      .win-user {
+        width: 220rpx;
+      }
+      .win-name {
+        flex: 1;
+        width: 0;
+      }
+    }
+  }
+  .user-list {
+    display: grid;
+    grid-template-columns: repeat(5, minmax(0, 1fr));
+    margin: 0 -7rpx;
+    .user-item {
+      margin: 12rpx 7rpx;
+      .user-avatar {
+        width: 95rpx;
+        height: 96rpx;
+        display: block;
+        margin: 0 auto;
+        border-radius: 100%;
+      }
+      .user-name {
+        display: block;
+        margin-top: 16rpx;
+        width: 100%;
+        height: 40rpx;
+        font-size: 24rpx;
+        font-weight: 500;
+        color: #9496a5;
+        line-height: 40rpx;
+        white-space: nowrap;
+        text-overflow: ellipsis;
+        overflow: hidden;
+        text-align: center;
+      }
+    }
+  }
+  .act-footer {
+    position: fixed;
+    bottom: 0;
+    left: 0;
+    width: 100%;
+    box-sizing: border-box;
+    padding: 24rpx 48rpx 32rpx;
+    background: #ffffff;
+    letter-spacing: 5rpx;
+    .btn {
+      display: block;
+      width: 100%;
+      border-radius: 0;
+      height: 96rpx;
+      line-height: 96rpx;
+      background: #08c2c3;
+      font-size: 36rpx;
+      font-weight: 500;
+      color: #292d3b;
+      &.btn-gray {
+        background: #9496a5;
+      }
+      &::after {
+        display: none;
+      }
+    }
+    .act-footer-desc {
+      text-align: center;
+      margin-top: 16rpx;
+      font-size: 24rpx;
+      font-weight: 500;
+      color: #9496a5;
+      line-height: 34rpx;
+      letter-spacing: 0rpx;
+    }
+  }
+}
+</style>

+ 113 - 0
src/pages/activity/index.vue

@@ -0,0 +1,113 @@
+<template>
+  <view class="act-list">
+    <template v-if="activetys.length">
+      <view class="title">推荐活动</view>
+      <activity
+        v-for="item in activetys"
+        :key="item.id"
+        :activity="item"
+        @click="handleToDetail"
+        @end="handleTimeEnd"
+      ></activity>
+    </template>
+    <template v-if="moreList.length">
+      <view class="title">更多活动</view>
+      <activity
+        v-for="item in moreList"
+        :key="item.id"
+        :activity="item"
+        @click="handleToDetail"
+      ></activity>
+    </template>
+  </view>
+</template>
+
+<script>
+import api from "@/lib/api/api";
+import activity from "@/components/activity/activity.vue";
+export default {
+  name: "PageActivity",
+  components: { activity },
+  data() {
+    return {
+      activetys: [],
+      moreList: [],
+    };
+  },
+  onShow() {
+    this.loadList();
+  },
+  onPullDownRefresh() {
+    this.loadList()
+      .then(() => {
+        uni.stopPullDownRefresh();
+      })
+      .catch(() => {
+        uni.stopPullDownRefresh();
+      });
+  },
+  onShareAppMessage() {
+    return {
+      title: "@你,欢迎进入<初见福利社>,各种0元免费活动享不停!",
+      imageUrl:
+        "https://chujianchaowan.oss-cn-beijing.aliyuncs.com/images/7c221479f67a19a85ec1b8f5916436c1.jpg",
+      path: "/pages/activity/index",
+    };
+  },
+  onShareTimeline() {
+    return {
+      title: "@你,欢迎进入<初见福利社>,各种0元免费活动享不停!",
+      imageUrl:
+        "https://chujianchaowan.oss-cn-beijing.aliyuncs.com/images/7c221479f67a19a85ec1b8f5916436c1.jpg",
+      path: "/pages/activity/index",
+    };
+  },
+  methods: {
+    async loadList() {
+      const { data = {} } = await api.activityList();
+      this.activetys = data.activetys || [];
+      this.moreList = data.other_activetys || [];
+    },
+    handleToDetail(item) {
+      uni.navigateTo({
+        url: `./detail?id=${item.id}`,
+      });
+      // if (!url) return;
+
+      // if (/^https?:\/\//i.test(url)) {
+      // 	uni.navigateTo({
+      // 		url: `../webview/webview?url=${encodeURIComponent(url)}`,
+      // 	});
+      // 	return;
+      // }
+      // uni.navigateTo({
+      // 	url: url,
+      // });
+    },
+    handleTimeEnd(item) {
+      item.status = 2;
+    },
+  },
+};
+</script>
+<style lang="scss">
+.act-list {
+  box-sizing: border-box;
+  padding: 36rpx 24rpx;
+  min-height: 100vh;
+  background: #f5f5f5;
+
+  .title {
+    display: block;
+    margin: 26rpx 0;
+    font-weight: 400;
+    font-family: ysbth;
+    font-size: 46rpx;
+    color: #000;
+
+    &:first-child {
+      margin-top: 0;
+    }
+  }
+}
+</style>

+ 268 - 0
src/pages/address/add.vue

@@ -0,0 +1,268 @@
+<template>
+  <view class="content">
+    <view class="address">
+      <view class="address-list">
+        <text style="width: 229rpx; font-size: 30rpx; color: #999999"
+          >收件人姓名</text
+        >
+        <input
+          v-model="info.linkName"
+          placeholder="请输入收件人姓名"
+          type="text"
+        />
+      </view>
+      <view class="address-border"></view>
+      <view class="address-list">
+        <text style="width: 229rpx; font-size: 30rpx; color: #999999"
+          >联系电话</text
+        >
+        <input
+          v-model="info.linkTel"
+          placeholder="请输入联系电话"
+          type="number"
+          @input="numberFixedDigit"
+        />
+      </view>
+      <view class="address-border"></view>
+      <view class="address-list">
+        <text style="width: 229rpx; font-size: 30rpx; color: #999999"
+          >所在地区</text
+        >
+        <address-picker
+          class="planLocate"
+          :style="planLocate == '点击选择所在区域' ? 'color:#747c88' : ''"
+          @change="addressChange"
+          >{{ planLocate + "" }}</address-picker
+        >
+      </view>
+      <view class="address-border"></view>
+      <view class="address-list">
+        <text style="width: 229rpx; font-size: 30rpx; color: #999999"
+          >详细地址</text
+        >
+        <input
+          v-model="info.linkAddress"
+          placeholder="请输入收件地址"
+          type="text"
+        />
+      </view>
+    </view>
+    <view
+      class="bottom"
+      :style="
+        'opacity:' +
+        (info.linkAddress && info.linkName && info.linkTel ? '' : '0.4') +
+        ';'
+      "
+      @tap="saveAddress"
+      >保存</view
+    >
+  </view>
+</template>
+
+<script>
+import api from "@/lib/api/api";
+import addressPicker from "@/components/wangding-pickerAddress/wangding-pickerAddress";
+export default {
+  name: "PageAddressAdd",
+  components: {
+    "address-picker": addressPicker,
+  },
+  data() {
+    return {
+      userInfo: {},
+      planLocate: "点击选择所在区域",
+      info: {
+        id: 0,
+        linkName: "",
+        linkTel: "",
+        provinceName: "",
+        cityName: "",
+        countyName: "",
+        linkAddress: "",
+        nationalCode: "",
+        defaulted: "0",
+      },
+      id: "",
+    };
+  },
+  onLoad(data) {
+    if (data.info) {
+      const info = JSON.parse(decodeURI(data.info));
+      this.planLocate = info.city;
+      this.info.id = info.id;
+      this.info.linkName = info.name;
+      this.info.linkTel = info.phone;
+      this.info.linkAddress = info.address;
+      this.info.defaulted = "" + info.is_default;
+    }
+    //
+    const uinfoStr = uni.getStorageSync("userinfo");
+    if (uinfoStr) {
+      this.userInfo = JSON.parse(uinfoStr);
+      api
+        .addressList(data.session)
+        .then((data) => {
+          if (data.data) {
+            this.datas = data.data;
+          }
+        })
+        .catch((e) => {
+          console.error(e);
+        });
+    } else {
+      this.loginsuc = false;
+    }
+  },
+  methods: {
+    addressChange: function (n) {
+      this.planLocate = n.data[0] + n.data[1] + n.data[2];
+      this.info.provinceName = n.data[0];
+      this.info.cityName = n.data[1];
+      this.info.countyName = n.data[2];
+    },
+    numberFixedDigit(e) {
+      // 只能输入整数
+      e.target.value = e.target.value.replace(/^0|[^\d]|[.]/g, "");
+      this.$nextTick(() => {
+        this.info.linkTel = e.target.value;
+      });
+    },
+    saveAddress() {
+      if (
+        this.info.linkAddress == "" ||
+        this.info.linkName == "" ||
+        this.info.linkTel == ""
+      ) {
+        return;
+      }
+      const info = this.info,
+        data = {
+          session: this.userInfo.session,
+          name: info.linkName,
+          phone: info.linkTel,
+          address: info.linkAddress,
+          city: this.planLocate,
+          is_default: info.defaulted,
+        };
+      // if (info.linkTel !== '') {
+      //   var reg=/^1[3456789]\d{9}$/;
+      //   if(!reg.test(info.linkTel)){
+      // 		uni.showToast({
+      // 			icon:"error",
+      // 			title: "手机号不能为空"
+      // 		});
+      // 		return
+      //   }
+      // }
+
+      if (info.id > 0) {
+        data.id = "" + info.id;
+        api
+          .updateAddress(data)
+          .then(() => {
+            uni.redirectTo({
+              url: "./address",
+            });
+          })
+          .catch((e) => {
+            uni.showToast({
+              icon: "error",
+              title: e.errmsg,
+            });
+          });
+        return;
+      }
+
+      api
+        .addAddress(data)
+        .then(() => {
+          uni.redirectTo({
+            url: "./address",
+          });
+        })
+        .catch((e) => {
+          uni.showToast({
+            icon: "error",
+            title: e.errmsg,
+          });
+        });
+    },
+  },
+};
+</script>
+
+<style>
+image {
+  height: inherit;
+  width: inherit;
+}
+
+input {
+  font-size: 30rpx;
+}
+
+.content {
+  align-items: flex-start;
+  background-color: #f8f8f8;
+  display: flex;
+  flex-direction: column;
+  height: 100vh;
+  width: 750rpx;
+}
+
+.address {
+  background-color: #fff;
+  border-radius: 16rpx;
+  color: #333;
+  font-family: PingFangSC-Regular;
+  font-size: 34rpx;
+  height: 390rpx;
+  margin-left: 24rpx;
+  margin-top: 24rpx;
+  width: 702rpx;
+}
+
+.address-list {
+  align-items: center;
+  display: flex;
+  flex-wrap: nowrap;
+  /* float: left; */
+  font-size: 36rpx;
+  height: 96rpx;
+  line-height: 96rpx;
+  padding-left: 24rpx;
+  width: 702rpx;
+}
+
+.address-border {
+  background-color: #eee;
+  float: left;
+  height: 2rpx;
+  margin-left: 24rpx;
+  width: 678rpx;
+}
+
+.bottom {
+  background: #08c2c3;
+  border-radius: 4rpx;
+  color: #292d3b;
+  font-family: PingFangSC-Medium;
+  font-size: 30rpx;
+  height: 98rpx;
+  line-height: 98rpx;
+  margin-left: 24rpx;
+  margin-top: 120rpx;
+  text-align: center;
+  width: 702rpx;
+}
+
+.planLocate {
+  -webkit-box-orient: vertical;
+  -webkit-line-clamp: 1;
+  display: -webkit-box;
+  font-size: 30rpx;
+  overflow: hidden;
+  width: 400rpx;
+}
+</style>

+ 457 - 0
src/pages/address/address.vue

@@ -0,0 +1,457 @@
+<template>
+  <view class="content">
+    <scroll-view class="scroll-Y" :scroll-top="scrollTop" scroll-y="true">
+      <view v-if="datas.length == 0">
+        <view class="logo">
+          <image mode src="@/static/icon_v1/wszdz@3x.png"></image>
+        </view>
+        <view class="text">尚未设置收货地址</view>
+        <view class="text1">请新增收货地址,以便正常收货</view>
+        <view>
+          <view class="bottom" @tap="address">新增地址</view>
+          <view class="bottom" style="margin-left: 24rpx" @tap="importAddress"
+            >导入微信地址</view
+          >
+        </view>
+      </view>
+      <view
+        v-if="datas.length !== 0"
+        style="float: left; margin-bottom: 190rpx"
+      >
+        <view v-for="(item, key) in datas" :key="key" class="address">
+          <view class="address-text" @tap="selectAddr(item)"
+            >{{ item.name + " " + item.phone + "" }}
+            <text v-if="item.is_default == '1'" class="default">默认</text>
+          </view>
+          <view class="address-text1" @tap="selectAddr(item)">{{
+            item.city + item.address
+          }}</view>
+          <view class="address-border"></view>
+          <view class="address-operation">
+            <checkbox-group @change="setDefaulted(item)">
+              <label style="display: flex; align-items: center">
+                <checkbox
+                  :checked="item.is_default == '1' ? true : false"
+                  color="orange"
+                  style="transform: scale(0.7)"
+                />
+                <text class="content-title">设为默认</text>
+              </label>
+            </checkbox-group>
+            <image
+              mode
+              class="address-operation_img1"
+              src="@/static/icon_v1/bj.png"
+              @tap="editAddress(item)"
+            ></image>
+            <text @tap="editAddress(item)">编辑</text>
+            <!-- <image
+              mode
+              @tap="confirmDel(item.id)"
+              class="address-operation_img2"
+              src="@/static/icon_v1/sc@3x.png"
+            ></image> -->
+            <text @tap="confirmDel(item.id)">删除</text>
+          </view>
+        </view>
+      </view>
+      <view
+        v-if="datas.length !== 0"
+        style="
+          position: fixed;
+          bottom: 0;
+          width: 750rpx;
+          height: 166rpx;
+          background-color: #ffffff;
+        "
+      >
+        <view class="new-bottom1" @tap="address">新增地址</view>
+        <view class="bottom1" @tap="importAddress">导入微信地址</view>
+      </view>
+    </scroll-view>
+    <uni-popup ref="popup" type="center">
+      <view class="popup-overtime">
+        <!-- <view class="popup-overtime_img">
+          <image mode src="@/static/icon_v1/sc@3x.png"></image>
+        </view> -->
+        <view class="popup-overtime_text">确定删除此地址吗?</view>
+        <view class="popup-overtime_left" @tap="cancel">取消</view>
+        <view class="popup-overtime_right" @tap="del">确定</view>
+      </view>
+    </uni-popup>
+  </view>
+</template>
+
+<script>
+import api from "@/lib/api/api";
+export default {
+  name: "PageAddress",
+  data() {
+    return {
+      userInfo: {},
+      datas: [],
+      id: "",
+      action: false,
+    };
+  },
+  onLoad(data) {
+    this.action = data.action;
+  },
+  onShow() {
+    const uinfoStr = uni.getStorageSync("userinfo");
+    if (uinfoStr) {
+      this.userInfo = JSON.parse(uinfoStr);
+      this.refresh();
+    } else {
+      this.loginsuc = false;
+      this.userInfo = {};
+    }
+  },
+  methods: {
+    selectAddr(e) {
+      if (this.action == "choose") {
+        const n = getCurrentPages();
+        n[n.length - 2].setData({
+          address: e,
+        });
+        uni.navigateBack();
+      }
+    },
+    refresh() {
+      api
+        .addressList(this.userInfo.session)
+        .then((data) => {
+          if (data.data) {
+            this.datas = data.data;
+          }
+        })
+        .catch((e) => {
+          console.error(e);
+        });
+    },
+
+    setDefaulted(info) {
+      if (info.is_default) {
+        info.is_default = "0";
+      } else {
+        info.is_default = "1";
+      }
+      info.id = "" + info.id;
+      info.session = this.userInfo.session;
+      api
+        .updateAddress(info)
+        .then(() => {
+          this.refresh();
+        })
+        .catch((e) => {
+          uni.showToast({
+            icon: "error",
+            title: "保存失败,请稍后重试: " + e.errmsg,
+          });
+        });
+    },
+
+    editAddress(info) {
+      uni.navigateTo({
+        url: "./add?info=" + encodeURI(JSON.stringify(info)),
+      });
+    },
+
+    confirmDel(id) {
+      this.$refs.popup.open();
+      this.id = id;
+    },
+
+    cancel() {
+      this.$refs.popup.close();
+    },
+
+    del() {
+      this.cancel();
+      api
+        .delAddress({
+          id: ["" + this.id],
+          session: this.userInfo.session,
+        })
+        .then(() => {
+          this.refresh();
+        })
+        .catch((e) => {
+          console.error(e);
+        });
+    },
+
+    address() {
+      uni.navigateTo({
+        url: "./add",
+      });
+    },
+
+    importAddress() {
+      uni.chooseAddress({
+        success: (data) => {
+          const info = {
+            session: this.userInfo.session,
+            name: data.userName,
+            phone: data.telNumber,
+            city: `${data.provinceName}${data.cityName}${data.countyName}`,
+            address: data.detailInfo,
+            defaulted: "1",
+          };
+          api
+            .addAddress(info)
+            .then(() => {
+              this.refresh();
+            })
+            .catch((e) => {
+              uni.showToast({
+                icon: "error",
+                title: "保存失败,请稍后重试: " + e.errmsg,
+              });
+            });
+        },
+      });
+    },
+  },
+};
+</script>
+
+<style>
+/* #ifdef APP-PLUS ||MP-WEIXIN */
+checkbox .wx-checkbox-input {
+  /* margin-top: 30rpx; */
+  border-radius: 50% !important;
+  color: #ffffff !important;
+}
+
+checkbox .wx-checkbox-input.wx-checkbox-input-checked {
+  color: #fff;
+  background: #08c2c3;
+}
+/* #endif */
+image {
+  height: inherit;
+  width: inherit;
+}
+
+.content {
+  align-items: flex-start;
+  background-color: #f8f8f8;
+  display: flex;
+  flex-direction: column;
+  height: 100vh;
+  overflow: auto;
+  width: 750rpx;
+}
+
+.logo {
+  float: left;
+  height: 120rpx;
+  margin-left: 315rpx;
+  margin-top: 280rpx;
+  width: 120rpx;
+}
+
+.text {
+  color: #333;
+  float: left;
+  font-family: PingFangSC-Medium;
+  font-size: 36rpx;
+  height: 55rpx;
+  line-height: 55rpx;
+  margin-bottom: 8rpx;
+  margin-top: 32rpx;
+  text-align: center;
+  width: 750rpx;
+}
+
+.text1 {
+  color: #99999;
+  float: left;
+  font-family: PingFangSC-Regular;
+  font-size: 30rpx;
+  height: 42rpx;
+  line-height: 42rpx;
+  text-align: center;
+  width: 750rpx;
+}
+
+.bottom {
+  border-radius: 4rpx;
+  height: 80rpx;
+  line-height: 80rpx;
+  margin-left: 95rpx;
+  margin-top: 72rpx;
+  width: 268rpx;
+}
+
+.bottom1,
+.bottom {
+  background: #08c2c3;
+  color: #292d3b;
+  float: left;
+  font-family: PingFangSC-Medium;
+  text-align: center;
+}
+.new-bottom1 {
+  border-radius: 4rpx;
+  font-size: 32rpx;
+  height: 96rpx;
+  line-height: 96rpx;
+  margin-left: 24rpx;
+  margin-top: 24rpx;
+  width: 339rpx;
+  background: #08c2c3;
+  color: #292d3b;
+  float: left;
+  text-align: center;
+}
+.bottom1 {
+  background: #08c2c3;
+  border-radius: 4rpx;
+  font-size: 32rpx;
+  height: 96rpx;
+  line-height: 96rpx;
+  margin-left: 24rpx;
+  margin-top: 24rpx;
+  width: 339rpx;
+  color: #292d3b;
+}
+
+.address {
+  background: #fff;
+  border-radius: 24rpx;
+  float: left;
+  margin-left: 24rpx;
+  margin-top: 24rpx;
+  width: 702rpx;
+}
+
+.address-text {
+  align-items: center;
+  color: #333;
+  display: flex;
+  flex-wrap: wrap;
+  float: left;
+  font-family: PingFangSC-Regular;
+  font-size: 34rpx;
+  margin-bottom: 16rpx;
+  margin-left: 24rpx;
+  margin-top: 24rpx;
+  width: 653rpx;
+}
+
+.address-text1 {
+  font-size: 30rpx;
+}
+
+.address-operation,
+.address-text1 {
+  color: #999;
+  float: left;
+  font-family: PingFangSC-Regular;
+  margin-bottom: 24rpx;
+  margin-left: 24rpx;
+  width: 653rpx;
+}
+
+.address-operation {
+  align-items: center;
+  display: flex;
+  flex-wrap: wrap;
+  font-size: 26rpx;
+  height: 36rpx;
+  margin-top: 24rpx;
+}
+
+.address-border {
+  background-color: #eee;
+  float: left;
+  height: 2rpx;
+  margin-left: 24rpx;
+  width: 653rpx;
+}
+
+.address-operation_img {
+  height: 36rpx;
+  margin-right: 8rpx;
+  width: 36rpx;
+}
+
+.address-operation_img1 {
+  height: 32rpx;
+  margin-left: 255rpx;
+  margin-right: 10rpx;
+  width: 31rpx;
+}
+
+.address-operation_img2 {
+  height: 32rpx;
+  margin-left: 42rpx;
+  margin-right: 10rpx;
+  width: 32rpx;
+}
+
+.popup-overtime {
+  background-color: #fff;
+  border-radius: 32rpx;
+  height: 503rpx;
+  width: 600rpx;
+}
+
+.popup-overtime_img {
+  float: left;
+  height: 120rpx;
+  margin-left: 240rpx;
+  margin-top: 72rpx;
+  width: 120rpx;
+}
+
+.popup-overtime_text {
+  color: #333;
+  float: left;
+  font-family: PingFangSC-Regular;
+  font-size: 36rpx;
+  height: 55rpx;
+  line-height: 55rpx;
+  margin-top: 32rpx;
+  text-align: center;
+  width: 600rpx;
+}
+
+.popup-overtime_left {
+  border: 2rpx solid #e5e5e5;
+  margin-left: 44rpx;
+}
+
+.popup-overtime_left,
+.popup-overtime_right {
+  border-radius: 40rpx;
+  color: #333;
+  float: left;
+  font-family: PingFangSC-Regular;
+  font-size: 34rpx;
+  height: 80rpx;
+  line-height: 80rpx;
+  margin-top: 72rpx;
+  text-align: center;
+  width: 244rpx;
+}
+
+.popup-overtime_right {
+  background: #08c2c3;
+  margin-left: 24rpx;
+}
+
+.default {
+  background: #08c2c3;
+  height: 28rpx;
+  font-size: 20rpx;
+  font-weight: 400;
+  color: #292d3b;
+  line-height: 28rpx;
+  margin-left: 8rpx;
+  text-align: center;
+  width: 64rpx;
+}
+</style>

+ 410 - 0
src/pages/beto/beto.vue

@@ -0,0 +1,410 @@
+<template>
+  <view class="content">
+    <view class="commodity">
+      <view class="commodity-box">
+        <view v-for="ele in datas" :key="ele.id" class="commodity-list">
+          <view class="item-img clearfix">
+            <view class="bj-icon">即将上线</view>
+            <image class="i-img" mode :src="ele.img"></image>
+          </view>
+
+          <view class="_p">{{ ele.name }}</view>
+          <view class="bottm-box">
+            <view v-if="ele.tag" class="new">{{ ele.tag }}</view>
+            <view class="bottom-right">¥{{ ele.show_price }}</view>
+          </view>
+        </view>
+      </view>
+      <view
+        v-show="isSubscription == 'test'"
+        class="shar"
+        mode="aspectFill"
+        @tap="newSubScription"
+      ></view>
+    </view>
+    <view v-if="total == datas.length" class="Tips">没有更多了</view>
+    <request-loading class="vue-ref" data-ref="message"></request-loading>
+  </view>
+</template>
+
+<script>
+import api from "@/lib/api/api";
+export default {
+  name: "PageBeto",
+  data() {
+    return {
+      background: ["color1", "color2", "color3"],
+      indicatorDots: !1,
+      autoplay: !0,
+      interval: 5e3,
+      duration: 500,
+      scrollTop: 0,
+      datas: [],
+      openid: "",
+      sessionKey: "",
+      token: !0,
+      username: "",
+      newUserActivity: "",
+      haveUserActivity: "",
+      couponTotal: 0,
+      userInfo: {},
+      isSubscription: false,
+    };
+  },
+  onLoad() {
+    uni.getSetting({
+      withSubscriptions: true,
+      success(res) {
+        if (
+          res.subscriptionsSetting.itemSettings[
+            "XaY2_hSO-9hSeC5IIEoCX5oBo2ydOzUTx1HhKSEu2F8"
+          ] == "accept"
+        ) {
+          this.isSubscription = true;
+        }
+      },
+    });
+  },
+  onPageScroll: function (e) {
+    this.scrollTop = e.scrollTop;
+  },
+  onPullDownRefresh() {
+    this.loadList();
+  },
+  onShow() {
+    this.loadList();
+    const n = uni.getMenuButtonBoundingClientRect();
+    this.top1 = n.top + 5 + "px";
+  },
+  methods: {
+    loadList() {
+      api
+        .beTo()
+        .then((data) => {
+          if (data.data) {
+            this.datas = data.data;
+            uni.stopPullDownRefresh();
+          }
+        })
+        .catch(() => {
+          uni.showToast({
+            icon: "none",
+            title: "出错啦,请稍后重试",
+          });
+        });
+    },
+    newSubScription() {
+      uni.requestSubscribeMessage({
+        tmplIds: ["XaY2_hSO-9hSeC5IIEoCX5oBo2ydOzUTx1HhKSEu2F8"],
+        success: () => {
+          this.isSubscription = true;
+        },
+        fail() {
+          uni.showToast({
+            icon: "none",
+            title: "新品订阅授权失败",
+          });
+        },
+      });
+    },
+  },
+};
+</script>
+<style lang="scss">
+.shar {
+  width: 734rpx;
+  height: 120rpx;
+  background-image: url(https://oushen2022.oss-cn-beijing.aliyuncs.com/images/46dd340d01c241338bd692313409856d.png);
+  position: fixed;
+  bottom: 10rpx;
+  left: 15rpx;
+  z-index: 999;
+  background-size: 100% auto;
+  background-repeat: no-repeat;
+}
+</style>
+
+<style>
+.clearfix:after {
+  content: ".";
+  display: block;
+  height: 0;
+  clear: both;
+  visibility: hidden;
+}
+.content {
+  align-items: flex-start;
+  display: flex;
+  flex-direction: column;
+  width: 750rpx;
+  background: #f5f6f7;
+}
+
+.spot {
+  align-items: center;
+  animation: all 0.5s;
+  display: flex;
+  flex-wrap: wrap;
+  height: 8rpx;
+  justify-content: center;
+  position: absolute;
+  top: 504rpx;
+  width: 750rpx;
+  z-index: 9;
+}
+
+.spot-list {
+  width: 40rpx;
+}
+
+.spot-list1,
+.spot-list {
+  background: #fff;
+  border-radius: 6.5rpx;
+  height: 8rpx;
+  margin-left: 5rpx;
+  margin-right: 5rpx;
+}
+
+.spot-list1 {
+  opacity: 0.4;
+  width: 18rpx;
+}
+
+image {
+  height: inherit;
+  width: inherit;
+}
+
+.logo {
+  height: 44rpx;
+  left: 24rpx;
+  position: fixed;
+  width: 190rpx;
+  z-index: 99;
+}
+
+.top1 {
+  height: 11vh;
+  position: fixed;
+  top: 0;
+  width: 750rpx;
+  z-index: 9;
+}
+
+.swiper-item,
+.swiper-item > image,
+.swiper {
+  height: 560rpx;
+  width: 750rpx;
+}
+
+.commodity {
+  width: 750rpx;
+}
+
+.commodity-box {
+  background: #ffffff;
+  padding: 24rpx 24rpx 0 24rpx;
+  display: flex;
+  justify-content: space-between;
+  flex-wrap: wrap;
+}
+.title-block {
+  background: #fec56e;
+  display: block;
+  width: 100%;
+  height: 18rpx;
+  border-radius: 20rpx;
+  position: absolute;
+  z-index: -1;
+  top: 25rpx;
+}
+.commodity-list {
+  background: #f5f6f7;
+  margin-bottom: 24rpx;
+  overflow: hidden;
+  width: 338rpx;
+  padding-bottom: 17rpx;
+  /* box-shadow: 2rpx 3rpx 6rpx 0rpx rgba(144,144,144,0.31); */
+  border-radius: 20rpx;
+}
+.commodity-list > image {
+  border-radius: 20rpx 20rpx 0rpx 0rpx;
+  float: left;
+  height: 338rpx;
+  width: 338rpx;
+}
+
+.commodity-list > ._p {
+  -webkit-box-orient: vertical;
+  -webkit-line-clamp: 1;
+  color: #111;
+  display: -webkit-box;
+  float: left;
+  font-family: PingFangSC-Medium, PingFang SC;
+  font-size: 28rpx;
+  height: 38rpx;
+  line-height: 38rpx;
+  margin-top: 14rpx;
+  overflow: hidden;
+  text-indent: 16rpx;
+  width: 322rpx;
+  margin-bottom: 14rpx;
+}
+.item-img {
+  position: relative;
+  height: 338rpx;
+  width: 338rpx;
+}
+.bj-icon {
+  position: absolute;
+  z-index: 999;
+  text-align: center;
+  width: 110rpx;
+  line-height: 40rpx;
+  height: 40rpx;
+  font-size: 22rpx;
+  font-family: PingFang-SC-Medium, PingFang-SC;
+  font-weight: 500;
+  color: #ffffff;
+  background: #ffb25c;
+  letter-spacing: 0.1px;
+  border-top-left-radius: 5px;
+  border-bottom-right-radius: 5px;
+}
+.bj-img {
+  border-radius: 20rpx 20rpx 0rpx 0rpx;
+  float: left;
+  position: absolute;
+  height: 338rpx;
+  width: 338rpx;
+}
+.i-img {
+  position: absolute;
+  z-index: 99;
+  height: 338rpx;
+  width: 338rpx;
+  background: #d8d8d8;
+}
+.bottom-right {
+  font-size: 32rpx;
+  font-family: Alibaba PuHuiTi;
+  font-weight: bold;
+  color: #cd2b35;
+  float: right;
+  padding-right: 16rpx;
+}
+.new {
+  font-size: 24rpx;
+  font-family: Alibaba PuHuiTi;
+  font-weight: 500;
+  color: #cd2b35;
+  display: inline-block;
+  padding: 4rpx 10rpx;
+  border: 2rpx solid #cd2b35;
+  border-radius: 10rpx;
+  margin-left: 16rpx;
+}
+.commodity-banner {
+  height: 195rpx;
+  width: 750rpx;
+  padding-top: 25rpx;
+}
+.commodity-banner > image {
+  height: 100%;
+  width: 100%;
+}
+.login {
+  background: #fff;
+  border-radius: 16rpx;
+  bottom: 40rpx;
+  box-shadow: 0 0 16rpx 0 rgba(0, 0, 0, 0.2);
+  height: 136rpx;
+  left: 24rpx;
+  position: fixed;
+  width: 702rpx;
+}
+
+.login-img {
+  float: left;
+  height: 94rpx;
+  margin-left: 24rpx;
+  margin-right: 24rpx;
+  margin-top: 21rpx;
+  position: relative;
+  text-align: center;
+  width: 88rpx;
+}
+
+.login-img > .activity {
+  color: red;
+  font-size: 24rpx;
+  font-weight: 700;
+  left: 7rpx;
+  position: absolute;
+  top: 10rpx;
+  width: 80rpx;
+}
+
+.login-img > .activity .unit {
+  font-size: 14rpx;
+  padding-left: 10rpx;
+}
+
+.long-text {
+  float: left;
+  height: 136rpx;
+  width: 270rpx;
+}
+
+.long-text1 {
+  color: #333;
+  font-family: PingFangSC-Regular;
+  font-size: 30rpx;
+  height: 30rpx;
+  margin-top: 27rpx;
+  width: 270rpx;
+}
+
+.long-text2 {
+  color: #999;
+  font-family: PingFangSC-Regular;
+  font-size: 26rpx;
+  height: 30rpx;
+  margin-top: 16rpx;
+  width: 260rpx;
+}
+
+.login-right {
+  background: #ffe100;
+  border-radius: 32px;
+  color: #333;
+  display: inline-block;
+  float: right;
+  font-family: PingFangSC-Medium;
+  font-size: 28rpx;
+  height: 64rpx;
+  line-height: 64rpx;
+  margin-right: 36rpx;
+  margin-top: 36rpx;
+  text-align: center;
+  width: 204rpx;
+}
+
+.login-right::after {
+  border: none;
+}
+
+.Tips {
+  color: #999;
+  float: left;
+  font-size: 24rpx;
+  height: 24rpx;
+  line-height: 24rpx;
+  margin-bottom: 40rpx;
+  margin-top: 40rpx;
+  text-align: center;
+  width: 750rpx;
+}
+</style>

+ 310 - 0
src/pages/community/community.vue

@@ -0,0 +1,310 @@
+<template>
+  <view>
+    <view v-show="is_end && is_receive == 0" class="community">
+      <view class="community_top">
+        <view class="community_t">
+          <view class="t0">领取社群专属优惠券</view>
+          <view class="t1">今日份小心意</view>
+          <view class="t1">祝您欧气满满</view>
+          <!--  is_end !== 1 不是进行中的 is_receive == 0 未领取-->
+          <img
+            :class="is_end !== 1 ? 'community_btn_end' : 'community_btn'"
+            src="https://oushen2022.oss-cn-beijing.aliyuncs.com/images/48a94702558f7f86173c0dab46b5d002.png"
+            alt=""
+            @tap="bindCommunalSharing()"
+          />
+        </view>
+      </view>
+      <view class="community_bm"></view>
+    </view>
+    <view v-show="is_end && is_receive == 1" class="community community_get">
+      <view class="community_top">
+        <view class="community_t">
+          <view class="t0">领取成功</view>
+          <view class="t0">恭喜您获得优惠券</view>
+          <view class="t3"
+            >{{ reduce }}<text>{{ unit }}</text></view
+          >
+          <img
+            class="community_btn_get"
+            src="https://oushen2022.oss-cn-beijing.aliyuncs.com/images/59859a92de81cc377517c8b6e91fc242.png"
+            alt=""
+          />
+        </view>
+      </view>
+      <view class="community_bm"></view>
+    </view>
+  </view>
+</template>
+
+<script>
+import api from "@/lib/api/api";
+import login from "@/lib/utils/login";
+export default {
+  name: "PageCommunity",
+  data() {
+    return {
+      statusBarHeight: 0, // 自定义导航
+      titleBarHeight: 0, // 自定义导航
+      BarHeight: 0, // 自定义导航
+      activity_id: 2,
+      is_end: null,
+      is_receive: 0,
+      reduce: 0,
+      unit: 0,
+      userInfo: {},
+    };
+  },
+  mounted() {
+    const systemInfo = uni.getSystemInfoSync();
+    this.statusBarHeight = systemInfo.statusBarHeight;
+    const menuButtonInfo = uni.getMenuButtonBoundingClientRect();
+    this.titleBarHeight =
+      (menuButtonInfo.top - this.statusBarHeight) * 2 + menuButtonInfo.height;
+    this.BarHeight = -(this.statusBarHeight + this.titleBarHeight + 18);
+  },
+  onLoad(query) {
+    uni.showLoading({
+      title: "加载中",
+    });
+    // 此处的二维码  ages/community/community?activity_id=9 ???
+    if (query.scene) {
+      const scene = decodeURIComponent(query.scene);
+      this.activity_id = scene.split("=")[1];
+    } else {
+      this.activity_id = query.activity_id; // 开发环境
+    }
+    const uinfoStr = uni.getStorageSync("userinfo");
+    if (uinfoStr) {
+      this.userInfo = JSON.parse(uinfoStr);
+    }
+    this.checkSharing(this.activity_id);
+  },
+  methods: {
+    // 检查活动是否结束
+    checkCommunal(activity_id) {
+      return new Promise((res, rej) => {
+        api
+          .checkCommunal(activity_id)
+          .then((data) => {
+            this.is_end = data.is_end;
+            if (data.errno !== 10000) {
+              uni.showToast({
+                icon: "none",
+                title: data.errmsg,
+                duration: 3000,
+              });
+              return false;
+            }
+            res(data);
+          })
+          .catch((err) => {
+            rej(err);
+            uni.showToast({
+              icon: "none",
+              title: "出错啦,请稍后重试",
+              duration: 3000,
+            });
+          });
+      });
+    },
+    // 检查用户是否已领取
+    communalSharing(activity_id) {
+      return new Promise((res, rej) => {
+        api
+          .communalSharing(activity_id, this.userInfo.session)
+          .then((data) => {
+            if (data.errno == 10000) {
+              this.is_receive = data.data.is_receive;
+              this.reduce = data.data.reduce;
+              this.unit = data.data.unit;
+            } else if (data.errno !== 40001) {
+              uni.showToast({
+                icon: "none",
+                title: data.errmsg,
+                duration: 3000,
+              });
+              return false;
+            }
+            res(data);
+          })
+          .catch((err) => {
+            rej(err);
+            uni.showToast({
+              icon: "none",
+              title: "出错啦,请稍后重试",
+              duration: 3000,
+            });
+          });
+      });
+    },
+    // 去绑定前的检查
+    async checkSharing(activity_id) {
+      await this.checkCommunal(activity_id);
+      await this.communalSharing(activity_id);
+      uni.hideLoading();
+    },
+    // 绑定
+    bindCommunalSharing() {
+      if (this.is_end !== 1) return;
+      if (!this.userInfo.session) {
+        login.wxLogin((userInfo) => {
+          this.userInfo = userInfo;
+          this.doCommunalSharing();
+        });
+      } else {
+        this.doCommunalSharing();
+      }
+      // if (this.is_end == 1 && this.is_receive == 0) { // 0-未结束 0-未领取
+    },
+    doCommunalSharing() {
+      const params = {
+        activity_id: parseInt(this.activity_id),
+        session: this.userInfo.session,
+      };
+      api.bindCommunalSharing(params).then((data) => {
+        if (data.errno == 10000) {
+          uni.showToast({
+            icon: "none",
+            title: data.errmsg,
+            duration: 3000,
+          });
+          this.is_receive = data.data.is_receive;
+          this.reduce = data.data.reduce;
+          this.unit = data.data.unit;
+        } else {
+          uni.showToast({
+            icon: "none",
+            title: data.errmsg,
+            duration: 3000,
+          });
+        }
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+.load_con {
+  position: absolute;
+  z-index: 2000;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background-color: rgba(0, 0, 0, 0.3);
+}
+
+.community {
+  position: relative;
+  background-image: url(https://oushen2022.oss-cn-beijing.aliyuncs.com/images/74c752ae1be26b6f63698eecf02c30a0.png);
+  background-size: 100% auto;
+  -moz-background-size: 100% auto;
+  background-repeat: no-repeat;
+
+  .community_top {
+    width: 100%;
+    height: 800rpx;
+
+    .community_t {
+      font-weight: 600;
+      color: #ff6900;
+      padding-top: 400rpx;
+      text-align: center;
+      letter-spacing: 2rpx;
+    }
+
+    .t0 {
+      height: 50rpx;
+      margin: 0 auto;
+      font-size: 36rpx;
+      line-height: 50rpx;
+      margin-bottom: 24rpx;
+    }
+
+    .t1 {
+      height: 40rpx;
+      margin: 0 auto;
+      font-size: 28rpx;
+      line-height: 40rpx;
+    }
+
+    .t3 {
+      height: 80rpx;
+      line-height: 80rpx;
+      margin: 0 auto;
+      font-size: 80rpx;
+      font-weight: 600;
+      margin-top: 40rpx;
+      margin-left: 38rpx;
+
+      text {
+        font-size: 36rpx;
+        font-weight: 400;
+        margin-left: 4rpx;
+      }
+    }
+
+    .community_btn {
+      display: block;
+      width: 226rpx;
+      height: 226rpx;
+      border-radius: 50%;
+      margin: 16rpx auto 0;
+      animation-name: myframe;
+      /*要使用的关键帧动画的名称*/
+      animation-duration: 1s;
+      /*动画持续一秒*/
+      animation-iteration-count: infinite;
+      /*循环播放*/
+    }
+
+    .community_btn_end {
+      display: block;
+      width: 226rpx;
+      height: 226rpx;
+      border-radius: 50%;
+      margin-top: 16rpx;
+      margin: 0 auto;
+    }
+
+    .community_btn_get {
+      display: block;
+      width: 136rpx;
+      height: 136rpx;
+      border-radius: 50%;
+      margin-top: 16rpx;
+      margin: 0 auto;
+    }
+  }
+
+  .community_bm {
+    width: 100%;
+    height: 128rpx;
+    position: absolute;
+    bottom: -28rpx;
+    left: 0;
+    background-image: url("https://oushen2022.oss-cn-beijing.aliyuncs.com/images/8c6a44454181248f7f8814713283f68a.png");
+    background-size: 100% 100%;
+  }
+
+  /*定义关键帧动画*/
+  @keyframes myframe {
+    0% {
+      width: 222rpx;
+      height: 222rpx;
+    }
+
+    100% {
+      width: 226rpx;
+      height: 226rpx;
+    }
+  }
+}
+
+.community_get {
+  background-image: url("https://oushen2022.oss-cn-beijing.aliyuncs.com/images/2ebb4131231bf051a0adb41a4b6ad884.png");
+  background-size: 100% 100%;
+}
+</style>

+ 344 - 0
src/pages/detail/detail.scss

@@ -0,0 +1,344 @@
+.content {
+  background: url("https://chujianchaowan.oss-cn-beijing.aliyuncs.com/images/2c14ce56792dc98f0e7e2fcf646eb127.png")
+    #1b1c1e no-repeat center top;
+  background-size: contain;
+  padding-top: 186rpx;
+  padding-bottom: 224rpx;
+
+  .danmu {
+    width: 100%;
+    position: absolute;
+    top: 0;
+    z-index: 10;
+    pointer-events: none;
+  }
+  .more-title {
+    margin: 40rpx auto 0;
+    padding: 0 32rpx;
+    font-family: ysbth, Helvetica Neue, Helvetica, Arial, Hiragino Sans GB,
+      Hiragino Sans GB W3, Microsoft YaHei UI, Microsoft YaHei,
+      WenQuanYi Micro Hei, sans-serif;
+    font-size: 36rpx;
+    color: #4efbff;
+    line-height: 46rpx;
+  }
+  .main {
+    box-sizing: border-box;
+    position: relative;
+    width: 710rpx;
+    height: 968rpx;
+    overflow: hidden;
+    margin: 0 auto;
+    padding-top: 62rpx;
+    background: url("https://chujianchaowan.oss-cn-beijing.aliyuncs.com/images/be79a1b39df3b600b1ddfd334dc24e5c.png")
+      no-repeat center top;
+    background-size: contain;
+
+    .buynumbers {
+      position: absolute;
+      top: 0;
+      right: 70rpx;
+      font-size: 24rpx;
+      color: #ffffff;
+      height: 52rpx;
+      line-height: 52rpx;
+      background: url(@/static/detail/bg_c.png) repeat-x #292d3b;
+      background-size: auto 100%;
+
+      .buynumber {
+        color: #52f6fe;
+        margin: 0 6rpx;
+      }
+      &::before,
+      &::after {
+        content: "";
+        position: absolute;
+        width: 24rpx;
+        height: 52rpx;
+        top: 0;
+      }
+      &::before {
+        left: -24rpx;
+        background: url(@/static/detail/bg_l.png) no-repeat;
+        background-size: auto 100%;
+      }
+      &::after {
+        right: -24rpx;
+        background: url(@/static/detail/bg_r.png) no-repeat;
+        background-size: auto 100%;
+      }
+    }
+    .swiper {
+      width: 586rpx;
+      height: 548rpx;
+      margin: 0 auto;
+      .title {
+        display: block;
+        height: 40rpx;
+        font-size: 28rpx;
+        font-weight: 600;
+        color: #ffffff;
+        line-height: 40rpx;
+        text-align: center;
+        white-space: nowrap;
+        width: 100%;
+        overflow: hidden;
+        text-overflow: ellipsis;
+      }
+      .image {
+        width: 432rpx;
+        height: 430rpx;
+        display: block;
+        margin: 10rpx auto;
+        position: relative;
+        .cover {
+          width: 100%;
+          height: 100%;
+        }
+        .label {
+          position: absolute;
+          left: 44rpx;
+          top: 36rpx;
+          width: 72rpx;
+          height: 72rpx;
+        }
+      }
+      .banner-price {
+        color: #4efbff;
+        text-align: center;
+        // margin-top: -10rpx;
+        font-family: unidreamledregular, Helvetica Neue, Helvetica, Arial,
+          Hiragino Sans GB, Hiragino Sans GB W3, Microsoft YaHei UI,
+          Microsoft YaHei, WenQuanYi Micro Hei, sans-serif;
+
+        .small {
+          font-size: 36rpx;
+          margin-right: 10rpx;
+          font-weight: bold;
+        }
+        .price {
+          font-size: 48rpx;
+        }
+      }
+    }
+    .left,
+    .right {
+      position: absolute;
+      width: 36rpx;
+      height: 48rpx;
+      top: 284rpx;
+      z-index: 2;
+    }
+    .left {
+      left: 28rpx;
+    }
+    .right {
+      right: 28rpx;
+    }
+    .all {
+      position: relative;
+      box-sizing: border-box;
+      width: 672rpx;
+      height: 266rpx;
+      padding: 24rpx 14rpx 0;
+      margin: 20rpx auto 0;
+      box-shadow: inset #4efbff 0 2rpx 10rpx;
+      white-space: nowrap;
+      overflow-y: hidden;
+      overflow-x: auto;
+      background-image: linear-gradient(to bottom, #1d1f28, #12141b);
+      font-size: 0;
+      .item {
+        width: 188rpx;
+        margin: 0 10rpx;
+        display: inline-block;
+        position: relative;
+      }
+      .img {
+        width: 184rpx;
+        height: 184rpx;
+        border: 2rpx solid #4efbff;
+        display: block;
+      }
+      .label {
+        position: absolute;
+        left: 4rpx;
+        top: 4rpx;
+        width: 44rpx;
+        height: 44rpx;
+      }
+
+      .item-price {
+        color: #4efbff;
+        text-align: center;
+        margin-top: 10rpx;
+        font-family: unidreamledregular, Helvetica Neue, Helvetica, Arial,
+          Hiragino Sans GB, Hiragino Sans GB W3, Microsoft YaHei UI,
+          Microsoft YaHei, WenQuanYi Micro Hei, sans-serif;
+
+        .small {
+          font-size: 24rpx;
+          margin-right: 4rpx;
+          font-weight: bold;
+        }
+        .price {
+          font-size: 32rpx;
+        }
+      }
+    }
+    .btns {
+      position: absolute;
+      width: 100%;
+      left: 0;
+      bottom: 3rpx;
+      display: flex;
+      .btn-item {
+        flex: 1;
+        font-size: 24rpx;
+        font-weight: 500;
+        color: #ffffff;
+        line-height: 34rpx;
+        text-align: center;
+      }
+      .btn-img {
+        width: 260rpx;
+        height: 52rpx;
+      }
+    }
+  }
+  .buy-btns {
+    position: fixed;
+    bottom: 0;
+    left: 0;
+    padding: 42rpx 24rpx 92rpx;
+    background: #292d3b;
+  }
+  .popup-detail {
+    padding: 32rpx 24rpx 64rpx;
+    background-color: #fff;
+    display: flex;
+    flex-direction: column;
+    height: 80vh;
+    .title {
+      display: block;
+      min-height: 44rpx;
+      font-size: 32rpx;
+      font-weight: 500;
+      color: #505050;
+      line-height: 44rpx;
+      padding-right: 80rpx;
+    }
+    .desc {
+      display: block;
+      height: 34rpx;
+      font-size: 24rpx;
+      font-weight: 500;
+      color: #9496a5;
+      line-height: 34rpx;
+      margin-top: 8rpx;
+    }
+    .popup-detail-content {
+      margin-top: 24rpx;
+      flex: 1;
+      overflow-y: auto;
+      .img {
+        display: block;
+        width: 100%;
+      }
+    }
+    .levels {
+      display: flex;
+      justify-content: space-between;
+      overflow-x: auto;
+      overflow-y: hidden;
+      height: 88rpx;
+      margin-bottom: 18rpx;
+      flex-basis: 88rpx;
+      .level {
+        width: 138rpx;
+        text-align: center;
+        height: 88rpx;
+        .name {
+          display: block;
+          font-size: 36rpx;
+          font-weight: 600;
+          color: #292d3b;
+          line-height: 50rpx;
+          height: 50rpx;
+        }
+        .percent {
+          display: block;
+          font-size: 24rpx;
+          font-weight: 500;
+          color: #505050;
+          line-height: 34rpx;
+        }
+      }
+    }
+    .popup-detail-list {
+      flex: 1;
+      height: 0;
+      overflow-y: auto;
+      .list-item {
+        display: flex;
+        margin-bottom: 26rpx;
+        position: relative;
+        .img {
+          width: 232rpx;
+          height: 232rpx;
+          margin-right: 24rpx;
+          background-color: #f1f1f1;
+        }
+        .label {
+          position: absolute;
+          left: 10rpx;
+          top: 10rpx;
+          width: 48rpx;
+          height: 48rpx;
+        }
+        .list-item-body {
+          display: flex;
+          flex-direction: column;
+          justify-content: space-between;
+          flex: 1;
+          width: 0;
+          .title,
+          .price {
+            display: block;
+          }
+          .title {
+            font-size: 28rpx;
+            font-weight: 500;
+            color: #505050;
+            line-height: 40rpx;
+          }
+          .price {
+            font-size: 24rpx;
+            font-weight: 600;
+            color: #08c2c3;
+            line-height: 34rpx;
+            font-family: unidreamledregular, Helvetica Neue, Helvetica, Arial,
+              Hiragino Sans GB, Hiragino Sans GB W3, Microsoft YaHei UI,
+              Microsoft YaHei, WenQuanYi Micro Hei, sans-serif;
+            .unit {
+              font-size: 28rpx;
+              margin: 0 6rpx;
+              display: inline-block;
+            }
+            .price-text {
+              font-size: 36rpx;
+              font-weight: normal;
+            }
+          }
+        }
+      }
+    }
+  }
+  .close {
+    width: 32rpx;
+    height: 32rpx;
+    position: absolute;
+    right: 24rpx;
+    top: 24rpx;
+  }
+}

+ 462 - 0
src/pages/detail/detail.vue

@@ -0,0 +1,462 @@
+<template>
+  <view class="content">
+    <lff-barrage ref="lffBarrage" class="danmu"></lff-barrage>
+    <view class="main">
+      <text class="buynumbers"
+        >已抽 <text class="buynumber">{{ info.sell_count || 0 }}</text> 次</text
+      >
+      <swiper class="swiper" :current="currentIdx" @change="handleSwiperChange">
+        <swiper-item
+          v-for="(item, idx) in skuList"
+          :key="idx"
+          class="swiper-item"
+        >
+          <text class="title">{{ item.name }}</text>
+          <view class="image">
+            <image
+              class="cover"
+              :src="item.big_img"
+              mode="aspectFit"
+              @click="handleShowImages"
+            ></image>
+            <image v-if="item.label" class="label" :src="item.label"></image>
+          </view>
+          <view class="banner-price"
+            ><text v-if="item.unit === '元' || item.unit === '¥'" class="small"
+              >&yen;</text
+            ><text class="price">{{ item.sale_price }}</text
+            ><text
+              v-if="item.unit !== '元' && item.unit !== '¥'"
+              class="small"
+              >{{ item.unit }}</text
+            >
+          </view>
+        </swiper-item>
+      </swiper>
+      <image
+        class="left"
+        src="@/static/detail/btn-left.png"
+        @click="switchTo(Math.max(0, currentIdx - 1))"
+      >
+      </image>
+      <image
+        class="right"
+        src="@/static/detail/btn-right.png"
+        @click="switchTo(Math.min(skuList.length - 1, currentIdx + 1))"
+      ></image>
+      <view class="all">
+        <view v-for="(item, idx) in skuList" :key="idx" class="item">
+          <image
+            class="img"
+            :src="item.img"
+            mode="aspectFit"
+            @click="switchTo(idx)"
+          >
+          </image>
+          <!-- <image class="label" v-if="item.label" :src="item.label"></image> -->
+          <view class="item-price"
+            ><text v-if="item.unit === '元' || item.unit === '¥'" class="small"
+              >&yen;</text
+            ><text class="price">{{ item.sale_price }}</text
+            ><text
+              v-if="item.unit !== '元' && item.unit !== '¥'"
+              class="small"
+              >{{ item.unit }}</text
+            >
+          </view>
+        </view>
+      </view>
+      <view class="btns">
+        <view class="btn-item" @click="handlePopupShow('popup_shipping')"
+          ><text>发货说明</text></view
+        >
+        <image
+          class="btn-img"
+          src="@/static/detail/btn-show-all.png"
+          @click="handlePopupShow('popup_allsku')"
+        ></image>
+        <view class="btn-item" @click="handlePopupShow('popup_play')"
+          ><text>玩法说明</text></view
+        >
+      </view>
+    </view>
+    <view class="more-title">更多福袋</view>
+    <view class="base-list">
+      <list-item
+        v-for="item in moreList"
+        :key="item.id"
+        :item="item"
+        class="base-list-item"
+        @click="handleDetail(item.id)"
+      >
+      </list-item>
+    </view>
+    <buy-btns
+      v-if="info"
+      class="buy-btns"
+      :user-info="userInfo"
+      :buy-btns="computedBtns"
+      @login="handleUpdateUserInfo"
+      @click="handleBtnsClick"
+    />
+    <uni-popup
+      ref="popup_shipping"
+      type="center"
+      mask-background-color="rgba(0,0,0,0.8)"
+      :is-mask-click="true"
+    >
+      <view class="popup-wrap">
+        <view class="popup-content">
+          <view class="h1"><text>发货说明</text></view>
+          <view class="p" v-html="info.info || ''"></view>
+        </view>
+        <image
+          class="popup_close"
+          src="@/static/icon/icon-close.png"
+          @click="handlePopupClose('popup_shipping')"
+        ></image>
+      </view>
+    </uni-popup>
+    <uni-popup
+      ref="popup_play"
+      type="center"
+      mask-background-color="rgba(0,0,0,0.8)"
+      :is-mask-click="true"
+    >
+      <view class="popup-wrap">
+        <view class="popup-content">
+          <view class="h1"><text>玩法说明</text></view>
+          <view class="p" v-html="info.play_info || ''"></view>
+        </view>
+        <image
+          class="popup_close"
+          src="@/static/icon/icon-close.png"
+          @click="handlePopupClose('popup_play')"
+        ></image>
+      </view>
+    </uni-popup>
+    <popup-img-detail ref="imgdetail" />
+    <uni-popup
+      ref="popup_allsku"
+      type="bottom"
+      mask-background-color="rgba(0,0,0,0.8)"
+      :is-mask-click="true"
+    >
+      <view class="popup-detail">
+        <view>
+          <image
+            class="close"
+            src="@/static/icon/icon-close-dark.png"
+            @click="handlePopupClose('popup_allsku')"
+          >
+          </image>
+          <text class="title">全部商品详情</text>
+          <text class="desc">图片仅供参考,请以实物为准</text>
+          <view class="levels">
+            <view v-for="item in skuPercent" :key="item.name" class="level">
+              <text class="name">{{ item.name }}</text>
+              <text class="percent">{{ item.percent }}</text>
+            </view>
+          </view>
+        </view>
+        <view class="popup-detail-list">
+          <view v-for="(item, i) in skuList" :key="i" class="list-item">
+            <image class="img" :src="item.img" mode="aspectFit"></image>
+            <image v-if="item.label" class="label" :src="item.label"></image>
+            <view class="list-item-body">
+              <text class="title">{{ item.name }}</text>
+              <text class="price"
+                >参考价<text class="unit">&yen;</text>
+                <text class="price-text">{{ item.sale_price }}</text></text
+              >
+            </view>
+          </view>
+        </view>
+      </view>
+    </uni-popup>
+    <paypop
+      v-if="info"
+      ref="paypop"
+      :title="info.name"
+      :img="info.img"
+      :detail-id="id"
+      :type="1"
+      :score-text="info.score_info"
+      @paySuccess="handlePaySuccess"
+    />
+    <payresult v-if="info" ref="payresult" :type="1" @buy="handleBuy" />
+    <popup-dialog ref="popupDialog" />
+  </view>
+</template>
+
+<script>
+import Decimal from "decimal.js";
+import api from "@/lib/api/api";
+import lffBarrage from "@/components/lff-barrage/lff-barrage.vue";
+import listItem from "@/components/list-item/list-item.vue";
+import popupDialog from "@/components/popup-dialog/popup-dialog.vue";
+import paypop from "components/paypop/paypop.vue";
+import payresult from "components/payresult/payresult.vue";
+import buyBtns from "@/components/buy-btns/buy-btns.vue";
+import popupImgDetail from "@/components/popup-img-detail/popup-img-detail.vue";
+import { reqAcceptSubMsgs, defaultTemplateIds } from "@/lib/utils/wxSubscribe";
+
+import labelN from "@/static/icon/icon-medal-n.png";
+import labelR from "@/static/icon/icon-medal-r.png";
+import labelSP from "@/static/icon/icon-medal-sp.png";
+import labelSR from "@/static/icon/icon-medal-sr.png";
+import labelSSR from "@/static/icon/icon-medal-ssr.png";
+
+export default {
+  name: "PageDetail",
+  components: {
+    lffBarrage,
+    listItem,
+    popupDialog,
+    popupImgDetail,
+    buyBtns,
+    paypop,
+    payresult,
+  },
+  data() {
+    return {
+      info: null,
+      userInfo: null,
+      params: {},
+      id: "0",
+      moreList: [],
+      skuList: [],
+      skuPercent: [],
+      currentIdx: 0,
+      danmu: [],
+      buyNums: [
+        {
+          num: 1,
+          key: "price",
+          title: "1发入魂",
+          isPopKey: "bubble",
+          popKey: "bubble_notice",
+        },
+        {
+          num: 3,
+          key: "three_price",
+          title: "幸运3连",
+          isPopKey: "three_bubble",
+          popKey: "three_bubble_notice",
+        },
+        {
+          num: 5,
+          key: "five_price",
+          title: "欧气5连",
+          isPopKey: "five_bubble",
+          popKey: "five_bubble_notice",
+        },
+        {
+          num: 10,
+          key: "ten_price",
+          title: "豪气10连",
+          isPopKey: "ten_bubble",
+          popKey: "ten_bubble_notice",
+        },
+      ],
+      buyNum: 0,
+    };
+  },
+  computed: {
+    computedBtns() {
+      if (!this.info) return this.buyNums;
+      return this.buyNums.map((item) => {
+        const obj = {
+          num: item.num,
+          title: item.title,
+          price: this.info[item.key],
+        };
+        if (
+          item.isPopKey &&
+          item.popKey &&
+          this.info[item.popKey] &&
+          this.info[item.isPopKey] === 1
+        ) {
+          obj.pop = this.info[item.popKey];
+        }
+        return obj;
+      });
+    },
+    currentDetail() {
+      return this.skuList[this.currentIdx];
+    },
+  },
+  onLoad(data) {
+    this.params = data;
+    this.id = data.id;
+    const uinfoStr = uni.getStorageSync("userinfo");
+    if (uinfoStr) {
+      this.userInfo = JSON.parse(uinfoStr);
+    }
+    uni.showLoading({
+      title: "加载中",
+      mask: true,
+    });
+    this.loadDetail();
+    this.loadDanmu();
+  },
+  onShow() {
+    reqAcceptSubMsgs(defaultTemplateIds);
+  },
+  onPageScroll(e) {
+    this.scrollTop = e.scrollTop;
+  },
+  onShareAppMessage() {
+    // 来自页面内转发按钮
+    return {
+      title: this.info?.name || "来抽赏啦,抽中SP赏可好运加倍!",
+      imageUrl:
+        this.info?.img ||
+        "https://chujianchaowan.oss-cn-beijing.aliyuncs.com/images/45bfb688e6e9dba557f64fd052e850cc.png", //图片路径
+      path: "/pages/detail/detail?id=" + this.id,
+    };
+  },
+  onShareTimeline() {
+    return {
+      title: this.info?.name || "来抽赏啦,抽中SP赏可好运加倍!",
+      imageUrl:
+        this.info?.img ||
+        "https://chujianchaowan.oss-cn-beijing.aliyuncs.com/images/45bfb688e6e9dba557f64fd052e850cc.png", //图片路径
+      path: "/pages/detail/detail?id=" + this.id,
+    };
+  },
+  methods: {
+    async loadDetail() {
+      try {
+        const data = await api.detail(this.id);
+        if (data.errno) {
+          this.moreList = data.data.more_kujis;
+          this.skuList = data.data.sku_info.map((item) => {
+            switch (item.sub_info) {
+              case "N":
+                item.label = labelN;
+                break;
+              case "R":
+                item.label = labelR;
+                break;
+              case "SP":
+                item.label = labelSP;
+                break;
+              case "SR":
+                item.label = labelSR;
+                break;
+              case "SSR":
+                item.label = labelSSR;
+                break;
+              default:
+                item.label = "";
+            }
+            return item;
+          });
+          this.skuPercent = data.data.sku_percent;
+          this.info = data.data.kuji_info;
+          uni.hideLoading();
+        } else {
+          throw new Error(data.errmsg);
+        }
+      } catch (e) {
+        uni.hideLoading();
+        uni.showToast({
+          icon: "none",
+          title: e.message || "出错啦,请稍后重试",
+          duration: 3000,
+        });
+      }
+    },
+    async loadDanmu() {
+      const data = await api.detailDanmu(this.id);
+
+      if (data.errno === 10000 && data.data.length) {
+        this.danmu = data.data;
+        this.runDanmu();
+      }
+    },
+    runDanmu(down = false) {
+      clearTimeout(this.timer);
+      const item = this.danmu.shift();
+      if (!item || !this.$refs.lffBarrage) return;
+      this.$refs.lffBarrage.add({
+        img: item.user_img,
+        img2: item.sku_img,
+        content: item.content,
+        link: item.link,
+        level: item.level,
+        top: (down ? 80 : 4) + (Math.floor(Math.random() * (20 - 2)) + 1),
+        name: `${item.user_name[0]}**${
+          item.user_name[item.user_name.length - 1]
+        }`,
+        type: item.type,
+      });
+      this.timer = setTimeout(() => {
+        this.runDanmu(!down);
+      }, 4000);
+    },
+    handleSwiperChange(e) {
+      this.currentIdx = e.detail.current;
+    },
+    switchTo(idx) {
+      this.currentIdx = idx;
+    },
+    handleDetail(id) {
+      uni.redirectTo({
+        url: `../detail/detail?id=${id}`,
+      });
+    },
+    handlePopupShow(popup_ref) {
+      this.$refs[popup_ref].open();
+    },
+    handlePopupClose(popup_ref) {
+      this.$refs[popup_ref].close();
+    },
+    handleBuy(num = 1, useLoading = true) {
+      this.buyNum = num;
+      let originPrice = 0;
+      const item = this.buyNums.find((item) => item.num === this.buyNum);
+      if (item && this.info[item.key]) {
+        originPrice = Number(this.info[item.key]);
+      }
+
+      if (originPrice === 0) {
+        originPrice = new Decimal(this.info.price).mul(this.buyNum).toNumber();
+      }
+
+      this.$refs.paypop.buy(this.buyNum, originPrice, useLoading);
+    },
+    handlePaySuccess(data) {
+      if (this.$refs.payresult) {
+        this.$refs.payresult.open(data);
+      } else {
+        uni.showToast({
+          icon: "success",
+          title: "购买成功",
+          duration: 2e3,
+        });
+      }
+    },
+    handleUpdateUserInfo(data, item, useLoading = true) {
+      this.userInfo = data;
+      if (item) {
+        this.handleBuy(item.num, useLoading);
+      }
+    },
+    handleBtnsClick(item) {
+      this.handleBuy(item.num);
+    },
+    handleShowImages() {
+      this.$refs.imgdetail.open({
+        title: this.currentDetail?.name || "",
+        list: this.currentDetail?.long_img || [this.currentDetail?.big_img],
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+@import "./detail.scss";
+</style>

+ 164 - 0
src/pages/help/help.vue

@@ -0,0 +1,164 @@
+<template>
+  <view class="content">
+    <view v-for="(item, key) in datas" :key="key">
+      <view class="title">{{ item.ruleCategory }}</view>
+      <view class="option">
+        <view
+          v-for="(item1, index) in item.rules"
+          :key="index"
+          class="option-list"
+          @tap="jump"
+        >
+          <view class="option-list_text">{{ item1.name }}</view>
+          <view class="option-list_img1">
+            <image mode src="@/static/my/icon-more.png"></image>
+          </view>
+          <view v-if="key < datas.length - 1" class="option-border"></view>
+        </view>
+      </view>
+    </view>
+    <view>
+      <view class="title">帮助</view>
+      <view class="option" @tap="openDetail('user')">
+        <view class="option-list">
+          <view class="option-list_text">用户服务协议</view>
+          <view class="option-list_img1">
+            <image mode src="@/static/my/icon-more.png"></image>
+          </view>
+        </view>
+      </view>
+      <view class="option" @tap="openDetail('rule')">
+        <view class="option-list">
+          <view class="option-list_text">余额服务须知</view>
+          <view class="option-list_img1">
+            <image mode src="@/static/my/icon-more.png"></image>
+          </view>
+        </view>
+      </view>
+      <view class="option" @tap="openDetail('about')">
+        <view class="option-list">
+          <view class="option-list_text">关于我们</view>
+          <view class="option-list_img1">
+            <image mode src="@/static/my/icon-more.png"></image>
+          </view>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  name: "PageHelp",
+  data() {
+    return {
+      datas: [],
+    };
+  },
+
+  methods: {
+    openDetail(index) {
+      uni.navigateTo({
+        url: "./help_" + index,
+      });
+    },
+  },
+};
+</script>
+
+<style>
+.content {
+  align-items: flex-start;
+  background: #f5f5f5;
+  display: flex;
+  flex-direction: column;
+  width: 750rpx;
+  min-height: 100vh;
+  box-sizing: border-box;
+  padding-bottom: 64rpx;
+}
+
+image {
+  height: inherit;
+  width: inherit;
+}
+
+.title {
+  color: #666;
+  float: left;
+  font-family: PingFangSC-Regular;
+  font-size: 28rpx;
+  height: 92rpx;
+  line-height: 92rpx;
+  margin-left: 24rpx;
+  width: 702rpx;
+}
+
+.option {
+  background: #fff;
+  border-radius: 24rpx;
+  float: left;
+  margin-left: 24rpx;
+  width: 702rpx;
+  margin-bottom: 20rpx;
+}
+
+.option-list {
+  background: #fff;
+  float: left;
+  font-size: 34rpx;
+  height: 96rpx;
+  line-height: 96rpx;
+  width: 702rpx;
+}
+
+.option-list_img {
+  float: left;
+  height: 56rpx;
+  margin-left: 24rpx;
+  margin-top: 20rpx;
+  width: 56rpx;
+}
+
+.option-list_text {
+  -webkit-box-orient: vertical;
+  -webkit-line-clamp: 1;
+  color: #333;
+  display: -webkit-box;
+  float: left;
+  font-size: 30rpx;
+  height: 94rpx;
+  line-height: 94rpx;
+  overflow: hidden;
+  text-indent: 24rpx;
+  width: 600rpx;
+}
+
+.option-list_img1 {
+  float: right;
+  height: 32rpx;
+  margin-right: 34rpx;
+  width: 32rpx;
+}
+
+.option-border {
+  background-color: #f5f5f5;
+  float: left;
+  height: 2rpx;
+  margin-left: 24rpx;
+  width: 678rpx;
+}
+
+.bang {
+  margin: 20rpx 0 0 20rpx;
+}
+
+.bottom-text {
+  background-color: #fff;
+  font-size: 32rpx;
+  height: 50rpx;
+  margin: 20rpx 20rpx 0;
+  padding: 20rpx;
+  width: 666rpx;
+}
+</style>

+ 70 - 0
src/pages/help/help_about.vue

@@ -0,0 +1,70 @@
+<template>
+  <view class="content">
+    <view class="_h1" style="margin: 20rpx auto">关于我们</view>
+    <view class="top1">
+      初见潮玩是一个潮玩互动电商平台,涵盖了各大海量IP、品牌的手办、盲盒、周边等潮流好物;还汇集了福袋、一番赏、抽盒机等多样玩法,致力于打造一个属于次元文化爱好者和年轻群体的独有宇宙;为商家和顾客提供公平公正公开抽赏的服务,敬请广大粉丝积极参与;同时也盛邀各大潮玩潮品商家入驻,共拓潮玩市场星球,为顾客提供更新潮的商品。
+    </view>
+    <view class="top1"
+      >入驻请发邮件:<text :user-select="true">yuelyueh@126.com</text></view
+    >
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {};
+  },
+  methods: {},
+};
+</script>
+
+<style>
+image {
+  height: inherit;
+  width: inherit;
+}
+
+.content {
+  align-items: flex-start;
+  display: flex;
+  flex-direction: column;
+  width: 750rpx;
+  min-height: 100vh;
+  box-sizing: border-box;
+  padding-bottom: 64rpx;
+}
+
+.top {
+  color: #333;
+  font-size: 30rpx;
+  line-height: 32rpx;
+  margin-top: 48rpx;
+}
+
+.top1,
+.top {
+  display: inline-block;
+  font-family: PingFangSC-Medium;
+  margin-left: 32rpx;
+  width: 686rpx;
+}
+
+.top1 {
+  color: #666;
+  font-size: 28rpx;
+  line-height: 42rpx;
+  margin-top: 16rpx;
+  text-indent: 22px;
+}
+
+.img {
+  background: #d8d8d8;
+  border-radius: 16rpx;
+  display: inline-block;
+  height: 291rpx;
+  margin-left: 32rpx;
+  margin-top: 24rpx;
+  width: 686rpx;
+}
+</style>

+ 80 - 0
src/pages/help/help_contact.vue

@@ -0,0 +1,80 @@
+<template>
+  <view class="content">
+    <view class="top1"
+      >小初客服会周一到周五10点至18点为您提供在线服务,周末也会不定期上线喽~如遇到繁忙请不要着急,留下您的问题我们会第一时间回复您哦~</view
+    >
+    <view class="top1"
+      >【截图保存下面图片,请使用微信扫码,即可添加专属客服哦~】</view
+    >
+    <image
+      src="@/static/service.jpg"
+      class="img2"
+      mode="widthFix"
+      :show-menu-by-longpress="true"
+    ></image>
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {};
+  },
+  methods: {},
+};
+</script>
+
+<style>
+image {
+  height: inherit;
+  width: inherit;
+}
+
+.content {
+  align-items: flex-start;
+  display: flex;
+  flex-direction: column;
+  width: 750rpx;
+  min-height: 100vh;
+  box-sizing: border-box;
+  padding-bottom: 64rpx;
+}
+
+.top {
+  color: #333;
+  font-size: 30rpx;
+  line-height: 32rpx;
+  margin-top: 48rpx;
+}
+
+.top1,
+.top {
+  display: inline-block;
+  font-family: PingFangSC-Medium;
+  margin-left: 32rpx;
+  width: 686rpx;
+}
+
+.top1 {
+  color: #666;
+  font-size: 28rpx;
+  line-height: 42rpx;
+  margin-top: 16rpx;
+  text-indent: 22px;
+}
+
+.img {
+  background: #d8d8d8;
+  border-radius: 16rpx;
+  display: inline-block;
+  height: 291rpx;
+  margin-left: 32rpx;
+  margin-top: 24rpx;
+  width: 686rpx;
+}
+.img2 {
+  width: 50%;
+  display: block;
+  margin: 0 auto;
+}
+</style>

+ 110 - 0
src/pages/help/help_rule.vue

@@ -0,0 +1,110 @@
+<template>
+  <view class="content">
+    <view class="_h1" style="margin: 20rpx auto">余额服务须知</view>
+    <view class="top1">版本生效日期:2022年6月29日</view>
+    <view class="top1"
+      >您在点击同意本《余额服务须知》前,请务必审慎阅读、充分理解各条款内容,特别是粗体下划线标识条款内容,您应重点阅读。当您阅读并通过网络页面点击确认或以其他方式选择接受本须知,即表示您已充分阅读、理解并接受本须知的全部内容。如您有任何疑问,您可联系客服人员。</view
+    >
+    <view class="top1">本须知项下的相关服务由以下主体共同为您提供:</view>
+    <view class="top1"
+      >北京悦来跃好科技有限公司,及所属初见潮玩小程序(下称“初见潮玩”)
+      为您提供与余额页面展示、使用有关的技术服务;</view
+    >
+    <view class="top">一、余额说明</view>
+    <view class="top1"
+      >1.1余额分为本金与权益金,您的实际支付金额为本金,其余为权益金:</view
+    >
+    <view class="top1"
+      >1.1.1本金为消费者转入余额的实际支付金额,本金支持退款,具体退款规则见本须知第四条。您使用余额进行指定店铺商品、服务消费且订单交易成功后,您消耗的本金金额将进行扣除。</view
+    >
+    <view class="top1"
+      >1.1.2权益金为您在使用时可额外享受的店铺优惠额度,权益金不可提现,您使用余额时,本金与权益金等比例消耗。</view
+    >
+    <view class="top1"
+      >1.2为了保证您能便捷地转入、使用余额,您的余额账户将与您微信授权登录账户进行关联,后续您可直接凭此微信授权登录账户进行余额的使用与查询,请您务必确认在同意本须知前您的微信账户已鄉定手机号码及通过实名认证。若您的微信账户未鄉定手机号码或者通过实名认证,则无法转入、使用余额。</view
+    >
+    <view class="top1"
+      >1.3您的微信账户
+      及密码由您自行设置,您承诺妥善保管微信账户、密码信息且不将您的微信账户提供给任何第三方或交于任何第三方使用。使用上述微信账户所发出的一切指令均视为您本人所为,您应对此产生的后果负责。对非平台原因造成的微信账户、密码信息被冒用、盗用或非法使用,由此引起的一切风险、责任、损失、费用等由您自行承担。</view
+    >
+    <view class="top">二、余额转入</view>
+    <view class="top1">您转入余额时可以通过微信支付,在初见潮玩直接转入。</view>
+    <view class="top">三、余额使用</view>
+    <view class="top1"
+      >3.1余额可用于在您转入时在初见潮玩购买商品、服务,特殊情形除外
+      (不支持抵扣邮费,以具体页面展示规则为准)。余额仅支持无线手机端使用、不支持PC端使用。</view
+    >
+    <view class="top1"
+      >3.2余额仅限转入时关联的微信账户使用,不可转让、转赠。</view
+    >
+    <view class="top1"
+      >3.3您使用余额购买商品、服务后可向商家提出开票,发票金额将按照您实际消耗的本金金额向您开具;如您因任何原因退货退款,您须配合商家退回已开具的发票,具体以商家商品、服务详情页面的描述为准。</view
+    >
+    <view class="top1"
+      >3.4您使用余额购买的商品、服务由商家承担全部责任(包括但不限于产品质量责任、售后责任等);如因商品、服务与商家发生争议的,由您与商家协商解决。</view
+    >
+    <view class="top">四、余额售后</view>
+    <view class="top1"
+      >余额支持无理由退款,因您转入余额时选择用于指定消费以获取权益,故您于系统发起退款申请前将安排您先通知客服,客服收到您的通知后将于365天内为您开放系统退款入口。</view
+    >
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {};
+  },
+  methods: {},
+};
+</script>
+
+<style>
+image {
+  height: inherit;
+  width: inherit;
+}
+
+.content {
+  align-items: flex-start;
+  display: flex;
+  flex-direction: column;
+  width: 750rpx;
+  min-height: 100vh;
+  box-sizing: border-box;
+  padding-bottom: 64rpx;
+}
+
+.top {
+  color: #333;
+  font-size: 30rpx;
+  line-height: 32rpx;
+  margin-top: 48rpx;
+}
+
+.top1,
+.top {
+  display: inline-block;
+  font-family: PingFangSC-Medium;
+  margin-left: 32rpx;
+  width: 686rpx;
+}
+
+.top1 {
+  color: #666;
+  font-size: 28rpx;
+  line-height: 42rpx;
+  margin-top: 16rpx;
+  text-indent: 22px;
+}
+
+.img {
+  background: #d8d8d8;
+  border-radius: 16rpx;
+  display: inline-block;
+  height: 291rpx;
+  margin-left: 32rpx;
+  margin-top: 24rpx;
+  width: 686rpx;
+}
+</style>

+ 331 - 0
src/pages/help/help_user.vue

@@ -0,0 +1,331 @@
+<template>
+  <view class="content">
+    <view class="_h1" style="margin: 20rpx auto">用户服务协议</view>
+    <view class="top"> 提示条款 </view>
+    <view class="top1"
+      >欢迎您与各初见潮玩经营者(详见定义条款)共同签署本《初见潮玩服务协议》(下称“本协议”)并使用初见潮玩服务!</view
+    >
+    <view class="top1"
+      >各服务条款前所列索引关键词仅为帮助您理解该条款表达的主旨之用,不影响或限制本协议条款的含义或解
+      释。为维护您自身权益,建议您仔细阅读各条款具体表 述。</view
+    >
+    <view class="top1"
+      >【审慎阅读】您在申请注册流程中点击同意本协议之前,应当认真阅读本协议。请您务必审慎阅读、充分理解
+      各条款内容,特别是免除或者限制责任的条款、法律适用
+      和争议解决条款。如您对协议有任何疑问,可向初见潮玩微信小程序客服咨询。</view
+    >
+    <view class="top1"
+      >【签约动作】当您按照注册页面提示填写信息、阅读并同意本协议且完成全部注册程序后,即表示您已充分阅读、理解并接受本协议的全部内容,并与初见潮玩达成
+      一致,成为初见潮玩“用户”。阅读本协议的过程中,如
+      果您不同意本协议或其中任何条款约定,您应立即停止注册程序。</view
+    >
+    <view class="top">二、协议范围</view>
+    <view class="top1">2.1 签约主体</view>
+    <view class="top1"
+      >【平等主体】本协议由您与初见潮玩经营者共同缔结,本协议对您与初见潮玩经营者均具有合同效力。</view
+    >
+    <view class="top1"
+      >【主体信息】初见潮玩经营者是指经营初见潮玩的各法律主体。本协议项下,初见潮玩经营者可能根据初见潮玩的业务调整而发生变更,变更后的初见潮玩经营者与您共同履行本协议并向您提供服务,初见潮玩经营者的变更不会影响您本协议项下的权益。初见潮玩经营者还有可能因为提供新的初见潮玩服务而新增,如您使用新增的初见潮玩服务的,视为您同意新增的初见潮玩经营者与您共同履行本协议。发生争议时,您可根据您具体使用的服务及对您权益产生影响的具体行为对象确定与您履约的主体及争议相对方。</view
+    >
+    <view class="top1">2.2 补充协议</view>
+    <view class="top1"
+      >由于互联网高速发展,您与初见潮玩签署的本协议列明的条款并不能完整罗列并覆盖您与初见潮玩所有权利与义务,现有的约定也不能保证完全符合未来发展的需求。因此,初见潮玩未来新增的协议等均为本协议的补充协议,与本协议不可分割且具有同等法律效力。如有新增协议,将对您进行告知,如您使用初见潮玩服务,视为您同意上述补充协议。</view
+    >
+    <view class="top">三、账户注册与使用</view>
+    <view class="top1">3.1 用户资格</view>
+    <view class="top1"
+      >您确认在您开始注册程序使用初见潮玩服务前,您应当具备中华人民共和国法律规定的与您行为相适应的民事行为能力。若您不具备前述与您行为相适应的民事行为能力,则您及您的监护人应依照法律规定承担因此而导致的一切后果。此外,您还需确保您不是任何国家、国际组织或者地域实施的贸易限制、制裁或其他法律、规则限制的对象,否则您可能无法正常注册及使用初见潮玩服务。</view
+    >
+    <view class="top1">3.2 账户说明</view>
+    <view class="top1"
+      >【账户获得】目前初见潮玩使用微信提供的第三方平台账户登陆,您根据登陆时的相关提示填写必要信息后,您将获得初见潮玩账户。初见潮玩只允许每位用户使用一个初见潮玩账户。如有证据证明或初见潮玩根据初见潮玩规则判断您存在不当注册或不当使用多个初见潮玩账户的情形,初见潮玩可采取冻结或关闭账户、取消订单、拒绝提供服务等措施,如给初见潮玩及相关方造成损失的,您还应承担赔偿责任。</view
+    >
+    <view class="top1"
+      >【账户使用】由于您的初见潮玩账户关联您的个人信息及初见潮玩商业信息,您的初见潮玩账户仅限您本人使用。未经初见潮玩同意,您直接或问接授权第三方使用您初见潮玩账户或获取您账户项下信息的行为无效。如初见潮玩根据初见潮玩规则中约定的违约认定程序及标准判断您初见潮玩账户的使用可能危及您的账户安全及
+      / 或初见潮玩信息安全的,初见潮玩可拒绝提供相应服务或终止本协议。</view
+    >
+    <view class="top1"
+      >【账户转让】由于用户账户关联用户信用信息,仅当有法律明文规定、司法裁定或经初见潮玩同意,并符合初见潮玩规则规定的用户账户转让流程的情况下,您可进行账户的转让。您的账户一经转让,该账户项下权利义务一并转移。除此外,您的账户不得以任何方式转让,否则初见潮玩有权追究您的违约责任,且由此产生的一切责任均由您承担。</view
+    >
+    <view class="top1">3.3 注册信息管理</view>
+    <view class="top1">3.3.1 真实合法</view>
+    <view class="top1"
+      >【信息真实】在使用初见潮玩服务时,您应当按初见潮玩页面的提示准确完整地提供您的信息(包括您的姓名及电子邮件地址、联系电话、联系地址等),以便初见潮玩或其他用户与您联系。您了解并同意,您有义务保持您提供信息的真实性及有效性。</view
+    >
+    <view class="top1">3.3.2 更新维护</view>
+    <view class="top1"
+      >您应当及时更新您提供的信息,在法律有明确规定要求初见潮玩作为服务提供者必须对部分用户(如卖家等)的信息进行核实的情况下,初见潮玩将依法不时地对您的信息进行检查核实,您应当配合提供最新、真实、完整、有效的信息。如初见潮玩按您最后一次提供的信息与您联系末果您末按初见潮玩的要求及时提供信息,您提供的信息存在明显不实或行政司法机关核实您提供的信息无效的,您将承担因此对您自身、他人及初见潮玩造成的全部损失与不利后果。初见潮玩可向您发出询问或要求整改的通知,并要求您进行重新认证,直至中止、终止对您提供部分或全部初见潮玩服务,初见潮玩对此不承担责任。</view
+    >
+    <view class="top1">3.4 账户安全规范</view>
+    <view class="top1"
+      >【账户安全保管义务】由于初见潮玩前采用微信平台账户登陆,您的账户为您自行设置并由您保管,建议您务必保管好您的账户,账户因您主动泄露或因您遭受他人攻击、诈骗等行为导致的损失及后果,初见潮玩并不承担责任,您应通过司法、行政等救济途径向侵权行为人追偿。</view
+    >
+    <view class="top1"
+      >【账户行为责任自负】 除初见潮玩存在过错外,您应对您账户项下的所有行为结果
+      (包括但不限于在线签署各类协议、发布信息、购买商品及服务及披露信息等)负责。</view
+    >
+    <view class="top1"
+      >【日常维护须知】如发现任何未经授权使用您账户登录初见潮玩或其他可能导致您账户遭窃、遗失的情况,建议您立即通知初见潮玩。您理解初见潮玩对您的任何请求采取行动均需要合理时间,且初见潮玩应您请求而采取的行动可能无法避免或阻止侵害后果的形成或扩大,除初见潮玩存在法定过错外,初见潮玩不承担责任。</view
+    >
+    <view class="top">四、初见潮玩服务及规范</view>
+    <view class="top1"
+      >【服务概況】
+      您有权在初见潮玩上享受商品购买、优惠券获取/消费、余额获取/消费等服务。初见潮玩提供的服务内容众多,具体您可登录初见潮玩浏览。</view
+    >
+    <view class="top1">4.1 商品及/或服务的购买</view>
+    <view class="top1"
+      >当您在初见潮玩购买商品及 /
+      或服务时,请您务必仔细确认所购商品的品名、价格、数量、型号、规格、尺寸或服务的时间、内容、限制性要求等重要事项,并在下单时核实您的联系地址、电话、收货人等信息。如您填写的收货人非您本人,则该收货人的行为和意思表示产生的法律后果均由您承担。</view
+    >
+    <view class="top1"
+      >您的购买行为应当基于真实的消费需求,不得存在对商品及/或服务实施恶意购买、恶意维权等扰乱初见潮玩正常交易秩序的行为。基于维护初见潮玩交易秩序及交易安全的需要,初见潮玩发现上述情形时可主动执行关闭相关交易订单等操作。</view
+    >
+    <view class="top1">4.2 费用</view>
+    <view class="top1"
+      >初见潮玩为您提供的服务付出了大量的成本,除初见潮玩明示的收费业务外,初见潮玩向您提供的服务目前是免费的。如未来初见潮玩向您收取合理费用,初见潮玩会采取合理途径并以足够合理的期限提前通过法定程序并以本协议第八条约定的方式通知您,确保您有充分选择的权利。</view
+    >
+    <view class="top1">4.3 初见潮玩规则</view>
+    <view class="top1"
+      >由于初见潮玩提供的服务众多,不同的服务其表现形式,操作流程与规范可能存在巨大差异,针对不同类型的服务,初见潮玩将提供不同的规则用于说明、解释服务的使用方法与规范,您需同意不同类型服务所对应的规则才可以使用该服务,如您不同意该规则,则视为放弃该服务所属所有功能与其他服中含有的与该服务关联的功能,您可能因此无法使用其他服务的部分或全部功能。如您使用该服务,则视为您同意该服务的所有规则。</view
+    >
+    <view class="top1">4.4 责任限制</view>
+    <view class="top1"
+      >【不可抗力及第三方原因】初见潮玩依照法律规定履行基础保障义务,但对于下述原因导致的合同履行障碍、履行瑕疵、履行延后或履行内容变更等情形,初见潮玩并不承担相应的违约责任:</view
+    >
+    <view class="top1"
+      >(一)因自然灾害、罢工、暴乱、战争、政府行为、司法行政命令等不可抗力因素;</view
+    >
+    <view class="top1">
+      (二)因电力供应故障、通讯网络故障等公共服务因素或第三人因素;</view
+    >
+    <view class="top1">
+      (三)
+      在初见潮玩己尽善意管理的情况下,因常规或紧急的设备与系统维护、设备与系统故障、网络信息与数据安全等因素。</view
+    >
+    <view class="top">五、用户信息的保护及授权</view>
+    <view class="top1">5.1 个人信息的保护</view>
+    <view class="top1"
+      >初见潮玩非常重视用户个人信息(即能够独立或与其他信息结合后识别用户身份的信息)的保护,在您使用初见潮玩提供的服务时,您同意初见潮玩按照在初见潮玩上公布的隐私权政策在符合微信平台相关协议的基础上收集、存储、使用、披露和保护您的个人信息。</view
+    >
+    <view class="top1">5.2 非个人信息的保证与授权</view>
+    <view class="top1"
+      >【信息的发布】您声明并保证,您对您所发布的信息拥有相应、合法的权利。否则,初见潮玩可对您发布的信息依法或依本协议进行删除或屏蔽。</view
+    >
+    <view class="top1"
+      >【禁止性信息】您应当确保您所发布的信息不包含以下内容:</view
+    >
+    <view class="top1"> (一)违反国家法律法规禁止性规定的;</view>
+    <view class="top1">
+      (二)政治宣传、封建迷信、淫秽、色情、赌博、暴力、恐怖或者教唆犯罪的;</view
+    >
+    <view class="top1">(三)欺诈、虚假、不准确或存在误导性的;</view>
+    <view class="top1">
+      (四)侵犯他人知识产权或涉及第三方商业秘密及其他专有权利的;</view
+    >
+    <view class="top1"
+      >(五)侮辱、诽谤、恐吓、涉及他人隐私等侵害他人合法权益的;</view
+    >
+    <view class="top1">
+      (六)存在可能破坏、篡改、删除、影响初见潮玩任何系统正常运行或末经授杈秘密获取初见潮玩及其他用户的数据、个人资料的病毒、木马、爬虫等恶意软件、程序代码的;</view
+    >
+    <view class="top1"
+      >(七)其他违背社会公共利益或公共道德或依据相关初见潮玩协议、规则的规定不适合在初见潮玩上发布的。</view
+    >
+    <view class="top">六、用户的违约及处理</view>
+    <view class="top1">6.1 发生如下情形之一的,视为您违约:</view>
+    <view class="top1">(一)使用初见潮玩服务时违反有关法律法规规定的;</view>
+    <view class="top1">
+      (二)违反本协议或本协议补充协议 (即本协议第 2.2条)约定的。</view
+    >
+    <view class="top1"
+      >为满足海量用户对高效优质服务的需求,您理解并同意,初见潮玩可在初见潮玩规则中约定违约认定的程序和标准。如:初见潮玩可依据的用户数据与海量用户数据的关系来认定您是否构成违约;您有义务对您的数据异常现象进行充分举证和合理解释,否则将被认定为违约。</view
+    >
+    <view class="top1">6.2违约处理措施</view>
+    <view class="top1"
+      >【信息处理】您在初见潮玩上发布的信息构成违约的,初见潮玩可根据相应规则立即对相应信息进行删除、屏蔽处理或对您的商品进行下架、监管。</view
+    >
+    <view class="top1"
+      >【行为限制】您在初见潮玩上实施的行为,或虽未在初见潮玩上实施但对初见潮玩及其用户产生影响的行为构成违约的,初见潮玩可依据相应规则对您执行限制功能使用权限、中止向您提供部分或全部服务等处理措施。如您的行为构成根本违约的,初见潮玩可查封您的账户,终止向您提供服务。</view
+    >
+    <view class="top1"
+      >【初见潮玩支付账户处理】当您违约的同时存在欺诈、售假、盗用他人账户等特定情形或您存在危及他人交易安全或账户安全风险时,初见潮玩会依照您行为的风险程度对您的初见潮玩支付账户采取取消收款
+      资金止付等强制措施。</view
+    >
+    <view class="top1"
+      >【处理结果公示】初见潮玩可将对您上述违约行为处理措施信息以及其他经国家行政或司法机关生效法律文书确认的违法信息在初见潮玩上予以公示。</view
+    >
+    <view class="top1">6.3 赔偿责任</view>
+    <view class="top1"
+      >如您的行为使初见潮玩及
+      /或其关联公司遭受损失(包括自身的直接经济损失、商誉损失及对外支付的赔偿金、和解款、律师费、诉讼费等问接经济损失),您应赔偿初见潮玩及
+      / 或其关联公司的上述全部损失。如您的行为使初见潮玩及
+      /或其关联公司遭受第三人主张权利,初见潮玩及/或其关联西担金钱给付等义务后就全部损失向您追偿。</view
+    >
+    <view class="top1">6.4 特别约定</view>
+    <view class="top1">【关联处理】</view>
+    <view class="top1"
+      >如您因严重违约导致初见潮玩终止本协议时,出于维护秩序及保护消费者权益的目的,初见潮玩及
+      /
+      或其关联公司可对与您在其他协议项下的合作采取中止甚或终止协议的措施,并以本协议第八条约定的方式通知您。</view
+    >
+    <view class="top1"
+      >如初见潮玩与您签署的其他协议及初见潮玩及
+      /或其关联公司与您签署的协议中明确约定了对您在本协议项下合作进行关联处理的情形,则初见潮玩出于维护秩序及保护消费者权益的目的,可在收到指令时中止甚至终止协议,并以本协议第八条约定的方式通知您。</view
+    >
+    <view class="top">七、协议的变更</view>
+    <view class="top1"
+      >初见潮玩可根据国家法律法规变化及维护交易秩序、保护消费者权益需要,不时修改本协议、补充协议,变更后的协议、补充协议(下称“变更事项”)
+      将通过法定程序并以本协议第八条约定的方式通知您。</view
+    >
+    <view class="top1"
+      >如您不同意变更事项,您有权于变更事项确定的生效日前联系初见潮玩反馈意见。如反馈意见得以采纳,初见潮玩将酌情调整变更事项。</view
+    >
+    <view class="top1"
+      >如您对已生效的变更事项仍不同意的,您应当于变更事项确定的生效之日起停止使用初见潮玩服务,变更事项对您不产生效力;</view
+    >
+    <view class="top1"
+      >如您在变更事项生效后仍继续使用初见潮玩服务,则视为您同意已生效的变更事项。</view
+    >
+    <view class="top">八、通知</view>
+    <view class="top1">8.1 有效联系方式</view>
+    <view class="top1"
+      >您在注册成为初见潮玩用户,并接受初见潮玩服务时,您应该向初见潮玩提供真实有效的联系方式(包括您的联系电话、联系地址等),对于联系方式发生变更的,您有义务及时更新有关信息,并保持可被联系的状态。</view
+    >
+    <view class="top1"
+      >您在注册初见潮玩用户时生成的用于登陆初见潮玩接收系统消息和即时信息的会员账号(包括子账号),也作为您的有效联系方式。初见潮玩将向您的上述联系方式的其中之一或其中若干向您送达各类通知,而此类通知的内容可能对您的权利义务产生重大的有利或不利影响,请您务必及时关注。</view
+    >
+    <view class="top1">8.2 通知的送达</view>
+    <view class="top1"
+      >初见潮玩通过上述联系方式向您发出通知,其中以电子的方式发出的书面通知,包括但不限于在初见潮玩公告,向您提供的联系电话发送手机短信,向您提供的电子邮件地址发送电子邮件,向您的账号发送信息、系统消息以及站内信信息,在发送成功后即视为送达。</view
+    >
+    <view class="top1"
+      >对于在初见潮玩上因交易活动引起的任何纠纷,您同意司法机关(包括但不限于人民法院)可以通过手机短信、电子邮件、即时通讯工具等现代通讯方式或邮寄方式向您送达法律文书(包括但不限于诉讼文书)。您指定接收法律文书的手机号
+      码、电子邮箱或初见潮玩账号等联系方式为您在初见潮玩注册、更新时提供的手机号码、电子邮箱联系方式以及在注册用户时初见潮玩生成的账号,司法机关向上述联系方式发出法律文书即视为送达。您指定的邮寄地址为您的法定联系地址或您提供的有效联系地址。</view
+    >
+    <view class="top1"
+      >您应当保证所提供的联系方式是准确、有效的,并进行实时更新。如果因提供的联系方式不确切,或不及时告知变更后的联系方式,使法律文书无法送达或未及时送达,由您自行承担由此可能产生的法律后果。</view
+    >
+    <view class="top1"
+      >您同意司法机关可采取以上一种或多种送达方式向您达法律文书,司法机关采取多种方式向您送达法律文书,送达时间以上述送达方式中最先送达的为准。您同意上述送达方式适用于各个司法程序阶段。如进入诉讼程序的,包括但不限于一审、二审、再审、执行以及督促程序等。</view
+    >
+    <view class="top1"
+      >您应当保证所提供的联系方式是准确、有效的,并进行实时更新。如果因提供的联系方式不确切,或不及时告知变更后的联系方式,使法律文书无法送达或未及时送达,由您自行承担由此可能产生的法律后果。</view
+    >
+    <view class="top">九、协议的终止</view>
+    <view class="top1">9.1终止的情形</view>
+    <view class="top1"
+      >【用户发起的终止】您有权通过以下任一方式终止本协议:</view
+    >
+    <view class="top1"
+      >(一)变更事项生效前您停止使用并明示不愿接受变更事项的;</view
+    >
+    <view class="top1"
+      >(二)您明示不愿继续使用初见潮玩服务,且符合初见潮玩终止条件的。</view
+    >
+    <view class="top1"
+      >【初见潮玩发起的终止】出现以下情况时,初见潮玩可以本协议第八条的所列的方式通知您终止本协议:</view
+    >
+    <view class="top1"
+      >(一)您违反本协议约定,初见潮玩依据违约条款终止本协议的;</view
+    >
+    <view class="top1">
+      (二)您盗用他人账户、发布违禁信息、骗取他人财物、售假、扰乱市场秩序、采取不正当手段谋利等行为,初见潮玩依据初见潮玩规则对您的账户予以查封的;</view
+    >
+    <view class="top1">
+      (三)除上述情形外,因您多次违反初见潮玩规则相关规定且情节严重,初见潮玩依据初见潮玩规则对您的账户予以查封的;</view
+    >
+    <view class="top1">(四)您的账户被初见潮玩依据本协议回收的;</view>
+    <view class="top1"
+      >(五)您在初见潮玩关联产品、必有回响相关有欺诈,发布或销售假冒伪劣 /
+      侵权商品、侵犯他人合法权益或其他严重违法违约行为的;</view
+    >
+    <view class="top1">(六)其它应当终止服务的情况。</view>
+    <view class="top1">9.2协议终止后的处理</view>
+    <view class="top1"
+      >【用户信息披露】本协议终止后,除法律有明确规定外,初见潮玩无义务向您或您指定的第三方披露您账户中的任何信息。</view
+    >
+    <view class="top1"
+      >【初见潮玩权利】本协议终止后,初见潮玩仍享有下列权利:</view
+    >
+    <view class="top1"
+      >(—)继续保存您留存于初见潮玩的本协议第五条所列的各类信息;</view
+    >
+    <view class="top1">
+      (二)对于您过往的违约行为,初见潮玩仍可依据本协议向您追究违约责任。</view
+    >
+    <view class="top1"
+      >【交易处理】本协议终止后,对于您在本协议存续期间产生的交易订单,初见潮玩可通知交易相对方并根据交易相对方的意愿决定是否关闭该等交易订单;如交易相对方要求继续履行的,则您应当就该等交易订单继续履行本协议及交易订单的约定,并承担因此产生的任何损失或增加的任何费用。</view
+    >
+    <view class="top">十、法律适用、管辖与其他</view>
+    <view class="top1"
+      >【法律适用】本协议之订立、生效、解释、修订、补充、终止、执行与争议解决均适用中华人民共和国大陆地区法律;如法律无相关规定的,参照商业惯例及
+      / 或行业惯例。</view
+    >
+    <view class="top1"
+      >【管辖】您因使用初见潮玩服务所产生及与初见潮玩服务有关的争议,由初见潮玩与您协商解决。协商不成时,任何一方均可向被告所在地有管辖权的人民法院提起诉讼</view
+    >
+    <view class="top1"
+      >【可分性】
+      本协议任一条款被视为废止、无效或不可执行,该条应视为可分的且并不影响本协议其余</view
+    >
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {};
+  },
+  methods: {},
+};
+</script>
+
+<style>
+image {
+  height: inherit;
+  width: inherit;
+}
+
+.content {
+  align-items: flex-start;
+  display: flex;
+  flex-direction: column;
+  width: 750rpx;
+  min-height: 100vh;
+  box-sizing: border-box;
+  padding-bottom: 64rpx;
+}
+
+.top {
+  color: #333;
+  font-size: 30rpx;
+  line-height: 32rpx;
+  margin-top: 48rpx;
+}
+
+.top1,
+.top {
+  display: inline-block;
+  font-family: PingFangSC-Medium;
+  margin-left: 32rpx;
+  width: 686rpx;
+}
+
+.top1 {
+  color: #666;
+  font-size: 28rpx;
+  line-height: 42rpx;
+  margin-top: 16rpx;
+  text-indent: 22px;
+}
+
+.img {
+  background: #d8d8d8;
+  border-radius: 16rpx;
+  display: inline-block;
+  height: 291rpx;
+  margin-left: 32rpx;
+  margin-top: 24rpx;
+  width: 686rpx;
+}
+</style>

+ 406 - 0
src/pages/index/index.scss

@@ -0,0 +1,406 @@
+.BanContain {
+  position: fixed;
+  width: 100%;
+  top: 0;
+  z-index: 10;
+  background: #fff;
+
+  .status_bar {
+    height: var(--status-bar-height);
+    width: 100%;
+  }
+
+  .navBar {
+    display: flex;
+    align-items: center;
+    padding: 0 24rpx;
+    .logo {
+      display: block;
+      width: 166rpx;
+      height: 40rpx;
+    }
+
+    .bans {
+      margin-left: 12rpx;
+    }
+  }
+}
+
+.home-index2 {
+  background: #f5f5f5;
+  background-size: 100% auto;
+  overflow: hidden;
+  .swiper {
+    width: 100%;
+    height: 276rpx;
+  }
+  .swiper-item {
+    width: 100%;
+    display: block;
+    height: 276rpx;
+  }
+  .banner {
+    padding: 0 24rpx;
+    margin: 24rpx 0;
+    display: flex;
+    &.banner-swiper {
+      height: 164rpx;
+    }
+    .banner-item {
+      width: 100%;
+      height: 160rpx;
+      margin: 0 7rpx;
+      &:first-child {
+        margin-left: 0;
+      }
+      &:last-child {
+        margin-right: 0;
+      }
+    }
+  }
+
+  .flash-sale {
+    width: 750rpx;
+    height: 572rpx;
+    padding: 52rpx 0 0;
+    background: url("https://chujianchaowan.oss-cn-beijing.aliyuncs.com/images/d73e5555842c968cf39a6bea9442e4fd.png")
+      no-repeat center top;
+    background-size: 100% 100%;
+    overflow: hidden;
+    margin-top: -24rpx;
+    .cd-title {
+      height: 32rpx;
+      padding-left: 158rpx;
+      overflow: hidden;
+      display: flex;
+      align-items: flex-start;
+      .cd-block {
+        min-width: 22rpx;
+        height: 28rpx;
+        font-size: 20rpx;
+        color: #292d3b;
+        width: 32rpx;
+        height: 32rpx;
+        background: #4efbff;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+      }
+      .cd-item {
+        min-width: 14rpx;
+        height: 32rpx;
+        font-size: 20rpx;
+        color: #08c2c3;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        &.day {
+          margin: 0 6rpx;
+        }
+      }
+    }
+    .sale-list {
+      width: 670rpx;
+      height: 394rpx;
+      overflow-x: auto;
+      white-space: nowrap;
+      margin: 32rpx auto 14rpx;
+      .sale-item {
+        display: inline-block;
+        vertical-align: top;
+        width: 256rpx;
+        height: 376rpx;
+        overflow: hidden;
+        margin-right: 16rpx;
+        &:last-child {
+          margin-right: 0;
+        }
+      }
+      .sale-pic,
+      .sale-img {
+        position: relative;
+        width: 256rpx;
+        height: 256rpx;
+        display: block;
+      }
+      .sale-text {
+        position: absolute;
+        left: 0;
+        bottom: 0;
+        width: 100%;
+        font-size: 22rpx;
+        font-weight: 500;
+        color: #ffffff;
+        height: 36rpx;
+        background: linear-gradient(
+          95deg,
+          #fc5e94 0%,
+          rgba(252, 94, 148, 0.47) 100%
+        );
+        line-height: 36rpx;
+        text-align: center;
+      }
+
+      .sale-title {
+        font-size: 24rpx;
+        font-weight: 500;
+        color: #292d3b;
+        line-height: 34rpx;
+        height: 68rpx;
+        display: block;
+        white-space: normal;
+        margin: 8rpx 0;
+      }
+      .sale-sub {
+        color: #08c2c3;
+        line-height: 34rpx;
+        display: block;
+        font-family: unidreamledregular, Helvetica Neue, Helvetica, Arial,
+          Hiragino Sans GB, Hiragino Sans GB W3, Microsoft YaHei UI,
+          Microsoft YaHei, WenQuanYi Micro Hei, sans-serif;
+        .sale-label {
+          font-size: 24rpx;
+          margin-right: 5rpx;
+          font-weight: bolder;
+        }
+        .sale-price {
+          font-size: 32rpx;
+        }
+        .sale-origin {
+          font-size: 20rpx;
+          font-weight: 400;
+          color: #a6a7ac;
+          text-decoration: line-through;
+          margin-left: 10rpx;
+        }
+      }
+    }
+    .fill-title {
+      margin-top: 46rpx;
+    }
+  }
+  .fill-title-wrap {
+    height: 88rpx;
+  }
+  .fill-title {
+    box-sizing: border-box;
+    width: 100%;
+    display: flex;
+    justify-content: space-between;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #555;
+    height: 88rpx;
+    padding: 0;
+    line-height: 88rpx;
+    .icon-sort {
+      width: 28rpx;
+      height: 28rpx;
+      margin-left: 2rpx;
+    }
+    .fill-item {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      position: relative;
+      width: 0;
+      flex: 1;
+      &.white {
+        color: #222;
+        font-weight: bold;
+        &::after {
+          width: 32rpx;
+          height: 6rpx;
+          background: #08c2c3;
+          position: absolute;
+          content: "";
+          left: 50%;
+          bottom: 0;
+          margin-left: -16rpx;
+        }
+      }
+    }
+  }
+  .home-titlebar {
+    background-color: #fff;
+  }
+  .home-titlebar-fix {
+    position: fixed;
+    left: 0;
+    top: 0;
+    z-index: 9;
+  }
+  .footer {
+    width: 100%;
+    margin-top: 24rpx;
+    margin-bottom: 22rpx;
+
+    .info {
+      height: 40rpx;
+      font-size: 28rpx;
+      font-weight: 500;
+      color: #999999;
+      line-height: 40rpx;
+      text-align: center;
+    }
+
+    .contact {
+      margin-top: 8rpx;
+      height: 40rpx;
+      font-size: 28rpx;
+      font-weight: 500;
+      color: #999999;
+      line-height: 40rpx;
+      text-align: center;
+    }
+  }
+  .popup_coupon {
+    color: #fff;
+    font-weight: 500;
+    text-align: center;
+    position: relative;
+    .title {
+      display: block;
+      height: 50rpx;
+      font-size: 36rpx;
+      line-height: 50rpx;
+    }
+    .desc {
+      display: block;
+      height: 40rpx;
+      font-size: 28rpx;
+      line-height: 40rpx;
+    }
+    .gifts {
+      width: 708rpx;
+      height: 686rpx;
+      display: block;
+      margin: -16rpx auto -80rpx;
+      animation: zoomIn 0.3s both;
+    }
+    .coupon-button {
+      display: inline-block;
+      height: 80rpx;
+      font-size: 32rpx;
+      line-height: 80rpx;
+      padding: 0 46rpx;
+      background: #08c2c3;
+      border-radius: 0;
+    }
+  }
+  .popup_coupon_res {
+    box-sizing: border-box;
+    width: 840rpx;
+    height: 852rpx;
+    position: relative;
+    padding-top: 44rpx;
+    background: url(https://chujianchaowan.oss-cn-beijing.aliyuncs.com/images/b52109ed4dfc4551ad0254a99ddd0e34.png)
+      no-repeat center;
+    background-size: contain;
+
+    .title {
+      display: block;
+      position: relative;
+      text-align: center;
+      height: 50rpx;
+      font-size: 36rpx;
+      font-weight: 500;
+      color: #292d3b;
+      line-height: 50rpx;
+      margin: 0 0 24rpx;
+    }
+    .coupon-list {
+      position: relative;
+      width: 476rpx;
+      margin: 0 auto;
+      display: flex;
+      flex-wrap: wrap;
+      margin-bottom: 16rpx;
+      justify-content: space-between;
+      max-height: 380rpx;
+      overflow: auto;
+      .coupon-item {
+        width: 230rpx;
+        height: 116rpx;
+        background: url(@/static/home/gifts-item.png) no-repeat;
+        background-size: contain;
+        display: flex;
+        color: #fff;
+        align-items: center;
+        margin-bottom: 16rpx;
+        .text {
+          flex: 1;
+          text-align: center;
+          .big {
+            font-size: 80rpx;
+            font-weight: bold;
+            line-height: 98rpx;
+          }
+          .small {
+            font-size: 36rpx;
+            font-weight: 600;
+            line-height: 50rpx;
+          }
+        }
+        .label {
+          width: 62rpx;
+          height: 94rpx;
+          border-left: 1px dashed #717181;
+          position: relative;
+          overflow: hidden;
+          .label-text {
+            white-space: nowrap;
+            font-size: 28rpx;
+            font-weight: 600;
+            color: #ffffff;
+            position: absolute;
+            left: 50%;
+            top: 50%;
+            transform: translate(-50%, -50%) rotate(90deg);
+          }
+        }
+      }
+    }
+    .coupon-button {
+      width: 378rpx;
+      height: 128rpx;
+      font-size: 36rpx;
+      font-weight: 600;
+      color: #ffffff;
+      line-height: 128rpx;
+      text-align: center;
+      background: url(@/static/home/gifts-btn.png) no-repeat center transparent;
+      background-size: contain;
+      border: 0 none;
+      padding: 0;
+      position: absolute;
+      bottom: 28rpx;
+      left: 50%;
+      margin-left: -189rpx;
+      &::after {
+        display: none;
+      }
+    }
+  }
+  .fixed-btns {
+    position: fixed;
+    right: 14rpx;
+    bottom: 154rpx;
+    z-index: 999;
+    .fixed-btn {
+      display: block;
+      width: 112rpx;
+      height: 112rpx;
+      margin-bottom: 18rpx;
+    }
+  }
+}
+
+@keyframes zoomIn {
+  from {
+    transform: scale(0);
+  }
+  to {
+    transform: scale(1);
+  }
+}

+ 558 - 0
src/pages/index/index.vue

@@ -0,0 +1,558 @@
+<template>
+  <view class="home-index2">
+    <view class="BanContain">
+      <view
+        class="status_bar"
+        :style="{ height: statusBarHeight + 'px' }"
+      ></view>
+      <view class="navBar" :style="{ height: titleBarHeight + 'px' }">
+        <image class="logo" src="@/static/logo.png" mode=""></image>
+      </view>
+    </view>
+    <view :style="{ marginTop: BarHeight + 'px' }"></view>
+    <swiper
+      v-if="modules.rotation_images && modules.rotation_images.length"
+      class="swiper"
+      circular
+      indicator-dots
+      autoplay
+    >
+      <swiper-item
+        v-for="item in modules.rotation_images"
+        :key="item.module_id"
+      >
+        <image
+          class="swiper-item"
+          :src="item.img"
+          mode=""
+          @click="jumpModuleAll(item.url)"
+        ></image>
+      </swiper-item>
+    </swiper>
+    <view
+      v-if="modules.shortcut_two && modules.shortcut_two.length"
+      class="banner"
+    >
+      <image
+        v-for="item in modules.shortcut_two"
+        :key="item.module_id"
+        class="banner-item"
+        :src="item.img"
+        mode="widthFix"
+        @click="jumpModuleAll(item.url)"
+      ></image>
+    </view>
+    <view
+      v-if="modules.shortcut_thtee && modules.shortcut_thtee.length"
+      class="banner"
+    >
+      <image
+        v-for="item in modules.shortcut_thtee"
+        :key="item.module_id"
+        class="banner-item"
+        :src="item.img"
+        mode="widthFix"
+        @click="jumpModuleAll(item.url)"
+      ></image>
+    </view>
+
+    <swiper
+      v-if="modules.banner_images && modules.banner_images.length > 1"
+      class="banner banner-swiper"
+      circular
+      indicator-dots
+      autoplay
+    >
+      <swiper-item v-for="item in modules.banner_images" :key="item.module_id">
+        <image
+          class="swiper-item"
+          :src="item.img"
+          mode=""
+          @click="jumpModuleAll(item.url)"
+        ></image>
+      </swiper-item>
+    </swiper>
+    <view
+      v-else-if="modules.banner_images && modules.banner_images.length"
+      class="banner"
+    >
+      <image
+        v-for="item in modules.banner_images"
+        :key="item.module_id"
+        class="banner-item"
+        :src="item.img"
+        mode="widthFix"
+        @click="jumpModuleAll(item.url)"
+      ></image>
+    </view>
+    <view v-if="lists.length > 0" id="tab" class="fill-title-wrap">
+      <view
+        :class="[
+          'fill-title',
+          'home-titlebar',
+          { 'home-titlebar-fix': fixtab },
+        ]"
+        :style="tabStyle"
+      >
+        <view
+          v-for="item in listsArr"
+          :key="item.play_type"
+          :class="[
+            'fill-item',
+            { white: currentList.play_type === item.play_type },
+          ]"
+          @click="handleTabClick(item)"
+        >
+          <text>{{ item.name }}</text>
+        </view>
+      </view>
+    </view>
+    <view
+      v-if="currentList.list.length === 0 && currentList.loading"
+      class="base-list"
+    >
+      <list-item v-for="item in 10" :key="item" class="base-list-item">
+      </list-item>
+    </view>
+    <view v-else class="base-list">
+      <list-item
+        v-for="item in currentList.list"
+        :key="item.id"
+        :item="item"
+        class="base-list-item"
+        @click="handleDetail(item)"
+      >
+      </list-item>
+    </view>
+    <view v-if="!currentList.loading && !currentList.hasMore" class="footer">
+      <view class="info">到底啦~ ( ̄▽ ̄)”</view>
+      <!-- <view class="contact">联系我们:oushen2022@126.com</view> -->
+    </view>
+    <uni-popup
+      ref="popup_coupon"
+      type="center"
+      mask-background-color="rgba(0,0,0,0.8)"
+      :is-mask-click="false"
+    >
+      <view class="popup_coupon">
+        <text class="title">送你新人大礼包</text>
+        <text class="desc">拆开看看吧</text>
+        <image
+          class="gifts"
+          src="https://chujianchaowan.oss-cn-beijing.aliyuncs.com/images/23115720b6416c5f5235ea69a069d528.png"
+        ></image>
+        <button class="coupon-button" @click="doReceive">立即拆开</button>
+        <image
+          class="popup_close"
+          src="@/static/icon/icon-close.png"
+          @click="doClose('popup_coupon')"
+        >
+        </image>
+      </view>
+    </uni-popup>
+    <uni-popup
+      ref="popup_coupon_res"
+      type="center"
+      mask-background-color="rgba(0,0,0,0.8)"
+      :is-mask-click="false"
+    >
+      <view class="popup_coupon_res">
+        <text class="title">恭喜领取580新人大礼包</text>
+        <view class="coupon-list">
+          <view v-for="item in couponDatas" :key="item.id" class="coupon-item">
+            <view class="text">
+              <text
+                v-if="item.unit === '元' || item.unit === '¥'"
+                class="small"
+                >&yen;</text
+              >
+              <text class="big">{{ item.price }}</text>
+              <text
+                v-if="item.unit !== '元' && item.unit !== '¥'"
+                class="small"
+                >{{ item.unit }}</text
+              >
+            </view>
+            <view class="label"
+              ><text class="label-text">{{ item.name }}</text></view
+            >
+          </view>
+        </view>
+        <button class="coupon-button" @click="doClose('popup_coupon_res')">
+          立即使用
+        </button>
+        <image
+          class="popup_close"
+          src="@/static/icon/icon-close.png"
+          @click="doClose('popup_coupon_res')"
+        >
+        </image>
+      </view>
+    </uni-popup>
+    <!-- <popup-signin
+      ref="popup_signin"
+      :list="singInfo && singInfo.data ? singInfo.data : []"
+      :isCurrentSignin="singInfo ? singInfo.is_current_signin : 0"
+      :session="userInfo && userInfo.session ? userInfo.session : ''"
+      @change="handleSigninChange"
+    ></popup-signin> -->
+    <!-- <task-btn v-if="showTask" /> -->
+    <view class="fixed-btns">
+      <image
+        class="fixed-btn"
+        src="@/static/icon/icon-btn-service.png"
+        @click="jumpModuleAll('/pages/help/help_contact')"
+      ></image>
+      <!-- <image
+        class="fixed-btn"
+        src="@/static/icon/icon-btn-message.png"
+        @click="jumpModuleAll('/pages/my/messages')"
+      ></image> -->
+      <image
+        v-if="showTask"
+        class="fixed-btn"
+        src="@/static/icon/icon-btn-sign.png"
+        @click="jumpModuleAll('/pages/task/index')"
+      ></image>
+    </view>
+  </view>
+</template>
+<script>
+import login from "@/lib/utils/login";
+import api from "@/lib/api/api";
+import listItem from "@/components/list-item/list-item.vue";
+// import popupSignin from "@/components/popup-signin/popup-signin.vue";
+// import homeSaleItem from "@/components/home-sale-item/home-sale-item.vue";
+// import taskBtn from "@/components/task-btn/task-btn.vue";
+import { reqAcceptSubMsgs, defaultTemplateIds } from "@/lib/utils/wxSubscribe";
+
+export default {
+  name: "PageHome",
+  components: {
+    listItem,
+    // popupSignin,
+    // homeSaleItem,
+    // taskBtn,
+  },
+  data() {
+    return {
+      statusBarHeight: 0, // 自定义导航
+      titleBarHeight: 44, // 自定义导航
+      BarHeight: 0, // 自定义导航
+      fixtab: false,
+      scrollTop: 0,
+      datas: [],
+      userInfo: {},
+      couponDatas: [],
+      receiveStatus: 0,
+      newStatus: 0,
+      modules: {},
+      tabStyle: "",
+      currentTab: "",
+      lists: [],
+      singInfo: null,
+      showTask: false,
+    };
+  },
+  computed: {
+    currentList() {
+      return this.lists.find((i) => i.play_type === this.currentTab);
+    },
+    listsArr() {
+      return Object.keys(this.lists).map((key) => this.lists[key]);
+    },
+  },
+  onLoad() {
+    const uinfoStr = uni.getStorageSync("userinfo");
+    if (uinfoStr) {
+      this.userInfo = JSON.parse(uinfoStr);
+    }
+    uni.showLoading({
+      title: "加载中",
+    });
+    this.loadModules().then(() => {
+      uni.hideLoading();
+    });
+    this.loadList(this.currentList);
+  },
+  onShow() {
+    const uinfoStr = uni.getStorageSync("userinfo");
+    if (uinfoStr) {
+      this.userInfo = JSON.parse(uinfoStr);
+    } else {
+      this.userInfo = {};
+    }
+    if (!this.userInfo.session) {
+      this.getNewUserActivity();
+    }
+    this.getTaskInfo();
+    reqAcceptSubMsgs(defaultTemplateIds);
+  },
+  onPageScroll(e) {
+    this.scrollTop = e.scrollTop;
+    const tab = uni.createSelectorQuery().select("#tab");
+    tab
+      .fields(
+        {
+          rect: true,
+        },
+        (res) => {
+          if (res.top <= this.statusBarHeight + this.titleBarHeight) {
+            this.fixtab = true;
+            this.tabStyle = `top:${
+              this.statusBarHeight + this.titleBarHeight
+            }px;margin-top:0;`;
+          } else {
+            this.fixtab = false;
+            this.tabStyle = "";
+          }
+        }
+      )
+      .exec();
+  },
+  onShareAppMessage() {
+    return {
+      title: "各种爆款手办/盲盒,还能0元抽热款~快来试试你的欧气!",
+      imageUrl:
+        "https://chujianchaowan.oss-cn-beijing.aliyuncs.com/images/45bfb688e6e9dba557f64fd052e850cc.png",
+      path: "/pages/index/index",
+    };
+  },
+  onShareTimeline() {
+    return {
+      title: "各种爆款手办/盲盒,还能0元抽热款~快来试试你的欧气!",
+      imageUrl:
+        "https://chujianchaowan.oss-cn-beijing.aliyuncs.com/images/45bfb688e6e9dba557f64fd052e850cc.png",
+      path: "/pages/index/index",
+    };
+  },
+  onPullDownRefresh() {
+    // this.lists = resetLists();
+
+    Promise.all([this.loadModules(), this.loadList(this.currentList)])
+      .then(() => {
+        uni.stopPullDownRefresh();
+      })
+      .catch(() => {
+        uni.stopPullDownRefresh();
+      });
+  },
+  onReachBottom() {
+    if (!this.currentList.loading && this.currentList.hasMore) {
+      this.loadList(this.currentList);
+    }
+  },
+  mounted() {
+    const systemInfo = uni.getSystemInfoSync();
+    this.statusBarHeight = systemInfo.statusBarHeight;
+
+    // #ifdef MP
+    this.statusBarHeight = systemInfo.statusBarHeight;
+    // this.titleBarHeight = systemInfo.statusBarHeight;
+    // #endif
+
+    // #ifdef MP-WEIXIN
+    this.statusBarHeight = systemInfo.statusBarHeight;
+    const menuButtonInfo = wx.getMenuButtonBoundingClientRect();
+    this.titleBarHeight =
+      (menuButtonInfo.top - systemInfo.statusBarHeight) * 2 +
+      menuButtonInfo.height;
+    // #endif
+
+    // #ifdef MP-ALIPAY
+    this.statusBarHeight = systemInfo.statusBarHeight;
+    this.titleBarHeight =
+      systemInfo.statusBarHeight + systemInfo.titleBarHeight;
+    // #endif
+
+    // #ifdef APP-PLUS
+    this.statusBarHeight = systemInfo.statusBarHeight;
+    // this.titleBarHeight = 44;
+    // #endif
+
+    // #ifdef H5
+    this.statusBarHeight = 0;
+    // this.titleBarHeight = systemInfo.statusBarHeight;
+    // #endif
+    this.BarHeight = this.statusBarHeight + this.titleBarHeight;
+  },
+  methods: {
+    handleSigninChange(data) {
+      this.singInfo = data;
+    },
+    async loadModules() {
+      try {
+        const data = await api.homeModules();
+        if (data.errno == 10000) {
+          this.modules = data.data;
+          // this.endTime = data.diff_time;
+          // this.runCd();
+        } else {
+          uni.showToast({
+            icon: "none",
+            title: data.errmsg,
+            duration: 3000,
+          });
+        }
+      } catch (e) {
+        uni.showToast({
+          icon: "none",
+          title: "出错啦,请稍后重试",
+          duration: 3000,
+        });
+      }
+    },
+    // 获取优惠券列表
+    async getNewUserActivity() {
+      try {
+        const data = await api.getNewUserActivity();
+        if (data.errno == 10000) {
+          this.couponDatas = data.data;
+          if (this.couponDatas && this.couponDatas.length > 0) {
+            this.doShowCoupon("popup_coupon");
+            return true;
+          }
+          return false;
+        }
+        return false;
+      } catch (e) {
+        return false;
+      }
+    },
+    doReceive() {
+      uni.showLoading({
+        title: "加载中",
+        mask: true,
+      });
+      login.wxLogin((userInfo) => {
+        this.userInfo = userInfo;
+        uni.hideLoading();
+        this.getTaskInfo();
+        this.doClose("popup_coupon");
+        if (
+          userInfo.coupons &&
+          userInfo.coupons.is_bind_coupon === 1 &&
+          userInfo.coupons.coupons_info &&
+          userInfo.coupons.coupons_info.length
+        ) {
+          this.couponDatas = userInfo.coupons.coupons_info;
+          this.doShowCoupon("popup_coupon_res");
+          if (userInfo.coupons.is_bind_info_index) {
+            uni.showToast({
+              icon: "none",
+              title: userInfo.coupons.is_bind_info_index,
+              duration: 3000,
+            });
+          }
+        } else {
+          uni.showToast({
+            icon: "none",
+            title: "您已经领取过了~",
+            duration: 3000,
+          });
+        }
+      });
+    },
+    doShowCoupon(popup_ref) {
+      this.$refs[popup_ref].open();
+    },
+    doClose(popup_ref) {
+      this.$refs[popup_ref].close();
+    },
+    handleTabClick(item) {
+      if (this.currentTab === item.play_type) {
+        return;
+      }
+      this.currentTab = item.play_type;
+      if (item.list.length === 0 && item.hasMore) {
+        this.loadList(item);
+      }
+    },
+    async getTaskInfo() {
+      if (!this.userInfo.session) {
+        this.showTask = true;
+        return Promise.reject();
+      }
+      const data = await api.getTaskInfo(this.userInfo.session);
+      this.showTask = !data.is_current_signin;
+    },
+    async loadList(item) {
+      try {
+        const params = { session: this.userInfo?.session || "" };
+        if (item) {
+          params.play_type = item.play_type;
+          params.last_id = item.last_id;
+        }
+        const data = await api.homeListV3(params);
+
+        if (!this.lists.length) {
+          this.currentTab = Number(data.play_type);
+          this.lists = data.tab_list.map((tab) => {
+            tab.hasMore = true;
+            tab.loading = false;
+            tab.list = [];
+            return tab;
+          });
+        }
+
+        const currentTab = this.lists.find(
+          (i) => i.play_type === Number(data.play_type)
+        );
+
+        if (!currentTab.last_id || !currentTab.list) {
+          currentTab.list = data.data;
+        } else {
+          currentTab.list = currentTab.list.concat(data.data);
+        }
+
+        currentTab.last_id = data.last_id;
+        currentTab.loading = data.false;
+      } catch (e) {}
+    },
+    // async loadList(item) {
+    //   item.loading = true;
+    //   try {
+    //     const params = item.query;
+    //     if (item.query.page > 1 && item.list && item.list.length) {
+    //       params.lastId = item.list[item.list.length - 1].id;
+    //     } else {
+    //       params.lastId = 0;
+    //     }
+    //     const data = await api.homeList(item.query);
+    //     if (item.query.page === 1) {
+    //       item.list = data.data;
+    //     } else {
+    //       item.list = item.list.concat(data.data);
+    //     }
+
+    //     item.hasMore = item.query.page * item.query.size < data.total;
+    //     item.query.page++;
+    //   } catch (e) {}
+    //   item.loading = false;
+    // },
+    jumpModuleAll(url) {
+      if (!url) return;
+
+      if (/^https?:\/\//i.test(url)) {
+        uni.navigateTo({
+          url: `../webview/webview?url=${encodeURIComponent(url)}`,
+        });
+        return;
+      }
+      uni.navigateTo({
+        url: url,
+      });
+    },
+    handleDetail(item) {
+      if (item.play_type === 1) {
+        this.jumpModuleAll(`../detail/detail?id=${item.id}`);
+      } else {
+        this.jumpModuleAll(`../reward/detail?id=${item.id}`);
+      }
+    },
+  },
+};
+</script>
+<style lang="scss">
+@import "./index.scss";
+</style>

+ 149 - 0
src/pages/index/list.scss

@@ -0,0 +1,149 @@
+text {
+  letter-spacing: 0.3px;
+}
+.home-list {
+  width: 750rpx;
+  background: #f5f5f5;
+  height: 100%;
+  .list {
+    margin: 20rpx 20rpx 0;
+    .r {
+      width: 100%;
+      height: 240rpx;
+      margin: 0rpx 0rpx 20rpx;
+      .r1 {
+        width: 240rpx;
+        position: relative;
+        img {
+          border-radius: 8rpx;
+          height: 240rpx;
+          width: 240rpx;
+        }
+        .tag {
+          position: absolute;
+          background: linear-gradient(45deg, #ff8104 10%, #ffcd71 100%);
+          text-align: center;
+          color: #ffffff;
+          letter-spacing: 1rpx;
+          font-size: 20rpx;
+          top: 6rpx;
+          left: 6rpx;
+          font-weight: 500;
+          padding: 4rpx 10rpx 6rpx;
+          border-radius: 8rpx;
+        }
+      }
+      .r2 {
+        width: 412rpx;
+        margin-left: 18rpx;
+        height: 240rpx;
+        position: relative;
+        .n1 {
+          width: 100%;
+          height: 40rpx;
+          margin-bottom: 50rpx;
+          text {
+            width: 100%;
+            font-size: 28rpx;
+            font-weight: 550;
+            color: #26272c;
+            line-height: 40rpx;
+            overflow: hidden;
+            white-space: nowrap;
+            word-break: break-all; /* break-all(允许在单词内换行。) */
+            text-overflow: ellipsis; /* 超出部分省略号 */
+            display: block;
+          }
+        }
+        .tag {
+          border: 1rpx solid #ff9f5b;
+          text-align: center;
+          color: #ff9f5b;
+          letter-spacing: 1rpx;
+          font-size: 20rpx;
+          font-weight: 500;
+          padding: 0rpx 10rpx;
+          line-height: 33rpx;
+          text-align: center;
+          height: 33rpx;
+          border-radius: 8rpx;
+          position: absolute;
+          top: 48rpx;
+          display: inline-block;
+        }
+        .n2 {
+          height: 50rpx;
+          margin-top: 8rpx;
+          .price1 {
+            height: 50rpx;
+            font-size: 22rpx;
+            font-weight: 550;
+            color: #ec2e56;
+            line-height: 40rpx;
+            letter-spacing: 1rpx;
+            text {
+              margin-left: 4rpx;
+              font-size: 28rpx;
+            }
+          }
+          .price2 {
+            text-decoration: line-through;
+            margin-left: 8rpx;
+            height: 34rpx;
+            font-size: 24rpx;
+            font-weight: 550;
+            color: #999999;
+            line-height: 34rpx;
+            letter-spacing: 1rpx;
+            text {
+              margin-left: 4rpx;
+            }
+          }
+        }
+        .n3 {
+          height: 96rpx;
+          margin-top: 8rpx;
+          img {
+            height: 96rpx;
+            width: 96rpx;
+            border-radius: 6rpx;
+          }
+        }
+      }
+    }
+  }
+  .gc-1 {
+    width: 710rpx;
+    margin: 20rpx 20rpx 0;
+    background-color: #ffffff;
+    border-radius: 16rpx;
+    .line {
+      margin-bottom: 20rpx;
+      width: 100%;
+      height: 2rpx;
+      background-color: #f5f5f5;
+    }
+  }
+  .footer {
+    width: 100%;
+    margin-top: 16rpx;
+    margin-bottom: 22rpx;
+    .info {
+      height: 40rpx;
+      font-size: 28rpx;
+      font-weight: 500;
+      color: #999999;
+      line-height: 40rpx;
+      text-align: center;
+    }
+    .contact {
+      margin-top: 8rpx;
+      height: 40rpx;
+      font-size: 28rpx;
+      font-weight: 500;
+      color: #999999;
+      line-height: 40rpx;
+      text-align: center;
+    }
+  }
+}

+ 107 - 0
src/pages/index/list.vue

@@ -0,0 +1,107 @@
+<template>
+  <view class="home-list flex-col">
+    <view class="gc-1">
+      <view class="list flex-col">
+        <view v-for="(ele, idx) in datas.relations" :key="ele.id">
+          <view class="r flex-row" @tap="jumpToDetail(ele)">
+            <view class="r1"><img mode :src="ele.img" alt="" /></view>
+            <view class="r2">
+              <view class="n1"
+                ><text>{{ ele.name }}</text></view
+              >
+              <text v-if="ele.tag" class="tag">{{ ele.tag }}</text>
+              <view class="n2">
+                <text class="price1"
+                  >¥<text>{{ ele.show_price }}</text></text
+                >
+                <text v-if="ele.show_price != ele.source_price" class="price2"
+                  >¥<text>{{ ele.source_price }}</text></text
+                >
+              </view>
+              <view class="n3 justify-between">
+                <img v-for="sub in ele.sub_imgs" :key="sub" :src="sub" alt="" />
+              </view>
+            </view>
+          </view>
+          <view v-if="idx < datas.relations.length - 1" class="line"></view>
+        </view>
+      </view>
+    </view>
+    <view class="footer">
+      <view class="info">到底啦~ ( ̄▽ ̄)”</view>
+      <view class="contact">联系我们:oushen2022@126.com</view>
+    </view>
+  </view>
+</template>
+<script>
+import api from "@/lib/api/api";
+export default {
+  name: "PageList",
+  data() {
+    return {
+      datas: [],
+      id: "",
+    };
+  },
+  onLoad(data) {
+    this.id = data.id;
+    this.loadModule(data.id);
+  },
+  // 分享
+  onShareAppMessage() {
+    return {
+      title: "初见潮玩,各种绝版大娃抽到飞起!",
+    };
+  },
+  // 分享
+  onShareTimeline() {
+    return {
+      title: "初见潮玩,各种绝版大娃抽到飞起!",
+    };
+  },
+  // 下拉刷新
+  onPullDownRefresh() {
+    this.loadModule(this.id, () => {
+      uni.stopPullDownRefresh();
+    });
+  },
+  methods: {
+    // 获取数据
+    loadModule(id, cb) {
+      api
+        .homeModule(id)
+        .then((data) => {
+          if (data.data) {
+            this.datas = data.data;
+            uni.setNavigationBarTitle({
+              title: this.datas.title,
+            });
+          }
+          if (cb) cb();
+        })
+        .catch(() => {
+          uni.showToast({
+            icon: "none",
+            title: "出错啦,请稍后重试",
+            duration: 2e3,
+          });
+          if (cb) cb();
+        });
+    },
+    jumpToDetail(data) {
+      if (data.play_type == 2) {
+        uni.navigateTo({
+          url: `../detail/pinche?id=${data.id}`,
+        });
+      } else {
+        uni.navigateTo({
+          url: `../detail/detail?id=${data.id}`,
+        });
+      }
+    },
+  },
+};
+</script>
+<style lang="scss">
+@import "./list.scss";
+</style>

+ 42 - 0
src/pages/my/coupon.scss

@@ -0,0 +1,42 @@
+.coupon-page {
+  background: #f5f5f5;
+  min-height: 100vh;
+  position: relative;
+  .tab {
+    width: 100%;
+    height: 76rpx;
+    background: #ffffff;
+    letter-spacing: 3rpx;
+    position: sticky;
+    top: 0;
+    z-index: 99;
+    .curr,
+    .his {
+      width: 50%;
+      text-align: center;
+      font-size: 32rpx;
+      font-weight: 500;
+      color: #9496a5;
+      text {
+        box-sizing: border-box;
+        display: inline-flex;
+        align-items: center;
+        justify-content: center;
+        height: 76rpx;
+      }
+    }
+    .cur {
+      color: #08c2c3;
+      text {
+        padding-top: 8rpx;
+        border-bottom: 8rpx solid #08c2c3;
+      }
+    }
+  }
+
+  .list {
+    padding-top: 24rpx;
+    position: relative;
+    z-index: 0;
+  }
+}

+ 94 - 0
src/pages/my/coupon.vue

@@ -0,0 +1,94 @@
+<template>
+  <view class="coupon-page">
+    <view class="tab flex-row">
+      <view
+        class="curr"
+        :class="navCur == 'curr' ? 'cur' : ''"
+        @tap="change('curr')"
+      >
+        <text>可用卡券</text>
+      </view>
+      <view
+        class="his"
+        :class="navCur == 'his' ? 'cur' : ''"
+        @tap="change('his')"
+      >
+        <text>历史卡券</text>
+      </view>
+    </view>
+    <view v-show="navCur == 'curr'" class="list">
+      <coupon v-for="item in currList" :key="item.id" :coupon="item" />
+    </view>
+
+    <view v-show="navCur == 'his'" class="list">
+      <coupon v-for="item in hisList" :key="item.id" :coupon="item" />
+    </view>
+  </view>
+</template>
+
+<script>
+import coupon from "@/components/coupon/coupon.vue";
+import api from "@/lib/api/api";
+export default {
+  name: "PageMyCoupon",
+  components: {
+    coupon,
+  },
+  data() {
+    return {
+      navCur: "curr", // 当前显示的nav: curr  his
+      userInfo: {},
+      currList: [],
+      hisList: [],
+    };
+  },
+  onLoad() {
+    const uinfoStr = uni.getStorageSync("userinfo");
+    if (uinfoStr) {
+      this.userInfo = JSON.parse(uinfoStr);
+    } else {
+      uni.showToast({
+        title: "请先登录",
+        icon: "none",
+      });
+    }
+  },
+  onShow() {
+    if (!this.userInfo) {
+      return;
+    }
+
+    this.initList();
+  },
+  methods: {
+    async initList() {
+      uni.showLoading({
+        title: "加载中",
+        mask: true,
+      });
+      const { data } = await api.myCouponList(this.userInfo.session);
+      if (data) {
+        for (let j = 0; j < data.length; j++) {
+          if (data[j].use_type == 1) {
+            this.currList.push(data[j]);
+          } else if (data[j].use_type == 2 || data[j].use_type == 0) {
+            this.hisList.push(data[j]);
+          }
+        }
+      }
+      uni.hideLoading();
+    },
+    // 切换 nav
+    change(alias) {
+      if (alias == this.navCur) {
+        return;
+      }
+      this.navCur = alias;
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+@import "./coupon.scss";
+</style>

+ 349 - 0
src/pages/my/invite.vue

@@ -0,0 +1,349 @@
+<template>
+  <view class="invite">
+    <view class="invite-header-wrap">
+      <view class="invite-header">
+        <image
+          src="@/static/my/icon-help.png"
+          class="invite-icon"
+          @tap="$refs.popup_info.open()"
+        ></image>
+        <view class="invite-title">邀请好友累计获得</view>
+        <view class="invite-number"
+          >{{
+            !info || !info.unit || info.unit === "¥" || info.unit === "元"
+              ? "&yen;"
+              : ""
+          }}
+          <text class="big">{{ info.total_price || 0 }}</text>
+          {{
+            info && info.unit && info.unit !== "¥" && info.unit !== "元"
+              ? info.unit
+              : ""
+          }}</view
+        >
+        <button
+          v-if="userInfo && userInfo.id"
+          open-type="share"
+          class="invite-button"
+        >
+          去邀请
+        </button>
+        <button v-else class="invite-button" @click="handleLogin">
+          去邀请
+        </button>
+      </view>
+    </view>
+    <image class="invite-header-mask" src="@/static/my/mask-gray.png"></image>
+    <view class="invite-main">
+      <view class="invite-labels">
+        <view class="invite-label">
+          <text class="invite-label-title">{{ info.count || 0 }}</text>
+          <text class="invite-label-desc">邀请人数</text>
+        </view>
+        <view class="invite-label">
+          <text class="invite-label-title"
+            >{{ info.rate || 0 }}{{ info.rate_unit || "%" }}</text
+          >
+          <text class="invite-label-desc">奖励比例</text>
+        </view>
+      </view>
+      <view class="invite-list">
+        <text class="invite-list-title">邀请记录</text>
+        <view class="invite-list-item">
+          <view class="invite-list-name gray">用户</view>
+          <view class="invite-list-price gray">奖励(金额)</view>
+          <view class="invite-list-time gray">时间</view>
+        </view>
+        <template v-if="Array.isArray(info.records)">
+          <view
+            v-for="item in info.records"
+            :key="item.id"
+            class="invite-list-item"
+          >
+            <view class="invite-list-name">
+              <image class="avatar" :src="item.img"></image>
+              <text class="name">{{ item.name }}</text>
+            </view>
+            <view class="invite-list-price"
+              >{{ item.price }}{{ item.unit }}</view
+            >
+            <view class="invite-list-time">{{ item.date }}</view>
+          </view>
+        </template>
+      </view>
+    </view>
+    <uni-popup
+      ref="popup_info"
+      type="center"
+      mask-background-color="rgba(0,0,0,0.8)"
+      :is-mask-click="true"
+    >
+      <view class="popup-wrap">
+        <view class="popup-content">
+          <view class="h1"><text>邀请好友规则</text></view>
+          <view class="p" v-html="info.rule || ''"></view>
+        </view>
+        <image
+          class="popup_close"
+          src="@/static/icon/icon-close.png"
+          @click="$refs.popup_info.close()"
+        ></image>
+      </view>
+    </uni-popup>
+  </view>
+</template>
+
+<script>
+import login from "@/lib/utils/login";
+import api from "@/lib/api/api";
+export default {
+  name: "PageMyInvite",
+  data() {
+    return {
+      userInfo: {},
+      info: {},
+    };
+  },
+  onShow() {
+    const uinfoStr = uni.getStorageSync("userinfo");
+    if (uinfoStr) {
+      this.userInfo = JSON.parse(uinfoStr);
+      this.initData();
+    } else {
+      this.userInfo = {};
+    }
+  },
+  onShareAppMessage() {
+    return {
+      title: "@你,0元抽爆款+优惠券立减,快来和我一起抽福袋啦",
+      imageUrl:
+        "https://chujianchaowan.oss-cn-beijing.aliyuncs.com/images/0249cbaf35f9176ceb2a6ab5f8c30dd9.jpeg",
+      path: "/pages/index/index?fuid=" + this.userInfo.id,
+    };
+  },
+  onShareTimeline() {
+    return {
+      title: "@你,0元抽爆款+优惠券立减,快来和我一起抽福袋啦",
+      imageUrl:
+        "https://chujianchaowan.oss-cn-beijing.aliyuncs.com/images/0249cbaf35f9176ceb2a6ab5f8c30dd9.jpeg",
+      path: "/pages/index/index?fuid=" + this.userInfo.id,
+    };
+  },
+  methods: {
+    handleLogin() {
+      login.wxLogin((userInfo) => {
+        this.userInfo = userInfo;
+        uni.showToast({
+          icon: "none",
+          title: "登录成功",
+          duration: 3000,
+        });
+      });
+    },
+    async initData() {
+      uni.showLoading({
+        title: "加载中",
+        mask: true,
+      });
+      try {
+        const data = await api.getFriendsList(this.userInfo.session);
+
+        if (data.errno === 10000) {
+          this.info = data.data;
+        } else {
+          throw new Error(data.errmsg);
+        }
+      } catch (e) {
+        uni.showToast({
+          icon: "none",
+          title: e.message || "请求失败,请重试",
+          duration: 2e3,
+        });
+      }
+      uni.hideLoading();
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+.invite {
+  background: #f5f5f5;
+  position: relative;
+  min-height: 100vh;
+  .invite-header-wrap {
+    position: sticky;
+    top: 0;
+    box-sizing: border-box;
+    width: 100%;
+    overflow: hidden;
+    padding: 58rpx 24rpx 0;
+    z-index: 0;
+    background: url(https://chujianchaowan.oss-cn-beijing.aliyuncs.com/images/2c14ce56792dc98f0e7e2fcf646eb127.png)
+      no-repeat center top;
+    background-size: cover;
+
+    .bg {
+      position: absolute;
+      left: 0;
+      top: -100rpx;
+      width: 100%;
+      pointer-events: none;
+    }
+    .invite-header {
+      background: #ffffff;
+      border-radius: 8rpx;
+      padding: 24rpx 24rpx 34rpx;
+      position: relative;
+      text-align: center;
+      font-weight: 500;
+      color: #292d3b;
+      .invite-icon {
+        position: absolute;
+        width: 36rpx;
+        height: 36rpx;
+        right: 24rpx;
+        top: 24rpx;
+        cursor: pointer;
+      }
+      .invite-title {
+        font-size: 28rpx;
+        line-height: 40rpx;
+        margin-bottom: 24rpx;
+      }
+      .invite-number {
+        font-size: 36rpx;
+        line-height: 66rpx;
+        .big {
+          font-size: 48rpx;
+          // font-family: unidreamledregular, Helvetica Neue, Helvetica, Arial,
+          //   Hiragino Sans GB, Hiragino Sans GB W3, Microsoft YaHei UI,
+          //   Microsoft YaHei, WenQuanYi Micro Hei, sans-serif;
+        }
+      }
+      .invite-button {
+        width: 100%;
+        height: 96rpx;
+        line-height: 96rpx;
+        background: #08c2c3;
+        border-radius: 0;
+        margin-top: 24rpx;
+        font-size: 32rpx;
+        font-weight: 500;
+        color: #292d3b;
+        border-radius: 8rpx;
+        &::after {
+          display: none;
+        }
+      }
+    }
+  }
+  .invite-header-mask {
+    width: 100%;
+    position: relative;
+    margin-top: -29rpx;
+    height: 39rpx;
+    display: block;
+    pointer-events: none;
+  }
+  .invite-main {
+    background: #f5f5f5;
+    position: relative;
+    z-index: 10;
+    padding: 14rpx 24rpx 24rpx;
+  }
+  .invite-labels {
+    display: flex;
+    background: #fff;
+    font-weight: 500;
+    text-align: center;
+    padding: 32rpx 0;
+    margin-bottom: 20rpx;
+    border-radius: 8rpx;
+    .invite-label {
+      width: 50%;
+      flex: 1;
+      .invite-label-title {
+        display: block;
+        height: 66rpx;
+        font-size: 48rpx;
+        color: #292d3b;
+        line-height: 66rpx;
+      }
+      .invite-label-desc {
+        margin-top: 6rpx;
+        height: 40rpx;
+        font-size: 28rpx;
+        color: #9496a5;
+        line-height: 40rpx;
+      }
+    }
+  }
+  .invite-list {
+    padding: 32rpx 24rpx;
+    background: #fff;
+    margin: 20rpx 0;
+    text-align: center;
+    font-weight: 500;
+    color: #292d3b;
+    border-radius: 8rpx;
+    .invite-list-title {
+      display: block;
+      height: 44rpx;
+      font-size: 32rpx;
+      line-height: 44rpx;
+      margin-bottom: 32rpx;
+      color: #292d3b;
+    }
+
+    .invite-list-title + .invite-list-item {
+      margin-bottom: 30rpx !important;
+    }
+    .invite-list-item {
+      display: flex;
+      font-size: 28rpx;
+      font-weight: 500;
+      line-height: 40rpx;
+      margin-bottom: 40rpx;
+      align-items: center;
+
+      &:last-child {
+        margin-bottom: 0;
+      }
+      .gray {
+        color: #9496a5;
+      }
+      .invite-list-price {
+        width: 20%;
+      }
+      .invite-list-name,
+      .invite-list-time {
+        width: 40%;
+      }
+      .avatar {
+        width: 40rpx;
+        height: 40rpx;
+        display: block;
+        margin-right: 6rpx;
+        border-radius: 100%;
+      }
+      .invite-list-name {
+        text-align: left;
+        display: flex;
+        align-items: center;
+        .name {
+          display: block;
+          width: 0%;
+          flex: 1;
+          overflow: hidden;
+          white-space: nowrap;
+          text-overflow: ellipsis;
+        }
+      }
+      .invite-list-time {
+        text-align: right;
+      }
+    }
+  }
+}
+</style>

+ 200 - 0
src/pages/my/messages.vue

@@ -0,0 +1,200 @@
+<template>
+  <view class="messages">
+    <template v-if="messages.length">
+      <view
+        v-for="item in messages"
+        :key="item.id"
+        :class="['msg-item', { 'msg-item-read': item.status }]"
+        @click="handleReadMessage(item)"
+      >
+        <view class="msg-img"></view>
+        <view class="msg-body">
+          <view class="msg-head">
+            <view class="msg-title">{{ item.title }}</view>
+            <view class="msg-time">{{ item.create_time }}</view>
+          </view>
+          <view class="msg-desc">{{ item.content }}</view>
+        </view>
+      </view>
+    </template>
+    <view v-else-if="!loading" class="nomessage">暂无消息通知</view>
+  </view>
+</template>
+
+<script>
+import api from "@/lib/api/api";
+import jumpToUrl from "@/lib/utils/jumpToUrl";
+
+export default {
+  name: "PageMyMessages",
+  data() {
+    return {
+      loading: true,
+      hasMore: true,
+      page: 1,
+      userInfo: null,
+      messages: [],
+    };
+  },
+  onShow() {
+    const uinfoStr = uni.getStorageSync("userinfo");
+    if (uinfoStr) {
+      this.userInfo = JSON.parse(uinfoStr);
+      this.getMessage();
+    } else {
+      this.userInfo = null;
+    }
+  },
+
+  onPullDownRefresh() {
+    if (!this.userInfo) {
+      uni.stopPullDownRefresh(); //得到数据后停止下拉刷新
+      return;
+    }
+
+    this.getMessage()
+      .then(() => {
+        uni.stopPullDownRefresh();
+      })
+      .catch(() => {
+        uni.stopPullDownRefresh();
+      });
+  },
+  onReachBottom() {
+    if (!this.loading && this.hasMore && this.userInfo) {
+      this.getMessage(this.page + 1);
+    }
+  },
+  methods: {
+    async getMessage(page = 1) {
+      this.loading = true;
+      try {
+        const data = await api.getMessage(this.page, this.userInfo.session);
+        this.page = page;
+        if (page === 1) {
+          this.messages = data.data;
+        } else {
+          this.messages = [...this.messages, ...data.data];
+        }
+        this.hasMore = data.data.length > 0;
+      } catch (e) {}
+      this.loading = false;
+    },
+    async handleReadMessage(item) {
+      if (!item.status) {
+        uni.showLoading({
+          title: "加载中",
+          mask: true,
+        });
+        await api
+          .readMessage({
+            id: `${item.id}`,
+            session: this.userInfo.session,
+          })
+          .catch((e) => {
+            console.log(e);
+          });
+        uni.hideLoading();
+      }
+      this.handleJump(item.url);
+    },
+    handleJump(url) {
+      jumpToUrl(url);
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+.messages {
+  padding: 25rpx 30rpx 60rpx;
+  .msg-item {
+    display: flex;
+    border-bottom: 2rpx solid #eeeeee;
+    padding: 30rpx 0;
+    align-items: center;
+    .msg-img {
+      width: 82rpx;
+      height: 82rpx;
+      margin-right: 24rpx;
+      border-radius: 82rpx;
+      background: url(@/static/message/icon-unread.png) no-repeat center;
+      background-size: cover;
+      position: relative;
+      &::after {
+        content: "";
+        box-sizing: border-box;
+        width: 24rpx;
+        height: 24rpx;
+        border-radius: 24rpx;
+        background: #eb5757;
+        border: 2rpx solid #ffffff;
+        position: absolute;
+        right: -4rpx;
+        top: -2rpx;
+      }
+    }
+    .msg-body {
+      width: 0;
+      flex: 1;
+      .msg-head {
+        display: flex;
+        align-items: center;
+        white-space: nowrap;
+        .msg-title {
+          width: 0;
+          flex: 1;
+          height: 42rpx;
+          font-size: 30rpx;
+          font-weight: 600;
+          color: #222;
+          line-height: 42rpx;
+          overflow: hidden;
+          white-space: nowrap;
+          text-overflow: ellipsis;
+        }
+        .msg-time {
+          height: 34rpx;
+          font-size: 24rpx;
+          color: #888;
+          line-height: 34rpx;
+        }
+      }
+      .msg-desc {
+        margin-top: 6rpx;
+        width: 100%;
+        height: 36rpx;
+        font-size: 26rpx;
+        color: #888;
+        line-height: 36rpx;
+        overflow: hidden;
+        white-space: nowrap;
+        text-overflow: ellipsis;
+      }
+    }
+
+    &.msg-item-read {
+      .msg-img {
+        background-image: url(@/static/message/icon-read.png);
+        &::after {
+          display: none;
+        }
+      }
+
+      .msg-body {
+        .msg-head {
+          .msg-title {
+            color: #888;
+          }
+        }
+      }
+    }
+  }
+  .nomessage {
+    padding: 300rpx 0 0;
+    text-align: center;
+    font-size: 28rpx;
+    color: #888;
+  }
+}
+</style>

+ 425 - 0
src/pages/my/my.vue

@@ -0,0 +1,425 @@
+<template>
+  <view class="profile">
+    <view class="user-header">
+      <view v-if="userInfo.show_id && userInfo.session" class="user-box">
+        <image class="avatar" :src="userInfo.avatar" mode=""></image>
+        <view class="user-body">
+          <text class="user-name">
+            {{ userInfo.nickname }}
+          </text>
+          <text class="user-id" @click="handleCopyId"
+            >ID: {{ userInfo.show_id }} <text class="copy">复制</text></text
+          >
+        </view>
+        <button class="user-btn" @tap="logout">退出登录</button>
+      </view>
+      <view v-else class="user-box">
+        <image class="avatar" src="@/static/my/userimg.png" mode=""></image>
+        <button class="user-btn" @tap="onLoginTap">点击登录</button>
+      </view>
+      <view class="my-balance">
+        <view class="my-balance-item" @click="jump('../task/index')">
+          <view class="num">{{ userInfo.score ? userInfo.score : "0" }}</view>
+          <view class="label">任务积分</view>
+        </view>
+        <view class="my-balance-item" @click="jump('./coupon')">
+          <view class="num">{{
+            userInfo.coupon_count ? userInfo.coupon_count : "0"
+          }}</view>
+          <view class="label">红包卡券</view>
+        </view>
+      </view>
+      <view class="my-balance-bar">
+        <view class="my-balance-text">
+          余额:&yen;<text class="big">{{
+            userInfo.show_price ? userInfo.show_price : "0.00"
+          }}</text>
+        </view>
+        <button class="my-balance-btn" @click="jump('./recharge')">
+          去充值
+        </button>
+      </view>
+    </view>
+    <view class="my-main">
+      <view class="my-title">
+        <text>我的订单</text>
+        <view class="my-title-sub" @click="jump('../order/order?tabIndex=1')">
+          <text>全部订单</text>
+          <image class="icon-more" src="@/static/my/icon-more.png"></image>
+        </view>
+      </view>
+      <view class="my-icon-list">
+        <view
+          v-for="item in datas"
+          :key="item.name"
+          class="my-icon-item"
+          @click="jump(item.url)"
+        >
+          <image class="my-icon" :src="item.image"></image>
+          {{ item.name }}
+        </view>
+      </view>
+      <view class="my-title">其他功能</view>
+      <view class="my-icon-list">
+        <view
+          v-for="item in datas1"
+          :key="item.name"
+          class="my-icon-item"
+          @click="jump(item.url)"
+        >
+          <image class="my-icon" :src="item.image"></image>
+          <view
+            v-if="item.showTip && Number(userInfo.unread_count || '0') > 0"
+            class="my-tip"
+          ></view>
+          {{ item.name }}
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+import login from "@/lib/utils/login";
+import api from "@/lib/api/api";
+
+export default {
+  name: "PageMy",
+  data() {
+    return {
+      testInt: 1,
+      rechargeList: [
+        {
+          text: "充300元",
+          num: 300,
+          type: 1,
+          getNum: "得310元",
+        },
+        {
+          text: "充500元",
+          num: 500,
+          type: 1,
+          getNum: "得520元",
+        },
+        {
+          text: "充1000元",
+          num: 1000,
+          type: 1,
+          getNum: "得1050元",
+        },
+      ],
+      userInfo: {},
+      datas: [
+        {
+          name: "寄存盒柜",
+          image: "../../static/my/icon-box.png",
+          url: "../order/unsend",
+        },
+        {
+          name: "待发货",
+          image: "../../static/my/icon-waiting.png",
+          url: "../order/sended",
+        },
+        {
+          name: "待收货",
+          image: "../../static/my/icon-shipped.png",
+          url: "../order/sended",
+        },
+        {
+          name: "已完成",
+          image: "../../static/my/icon-finished.png",
+          url: "../order/sended",
+        },
+      ],
+      datas1: [
+        {
+          name: "邀请好友",
+          image: "../../static/my/icon-friend.png",
+          url: "./invite",
+        },
+        {
+          name: "收货地址",
+          image: "../../static/my/icon-address.png",
+          url: "../address/address",
+        },
+        {
+          name: "我的客服",
+          image: "../../static/my/icon-service.png",
+          url: "../help/help_contact",
+        },
+        // {
+        //   name: "消息中心",
+        //   image: "../../static/my/icon-message.png",
+        //   url: "./messages",
+        //   showTip: true,
+        // },
+        {
+          name: "帮助中心",
+          image: "../../static/my/icon-help.png",
+          url: "../help/help",
+        },
+      ],
+    };
+  },
+  onShow() {
+    const uinfoStr = uni.getStorageSync("userinfo");
+    if (uinfoStr) {
+      this.userInfo = JSON.parse(uinfoStr);
+      this.getUserInfo();
+    } else {
+      this.userInfo = {};
+    }
+  },
+  onPullDownRefresh() {
+    if (JSON.stringify(this.userInfo) == "{}") {
+      uni.stopPullDownRefresh(); //得到数据后停止下拉刷新
+      return;
+    }
+    this.getUserInfo();
+  },
+  methods: {
+    //获取个人信息
+    getUserInfo() {
+      api
+        .userInfo(this.userInfo.session)
+        .then((data) => {
+          this.userInfo = { ...this.userInfo, ...data.data };
+          uni.setStorageSync("userinfo", JSON.stringify(this.userInfo));
+          uni.stopPullDownRefresh(); //得到数据后停止下拉刷新
+        })
+        .catch((e) => {
+          console.error(e);
+        });
+    },
+    logout() {
+      login.logout();
+      this.userInfo = {};
+    },
+    // 获取用户头像和昵称
+    onLoginTap() {
+      return new Promise((resolve, reject) => {
+        login.wxLogin((userInfo) => {
+          if (userInfo.session) {
+            this.userInfo = userInfo;
+            this.getUserInfo();
+            if (userInfo.coupons && userInfo.coupons.is_bind_coupon === 1) {
+              uni.showToast({
+                icon: "none",
+                title: userInfo.coupons.is_bind_info || "登录成功~",
+                duration: 2e3,
+                mask: true,
+              });
+              setTimeout(() => {
+                resolve();
+              }, 2000);
+            } else {
+              resolve();
+            }
+          } else reject();
+        });
+      });
+    },
+    async jump(url) {
+      try {
+        if (!this.userInfo.session) {
+          uni.showToast({
+            title: "请先登录",
+            icon: "none",
+          });
+          await this.onLoginTap();
+        }
+
+        uni.navigateTo({
+          url: url,
+        });
+      } catch (e) {}
+    },
+
+    handleCopyId() {
+      uni.setClipboardData({
+        data: this.userInfo.show_id,
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+.profile {
+  width: 100%;
+  padding: 0;
+  .user-header {
+    background-color: #f7f6fb;
+    box-sizing: border-box;
+    width: 100%;
+    overflow: hidden;
+    position: relative;
+    overflow: hidden;
+    padding: 30rpx 30rpx 0;
+  }
+  .user-box {
+    display: flex;
+    align-items: center;
+    .avatar {
+      width: 96rpx;
+      height: 96rpx;
+      margin-right: 18rpx;
+      border-radius: 100%;
+    }
+    .user-btn {
+      min-width: 160rpx;
+      height: 56rpx;
+      line-height: 56rpx;
+      border-radius: 56rpx;
+      margin: 0;
+      font-size: 28rpx;
+      color: #000000;
+      padding: 0 24rpx;
+      background: transparent;
+      &::after {
+        border-radius: 56rpx;
+        border-color: #000000;
+      }
+    }
+    .user-body {
+      flex: 1;
+      margin-right: 18rpx;
+      .user-name,
+      .user-id {
+        display: block;
+        height: 44rpx;
+        font-size: 32rpx;
+        font-weight: 500;
+        color: #292d3b;
+        line-height: 44rpx;
+        width: 100%;
+        overflow: hidden;
+        white-space: nowrap;
+        text-overflow: ellipsis;
+      }
+      .user-id {
+        font-size: 24rpx;
+        color: #9496a5;
+        line-height: 34rpx;
+      }
+      .copy {
+        margin-left: 20rpx;
+        color: #08c2c3;
+      }
+    }
+  }
+  .my-balance {
+    display: flex;
+    text-align: center;
+    margin: 36rpx 0 32rpx;
+    .my-balance-item {
+      width: 0;
+      flex: 1;
+      .num {
+        height: 52rpx;
+        font-size: 44rpx;
+        font-weight: bold;
+        color: #222222;
+        line-height: 52rpx;
+      }
+      .label {
+        height: 36rpx;
+        font-size: 26rpx;
+        color: #888888;
+        line-height: 30rpx;
+        margin-top: 2rpx;
+      }
+    }
+  }
+  .my-balance-bar {
+    height: 96rpx;
+    background: #313341;
+    display: flex;
+    align-items: center;
+    padding: 0 32rpx;
+
+    font-size: 28rpx;
+    color: #ffffff;
+    .my-balance-text {
+      flex: 1;
+      width: 0;
+      .big {
+        font-size: 46rpx;
+        font-weight: bold;
+        color: #ffffff;
+      }
+    }
+    .my-balance-btn {
+      height: 56rpx;
+      line-height: 56rpx;
+      background: #4efbff;
+      padding: 0 20rpx;
+      font-size: 30rpx;
+      color: #000000;
+      border-radius: 0;
+      font-weight: 500;
+      &::after {
+        display: none;
+      }
+    }
+  }
+  .my-main {
+    padding: 42rpx 30rpx;
+    background: #fff;
+    .my-title {
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      height: 48rpx;
+      font-size: 34rpx;
+      font-weight: 600;
+      color: #222222;
+    }
+    .my-title-sub {
+      font-size: 26rpx;
+      font-weight: 400;
+      color: #555555;
+      display: flex;
+      align-items: center;
+      .icon-more {
+        width: 20rpx;
+        height: 20rpx;
+        margin-left: 6rpx;
+      }
+    }
+  }
+  .my-icon-list {
+    display: flex;
+    text-align: center;
+    padding: 23rpx 0;
+    margin-bottom: 86rpx-48rpx-25rpx;
+    flex-wrap: wrap;
+    .my-icon-item {
+      width: 25%;
+      font-size: 24rpx;
+      color: #555555;
+      line-height: 28rpx;
+      margin: 25rpx 0;
+      position: relative;
+      .my-icon {
+        display: block;
+        width: 52rpx;
+        height: 52rpx;
+        margin: 0 auto 12rpx;
+      }
+      .my-tip {
+        position: absolute;
+        box-sizing: border-box;
+        width: 22rpx;
+        height: 22rpx;
+        border-radius: 22rpx;
+        background: #eb5757;
+        border: 2rpx solid #ffffff;
+        top: -4rpx;
+        left: 50%;
+        margin-left: 14rpx;
+      }
+    }
+  }
+}
+</style>

+ 456 - 0
src/pages/my/recharge.vue

@@ -0,0 +1,456 @@
+<template>
+  <view class="recharge">
+    <view class="rec-box">
+      <view class="rec-title">我的余额</view>
+      <view class="rec-balance"
+        >&yen;{{
+          userInfo.show_price && Number(userInfo.show_price)
+            ? userInfo.show_price
+            : "0.00"
+        }}</view
+      >
+      <view class="rec-desc"
+        >余额可用于抽赏交易等功能。充值可以给您带来更好的产品体验</view
+      >
+    </view>
+    <view class="rec-box">
+      <view class="rec-title">充值</view>
+      <view class="rec-list">
+        <view
+          v-for="(item, idx) in rechargeList"
+          :key="item.num"
+          :class="['rec-item', { 'rec-item-selected': idx === selected }]"
+          @click="
+            selected = idx;
+            inputValue = '';
+          "
+        >
+          <view class="rec-money">{{ item.text }}</view>
+          <view class="rec-label">{{ item.getNum }}</view>
+        </view>
+      </view>
+      <view class="rec-input">
+        <view class="rec-input-label">&yen;</view>
+        <input
+          v-model="inputValue"
+          type="digit"
+          placeholder="请输入自定义充值金额"
+          @focus="selected = -1"
+        />
+      </view>
+      <button class="rec-btn" @click="handlePay">立即充值</button>
+    </view>
+  </view>
+</template>
+
+<script>
+import login from "@/lib/utils/login";
+import api from "@/lib/api/api";
+
+export default {
+  name: "PageMyRecharge",
+  data() {
+    return {
+      testInt: 1,
+      selected: -1,
+      rechargeList: [
+        {
+          text: "充200",
+          num: 200,
+          type: 1,
+          getNum: "得205",
+        },
+        {
+          text: "充300",
+          num: 300,
+          type: 1,
+          getNum: "得310",
+        },
+        {
+          text: "充500",
+          num: 500,
+          type: 1,
+          getNum: "得520",
+        },
+        {
+          text: "充1000",
+          num: 1000,
+          type: 1,
+          getNum: "得1050",
+        },
+      ],
+      userInfo: {},
+      inputValue: "",
+    };
+  },
+  watch: {
+    inputValue(newValue) {
+      if (newValue.trim() === "") {
+        return;
+      }
+
+      if (isNaN(Number(newValue))) {
+        let str = newValue;
+        const dot = newValue.match(/\./g);
+        if (dot && dot.length > 1) {
+          const arr = newValue.split(".");
+          arr.length = 2;
+          str = arr.join(".");
+        }
+
+        if (isNaN(str) && !isNaN(parseFloat(str))) {
+          str = `${parseFloat(str)}`;
+        }
+
+        if (!isNaN(str)) {
+          this.$nextTick(() => {
+            this.inputValue = `${Number(Number(str).toFixed(2))}`;
+          });
+        }
+        return;
+      }
+
+      if (/\.$/.test(newValue) || /\.0+$/.test(newValue)) {
+        return;
+      }
+
+      this.$nextTick(() => {
+        this.inputValue = `${Number(Number(newValue).toFixed(2))}`;
+      });
+    },
+  },
+  onShow() {
+    const uinfoStr = uni.getStorageSync("userinfo");
+    if (uinfoStr) {
+      this.userInfo = JSON.parse(uinfoStr);
+      this.getUserInfo();
+    } else {
+      this.userInfo = {};
+    }
+  },
+  onPullDownRefresh() {
+    if (JSON.stringify(this.userInfo) == "{}") {
+      uni.stopPullDownRefresh(); //得到数据后停止下拉刷新
+      return;
+    }
+    this.getUserInfo();
+  },
+  methods: {
+    //获取个人信息
+    getUserInfo() {
+      api
+        .userInfo(this.userInfo.session)
+        .then((data) => {
+          this.userInfo.show_price = data.data.show_price;
+          this.userInfo.balance_info = data.data.balance_info;
+          uni.setStorageSync("userinfo", JSON.stringify(this.userInfo));
+          uni.stopPullDownRefresh(); //得到数据后停止下拉刷新
+        })
+        .catch((e) => {
+          console.error(e);
+        });
+    },
+    handlePay() {
+      if (this.selected !== -1 && this.rechargeList[this.selected]) {
+        return this.activeChange(this.rechargeList[this.selected].num);
+      }
+      if (this.inputValue) {
+        if (!isNaN(Number(this.inputValue)) && Number(this.inputValue) >= 1) {
+          return this.activeChange(this.inputValue);
+        }
+        if (isNaN(Number(this.inputValue))) {
+          uni.showToast({
+            title: "请输入正确的金额",
+            icon: "none",
+          });
+        } else {
+          uni.showToast({
+            title: "充值金额不得小于1元",
+            icon: "none",
+          });
+        }
+        return;
+      }
+      uni.showToast({
+        title: "请先登录",
+        icon: "none",
+      });
+    },
+    async activeChange(num) {
+      if (JSON.stringify(this.userInfo) == "{}") {
+        uni.showToast({
+          title: "请先登录",
+          icon: "none",
+        });
+        await this.login();
+      }
+
+      // 微信充值
+      uni.showToast({
+        title: "充值中",
+        icon: "loading",
+        mask: true,
+        duration: 10e3,
+      });
+
+      try {
+        const data = await api.getPrepay({
+          session: this.userInfo.session,
+          amount: "" + num,
+        });
+
+        uni.hideToast();
+        uni.requestPayment({
+          provider: "wxpay",
+          timeStamp: data.data.timeStamp,
+          nonceStr: data.data.nonceStr,
+          package: data.data.package,
+          signType: data.data.signType,
+          paySign: data.data.paySign,
+          success: (res) => {
+            if (res.errMsg === "requestPayment:ok") {
+              this.getPrepaySucceed(data.data.order_id);
+            }
+          },
+          fail: (err) => {
+            if (err.errMsg === "requestPayment:fail cancel") {
+              this.getPrepayStatus("3", data.data.order_id);
+            } else {
+              this.getPrepayStatus("2", data.data.order_id);
+            }
+          },
+        });
+      } catch (e) {}
+    },
+    getPrepayStatus(type, id) {
+      const params = {
+        session: this.userInfo.session,
+        order_id: "" + id,
+        type: "" + type,
+      };
+      return api
+        .getPrepayStatus(params)
+        .then(() => {
+          uni.showToast({
+            title: type == "3" ? "取消支付" : "支付失败",
+            icon: "error",
+            mask: true,
+            duration: 2e3,
+          });
+        })
+        .catch((e) => {
+          console.log(e);
+        });
+    },
+    getPrepaySucceed(id) {
+      let timer;
+      api
+        .getPrepaySucceed({
+          session: this.userInfo.session,
+          order_id: "" + id,
+          times: "" + this.testInt++,
+        })
+        .then((data) => {
+          if (data.errno == 90000) {
+            if (this.queryPayIng) {
+              this.queryPayIng = false;
+              uni.showLoading({
+                title: "加载中",
+                mask: true,
+              });
+            }
+            timer = setTimeout(() => {
+              this.getPrepaySucceed(id);
+            }, 1000);
+          } else if (data.errno == 10000) {
+            this.queryPayIng = true;
+            uni.hideLoading();
+            uni.showToast({
+              title: "支付成功",
+              icon: "success",
+              mask: true,
+              duration: 2e3,
+            });
+            if (data.data.status == 2) {
+              this.getUserInfo();
+            }
+            clearTimeout(timer); //清理定时任务
+          } else {
+            this.queryPayIng = true;
+            uni.hideLoading();
+            uni.showToast({
+              title: "订单查询失败",
+              icon: "error",
+              mask: true,
+              duration: 2e3,
+            });
+            clearTimeout(timer); //清理定时任务
+          }
+        })
+        .catch(() => {
+          this.queryPayIng = true;
+          uni.hideLoading();
+          clearTimeout(timer); //清理定时任务
+        });
+    },
+    // 获取用户头像和昵称
+    login() {
+      return new Promise((resolve, reject) => {
+        login.wxLogin((userInfo) => {
+          if (userInfo.session) {
+            this.userInfo = userInfo;
+            if (userInfo.coupons && userInfo.coupons.is_bind_coupon === 1) {
+              uni.showToast({
+                icon: "none",
+                title: userInfo.coupons.is_bind_info || "登录成功~",
+                duration: 2e3,
+                mask: true,
+              });
+              setTimeout(() => {
+                resolve();
+              }, 2000);
+            } else {
+              resolve();
+            }
+          } else reject();
+        });
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+.recharge {
+  padding: 20rpx 30rpx;
+  min-height: 100vh;
+  background: #f6f6f6;
+  box-sizing: border-box;
+  .rec-box {
+    margin-bottom: 20rpx;
+    padding: 34rpx 30rpx 36rpx;
+    background: #fff;
+  }
+  .rec-title {
+    margin-bottom: 22rpx;
+    font-size: 34rpx;
+    font-weight: 600;
+    color: #222222;
+    line-height: 48rpx;
+  }
+  .rec-balance {
+    height: 80rpx;
+    font-size: 68rpx;
+    font-weight: bold;
+    color: #222222;
+    line-height: 80rpx;
+    text-align: center;
+  }
+  .rec-desc {
+    width: 520rpx;
+    font-size: 24rpx;
+    color: #888888;
+    line-height: 28rpx;
+    margin: 24rpx auto 0;
+    text-align: center;
+  }
+  .rec-list {
+    display: flex;
+    flex-wrap: wrap;
+    margin: 0 -10rpx;
+  }
+  .rec-item {
+    width: 304rpx;
+    height: 132rpx;
+    background: #fafafa;
+    border: 2rpx solid #dddddd;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    flex-direction: column;
+    margin: 10rpx;
+    .rec-money {
+      height: 48rpx;
+      font-size: 34rpx;
+      font-weight: 600;
+      color: #222222;
+      line-height: 48rpx;
+    }
+    .rec-label {
+      box-sizing: border-box;
+      min-width: 160rpx;
+      height: 38rpx;
+      overflow: hidden;
+      text-align: center;
+      background: #d0d0d0;
+      border-radius: 68rpx;
+      opacity: 1;
+      padding: 0 36rpx;
+      font-size: 24rpx;
+      font-weight: 400;
+      color: #ffffff;
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      margin-top: 8rpx;
+    }
+    &.rec-item-selected {
+      background: rgba(78, 251, 255, 0.1);
+      border-color: #27cacb;
+      .rec-money {
+        color: #08c2c3;
+      }
+      .rec-label {
+        background: #08c2c3;
+      }
+    }
+  }
+  .rec-input {
+    margin-top: 20rpx;
+    height: 94rpx;
+    display: flex;
+    border-bottom: 1rpx solid #dddddd;
+    .rec-input-label {
+      align-self: center;
+      font-size: 44rpx;
+      color: #222222;
+      line-height: 52rpx;
+      margin-right: 20rpx;
+    }
+    input {
+      display: block;
+      appearance: none;
+      height: 100%;
+      width: 0;
+      flex: 1;
+      font-size: 38rpx;
+      color: #222;
+      font-weight: bold;
+      &::placeholder {
+        font-weight: normal;
+        color: #aaaaaa;
+      }
+    }
+  }
+  .rec-btn {
+    display: block;
+    width: 100%;
+    height: 96rpx;
+    background: url(@/static/my/icon-btn.png) no-repeat center;
+    background-size: 100% 100%;
+    border: 0 none;
+    margin-top: 42rpx;
+    font-size: 32rpx;
+    font-weight: 500;
+    color: #292d3b;
+    padding: 0;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+
+    &::after {
+      display: none;
+    }
+  }
+}
+</style>

+ 194 - 0
src/pages/my/wallet.vue

@@ -0,0 +1,194 @@
+<template>
+  <view
+    class="content"
+    :style="'height:' + (datas.length > 10 ? '' : '100vh') + ';'"
+  >
+    <view class="top">
+      <view class="top-image">
+        <image mode src="@/static/icon_v1/wdjbbj@3x.png"></image>
+      </view>
+      <view class="top-text">剩余可用金币</view>
+      <view class="top-text1">{{ coinAmount }}</view>
+    </view>
+    <view class="commodity">
+      <scroll-view class="scroll-Y" scroll-y="true">
+        <view v-for="(item, key) in datas" :key="key" class="commodity-list">
+          <view style="float: left; width: 521rpx; margin-left: 24rpx">
+            <view class="commodity-list_text">{{ "" + item.type + "" }}</view>
+            <view class="commodity-list_text1">{{
+              "订单编号:" + item.order_id + ""
+            }}</view>
+            <view class="commodity-list_text1">{{
+              "下单时间:" + item.invest_time + ""
+            }}</view>
+          </view>
+          <view style="float: left; width: 130rpx">
+            <view v-if="item.add_balance < 0" class="commodity-list_text2">{{
+              item.add_balance
+            }}</view>
+            <view v-else class="commodity-list_text2" style="color: #ff4b4b">
+              <text>+</text>{{ item.add_balance }}</view
+            >
+          </view>
+          <view v-if="key < datas.length - 1" class="option-border"></view>
+        </view>
+      </scroll-view>
+    </view>
+  </view>
+</template>
+
+<script>
+import api from "@/lib/api/api";
+
+export default {
+  name: "PageMyWallet",
+  data() {
+    return {
+      coinAmount: 0,
+      datas: [],
+      userInfo: {},
+    };
+  },
+  onShow() {
+    const t = uni.getMenuButtonBoundingClientRect();
+    this.top = t.top + 5 + "px";
+
+    const uinfoStr = uni.getStorageSync("userinfo");
+    if (uinfoStr) {
+      this.userInfo = JSON.parse(uinfoStr);
+      this.refresh();
+    } else {
+      this.userInfo = {};
+    }
+  },
+  methods: {
+    refresh() {
+      api
+        .balanceRecords(this.userInfo.session)
+        .then((data) => {
+          if (data.data) {
+            this.coinAmount = data.data.balance;
+            this.datas = data.data.relations;
+          }
+        })
+        .catch((e) => {
+          console.error(e);
+        });
+    },
+  },
+};
+</script>
+
+<style>
+image {
+  height: inherit;
+  width: inherit;
+}
+
+.content {
+  align-items: flex-start;
+  background: #f5f5f5;
+  display: flex;
+  flex-direction: column;
+  width: 750rpx;
+}
+
+.top {
+  background-color: #fff;
+  border-radius: 16rpx;
+  height: 186rpx;
+  margin-left: 24rpx;
+  margin-top: 24rpx;
+  width: 702rpx;
+}
+
+.top-image {
+  float: right;
+  height: 150rpx;
+  margin-top: 36rpx;
+  width: 150rpx;
+}
+
+.top-text {
+  color: #333;
+  float: left;
+  font-family: PingFangSC-Regular;
+  font-size: 26rpx;
+  margin-left: 24rpx;
+  margin-top: 32rpx;
+  width: 528rpx;
+}
+
+.top-text1 {
+  color: #ff4b4b;
+  float: left;
+  font-family: DINPro-Medium;
+  font-size: 66rpx;
+  height: 80rpx;
+  line-height: 80rpx;
+  margin-left: 24rpx;
+  margin-top: 16rpx;
+  width: 528rpx;
+}
+
+.commodity {
+  background-color: #fff;
+  border-radius: 24rpx;
+  margin-bottom: 42rpx;
+  margin-left: 24rpx;
+  margin-top: 24rpx;
+  overflow: auto;
+  width: 702rpx;
+}
+
+.commodity-list {
+  float: left;
+  height: 154rpx;
+  width: 702rpx;
+}
+
+.commodity-list_text {
+  color: #333;
+  font-size: 30rpx;
+  height: 35rpx;
+  left: 35rpx;
+  line-height: 35rpx;
+  margin-bottom: 16rpx;
+  margin-top: 24rpx;
+}
+
+.commodity-list_text1,
+.commodity-list_text {
+  float: left;
+  font-family: PingFangSC-Regular;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  width: 521rpx;
+}
+
+.commodity-list_text1 {
+  color: #999;
+  font-size: 26rpx;
+  height: 31rpx;
+  line-height: 31rpx;
+}
+
+.commodity-list_text2 {
+  color: #333;
+  float: left;
+  font-size: 30rpx;
+  height: 154rpx;
+  line-height: 154rpx;
+  text-align: center;
+  width: 150rpx;
+}
+
+.option-border {
+  background-color: #eee;
+  float: left;
+  height: 2rpx;
+  margin-left: 24rpx;
+  width: 678rpx;
+}
+</style>

+ 248 - 0
src/pages/order/order.vue

@@ -0,0 +1,248 @@
+<template>
+  <view class="tab-box">
+    <!--顶部导航栏-->
+    <view class="scroll-view_H">
+      <view
+        v-for="(tab, index) in datas"
+        :key="index"
+        class="scroll-view-item_H"
+        :class="navIndex == tab.tab ? 'activite' : ''"
+        @tap="checkIndex(tab.tab)"
+      >
+        {{ tab.show_tab }}
+      </view>
+    </view>
+
+    <!-- 内容 -->
+    <template v-for="(item, index) in list1.relations">
+      <view
+        v-if="list1.relations.length != 0 && navIndex == 1"
+        :key="index"
+        class="swiper_item"
+      >
+        <view class="text-price">
+          <view class="text-name">
+            {{ item.order_name }}
+          </view>
+          <view class="">
+            {{ item.pay_method }} &yen;{{ item.order_price }}
+          </view>
+        </view>
+        <view class="text-time">
+          <view class="">
+            {{ item.order_time }}
+          </view>
+          <view class="">
+            &yen;{{ item.single_price }} x {{ item.order_num }}
+          </view>
+        </view>
+      </view>
+    </template>
+    <template v-for="(item, index) in list2.relations">
+      <view
+        v-if="list2.relations.length != 0 && navIndex == 2"
+        :key="index"
+        class="swiper_item"
+      >
+        <view class="text-price">
+          <view class="text-name">
+            {{ item.show_type }}
+          </view>
+          <view class=""> &yen;{{ item.add_balance }} </view>
+        </view>
+        <view class="text-time">
+          <view class="">
+            {{ item.invest_time }}
+          </view>
+          <view class="">
+            {{ item.type == 2 ? "回血" : "回购" }} x {{ item.num }}
+          </view>
+        </view>
+      </view>
+    </template>
+    <template v-for="(item, index) in list3.relations">
+      <view
+        v-if="list3.relations.length != 0 && navIndex == 3"
+        :key="index"
+        class="swiper_item"
+      >
+        <view class="text-price">
+          <view class="text-name">
+            {{ item.show_type }}
+          </view>
+          <view class=""> &yen;{{ item.add_balance }} </view>
+        </view>
+        <view class="text-time">
+          <view class="">
+            {{ item.invest_time }}
+          </view>
+        </view>
+      </view>
+    </template>
+    <view
+      v-if="list1.relations.length == 0 && navIndex == 1"
+      class="swiper_item1"
+      >暂无消费记录</view
+    >
+    <view
+      v-if="list2.relations.length == 0 && navIndex == 2"
+      class="swiper_item1"
+      >暂无消费记录</view
+    >
+    <view
+      v-if="list3.relations.length == 0 && navIndex == 3"
+      class="swiper_item1"
+      >暂无消费记录</view
+    >
+  </view>
+</template>
+
+<script>
+import api from "@/lib/api/api";
+export default {
+  name: "PageOrder",
+  data() {
+    return {
+      datas: [],
+      list1: [],
+      list2: [],
+      list3: [],
+      scrollTop: 0,
+      navIndex: 0,
+      userInfo: {},
+    };
+  },
+  onLoad(options) {
+    this.navIndex = options.tabIndex;
+    const uinfoStr = uni.getStorageSync("userinfo");
+    if (uinfoStr) {
+      this.userInfo = JSON.parse(uinfoStr);
+    } else {
+      uni.showToast({
+        title: "请先登录",
+        icon: "none",
+      });
+      return;
+    }
+  },
+  onShow() {
+    const uinfoStr = uni.getStorageSync("userinfo");
+    if (uinfoStr) {
+      this.userInfo = JSON.parse(uinfoStr);
+      api
+        .balanceRecords(this.userInfo.session)
+        .then((data) => {
+          if (data.data) {
+            this.datas = data.data.relations;
+            this.list1 = [];
+            this.list2 = [];
+            this.list3 = [];
+            for (let j = 0; j < this.datas.length; j++) {
+              if (this.datas[j].tab == 1) {
+                this.list1 = this.datas[j];
+              } else if (this.datas[j].tab == 2) {
+                this.list2 = this.datas[j];
+              } else if (this.datas[j].tab == 3) {
+                this.list3 = this.datas[j];
+              }
+            }
+          }
+        })
+        .catch((e) => {
+          console.error(e);
+        });
+    } else {
+      this.userInfo = {};
+      uni.showToast({
+        title: "请先登录",
+        icon: "none",
+      });
+      return;
+    }
+  },
+  methods: {
+    checkIndex(index) {
+      this.navIndex = index;
+    },
+    scroll: function (e) {
+      this.old.scrollTop = e.detail.scrollTop;
+    },
+    //滑动切换swiper
+    tabChange(e) {
+      const navIndex = e.detail.current;
+      this.navIndex = navIndex;
+    },
+  },
+};
+</script>
+
+<style scoped>
+.tab-box {
+  padding: 0 47rpx;
+}
+.activite {
+  font-family: PingFangSC-Medium, PingFang SC;
+  line-height: 48px;
+  font-size: 34rpx;
+  font-weight: 500;
+  color: #262626 !important;
+  border-bottom: 6rpx solid #262626;
+}
+
+.content {
+  height: 700px;
+}
+.swiper_item {
+  padding: 48rpx 0 38rpx 0;
+  border-bottom: 1px solid #e5e5e5;
+}
+.swiper_item1 {
+  text-align: center;
+  display: block;
+  margin: 100rpx auto;
+}
+.text-price {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+.text-name {
+  letter-spacing: 1rpx;
+  font-size: 32rpx;
+  font-weight: 400;
+  color: #262626;
+  width: 315rpx;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.text-time {
+  margin-top: 5rpx;
+  font-size: 24rpx;
+  font-weight: 400;
+  color: #333333;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+.scroll-view_H {
+  padding-top: 15rpx;
+  color: #cccccc;
+  background: #fff;
+  position: sticky;
+  top: 0;
+}
+
+.scroll-view-item_H {
+  display: inline-block;
+  margin-right: 30rpx;
+  padding-bottom: 10rpx;
+  width: 68rpx;
+  height: 48rpx;
+  text-align: center;
+  font-size: 32rpx;
+  font-weight: 400;
+  color: #b7b7b7;
+  line-height: 48rpx;
+}
+</style>

+ 387 - 0
src/pages/order/sended.vue

@@ -0,0 +1,387 @@
+<template>
+  <view class="content">
+    <view class="notice">
+      <view class="notice-img">
+        <image mode src="@/static/icon_v1/Notice1@2x.png"></image>
+      </view>
+      <text class="notice-text">{{ "" + notice + "" }}</text>
+    </view>
+    <!-- :style="'height:'+(item.relations.length>=2?'654rpx':'542rpx')+';'+'margin-bottom:'+(key==datas.length-1?'48rpx':'')+';'" -->
+    <view v-for="(item, key) in datas" :key="key" class="commodity">
+      <view class="commodity-text" style="margin-top: 24rpx">
+        <view style="float: left">申请发货时间:</view>
+        <text class="commodity-text1">{{ item.create_time }}</text>
+      </view>
+      <view class="commodity-text">
+        <view style="float: left">订单编号:</view>
+        <text class="commodity-text1">{{ item.order_num }}</text>
+        <view
+          style="float: right; font-size: 24rpx; color: #08c2c3"
+          @tap="doCopy(datas[key].order_num)"
+          >复制</view
+        >
+      </view>
+
+      <view class="commodity-text">
+        <view style="float: left">当前状态:</view>
+        <text class="commodity-text1">{{ item.status }}</text>
+      </view>
+      <view class="commodity-text">
+        <view style="float: left">物流公司:</view>
+        <text class="commodity-text1">{{
+          item.fare_company != "" ? item.fare_company : "无"
+        }}</text>
+      </view>
+      <view class="commodity-text">
+        <view style="float: left">物流单号:</view>
+        <text class="commodity-text1">{{
+          item.fare_no != "" ? item.fare_no : "无"
+        }}</text>
+        <view
+          v-if="item.fare_no"
+          style="float: right; font-size: 24rpx; color: #08c2c3"
+          @tap="doCopy(datas[key].fare_no)"
+          >复制</view
+        >
+      </view>
+      <view class="commodity-text-beizhu">
+        <view style="float: left">发货备注:</view>
+        <text class="commodity-text1-beizhu">{{
+          item.beizhu == "" ? "无" : item.beizhu
+        }}</text>
+      </view>
+      <view class="commodity-text">
+        <view style="float: left">支付运费:</view>
+        <text class="commodity-text1">{{ item.fare_price + "元" }}</text>
+      </view>
+      <view class="commodity-text" style="height: 80rpx">
+        <view style="float: left">发货地址:</view>
+        <text class="commodity-text2">{{ item.address }}</text>
+      </view>
+      <!-- :style="'height:'+(item.relations.length>=2?'273rpx':'136rpx')+';'" -->
+      <view class="commodity1">
+        <view
+          v-for="(item1, idx) in item.relations"
+          :key="idx"
+          class="commodity1-list"
+        >
+          <view class="commodity1-list_img">
+            <image mode :src="item1.img"></image>
+          </view>
+          <view class="commodity1-list_text">{{ item1.name }}</view>
+          <view class="commodity1-list_text1">{{ item1.num + "个" }}</view>
+          <view v-if="idx < datas.length - 1" class="option-border"></view>
+        </view>
+      </view>
+      <view v-if="item.status == 'xxx'" class="reun" @tap="cancel">
+        <image mode src="@/static/icon_v1/cancel@2x.png"></image>取消发货</view
+      >
+    </view>
+    <uni-popup ref="popup" type="center">
+      <view class="popup-overtime">
+        <view class="popup-overtime_img">
+          <image mode src="@/static/icon_v1/cg@3x.png"></image>
+        </view>
+        <view class="popup-overtime_text">确定取消发货吗?</view>
+        <view bindtap="e0" class="popup-overtime_left">取消</view>
+        <view bindtap="cancel1" class="popup-overtime_right">确定</view>
+      </view>
+    </uni-popup>
+  </view>
+</template>
+
+<script>
+import api from "@/lib/api/api";
+export default {
+  name: "PageOrderSended",
+  data() {
+    return {
+      mask: !1,
+      datas: [],
+      orderNo: "",
+      userInfo: {},
+      pages: {
+        page: 1,
+        size: 6,
+        total: 0,
+      },
+      notice: "",
+      status: {
+        isover: !1,
+        load: !1,
+      },
+    };
+  },
+
+  onLoad() {
+    //
+    const uinfoStr = uni.getStorageSync("userinfo");
+    if (uinfoStr) {
+      this.userInfo = JSON.parse(uinfoStr);
+      api
+        .sendList(this.userInfo.session)
+        .then((data) => {
+          if (data.data) {
+            this.datas = data.data;
+          }
+          this.notice = data.send_order_title;
+        })
+        .catch((e) => {
+          console.error(e);
+        });
+    } else {
+      uni.showToast({
+        title: "请先登录",
+        icon: "none",
+      });
+      return;
+    }
+  },
+  methods: {
+    doCopy(orderno) {
+      uni.setClipboardData({
+        data: orderno,
+      });
+    },
+  },
+};
+</script>
+
+<style>
+image {
+  height: inherit;
+  width: inherit;
+}
+
+.content {
+  align-items: flex-start;
+  background: #f5f5f5;
+  display: flex;
+  flex-direction: column;
+  min-height: 100vh;
+  overflow: auto;
+  width: 750rpx;
+}
+
+.notice {
+  background: #fff;
+  border-radius: 16rpx;
+  float: left;
+  margin-left: 24rpx;
+  margin-top: 24rpx;
+  padding-bottom: 10px;
+  width: 702rpx;
+  display: flex;
+  align-items: center;
+}
+
+.notice-img {
+  float: left;
+  height: 36rpx;
+  margin-left: 24rpx;
+  margin-right: 16rpx;
+  margin-top: 25rpx;
+  width: 36rpx;
+}
+
+.notice-text {
+  color: #08c2c3;
+  float: left;
+  font-family: PingFangSC-Regular;
+  font-size: 26rpx;
+  margin-top: 24rpx;
+  width: 602rpx;
+  line-height: 36rpx;
+}
+
+.commodity {
+  background-color: #fff;
+  border-radius: 24rpx;
+  float: left;
+  /* height: 678rpx; */
+  margin-left: 24rpx;
+  margin-top: 24rpx;
+  padding-bottom: 24rpx;
+  width: 702rpx;
+}
+
+.commodity-text {
+  color: #999;
+  float: left;
+  font-family: PingFangSC-Regular;
+  font-size: 28rpx;
+  height: 40rpx;
+  line-height: 40rpx;
+  margin-left: 28rpx;
+  margin-top: 8rpx;
+  width: 650rpx;
+}
+.commodity-text-beizhu {
+  color: #999;
+  float: left;
+  font-family: PingFangSC-Regular;
+  font-size: 28rpx;
+  margin-left: 28rpx;
+  margin-top: 8rpx;
+  width: 650rpx;
+}
+
+.commodity-text1 {
+  color: #333;
+  font-family: PingFangSC-Regular;
+  font-size: 28rpx;
+  height: 40rpx;
+  width: 400rpx;
+}
+.commodity-text1-beizhu {
+  display: inline-block;
+  color: #333;
+  font-family: PingFangSC-Regular;
+  font-size: 28rpx;
+  height: 40rpx;
+  width: 400rpx;
+}
+
+.commodity-text2 {
+  color: #333;
+  display: inline-block;
+  font-family: PingFangSC-Regular;
+  font-size: 28rpx;
+  height: 80rpx;
+  overflow: auto;
+  width: 510rpx;
+}
+
+.commodity1 {
+  background: #f8f8f8;
+  border-radius: 16rpx;
+  float: left;
+  /* height: 273rpx; */
+  margin-left: 24rpx;
+  margin-top: 24rpx;
+  /* overflow: auto; */
+  width: 654rpx;
+}
+
+.reun {
+  align-items: center;
+  color: #666;
+  display: flex;
+  flex-wrap: wrap;
+  float: left;
+  font-family: PingFangSC-Regular;
+  font-size: 26rpx;
+  height: 37rpx;
+  justify-content: center;
+  line-height: 27rpx;
+  margin-top: 24rpx;
+  text-align: center;
+  width: 705rpx;
+}
+
+.reun > image {
+  height: 28rpx;
+  margin-right: 8rpx;
+  width: 28rpx;
+}
+
+.commodity1-list {
+  float: left;
+  height: 136rpx;
+  width: 654rpx;
+}
+
+.commodity1-list_img {
+  border-radius: 8rpx;
+  float: left;
+  height: 88rpx;
+  margin-left: 24rpx;
+  margin-right: 16rpx;
+  margin-top: 24rpx;
+  overflow: hidden;
+  width: 88rpx;
+}
+
+.commodity1-list_text {
+  color: #333;
+  float: left;
+  font-family: PingFangSC-Regular;
+  font-size: 30rpx;
+  height: 37rpx;
+  margin-top: 32rpx;
+  width: 501rpx;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.commodity1-list_text1 {
+  color: #999;
+  float: left;
+  font-family: PingFangSC-Regular;
+  font-size: 26rpx;
+  height: 26rpx;
+  margin-top: 16rpx;
+  width: 501rpx;
+}
+
+.option-border {
+  background-color: #eee;
+  float: left;
+  height: 2rpx;
+  margin-left: 24rpx;
+  margin-top: 24rpx;
+  width: 630rpx;
+}
+
+.popup-overtime {
+  background-color: #fff;
+  border-radius: 32rpx;
+  height: 503rpx;
+  width: 600rpx;
+}
+
+.popup-overtime_img {
+  float: left;
+  height: 120rpx;
+  margin-left: 240rpx;
+  margin-top: 72rpx;
+  width: 120rpx;
+}
+
+.popup-overtime_text {
+  color: #333;
+  float: left;
+  font-family: PingFangSC-Regular;
+  font-size: 36rpx;
+  height: 55rpx;
+  line-height: 55rpx;
+  margin-top: 32rpx;
+  text-align: center;
+  width: 600rpx;
+}
+
+.popup-overtime_left {
+  border: 2rpx solid #e5e5e5;
+  margin-left: 44rpx;
+}
+
+.popup-overtime_left,
+.popup-overtime_right {
+  border-radius: 40rpx;
+  color: #333;
+  float: left;
+  font-family: PingFangSC-Regular;
+  font-size: 34rpx;
+  height: 80rpx;
+  line-height: 80rpx;
+  margin-top: 72rpx;
+  text-align: center;
+  width: 244rpx;
+}
+
+.popup-overtime_right {
+  background: #ffe000;
+  margin-left: 24rpx;
+}
+</style>

+ 515 - 0
src/pages/order/unsend.scss

@@ -0,0 +1,515 @@
+/* #ifdef APP-PLUS ||MP-WEIXIN */
+checkbox .wx-checkbox-input {
+  /* margin-top: 30rpx; */
+  border-radius: 50% !important;
+  color: #ffffff !important;
+}
+
+checkbox .wx-checkbox-input.wx-checkbox-input-checked {
+  color: #fff;
+  background: #08c2c3 !important;
+}
+/* #endif */
+input {
+  border: none;
+}
+image {
+  height: inherit;
+  width: inherit;
+}
+.send_info {
+  padding: 0 30rpx;
+  margin-top: 20rpx;
+  font-size: 26rpx;
+  line-height: 35rpx;
+  letter-spacing: 2rpx;
+  color: #999999;
+}
+.content-title {
+  color: #333333;
+  font-weight: 500;
+  font-size: 32rpx;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.content {
+  align-items: flex-start;
+  display: flex;
+  flex-direction: column;
+  height: 100vh;
+  overflow: auto;
+  width: 750rpx;
+  .foot {
+    background-color: #fff;
+    bottom: 0;
+    position: fixed;
+    width: 750rpx;
+    z-index: 9;
+    display: flex;
+    padding: 20px 0 64rpx;
+    justify-content: space-evenly;
+  }
+}
+
+.notice {
+  font-size: 22rpx;
+  font-weight: 500;
+  color: #c2c2c2;
+  line-height: 30rpx;
+  margin-top: 32rpx;
+  letter-spacing: 1rpx;
+  /* padding-left: 29rpx; */
+}
+
+.notice-img {
+  float: left;
+  height: 36rpx;
+  margin-left: 24rpx;
+  margin-right: 16rpx;
+  margin-top: 25rpx;
+  width: 36rpx;
+}
+
+.notice-text {
+  color: #08c2c3;
+  float: left;
+  font-family: PingFangSC-Regular;
+  font-size: 26rpx;
+  margin-top: 24rpx;
+  width: 602rpx;
+}
+
+.content1 {
+  background: #fff;
+  border-radius: 16rpx;
+  margin-left: 24rpx;
+  margin-top: 24rpx;
+  width: 702rpx;
+}
+
+.content1-list {
+  margin-bottom: 40rpx;
+  width: 702rpx;
+  background: #ffffff;
+  box-shadow: 0px 2px 11px 0px rgba(90, 194, 27, 0.1);
+  border-radius: 16px;
+  /* #ifdef APP-PLUS ||MP-WEIXIN */
+  checkbox .wx-checkbox-input {
+    /* margin-top: 30rpx; */
+    border-radius: 50% !important;
+    color: #ffffff !important;
+  }
+  checkbox .wx-checkbox-input.wx-checkbox-input-checked {
+    color: #fff;
+    background: #5ac21b;
+  }
+  /* #endif */
+}
+.content1-list:last-child {
+  margin-bottom: 140rpx;
+}
+.clearfix:after {
+  content: ".";
+  display: block;
+  height: 0;
+  clear: both;
+  visibility: hidden;
+}
+.content1-list_img {
+  margin-right: 16rpx;
+}
+.content1-list_img image {
+  display: inline-block;
+  border-radius: 8rpx;
+  height: 164rpx;
+  width: 164rpx;
+}
+.commodity-box {
+  /* margin-left: 20rpx; */
+  height: 164rpx;
+  position: relative;
+}
+.content1-list_text1 {
+  color: #333;
+  font-size: 30rpx;
+  /* height: 74rpx; */
+  line-height: 37rpx;
+  width: 460rpx;
+  white-space: wrap;
+  text-overflow: ellipsis;
+  /* white-space: nowrap; */
+  display: -webkit-box;
+  word-break: break-all;
+  -webkit-box-orient: vertical;
+  -webkit-line-clamp: 2;
+  overflow: hidden;
+  letter-spacing: 0.3rpx;
+  margin-top: -5rpx;
+}
+
+.content1-list_text2 {
+  margin-top: 8rpx;
+  font-size: 22rpx;
+  font-weight: 500;
+  color: #c2c2c2;
+  width: 460rpx;
+  overflow: hidden;
+}
+.content1-list_text3 {
+  padding: 0rpx 10rpx;
+  height: 35rpx;
+  background: #5ac21b;
+  text-align: center;
+  font-size: 24rpx;
+  font-weight: 500;
+  color: #ffffff;
+  line-height: 35rpx;
+  display: inline-block;
+  border-radius: 6rpx;
+  margin-top: 10rpx;
+}
+.content1-list_text4 {
+  border-radius: 4rpx;
+  background: #f0f0f0;
+  height: 50rpx;
+  width: 180rpx;
+  position: absolute;
+  left: 280rpx;
+  bottom: 0;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  bottom: 0;
+  right: 0;
+}
+
+.content1-list_input {
+  color: #333;
+  font-size: 26rpx;
+  line-height: 40rpx;
+  height: 40rpx;
+  text-align: center;
+  width: 80rpx;
+  background-color: #ffffff;
+}
+
+.content1-list_left {
+  transform: scaleX(-1);
+}
+
+.content1-list_left,
+.content1-list_right {
+  align-items: center;
+  display: flex;
+  height: 50rpx;
+  justify-content: center;
+  overflow: hidden;
+  width: 50rpx;
+}
+.item-list {
+  display: flex;
+  align-items: center;
+  padding-top: 25rpx;
+  padding-bottom: 25rpx;
+}
+
+.button,
+.button-border {
+  box-sizing: border-box;
+  width: 334rpx;
+  height: 96rpx;
+  background: #08c2c3;
+  line-height: 96rpx;
+  text-align: center;
+  font-size: 32rpx;
+  font-weight: 500;
+  color: #292d3b;
+}
+
+.button-border {
+  border: 4rpx solid #08c2c3;
+  background-color: transparent;
+  line-height: 88rpx;
+  color: #08c2c3;
+}
+
+.bottom-img {
+  border-radius: 100%;
+  float: left;
+  height: 36rpx;
+  margin-left: 24rpx;
+  margin-right: 16rpx;
+  margin-top: 34rpx;
+  width: 36rpx;
+}
+
+.bottom-text {
+  color: #333;
+  float: left;
+  font-family: PingFangSC-Medium;
+  font-size: 28rpx;
+  height: 40rpx;
+  line-height: 40rpx;
+  margin-top: 34rpx;
+  width: 182rpx;
+}
+
+.goods {
+  background: #f8f8f8;
+  border-radius: 32rpx 32rpx 0 0;
+  box-shadow: 0 -8rpx 20rpx 0 rgba(0, 0, 0, 0.1);
+  overflow: hidden;
+  width: 750rpx;
+  padding-bottom: 64rpx;
+}
+
+.goods-title {
+  background-color: #fff;
+  color: #333;
+  float: left;
+  font-family: PingFangSC-Medium;
+  font-size: 30rpx;
+  height: 96rpx;
+  line-height: 96rpx;
+  text-align: center;
+  letter-spacing: 0.3rpx;
+  width: 750rpx;
+}
+
+.goods-address {
+  height: 124rpx;
+  padding: 24rpx;
+  width: 654rpx;
+}
+
+.goods-address,
+.goods-remarks {
+  background: #fff;
+  border-radius: 24rpx;
+  float: left;
+  margin-left: 24rpx;
+  margin-top: 24rpx;
+}
+.goods-remarks2 {
+  background: #fff;
+  border-radius: 24rpx;
+  float: left;
+  margin-left: 24rpx;
+  margin-top: 24rpx;
+  height: 170rpx;
+}
+
+.goods-remarks1,
+.goods-remarks {
+  align-items: center;
+  display: flex;
+  flex-wrap: wrap;
+  height: 96rpx;
+  line-height: 96rpx;
+  width: 702rpx;
+}
+
+.goods-remarks1 {
+  background: #fff;
+  border-radius: 24rpx;
+  float: left;
+  margin-left: 24rpx;
+  margin-top: 24rpx;
+}
+.goods-remarks-text1 {
+  color: #333;
+  display: block;
+  font-family: PingFangSC-Regular;
+  font-size: 30rpx;
+  height: 42rpx;
+  line-height: 42rpx;
+  margin-left: 24rpx;
+  width: 700rpx;
+}
+.goods-remarks-text {
+  color: #333;
+  float: left;
+  font-family: PingFangSC-Regular;
+  font-size: 30rpx;
+  height: 42rpx;
+  line-height: 42rpx;
+  margin-left: 24rpx;
+  letter-spacing: 0.3rpx;
+  margin-bottom: 10rpx;
+}
+
+.goods-payment {
+  background: #fff;
+  float: left;
+  /* height: 223rpx; */
+  margin-top: 20rpx;
+  width: 750rpx;
+  display: flex;
+  justify-content: space-around;
+}
+
+.goods-payment_img {
+  float: left;
+  height: 36rpx;
+  margin-left: 24rpx;
+  margin-right: 8rpx;
+  margin-top: 28rpx;
+  width: 38rpx;
+}
+
+.goods-payment_text {
+  color: #333;
+  float: left;
+  font-family: PingFangSC-Regular;
+  font-size: 26rpx;
+  height: 37rpx;
+  line-height: 32rpx;
+  margin-top: 32rpx;
+  width: 582rpx;
+}
+
+.goods-payment_left {
+  border: 2rpx solid #e5e5e5;
+}
+
+.goods-payment_left,
+.goods-payment_right {
+  border-radius: 4rpx;
+  color: #333;
+  float: left;
+  font-family: PingFangSC-Regular;
+  font-size: 36rpx;
+  height: 98rpx;
+  line-height: 98rpx;
+  margin-left: 24rpx;
+  margin-top: 32rpx;
+  margin-bottom: 70rpx;
+  text-align: center;
+  width: 339rpx;
+  border-radius: 64rpx;
+  letter-spacing: 0.3rpx;
+}
+
+.goods-payment_right {
+  color: #fff;
+  background-color: #ff771d;
+}
+
+.goods-address_name {
+  color: #333;
+  float: left;
+  font-family: PingFangSC-Regular;
+  font-size: 30rpx;
+  height: 40rpx;
+  width: 379rpx;
+}
+
+.goods-address_text {
+  color: #999;
+  float: left;
+  font-family: PingFangSC-Regular;
+  font-size: 26rpx;
+  height: 74rpx;
+  margin-top: 8rpx;
+  width: 653rpx;
+}
+
+.goods-address_text1 {
+  color: #08c2c3;
+  float: right;
+  font-family: PingFangSC-Regular;
+  font-size: 24rpx;
+  height: 33rpx;
+  line-height: 23rpx;
+  margin-top: 8rpx;
+  text-align: right;
+  width: 250rpx;
+}
+
+.popup-recovery {
+  background-color: #fff;
+  border-radius: 32rpx;
+  height: 595rpx;
+  width: 600rpx;
+}
+
+.popup-overtime_img {
+  float: left;
+  height: 120rpx;
+  margin-left: 240rpx;
+  margin-top: 72rpx;
+  width: 120rpx;
+}
+
+.popup-overtime_text {
+  color: #333;
+  float: left;
+  font-family: PingFangSC-Regular;
+  font-size: 36rpx;
+  height: 55rpx;
+  line-height: 55rpx;
+  margin-top: 32rpx;
+  text-align: center;
+  width: 600rpx;
+}
+.popup-overtime-btns {
+  margin-top: 72rpx;
+  display: flex;
+  justify-content: space-evenly;
+  float: left;
+  width: 100%;
+  .button {
+    width: 35%;
+  }
+}
+
+.popup-overtime_text1 {
+  color: #999;
+  float: left;
+  font-family: PingFangSC-Regular;
+  font-size: 30rpx;
+  height: 42rpx;
+  line-height: 42rpx;
+  text-align: center;
+  width: 600rpx;
+}
+
+.popup-overtime_left {
+  border: 2rpx solid #e5e5e5;
+  margin-left: 44rpx;
+}
+
+.popup-overtime_left,
+.popup-overtime_right {
+  /* border-radius: 40rpx; */
+  border-radius: 4rpx;
+  color: #333;
+  float: left;
+  font-family: PingFangSC-Regular;
+  font-size: 34rpx;
+  height: 80rpx;
+  line-height: 80rpx;
+  margin-top: 72rpx;
+  text-align: center;
+  width: 244rpx;
+}
+
+.popup-overtime_right {
+  background: #ff771d;
+  color: #fff;
+  margin-left: 30rpx 24rpx;
+}
+.hx_used {
+  line-height: 50rpx;
+  font-size: 32rpx;
+  letter-spacing: 2rpx;
+  text-align: center;
+}
+.img-s {
+  width: 40rpx;
+  height: 40rpx;
+  border-radius: 36rpx;
+  vertical-align: middle;
+  margin: 0 10rpx;
+}

+ 764 - 0
src/pages/order/unsend.vue

@@ -0,0 +1,764 @@
+<template>
+  <view class="content clearfix">
+    <view class="notice send_info" v-html="sendInfo || ''"></view>
+    <view class="content1">
+      <view v-for="(item, key) in datas" :key="key" class="content1-list">
+        <view class="twoleft">
+          <checkbox-group @change="selectAll(item)">
+            <label class="align-center flex-row">
+              <checkbox
+                :checked="item.check"
+                color="orange"
+                style="transform: scale(0.7)"
+              />
+              <span class="content-title">{{ item.shop_name }}</span>
+            </label>
+          </checkbox-group>
+
+          <view v-for="(ele, i) in item.relations" :key="i">
+            <checkbox-group @change="selected(item, ele)">
+              <label class="item-list">
+                <checkbox
+                  :checked="ele.check"
+                  color="orange"
+                  style="transform: scale(0.7)"
+                />
+                <view class="content1-list_img">
+                  <image mode :src="ele.img"></image>
+                </view>
+                <view class="commodity-box">
+                  <view class="content1-list_text1">{{ ele.name }}</view>
+                  <!-- <view class="content1-list_text2">{{ele.send_info}}</view> -->
+                  <view
+                    v-if="ele.attribute.length"
+                    class="content1-list_text3"
+                    >{{ ele.attribute[0] }}</view
+                  >
+                  <view class="content1-list_text4">
+                    <view class="content1-list_right" @tap.stop="reduce(ele)">
+                      <image
+                        mode
+                        src="@/static/icon_v1/del.png"
+                        style="width: 24rpx; height: 24rpx"
+                      ></image>
+                    </view>
+                    <input
+                      v-model="ele.num"
+                      class="content1-list_input"
+                      :disabled="ele.status == 2 ? true : false"
+                      type="number"
+                      @blur="starBlur(ele)"
+                    />
+                    <view class="content1-list_left" @tap.stop="add(ele)">
+                      <image
+                        mode
+                        src="@/static/icon_v1/add.png"
+                        style="width: 24rpx; height: 24rpx"
+                      ></image>
+                    </view>
+                  </view>
+                </view>
+              </label>
+            </checkbox-group>
+          </view>
+        </view>
+        <!-- <view class="del">
+					<uni-icons class="del" color="orange" type="trash" size="18" @tap="del(item,index)"></uni-icons>
+				</view> -->
+      </view>
+    </view>
+    <view class="foot">
+      <view
+        class="button"
+        :style="'opacity:' + (isCheck ? '' : '0.6') + ';'"
+        @tap="confirmRetrieve"
+        >卖二手</view
+      >
+      <view
+        class="button button-border"
+        :style="'opacity:' + (canSend ? '' : '0.6') + ';'"
+        @tap="confirmSend"
+        >发货</view
+      >
+    </view>
+    <uni-popup
+      ref="popup"
+      style="z-index: 99 !important"
+      type="bottom"
+      @click="noTouch"
+    >
+      <view class="goods">
+        <view class="goods-title">发货确认</view>
+        <view class="notice" style="float: left">
+          <view class="notice-img">
+            <image mode src="@/static/icon_v1/Notice1@2x.png"></image>
+          </view>
+          <view class="notice-text">{{ "" + notice + "" }}</view>
+        </view>
+        <view v-if="address" class="goods-address">
+          <view class="goods-address_name">{{
+            "" + address.name + " " + address.phone + ""
+          }}</view>
+          <view class="goods-address_text1" @tap="chooseAddress">
+            修改地址
+          </view>
+          <view class="goods-address_text">{{
+            "" + address.city + address.address + ""
+          }}</view>
+        </view>
+        <view v-if="!address" class="goods-remarks1">
+          <view class="goods-remarks-text1" style="width: 408rpx"
+            >请填写收货地址</view
+          >
+          <view class="goods-address_text1" @tap="chooseAddress">去填写</view>
+        </view>
+        <view class="goods-remarks2">
+          <view class="goods-remarks-text">发货备注</view>
+          <textarea
+            v-model="remarks"
+            auto-height="true"
+            placeholder="请填写备注信息"
+            maxlength="50"
+            style="
+              display: block;
+              margin-left: 20rpx;
+              color: #999;
+              width: 700rpx;
+            "
+            type="text"
+          />
+        </view>
+        <view class="goods-payment">
+          <template v-if="!freeShipping">
+            <view class="goods-payment_img">
+              <image mode src="@/static/icon_v1/hair@2x.png"></image>
+            </view>
+            <view class="goods-payment_text"
+              >需要支付运费<text style="color: red">8</text> 元</view
+            >
+            <view class="button-border" @tap="cancel">取消</view>
+            <view
+              v-if="numAll > 0"
+              class="button"
+              :style="address ? '' : 'opacity:0.6'"
+              @tap="payment"
+            >
+              <view class="_b">支付运费</view>
+            </view>
+          </template>
+          <template v-else>
+            <view class="button-border" @tap="cancel">取消</view
+            ><view
+              class="button"
+              :style="address ? '' : 'opacity:0.6'"
+              @tap="payment"
+              >确定</view
+            >
+          </template>
+        </view>
+        <view
+          v-if="protects == true"
+          style="
+            width: 750rpx;
+            height: 42rpx;
+            background-color: #ffffff;
+            float: left;
+          "
+        ></view>
+      </view>
+    </uni-popup>
+    <uni-popup ref="popup_place_false" type="center">
+      <view class="popup-recovery">
+        <view class="popup-overtime_img">
+          <image mode src="@/static/icon_v1/success@2x.png"></image>
+        </view>
+        <view class="popup-overtime_text">申请成功</view>
+        <view class="popup-overtime_text1">仓库小哥已经收到你的请求,</view>
+        <view class="popup-overtime_text1">会尽快帮你发货的</view>
+        <view class="popup-overtime-btns">
+          <view class="button button-border" @tap="home">回首页</view>
+          <view class="button" @tap="orderInfo">查看发货单</view>
+        </view>
+      </view>
+    </uni-popup>
+    <uni-popup ref="retrieve_confirm" type="bottom">
+      <view class="pop confirm_retrieve">
+        <view class="p_head">卖二手</view>
+        <view class="p_body">
+          <view class="align-center flex-col">
+            <view class="hx_used" style="margin-top: 30rpx">
+              <text>用户</text>
+              <image class="img-s" mode :src="retrieve['avatar']"></image>
+              <text style="line-height: 50rpx"
+                >{{ retrieve["nickname"] }} 想要求购以上商品,共计{{
+                  retrievePrice
+                }}元,可在我的 - 消费记录里查看回血明细。</text
+              >
+            </view>
+          </view>
+        </view>
+        <view class="p_foot between">
+          <view class="button button-border" @tap="confirmRetrieveCancel"
+            >取消</view
+          >
+          <view class="button" @tap="submitRetrieve">卖出</view>
+        </view>
+      </view>
+    </uni-popup>
+
+    <uni-popup ref="retrieve_done" type="bottom">
+      <view class="pop confirm_retrieve">
+        <view class="p_head">卖二手</view>
+        <view class="p_body">
+          <view class="align-center flex-col">
+            <view class="hx_used" style="margin-top: 30rpx">
+              您本次获得 <text style="color: red">{{ retrievePrice }}</text> 元
+            </view>
+            <view class="hx_used"> 目前账户余额 {{ balance }} 元 </view>
+          </view>
+        </view>
+        <view class="p_foot center">
+          <view class="button" @tap="submitRetrieveDone">完成</view>
+        </view>
+      </view>
+    </uni-popup>
+  </view>
+</template>
+
+<script>
+import api from "@/lib/api/api";
+export default {
+  name: "PageOrderUnsend",
+  data() {
+    return {
+      num: 0,
+      address: "",
+      remarks: "",
+      mask: !1,
+      datas: [],
+      protects: "",
+      disabled: !1,
+      notice: "请确保当面核对包裹信息",
+      isCheck: false,
+      canSend: false,
+      sendList: [],
+      numAll: 0,
+      sendInfo: "",
+      userInfo: {},
+      retrievePrice: 0, // 回血用
+      retrieve: {},
+      balance: 0, // 回血用
+      freeShipping: false,
+    };
+  },
+  onShow() {
+    const e = getCurrentPages();
+    this.address = e[e.length - 1].data.address;
+    //
+    const uinfoStr = uni.getStorageSync("userinfo");
+    if (uinfoStr) {
+      this.userInfo = JSON.parse(uinfoStr);
+    } else {
+      this.userInfo = {};
+      uni.showToast({
+        title: "请先登录",
+        icon: "none",
+      });
+      return;
+    }
+  },
+  onLoad() {
+    const uinfoStr = uni.getStorageSync("userinfo");
+    if (uinfoStr) {
+      this.userInfo = JSON.parse(uinfoStr);
+      this.loadData();
+    }
+    //
+  },
+  methods: {
+    // 页面刷新
+    refresh() {
+      this.init(); // 初始化值
+      this.loadData();
+    },
+    //
+    init() {
+      this.num = 0;
+      this.address = "";
+      this.remarks = "";
+      this.mask = !1;
+      this.datas = [];
+      this.protects = "";
+      this.disabled = !1;
+      this.notice = "请确保当面核对包裹信息";
+      this.isCheck = false;
+      this.canSend = false;
+      this.sendList = [];
+      this.numAll = 0;
+      this.sendInfo = "";
+      this.retrievePrice = 0; // 回血用
+      this.retrieve = {}; // 回血用
+      this.balance = 0; // 回血用
+    },
+    loadData() {
+      api
+        .unSendList(this.userInfo.session)
+        .then((data) => {
+          if (data.data) {
+            this.datas = data.data;
+            this.sendInfo = data.send_info;
+            this.datas.filter((item) => {
+              //设置店铺选中状态
+              this.$set(item, "check", false);
+              item.relations.filter((ele) => {
+                //设置单个商品选中状态
+                this.$set(ele, "check", false);
+                this.$set(ele, "num1", ele.num);
+              });
+              //设置是否可以选中
+              if (item.relations.every((val) => val.status === 2)) {
+                this.$set(item, "status", 2);
+              }
+            });
+          }
+        })
+        .catch(() => {
+          uni.showToast({
+            icon: "none",
+            title: "服务器错误,请稍后重试",
+            duration: 2e3,
+          });
+          return;
+        });
+    },
+    //全选
+    selectAll(item) {
+      item.check = !item.check;
+      item.relations.forEach((el) => (el.check = item.check));
+
+      //发货按钮状态
+      const btnStatus = [];
+      const notSent = [];
+      this.datas.forEach((val) => {
+        val.relations.forEach((el) => {
+          if (el.check) {
+            btnStatus.push(el);
+            if (el.status === 2) {
+              notSent.push(el);
+            }
+          }
+        });
+      });
+      if (btnStatus.length > 0) {
+        this.isCheck = true;
+        this.canSend = notSent.length === 0;
+      } else {
+        this.isCheck = false;
+        this.canSend = false;
+      }
+      //
+      // this.sendList = []
+      // for(let i = 0; i<this.datas.length; i++){
+      // 	for(let j =0; j<this.datas[i].relations.length; j++){
+      // 		if(this.datas[i].relations[j].check){
+      // 			this.sendList.push({
+      // 				"sku_id": ""+this.datas[i].relations[j].id,
+      // 				"num": ""+this.datas[i].relations[j].num
+      // 			})
+      // 		}
+      // 	}
+      // }
+    },
+    // 单个商品前的勾选
+    selected(item, ele) {
+      ele.check = !ele.check; //设置单个商品的选中状态
+      //是否全部选中该店铺下的所有商品>>>单个商品都为true,店铺也应为true
+      item.check = item.relations.every((val) => val.check == true);
+
+      //发货按钮状态
+      const btnStatus = [];
+      const notSent = [];
+      this.datas.forEach((val) => {
+        val.relations.forEach((el) => {
+          if (el.check) {
+            btnStatus.push(el);
+            if (el.status === 2) {
+              notSent.push(el);
+            }
+          }
+        });
+      });
+      if (btnStatus.length > 0) {
+        this.isCheck = true;
+        this.canSend = notSent.length === 0;
+      } else {
+        this.isCheck = false;
+        this.canSend = false;
+      }
+      //
+      // this.sendList = []
+      // for(let i = 0; i<this.datas.length; i++){
+      // 	for(let j =0; j<this.datas[i].relations.length; j++){
+      // 		if(this.datas[i].relations[j].check){
+      // 			this.sendList.push({
+      // 				"sku_id": ""+this.datas[i].relations[j].id,
+      // 				"num": ""+this.datas[i].relations[j].num
+      // 			})
+      // 		}
+      // 	}
+      // }
+    },
+    add(t) {
+      t.num = +t.num || 0;
+      if (t.num < t.num1) {
+        t.num++;
+      } else {
+        uni.showToast({
+          icon: "none",
+          title: "已到达最大值",
+          duration: 2e3,
+        });
+      }
+    },
+    reduce(t) {
+      t.num = +t.num || 0;
+      if (t.num > 1) {
+        t.num--;
+      }
+    },
+    starBlur(t) {
+      t.num = +t.num || 0;
+      if (t.num < 1 || 0 === t.num || "" === t.num) {
+        t.num = t.num1;
+      }
+      if (t.num > t.num1) {
+        t.num = t.num1;
+      }
+    },
+    cancel() {
+      this.disabled = false;
+      this.$refs.popup.close();
+    },
+    async confirmSend() {
+      this.sendList = [];
+      for (let i = 0; i < this.datas.length; i++) {
+        for (let j = 0; j < this.datas[i].relations.length; j++) {
+          if (this.datas[i].relations[j].check) {
+            this.sendList.push({
+              sku_id: "" + this.datas[i].relations[j].id,
+              num: "" + this.datas[i].relations[j].num,
+            });
+          }
+        }
+      }
+      if (this.sendList.length == 0) {
+        uni.showToast({
+          icon: "none",
+          title: "请选择要发货的商品",
+          duration: 2e3,
+        });
+        return;
+      }
+
+      if (!this.canSend) {
+        uni.showToast({
+          icon: "none",
+          title: "选择商品中存在不可发货商品",
+          duration: 2e3,
+        });
+        return;
+      }
+
+      const res = await api
+        .checkIsFreeShipping({
+          session: this.userInfo.session,
+          skus: this.sendList,
+        })
+        .catch((e) => {
+          return {
+            errno: 404,
+            errmsg: e.message || "请求失败,请重试",
+          };
+        });
+
+      if (res.errno === 10000) {
+        this.freeShipping = res?.free_shipping === 1;
+
+        this.disabled = true;
+        this.numAll = 0;
+        this.sendList.forEach((item) => {
+          this.numAll = Number(this.numAll) + Number(item.num);
+        });
+        this.$refs.popup.open();
+      } else {
+        uni.showToast({
+          icon: "none",
+          title: res.errmsg || "请求失败,请重试",
+          duration: 2e3,
+        });
+      }
+    },
+    confirmRetrieveCancel() {
+      this.$refs.retrieve_confirm.close();
+    },
+    submitRetrieveDone() {
+      this.refresh();
+      this.$refs.retrieve_done.close();
+    },
+    confirmRetrieve() {
+      // 寄存柜,预回血操作
+      this.sendList = [];
+      for (let i = 0; i < this.datas.length; i++) {
+        for (let j = 0; j < this.datas[i].relations.length; j++) {
+          if (this.datas[i].relations[j].check) {
+            this.sendList.push({
+              sku_id: "" + this.datas[i].relations[j].id,
+              num: "" + this.datas[i].relations[j].num,
+            });
+          }
+        }
+      }
+      if (this.sendList.length == 0) {
+        uni.showToast({
+          icon: "none",
+          title: "请选择要回血的商品",
+          duration: 2e3,
+        });
+        return;
+      } else {
+        api
+          .preSkuRetrieve({
+            session: this.userInfo.session,
+            skus: this.sendList,
+          })
+          .then((data) => {
+            if (data.errno != 10000) {
+              uni.showToast({
+                title: data.errmsg,
+                icon: "error",
+                mask: true,
+                duration: 2e3,
+              });
+              return;
+            }
+            this.retrievePrice = data.data.retrieve_price;
+            this.retrieve = data.data.retrive;
+            this.$refs.retrieve_confirm.open();
+          })
+          .catch(() => {
+            uni.showToast({
+              icon: "none",
+              title: "回收失败,请稍后重试",
+              duration: 2e3,
+            });
+          });
+        return;
+      }
+    },
+    submitRetrieve() {
+      this.$refs.retrieve_confirm.close();
+      // 寄存柜回收
+      if (this.sendList.length < 1) {
+        uni.showToast({
+          icon: "none",
+          title: "请选择需要回血的商品",
+          duration: 2e3,
+        });
+        return;
+      }
+      //
+      api
+        .finalSkuRetrieve({
+          session: this.userInfo.session,
+          skus: this.sendList,
+        })
+        .then((data) => {
+          if (data.errno != 10000) {
+            uni.showToast({
+              title: data.errmsg,
+              icon: "error",
+              mask: true,
+              duration: 2e3,
+            });
+            return;
+          }
+          this.retrievePrice = data.data.retrieve_price;
+          this.balance = data.data.balance;
+          this.$refs.retrieve_done.open();
+        })
+        .catch(() => {
+          uni.showToast({
+            icon: "none",
+            title: "回收失败,请稍后重试",
+            duration: 2e3,
+          });
+        });
+      return;
+    },
+    chooseAddress() {
+      uni.navigateTo({
+        url: "../address/address?action=choose",
+      });
+    },
+    showRes() {
+      this.$refs.popup.close();
+      this.$refs.popup_place_false.open();
+      this.refresh();
+    },
+    payment() {
+      if (!this.address || this.address.id < 1) {
+        uni.showToast({
+          icon: "none",
+          title: "请选择收获地址",
+          duration: 2e3,
+        });
+        return;
+      }
+      if (this.sendList.length < 1) {
+        uni.showToast({
+          icon: "none",
+          title: "你还没有需要发货的商品",
+          duration: 2e3,
+        });
+        this.$refs.popup.close();
+        return;
+      }
+
+      api
+        .sendOrder({
+          session: this.userInfo.session,
+          beizhu: this.remarks,
+          skus: this.sendList,
+          address_id: "" + this.address.id,
+        })
+        .then((data) => {
+          if (data.data.paySign == undefined) {
+            this.showRes();
+          } else {
+            // 微信支付运费
+            uni.showToast({
+              title: "支付中",
+              icon: "loading",
+              mask: true,
+              duration: 10e3,
+            });
+            uni.hideToast();
+            uni.requestPayment({
+              provider: "wxpay",
+              timeStamp: data.data.timeStamp,
+              nonceStr: data.data.nonceStr,
+              package: data.data.package,
+              signType: data.data.signType,
+              paySign: data.data.paySign,
+              success(res) {
+                if (res.errMsg === "requestPayment:ok") {
+                  this.getPrepaySucceedOrder(data.data.id);
+                }
+              },
+              fail(err) {
+                if (err.errMsg === "requestPayment:fail cancel") {
+                  this.getPrepayStatusOrder("3", data.data.id);
+                } else {
+                  this.getPrepayStatusOrder("2", data.data.id);
+                }
+              },
+            });
+          }
+        })
+        .catch(() => {
+          uni.showToast({
+            icon: "none",
+            title: "发货失败,请稍后重试",
+            duration: 2e3,
+          });
+        });
+    },
+    getPrepayStatusOrder(type, id) {
+      const params = {
+        session: this.userInfo.session,
+        id: "" + id,
+        type: "" + type,
+      };
+      api
+        .getPrepayStatusOrder(params)
+        .then(() => {
+          uni.showToast({
+            title: type == "3" ? "取消支付" : "支付失败",
+            icon: "error",
+            mask: true,
+            duration: 2e3,
+          });
+        })
+        .catch((e) => {
+          console.log(e);
+        });
+    },
+    getPrepaySucceedOrder(id) {
+      let timer;
+      api
+        .getPrepaySucceedOrder({
+          session: this.userInfo.session,
+          id: "" + id,
+          times: "" + this.testInt++,
+        })
+        .then((data) => {
+          if (data.errno == 90000) {
+            if (this.queryPayIng) {
+              this.queryPayIng = false;
+              uni.showLoading({
+                title: "加载中",
+                mask: true,
+              });
+            }
+            timer = setTimeout(() => {
+              this.getPrepaySucceedOrder(id);
+            }, 1000);
+          } else if (data.errno == 10000) {
+            this.queryPayIng = true;
+            uni.hideLoading();
+            uni.showToast({
+              title: "支付成功",
+              icon: "success",
+              mask: true,
+              duration: 2e3,
+            });
+            if (data.data.status == 1) {
+              this.showRes();
+            }
+            clearTimeout(timer); //清理定时任务
+          } else {
+            this.queryPayIng = true;
+            uni.hideLoading();
+            uni.showToast({
+              title: "订单查询失败",
+              icon: "error",
+              mask: true,
+              duration: 2e3,
+            });
+            clearTimeout(timer); //清理定时任务
+          }
+        })
+        .catch(() => {
+          this.queryPayIng = true;
+          uni.hideLoading();
+          clearTimeout(timer); //清理定时任务
+        });
+    },
+    home() {
+      uni.switchTab({
+        url: "../index/index",
+      });
+    },
+    orderInfo() {
+      this.$refs.popup_place_false.close();
+      uni.redirectTo({
+        url: "./sended",
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+@import "./unsend.scss";
+</style>

+ 518 - 0
src/pages/reward/detail.scss

@@ -0,0 +1,518 @@
+.yfs-page {
+  background: #1b1c1e;
+  padding: 28rpx 20rpx 300rpx;
+  box-sizing: border-box;
+  width: 100%;
+  min-height: 100vh;
+  overflow: hidden;
+
+  .nodata {
+    text-align: center;
+    padding: 100rpx 0 0;
+    color: #4efbff;
+    font-size: 24rpx;
+  }
+}
+.yfs-wrap {
+  box-sizing: border-box;
+  width: 100%;
+  height: 280rpx;
+  background: url(https://chujianchaowan.oss-cn-beijing.aliyuncs.com/images/8a820df45af79f2971645662cacce8cd.png)
+    no-repeat center;
+  background-size: contain;
+  display: flex;
+  padding: 14rpx 38rpx 0;
+  align-items: center;
+  position: relative;
+  .skeleton {
+    background-image: linear-gradient(
+      90deg,
+      #252932 25%,
+      #2c3241 37%,
+      #252932 63%
+    );
+    list-style: none;
+    background-size: 400% 100%;
+    background-position: 100% 50%;
+    animation: skeleton-loading 1.4s ease infinite;
+  }
+  .yfs-media {
+    width: 200rpx;
+    height: 200rpx;
+    background-color: #d9d9d9;
+    border: 2rpx solid #4efbff;
+    position: relative;
+    overflow: hidden;
+    margin-right: 34rpx;
+    .yfs-image {
+      display: block;
+      width: 200rpx;
+      height: 200rpx;
+    }
+    .yfs-media-bar {
+      position: absolute;
+      width: 100%;
+      bottom: 0;
+      left: 0;
+      display: flex;
+      height: 36rpx;
+      background: rgba(0, 0, 0, 0.5);
+      text-align: center;
+      font-size: 20rpx;
+      color: rgba(255, 255, 255, 0.6);
+      overflow: hidden;
+      .yfs-media-title {
+        width: 104rpx;
+        font-size: 20rpx;
+        font-weight: 600;
+        color: #222222;
+        text-align: center;
+        position: relative;
+        background: #4efbff;
+        display: flex;
+        justify-content: center;
+        align-items: flex-end;
+        line-height: 30rpx;
+
+        .big {
+          font-size: 32rpx;
+          font-weight: bold;
+          font-family: unidreamledregular;
+          margin-left: 6rpx;
+          line-height: 32rpx;
+        }
+        &::after {
+          content: "";
+          width: 0;
+          height: 0;
+          overflow: hidden;
+          border-style: solid;
+          border-color: transparent transparent transparent #4efbff;
+          border-width: 46rpx 0 0 22rpx;
+          position: absolute;
+          left: 100%;
+          top: 0;
+        }
+      }
+      .yfs-media-desc {
+        flex: 1;
+        padding-left: 20rpx;
+        text-decoration: line-through;
+        line-height: 36rpx;
+      }
+    }
+  }
+  .yfs-body {
+    flex: 1;
+    width: 0;
+  }
+  .yfs-title {
+    height: 50rpx;
+    font-size: 36rpx;
+    font-weight: 600;
+    color: #ffffff;
+    line-height: 50rpx;
+    text-shadow: 0rpx 0rpx 12rpx rgba(78, 255, 249, 0.4);
+    white-space: nowrap;
+    width: 100%;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    &.skeleton {
+      width: 80%;
+    }
+  }
+  .yfs-control {
+    display: flex;
+    height: 34rpx;
+    font-size: 24rpx;
+    color: #ffffff;
+    line-height: 34rpx;
+    margin-top: 20rpx;
+    align-items: center;
+    .yfs-control-btn {
+      font-size: 24rpx;
+      color: #4efbff;
+      background: none;
+      border-radius: 0;
+      height: 34rpx;
+      color: #ffffff;
+      line-height: 34rpx;
+      display: inline-flex;
+      align-items: center;
+      padding: 0;
+      margin: 0;
+      &[disabled] {
+        opacity: 0.5;
+      }
+      &:first-child {
+        margin-right: 24rpx;
+      }
+      &:last-child {
+        margin-left: 24rpx;
+      }
+      &::after {
+        display: none;
+      }
+      .yfs-control-icon {
+        width: 26rpx;
+        height: 26rpx;
+        &:first-child {
+          margin-right: 6rpx;
+        }
+        &:last-child {
+          margin-left: 6rpx;
+        }
+      }
+    }
+  }
+  .yfs-progress {
+    width: 100%;
+    height: 16rpx;
+    background-color: #444a60;
+    overflow: hidden;
+    margin-top: 32rpx;
+    .yfs-progress-innter {
+      width: 100%;
+      height: 16rpx;
+      position: relative;
+      background: #4efbff;
+      transform: translate(-100%, 0);
+      transition: transform 0.3s;
+      &::after {
+        content: "";
+        width: 0;
+        height: 0;
+        overflow: hidden;
+        border-style: solid;
+        border-color: transparent transparent transparent #4efbff;
+        border-width: 0 0 16rpx 8rpx;
+        position: absolute;
+        left: 100%;
+      }
+    }
+  }
+  .yfs-bottom {
+    margin-top: 16rpx;
+    display: flex;
+    justify-content: space-between;
+    font-size: 24rpx;
+    color: #ffffff;
+    height: 28rpx;
+    line-height: 28rpx;
+    .yfs-bottom-left {
+      height: 28rpx;
+      &.skeleton {
+        width: 30%;
+      }
+    }
+    .yfs-bottom-right {
+      color: #4efbff;
+      display: inline-flex;
+      align-items: center;
+      height: 28rpx;
+      .yfs-bottom-icon {
+        width: 24rpx;
+        height: 24rpx;
+        margin-left: 8rpx;
+      }
+      &.skeleton {
+        width: 30%;
+      }
+    }
+  }
+  .yfs-price {
+    margin-top: 8rpx;
+    .yfs-price-small {
+      font-size: 22rpx;
+      font-weight: 500;
+      color: #ffffff;
+      line-height: 26rpx;
+    }
+    .yfs-price-big {
+      font-size: 40rpx;
+      font-weight: bold;
+      color: #ffffff;
+      line-height: 47rpx;
+      margin-left: 4rpx;
+    }
+    .yfs-price-origin {
+      font-size: 24rpx;
+      font-weight: 400;
+      color: #aaaaaa;
+      line-height: 28rpx;
+      text-decoration: line-through;
+      margin-left: 16rpx;
+    }
+  }
+  .yfs-media-avatars {
+    display: flex;
+    align-items: center;
+    margin-top: 28rpx;
+    .yfs-queue-avatars {
+      padding: 0 36rpx 0 0;
+      .yfs-queue-avatar,
+      .yfs-queue-more {
+        box-sizing: border-box;
+        width: 50rpx;
+        height: 50rpx;
+        border: 2rpx solid #ffffff;
+        border-radius: 100%;
+        margin-right: -14rpx;
+        background: #d9d9d9;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        font-size: 40rpx;
+        color: #555555;
+      }
+    }
+    .yfs-media-avatars-label {
+      flex: 1;
+      font-size: 26rpx;
+      font-weight: 500;
+      color: #ffffff;
+      line-height: 30rpx;
+    }
+  }
+  .yfs-float-rule {
+    box-sizing: border-box;
+    position: absolute;
+    right: 2rpx;
+    top: 50%;
+    transform: translate(0, -50%);
+    width: 42rpx;
+    height: 108rpx;
+    background: #292d3b;
+    box-shadow: 0rpx 0rpx 6rpx 0rpx #4efbff;
+    border: 4rpx solid #4efbff;
+    font-size: 20rpx;
+    color: #4efbff;
+    line-height: 22rpx;
+    padding: 8rpx;
+    text-align: center;
+  }
+}
+.yfs-tabs {
+  margin-top: 30rpx;
+  display: flex;
+  .yfs-tab {
+    width: 0;
+    height: 42rpx;
+    line-height: 42rpx;
+    font-size: 42rpx;
+    color: #9a9a9a;
+    font-family: ysbth;
+    flex: 1;
+    text-align: center;
+    padding-bottom: 14rpx;
+    &.yfs-tab-active {
+      color: #4efbff;
+      position: relative;
+      &::after {
+        content: "";
+        width: 30rpx;
+        height: 4rpx;
+        background: #4efbff;
+        position: absolute;
+        left: 50%;
+        bottom: 0;
+        margin-left: -15rpx;
+      }
+    }
+  }
+}
+.yfs-list {
+  display: flex;
+  flex-wrap: wrap;
+  margin: 24rpx -7rpx 0;
+  .yfs-list-item {
+    margin: 0 8rpx 16rpx;
+  }
+  .level-item {
+    width: 100%;
+    display: block;
+  }
+}
+.yfs-footer {
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  .yfs-cd-bar {
+    width: 100%;
+    height: 52rpx;
+    background: rgba(1, 1, 1, 0.69);
+    line-height: 56rpx;
+    overflow: hidden;
+    display: flex;
+    justify-content: space-between;
+    border-bottom: 4rpx solid #4efbff;
+    padding-right: 28rpx;
+  }
+  .yfs-cd-main {
+    position: relative;
+    width: 434rpx;
+    height: 52rpx;
+    font-family: ysbth;
+    background: #4efbff;
+    font-size: 30rpx;
+    color: #000000;
+    text-align: center;
+    &::after {
+      content: "";
+      position: absolute;
+      left: 100%;
+      width: 0;
+      height: 0;
+      overflow: hidden;
+      border-style: solid;
+      border-color: transparent transparent transparent #4efbff;
+      border-width: 54rpx 0 0 26rpx;
+    }
+    .yfs-cd-time {
+      margin-left: 34rpx;
+    }
+  }
+  .yfs-cd-exit {
+    width: auto;
+    font-size: 24rpx;
+    color: #4efbff;
+    line-height: 56rpx;
+    margin: 0;
+    background-color: transparent;
+    border-radius: 0;
+    &::after {
+      display: none;
+    }
+  }
+  .yfs-footer-main {
+    padding: 42rpx 24rpx 92rpx;
+    background: #292d3b;
+    width: 100%;
+    display: flex;
+    justify-content: space-between;
+    box-sizing: border-box;
+
+    .yfs-queue-btn {
+      background: url(@/static/detail/btn-join.png) no-repeat center;
+      background-size: contain;
+      width: 222rpx;
+      height: 98rpx;
+      font-family: ysbth;
+      font-size: 40rpx;
+      color: #000000;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      padding: 14rpx 0 0;
+      margin: 0;
+      border-radius: 0;
+      &::after {
+        display: none;
+      }
+      &.yfs-queue-btn-center {
+        margin: 0 auto;
+      }
+    }
+    .yfs-login-btn {
+      background: url(@/static/detail/btn-login.png) no-repeat center;
+      background-size: contain;
+      width: 584rpx;
+      height: 92rpx;
+      display: block;
+      margin: 0 auto;
+      border-radius: 0;
+      &::after {
+        display: none;
+      }
+    }
+  }
+}
+.yfs-queue-avatars {
+  display: flex;
+  flex-direction: row-reverse;
+  padding: 14rpx 0 0;
+  .yfs-queue-avatar,
+  .yfs-queue-more {
+    box-sizing: border-box;
+    width: 60rpx;
+    height: 60rpx;
+    border: 2rpx solid #ffffff;
+    border-radius: 100%;
+    margin-right: -14rpx;
+    background: #d9d9d9;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    font-size: 40rpx;
+    color: #555555;
+  }
+}
+.yfs-fixed-btns {
+  position: fixed;
+  right: 0;
+  bottom: 380rpx;
+  .yfs-fixed-btn {
+    width: 126rpx;
+    height: 62rpx;
+    background: rgba(5, 5, 5, 0.7);
+    box-shadow: 0rpx 0rpx 6rpx 0rpx #4efbff;
+    border: solid #4efbff;
+    border-width: 4rpx 0 4rpx 4rpx;
+    border-radius: 50rpx 0 0 50rpx;
+    margin-bottom: 20rpx;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    font-size: 24rpx;
+    color: #4efbff;
+    padding: 0 0 0 10rpx;
+    text-align: center;
+    white-space: nowrap;
+    &::after {
+      display: none;
+    }
+    .yfs-icon-refresh {
+      width: 26rpx;
+      height: 26rpx;
+      margin-right: 12rpx;
+    }
+    .yfs-icon-refresh-anim {
+      animation: turn 0.8s linear infinite;
+    }
+  }
+}
+@keyframes turn {
+  0% {
+    transform: rotate(0deg) scale(1);
+  }
+  50% {
+    transform: rotate(180deg) scale(1.5);
+  }
+  100% {
+    transform: rotate(360deg) scale(1);
+  }
+}
+
+.yfs-lable-tabs {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  text-align: center;
+  margin-top: 32rpx;
+
+  .yfs-lable-tab {
+    width: 120rpx;
+    height: 50rpx;
+    line-height: 50rpx;
+    border: 2rpx solid #9a9a9a;
+    font-size: 24rpx;
+    font-weight: 500;
+    color: #9a9a9a;
+
+    &.active {
+      color: #4efbff;
+      border: 2rpx solid #4efbff;
+    }
+  }
+}

+ 879 - 0
src/pages/reward/detail.vue

@@ -0,0 +1,879 @@
+<template>
+  <view class="content yfs-page">
+    <view v-if="info" class="yfs-wrap">
+      <view class="yfs-media">
+        <image class="yfs-image" :src="info.img" mode="aspectFill"></image>
+        <view v-if="info.play_type !== 3" class="yfs-media-bar">
+          <view class="yfs-media-title"
+            ><text>&yen;</text
+            ><text class="big">{{ info.show_price }}</text></view
+          >
+          <view
+            v-if="
+              Number(info.source_price) &&
+              Number(info.show_price) < Number(info.source_price)
+            "
+            class="yfs-media-desc"
+            >&yen;{{ info.source_price }}</view
+          >
+        </view>
+      </view>
+      <view v-if="info.play_type === 3" class="yfs-body">
+        <view class="yfs-title">{{ info.name }}</view>
+        <view class="yfs-price">
+          <text class="yfs-price-small">&yen;</text>
+          <text class="yfs-price-big">{{ info.show_price }}</text>
+          <text
+            v-if="
+              info.source_price &&
+              Number(info.source_price) > Number(info.show_price)
+            "
+            class="yfs-price-origin"
+            >{{ info.source_price }}</text
+          >
+        </view>
+        <view class="yfs-media-avatars">
+          <view
+            v-if="wxsUsers && wxsUsers.data && wxsUsers.data.length"
+            class="yfs-queue-avatars"
+          >
+            <view v-if="wxsUsers.num > 7" class="yfs-queue-more">···</view>
+            <image
+              v-for="item in wxsUsers.data"
+              :key="item.id"
+              class="yfs-queue-avatar"
+              :src="item.avatar"
+            ></image>
+          </view>
+          <view class="yfs-media-avatars-label">{{ wxsUsers.info }}</view>
+        </view>
+        <view class="yfs-float-rule" @click="handlePopupShow('popup_rule')"
+          >规则说明</view
+        >
+      </view>
+      <view v-else class="yfs-body">
+        <view class="yfs-title">{{ info.name }}</view>
+        <view class="yfs-control">
+          <button
+            class="yfs-control-btn"
+            :disabled="!info.pre_kuji"
+            @click="handleToId(info.pre_kuji)"
+          >
+            <image
+              src="@/static/icon/icon-prev.png"
+              class="yfs-control-icon"
+            ></image>
+            <text>上一箱</text>
+          </button>
+          共 {{ info.curr_batch_num }}/{{ info.batch_num }} 箱
+          <button
+            class="yfs-control-btn"
+            :disabled="!info.next_kuji"
+            @click="handleToId(info.next_kuji)"
+          >
+            <text>下一箱</text>
+            <image
+              src="@/static/icon/icon-next.png"
+              class="yfs-control-icon"
+            ></image>
+          </button>
+        </view>
+        <view class="yfs-progress">
+          <view class="yfs-progress-innter" :style="progressStyle"></view>
+        </view>
+        <view class="yfs-bottom">
+          <view class="yfs-bottom-left"
+            >剩余{{ info.curr_num }}/{{ info.total_num }}发</view
+          >
+          <view class="yfs-bottom-right" @click="handlePopupShow('popup_rule')"
+            >规则说明<image
+              src="@/static/icon/icon-help.png"
+              class="yfs-bottom-icon"
+            ></image
+          ></view>
+        </view>
+      </view>
+    </view>
+    <view v-else class="yfs-wrap">
+      <view class="yfs-media skeleton"></view>
+      <view class="yfs-body">
+        <view class="yfs-title skeleton"></view>
+        <view class="yfs-control skeleton"></view>
+        <view class="yfs-progress skeleton"></view>
+        <view class="yfs-bottom">
+          <view class="yfs-bottom-left skeleton"></view>
+          <view class="yfs-bottom-right skeleton"></view>
+        </view>
+      </view>
+    </view>
+    <view class="yfs-tabs">
+      <view
+        v-for="tab in tabs"
+        :key="tab.key"
+        :class="['yfs-tab', { 'yfs-tab-active': tab.key === currentTab }]"
+        @click="handleTabClick(tab.key)"
+        >{{ tab.title }}</view
+      >
+    </view>
+    <view v-show="currentTab === 'list'" class="yfs-list">
+      <template v-if="info && info.relations && info.play_type === 3">
+        <level-item
+          v-for="item in info.relations"
+          :key="item.level"
+          class="level-item"
+          :item="item"
+          @click="handleShowImages"
+        ></level-item>
+      </template>
+      <template v-else-if="info && info.relations">
+        <yfs-item
+          v-for="item in info.relations"
+          :key="item.id"
+          :item="item"
+          class="yfs-list-item"
+          @click="handleShowImages"
+        />
+      </template>
+      <template v-else>
+        <yfs-item v-for="n in 9" :key="n" class="yfs-list-item" />
+      </template>
+    </view>
+    <view v-show="currentTab === 'record'" class="yfs-record-list">
+      <template v-if="info.play_type === 3">
+        <view class="yfs-lable-tabs">
+          <view
+            v-for="item in listsArr"
+            :key="item.key"
+            :class="['yfs-lable-tab', { active: currentList.key === item.key }]"
+            @click="handleTagClick(item.key)"
+          >
+            {{ item.title }}
+          </view>
+        </view>
+        <template v-if="currentList.list.length">
+          <yfs-result-item
+            v-for="item in currentList.list"
+            :key="item.id"
+            :item="item"
+            :play-type="info.play_type"
+            class="yfs-list-item"
+          />
+        </template>
+        <view v-else class="nodata">暂无抽赏记录</view>
+      </template>
+      <template v-else-if="payList">
+        <template v-if="payList.relations.length">
+          <yfs-record-item
+            v-for="item in payList.relations"
+            :key="item.id"
+            :item="item"
+            class="yfs-list-item"
+          />
+        </template>
+        <view v-else class="nodata">暂无抽赏记录</view>
+      </template>
+      <template v-else>
+        <yfs-record-item v-for="n in 10" :key="n" class="yfs-list-item" />
+      </template>
+    </view>
+    <view v-if="!isLogin" class="yfs-footer">
+      <view class="yfs-cd-bar">
+        <view class="yfs-cd-main">登录后可查看更多信息</view>
+      </view>
+      <view class="yfs-footer-main">
+        <button class="yfs-login-btn" @click="handleLogin"></button>
+      </view>
+    </view>
+    <view v-else class="yfs-footer">
+      <view
+        v-if="lineInfo.is_line_up && lineInfo.is_curr_user"
+        class="yfs-cd-bar"
+      >
+        <view class="yfs-cd-main">
+          {{ cdText }}<text class="yfs-cd-time">{{ cdTime }}</text>
+        </view>
+        <button class="yfs-cd-exit" @click="handleRemoveLine">退出队列</button>
+      </view>
+      <view v-else-if="lineInfo" class="yfs-cd-bar">
+        <view class="yfs-cd-main">
+          {{ lineInfo.msg || "" }}
+        </view>
+        <button
+          v-if="lineInfo.is_line_up"
+          class="yfs-cd-exit"
+          @click="handleRemoveLine"
+        >
+          退出队列
+        </button>
+      </view>
+      <!--  -->
+      <buy-btns
+        v-if="!lineInfo || !lineInfo.is_queue || lineInfo.is_curr_user"
+        class="yfs-footer-main"
+        :user-info="userInfo"
+        :buy-btns="computedBtns"
+        @login="handleUpdateUserInfo"
+        @click="handleBtnsClick"
+      ></buy-btns>
+      <view v-else class="yfs-footer-main">
+        <view class="yfs-queue-avatars">
+          <view v-if="lineInfo.images.length > 7" class="yfs-queue-more"
+            >···</view
+          >
+          <image
+            v-for="item in lineImages"
+            :key="item"
+            class="yfs-queue-avatar"
+            :src="item"
+          ></image>
+        </view>
+        <button
+          v-if="!lineInfo.is_line_up"
+          class="yfs-queue-btn"
+          @click="handleJoin"
+        >
+          我要排队
+        </button>
+        <button v-else class="yfs-queue-btn">排队中</button>
+      </view>
+    </view>
+    <view class="yfs-fixed-btns">
+      <button
+        v-if="
+          isLogin &&
+          lineInfo &&
+          lineInfo.queue_kuji_id !== '0' &&
+          lineInfo.queue_kuji_id !== lineInfo.kuji_id
+        "
+        class="yfs-fixed-btn"
+        @click="handleToId(lineInfo.queue_kuji_id)"
+      >
+        返回排队
+      </button>
+      <button class="yfs-fixed-btn" @click="refresh(true)">
+        <image
+          src="@/static/icon/icon-refresh.png"
+          :class="[
+            'yfs-icon-refresh',
+            {
+              'yfs-icon-refresh-anim': loading,
+            },
+          ]"
+        ></image
+        >刷新
+      </button>
+      <button
+        class="yfs-fixed-btn"
+        @click="handleToLink('/pages/order/unsend')"
+      >
+        寄存柜
+      </button>
+      <button class="yfs-fixed-btn" open-type="share">分享</button>
+    </view>
+    <uni-popup
+      ref="popup_rule"
+      type="center"
+      mask-background-color="rgba(0,0,0,0.8)"
+      :is-mask-click="true"
+    >
+      <view class="popup-wrap">
+        <view class="popup-content">
+          <view class="h1"><text>规则说明</text></view>
+          <view class="p" v-html="info.play_info || ''"></view>
+        </view>
+        <image
+          class="popup_close"
+          src="@/static/icon/icon-close.png"
+          @click="handlePopupClose('popup_rule')"
+        ></image>
+      </view>
+    </uni-popup>
+    <popup-img-detail ref="imgdetail" />
+    <paypop
+      v-if="info"
+      ref="paypop"
+      :title="info.name"
+      :img="info.img"
+      :detail-id="id"
+      :type="info && info.play_type ? info.play_type : 1"
+      :score-text="info.score_info"
+      :is-score="!!info.is_score"
+      :cd-text="cdText"
+      :cd-time="cdTime"
+      @paySuccess="handlePaySuccess"
+    />
+    <payresult
+      v-if="info"
+      ref="payresult"
+      :type="2"
+      :cd-text="cdText"
+      :cd-time="cdTime"
+      @buy="handleBuy"
+    />
+    <popup-dialog ref="popupDialog" />
+  </view>
+</template>
+
+<script>
+import Decimal from "decimal.js";
+import api from "@/lib/api/api";
+import login from "@/lib/utils/login";
+import yfsItem from "@/components/yfs-item/yfs-item.vue";
+import LevelItem from "@/components/level-item/level-item.vue";
+import yfsRecordItem from "@/components/yfs-record-item/yfs-record-item.vue";
+import yfsResultItem from "@/components/yfs-result-item/yfs-result-item.vue";
+import popupImgDetail from "@/components/popup-img-detail/popup-img-detail.vue";
+import popupDialog from "@/components/popup-dialog/popup-dialog.vue";
+import buyBtns from "@/components/buy-btns/buy-btns.vue";
+import {
+  reqSubMsg,
+  queueTemplateId,
+  reqAcceptSubMsgs,
+  defaultTemplateIds,
+} from "@/lib/utils/wxSubscribe";
+import paypop from "components/paypop/paypop.vue";
+import payresult from "components/payresult/payresult.vue";
+import jumpToUrl from "@/lib/utils/jumpToUrl";
+
+function resetLists() {
+  return {
+    all: {
+      title: "全部",
+      key: "all",
+      hasMore: true,
+      loading: false,
+      status: 0,
+      page: 1,
+      list: [],
+    },
+    ssr: {
+      title: "SSR/SP",
+      key: "ssr",
+      hasMore: true,
+      loading: false,
+      status: 1,
+      page: 1,
+      list: [],
+    },
+    sr: {
+      title: "SR",
+      key: "sr",
+      hasMore: true,
+      loading: false,
+      status: 2,
+      page: 1,
+      list: [],
+    },
+    r: {
+      title: "R",
+      key: "r",
+      hasMore: true,
+      loading: false,
+      status: 3,
+      page: 1,
+      list: [],
+    },
+    n: {
+      title: "N",
+      key: "n",
+      hasMore: true,
+      loading: false,
+      status: 4,
+      page: 1,
+      list: [],
+    },
+  };
+}
+
+export default {
+  name: "PageRewardDetail",
+  components: {
+    paypop,
+    yfsItem,
+    yfsRecordItem,
+    yfsResultItem,
+    popupImgDetail,
+    popupDialog,
+    buyBtns,
+    payresult,
+    LevelItem,
+  },
+  data() {
+    return {
+      userInfo: null,
+      info: null,
+      params: null,
+      payList: null,
+      lists: resetLists(),
+      lineInfo: null,
+      id: 0,
+      buyBtns: [
+        { num: 1, title: "买1发" },
+        { num: 3, title: "买3发" },
+        { num: 5, title: "买5发" },
+        { num: 0, title: "全收" },
+      ],
+      tabs: [
+        { title: "赠品一览", key: "list" },
+        { title: "抽赏记录", key: "record" },
+      ],
+      currentTab: "list",
+      loading: false,
+      serverOffsetTime: 0,
+      tiped: false,
+      expirateTime: 0,
+      cdText: "剩余抽赏时间",
+      currentFilter: "all",
+      wxsUsers: null,
+    };
+  },
+  computed: {
+    currentList() {
+      return this.lists[this.currentFilter];
+    },
+    listsArr() {
+      return Object.keys(this.lists).map((key) => this.lists[key]);
+    },
+    isLogin() {
+      return !!this.userInfo && !!this.userInfo.session;
+    },
+    progressStyle() {
+      if (!this.info) return `transform:translateX(-100%)`;
+
+      return `transform:translateX(-${
+        (this.info.curr_num / this.info.total_num) * 100
+      }%)`;
+    },
+    lineImages() {
+      if (!this.lineInfo || !this.lineInfo.images.length) return [];
+      const imgs = [...this.lineInfo.images];
+
+      if (imgs.length > 7) {
+        imgs.length = 6;
+      }
+      return imgs.reverse();
+    },
+    cdTime() {
+      if (
+        !this.lineInfo ||
+        !this.lineInfo.is_queue ||
+        !this.lineInfo.is_curr_user
+      ) {
+        return "";
+      }
+      let str = "";
+      const d = parseInt(this.expirateTime / 24 / 60 / 60);
+      const h = parseInt((this.expirateTime % (24 * 60 * 60)) / 60 / 60);
+      const m = parseInt((this.expirateTime % (60 * 60)) / 60);
+      const s = this.expirateTime % 60;
+
+      if (d) {
+        str += `${d}天`;
+      }
+      if (h) {
+        str += h < 10 ? `0${h}:` : `${h}:`;
+      }
+      str += m < 10 ? `0${m}:` : `${m}:`;
+      str += s < 10 ? `0${s}` : `${s}`;
+
+      return str;
+    },
+    computedBtns() {
+      if (!this.info || !this.info.show_price) return this.buyBtns;
+      const price = new Decimal(this.info.show_price);
+      return this.buyBtns.map((item) => {
+        const data =
+          item.num === 0 &&
+          this.info?.play_type !== 2 &&
+          this.info?.play_type !== 4
+            ? { num: 10, title: "买10发" }
+            : item;
+        return {
+          ...data,
+          price: price
+            .mul(data.num > 0 ? data.num : this.info.curr_num)
+            .toNumber(),
+        };
+      });
+    },
+  },
+  watch: {},
+  onLoad(data) {
+    this.params = data;
+    this.id = data.id;
+    const uinfoStr = uni.getStorageSync("userinfo");
+    if (uinfoStr) {
+      this.userInfo = JSON.parse(uinfoStr);
+    }
+    this.refresh();
+  },
+  onShow() {
+    reqAcceptSubMsgs(defaultTemplateIds);
+  },
+  onUnload() {
+    clearTimeout(this.timer);
+  },
+  onShareAppMessage() {
+    return {
+      title:
+        this.info?.name ||
+        "各种爆款手办/盲盒,还能0元抽热款~快来试试你的欧气!",
+      imageUrl:
+        this.info?.img ||
+        "https://chujianchaowan.oss-cn-beijing.aliyuncs.com/images/45bfb688e6e9dba557f64fd052e850cc.png",
+      path: "/pages/reward/detail?id=" + this.id,
+    };
+  },
+  onShareTimeline() {
+    return {
+      title:
+        this.info?.name ||
+        "各种爆款手办/盲盒,还能0元抽热款~快来试试你的欧气!",
+      imageUrl:
+        this.info?.img ||
+        "https://chujianchaowan.oss-cn-beijing.aliyuncs.com/images/45bfb688e6e9dba557f64fd052e850cc.png",
+      path: "/pages/reward/detail?id=" + this.id,
+    };
+  },
+  methods: {
+    delay(duration = 10000) {
+      return new Promise((resolve) => {
+        setTimeout(resolve, duration);
+      });
+    },
+    stopCd() {
+      this.serverOffsetTime = 0;
+      clearTimeout(this.timer);
+      // #ifdef MP-WEIXIN
+      wx.disableAlertBeforeUnload && wx.disableAlertBeforeUnload();
+      // #endif
+    },
+    runCd() {
+      clearTimeout(this.timer);
+      this.expirateTime =
+        this.lineInfo.expirate_time -
+        Math.round(Date.now() / 1000) +
+        this.serverOffsetTime;
+
+      if (this.expirateTime <= 0) {
+        return;
+      }
+      // #ifdef MP-WEIXIN
+      wx.enableAlertBeforeUnload &&
+        wx.enableAlertBeforeUnload({
+          message: "您正在购买中,确定要退出吗?",
+        });
+      // #endif
+      this.timer = setTimeout(() => {
+        this.expirateTime = Math.max(
+          this.lineInfo.expirate_time -
+            Math.round(Date.now() / 1000) +
+            this.serverOffsetTime,
+          0
+        );
+
+        if (this.expirateTime <= 10 && !this.tiped) {
+          this.tiped = true;
+          uni.showToast({
+            icon: "none",
+            title: "您剩余购买时间不足10秒,超出时间后购买会有被截胡风险。",
+            duration: 2e3,
+          });
+        }
+        if (this.expirateTime > 0) {
+          this.runCd();
+        } else {
+          this.getLineUp();
+          if (this.$refs.paypop) {
+            this.$refs.paypop.closeAll();
+          }
+          uni.showToast({
+            icon: "none",
+            title: "当前排队结束",
+            duration: 2e3,
+          });
+        }
+      }, 1000);
+    },
+    loopQueue() {
+      if (
+        !this.lineInfo ||
+        !this.lineInfo.is_queue ||
+        !this.lineInfo.is_line_up ||
+        (this.lineInfo.is_line_up && this.lineInfo.is_curr_user)
+      ) {
+        return;
+      }
+
+      clearTimeout(this.queueTimer);
+
+      this.queueTimer = setTimeout(() => {
+        this.getLineUp();
+      }, 3000);
+    },
+    handleTabClick(key) {
+      if (this.currentTab === key) return;
+
+      this.currentTab = key;
+      this.handleTagClick("all");
+    },
+    handleTagClick(key) {
+      const item = this.lists[key];
+      if (!item) return;
+      if (this.currentFilter === key) {
+        return;
+      }
+      this.currentFilter = key;
+      if (item.list.length === 0 && item.hasMore) {
+        this.getYfsPlayList(item);
+      }
+    },
+    async refresh(useLoading = false) {
+      if (this.loading && useLoading) return;
+      this.loading = true;
+      try {
+        await Promise.all([
+          this.getDetail(),
+          this.getLineUp(),
+          this.delay(800),
+        ]);
+        if (this.info.play_type === 3) {
+          this.lists = resetLists();
+          this.getWxsUsers();
+        }
+        await this.getPayList();
+      } catch (e) {
+        console.log(e);
+      }
+      this.loading = false;
+    },
+    async getDetail() {
+      // const data = await api.getYfsDetail(this.id);
+      const data = await api.getDetail(this.id, this.userInfo?.session || "");
+
+      if (data.errno === 10000) {
+        this.info = data.data;
+        uni.setNavigationBarTitle({
+          title: data.data.name,
+        });
+      }
+    },
+    // async getPayList() {
+    //   const data = await api.getYfsPayList(this.id);
+    //   if (data.errno === 10000) {
+    //     this.payList = data.data;
+    //   }
+    // },
+    async getPayList() {
+      return this.info.play_type === 3
+        ? this.getYfsPlayList(this.currentList)
+        : this.getDefaultPlayList();
+    },
+    async getDefaultPlayList() {
+      const data = await api.getYfsPayList(this.id);
+      if (data.errno === 10000) {
+        this.payList = data.data;
+      }
+    },
+    async getYfsPlayList(item) {
+      item.loading = true;
+      try {
+        const params = {
+          status: item.status,
+          session: this.userInfo?.session || "",
+          lastId:
+            item.page > 1 && item.list && item.list.length
+              ? item.list[item.list.length - 1].id
+              : 0,
+        };
+
+        const data = await api.getFudaiPayList(this.id, params);
+        if (item.page === 1) {
+          item.list = data.data.relations;
+        } else {
+          item.list = item.list.concat(data.data.relations);
+        }
+
+        item.hasMore = item.page * 20 < data.total;
+        item.page++;
+      } catch (e) {
+        console.log(e);
+      }
+      item.loading = false;
+    },
+    async getWxsUsers() {
+      const data = await api.getWxsUsers(this.id);
+      if (data.errno === 10000) {
+        this.wxsUsers = data;
+      } else {
+        this.wxsUsers = null;
+      }
+    },
+    async getLineUp() {
+      if (!this.userInfo || !this.userInfo.session) {
+        this.lineInfo = null;
+        return;
+      }
+      const data = await api.getLineUp(this.id, this.userInfo.session);
+      if (data.errno === 10000) {
+        const oldLineInfo = this.lineInfo ? { ...this.lineInfo } : null;
+        this.lineInfo = data.data;
+
+        this.tiped = false;
+        if (data.data.is_queue && data.data.is_curr_user) {
+          const now = Math.round(Date.now() / 1000);
+          this.serverOffsetTime = now - data.data.curr_time;
+          this.runCd();
+          if (!oldLineInfo || !oldLineInfo.is_curr_user) {
+            await this.getDetail();
+            this.getPayList();
+          }
+        } else {
+          this.stopCd();
+          this.loopQueue();
+        }
+      } else {
+        this.lineInfo = null;
+        this.stopCd();
+      }
+    },
+    async handleRemoveLine() {
+      const data = await api.removeLineUp({
+        session: this.userInfo.session,
+        kuji_id: this.id,
+      });
+
+      if (data.errno === 10000) {
+        await this.getLineUp();
+      } else {
+        uni.showToast({
+          icon: "none",
+          title: data.errmsg || "退出失败,请重试~",
+          duration: 2e3,
+        });
+      }
+    },
+    async handleJoin() {
+      const hasQueue =
+        this.lineInfo.queue_kuji_id &&
+        this.lineInfo.queue_kuji_id !== "0" &&
+        this.lineInfo.queue_kuji_id !== this.id;
+
+      if (hasQueue) {
+        const confirm = await this.$refs.popupDialog
+          .open("您在其它一番赏有排队,点击确认将退出其它队列")
+          .then(() => true)
+          .catch(() => false);
+        if (!confirm) return;
+      }
+      await reqSubMsg(queueTemplateId).catch((e) => console.log(e));
+
+      const data = await api.addLineUp({
+        session: this.userInfo.session,
+        kuji_id: this.id,
+        status: hasQueue ? "1" : "0",
+      });
+
+      if (data.errno === 10000 || data.errno === 10002) {
+        await this.getLineUp();
+      } else {
+        uni.showToast({
+          icon: "none",
+          title: data.errmsg || "加入失败,请重试~",
+          duration: 2e3,
+        });
+      }
+    },
+    handleToId(id) {
+      if (!id) return;
+      this.id = id;
+      this.refresh();
+    },
+    handleLogin() {
+      uni.showLoading({
+        title: "加载中",
+        mask: true,
+      });
+      return login.wxLogin((userInfo) => {
+        this.userInfo = userInfo;
+        const msg =
+          userInfo.coupons && userInfo.coupons.is_bind_coupon === 1
+            ? userInfo.coupons.is_bind_info
+            : "";
+
+        this.refresh().finally(() => {
+          uni.hideLoading();
+          if (msg) {
+            uni.showToast({
+              icon: "none",
+              title: msg || "登录成功~",
+              duration: 2e3,
+            });
+          }
+        });
+      });
+    },
+    async handleBuy(num, useLoading = true) {
+      if (this.info.is_end) {
+        uni.showToast({
+          icon: "none",
+          title: "当前赏箱已抽完,请换箱购买",
+          duration: 2e3,
+        });
+        return;
+      }
+      if (this.info.total_num > 0 && this.info.curr_num < num) {
+        uni.showToast({
+          icon: "none",
+          title: " 当前赏箱数量不足,请减少购买数量",
+          duration: 2e3,
+        });
+        return;
+      }
+      const n = !num ? this.info.curr_num : num;
+      const originPrice = new Decimal(this.info.show_price).mul(n).toNumber();
+      this.$refs.paypop.buy(n, originPrice, useLoading);
+    },
+    handlePopupShow(popup_ref) {
+      this.$refs[popup_ref].open();
+    },
+    handlePopupClose(popup_ref) {
+      this.$refs[popup_ref].close();
+    },
+    handlePaySuccess(data) {
+      this.refresh();
+      if (this.$refs.payresult) {
+        this.$refs.payresult.open(data);
+      } else {
+        uni.showToast({
+          icon: "success",
+          title: "购买成功",
+          duration: 2e3,
+        });
+      }
+    },
+    handleUpdateUserInfo(data, item, useLoading = true) {
+      this.userInfo = data;
+      if (item) {
+        this.handleBuy(item.num, useLoading);
+      }
+    },
+    handleBtnsClick(item) {
+      this.handleBuy(item.num);
+    },
+    handleShowImages(item) {
+      this.$refs.imgdetail.open({
+        title: item.name,
+        list: item.long_img ? item.long_img : [item.big_img],
+      });
+    },
+    handleToLink(url) {
+      jumpToUrl(url);
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+@import "./detail.scss";
+</style>

+ 67 - 0
src/pages/reward/index.scss

@@ -0,0 +1,67 @@
+.minscreen {
+  min-height: 100vh;
+  background: #f5f5f5;
+}
+.reward-home {
+  .fill-title-wrap {
+    height: 88rpx;
+  }
+  .fill-title {
+    box-sizing: border-box;
+    width: 100%;
+    display: flex;
+    justify-content: space-between;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: #292d3b;
+    height: 88rpx;
+    padding: 0 24rpx;
+    line-height: 88rpx;
+    .icon-sort {
+      width: 28rpx;
+      height: 28rpx;
+      margin-left: 2rpx;
+    }
+    .fill-item {
+      display: flex;
+      align-items: center;
+      &.white {
+        color: #fff;
+      }
+    }
+  }
+  .home-titlebar {
+    background-color: #08c2c3;
+  }
+  .home-titlebar-fix {
+    position: fixed;
+    left: 0;
+    top: 0;
+    z-index: 9;
+  }
+
+  .footer {
+    width: 100%;
+    margin-top: 24rpx;
+    margin-bottom: 22rpx;
+
+    .info {
+      height: 40rpx;
+      font-size: 28rpx;
+      font-weight: 500;
+      color: #999999;
+      line-height: 40rpx;
+      text-align: center;
+    }
+
+    .contact {
+      margin-top: 8rpx;
+      height: 40rpx;
+      font-size: 28rpx;
+      font-weight: 500;
+      color: #999999;
+      line-height: 40rpx;
+      text-align: center;
+    }
+  }
+}

+ 228 - 0
src/pages/reward/index.vue

@@ -0,0 +1,228 @@
+<template>
+  <view class="reward-home minscreen">
+    <view class="fill-title-wrap">
+      <view :class="['fill-title', 'home-titlebar', 'home-titlebar-fix']">
+        <view
+          v-for="item in listsArr"
+          :key="item.key"
+          :class="['fill-item', { white: currentList.key === item.key }]"
+          @click="handleTabClick(item.key)"
+        >
+          <text>{{ item.title }}</text
+          ><template v-if="item.order">
+            <image
+              v-if="currentList.key !== item.key"
+              class="icon-sort"
+              src="@/static/icon/icon-sort.png"
+            ></image>
+            <image
+              v-else-if="item.query.order === 'asc'"
+              class="icon-sort"
+              src="@/static/icon/icon-sort-asc.png"
+            ></image>
+            <image
+              v-else-if="item.query.order === 'desc'"
+              class="icon-sort"
+              src="@/static/icon/icon-sort-desc.png"
+            ></image>
+          </template>
+        </view>
+      </view>
+    </view>
+    <view
+      v-if="currentList.list.length === 0 && currentList.loading"
+      class="base-list"
+    >
+      <list-item v-for="item in 10" :key="item" class="base-list-item">
+      </list-item>
+    </view>
+    <view v-else class="base-list">
+      <list-item
+        v-for="item in currentList.list"
+        :key="item.id"
+        :item="item"
+        class="base-list-item"
+        @click="handleDetail(item.id)"
+      >
+      </list-item>
+    </view>
+    <view v-if="!currentList.loading && !currentList.hasMore" class="footer">
+      <view class="info">到底啦~ ( ̄▽ ̄)”</view>
+    </view>
+  </view>
+</template>
+
+<script>
+import api from "@/lib/api/api";
+import listItem from "@/components/list-item/list-item.vue";
+
+function resetLists() {
+  return {
+    sort: {
+      title: "默认",
+      key: "sort",
+      hasMore: true,
+      loading: false,
+      order: false,
+      query: {
+        page: 1,
+        size: 20,
+        sort: "sort", // 排序字段:默认:sort倒序;热销:销量倒序sell_count;新品:创建时间倒序create_time;价格:price升降序
+        order: "desc",
+      },
+      list: [],
+    },
+    sellCount: {
+      title: "热销",
+      key: "sellCount",
+      hasMore: true,
+      loading: false,
+      order: false,
+      query: {
+        page: 1,
+        size: 20,
+        sort: "sell_count", // 排序字段:默认:sort倒序;热销:销量倒序sell_count;新品:创建时间倒序create_time;价格:price升降序
+        order: "desc",
+      },
+      list: [],
+    },
+    createTime: {
+      title: "新品",
+      key: "createTime",
+      hasMore: true,
+      loading: false,
+      order: false,
+      query: {
+        page: 1,
+        size: 20,
+        sort: "create_time", // 排序字段:默认:sort倒序;热销:销量倒序sell_count;新品:创建时间倒序create_time;价格:price升降序
+        order: "desc",
+      },
+      list: [],
+    },
+    price: {
+      title: "价格",
+      key: "price",
+      hasMore: true,
+      loading: false,
+      order: true,
+      query: {
+        page: 1,
+        size: 20,
+        sort: "price", // 排序字段:默认:sort倒序;热销:销量倒序sell_count;新品:创建时间倒序create_time;价格:price升降序
+        order: "desc",
+      },
+      list: [],
+    },
+  };
+}
+
+export default {
+  name: "PageReward",
+  components: {
+    listItem,
+  },
+  data() {
+    return {
+      lists: resetLists(),
+      currentTab: "sort",
+      loading: false,
+    };
+  },
+  computed: {
+    currentList() {
+      return this.lists[this.currentTab];
+    },
+    listsArr() {
+      return Object.keys(this.lists).map((key) => this.lists[key]);
+    },
+  },
+  watch: {},
+  onLoad() {
+    uni.showLoading({
+      title: "加载中",
+    });
+    this.loadList(this.currentList).then(() => {
+      uni.hideLoading();
+    });
+  },
+  onShareAppMessage() {
+    return {
+      title: "各种爆款手办/盲盒,还能0元抽热款~快来试试你的欧气!",
+      imageUrl:
+        "https://chujianchaowan.oss-cn-beijing.aliyuncs.com/images/45bfb688e6e9dba557f64fd052e850cc.png",
+      path: "/pages/reward/index",
+    };
+  },
+  onShareTimeline() {
+    return {
+      title: "各种爆款手办/盲盒,还能0元抽热款~快来试试你的欧气!",
+      imageUrl:
+        "https://chujianchaowan.oss-cn-beijing.aliyuncs.com/images/45bfb688e6e9dba557f64fd052e850cc.png",
+      path: "/pages/reward/index",
+    };
+  },
+  async onPullDownRefresh() {
+    this.lists = resetLists();
+    await this.loadList(this.currentList);
+    uni.stopPullDownRefresh();
+  },
+  onReachBottom() {
+    if (!this.currentList.loading && this.currentList.hasMore) {
+      this.loadList(this.currentList);
+    }
+  },
+  methods: {
+    handleTabClick(key) {
+      const item = this.lists[key];
+      if (!item) return;
+      if (this.currentTab === key) {
+        if (!item.order) {
+          return;
+        }
+        item.hasMore = true;
+        item.query.page = 1;
+        item.query.order = item.query.order === "desc" ? "asc" : "desc";
+        return this.loadList(item);
+      }
+      this.currentTab = key;
+      if (item.list.length === 0 && item.hasMore) {
+        this.loadList(item);
+      }
+    },
+    async loadList(item) {
+      item.loading = true;
+      try {
+        const params = item.query;
+        if (item.query.page > 1 && item.list && item.list.length) {
+          params.lastId = item.list[item.list.length - 1].id;
+        } else {
+          params.lastId = 0;
+        }
+        // const data = await api.homeList(item.query);
+        const data = await api.getYfsList(item.query);
+        if (item.query.page === 1) {
+          item.list = data.data;
+        } else {
+          item.list = item.list.concat(data.data);
+        }
+
+        item.hasMore = item.query.page * item.query.size < data.total;
+        item.query.page++;
+      } catch (e) {
+        console.log(e);
+      }
+      item.loading = false;
+    },
+    handleDetail(id) {
+      uni.navigateTo({
+        url: `./detail?id=${id}`,
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+@import "./index.scss";
+</style>

+ 98 - 0
src/pages/rule/rule.vue

@@ -0,0 +1,98 @@
+<template>
+  <view
+    class="content"
+    :style="'height:' + (datas.length > 10 ? '' : '100vh') + ';'"
+  >
+    <view class="top">抽赏规则</view>
+    <view class="top1"
+      >1.在一番赏里,每期主题的一番赏产品都会构成一个赏池,每个赏池包含若干个赏箱。“A
+      赏”“B 赏”“C 赏”“D 赏”等是对商品的命名方式,代表不同价值的商品。A 赏 B 赏
+      一般是价值更高的商品,每 1 次抽赏可随机抽到 ABCDEFG 赏中的一个赏。</view
+    >
+    <view class="top1"
+      >2.在赏池里,“最终赏”是最后一个购买商品用户(以系统记录为准)额外获得的。如您买到最后一个商品,您也会额外得到最终赏,即您将拥有
+      2 个商品。</view
+    >
+    <view class="top1"
+      >3.
+      “一番赏”为计算机软件开赏游戏体验类产品,符合《中华人民共和国消费者权益保护法》第三章,第二十五条,第(三)细则的要求,一经售出不支持退货,请根据个人真实、理性的购买需求进行次一番赏产品的购买。</view
+    >
+    <view class="top1"
+      >4.当有其他用户购买选择时,系统都有可能进入排队页面,请耐心等待。</view
+    >
+    <view class="top1"
+      >5.点击“确认支付”后,支付对应款项,等待弹出商品结果。如果您在支付页面停留时间过久,订单可能会自动取消,由于我们无法拦截微信支付的最后一步,所以钱款可能会支付出去,但系统在第一时间会自动退款,如因支付超时造成购买失败,平台概不负责。</view
+    >
+    <view class="top1"
+      >6.当用户滥用功能发起恶意排队,并干扰其他用户正常购买时(例如频繁发起全收,但不支付订单),为了保证更多买家权益及平台秩序,平台有权采取对其帐号进行限制使用部分功能、长期封号等措施。若对处理有疑义,可联系客服进行申诉。</view
+    >
+    <view class="top">发货说明</view>
+    <view class="top1"
+      >1.购买获得的商品将自动进入待发货页面。点击“发货”后,确认收货地址无误,邮费会根据页面提示的规则进行计算。因地址填错或其他个人原因导致的损失由您自行承担。</view
+    >
+    <view class="top1"
+      >2.预收款若遇到特殊情况导致发货延迟,平台将如实告知,请用户耐心等待。一番赏商品非工艺品,难免存在工艺瑕疵,溢色,掉漆等问题,请您悉知后谨慎考虑购买。</view
+    >
+    <view class="top1">3.如有其他问题,请联系一番赏页面上展现的客服微信。</view>
+    <request-loading ref="message"></request-loading>
+  </view>
+</template>
+
+<script>
+export default {
+  name: "PageRule",
+  data() {
+    return {
+      title: "Hello",
+      datas: [{}, {}],
+    };
+  },
+  methods: {},
+};
+</script>
+
+<style>
+image {
+  height: inherit;
+  width: inherit;
+}
+
+.content {
+  align-items: flex-start;
+  display: flex;
+  flex-direction: column;
+  width: 750rpx;
+}
+
+.top {
+  color: #333;
+  font-size: 30rpx;
+  line-height: 32rpx;
+  margin-top: 48rpx;
+}
+
+.top1,
+.top {
+  display: inline-block;
+  font-family: PingFangSC-Medium;
+  margin-left: 32rpx;
+  width: 686rpx;
+}
+
+.top1 {
+  color: #666;
+  font-size: 28rpx;
+  line-height: 42rpx;
+  margin-top: 16rpx;
+}
+
+.img {
+  background: #d8d8d8;
+  border-radius: 16rpx;
+  display: inline-block;
+  height: 291rpx;
+  margin-left: 32rpx;
+  margin-top: 24rpx;
+  width: 686rpx;
+}
+</style>

+ 484 - 0
src/pages/task/index.vue

@@ -0,0 +1,484 @@
+<template>
+  <view class="task-page">
+    <view class="task-header">
+      <view class="task-header-title"
+        >我的积分<text class="big">{{
+          (singInfo && singInfo.total_score) || 0
+        }}</text></view
+      >
+      <view class="task-header-desc">每日签到做任务可领取积分</view>
+      <image
+        src="@/static/task/icon-help.png"
+        class="invite-icon"
+        @tap="$refs.popup_info.open()"
+      ></image>
+    </view>
+    <view class="task-box">
+      <view class="task-box-title">签到得积分</view>
+      <template v-if="userInfo && singInfo">
+        <view class="task-days">
+          <view
+            v-for="item in singInfo.data"
+            :key="item.date"
+            :class="['task-day', { 'task-day-active': !!item.is_signin }]"
+          >
+            <view class="task-day-integral">{{ item.score }}</view>
+            {{ item.day_name }}
+          </view>
+        </view>
+        <button class="task-days-btn" @click="handleSing">
+          {{ singInfo.is_current_signin ? "今日已签到" : "立即签到" }}
+        </button>
+      </template>
+      <button v-else class="task-days-btn" @click="handleSing">
+        登录签到领积分
+      </button>
+    </view>
+    <view class="task-box">
+      <view class="task-box-title">每日任务得积分</view>
+      <view v-if="userInfo && singInfo" class="task-list">
+        <view
+          v-for="item in singInfo.task"
+          :key="item.task_id"
+          class="task-item"
+        >
+          <image
+            v-if="item.type === 2"
+            class="task-item-icon"
+            src="../../static/task/icon-video.png"
+          />
+          <image
+            v-else
+            class="task-item-icon"
+            src="../../static/task/icon-money.png"
+          />
+          <view class="task-item-body">
+            <view class="task-item-title"
+              >{{ item.name
+              }}<text class="task-item-label"
+                >{{ item.symbol }}{{ item.score }}{{ item.unit }}</text
+              ></view
+            >
+            <view v-if="item.type !== 2" class="task-item-desc"
+              >完成 {{ item.finish }}/{{ item.total }}</view
+            >
+          </view>
+          <button
+            v-if="item.status === 1"
+            class="task-item-btn receive"
+            @click="handleReceive(item)"
+          >
+            去领取
+          </button>
+          <button v-else-if="item.status === 2" class="task-item-btn disabled">
+            已完成
+          </button>
+          <button v-else class="task-item-btn" @click="handleDoTask(item)">
+            去完成
+          </button>
+        </view>
+      </view>
+    </view>
+    <uni-popup
+      ref="popup_info"
+      type="center"
+      mask-background-color="rgba(0,0,0,0.8)"
+      :is-mask-click="true"
+    >
+      <view class="popup-wrap">
+        <view class="popup-content">
+          <view class="h1"><text>积分规则</text></view>
+          <view class="p" v-html="singInfo.score_info || ''"></view>
+        </view>
+        <image
+          class="popup_close"
+          src="@/static/icon/icon-close.png"
+          @click="$refs.popup_info.close()"
+        ></image>
+      </view>
+    </uni-popup>
+  </view>
+</template>
+
+<script>
+import api from "@/lib/api/api";
+import login from "@/lib/utils/login";
+import createShowRewardedVideoAd from "@/lib/utils/showRewardedVideoAd";
+import {
+  requestSubscribeMessage,
+  defaultTemplateIds,
+} from "@/lib/utils/wxSubscribe";
+
+export default {
+  name: "PageTask",
+  data() {
+    return {
+      userInfo: null,
+      singInfo: null,
+    };
+  },
+
+  onShow() {
+    const uinfoStr = uni.getStorageSync("userinfo");
+    if (uinfoStr) {
+      this.userInfo = JSON.parse(uinfoStr);
+      this.getTaskInfo();
+    }
+  },
+
+  methods: {
+    async handleShowAd(item) {
+      if (!this.showRewardedVideoAd) {
+        this.showRewardedVideoAd = createShowRewardedVideoAd();
+      }
+      try {
+        const res = await this.showRewardedVideoAd();
+
+        if (res && res.isEnded) {
+          this.adComplete(item);
+        }
+      } catch (e) {
+        uni.showToast({
+          icon: "none",
+          title: e?.errMsg || "广告播放失败",
+          duration: 2e3,
+          mask: true,
+        });
+      }
+    },
+
+    async handleSing() {
+      if (!this.userInfo || !this.userInfo.session) {
+        await this.login();
+      }
+      if (this.singInfo.is_current_signin) {
+        uni.showToast({
+          icon: "none",
+          title: "今日已签到",
+          duration: 2e3,
+          mask: true,
+        });
+        return;
+      }
+      try {
+        // #ifdef MP-WEIXIN
+        await requestSubscribeMessage(defaultTemplateIds).catch(() => void 0);
+        // #endif
+
+        const data = await api.userNewSingIn({
+          session: this.userInfo.session,
+        });
+        this.singInfo = { ...this.singInfo, ...data };
+
+        if (data.errno === 10000) {
+          uni.showToast({
+            icon: "success",
+            title: "签到成功",
+            duration: 2e3,
+            mask: true,
+          });
+        } else {
+          uni.showToast({
+            icon: "none",
+            title: data.errmsg || "签到失败,请重试",
+            duration: 2e3,
+            mask: true,
+          });
+        }
+      } catch (e) {
+        uni.showToast({
+          icon: "none",
+          title: "签到失败,请重试",
+          duration: 2e3,
+          mask: true,
+        });
+      }
+    },
+
+    async getTaskInfo() {
+      if (!this.userInfo.session) {
+        return Promise.reject();
+      }
+      const data = await api.getTaskInfo(this.userInfo.session);
+      data.task = (data.task || []).sort((a, b) => a.sort - b.sort);
+      this.singInfo = data;
+    },
+    login() {
+      return new Promise((resolve, reject) => {
+        login.wxLogin(async (userInfo) => {
+          if (userInfo.session) {
+            this.userInfo = userInfo;
+            if (userInfo.coupons && userInfo.coupons.is_bind_coupon === 1) {
+              uni.showToast({
+                icon: "none",
+                title: userInfo.coupons.is_bind_info || "登录成功~",
+                duration: 2e3,
+                mask: true,
+              });
+              await this.getTaskInfo();
+
+              resolve();
+            } else {
+              resolve();
+            }
+          } else reject();
+        });
+      });
+    },
+    async adComplete(item) {
+      try {
+        const data = await api.setAdTask({
+          session: this.userInfo.session,
+          task_id: `${item.task_id}`,
+        });
+        if (data.errno === 10000) {
+          this.handleReceive(item);
+        } else {
+          uni.showToast({
+            icon: "none",
+            title: data.errmsg || "领取失败",
+            duration: 2e3,
+            mask: true,
+          });
+        }
+      } catch (e) {
+        uni.showToast({
+          icon: "none",
+          title: "领取失败",
+          duration: 2e3,
+          mask: true,
+        });
+      }
+    },
+    handleDoTask(item) {
+      if (item.type === 2) {
+        this.handleShowAd(item);
+      } else {
+        uni.switchTab({
+          url: "/pages/index/index",
+        });
+      }
+    },
+    async handleReceive(item) {
+      uni.showLoading({ title: "领取中", mask: true });
+      try {
+        const data = await api.getTaskScore({
+          session: this.userInfo.session,
+          task_id: `${item.task_id}`,
+        });
+        uni.hideLoading();
+        if (data.errno === 10000) {
+          data.task = (data.task || []).sort((a, b) => a.sort - b.sort);
+          this.singInfo = {
+            ...this.singInfo,
+            ...data,
+          };
+          uni.showToast({
+            icon: "success",
+            title: "领取成功",
+            duration: 2e3,
+            mask: true,
+          });
+        } else {
+          uni.showToast({
+            icon: "none",
+            title: data.errmsg || "领取失败",
+            duration: 2e3,
+            mask: true,
+          });
+        }
+      } catch (e) {
+        uni.hideLoading();
+      }
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+.task-page {
+  width: 100%;
+  overflow: hidden;
+  background: #f6f6f6;
+  min-height: 100vh;
+
+  .task-header {
+    box-sizing: border-box;
+    width: 830rpx;
+    padding: 32rpx 100rpx 148rpx;
+    margin-left: -40rpx;
+    margin-bottom: -106rpx;
+    background: #30303a;
+    border-radius: 0 0 148rpx 148rpx;
+    box-shadow: 0 0 50rpx rgba($color: #fff, $alpha: 1);
+    .task-header-title {
+      font-size: 30rpx;
+      font-weight: 500;
+      color: #ffffff;
+      line-height: 52rpx;
+      .big {
+        font-size: 44rpx;
+        font-weight: bold;
+        color: #08c2c3;
+        margin-left: 10rpx;
+      }
+    }
+    .task-header-desc {
+      font-size: 24rpx;
+      color: #d1d1d1;
+      line-height: 28rpx;
+    }
+    .invite-icon {
+      position: absolute;
+      width: 36rpx;
+      height: 36rpx;
+      right: 36rpx;
+      top: 44rpx;
+      cursor: pointer;
+    }
+  }
+  .task-box {
+    width: 690rpx;
+    background: #ffffff;
+    margin: 0 auto 20rpx;
+    padding: 30rpx;
+    box-sizing: border-box;
+  }
+  .task-box-title {
+    height: 54rpx;
+    font-size: 42rpx;
+    font-family: ysbth;
+    color: #000000;
+    line-height: 54rpx;
+    margin-bottom: 12rpx;
+  }
+  .task-days {
+    display: flex;
+    justify-content: space-between;
+    padding-top: 50rpx;
+    .task-day {
+      width: 94rpx;
+      height: 96rpx;
+      border-radius: 8rpx;
+      background: #f9f9f9;
+      font-size: 20rpx;
+      color: #888888;
+      line-height: 23rpx;
+      text-align: center;
+      box-shadow: inset 0 0 2rpx rgba($color: #000000, $alpha: 0.15);
+
+      .task-day-integral {
+        margin: -28rpx auto 14rpx;
+        width: 68rpx;
+        height: 68rpx;
+        background: url(../../static/task/icon-sign.png) no-repeat;
+        background-size: contain;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+
+        font-size: 30rpx;
+        font-family: Helvetica Neue-Bold, Helvetica Neue;
+        font-weight: bold;
+        color: #ffffff;
+        line-height: 35rpx;
+      }
+      &.task-day-active {
+        background: linear-gradient(180deg, #fffceb 0%, #fffaf0 100%);
+        color: #f2ab24;
+        .task-day-integral {
+          background-image: url(../../static/task/icon-signed.png);
+          color: #ffffe2;
+          text-shadow: 0px 0px 2rpx #c18214;
+        }
+      }
+    }
+  }
+  .task-days-btn {
+    &::after {
+      display: none;
+    }
+    width: 630rpx;
+    height: 92rpx;
+    background: url(../../static/task/btn.png) no-repeat;
+    background-size: contain;
+    font-size: 32rpx;
+    font-weight: bold;
+    color: #292d3b;
+    line-height: 38rpx;
+    line-height: 92rpx;
+    text-align: center;
+    margin: 34rpx auto 0;
+  }
+  .task-list {
+    .task-item {
+      padding: 30rpx 0;
+      display: flex;
+      border-bottom: 2rpx solid #f5f5f5;
+      align-items: center;
+      &:last-child {
+        border-bottom: 0;
+        padding-bottom: 0;
+      }
+      .task-item-icon {
+        width: 80rpx;
+        height: 80rpx;
+        margin-right: 26rpx;
+      }
+      .task-item-btn {
+        box-sizing: border-box;
+        width: 130rpx;
+        height: 56rpx;
+        background: #08c2c3;
+        margin-left: 26rpx;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        font-size: 24rpx;
+        font-weight: 600;
+        color: #292d3b;
+        line-height: 28rpx;
+        border-radius: 0;
+        padding: 0;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        &::after {
+          display: none;
+        }
+        &.receive {
+          background: #ffffff;
+          border: 2rpx solid #22c8c9;
+          color: #22c8c9;
+        }
+        &.disabled {
+          background: #c8c8c8;
+          color: #ffffff;
+        }
+      }
+      .task-item-body {
+        flex: 1;
+        width: 0;
+      }
+      .task-item-title {
+        height: 40rpx;
+        font-size: 28rpx;
+        font-weight: 500;
+        color: #000000;
+        line-height: 40rpx;
+      }
+      .task-item-label {
+        margin-left: 16rpx;
+        color: #17c6c7;
+      }
+      .task-item-desc {
+        height: 34rpx;
+        font-size: 24rpx;
+        font-weight: 400;
+        color: #888888;
+        line-height: 34rpx;
+      }
+    }
+  }
+}
+</style>

+ 24 - 0
src/pages/webview/webview.vue

@@ -0,0 +1,24 @@
+<template>
+  <web-view :webview-styles="webviewStyles" :src="url"></web-view>
+</template>
+
+<script>
+export default {
+  name: "PageWebview",
+  data() {
+    return {
+      url: "",
+      webviewStyles: {
+        progress: {
+          color: "#FF3333",
+        },
+      },
+    };
+  },
+  onLoad(query) {
+    this.url = decodeURIComponent(query.url);
+  },
+};
+</script>
+
+<style lang="scss"></style>

BIN
src/static/activity/label-end.png


BIN
src/static/activity/label-notstarted.png


BIN
src/static/activity/label-progress.png


BIN
src/static/app-icon.png


BIN
src/static/bullet/avatar-R.png


BIN
src/static/bullet/avatar-SP.png


BIN
src/static/bullet/avatar-SR.png


BIN
src/static/bullet/avatar-SSR.png


Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно