Browse Source

chore(nuxt): 项目转移到nuxt

曾志翔 3 years ago
parent
commit
da96162f9c
100 changed files with 47136 additions and 266 deletions
  1. 19 0
      .env.development
  2. 4 0
      .env.production
  3. 5 0
      .env.staging
  4. 6 0
      .env.test
  5. 4 0
      .eslintignore
  6. 10 2
      .eslintrc.js
  7. 86 10
      .gitignore
  8. 0 5
      .idea/.gitignore
  9. 0 12
      .idea/android-cloud-H5.iml
  10. 0 6
      .idea/misc.xml
  11. 0 8
      .idea/modules.xml
  12. 0 6
      .idea/vcs.xml
  13. 97 0
      .prettierignore
  14. 4 0
      .stylelintignore
  15. 0 15
      .vscode/launch.json
  16. 84 0
      README.md
  17. 11 0
      api/activity/invite-user.js
  18. 5 0
      api/message/phone.js
  19. 11 0
      api/public/agreement.js
  20. 9 0
      api/user/client.js
  21. 12 0
      api/wx/index.js
  22. BIN
      assets/image/activity/invite-user/bg@2x.png
  23. BIN
      assets/image/activity/invite-user/box@2x.png
  24. BIN
      assets/image/activity/invite-user/cybz-content@2x.png
  25. BIN
      assets/image/activity/invite-user/share-button@2x.png
  26. 3 0
      assets/style/main.scss
  27. 1 0
      assets/style/variables.less
  28. 5 0
      assets/style/variables.scss
  29. 17 0
      components.d.ts
  30. 12 0
      jsconfig.json
  31. 2 0
      layouts/default.js
  32. 14 0
      layouts/empty.vue
  33. 43 0
      layouts/error.vue
  34. 17 0
      modules/postcss-px-to-viewport.js
  35. 12 0
      modules/unplugin-vue-components.js
  36. 78 0
      modules/vant/index.js
  37. 8 0
      modules/vant/plugin.js
  38. 2 0
      modules/vant/var.less
  39. 236 0
      nuxt.config.js
  40. 34845 0
      package-lock.json
  41. 70 0
      package.json
  42. 264 0
      pages/activity/invite-user.vue
  43. 62 0
      pages/index.vue
  44. 20 0
      pages/inspire.vue
  45. 39 0
      pages/login.vue
  46. 51 0
      pages/register-for-invite.vue
  47. 11 0
      plugins/auth.js
  48. 42 0
      plugins/axios.js
  49. 30 0
      plugins/baidu-tongji.js
  50. 10 0
      plugins/error-captured.js
  51. 31 0
      plugins/file-upload.js
  52. 18 0
      plugins/filters.js
  53. 50 0
      plugins/jweixin.js
  54. 24 0
      plugins/native.js
  55. 52 0
      plugins/umeng-datasources.js
  56. 22 0
      plugins/user-agent.js
  57. 4 0
      plugins/vue-data-dict.js
  58. 10412 0
      pnpm-lock.yaml
  59. 60 0
      schemes/password.js
  60. 202 202
      androidscloudH5/css/style.css
  61. 0 0
      static/androidscloudH5/gzhDownload.html
  62. 0 0
      static/androidscloudH5/image/1_750.png
  63. 0 0
      static/androidscloudH5/image/2_750.png
  64. 0 0
      static/androidscloudH5/image/39ce1a05e2bb4fb0833a4ff9c55511f3.png
  65. 0 0
      static/androidscloudH5/image/3_750.png
  66. 0 0
      static/androidscloudH5/image/4_750.png
  67. 0 0
      static/androidscloudH5/image/CPS-梦缘大话西游落地页55.jpg
  68. 0 0
      static/androidscloudH5/image/android.png
  69. 0 0
      static/androidscloudH5/image/bg.jpg
  70. 0 0
      static/androidscloudH5/image/bg_IMG.png
  71. 0 0
      static/androidscloudH5/image/bj.png
  72. 0 0
      static/androidscloudH5/image/bottom.png
  73. 0 0
      static/androidscloudH5/image/bottom750.png
  74. 0 0
      static/androidscloudH5/image/f03058dcf27d4599b062ad31a46d5900.png
  75. 0 0
      static/androidscloudH5/image/gfxx/bj_gfxx.png
  76. 0 0
      static/androidscloudH5/image/gfxx/btn.png
  77. 0 0
      static/androidscloudH5/image/ios.png
  78. 0 0
      static/androidscloudH5/image/jzsy/bottom750.png
  79. 0 0
      static/androidscloudH5/image/jzsy/long_1.png
  80. 0 0
      static/androidscloudH5/image/jzsy/long_2.png
  81. 0 0
      static/androidscloudH5/image/jzsy/long_3.png
  82. 0 0
      static/androidscloudH5/image/jzsy/long_bj.png
  83. 0 0
      static/androidscloudH5/image/jzsy/topBtn750.png
  84. 0 0
      static/androidscloudH5/image/jzsy/topnav750.png
  85. 0 0
      static/androidscloudH5/image/longwu/btn-下载.png
  86. 0 0
      static/androidscloudH5/image/longwu/long_1.png
  87. 0 0
      static/androidscloudH5/image/longwu/long_2.png
  88. 0 0
      static/androidscloudH5/image/longwu/long_3.png
  89. 0 0
      static/androidscloudH5/image/longwu/long_4.png
  90. 0 0
      static/androidscloudH5/image/longwu/long_5.png
  91. 0 0
      static/androidscloudH5/image/longwu/long_bj.png
  92. 0 0
      static/androidscloudH5/image/longwu/topnav750.png
  93. 0 0
      static/androidscloudH5/image/longwu/topnav75055.png
  94. 0 0
      static/androidscloudH5/image/longwu/下载双子星.png
  95. 0 0
      static/androidscloudH5/image/num1.png
  96. 0 0
      static/androidscloudH5/image/num2.png
  97. 0 0
      static/androidscloudH5/image/num3.png
  98. 0 0
      static/androidscloudH5/image/num4.png
  99. 0 0
      static/androidscloudH5/image/rxfs/bottom750.png
  100. 0 0
      androidscloudH5/image/rxfs/long_1.png

+ 19 - 0
.env.development

@@ -0,0 +1,19 @@
+# 开发环境变量
+MODE = "development"
+
+# 接口服务器
+API_PREFIX = "/api"
+API_HOST = "192.168.31.194"
+API_PORT = 80
+
+# 文件服务器
+FILE_PREFIX = "/file"
+FILE_HOST = "file.phone.androidscloud.com"
+FILE_PORT = 8210
+FILE_UPLOAD_KEY = "13d0arghebcc4cm49cf04"
+
+# 友盟统计
+UMENG_DATASOURCES_APP_KEY = "62ad961905844627b5b8638c"
+
+# 百度统计
+BAIDU_TONGJI_KEY = "fb2fdf29d47485e36ea2ec253bf6ac06"

+ 4 - 0
.env.production

@@ -0,0 +1,4 @@
+MODE = "production"
+API_PREFIX = "/api/"
+API_HOST = "client.phone.androidscloud.com"
+API_PORT = 443

+ 5 - 0
.env.staging

@@ -0,0 +1,5 @@
+# 预生产环境变量
+MODE = "staging"
+API_PREFIX = "/api/"
+API_HOST = "prese.phone.androidscloud.com"
+API_PORT = 443

+ 6 - 0
.env.test

@@ -0,0 +1,6 @@
+# 测试环境变量
+MODE = "test"
+API_PREFIX = "/api/"
+API_HOST = "gntest.phone.androidscloud.com"
+API_PORT = 1280
+

+ 4 - 0
.eslintignore

@@ -0,0 +1,4 @@
+node_modules/
+.nuxt/
+static/
+dist/

+ 10 - 2
.eslintrc.js

@@ -4,8 +4,16 @@ module.exports = {
     browser: true,
     browser: true,
     node: true,
     node: true,
   },
   },
-  extends: ['plugin:prettier/recommended'],
+  parserOptions: {
+    parser: '@babel/eslint-parser',
+    requireConfigFile: false,
+  },
+  extends: ['@nuxtjs', 'plugin:nuxt/recommended', 'prettier'],
   plugins: [],
   plugins: [],
   // add your custom rules here
   // add your custom rules here
-  rules: {},
+  rules: {
+    'no-var': ['warn'],
+    'no-unused-vars': ['warn'],
+  },
+  ignorePatterns: ['node_modules/', 'static/'],
 };
 };

+ 86 - 10
.gitignore

@@ -1,14 +1,90 @@
+# Created by .ignore support plugin (hsz.mobi)
+### Node template
+# Logs
+/logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
 
 
-/unpackage/
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
 
 
-# Editor directories and files
-.idea
-.vscode
-*.suo
-*.ntvs*
-*.njsproj
-*.sln
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
 
 
+# Dependency directories
 node_modules/
 node_modules/
-dist/
-.nuxt/
+jspm_packages/
+
+# TypeScript v1 declaration files
+typings/
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variables file
+.env
+
+# parcel-bundler cache (https://parceljs.org/)
+.cache
+
+# next.js build output
+.next
+
+# nuxt.js build output
+.nuxt
+
+# Nuxt generate
+dist
+
+# vuepress build output
+.vuepress/dist
+
+# Serverless directories
+.serverless
+
+# IDE / Editor
+.idea
+
+# Service worker
+sw.*
+
+# macOS
+.DS_Store
+
+# Vim swap files
+*.swp

+ 0 - 5
.idea/.gitignore

@@ -1,5 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
-# Editor-based HTTP Client requests
-/httpRequests/

+ 0 - 12
.idea/android-cloud-H5.iml

@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="WEB_MODULE" version="4">
-  <component name="NewModuleRootManager">
-    <content url="file://$MODULE_DIR$">
-      <excludeFolder url="file://$MODULE_DIR$/.tmp" />
-      <excludeFolder url="file://$MODULE_DIR$/temp" />
-      <excludeFolder url="file://$MODULE_DIR$/tmp" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-  </component>
-</module>

+ 0 - 6
.idea/misc.xml

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="JavaScriptSettings">
-    <option name="languageLevel" value="ES6" />
-  </component>
-</project>

+ 0 - 8
.idea/modules.xml

@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ProjectModuleManager">
-    <modules>
-      <module fileurl="file://$PROJECT_DIR$/.idea/android-cloud-H5.iml" filepath="$PROJECT_DIR$/.idea/android-cloud-H5.iml" />
-    </modules>
-  </component>
-</project>

+ 0 - 6
.idea/vcs.xml

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="VcsDirectoryMappings">
-    <mapping directory="$PROJECT_DIR$" vcs="Git" />
-  </component>
-</project>

+ 97 - 0
.prettierignore

@@ -0,0 +1,97 @@
+###
+# Place your Prettier ignore content here
+
+###
+# .gitignore content is duplicated here due to https://github.com/prettier/prettier/issues/8506
+
+# Created by .ignore support plugin (hsz.mobi)
+### Node template
+# Logs
+/logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# TypeScript v1 declaration files
+typings/
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variables file
+.env
+
+# parcel-bundler cache (https://parceljs.org/)
+.cache
+
+# next.js build output
+.next
+
+# nuxt.js build output
+.nuxt
+
+# Nuxt generate
+dist
+
+# vuepress build output
+.vuepress/dist
+
+# Serverless directories
+.serverless
+
+# IDE / Editor
+.idea
+
+# Service worker
+sw.*
+
+# macOS
+.DS_Store
+
+# Vim swap files
+*.swp
+# static/

+ 4 - 0
.stylelintignore

@@ -0,0 +1,4 @@
+node_modules/
+.nuxt/
+static/
+dist/

+ 0 - 15
.vscode/launch.json

@@ -1,15 +0,0 @@
-{
-    // 使用 IntelliSense 了解相关属性。 
-    // 悬停以查看现有属性的描述。
-    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
-    "version": "0.2.0",
-    "configurations": [
-        {
-            "type": "pwa-chrome",
-            "request": "launch",
-            "name": "Launch Chrome against localhost",
-            "url": "http://localhost:8080",
-            "webRoot": "${workspaceFolder}"
-        }
-    ]
-}

+ 84 - 0
README.md

@@ -0,0 +1,84 @@
+# android-cloud-H5-nuxt
+
+## 部分环境变量含义
+
+### process.env.NODE_ENV
+
+打包模式 两种模式
+development 表示开发模式
+production 表示发布模式
+
+### process.env.MODE
+
+服务器环境 四个环境
+development 开发环境
+test 测试环境
+staging 验收环境
+production 生产环境
+
+## Build Setup
+
+```bash
+# install dependencies
+$ npm install
+
+# serve with hot reload at localhost:3000
+$ npm run dev
+
+# build for production and launch server
+$ npm run build
+$ npm run start
+
+# generate static project
+$ npm run generate
+```
+
+For detailed explanation on how things work, check out the [documentation](https://nuxtjs.org).
+
+## Special Directories
+
+You can create the following extra directories, some of which have special behaviors. Only `pages` is required; you can delete them if you don't want to use their functionality.
+
+### `assets`
+
+The assets directory contains your uncompiled assets such as Stylus or Sass files, images, or fonts.
+
+More information about the usage of this directory in [the documentation](https://nuxtjs.org/docs/2.x/directory-structure/assets).
+
+### `components`
+
+The components directory contains your Vue.js components. Components make up the different parts of your page and can be reused and imported into your pages, layouts and even other components.
+
+More information about the usage of this directory in [the documentation](https://nuxtjs.org/docs/2.x/directory-structure/components).
+
+### `layouts`
+
+Layouts are a great help when you want to change the look and feel of your Nuxt app, whether you want to include a sidebar or have distinct layouts for mobile and desktop.
+
+More information about the usage of this directory in [the documentation](https://nuxtjs.org/docs/2.x/directory-structure/layouts).
+
+### `pages`
+
+This directory contains your application views and routes. Nuxt will read all the `*.vue` files inside this directory and setup Vue Router automatically.
+
+More information about the usage of this directory in [the documentation](https://nuxtjs.org/docs/2.x/get-started/routing).
+
+### `plugins`
+
+The plugins directory contains JavaScript plugins that you want to run before instantiating the root Vue.js Application. This is the place to add Vue plugins and to inject functions or constants. Every time you need to use `Vue.use()`, you should create a file in `plugins/` and add its path to plugins in `nuxt.config.js`.
+
+More information about the usage of this directory in [the documentation](https://nuxtjs.org/docs/2.x/directory-structure/plugins).
+
+### `static`
+
+This directory contains your static files. Each file inside this directory is mapped to `/`.
+
+Example: `/static/robots.txt` is mapped as `/robots.txt`.
+
+More information about the usage of this directory in [the documentation](https://nuxtjs.org/docs/2.x/directory-structure/static).
+
+### `store`
+
+This directory contains your Vuex store files. Creating a file in this directory automatically activates Vuex.
+
+More information about the usage of this directory in [the documentation](https://nuxtjs.org/docs/2.x/directory-structure/store).

+ 11 - 0
api/activity/invite-user.js

@@ -0,0 +1,11 @@
+// export default function ({ $axios }) {
+//   return {
+//     getStarCoinOverview: () =>
+//       $axios.$get('/activity/v1/inviteUser/orderRelation/starCoinOverview'),
+//   };
+// }
+
+export const getStarCoinOverview = ({ $axios }, params) =>
+  $axios.$get('/activity/v1/inviteUser/orderRelation/starCoinOverview', {
+    params,
+  });

+ 5 - 0
api/message/phone.js

@@ -0,0 +1,5 @@
+export default function ({ $axios }) {
+  return {
+    sendSmsCode: (data) => $axios.$post('/message/v5/phone/send', data),
+  };
+}

+ 11 - 0
api/public/agreement.js

@@ -0,0 +1,11 @@
+export default function ({ $axios }) {
+  return {
+    getContentByType: (agreementCoding, type = 1) =>
+      $axios.$get('/public/v5/agreementApi/content/getContentByType', {
+        params: {
+          agreementCoding,
+          type,
+        },
+      }),
+  };
+}

+ 9 - 0
api/user/client.js

@@ -0,0 +1,9 @@
+export default function ({ $axios }) {
+  return {
+    registerForInvite: (data) =>
+      $axios.$post(
+        '/user/v5/client/register/forLachineH5',
+        data,
+      ),
+  };
+}

+ 12 - 0
api/wx/index.js

@@ -0,0 +1,12 @@
+export default function ({ $axios }) {
+  return {
+    // 获取微信js签名
+    getConfig(url) {
+      return $axios.$get('/wx/getConfig', {
+        params: {
+          url,
+        },
+      });
+    },
+  };
+}

BIN
assets/image/activity/invite-user/bg@2x.png


BIN
assets/image/activity/invite-user/box@2x.png


BIN
assets/image/activity/invite-user/cybz-content@2x.png


BIN
assets/image/activity/invite-user/share-button@2x.png


+ 3 - 0
assets/style/main.scss

@@ -0,0 +1,3 @@
+html {
+  font-size: 16px;
+}

+ 1 - 0
assets/style/variables.less

@@ -0,0 +1 @@
+// @co: red;

+ 5 - 0
assets/style/variables.scss

@@ -0,0 +1,5 @@
+// Ref: https://github.com/nuxt-community/vuetify-module#customvariables
+//
+// The variables you want to modify
+// $font-size-root: 20px;
+// $c: red;

+ 17 - 0
components.d.ts

@@ -0,0 +1,17 @@
+// generated by unplugin-vue-components
+// We suggest you to commit this file into source control
+// Read more: https://github.com/vuejs/vue-next/pull/3399
+import '@vue/runtime-core'
+
+declare module '@vue/runtime-core' {
+  export interface GlobalComponents {
+    RouterLink: typeof import('vue-router')['RouterLink']
+    RouterView: typeof import('vue-router')['RouterView']
+    VanButton: typeof import('vant/es')['Button']
+    VanIcon: typeof import('vant/es')['Icon']
+    VanImage: typeof import('vant/es')['Image']
+    VantButton: typeof import('vant/es')['tButton']
+  }
+}
+
+export {}

+ 12 - 0
jsconfig.json

@@ -0,0 +1,12 @@
+{
+  "compilerOptions": {
+    "baseUrl": ".",
+    "paths": {
+      "~/*": ["./*"],
+      "@/*": ["./*"],
+      "~~/*": ["./*"],
+      "@@/*": ["./*"]
+    }
+  },
+  "exclude": ["node_modules", ".nuxt", "dist"]
+}

+ 2 - 0
layouts/default.js

@@ -0,0 +1,2 @@
+import EmptyLayout from './empty.vue';
+export default EmptyLayout;

+ 14 - 0
layouts/empty.vue

@@ -0,0 +1,14 @@
+<template>
+  <div class="empty-layout">
+    <Nuxt />
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'EmptyLayout',
+  data() {
+    return {};
+  },
+};
+</script>

+ 43 - 0
layouts/error.vue

@@ -0,0 +1,43 @@
+<template>
+  <div>
+    <h1 v-if="error.statusCode === 404">
+      {{ pageNotFound }}
+    </h1>
+    <h1 v-else>
+      {{ otherError }}
+    </h1>
+    <NuxtLink to="/"> Home page </NuxtLink>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'EmptyLayout',
+  layout: 'empty',
+  props: {
+    error: {
+      type: Object,
+      default: null,
+    },
+  },
+  data() {
+    return {
+      pageNotFound: '404 Not Found',
+      otherError: 'An error occurred',
+    };
+  },
+  head() {
+    const title =
+      this.error.statusCode === 404 ? this.pageNotFound : this.otherError;
+    return {
+      title,
+    };
+  },
+};
+</script>
+
+<style scoped>
+h1 {
+  font-size: 20px;
+}
+</style>

+ 17 - 0
modules/postcss-px-to-viewport.js

@@ -0,0 +1,17 @@
+export default function () {
+  this.nuxt.hook('build:before', (nuxt, buildOptions) => {
+    // buildOptions.postcss.plugins;
+    // console.log(
+    //   '🚀 ~ file: postcss-px-to-viewport.js ~ line 9 ~ this.nuxt.hook ~ buildOptions.postcss.plugins',
+    //   buildOptions.postcss.plugins,
+    // );
+
+    buildOptions.postcss = buildOptions.postcss || {};
+
+    buildOptions.postcss.plugins = buildOptions.postcss.plugins || {};
+
+    buildOptions.postcss.plugins['postcss-px-to-viewport'] = {
+      viewportWidth: 375,
+    };
+  });
+}

+ 12 - 0
modules/unplugin-vue-components.js

@@ -0,0 +1,12 @@
+import unpluginVueComponents from 'unplugin-vue-components/webpack';
+import { VantResolver } from 'unplugin-vue-components/resolvers';
+
+export default function () {
+  this.nuxt.hook('build:before', (nuxt, buildOptions) => {
+    buildOptions.plugins.push(
+      unpluginVueComponents({
+        resolvers: [VantResolver({})],
+      }),
+    );
+  });
+}

+ 78 - 0
modules/vant/index.js

@@ -0,0 +1,78 @@
+import path from 'path';
+import unpluginVueComponents from 'unplugin-vue-components/webpack';
+import { VantResolver } from 'unplugin-vue-components/resolvers';
+export default function () {
+  // this.
+
+  // console.log(this.options);
+  // console.log(this.nuxt);
+  this.nuxt.hook('build:before', (nuxt, buildOptions) => {
+    // console.log(
+    //   '🚀 ~ file: index.js ~ line 12 ~ this.nuxt.hook ~ buildOptions',
+    //   ,
+    // );
+    // console.log(buildOptions.loaders.less);
+    buildOptions.loaders.less.lessOptions = {
+      modifyVars: {
+        // 直接覆盖变量
+        // 'text-color': '#111',
+        // 'border-color': '#eee',
+        hack: `true; @import "${path.resolve(__dirname, 'var.less')}";`,
+      },
+    };
+    // console.log();
+    // buildOptions.build.extend
+    // console.log(
+    //   '🚀 ~ file: index.js ~ line 9 ~ this.nuxt.hook ~ buildOptions.build.extend',
+    //   buildOptions.extend,
+    // );
+
+    // buildOptions.extend.push((config, { isClient, loaders: { less } }) => {
+    //   console.log(less);
+    // });
+    buildOptions.plugins.push(
+      unpluginVueComponents({
+        resolvers: [
+          VantResolver({
+            importStyle: 'less',
+          }),
+        ],
+      }),
+    );
+    buildOptions.babel.plugins.push([
+      'import',
+      {
+        libraryName: 'vant',
+        libraryDirectory: 'es',
+        style: (name) => `${name}/style/less`,
+      },
+      'vant',
+    ]);
+    buildOptions.loaders = buildOptions.loaders ?? {};
+    buildOptions.loaders.vue = buildOptions.loaders.vue ?? {};
+    buildOptions.loaders.vue.transformAssetUrls =
+      buildOptions.loaders.vue.transformAssetUrls ?? {};
+    buildOptions.loaders.vue.transformAssetUrls['van-image'] = 'src';
+  });
+
+  // this.nuxt.hook('build:before', (nuxt, buildOptions) => {});
+  // this.nuxt.hook('webpack:config', (webpackConfigs) => {
+  //   console.log(
+  //     '🚀 ~ file: index.js ~ line 17 ~ this.nuxt.hook ~ webpackConfigs',
+  //     webpackConfigs.module,
+  //   );
+  // });
+  // this.nuxt.hook('build:before', (nuxt, buildOptions) => {});
+
+  // this.nuxt.hook('components:dirs', (dirs) => {
+  //   dirs.push({
+  //     path: 'vant/es',
+  //     level: 1,
+  //     pattern: '*/index.js',
+  //     ignore: ['utils/index.js'],
+  //     prefix: 'van',
+  //   });
+  // });
+
+  this.addPlugin(path.resolve(__dirname, 'plugin.js'));
+}

+ 8 - 0
modules/vant/plugin.js

@@ -0,0 +1,8 @@
+import Vue from 'vue';
+
+import { Toast } from 'vant';
+
+// import  'vant/es/';
+// import 'vant/lib/index.less';
+
+Vue.use(Toast);

+ 2 - 0
modules/vant/var.less

@@ -0,0 +1,2 @@
+// @toast-icon-size: 72px;
+// @button-primary-background-color: red;

+ 236 - 0
nuxt.config.js

@@ -0,0 +1,236 @@
+// import colors from 'vuetify/es5/util/colors'
+// import zhHans from 'vuetify/lib/locale/zh-Hans';
+import dotenv from 'dotenv';
+// dotenv.config({
+//   path: `.env`,
+// });
+let mode = 'development';
+
+const modeIndex = process.argv.indexOf('--mode');
+if (modeIndex !== -1) {
+  mode = process.argv[modeIndex + 1];
+}
+
+dotenv.config({
+  path: `.env.${mode}`,
+});
+
+export default {
+  // Disable server-side rendering: https://go.nuxtjs.dev/ssr-mode
+  ssr: false,
+
+  // Global page headers: https://go.nuxtjs.dev/config-head
+  head: {
+    titleTemplate: '%s',
+    title: 'android-cloud-H5-nuxt',
+    htmlAttrs: {
+      lang: 'zh-CN',
+    },
+    meta: [
+      { charset: 'utf-8' },
+      {
+        hid: 'author',
+        name: 'author',
+        content: process.env.npm_package_author_name,
+      },
+      {
+        hid: 'version',
+        name: 'version',
+        content: process.env.npm_package_version,
+      },
+      {
+        name: 'viewport',
+        content:
+          'width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no,shrink-to-fit=no,viewport-fit=cover',
+      },
+      {
+        hid: 'description',
+        name: 'description',
+        content: process.env.npm_package_description || '',
+      },
+      { name: 'format-detection', content: 'telephone=no' },
+      {
+        hid: 'keywords',
+        name: 'keywords',
+        content: '双子星云手机',
+      },
+    ],
+    link: [{ rel: 'icon', type: 'image/x-icon', href: '/h5/favicon.ico' }],
+  },
+
+  // Global CSS: https://go.nuxtjs.dev/config-css
+  css: [
+    'normalize.css',
+    '@mdi/font/css/materialdesignicons.css',
+    '~/assets/style/main.scss',
+    // 'vant/lib/index.css'
+  ],
+
+  // Plugins to run before rendering page: https://go.nuxtjs.dev/config-plugins
+  plugins: [
+    '~/plugins/axios',
+    // '~/plugins/api',
+    '~/plugins/file-upload',
+    // '~/plugins/message',
+    '~/plugins/error-captured',
+    '~/plugins/user-agent',
+    '~/plugins/native',
+    '~/plugins/filters',
+    '~/plugins/vue-data-dict',
+    // '~/plugins/jweixin',
+    // '~/plugins/umeng-datasources',
+    // '@/plugins/vant',
+  ],
+
+  // Auto import components: https://go.nuxtjs.dev/config-components
+  components: [
+    '~/components',
+    // {
+    //   path: 'vant/es',
+    //   level: 1,
+    //   pattern: '*/index.js',
+    //   ignore: ['utils/index.js'],
+    //   prefix: 'van',
+    // },
+  ],
+
+  // Modules for dev and build (recommended): https://go.nuxtjs.dev/config-modules
+  buildModules: [
+    ['@nuxtjs/dotenv', { filename: `.env.${mode}` }],
+    '@nuxtjs/style-resources',
+    // https://go.nuxtjs.dev/eslint
+    '@nuxtjs/eslint-module',
+    // https://go.nuxtjs.dev/stylelint
+    '@nuxtjs/stylelint-module',
+    // '~/modules/unplugin-vue-components'
+    '~/modules/postcss-px-to-viewport',
+    '~/modules/vant',
+    // https://go.nuxtjs.dev/vuetify
+    // '@nuxtjs/vuetify',
+    // '@nuxtjs/composition-api/module',
+  ],
+
+  // Modules: https://go.nuxtjs.dev/config-modules
+  modules: [
+    // https://go.nuxtjs.dev/axios
+    '@nuxtjs/axios',
+    '@nuxtjs/auth-next',
+    '@unocss/nuxt',
+  ],
+  unocss: {
+    uno: true,
+  },
+
+  // Axios module configuration: https://go.nuxtjs.dev/config-axios
+  axios: {
+    proxy: process.env.NODE_ENV === 'development',
+    // https: process.env.API_HTTPS === 'true',
+    //   // Workaround to avoid enforcing hard-coded localhost:3000: https://github.com/nuxt-community/axios-module/issues/308
+    //   baseURL: '/',
+  },
+  proxy: {
+    '/api': {
+      // target: 'http://gntest.phone.androidscloud.com:1280',
+      target: `http${process.env.API_PORT === '443' ? 's' : ''}://${
+        process.env.API_HOST
+      }:${process.env.API_PORT}`,
+      pathRewrite: {
+        // '^/api/': ''
+      },
+    },
+    '/file': {
+      target: `http${process.env.FILE_PORT === '443' ? 's' : ''}://${
+        process.env.FILE_HOST
+      }:${process.env.FILE_PORT}`,
+      pathRewrite: {
+        '^/file/': '',
+      },
+    },
+  },
+  auth: {
+    plugins: ['~/plugins/auth', '~/plugins/baidu-tongji'],
+    strategies: {
+      password: {
+        scheme: '~/schemes/password',
+        token: {
+          property: 'data.token',
+          name: 'Authorization',
+          type: '',
+        },
+        user: {
+          property: 'data',
+        },
+        endpoints: {
+          login: { url: '/user/v1/client/login', method: 'post' },
+          user: { url: '/user/v1/client/personalInfo', method: 'get' },
+          logout: {
+            url: '/user/v5/visitDetailed/operationVisitDetailed',
+            method: 'post',
+          },
+        },
+      },
+      // user: {
+      //   property: 'user',
+      //   // autoFetch: true
+      // },
+    },
+  },
+
+  // Vuetify module configuration: https://go.nuxtjs.dev/config-vuetify
+  // vuetify: {
+  //   defaultAssets: false,
+  //   customVariables: ['~/assets/variables.scss'],
+  //   lang: {
+  //     locales: { zhHans },
+  //     current: 'zhHans',
+  //   },
+  //   theme: {
+  //     dark: false,
+  //     // themes: {
+  //     //   dark: {
+  //     //     primary: colors.blue.darken2,
+  //     //     accent: colors.grey.darken3,
+  //     //     secondary: colors.amber.darken3,
+  //     //     info: colors.teal.lighten1,
+  //     //     warning: colors.amber.base,
+  //     //     error: colors.deepOrange.accent4,
+  //     //     success: colors.green.accent3,
+  //     //   },
+  //     // },
+  //   },
+  // },
+
+  // Build Configuration: https://go.nuxtjs.dev/config-build
+  build: {
+    // extend(config, { isClient, loaders: { less } }) {
+    //   // console.log('🚀 ~ file: nuxt.config.js ~ line 197 ~ extend ~ less', less);
+    //   less.lessOptions = {
+    //     modifyVars: {
+    //       // 直接覆盖变量
+    //       'text-color': '#111',
+    //       'border-color': '#eee',
+    //     },
+    //   };
+    // },
+    babel: {
+      plugins: [],
+    },
+    postcss: {
+      plugins: {},
+    },
+  },
+  router: {
+    base: '/h5/',
+    middleware: ['auth'],
+  },
+  styleResources: {
+    scss: ['~/assets/style/variables.scss'],
+    less: ['~/assets/style/variables.less'],
+    // hoistUseStatements: true,
+  },
+  server: {
+    port: 3000, // default: 3000
+    host: '0.0.0.0', // default: localhost,
+    timing: false,
+  },
+};

File diff suppressed because it is too large
+ 34845 - 0
package-lock.json


+ 70 - 0
package.json

@@ -0,0 +1,70 @@
+{
+  "name": "android-cloud-H5-nuxt",
+  "version": "1.0.0",
+  "private": true,
+  "scripts": {
+    "dev": "nuxt --mode development",
+    "dev:test": "nuxt --mode test",
+    "dev:stag": "nuxt --mode staging",
+    "dev:prod": "nuxt --mode production",
+    "build": "npm run build:dev",
+    "build:dev": "nuxt build --mode development",
+    "build:test": "nuxt build --mode test",
+    "build:stag": "nuxt build --mode staging",
+    "build:prod": "nuxt build --mode production",
+    "start": "nuxt start",
+    "generate": "nuxt generate",
+    "lint:js": "eslint --ext \".js,.vue\" --ignore-path .eslintignore .",
+    "lint:style": "stylelint \"**/*.{css,scss,sass,html,vue}\" --ignore-path .stylelintignore",
+    "lint:prettier": "prettier --check .",
+    "lint": "npm run lint:js && npm run lint:style && npm run lint:prettier",
+    "lintfix": "prettier --write --list-different . && npm run lint:js -- --fix && npm run lint:style -- --fix"
+  },
+  "dependencies": {
+    "@nuxtjs/auth-next": "5.0.0-1648802546.c9880dc",
+    "@nuxtjs/axios": "^5.13.6",
+    "axios": "^0.27.2",
+    "core-js": "^3.19.3",
+    "dayjs": "^1.11.3",
+    "jsencrypt": "^3.2.1",
+    "jweixin-module": "^1.6.0",
+    "normalize.css": "^8.0.1",
+    "numeral": "^2.0.6",
+    "nuxt": "^2.15.8",
+    "vant": "^2.12.47",
+    "vue": "^2.6.14",
+    "vue-data-dict": "^1.0.6",
+    "vue-server-renderer": "^2.6.14",
+    "vue-template-compiler": "^2.6.14",
+    "vuetify": "^2.6.1",
+    "webpack": "^4.46.0"
+  },
+  "devDependencies": {
+    "@babel/eslint-parser": "^7.16.3",
+    "@commitlint/cli": "^15.0.0",
+    "@commitlint/config-conventional": "^15.0.0",
+    "@mdi/font": "^6.7.96",
+    "@nuxtjs/dotenv": "^1.4.1",
+    "@nuxtjs/eslint-config": "^10.0.0",
+    "@nuxtjs/eslint-module": "^3.0.2",
+    "@nuxtjs/style-resources": "^1.2.1",
+    "@nuxtjs/stylelint-module": "^4.1.0",
+    "@nuxtjs/vuetify": "^1.12.3",
+    "@unocss/nuxt": "^0.39.0",
+    "babel-plugin-import": "^1.13.5",
+    "eslint": "^8.4.1",
+    "eslint-config-prettier": "^8.3.0",
+    "eslint-plugin-nuxt": "^3.1.0",
+    "eslint-plugin-vue": "^8.2.0",
+    "less": "^4.1.3",
+    "less-loader": "^7.3.0",
+    "postcss-html": "^1.3.0",
+    "postcss-px-to-viewport": "^1.1.1",
+    "prettier": "^2.5.1",
+    "stylelint": "^14.1.0",
+    "stylelint-config-prettier": "^9.0.3",
+    "stylelint-config-recommended-vue": "^1.1.0",
+    "stylelint-config-standard": "^24.0.0",
+    "unplugin-vue-components": "^0.19.6"
+  }
+}

+ 264 - 0
pages/activity/invite-user.vue

@@ -0,0 +1,264 @@
+<template>
+  <div class="invite-user">
+    <div class="box box1">
+      <div class="box-title">参与步骤</div>
+      <div class="box-content">
+        <van-image
+          class="cybz-content"
+          src="~/assets/image/activity/invite-user/cybz-content@2x.png"
+        />
+        <div class="cybz-content-text">
+          <div class="cybz-content-text-item">分享好友</div>
+          <div class="cybz-content-text-item">邀请购买云机</div>
+          <div class="cybz-content-text-item">返星币换现金</div>
+        </div>
+        <van-button class="share-button" round @click="share()"></van-button>
+      </div>
+      <!-- <div class="h-40">13</div> -->
+    </div>
+    <div class="box box2">
+      <div class="box-title">收益明细</div>
+      <div class="box-content">
+        <div class="grid grid-cols-2 gap-x-4 gap-y-8">
+          <div
+            v-for="(item, index) in dataList"
+            :key="index"
+            :class="{
+              'col-span-2': index === 6,
+            }"
+          >
+            <div class="label text-sm">
+              <span>{{ item.label }}</span>
+            </div>
+            <div class="value text-2xl font-bold">
+              <span>{{ item.value | formatNumber('0,0') }}</span>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <!-- <div class="box box3">
+      <div class="box-title">返利套餐</div>
+      <div class="box-content"></div>
+    </div> -->
+    <div class="box box4">
+      <div class="box-title">活动规则</div>
+      <div class="box-content text-sm">
+        <p>1、传播过程中有任何疑问,可直接咨询客服</p>
+        <p>
+          2、用户可以通过分享页面或者套餐给想要分享的人,被分享人购买云机套餐后,分享人可获得套餐对应的星币
+        </p>
+        <p>
+          3、星币为双子星云手机平台唯一认可代币,仅能通过充值、赠送和分享获得,其它渠道途径非法获取的星币,不受平台认可
+        </p>
+        <p>4、星币可在双子星购买任一等价值套餐</p>
+        <p>
+          5、请勿利用双子星传播或扩散任何有关于政治、情色等任何违法的信息,一经发现,取消资格,如果触犯任何法律相关问题,平台不负任何责任
+        </p>
+      </div>
+    </div>
+    <!-- <div class="">invite-user</div> -->
+
+    <!-- <button>刷新数据</button> -->
+
+    <!-- <div class="">{{ data }}</div> -->
+    <!-- <div class="text-center">
+      <span>分享好友购买云机套餐<br />返星币换现金</span>
+    </div>
+
+    <div class="text-center mt-4">
+      <van-button type="primary" @click="share()">邀请好友</van-button>
+    </div>
+    <van-icon name="chat-o" />
+    <van-icon name="shape-plus" class-prefix="mdi" />
+    <van-button @click="$fetch()">刷新</van-button>
+
+    <div class="ccc">{{ 36666666.123456 | formatNumber }}</div>
+    <div class="ccc">{{ '2020-01-01' | formatDate }}</div> -->
+  </div>
+</template>
+
+<script>
+import qs from 'qs';
+import { getStarCoinOverview } from '~/api/activity/invite-user.js';
+export default {
+  // auth: false,
+  name: 'InviteUser',
+  filters: {},
+  data() {
+    return {
+      data: {
+        todayIncomeStarCoin: 0,
+        totalIncomeStarCoin: 0,
+        todayBuyOrderCount: 0,
+        totalBuyOrderCount: 0,
+        todayBuyOrderSuccessCount: 0,
+        totalBuyOrderSuccessCount: 0,
+        withdrawStarCoinNum: 0,
+      },
+    };
+  },
+  async fetch() {
+    //
+    this.data = (await getStarCoinOverview(this)).data;
+  },
+  head: {
+    title: '邀请好友',
+    // share: {
+    //   title: '标题',
+    //   content: '内容',
+    //   gotoUrl: 'http://localhost',
+    //   shareImg: 'http://localhost',
+    // },
+  },
+  computed: {
+    dataList() {
+      return [
+        { label: '今日收益(星币)', value: this.data.todayIncomeStarCoin },
+        { label: '总收益(星币)', value: this.data.totalIncomeStarCoin },
+        { label: '今日购买订单数', value: this.data.totalBuyOrderCount },
+        { label: '累计推广订单', value: this.data.totalBuyOrderCount },
+        {
+          label: '今日购买成功客户',
+          value: this.data.todayBuyOrderSuccessCount,
+        },
+        {
+          label: '累计购买成功客户',
+          value: this.data.totalBuyOrderSuccessCount,
+        },
+        // { label: '可提现星币数量', value: this.data.withdrawStarCoinNum },
+      ];
+    },
+  },
+  mounted() {},
+  methods: {
+    share() {
+      // window.aplus.getNextTrackCode(
+      //   {
+      //     appkey: '',
+      //     openid: '',
+      //     unionId: 'aTestUnionid',
+      //     trackCode: '',
+      //     rootTrackCode: '',
+      //     url: location.href || 'testurl',
+      //   },
+      //   () => {},
+      // );
+      window._hmt.push(['_trackEvent', '活动', '分享', '邀请好友', 0]);
+      this.$native.share({
+        title: '标题',
+        content: '内容',
+        gotoUrl: `${location.origin}${location.pathname}${qs.stringify(
+          { id: 666 },
+          { addQueryPrefix: true },
+        )}`,
+        shareImg: 'http://localhost',
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.invite-user {
+  color: #333;
+  background-image: url('~/assets/image/activity/invite-user/bg@2x.png');
+  background-size: 100% auto;
+  background-position-y: -44px;
+  overflow: hidden;
+  padding-bottom: 30px;
+}
+.box {
+  width: 373px;
+  box-sizing: border-box;
+  margin: auto;
+  border-image-source: url('~/assets/image/activity/invite-user/box@2x.png');
+  border-image-slice: 38 * 2 20 * 2 30 * 2 fill;
+
+  // border-image-width: 200px;
+  // border-image-slice: 200%;
+  border-width: 38px 15px 15px;
+  // border-width: 1px;
+  border-style: solid;
+  position: relative;
+  + .box {
+    margin-top: 30px;
+  }
+  .box-title {
+    position: absolute;
+    top: -30px;
+    // left: 141px;
+    left: 0;
+    right: 0;
+    text-align: center;
+    padding: 0 130px;
+    color: #fff;
+  }
+  .box-content {
+    padding: 30px 15px 20px;
+  }
+}
+.box1 {
+  margin-top: 275px;
+  .box-content {
+    // padding: 30px 15px 20px;
+    padding-left: 0;
+    padding-right: 0;
+  }
+  .cybz-content {
+    width: 305px;
+    height: 75px;
+    margin: auto;
+    display: block;
+    // margin-top: 30px;
+  }
+  .cybz-content-text {
+    // display: flex;
+    display: grid;
+    // width: 305px;
+    // padding: 0 28px;
+    // align-items: center;
+    // margin: auto;
+    // justify-content: space-between;
+    grid-template-columns: 1fr 1fr 1fr;
+    font-size: 12px;
+    color: #333;
+    .cybz-content-text-item {
+      // width: 0;
+      // flex: auto;
+      text-align: center;
+    }
+  }
+  .share-button {
+    display: block;
+    margin: auto;
+    width: 302px;
+    height: 62px;
+    background-image: url('~/assets/image/activity/invite-user/share-button@2x.png');
+    background-size: 100% 100%;
+    margin-top: 24px;
+    // margin-bottom: 24px;
+  }
+}
+.box2 {
+  .label {
+    // font-size: 14px;
+  }
+  .value {
+    color: #ff6600;
+    // font-size: 24px;
+  }
+  .box-content {
+    padding-left: 20px;
+    padding-right: 20px;
+  }
+}
+.box4 {
+  .box-content {
+    // padding-left: 20px;
+    padding-top: 0;
+  }
+}
+</style>
+
+

+ 62 - 0
pages/index.vue

@@ -0,0 +1,62 @@
+<template>
+  <div>
+    <div>
+      <div>title</div>
+      <div>
+        <button @click="$router.push('/inspire')">inspire</button>
+      </div>
+      <div class="justify-end">
+        <button @click="getContentByType()">getContentByType</button>
+        <button @click="message()">message</button>
+      </div>
+    </div>
+    <div class="">{{ FILE_PREFIX }}</div>
+    <img
+      :src="
+        $file.getUrl({
+          fileKey: 'LowLevelMultipartUpload_18706407955405619211',
+          type: 'popup',
+        })
+      "
+      alt=""
+    />
+  </div>
+</template>
+
+<script>
+import agreement from '~/api/public/agreement.js';
+export default {
+  name: 'IndexPage',
+  auth: false,
+  // asyncData({ $snackbar }) {
+  //   $snackbar({
+  //     app: true,
+  //     content: '123456798',
+  //   });
+  // },
+  data() {
+    return {
+      FILE_PREFIX: process.env.FILE_PREFIX,
+      FILE_UPLOAD_KEY: process.env.FILE_UPLOAD_KEY,
+    };
+  },
+  fetch() {},
+  mounted() {},
+  methods: {
+    async getContentByType() {
+      const data = await agreement(this).getContentByType('XYPZYHXY2004', 1);
+      console.log(
+        '🚀 ~ file: index.vue ~ line 24 ~ getContentByType ~ data',
+        data,
+      );
+    },
+    message() {
+      this.$message({
+        app: true,
+        content: '123456798',
+        icon: '$success',
+      });
+    },
+  },
+};
+</script>

+ 20 - 0
pages/inspire.vue

@@ -0,0 +1,20 @@
+<template>
+  <div>
+    <div>
+      <div>title</div>
+      <div>
+        <div class="">{{ $auth.user }}</div>
+      </div>
+      <div class="justify-end">
+        <button v-if="$auth.loggedIn" @click="$auth.logout()">logout</button>
+        <button v-else @click="$auth.redirect('login')">login</button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'InspirePage',
+};
+</script>

+ 39 - 0
pages/login.vue

@@ -0,0 +1,39 @@
+<template>
+  <div>
+    <div>
+      <div>
+        <input v-model="form.phone" />
+        <input v-model="form.password" />
+      </div>
+      <div>
+        <button v-if="$auth.loggedIn" @click="logout()">logout</button>
+        <button v-else @click="login()">login</button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'LoginPage',
+  data() {
+    return {
+      form: {
+        phone: '17600000010',
+        password: '1234567890',
+      },
+    };
+  },
+  methods: {
+    login() {
+      return this.$auth.loginWith('password', {
+        data: this.form,
+      });
+    },
+    logout() {
+      return this.$auth.logout();
+    },
+  },
+};
+</script>
+

+ 51 - 0
pages/register-for-invite.vue

@@ -0,0 +1,51 @@
+<template>
+  <div class="register-for-invite">
+    <div class="">注册</div>
+    <form>
+      <input v-model="form.phone" label="phone" name="phone" />
+      <input v-model="form.code" label="code" name="code" maxlength="6" />
+      <div class="">
+        <button @click="register()">注册</button>
+        <button @click="sendSmsCode()">发送验证码</button>
+      </div>
+    </form>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'RegisterForInvite',
+  data() {
+    return {
+      form: {
+        phone: '17603013019',
+        code: '',
+        invitationUserName: null,
+        activityId: null,
+      },
+    };
+  },
+  fetch() {
+    this.form.invitationUserName = this.$route.query.invitationUserName;
+    this.form.activityId = this.$route.query.activityId;
+  },
+  head: {
+    title: '注册',
+  },
+  methods: {
+    async register() {
+      await this.$api.user.registerForInvite(this.form);
+    },
+    async sendSmsCode() {
+      const res = await this.$api.message.sendSmsCode({
+        type: 'common',
+        authorizationType: 4,
+        phone: this.form.phone,
+      });
+      this.$message({ content: res.msg });
+    },
+  },
+};
+</script>
+
+

+ 11 - 0
plugins/auth.js

@@ -0,0 +1,11 @@
+export default async function ({ $auth, query, error }) {
+  if (query.token) {
+    // 请求携带了token
+    try {
+      await $auth.setUserToken(query.token);
+      // await $auth.fetchUser();
+    } catch (err) {
+      error(err);
+    }
+  }
+}

+ 42 - 0
plugins/axios.js

@@ -0,0 +1,42 @@
+import AxiosError from 'axios/lib/core/AxiosError';
+
+export default function ({ $axios, redirect }) {
+  // $axios.defaults.dataKey = 'data';
+  $axios.onRequest((config) => {
+    return config;
+  });
+  $axios.onResponse((response) => {
+    if (response.data.status !== 0) {
+      // const err = new Error(
+      //   response.data.msg || response.data.data || '未知错误',
+      // );
+      // Object.assign(err, response);
+
+      // return Promise.reject(err);
+
+      // if (response.data.status === 502) {
+      // }
+
+      throw new AxiosError(
+        response.data.msg || response.data.data || '未知错误',
+        null,
+        response.config,
+        response.request,
+        response,
+      );
+    }
+    // else if (response.config.dataKey) {
+    //   response.data = response.data[response.config.dataKey];
+    //   return response;
+    // }
+    return response;
+  });
+
+  // $axios.onError((error) => {
+  //   const code = parseInt(error.response && error.response.status);
+  //   if (code === 400) {
+  //     redirect('/400');
+  //   }
+  // });
+  // globalThis.$axios = $axios;
+}

+ 30 - 0
plugins/baidu-tongji.js

@@ -0,0 +1,30 @@
+export default function (c, i) {
+  const { app, $auth, store } = c;
+  window._hmt = window._hmt || [];
+  window._hmt.push(['_setAutoPageview', false]);
+  window._hmt.push(['_setCustomVar', 1, 'MODE', process.env.MODE, 1]);
+  app.router.afterEach((to, from) => {
+    // 上报PV
+    window._hmt.push(['_trackPageview', to.fullPath]);
+  });
+
+  app.head.script = app.head.script || [];
+  app.head.script.push({
+    src: `https://hm.baidu.com/hm.js?${process.env.BAIDU_TONGJI_KEY}`,
+    id: 'baidu-tongji',
+  });
+
+  // $auth.
+
+  const setUserId = () => {
+    window._hmt.push(['_setCustomVar', 2, 'userId', $auth.user?.id ?? 0, 2]);
+  };
+  store.watch(
+    (state, getter) => {
+      return $auth.user;
+    },
+    (user) => setUserId,
+    {},
+  );
+  setUserId();
+}

+ 10 - 0
plugins/error-captured.js

@@ -0,0 +1,10 @@
+export default function ({ app, $message }) {
+  app.errorCaptured = (err, vm, info) => {
+    if (process.client) {
+      // console.error(err);
+      // $message.error({ content: err.message });
+      vm.$toast.fail({ message: err.message, position: 'bottom' });
+      return false;
+    }
+  };
+}

+ 31 - 0
plugins/file-upload.js

@@ -0,0 +1,31 @@
+import qs from 'qs';
+export default function ({ $axios }, inject) {
+  let baseURL;
+  if (process.env.NODE_ENV === 'development') {
+    // 开发环境通过本地代理
+    baseURL = process.env.FILE_PREFIX;
+  } else {
+    // 部署环境通过域名直连
+    baseURL = `http${process.env.FILE_PORT === '443' ? 's' : ''}://${
+      process.env.FILE_HOST
+    }:${process.env.FILE_PORT}/${process.env.FILE_PREFIX}`;
+  }
+  const fileUploadServer = $axios.create({
+    baseURL,
+    headers: {},
+  });
+
+  // fileUploadServer.setBaseURL(process.env.FILE_PREFIX);
+  // console.dir(fileUploadServer);
+
+  inject('file', {
+    upload(file) {
+      throw new Error('开发中');
+    },
+    getUrl(params) {
+      return `${baseURL}/document/newFile/download/0/${
+        process.env.FILE_UPLOAD_KEY
+      }${qs.stringify(params, { addQueryPrefix: true })}`;
+    },
+  });
+}

+ 18 - 0
plugins/filters.js

@@ -0,0 +1,18 @@
+// expo
+
+import Vue from 'vue';
+
+import numeral from 'numeral';
+import 'numeral/locales/chs';
+
+import dayjs from 'dayjs';
+numeral.locale('chs');
+// numeral.defaultFormat('0,0.[00]');
+
+Vue.filter('formatNumber', (value, format = '0,0.[00]') =>
+  numeral(value).format(format),
+);
+
+Vue.filter('formatDate', (value, format = 'YYYY-MM-DD HH:mm:ss') =>
+  dayjs(value).format(format),
+);

+ 50 - 0
plugins/jweixin.js

@@ -0,0 +1,50 @@
+import wx from 'jweixin-module';
+
+// import Vue from 'vue';
+import wxApi from '~/api/wx/index.js';
+
+export default function (c, i) {
+  // Vue.config.optionMergeStrategies.wxReady = function (toVal, fromVal) {
+  //   console.log(
+  //     '🚀 ~ file: jweixin.js ~ line 10 ~ toVal, fromVal',
+  //     toVal,
+  //     fromVal,
+  //   );
+  //   // 返回合并后的值
+  //   return [];
+  // };
+
+  const { app } = c;
+  i('wx', wx);
+
+  app.router.afterEach(async (to, from) => {
+    // 微信js签名注册
+    try {
+      // if (to.matched[0].instances.default) {
+      //   to.matched[0].instances.default.$emit('wxReady');
+      // } else {
+      //   console.log(to.matched[0].components.default);
+
+      //   // to.matched[0].components.default.mixin({
+      //   //   mounted() {
+      //   //     console.log('wxReady');
+      //   //     this.$emit('wxReady');
+      //   //   },
+      //   // });
+      // }
+      const res = await wxApi(c).getConfig(location.href);
+      await new Promise((resolve, reject) => {
+        wx.config({
+          debug: true, // 开启调试模式,调用的所有 api 的返回值会在客户端 alert 出来,若要查看传入的参数,可以在 pc 端打开,参数信息会通过 log 打出,仅在 pc 端时才会打印。
+          appId: res.data.appId, // 必填,公众号的唯一标识
+          timestamp: res.data.timestamp, // 必填,生成签名的时间戳
+          nonceStr: res.data.nonceStr, // 必填,生成签名的随机串
+          signature: res.data.signature, // 必填,签名
+          jsApiList: [], // 必填,需要使用的 JS 接口列表
+        });
+        wx.ready(resolve);
+        wx.error(reject);
+      });
+    } catch (error) {}
+  });
+}

+ 24 - 0
plugins/native.js

@@ -0,0 +1,24 @@
+export default function ({ $userAgent }, i) {
+  const before = () => {
+    if ($userAgent.isApp) {
+      return;
+    }
+    throw new Error('非App环境');
+  };
+
+  i('native', {
+    share({ title, content, gotoUrl, shareImg }) {
+      before();
+      if ($userAgent.isIos) {
+        window.webkit.messageHandlers.share.postMessage({
+          title,
+          content,
+          gotoUrl,
+          shareImg,
+        });
+      } else {
+        window.native.share(title, content, gotoUrl, shareImg);
+      }
+    },
+  });
+}

+ 52 - 0
plugins/umeng-datasources.js

@@ -0,0 +1,52 @@
+export default function (c, i) {
+  const { app } = c;
+  app.head.script = app.head.script || [];
+
+  // app.head.meta.push({
+  //   hid: 'umeng-datasources',
+  //   name: 'umeng-datasources',
+  //   content: 'umeng-datasources',
+  // });
+
+  // (function (w, d, s, q, i) {
+  //   w[q] = w[q] || [];
+  //   var f = d.getElementsByTagName(s)[0],
+  //     j = d.createElement(s);
+  //   j.async = true;
+  //   j.id = 'beacon-aplus';
+  //   j.src = 'https://d.alicdn.com/alilog/mlog/aplus/' + i + '.js';
+  //   f.parentNode.insertBefore(j, f);
+  // })(window, document, 'script', 'aplus_queue', '203467608');
+
+  window.aplus_queue = window.aplus_queue || [];
+  app.head.script.push({
+    src: `https://d.alicdn.com/alilog/mlog/aplus/203467608.js`,
+    id: 'beacon-aplus',
+  });
+  window.aplus_queue.push({
+    action: 'aplus.setMetaInfo',
+    arguments: ['appKey', process.env.UMENG_DATASOURCES_APP_KEY],
+  });
+  window.aplus_queue.push({
+    action: 'aplus.setMetaInfo',
+    arguments: ['aplus-waiting', 'MAN'],
+  });
+  window.aplus_queue.push({
+    action: 'aplus.setMetaInfo',
+    arguments: ['DEBUG', true],
+  });
+
+  app.router.afterEach((to, from) => {
+    // 上报PV
+    window.aplus_queue.push({
+      action: 'aplus.sendPV',
+      arguments: [
+        { is_auto: false },
+        {
+          to: to.fullPath,
+          from: from.fullPath,
+        },
+      ],
+    });
+  });
+}

+ 22 - 0
plugins/user-agent.js

@@ -0,0 +1,22 @@
+export default function (c, i) {
+  i('userAgent', {
+    get isIos() {
+      return /iPad|iPhone|iPod/i.test(navigator.userAgent);
+    },
+    get isAndroid() {
+      return /Android/i.test(navigator.userAgent);
+    },
+    get isApp() {
+      return /SZX/i.test(navigator.userAgent);
+    },
+    get isMobile() {
+      return /Mobile/i.test(navigator.userAgent);
+    },
+    get isWx() {
+      return /MicroMessenger/i.test(navigator.userAgent);
+    },
+    get isMiniProgram() {
+      return /miniProgram/i.test(navigator.userAgent);
+    },
+  });
+}

+ 4 - 0
plugins/vue-data-dict.js

@@ -0,0 +1,4 @@
+import Vue from 'vue';
+import VueDataDict from 'vue-data-dict';
+
+Vue.use(VueDataDict, {});

File diff suppressed because it is too large
+ 10412 - 0
pnpm-lock.yaml


+ 60 - 0
schemes/password.js

@@ -0,0 +1,60 @@
+import { createHash } from 'crypto';
+import JSEncrypt from 'jsencrypt';
+import { LocalScheme } from '~auth/runtime';
+// const { createHash } = await import('node:crypto');
+let publicKey;
+const encrypt = new JSEncrypt();
+
+export default class CustomScheme extends LocalScheme {
+  async login(endpoint, { reset = true } = {}) {
+    endpoint.data = Object.assign({}, endpoint.data);
+
+    if (!this.options.endpoints.login) {
+      return;
+    }
+    if (reset) {
+      this.$auth.reset({ resetInterceptor: false });
+    }
+    if (this.options.clientId) {
+      endpoint.data.client_id = this.options.clientId;
+    }
+    if (this.options.grantType) {
+      endpoint.data.grant_type = this.options.grantType;
+    }
+    if (this.options.scope) {
+      endpoint.data.scope = this.options.scope;
+    }
+
+    if (!publicKey) {
+      publicKey = (
+        await this.$auth.ctx.$axios.$post('/user/v1/client/login/getPbKey')
+      ).data.publicKey;
+      encrypt.setPublicKey(publicKey);
+    }
+    console.log(
+      '🚀 ~ file: password.js ~ line 37 ~ CustomScheme ~ login ~ publicKey',
+      publicKey,
+    );
+    const md5 = createHash('md5');
+
+    endpoint.data.password = encrypt.encrypt(
+      md5.update(endpoint.data.password, 'utf-8').digest('hex'),
+    );
+    // privateEncrypt(publicKey, endpoint.data.md5).toString('base64');
+    // endpoint.data.uuid = '132514568481654';
+    endpoint.data.client = 7;
+
+    const response = await this.$auth.request(
+      endpoint,
+      this.options.endpoints.login,
+    );
+    this.updateTokens(response);
+    if (!this.requestHandler.interceptor) {
+      this.initializeRequestInterceptor();
+    }
+    if (this.options.user.autoFetch) {
+      await this.fetchUser();
+    }
+    return response;
+  }
+}

+ 202 - 202
androidscloudH5/css/style.css

@@ -1,202 +1,202 @@
-body {
-	margin: 0;
-	padding: 0;
-	background-color: #f7f8fb;
-}
-
-img {
-	/* 	width: 100%;
-	height: 100%; */
-	object-fit: cover;
-}
-
-input,
-select {
-	outline: none;
-	background-color: transparent;
-	border: 0;
-	margin: 0;
-}
-
-a {
-	text-decoration: none;
-}
-
-.wrap {
-	width: 100%;
-	height: 100%;
-	overflow: hidden;
-}
-
-.page {
-	width: 100%;
-	position: relative;
-	background: url(../image/bg_IMG.png) center top no-repeat;
-	background-size: 100%;
-	-moz-background-size: 100%;
-	height: 91.59375rem;
-
-}
-
-.pagelong {
-	width: 100%;
-	position: relative;
-	background: url(../image/longwu/long_bj.png) center top no-repeat;
-	background-size: 100%;
-	-moz-background-size: 100%;
-	height: 198.25rem;
-
-}
-
-.pageGfwx {
-	width: 100%;
-	position: relative;
-	background: url(../image/gfxx/bj_gfxx.png) center top no-repeat;
-	background-size: 100%;
-	-moz-background-size: 100%;
-	height: 52.25rem;
-}
-
-.pageGfwx .btn {
-  position: absolute;
-  top: 34.5625rem;
-  left: 50%;
-  margin-left: -4.484375rem;
-}
-
-.pageGfwx .btn img {
-  width: 8.96875rem;
-  height: 2.75rem;
-}
-
-
-.top_navlong{
-	background: url(../image/longwu/topnav750.png) center top no-repeat !important;
-	background-size: 100% !important;
-	-moz-background-size: 100% !important;
-}
-.top_nav {
-	position: fixed;
-	width: 23.4375rem;
-	height: 3.8125rem;
-	background: url(../image/topnav750.png) center top no-repeat;
-	background-size: 100%;
-	-moz-background-size: 100%;
-	top: 0;
-}
-
-.top_nav img {
-	width: 7.65625rem;
-	position: absolute;
-	right: 0.7rem;
-	top: 0.7rem;
-
-}
-
-.centerBtn {
-	padding-top: 35rem;
-	text-align: center;
-}
-
-.centerBtnLong {
-	padding-top: 41rem !important;
-	text-align: center;
-}
-
-.centerBtn img {
-	width: 9.9375rem;
-}
-
-.download-btn-2 {
-	position: absolute;
-	bottom: 3%;
-}
-
-.download-btn-2 img {
-	margin: 0 auto;
-}
-
-header {
-	width: 100%;
-}
-
-.default-menu.navbar {
-	padding-bottom: 0;
-	padding-top: 0;
-	min-height: 70px;
-	margin-bottom: 0;
-	background-color: #ffffff;
-	font-family: "Raleway", sans-serif;
-	position: fixed;
-}
-
-.navbar {
-	padding-bottom: 0;
-	padding-top: 0;
-	min-height: 70px;
-	margin-bottom: 0;
-	background-color: #ffffff;
-	font-family: "Raleway", sans-serif;
-	position: fixed;
-	width: 100%;
-	z-index: 10;
-
-}
-
-.container-fluid {
-	padding: 1rem 0.7rem;
-}
-
-.navbar img {
-	width: 5.3rem;
-	height: 100%;
-}
-
-.font_img img {
-	width: 1.375rem;
-	margin-right: 0.78125rem;
-}
-
-.font_imgLong img {
-	width: 1.1875rem;
-	margin-right: 0.78125rem;    margin-top: 0.1rem;
-}
-
-.font_size {
-	font-size: 1rem;
-	font-family: Source Han Sans CN;
-	font-weight: 400;
-	color: #620C0C;
-}
-
-.font_sizeLong {
-	font-size: .9rem;
-	font-family: Source Han Sans CN;
-	font-weight: 400;
-	color: #FFFFFF;
-	line-height: 1.5;
-}
-
-/* .font_li div{
-	display: inline-block;
-} */
-.font_li {
-	display: flex;
-	margin-left: 2rem;
-	margin-bottom: 0.625rem;
-}
-
-.font_liLong {
-	display: flex;
-	margin-left: 3rem;
-	margin-bottom: .6rem;
-}
-
-.font_b {
-	margin-top: 39.5rem;    padding-right: 2rem
-}
-
-.font_blong {
-	margin-top: 7.5rem;
-	padding-right: 3rem;
-}
+body {
+	margin: 0;
+	padding: 0;
+	background-color: #f7f8fb;
+}
+
+img {
+	/* 	width: 100%;
+	height: 100%; */
+	object-fit: cover;
+}
+
+input,
+select {
+	outline: none;
+	background-color: transparent;
+	border: 0;
+	margin: 0;
+}
+
+a {
+	text-decoration: none;
+}
+
+.wrap {
+	width: 100%;
+	height: 100%;
+	overflow: hidden;
+}
+
+.page {
+	width: 100%;
+	position: relative;
+	background: url(../image/bg_IMG.png) center top no-repeat;
+	background-size: 100%;
+	-moz-background-size: 100%;
+	height: 91.59375rem;
+
+}
+
+.pagelong {
+	width: 100%;
+	position: relative;
+	background: url(../image/longwu/long_bj.png) center top no-repeat;
+	background-size: 100%;
+	-moz-background-size: 100%;
+	height: 198.25rem;
+
+}
+
+.pageGfwx {
+	width: 100%;
+	position: relative;
+	background: url(../image/gfxx/bj_gfxx.png) center top no-repeat;
+	background-size: 100%;
+	-moz-background-size: 100%;
+	height: 52.25rem;
+}
+
+.pageGfwx .btn {
+  position: absolute;
+  top: 34.5625rem;
+  left: 50%;
+  margin-left: -4.484375rem;
+}
+
+.pageGfwx .btn img {
+  width: 8.96875rem;
+  height: 2.75rem;
+}
+
+
+.top_navlong{
+	background: url(../image/longwu/topnav750.png) center top no-repeat !important;
+	background-size: 100% !important;
+	-moz-background-size: 100% !important;
+}
+.top_nav {
+	position: fixed;
+	width: 23.4375rem;
+	height: 3.8125rem;
+	background: url(../image/topnav750.png) center top no-repeat;
+	background-size: 100%;
+	-moz-background-size: 100%;
+	top: 0;
+}
+
+.top_nav img {
+	width: 7.65625rem;
+	position: absolute;
+	right: 0.7rem;
+	top: 0.7rem;
+
+}
+
+.centerBtn {
+	padding-top: 35rem;
+	text-align: center;
+}
+
+.centerBtnLong {
+	padding-top: 41rem !important;
+	text-align: center;
+}
+
+.centerBtn img {
+	width: 9.9375rem;
+}
+
+.download-btn-2 {
+	position: absolute;
+	bottom: 3%;
+}
+
+.download-btn-2 img {
+	margin: 0 auto;
+}
+
+header {
+	width: 100%;
+}
+
+.default-menu.navbar {
+	padding-bottom: 0;
+	padding-top: 0;
+	min-height: 70px;
+	margin-bottom: 0;
+	background-color: #ffffff;
+	font-family: "Raleway", sans-serif;
+	position: fixed;
+}
+
+.navbar {
+	padding-bottom: 0;
+	padding-top: 0;
+	min-height: 70px;
+	margin-bottom: 0;
+	background-color: #ffffff;
+	font-family: "Raleway", sans-serif;
+	position: fixed;
+	width: 100%;
+	z-index: 10;
+
+}
+
+.container-fluid {
+	padding: 1rem 0.7rem;
+}
+
+.navbar img {
+	width: 5.3rem;
+	height: 100%;
+}
+
+.font_img img {
+	width: 1.375rem;
+	margin-right: 0.78125rem;
+}
+
+.font_imgLong img {
+	width: 1.1875rem;
+	margin-right: 0.78125rem;    margin-top: 0.1rem;
+}
+
+.font_size {
+	font-size: 1rem;
+	font-family: Source Han Sans CN;
+	font-weight: 400;
+	color: #620C0C;
+}
+
+.font_sizeLong {
+	font-size: .9rem;
+	font-family: Source Han Sans CN;
+	font-weight: 400;
+	color: #FFFFFF;
+	line-height: 1.5;
+}
+
+/* .font_li div{
+	display: inline-block;
+} */
+.font_li {
+	display: flex;
+	margin-left: 2rem;
+	margin-bottom: 0.625rem;
+}
+
+.font_liLong {
+	display: flex;
+	margin-left: 3rem;
+	margin-bottom: .6rem;
+}
+
+.font_b {
+	margin-top: 39.5rem;    padding-right: 2rem
+}
+
+.font_blong {
+	margin-top: 7.5rem;
+	padding-right: 3rem;
+}

androidscloudH5/gzhDownload.html → static/androidscloudH5/gzhDownload.html


androidscloudH5/image/1_750.png → static/androidscloudH5/image/1_750.png


androidscloudH5/image/2_750.png → static/androidscloudH5/image/2_750.png


androidscloudH5/image/39ce1a05e2bb4fb0833a4ff9c55511f3.png → static/androidscloudH5/image/39ce1a05e2bb4fb0833a4ff9c55511f3.png


androidscloudH5/image/3_750.png → static/androidscloudH5/image/3_750.png


androidscloudH5/image/4_750.png → static/androidscloudH5/image/4_750.png


androidscloudH5/image/CPS-梦缘大话西游落地页55.jpg → static/androidscloudH5/image/CPS-梦缘大话西游落地页55.jpg


androidscloudH5/image/android.png → static/androidscloudH5/image/android.png


androidscloudH5/image/bg.jpg → static/androidscloudH5/image/bg.jpg


androidscloudH5/image/bg_IMG.png → static/androidscloudH5/image/bg_IMG.png


androidscloudH5/image/bj.png → static/androidscloudH5/image/bj.png


androidscloudH5/image/bottom.png → static/androidscloudH5/image/bottom.png


androidscloudH5/image/bottom750.png → static/androidscloudH5/image/bottom750.png


androidscloudH5/image/f03058dcf27d4599b062ad31a46d5900.png → static/androidscloudH5/image/f03058dcf27d4599b062ad31a46d5900.png


androidscloudH5/image/gfxx/bj_gfxx.png → static/androidscloudH5/image/gfxx/bj_gfxx.png


androidscloudH5/image/gfxx/btn.png → static/androidscloudH5/image/gfxx/btn.png


androidscloudH5/image/ios.png → static/androidscloudH5/image/ios.png


androidscloudH5/image/jzsy/bottom750.png → static/androidscloudH5/image/jzsy/bottom750.png


androidscloudH5/image/jzsy/long_1.png → static/androidscloudH5/image/jzsy/long_1.png


androidscloudH5/image/jzsy/long_2.png → static/androidscloudH5/image/jzsy/long_2.png


androidscloudH5/image/jzsy/long_3.png → static/androidscloudH5/image/jzsy/long_3.png


androidscloudH5/image/jzsy/long_bj.png → static/androidscloudH5/image/jzsy/long_bj.png


androidscloudH5/image/jzsy/topBtn750.png → static/androidscloudH5/image/jzsy/topBtn750.png


androidscloudH5/image/jzsy/topnav750.png → static/androidscloudH5/image/jzsy/topnav750.png


androidscloudH5/image/longwu/btn-下载.png → static/androidscloudH5/image/longwu/btn-下载.png


androidscloudH5/image/longwu/long_1.png → static/androidscloudH5/image/longwu/long_1.png


androidscloudH5/image/longwu/long_2.png → static/androidscloudH5/image/longwu/long_2.png


androidscloudH5/image/longwu/long_3.png → static/androidscloudH5/image/longwu/long_3.png


androidscloudH5/image/longwu/long_4.png → static/androidscloudH5/image/longwu/long_4.png


androidscloudH5/image/longwu/long_5.png → static/androidscloudH5/image/longwu/long_5.png


androidscloudH5/image/longwu/long_bj.png → static/androidscloudH5/image/longwu/long_bj.png


androidscloudH5/image/longwu/topnav750.png → static/androidscloudH5/image/longwu/topnav750.png


androidscloudH5/image/longwu/topnav75055.png → static/androidscloudH5/image/longwu/topnav75055.png


androidscloudH5/image/longwu/下载双子星.png → static/androidscloudH5/image/longwu/下载双子星.png


androidscloudH5/image/num1.png → static/androidscloudH5/image/num1.png


androidscloudH5/image/num2.png → static/androidscloudH5/image/num2.png


androidscloudH5/image/num3.png → static/androidscloudH5/image/num3.png


androidscloudH5/image/num4.png → static/androidscloudH5/image/num4.png


androidscloudH5/image/rxfs/bottom750.png → static/androidscloudH5/image/rxfs/bottom750.png


+ 0 - 0
androidscloudH5/image/rxfs/long_1.png


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