ytf лет назад: 3
Родитель
Сommit
3c59d79a87
100 измененных файлов с 28680 добавлено и 0 удалено
  1. BIN
      admin/.DS_Store
  2. 24 0
      admin/.circleci/config.yml
  3. 35 0
      admin/.dockerignore
  4. 16 0
      admin/.editorconfig
  5. 3 0
      admin/.eslintignore
  6. 39 0
      admin/.eslintrc.js
  7. 5 0
      admin/.firebaserc
  8. 7 0
      admin/.prettierignore
  9. 11 0
      admin/.prettierrc
  10. 9 0
      admin/.stylelintrc.json
  11. 46 0
      admin/CODE_OF_CONDUCT.md
  12. 12 0
      admin/Dockerfile
  13. 11 0
      admin/Dockerfile.dev
  14. 11 0
      admin/Dockerfile.hub
  15. 21 0
      admin/LICENSE
  16. 131 0
      admin/README.md
  17. 102 0
      admin/README.ru-RU.md
  18. 121 0
      admin/README.zh-CN.md
  19. 26 0
      admin/appveyor.yml
  20. 114 0
      admin/config/config.js
  21. 33 0
      admin/config/plugin.config.js
  22. 831 0
      admin/config/router.config.js
  23. 14 0
      admin/docker/docker-compose.dev.yml
  24. 21 0
      admin/docker/docker-compose.yml
  25. 22 0
      admin/docker/nginx.conf
  26. 13 0
      admin/firebase.json
  27. 9 0
      admin/functions/index.js
  28. 117 0
      admin/functions/matchMock.js
  29. 23 0
      admin/functions/package.json
  30. 15 0
      admin/jest-puppeteer.config.js
  31. 4 0
      admin/jest.config.js
  32. 10 0
      admin/jsconfig.json
  33. 13 0
      admin/netlify.toml
  34. 26093 0
      admin/package-lock.json
  35. 129 0
      admin/package.json
  36. BIN
      admin/public/.DS_Store
  37. BIN
      admin/public/favicon.png
  38. BIN
      admin/public/pc_diy_img/adv_floor_02_goods.png
  39. BIN
      admin/public/pc_diy_img/adv_floor_02_left.png
  40. BIN
      admin/public/pc_diy_img/adv_floor_02_right.png
  41. 3 0
      admin/scripts/generateMock.js
  42. 46 0
      admin/scripts/lint-prettier.js
  43. 56 0
      admin/scripts/prettier.js
  44. BIN
      admin/src/.DS_Store
  45. BIN
      admin/src/assets/.DS_Store
  46. BIN
      admin/src/assets/add_goods_step.png
  47. 1 0
      admin/src/assets/area.json
  48. BIN
      admin/src/assets/balance_bj.png
  49. BIN
      admin/src/assets/bill/.DS_Store
  50. BIN
      admin/src/assets/bill/1_cur.png
  51. BIN
      admin/src/assets/bill/1_no.png
  52. BIN
      admin/src/assets/bill/1_pass.png
  53. BIN
      admin/src/assets/bill/2_cur.png
  54. BIN
      admin/src/assets/bill/2_no.png
  55. BIN
      admin/src/assets/bill/2_pass.png
  56. BIN
      admin/src/assets/bill/3_cur.png
  57. BIN
      admin/src/assets/bill/3_no.png
  58. BIN
      admin/src/assets/bill/3_pass.png
  59. BIN
      admin/src/assets/bill/4_cur.png
  60. BIN
      admin/src/assets/bill/4_no.png
  61. BIN
      admin/src/assets/bill/4_pass.png
  62. BIN
      admin/src/assets/bill/detail_total_icon.png
  63. BIN
      admin/src/assets/coupons_bj.png
  64. BIN
      admin/src/assets/css/.DS_Store
  65. 98 0
      admin/src/assets/css/manage.less
  66. 371 0
      admin/src/assets/css/promotion.less
  67. 14 0
      admin/src/assets/css/store.less
  68. BIN
      admin/src/assets/del_icon.png
  69. BIN
      admin/src/assets/del_icon_hover.png
  70. BIN
      admin/src/assets/express_empty.png
  71. BIN
      admin/src/assets/home_basic/exchange_num.png
  72. BIN
      admin/src/assets/home_basic/exchange_num_2.png
  73. BIN
      admin/src/assets/home_basic/return_num.png
  74. BIN
      admin/src/assets/home_basic/return_num_2.png
  75. BIN
      admin/src/assets/home_basic/sld_goods_num.png
  76. BIN
      admin/src/assets/home_basic/sld_goods_num_2.png
  77. BIN
      admin/src/assets/home_basic/sld_goods_num_new.png
  78. BIN
      admin/src/assets/home_basic/sld_goods_num_new_2.png
  79. BIN
      admin/src/assets/home_basic/sld_member_num.png
  80. BIN
      admin/src/assets/home_basic/sld_member_num_2.png
  81. BIN
      admin/src/assets/home_basic/sld_member_num_new.png
  82. BIN
      admin/src/assets/home_basic/sld_member_num_new_2.png
  83. BIN
      admin/src/assets/home_basic/sld_order_amount.png
  84. BIN
      admin/src/assets/home_basic/sld_order_amount_2.png
  85. BIN
      admin/src/assets/home_basic/sld_order_num.png
  86. BIN
      admin/src/assets/home_basic/sld_order_num_2.png
  87. BIN
      admin/src/assets/home_basic/sld_store_num.png
  88. BIN
      admin/src/assets/home_basic/sld_store_num_new.png
  89. BIN
      admin/src/assets/home_basic/sld_vendor_num.png
  90. BIN
      admin/src/assets/home_basic/sld_vendor_num_2.png
  91. BIN
      admin/src/assets/home_basic/sld_vendor_num_new.png
  92. BIN
      admin/src/assets/home_basic/sld_vendor_num_new_2.png
  93. BIN
      admin/src/assets/home_basic/top_num.png
  94. BIN
      admin/src/assets/home_basic/top_num_1.png
  95. BIN
      admin/src/assets/home_basic/wait_deliver.png
  96. BIN
      admin/src/assets/home_basic/wait_deliver_2.png
  97. BIN
      admin/src/assets/home_basic/wait_pay.png
  98. BIN
      admin/src/assets/home_basic/wait_pay_2.png
  99. BIN
      admin/src/assets/integral_bj.png
  100. 0 0
      admin/src/assets/m_diy_img/.DS_Store

BIN
admin/.DS_Store


+ 24 - 0
admin/.circleci/config.yml

@@ -0,0 +1,24 @@
1
+version: 2
2
+jobs:
3
+  build:
4
+    docker:
5
+      - image: circleci/node:latest
6
+    steps:
7
+      - checkout
8
+      - run: npm install
9
+      - run: npm run build
10
+  test:
11
+    docker:
12
+      - image: circleci/node:latest-browsers
13
+    steps:
14
+      - checkout
15
+      - run: npm install
16
+      - run: 
17
+          command : npm run test:all
18
+          no_output_timeout : 30m
19
+workflows:
20
+  version: 2
21
+  build_and_test:
22
+    jobs:
23
+      - build
24
+      - test

+ 35 - 0
admin/.dockerignore

@@ -0,0 +1,35 @@
1
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2
+
3
+# dependencies
4
+**/node_modules
5
+/src/utils/request-temp.js
6
+
7
+# production
8
+/.vscode
9
+
10
+# misc
11
+.DS_Store
12
+npm-debug.log*
13
+yarn-error.log
14
+
15
+/coverage
16
+.idea
17
+yarn.lock
18
+package-lock.json
19
+*bak
20
+.vscode
21
+
22
+# visual studio code
23
+.history
24
+*.log
25
+
26
+functions/mock
27
+.temp/**
28
+
29
+# umi
30
+.umi
31
+.umi-production
32
+
33
+# screenshot
34
+screenshot
35
+.firebase

+ 16 - 0
admin/.editorconfig

@@ -0,0 +1,16 @@
1
+# http://editorconfig.org
2
+root = true
3
+
4
+[*]
5
+indent_style = space
6
+indent_size = 2
7
+end_of_line = lf
8
+charset = utf-8
9
+trim_trailing_whitespace = true
10
+insert_final_newline = true
11
+
12
+[*.md]
13
+trim_trailing_whitespace = false
14
+
15
+[Makefile]
16
+indent_style = tab

+ 3 - 0
admin/.eslintignore

@@ -0,0 +1,3 @@
1
+/functions/mock/**
2
+/scripts
3
+/config

+ 39 - 0
admin/.eslintrc.js

@@ -0,0 +1,39 @@
1
+module.exports = {
2
+  parser: 'babel-eslint',
3
+  extends: ['airbnb', 'prettier', 'plugin:compat/recommended'],
4
+  env: {
5
+    browser: true,
6
+    node: true,
7
+    es6: true,
8
+    mocha: true,
9
+    jest: true,
10
+    jasmine: true,
11
+  },
12
+  globals: {
13
+    APP_TYPE: true,
14
+    page: true,
15
+  },
16
+  rules: {
17
+    'react/jsx-filename-extension': [1, { extensions: ['.js'] }],
18
+    'react/jsx-wrap-multilines': 0,
19
+    'react/prop-types': 0,
20
+    'react/forbid-prop-types': 0,
21
+    'react/jsx-one-expression-per-line': 0,
22
+    'import/no-unresolved': [2, { ignore: ['^@/', '^umi/'] }],
23
+    'import/no-extraneous-dependencies': [
24
+      2,
25
+      {
26
+        optionalDependencies: true,
27
+        devDependencies: ['**/tests/**.js', '/mock/**.js', '**/**.test.js'],
28
+      },
29
+    ],
30
+    'jsx-a11y/no-noninteractive-element-interactions': 0,
31
+    'jsx-a11y/click-events-have-key-events': 0,
32
+    'jsx-a11y/no-static-element-interactions': 0,
33
+    'jsx-a11y/anchor-is-valid': 0,
34
+    'linebreak-style': 0,
35
+  },
36
+  settings: {
37
+    polyfills: ['fetch', 'promises', 'url'],
38
+  },
39
+};

+ 5 - 0
admin/.firebaserc

@@ -0,0 +1,5 @@
1
+{
2
+  "projects": {
3
+    "default": "antd-pro"
4
+  }
5
+}

+ 7 - 0
admin/.prettierignore

@@ -0,0 +1,7 @@
1
+**/*.md
2
+**/*.svg
3
+**/*.ejs
4
+**/*.html
5
+package.json
6
+.umi
7
+.umi-production

+ 11 - 0
admin/.prettierrc

@@ -0,0 +1,11 @@
1
+{
2
+  "singleQuote": true,
3
+  "trailingComma": "es5",
4
+  "printWidth": 100,
5
+  "overrides": [
6
+    {
7
+      "files": ".prettierrc",
8
+      "options": { "parser": "json" }
9
+    }
10
+  ]
11
+}

+ 9 - 0
admin/.stylelintrc.json

@@ -0,0 +1,9 @@
1
+{
2
+  "extends": ["stylelint-config-standard", "stylelint-config-prettier"],
3
+  "rules": {
4
+    "declaration-empty-line-before": null,
5
+    "no-descending-specificity": null,
6
+    "selector-pseudo-class-no-unknown": null,
7
+    "selector-pseudo-element-colon-notation": null
8
+  }
9
+}

+ 46 - 0
admin/CODE_OF_CONDUCT.md

@@ -0,0 +1,46 @@
1
+# Contributor Covenant Code of Conduct
2
+
3
+## Our Pledge
4
+
5
+In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
6
+
7
+## Our Standards
8
+
9
+Examples of behavior that contributes to creating a positive environment include:
10
+
11
+* Using welcoming and inclusive language
12
+* Being respectful of differing viewpoints and experiences
13
+* Gracefully accepting constructive criticism
14
+* Focusing on what is best for the community
15
+* Showing empathy towards other community members
16
+
17
+Examples of unacceptable behavior by participants include:
18
+
19
+* The use of sexualized language or imagery and unwelcome sexual attention or advances
20
+* Trolling, insulting/derogatory comments, and personal or political attacks
21
+* Public or private harassment
22
+* Publishing others' private information, such as a physical or electronic address, without explicit permission
23
+* Other conduct which could reasonably be considered inappropriate in a professional setting
24
+
25
+## Our Responsibilities
26
+
27
+Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
28
+
29
+Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
30
+
31
+## Scope
32
+
33
+This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
34
+
35
+## Enforcement
36
+
37
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at afc163@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
38
+
39
+Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
40
+
41
+## Attribution
42
+
43
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
44
+
45
+[homepage]: http://contributor-covenant.org
46
+[version]: http://contributor-covenant.org/version/1/4/

+ 12 - 0
admin/Dockerfile

@@ -0,0 +1,12 @@
1
+FROM circleci/node:latest-browsers
2
+
3
+WORKDIR /usr/src/app/
4
+USER root
5
+COPY package.json ./
6
+RUN yarn
7
+
8
+COPY ./ ./
9
+
10
+RUN npm run test:all
11
+
12
+CMD ["npm", "run", "build"]

+ 11 - 0
admin/Dockerfile.dev

@@ -0,0 +1,11 @@
1
+FROM node:latest
2
+
3
+WORKDIR /usr/src/app/
4
+
5
+COPY package.json ./
6
+RUN npm install --silent --no-cache
7
+
8
+COPY ./ ./
9
+
10
+
11
+CMD ["npm", "run", "start"]

+ 11 - 0
admin/Dockerfile.hub

@@ -0,0 +1,11 @@
1
+FROM nginx
2
+
3
+WORKDIR /usr/src/app/
4
+
5
+COPY ./docker/nginx.conf /etc/nginx/conf.d/default.conf
6
+
7
+COPY ./dist  /usr/share/nginx/html/
8
+
9
+EXPOSE 80
10
+
11
+CMD ["nginx", "-g", "daemon off;"]

+ 21 - 0
admin/LICENSE

@@ -0,0 +1,21 @@
1
+MIT License
2
+
3
+Copyright (c) 2018 Alipay.inc
4
+
5
+Permission is hereby granted, free of charge, to any person obtaining a copy
6
+of this software and associated documentation files (the "Software"), to deal
7
+in the Software without restriction, including without limitation the rights
8
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+copies of the Software, and to permit persons to whom the Software is
10
+furnished to do so, subject to the following conditions:
11
+
12
+The above copyright notice and this permission notice shall be included in all
13
+copies or substantial portions of the Software.
14
+
15
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+SOFTWARE.

Разница между файлами не показана из-за своего большого размера
+ 131 - 0
admin/README.md


Разница между файлами не показана из-за своего большого размера
+ 102 - 0
admin/README.ru-RU.md


Разница между файлами не показана из-за своего большого размера
+ 121 - 0
admin/README.zh-CN.md


+ 26 - 0
admin/appveyor.yml

@@ -0,0 +1,26 @@
1
+# Test against the latest version of this Node.js version
2
+environment:
3
+  nodejs_version: "8"
4
+
5
+# this is how to allow failing jobs in the matrix
6
+matrix:
7
+  fast_finish: true     # set this flag to immediately finish build once one of the jobs fails.
8
+
9
+# Install scripts. (runs after repo cloning)
10
+install:
11
+  # Get the latest stable version of Node.js or io.js
12
+  - ps: Install-Product node $env:nodejs_version
13
+  # install modules
14
+  - npm install
15
+  # Output useful info for debugging.
16
+  - node --version
17
+  - npm --version
18
+
19
+# Post-install test scripts.
20
+test_script:
21
+  - npm run lint
22
+  - npm run test:all
23
+  - npm run build
24
+
25
+# Don't actually build.
26
+build: off

+ 114 - 0
admin/config/config.js

@@ -0,0 +1,114 @@
1
+// https://umijs.org/config/
2
+import os from 'os';
3
+import pageRoutes from './router.config';
4
+import webpackPlugin from './plugin.config';
5
+import defaultSettings from '../src/defaultSettings';
6
+
7
+const plugins = [
8
+  [
9
+    'umi-plugin-react',
10
+    {
11
+      antd: true,
12
+      dva: {
13
+        hmr: true,
14
+      },
15
+      targets: {
16
+        ie: 11,
17
+      },
18
+      locale: {
19
+        enable: true, // default false
20
+        default: 'zh-CN', // default zh-CN
21
+        baseNavigator: true, // default true, when it is true, will use `navigator.language` overwrite default
22
+      },
23
+      dynamicImport: {
24
+        loadingComponent: './components/PageLoading/index',
25
+      },
26
+      pwa: {
27
+        workboxPluginMode: 'InjectManifest',
28
+        workboxOptions: {
29
+          importWorkboxFrom: 'local',
30
+        },
31
+      },
32
+      ...(!process.env.TEST && os.platform() === 'darwin'
33
+        ? {
34
+            dll: {
35
+              include: ['dva', 'dva/router', 'dva/saga', 'dva/fetch'],
36
+              exclude: ['@babel/runtime'],
37
+            },
38
+          }
39
+        : {}),
40
+    },
41
+  ],
42
+];
43
+
44
+// 针对 preview.pro.ant.design 的 GA 统计代码
45
+// 业务上不需要这个
46
+if (process.env.APP_TYPE === 'site') {
47
+  plugins.push([
48
+    'umi-plugin-ga',
49
+    {
50
+      code: 'UA-72788897-6',
51
+    },
52
+  ]);
53
+}
54
+
55
+export default {
56
+  // add for transfer to umi
57
+  plugins,
58
+  targets: {
59
+    ie: 11,
60
+  },
61
+  define: {
62
+    APP_TYPE: process.env.APP_TYPE || '',
63
+  },
64
+  // 路由配置
65
+  routes: pageRoutes,
66
+  // Theme for antd
67
+  // https://ant.design/docs/react/customize-theme-cn
68
+  theme: {
69
+    'primary-color': defaultSettings.primaryColor,
70
+  },
71
+  externals: {
72
+    '@antv/data-set': 'DataSet',
73
+  },
74
+  // proxy: {
75
+  //   '/server/api/': {
76
+  //     target: 'https://preview.pro.ant.design/',
77
+  //     changeOrigin: true,
78
+  //     pathRewrite: { '^/server': '' },
79
+  //   },
80
+  // },
81
+  ignoreMomentLocale: true,
82
+  lessLoaderOptions: {
83
+    javascriptEnabled: true,
84
+  },
85
+  disableRedirectHoist: true,
86
+  cssLoaderOptions: {
87
+    modules: true,
88
+    getLocalIdent: (context, localIdentName, localName) => {
89
+      if (
90
+        context.resourcePath.includes('node_modules') ||
91
+        context.resourcePath.includes('ant.design.pro.less') ||
92
+        context.resourcePath.includes('global.less')
93
+      ) {
94
+        return localName;
95
+      }
96
+      const match = context.resourcePath.match(/src(.*)/);
97
+      if (match && match[1]) {
98
+        const antdProPath = match[1].replace('.less', '');
99
+        const arr = antdProPath
100
+          .split('/')
101
+          .map(a => a.replace(/([A-Z])/g, '-$1'))
102
+          .map(a => a.toLowerCase());
103
+        return `antd-pro${arr.join('-')}-${localName}`.replace(/--/g, '-');
104
+        // return `${localName}`;
105
+      }
106
+      return localName;
107
+    },
108
+  },
109
+  manifest: {
110
+    basePath: '/',
111
+  },
112
+
113
+  chainWebpack: webpackPlugin,
114
+};

+ 33 - 0
admin/config/plugin.config.js

@@ -0,0 +1,33 @@
1
+// Change theme plugin
2
+
3
+import MergeLessPlugin from 'antd-pro-merge-less';
4
+import AntDesignThemePlugin from 'antd-theme-webpack-plugin';
5
+import path from 'path';
6
+
7
+export default config => {
8
+  // pro 和 开发环境再添加这个插件
9
+  if (process.env.APP_TYPE === 'site' || process.env.NODE_ENV !== 'production') {
10
+    // 将所有 less 合并为一个供 themePlugin使用
11
+    const outFile = path.join(__dirname, '../.temp/ant-design-pro.less');
12
+    const stylesDir = path.join(__dirname, '../src/');
13
+
14
+    config.plugin('merge-less').use(MergeLessPlugin, [
15
+      {
16
+        stylesDir,
17
+        outFile,
18
+      },
19
+    ]);
20
+
21
+    config.plugin('ant-design-theme').use(AntDesignThemePlugin, [
22
+      {
23
+        antDir: path.join(__dirname, '../node_modules/antd'),
24
+        stylesDir,
25
+        varFile: path.join(__dirname, '../node_modules/antd/lib/style/themes/default.less'),
26
+        mainLessFile: outFile, //     themeVariables: ['@primary-color'],
27
+        indexFileName: 'index.html',
28
+        generateOne: true,
29
+        lessUrl: 'https://gw.alipayobjects.com/os/lib/less.js/3.8.1/less.min.js',
30
+      },
31
+    ]);
32
+  }
33
+};

+ 831 - 0
admin/config/router.config.js

@@ -0,0 +1,831 @@
1
+export default [
2
+  // user
3
+  {
4
+    path: '/user',
5
+    component: '../layouts/UserLayout',
6
+    routes: [
7
+      { path: '/user', redirect: '/user/login' },
8
+      { path: '/user/login', component: './User/Login' },
9
+    ],
10
+  },
11
+  {
12
+    path: '/pcdecorate_home/diy_page_lists_to_edit',
13
+    component: '../layouts/UserLayout',
14
+    Routes: ['src/pages/CheckLogin'],
15
+    routes: [
16
+      { path: '/pcdecorate_home/diy_page_lists_to_edit', component: './pcdecorate/home/edit_diy_page' },
17
+    ],
18
+  },
19
+  {
20
+    path: '/pcdecorate_topic/topic_diy_page_lists_to_edit',
21
+    component: '../layouts/UserLayout',
22
+    Routes: ['src/pages/CheckLogin'],
23
+    routes: [
24
+      { path: '/pcdecorate_topic/topic_diy_page_lists_to_edit', component: './pcdecorate/home/edit_diy_page' },
25
+    ],
26
+  },
27
+  // app
28
+  {
29
+    path: '/',
30
+    component: '../layouts/BasicLayout',
31
+    Routes: ['src/pages/CheckLogin'],
32
+    routes: [
33
+      { path: '/', redirect: '/sysset_home/basic' },
34
+      //系统配置—首页管理
35
+      {
36
+        path: '/sysset_home',
37
+        icon: 'home',
38
+        name: 'home',
39
+        routes: [
40
+          //概况页
41
+          {
42
+            path: '/sysset_home/basic',
43
+            name: 'basic',
44
+            component: './sysset/home/basic',
45
+          }],
46
+      },
47
+      //系统配置—基本配置
48
+      {
49
+        path: '/sysset_setting',
50
+        icon: 'setting',
51
+        name: 'setting',
52
+        routes: [
53
+          //站点配置
54
+          {
55
+            path: '/sysset_setting/site_info',
56
+            name: 'site_info',
57
+            component: './sysset/base/site_info',
58
+          },
59
+          //图片配置
60
+          {
61
+            path: '/sysset_setting/pic_set',
62
+            name: 'pic_set',
63
+            component: './sysset/base/pic_set',
64
+          },
65
+          //支付配置
66
+          {
67
+            path: '/sysset_setting/payment',
68
+            name: 'payment',
69
+            component: './sysset/base/payment',
70
+          },
71
+          //运营配置
72
+          {
73
+            path: '/sysset_setting/order',
74
+            name: 'order',
75
+            component: './sysset/base/order',
76
+          },
77
+          //APP配置
78
+          {
79
+            path: '/sysset_setting/app_set',
80
+            name: 'app_set',
81
+            component: './sysset/base/app_set',
82
+          },
83
+        ],
84
+      },
85
+      //系统配置—通知管理
86
+      {
87
+        path: '/sysset_notice_set',
88
+        icon: 'bell',
89
+        name: 'notice_set',
90
+        routes: [
91
+          //短信配置
92
+          {
93
+            path: '/sysset_notice_set/sms',
94
+            name: 'sms',
95
+            component: './sysset/notice_set/sms',
96
+          },
97
+          //邮件配置
98
+          {
99
+            path: '/sysset_notice_set/email',
100
+            name: 'email',
101
+            component: './sysset/notice_set/email',
102
+          },
103
+          //消息模板
104
+          {
105
+            path: '/sysset_notice_set/msg_tpl',
106
+            name: 'msg_tpl',
107
+            component: './sysset/notice_set/msg_tpl',
108
+          },
109
+
110
+        ],
111
+      },
112
+      // 系统配置—三方账号
113
+      {
114
+        path: '/sysset_acount',
115
+        icon: 'usergroup-add',
116
+        name: 'acount',
117
+        routes: [
118
+          //授权配置
119
+          {
120
+            path: '/sysset_acount/union_login',
121
+            name: 'union_login',
122
+            component: './sysset/acount/union_login',
123
+          },
124
+        ],
125
+      },
126
+      //系统配置—权限管理
127
+      {
128
+        path: '/sysset_authority',
129
+        icon: 'security-scan',
130
+        name: 'authority',
131
+        routes: [
132
+          //权限组
133
+          {
134
+            path: '/sysset_authority/authority_group',
135
+            name: 'authority_group',
136
+            component: './sysset/authority/group',
137
+          },
138
+          //操作员管理
139
+          {
140
+            path: '/sysset_authority/authority_member',
141
+            name: 'authority_member',
142
+            component: './sysset/authority/member',
143
+          },
144
+          //操作日志
145
+          {
146
+            path: '/sysset_authority/operate_log',
147
+            name: 'operate_log',
148
+            component: './sysset/authority/operate_log',
149
+          },
150
+        ],
151
+      },
152
+      //系统配置-协议管理
153
+      {
154
+        path: '/sysset_agreement',
155
+        icon: 'reconciliation',
156
+        name: 'agreement',
157
+        routes: [
158
+          //协议管理
159
+          {
160
+            path: '/sysset_agreement/lists',
161
+            name: 'lists',
162
+            component: './sysset/agreement/lists',
163
+          },
164
+          //编辑协议
165
+          {
166
+            path: '/sysset_agreement/lists_to_edit',
167
+            name: '',
168
+            component: './sysset/agreement/edit',
169
+          },
170
+        ],
171
+      },
172
+      //系统配置—物流管理
173
+      {
174
+        path: '/sysset_express',
175
+        icon: 'car',
176
+        name: 'express',
177
+        routes: [
178
+          //物流公司
179
+          {
180
+            path: '/sysset_express/express_lists',
181
+            name: 'express_lists',
182
+            component: './sysset/express/express_lists',
183
+          },
184
+          //物流配置
185
+          {
186
+            path: '/sysset_express/express',
187
+            name: 'express',
188
+            component: './sysset/express/express',
189
+          },
190
+        ],
191
+      },
192
+      // 会员管理
193
+      {
194
+        path: '/manage_member',
195
+        name: 'member',
196
+        icon: 'usergroup-add',
197
+        routes: [
198
+          //会员列表
199
+          {
200
+            path: '/manage_member/lists',
201
+            name: 'lists',
202
+            component: './manage/member/lists',
203
+          },
204
+          //会员详情
205
+          {
206
+            path: '/manage_member/lists_to_detail',
207
+            name: '',
208
+            component: './manage/member/detail',
209
+          },
210
+          //充值管理
211
+          {
212
+            path: '/manage_member/recharge',
213
+            name: 'recharge',
214
+            component: './manage/member/recharge',
215
+          },
216
+          //资金明细
217
+          {
218
+            path: '/manage_member/balance_log',
219
+            name: 'balance_log',
220
+            component: './manage/member/balance_log',
221
+          },
222
+          //积分设置
223
+          {
224
+            path: '/manage_member/point_setting',
225
+            name: 'point_setting',
226
+            component: './manage/member/point_set',
227
+          },
228
+        ],
229
+      },
230
+      // 商品管理
231
+      {
232
+        path: '/manage_product',
233
+        icon: 'appstore',
234
+        name: 'product',
235
+        routes: [
236
+          //商品设置
237
+          {
238
+            path: '/manage_product/goods_setting',
239
+            name: 'goods_setting',
240
+            component: './manage/product/goods_setting',
241
+          },
242
+          //商品列表
243
+          {
244
+            path: '/manage_product/goods_list',
245
+            name: 'goods_list',
246
+            component: './manage/product/goods_list',
247
+          },
248
+          //分类管理
249
+          {
250
+            path: '/manage_product/cate_lists',
251
+            name: 'cate_lists',
252
+            component: './manage/product/cate_lists',
253
+          },
254
+          //品牌列表
255
+          {
256
+            path: '/manage_product/brand',
257
+            name: 'brand',
258
+            component: './manage/product/brand',
259
+          },
260
+          //属性管理
261
+          {
262
+            path: '/manage_product/search_attr',
263
+            name: 'search_attr',
264
+            component: './manage/product/search_attr',
265
+          },
266
+          //商品标签
267
+          {
268
+            path: '/manage_product/goods_label',
269
+            name: 'goods_label',
270
+            component: './manage/product/goods_label',
271
+          },
272
+        ],
273
+      },
274
+      // PC装修
275
+      {
276
+        path: '/pcdecorate_home',
277
+        icon: 'cluster',
278
+        name: 'pc_home',
279
+        routes: [
280
+          // 模板列表
281
+          {
282
+            path: '/pcdecorate_home/tpl_lists',
283
+            name: 'tpl_lists',
284
+            component: './pcdecorate/home/tpl_lists',
285
+          },
286
+          // 实例化模版
287
+          {
288
+            path: '/pcdecorate_home/instance_template_lists',
289
+            name: 'instance_template_lists',
290
+            component: './pcdecorate/home/instance_template_lists',
291
+          },
292
+          // 新增/编辑模版
293
+          {
294
+            path: '/pcdecorate_home/instance_template_lists_to_add',
295
+            name: '',
296
+            component: './pcdecorate/home/add_template',
297
+          },
298
+          // // 测试模板
299
+          // {
300
+          //   path: '/pcdecorate_home/adv_222',
301
+          //   name: 'adv_222',
302
+          //   component: './pcdecorate/home/adv_222',
303
+          // },
304
+          // 首页装修
305
+          {
306
+            path: '/pcdecorate_home/diy_page_lists',
307
+            name: 'diy_page_lists',
308
+            component: './pcdecorate/home/diy_page_lists',
309
+          },
310
+          // 首页设置
311
+          {
312
+            path: '/pcdecorate_home/home_setting',
313
+            name: 'home_setting',
314
+            component: './pcdecorate/home/home_setting',
315
+          },
316
+          // 首页导航
317
+          {
318
+            path: '/pcdecorate_home/nav',
319
+            name: 'nav',
320
+            component: './pcdecorate/home/nav',
321
+          },
322
+          //页脚管理
323
+          {
324
+            path: '/pcdecorate_home/footer',
325
+            name: 'footer',
326
+            component: './pcdecorate/home/footer',
327
+          },
328
+        ],
329
+      },
330
+      // 专题装修
331
+      {
332
+        path: '/pcdecorate_topic',
333
+        icon: 'tool',
334
+        name: 'pc_decorate_topic',
335
+        routes: [
336
+          // 专题装修
337
+          {
338
+            path: '/pcdecorate_topic/topic_diy_page_lists',
339
+            name: 'topic_diy_page_lists',
340
+            component: './pcdecorate/topic/topic_diy_page_lists',
341
+          },
342
+        ],
343
+      },
344
+
345
+      // 首页装修
346
+      {
347
+        path: '/decorate_mhome',
348
+        icon: 'mobile',
349
+        name: 'decorate_mobile_home',
350
+        routes: [
351
+          // 首页装修
352
+          {
353
+            path: '/decorate_mhome/lists',
354
+            name: 'lists',
355
+            component: './mdecorate/lists',
356
+          },
357
+          // 装修页面
358
+          {
359
+            path: '/decorate_mhome/lists_to_diy',
360
+            name: '',
361
+            component: './mdecorate/edit_diy_page',
362
+          },
363
+        ],
364
+      },
365
+      // 专题装修
366
+      {
367
+        path: '/decorate_mtopic',
368
+        icon: 'layout',
369
+        name: 'decorate_mobile_topic',
370
+        routes: [
371
+          // 专题装修
372
+          {
373
+            path: '/decorate_mtopic/topic_lists',
374
+            name: 'topic_lists',
375
+            component: './mdecorate/topic_lists',
376
+          },
377
+          // 装修页面
378
+          {
379
+            path: '/decorate_mtopic/topic_lists_to_diy',
380
+            name: '',
381
+            component: './mdecorate/edit_diy_page',
382
+          },
383
+        ],
384
+      },
385
+      // 分类图片
386
+      {
387
+        path: '/decorate_mcat',
388
+        icon: 'file-image',
389
+        name: 'decorate_mobile_cat_img',
390
+        routes: [
391
+          // 分类图片
392
+          {
393
+            path: '/decorate_mcat/list',
394
+            name: 'lists',
395
+            component: './mdecorate/mcat',
396
+          },
397
+        ],
398
+      },
399
+      // CMS文章
400
+      {
401
+        path: '/decorate_information',
402
+        icon: 'deployment-unit',
403
+        name: 'decorate_mobile_information',
404
+        routes: [
405
+          // 文章首页
406
+          {
407
+            path: '/decorate_information/information',
408
+            name: 'information',
409
+            component: './mdecorate/information',
410
+          },
411
+        ],
412
+      },
413
+      // 店铺管理
414
+      {
415
+        path: '/manage_store',
416
+        icon: 'shop',
417
+        name: 'store',
418
+        routes: [
419
+          //自营店铺
420
+          {
421
+            path: '/manage_store/own_list',
422
+            name: 'own_list',
423
+            component: './manage/store/own_list',
424
+          },
425
+          //入驻店铺
426
+          {
427
+            path: '/manage_store/settle_store_list',
428
+            name: 'settle_store_list',
429
+            component: './manage/store/settle_store_list',
430
+          },
431
+          //入驻审核店铺详情
432
+          {
433
+            path: '/manage_store/settle_store_list_apply_detail',
434
+            name: '',
435
+            component: './manage/store/apply_store_detail',
436
+          },
437
+          //店铺入驻信息详情
438
+          {
439
+            path: '/manage_store/settle_store_list_view',
440
+            name: '',
441
+            component: './manage/store/settled_store_detail',
442
+          },
443
+          //编辑店铺入驻信息
444
+          {
445
+            path: '/manage_store/settle_store_list_to_edit',
446
+            name: '',
447
+            component: './manage/store/edit_settled_store',
448
+          },
449
+          //店铺等级
450
+          {
451
+            path: '/manage_store/grade_list',
452
+            name: 'grade_list',
453
+            component: './manage/store/grade_list',
454
+          },
455
+        ],
456
+      },
457
+      // 订单管理
458
+      {
459
+        path: '/manage_order',
460
+        icon: 'form',
461
+        name: 'order',
462
+        routes: [
463
+          //订单列表
464
+          {
465
+            path: '/manage_order/order_lists',
466
+            name: 'order_lists',
467
+            component: './manage/order/order_lists',
468
+          },
469
+          //订单详情
470
+          {
471
+            path: '/manage_order/order_lists_to_detail',
472
+            name: '',
473
+            component: './manage/order/order_detail',
474
+          },
475
+          //售后管理
476
+          // {
477
+          //     path: '/manage_order/aftersales_lists',
478
+          //     name: 'aftersales_lists',
479
+          //     component: './manage/order/aftersales_lists',
480
+          // },
481
+          {
482
+            path: '/manage_order/service',
483
+            name: 'service',
484
+            component: './manage/order/service',
485
+          },
486
+          //评价管理
487
+          {
488
+            path: '/manage_order/evaluation',
489
+            name: 'evaluation',
490
+            component: './manage/order/evaluation',
491
+          },
492
+          //售后原因
493
+          {
494
+            path: '/manage_order/salereson_lists',
495
+            name: 'salereson_lists',
496
+            component: './manage/order/salereson_lists',
497
+          },
498
+        ],
499
+      },
500
+      // 文章管理
501
+      {
502
+        path: '/manage_article',
503
+        icon: 'file-word',
504
+        name: 'article',
505
+        routes: [
506
+          {
507
+            path: '/manage_article/article_cat_lists',
508
+            name: 'article_cat_lists',
509
+            component: './manage/article/article_cat_lists',
510
+          }, {
511
+            path: '/manage_article/article_lists',
512
+            name: 'article_lists',
513
+            component: './manage/article/article_lists',
514
+          }, {
515
+            path: '/manage_article/article_lists_to_add',
516
+            component: './manage/article/add_article',
517
+          },
518
+        ],
519
+      },
520
+      // 促销活动
521
+      {
522
+        path: '/bussset_promotion',
523
+        icon: 'tag',
524
+        name: 'promotion',
525
+        routes: [
526
+          //优惠券
527
+          {
528
+            path: '/bussset_promotion/coupon',
529
+            name: 'coupon',
530
+            component: './bussset/promotion/coupon/home',
531
+          },
532
+          //新建优惠券
533
+          {
534
+            path: '/bussset_promotion/coupon_to_add',
535
+            name: '',
536
+            component: './bussset/promotion/coupon/add_coupon',
537
+          },
538
+          //平台优惠券——查看优惠券
539
+          {
540
+            path: '/bussset_promotion/coupon_to_view',
541
+            name: '',
542
+            component: './bussset/promotion/coupon/view_coupon',
543
+          },
544
+          //平台优惠券——优惠券领取列表
545
+          {
546
+            path: '/bussset_promotion/coupon_to_receive_list',
547
+            name: '',
548
+            component: './bussset/promotion/coupon/member_receive_lists',
549
+          },
550
+          //店铺优惠券
551
+          {
552
+            path: '/bussset_promotion/store_coupon',
553
+            name: 'store_coupon',
554
+            component: './bussset/promotion/coupon/store_coupon',
555
+          },
556
+          //店铺优惠券——查看优惠券
557
+          {
558
+            path: '/bussset_promotion/store_coupon_to_view',
559
+            name: '',
560
+            component: './bussset/promotion/coupon/view_coupon',
561
+          },
562
+          //店铺优惠券——优惠券领取列表
563
+          {
564
+            path: '/bussset_promotion/store_coupon_to_receive_list',
565
+            name: '',
566
+            component: './bussset/promotion/coupon/member_receive_lists',
567
+          },
568
+          //满优惠列表
569
+          {
570
+            path: '/bussset_promotion/full_discount',
571
+            name: 'full_discount',
572
+            component: './bussset/promotion/full/discount',
573
+          },
574
+          //秒杀活动
575
+          {
576
+            path: '/bussset_promotion/seckill',
577
+            name: 'seckill',
578
+            component: './bussset/promotion/seckill/lists',
579
+          },
580
+          //秒杀活动详情——秒杀活动场次
581
+          {
582
+            path: '/bussset_promotion/seckill_detail',
583
+            name: '',
584
+            component: './bussset/promotion/seckill/detail',
585
+          },
586
+          //秒杀活动商品
587
+          {
588
+            path: '/bussset_promotion/seckill_goods_list',
589
+            name: '',
590
+            component: './bussset/promotion/seckill/seckill_goods_lists',
591
+          },
592
+          //拼团活动
593
+          {
594
+            path: '/bussset_promotion/spell_group',
595
+            name: 'spell_group',
596
+            component: './bussset/promotion/spell_group/lists',
597
+          },
598
+          //拼团活动——查看详情
599
+          {
600
+            path: '/bussset_promotion/spell_group_to_view',
601
+            name: '',
602
+            component: './bussset/promotion/spell_group/view_spell_group',
603
+          },
604
+          //拼团活动商品
605
+          {
606
+            path: '/bussset_promotion/spell_group_bind_goods',
607
+            name: '',
608
+            component: './bussset/promotion/spell_group/joined_goods_list',
609
+          },
610
+          //拼团活动订单
611
+          {
612
+            path: '/bussset_promotion/spell_group_order',
613
+            name: '',
614
+            component: './bussset/promotion/spell_group/order_lists',
615
+          },
616
+          //拼团活动订单详情
617
+          {
618
+            path: '/bussset_promotion/spell_group_order_to_detail',
619
+            name: '',
620
+            component: './manage/order/order_detail',
621
+          },
622
+          //拼团团队列表
623
+          {
624
+            path: '/bussset_promotion/spell_group_team_list',
625
+            name: '',
626
+            component: './bussset/promotion/spell_group/team_list',
627
+          },
628
+          //阶梯团活动
629
+          {
630
+            path: '/bussset_promotion/ladder_group',
631
+            name: 'ladder_group',
632
+            component: './bussset/promotion/ladder_group/lists',
633
+          },
634
+          //阶梯团活动——查看详情
635
+          {
636
+            path: '/bussset_promotion/ladder_group_to_view',
637
+            name: '',
638
+            component: './bussset/promotion/ladder_group/view_ladder_group',
639
+          },
640
+          //阶梯团活动——团队列表
641
+          {
642
+            path: '/bussset_promotion/ladder_group_team_list',
643
+            name: '',
644
+            component: './bussset/promotion/ladder_group/team_list',
645
+          },
646
+          //预售活动
647
+          {
648
+            path: '/bussset_promotion/presale',
649
+            name: 'presale',
650
+            component: './bussset/promotion/presale/lists',
651
+          },
652
+          //预售详情
653
+          {
654
+            path: '/bussset_promotion/presale_to_view',
655
+            name: '',
656
+            component: './bussset/promotion/presale/view_presale',
657
+          },
658
+          //预售活动商品
659
+          {
660
+            path: '/bussset_promotion/presale_goods_list',
661
+            name: '',
662
+            component: './bussset/promotion/presale/presale_goods_lists',
663
+          },
664
+        ],
665
+      },
666
+      // 签到管理
667
+      {
668
+        path: '/bussset_sign',
669
+        icon: 'schedule',
670
+        name: 'sign',
671
+        routes: [
672
+          //签到活动列表
673
+          {
674
+            path: '/bussset_sign/list',
675
+            name: 'list',
676
+            component: './bussset/sign/list',
677
+          },
678
+          //新建签到活动
679
+          {
680
+            path: '/bussset_sign/list_to_add',
681
+            name: '',
682
+            component: './bussset/sign/add',
683
+          },
684
+          //签到统计列表
685
+          {
686
+            path: '/bussset_sign/stat',
687
+            name: 'stat',
688
+            component: './bussset/sign/stat',
689
+          },
690
+          //会员签到统计详情
691
+          {
692
+            path: '/bussset_sign/stat_to_member_detail',
693
+            name: '',
694
+            component: './bussset/sign/member_stat_detail',
695
+          },
696
+          //活动签到详情
697
+          {
698
+            path: '/bussset_sign/stat_to_activity_detail',
699
+            name: '',
700
+            component: './bussset/sign/activity_stat_detail',
701
+          },
702
+        ]
703
+      },
704
+      // 结算管理
705
+      {
706
+        path: '/bussset_bill',
707
+        icon: 'pay-circle',
708
+        name: 'bill',
709
+        routes: [
710
+          //结算账单
711
+          {
712
+            path: '/bussset_bill/lists',
713
+            name: 'lists',
714
+            component: './bussset/bill/lists',
715
+          },
716
+          //结算账单详情
717
+          {
718
+            path: '/bussset_bill/lists_to_detail',
719
+            name: '',
720
+            component: './bussset/bill/detail',
721
+          },
722
+        ],
723
+      },
724
+      
725
+      
726
+
727
+      // 积分商城
728
+      {
729
+        path: '/point_m_diy',
730
+        icon: 'home',
731
+        name: 'point_m_diy',
732
+        routes: [
733
+          //积分商城——首页装修
734
+          {
735
+            path: '/point_m_diy/home',
736
+            name: 'home',
737
+            component: './point/mdiy/home',
738
+          },
739
+          // 装修页面
740
+          {
741
+            path: '/point_m_diy/home_to_edit',
742
+            name: '',
743
+            component: './point/mdiy/edit_diy_page',
744
+          },
745
+        ]
746
+      },
747
+      // 积分商城
748
+      {
749
+        path: '/point_setting',
750
+        icon: 'star',
751
+        name: 'point_setting',
752
+        routes: [
753
+          //积分商城——积分设置
754
+          {
755
+            path: '/point_setting/index',
756
+            name: 'index',
757
+            component: './point/setting',
758
+          },
759
+        ]
760
+      },
761
+      {
762
+        path: '/point_label',
763
+        icon: 'tag',
764
+        name: 'point_label',
765
+        routes: [
766
+          //积分商城——标签管理
767
+          {
768
+            path: '/point_label/index',
769
+            name: 'index',
770
+            component: './point/label',
771
+          },
772
+        ]
773
+      },
774
+      {
775
+        path: '/point_goods',
776
+        icon: 'shopping',
777
+        name: 'point_goods',
778
+        routes: [
779
+          //积分商城——商品管理
780
+          {
781
+            path: '/point_goods/list',
782
+            name: 'list',
783
+            component: './point/goods/goods_list',
784
+          },
785
+        ]
786
+      },
787
+      {
788
+        path: '/point_order',
789
+        icon: 'profile',
790
+        name: 'point_order',
791
+        routes: [
792
+          //积分商城——订单管理
793
+          {
794
+            path: '/point_order/list',
795
+            name: 'list',
796
+            component: './point/order/order_lists',
797
+          },
798
+          //积分商城——订单详情
799
+          {
800
+            path: '/point_order/list_to_detail',
801
+            name: '',
802
+            component: './point/order/order_detail',
803
+          },
804
+        ]
805
+      },
806
+      {
807
+        path: '/point_bill',
808
+        icon: 'pay-circle',
809
+        name: 'point_bill',
810
+        routes: [
811
+          //积分商城——结算管理
812
+          {
813
+            path: '/point_bill/list',
814
+            name: 'list',
815
+            component: './point/bill/lists',
816
+          },
817
+          //积分商城——结算详情
818
+          {
819
+            path: '/point_bill/list_to_detail',
820
+            name: '',
821
+            component: './point/bill/detail',
822
+          },
823
+        ]
824
+      },
825
+      
826
+      {
827
+        component: '404',
828
+      },
829
+    ],
830
+  },
831
+];

+ 14 - 0
admin/docker/docker-compose.dev.yml

@@ -0,0 +1,14 @@
1
+version: "3.5"
2
+
3
+services:
4
+  ant-design-pro_dev:
5
+    ports:
6
+      - 8000:8000
7
+    build:
8
+      context: ../
9
+      dockerfile: Dockerfile.dev
10
+    container_name: "ant-design-pro_dev"
11
+    volumes:
12
+      - ../src:/usr/src/app/src
13
+      - ../config:/usr/src/app/config
14
+      - ../mock:/usr/src/app/mock

+ 21 - 0
admin/docker/docker-compose.yml

@@ -0,0 +1,21 @@
1
+version: "3.5"
2
+
3
+services:
4
+  ant-design-pro_build:
5
+    build: ../
6
+    container_name: "ant-design-pro_build"
7
+    volumes:
8
+      - dist:/usr/src/app/dist
9
+
10
+  ant-design-pro_web:
11
+    image: nginx
12
+    ports:
13
+      - 80:80
14
+    container_name: "ant-design-pro_web"
15
+    restart: unless-stopped
16
+    volumes:
17
+      - dist:/usr/share/nginx/html:ro
18
+      - ./nginx.conf:/etc/nginx/conf.d/default.conf
19
+
20
+volumes:
21
+  dist:

+ 22 - 0
admin/docker/nginx.conf

@@ -0,0 +1,22 @@
1
+server {
2
+    listen 80;
3
+    # gzip config
4
+    gzip on;
5
+    gzip_min_length 1k;
6
+    gzip_comp_level 9;
7
+    gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
8
+    gzip_vary on;
9
+    gzip_disable "MSIE [1-6]\.";
10
+
11
+    root /usr/share/nginx/html;
12
+
13
+    location / {
14
+        try_files $uri $uri/ /index.html;
15
+    }
16
+    location /api {
17
+        proxy_pass https://preview.pro.ant.design;
18
+        proxy_set_header   X-Forwarded-Proto $scheme;
19
+        proxy_set_header   Host              $http_host;
20
+        proxy_set_header   X-Real-IP         $remote_addr;
21
+    }
22
+}

+ 13 - 0
admin/firebase.json

@@ -0,0 +1,13 @@
1
+{
2
+  "hosting": {
3
+    "public": "dist",
4
+    "rewrites": [
5
+      { "source": "/api/**", "function": "api" },
6
+      {
7
+        "source": "**",
8
+        "destination": "/index.html"
9
+      }
10
+    ],
11
+    "ignore": ["firebase.json", "**/.*", "**/node_modules/**"]
12
+  }
13
+}

+ 9 - 0
admin/functions/index.js

@@ -0,0 +1,9 @@
1
+// [START functionsimport]
2
+const functions = require('firebase-functions');
3
+const express = require('express');
4
+const matchMock = require('./matchMock');
5
+const app = express();
6
+
7
+app.use(matchMock);
8
+
9
+exports.api = functions.https.onRequest(app);

+ 117 - 0
admin/functions/matchMock.js

@@ -0,0 +1,117 @@
1
+const mockFile = require('./mock/index');
2
+const pathToRegexp = require('path-to-regexp');
3
+const debug = console.log;
4
+const bodyParser = require('body-parser');
5
+
6
+const BODY_PARSED_METHODS = ['post', 'put', 'patch'];
7
+
8
+function parseKey(key) {
9
+  let method = 'get';
10
+  let path = key;
11
+  if (key.indexOf(' ') > -1) {
12
+    const splited = key.split(' ');
13
+    method = splited[0].toLowerCase();
14
+    path = splited[1]; // eslint-disable-line
15
+  }
16
+  return {
17
+    method,
18
+    path,
19
+  };
20
+}
21
+
22
+function createHandler(method, path, handler) {
23
+  return function(req, res, next) {
24
+    if (BODY_PARSED_METHODS.includes(method)) {
25
+      bodyParser.json({ limit: '5mb', strict: false })(req, res, () => {
26
+        bodyParser.urlencoded({ limit: '5mb', extended: true })(req, res, () => {
27
+          sendData();
28
+        });
29
+      });
30
+    } else {
31
+      sendData();
32
+    }
33
+
34
+    function sendData() {
35
+      if (typeof handler === 'function') {
36
+        handler(req, res, next);
37
+      } else {
38
+        res.json(handler);
39
+      }
40
+    }
41
+  };
42
+}
43
+
44
+function normalizeConfig(config) {
45
+  return Object.keys(config).reduce((memo, key) => {
46
+    const handler = config[key];
47
+    const { method, path } = parseKey(key);
48
+    const keys = [];
49
+    const re = pathToRegexp(path, keys);
50
+    memo.push({
51
+      method,
52
+      path,
53
+      re,
54
+      keys,
55
+      handler: createHandler(method, path, handler),
56
+    });
57
+    return memo;
58
+  }, []);
59
+}
60
+
61
+const mockData = normalizeConfig(mockFile);
62
+
63
+function matchMock(req) {
64
+  const { path: exceptPath } = req;
65
+  const exceptMethod = req.method.toLowerCase();
66
+  for (const mock of mockData) {
67
+    const { method, re, keys } = mock;
68
+    if (method === exceptMethod) {
69
+      const match = re.exec(req.path);
70
+      if (match) {
71
+        const params = {};
72
+
73
+        for (let i = 1; i < match.length; i = i + 1) {
74
+          const key = keys[i - 1];
75
+          const prop = key.name;
76
+          const val = decodeParam(match[i]);
77
+
78
+          if (val !== undefined || !hasOwnProperty.call(params, prop)) {
79
+            params[prop] = val;
80
+          }
81
+        }
82
+        req.params = params;
83
+        return mock;
84
+      }
85
+    }
86
+  }
87
+
88
+  function decodeParam(val) {
89
+    if (typeof val !== 'string' || val.length === 0) {
90
+      return val;
91
+    }
92
+
93
+    try {
94
+      return decodeURIComponent(val);
95
+    } catch (err) {
96
+      if (err instanceof URIError) {
97
+        err.message = `Failed to decode param ' ${val} '`;
98
+        err.status = err.statusCode = 400;
99
+      }
100
+
101
+      throw err;
102
+    }
103
+  }
104
+
105
+  return mockData.filter(({ method, re }) => {
106
+    return method === exceptMethod && re.test(exceptPath);
107
+  })[0];
108
+}
109
+module.exports = (req, res, next) => {
110
+  const match = matchMock(req);
111
+  if (match) {
112
+    debug(`mock matched: [${match.method}] ${match.path}`);
113
+    return match.handler(req, res, next);
114
+  } else {
115
+    return next();
116
+  }
117
+};

+ 23 - 0
admin/functions/package.json

@@ -0,0 +1,23 @@
1
+{
2
+  "name": "functions",
3
+  "description": "Cloud Functions for Firebase",
4
+  "scripts": {
5
+    "serve": "npm run mock && firebase serve --only functions",
6
+    "shell": "firebase functions:shell",
7
+    "start": "npm run shell",
8
+    "deploy": "firebase deploy --only functions",
9
+    "logs": "firebase functions:log",
10
+    "mock": "node ../scripts/generateMock.js"
11
+  },
12
+  "dependencies": {
13
+    "@babel/runtime": "^7.0.0",
14
+    "body-parser": "^1.18.3",
15
+    "express": "^4.16.3",
16
+    "firebase-admin": "^5.12.1",
17
+    "firebase-functions": "^2.0.5",
18
+    "mockjs": "^1.0.1-beta3",
19
+    "moment": "^2.22.2",
20
+    "path-to-regexp": "^2.2.1"
21
+  },
22
+  "private": true
23
+}

+ 15 - 0
admin/jest-puppeteer.config.js

@@ -0,0 +1,15 @@
1
+// ps https://github.com/GoogleChrome/puppeteer/issues/3120
2
+module.exports = {
3
+  launch: {
4
+    headless: false,
5
+    args: [
6
+      '--disable-gpu',
7
+      '--disable-dev-shm-usage',
8
+      '--disable-setuid-sandbox',
9
+      '--no-first-run',
10
+      '--no-sandbox',
11
+      '--no-zygote',
12
+      '--single-process',
13
+    ],
14
+  },
15
+};

+ 4 - 0
admin/jest.config.js

@@ -0,0 +1,4 @@
1
+module.exports = {
2
+  testURL: 'http://localhost:8000',
3
+  preset: 'jest-puppeteer',
4
+};

+ 10 - 0
admin/jsconfig.json

@@ -0,0 +1,10 @@
1
+{
2
+  "compilerOptions": {
3
+    "emitDecoratorMetadata": true,
4
+    "experimentalDecorators": true,
5
+    "baseUrl": ".",
6
+    "paths": {
7
+      "@/*": ["./src/*"]
8
+    }
9
+  }
10
+}

+ 13 - 0
admin/netlify.toml

@@ -0,0 +1,13 @@
1
+[[redirects]]
2
+  from = "/api/*"
3
+  to = "https://us-central1-antd-pro.cloudfunctions.net/api/api/:splat"
4
+  status = 200
5
+  force = true
6
+  [redirects.headers]
7
+    X-From = "Netlify"
8
+    X-Api-Key = "some-api-key-string"
9
+
10
+[[redirects]]
11
+  from = "/*"
12
+  to = "/index.html"
13
+  status = 200

Разница между файлами не показана из-за своего большого размера
+ 26093 - 0
admin/package-lock.json


+ 129 - 0
admin/package.json

@@ -0,0 +1,129 @@
1
+{
2
+  "name": "ant-design-pro",
3
+  "version": "2.1.1",
4
+  "description": "An out-of-box UI solution for enterprise applications",
5
+  "private": true,
6
+  "scripts": {
7
+    "presite": "node ./scripts/generateMock.js && cd functions && npm install",
8
+    "start": "cross-env APP_TYPE=site umi dev --port=8107",
9
+    "start:no-mock": "cross-env MOCK=none umi dev",
10
+    "build": "umi build",
11
+    "site": "npm run presite && cross-env APP_TYPE=site npm run build && firebase deploy && npm run docker:push",
12
+    "analyze": "cross-env ANALYZE=1 umi build",
13
+    "lint:style": "stylelint \"src/**/*.less\" --syntax less",
14
+    "lint": "eslint --ext .js src mock tests && npm run lint:style",
15
+    "lint:fix": "eslint --fix --ext .js src mock tests && npm run lint:style",
16
+    "lint-staged": "lint-staged",
17
+    "lint-staged:js": "eslint --ext .js",
18
+    "tslint": "npm run tslint:fix",
19
+    "tslint:fix": "tslint --fix 'src/**/*.ts*'",
20
+    "test": "umi test",
21
+    "test:component": "umi test ./src/components",
22
+    "test:all": "node ./tests/run-tests.js",
23
+    "prettier": "node ./scripts/prettier.js",
24
+    "docker:dev": "docker-compose -f ./docker/docker-compose.dev.yml up",
25
+    "docker:build": "docker-compose -f ./docker/docker-compose.dev.yml build",
26
+    "docker-prod:dev": "docker-compose -f ./docker/docker-compose.yml up",
27
+    "docker-prod:build": "docker-compose -f ./docker/docker-compose.yml build",
28
+    "docker-hub:build": "docker build  -f Dockerfile.hub -t  ant-design-pro ./",
29
+    "docker:tag": "docker tag ant-design-pro chenshuai2144/ant-design-pro",
30
+    "docker:push": "npm run docker-hub:build && npm run docker:tag && docker push chenshuai2144/ant-design-pro"
31
+  },
32
+  "dependencies": {
33
+    "@antv/data-set": "^0.10.0",
34
+    "@babel/runtime": "^7.1.5",
35
+    "antd": "^3.16.6",
36
+    "bizcharts": "^3.4.3",
37
+    "bizcharts-plugin-slider": "^2.1.1-beta.1",
38
+    "classnames": "^2.2.6",
39
+    "dva": "^2.4.0",
40
+    "enquire-js": "^0.2.1",
41
+    "hash.js": "^1.1.5",
42
+    "jquery": "^3.5.1",
43
+    "lodash": "^4.17.10",
44
+    "lodash-decorators": "^6.0.0",
45
+    "memoize-one": "^5.0.0",
46
+    "moment": "^2.22.2",
47
+    "numeral": "^2.0.6",
48
+    "nzh": "^1.0.3",
49
+    "omit.js": "^1.0.0",
50
+    "path-to-regexp": "^2.4.0",
51
+    "prop-types": "^15.5.10",
52
+    "qrcode.react": "^0.9.3",
53
+    "qs": "^6.6.0",
54
+    "quill-delta-to-html": "^0.10.7",
55
+    "rc-animate": "^2.4.4",
56
+    "re-resizable": "^4.11.0",
57
+    "react": "^16.6.3",
58
+    "react-beautiful-dnd": "^10.1.1",
59
+    "react-color": "^2.14.1",
60
+    "react-container-query": "^0.11.0",
61
+    "react-copy-to-clipboard": "^5.0.1",
62
+    "react-custom-scrollbars": "^4.2.1",
63
+    "react-document-title": "^2.0.3",
64
+    "react-dom": "^16.6.3",
65
+    "react-fittext": "^1.0.0",
66
+    "react-marquee": "^1.0.0",
67
+    "react-media": "^1.8.0",
68
+    "react-quill": "^1.3.3",
69
+    "react-resizable": "^1.7.5",
70
+    "react-router-dom": "^4.3.1",
71
+    "react-slick": "^0.27.11",
72
+    "slick-carousel": "^1.8.1"
73
+  },
74
+  "devDependencies": {
75
+    "@types/react": "^16.7.7",
76
+    "@types/react-dom": "^16.0.10",
77
+    "antd-pro-merge-less": "^1.0.0",
78
+    "antd-theme-webpack-plugin": "^1.1.8",
79
+    "babel-eslint": "^10.0.1",
80
+    "cross-env": "^5.1.1",
81
+    "cross-port-killer": "^1.0.1",
82
+    "enzyme": "^3.7.0",
83
+    "eslint": "^5.4.0",
84
+    "eslint-config-airbnb": "^17.0.0",
85
+    "eslint-config-prettier": "^3.0.1",
86
+    "eslint-plugin-babel": "^5.3.0",
87
+    "eslint-plugin-compat": "^2.6.2",
88
+    "eslint-plugin-import": "^2.14.0",
89
+    "eslint-plugin-jsx-a11y": "^6.1.2",
90
+    "eslint-plugin-markdown": "^1.0.0-beta.6",
91
+    "eslint-plugin-react": "^7.11.1",
92
+    "gh-pages": "^2.0.1",
93
+    "husky": "^1.2.0",
94
+    "jest-puppeteer": "^3.5.1",
95
+    "lint-staged": "^8.1.0",
96
+    "merge-umi-mock-data": "^0.0.3",
97
+    "mockjs": "^1.0.1-beta3",
98
+    "prettier": "1.15.2",
99
+    "pro-download": "^1.0.1",
100
+    "stylelint": "^9.8.0",
101
+    "stylelint-config-prettier": "^4.0.0",
102
+    "stylelint-config-standard": "^18.0.0",
103
+    "tslint": "^5.10.0",
104
+    "tslint-config-prettier": "^1.10.0",
105
+    "tslint-react": "^3.6.0",
106
+    "umi": "^2.2.7",
107
+    "umi-plugin-ga": "^1.1.3",
108
+    "umi-plugin-react": "^1.2.0"
109
+  },
110
+  "optionalDependencies": {
111
+    "puppeteer": "^1.10.0"
112
+  },
113
+  "lint-staged": {
114
+    "**/*.{jsx}": "npm run lint-staged:js"
115
+  },
116
+  "engines": {
117
+    "node": ">=8.0.0"
118
+  },
119
+  "browserslist": [
120
+    "> 1%",
121
+    "last 2 versions",
122
+    "not ie <= 10"
123
+  ],
124
+  "husky": {
125
+    "hooks": {
126
+      "pre-commit": "npm run lint-staged"
127
+    }
128
+  }
129
+}

BIN
admin/public/.DS_Store


BIN
admin/public/favicon.png


BIN
admin/public/pc_diy_img/adv_floor_02_goods.png


BIN
admin/public/pc_diy_img/adv_floor_02_left.png


BIN
admin/public/pc_diy_img/adv_floor_02_right.png


+ 3 - 0
admin/scripts/generateMock.js

@@ -0,0 +1,3 @@
1
+const generateMock = require('merge-umi-mock-data');
2
+const path = require('path');
3
+generateMock(path.join(__dirname, '../mock'), path.join(__dirname, '../functions/mock/index.js'));

+ 46 - 0
admin/scripts/lint-prettier.js

@@ -0,0 +1,46 @@
1
+/**
2
+ * copy to https://github.com/facebook/react/blob/master/scripts/prettier/index.js
3
+ * prettier api doc https://prettier.io/docs/en/api.html
4
+ *----------*****--------------
5
+ *  lint file is prettier
6
+ *----------*****--------------
7
+ */
8
+
9
+const glob = require('glob');
10
+const prettier = require('prettier');
11
+const fs = require('fs');
12
+const prettierConfigPath = require.resolve('../.prettierrc');
13
+
14
+const files = process.argv.slice(2);
15
+
16
+let didError = false;
17
+let didWarn = false;
18
+
19
+files.forEach(file => {
20
+  const options = prettier.resolveConfig.sync(file, {
21
+    config: prettierConfigPath,
22
+  });
23
+  try {
24
+    const fileInfo = prettier.getFileInfo.sync(file);
25
+    if (fileInfo.ignored) {
26
+      return;
27
+    }
28
+    const input = fs.readFileSync(file, 'utf8');
29
+    const withParserOptions = {
30
+      ...options,
31
+      parser: fileInfo.inferredParser,
32
+    };
33
+    const isPrettier = prettier.check(input, withParserOptions);
34
+    if (!isPrettier) {
35
+      console.log(`\x1b[31m ${file} is no prettier, please use npm run prettier and git add !\x1b[0m`);
36
+      didWarn = true;
37
+    }
38
+  } catch (e) {
39
+    didError = true;
40
+  }
41
+});
42
+
43
+if (didWarn || didError) {
44
+  process.exit(1);
45
+}
46
+console.log('\x1b[32m lint prettier success!\x1b[0m');

+ 56 - 0
admin/scripts/prettier.js

@@ -0,0 +1,56 @@
1
+/**
2
+ * copy to https://github.com/facebook/react/blob/master/scripts/prettier/index.js
3
+ * prettier api doc https://prettier.io/docs/en/api.html
4
+ *----------*****--------------
5
+ *  prettier all js and all ts.
6
+ *----------*****--------------
7
+ */
8
+
9
+const glob = require('glob');
10
+const prettier = require('prettier');
11
+const fs = require('fs');
12
+const prettierConfigPath = require.resolve('../.prettierrc');
13
+
14
+let didError = false;
15
+
16
+let files = [];
17
+const jsFiles = glob.sync('src/**/*.js*', { ignore: ['**/node_modules/**', 'build/**'] });
18
+const tsFiles = glob.sync('src/**/*.ts*', { ignore: ['**/node_modules/**', 'build/**'] });
19
+const configFiles = glob.sync('config/**/*.js*', { ignore: ['**/node_modules/**', 'build/**'] });
20
+const lessFiles = glob.sync('src/**/*.less*', { ignore: ['**/node_modules/**', 'build/**'] });
21
+files = files.concat(jsFiles);
22
+files = files.concat(tsFiles);
23
+files = files.concat(configFiles);
24
+files = files.concat(lessFiles);
25
+if (!files.length) {
26
+  return;
27
+}
28
+
29
+files.forEach(file => {
30
+  const options = prettier.resolveConfig.sync(file, {
31
+    config: prettierConfigPath,
32
+  });
33
+  const fileInfo = prettier.getFileInfo.sync(file);
34
+  if (fileInfo.ignored) {
35
+    return;
36
+  }
37
+  try {
38
+    const input = fs.readFileSync(file, 'utf8');
39
+    const withParserOptions = {
40
+      ...options,
41
+      parser: fileInfo.inferredParser,
42
+    };
43
+    const output = prettier.format(input, withParserOptions);
44
+    if (output !== input) {
45
+      fs.writeFileSync(file, output, 'utf8');
46
+      console.log(`\x1b[34m ${file} is prettier`);
47
+    }
48
+  } catch (e) {
49
+    didError = true;
50
+  }
51
+});
52
+
53
+if (didError) {
54
+  process.exit(1);
55
+}
56
+console.log('\x1b[32m prettier success!');

BIN
admin/src/.DS_Store


BIN
admin/src/assets/.DS_Store


BIN
admin/src/assets/add_goods_step.png


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
admin/src/assets/area.json


BIN
admin/src/assets/balance_bj.png


BIN
admin/src/assets/bill/.DS_Store


BIN
admin/src/assets/bill/1_cur.png


BIN
admin/src/assets/bill/1_no.png


BIN
admin/src/assets/bill/1_pass.png


BIN
admin/src/assets/bill/2_cur.png


BIN
admin/src/assets/bill/2_no.png


BIN
admin/src/assets/bill/2_pass.png


BIN
admin/src/assets/bill/3_cur.png


BIN
admin/src/assets/bill/3_no.png


BIN
admin/src/assets/bill/3_pass.png


BIN
admin/src/assets/bill/4_cur.png


BIN
admin/src/assets/bill/4_no.png


BIN
admin/src/assets/bill/4_pass.png


BIN
admin/src/assets/bill/detail_total_icon.png


BIN
admin/src/assets/coupons_bj.png


BIN
admin/src/assets/css/.DS_Store


+ 98 - 0
admin/src/assets/css/manage.less

@@ -0,0 +1,98 @@
1
+@import "~antd/lib/style/themes/default.less";
2
+
3
+.tableListForm {
4
+  :global {
5
+    .ant-form-item {
6
+      margin-bottom: 24px;
7
+      margin-right: 0;
8
+      display: flex;
9
+      > .ant-form-item-label {
10
+        width: auto;
11
+        line-height: 32px;
12
+        padding-right: 8px;
13
+      }
14
+    }
15
+    .ant-form-item-control-wrapper {
16
+      flex: 1;
17
+    }
18
+  }
19
+  .submitButtons {
20
+    white-space: nowrap;
21
+    margin-bottom: 10px;
22
+    display: inline-block;
23
+  }
24
+}
25
+
26
+@media screen and (max-width: @screen-lg) {
27
+  .tableListForm :global(.ant-form-item) {
28
+    margin-right: 24px;
29
+  }
30
+}
31
+
32
+@media screen and (max-width: @screen-md) {
33
+  .tableListForm :global(.ant-form-item) {
34
+    margin-right: 8px;
35
+  }
36
+}
37
+.select_width{
38
+  width: 100%;
39
+}
40
+.to_top{
41
+  margin-top: 30px;
42
+}
43
+.splitLine {
44
+  background: @border-color-split;
45
+  display: inline-block;
46
+  margin: 0 8px;
47
+  width: 1px;
48
+  height: 12px;
49
+}
50
+.formlabel{
51
+  label{
52
+    font-size: 14px;
53
+  }
54
+}
55
+.member_avatar{
56
+  width: 60px;
57
+  height: 60px;
58
+  vertical-align: middle;
59
+}
60
+.member_info{
61
+  display: inline-block;
62
+  margin-left: 10px;
63
+  vertical-align: middle;
64
+  span{
65
+    display: block;
66
+  }
67
+}
68
+.img_name{
69
+  display: inline-block;
70
+  vertical-align: middle;
71
+}
72
+.eval_pic_ul{
73
+  clear: both;
74
+  overflow: hidden;
75
+  display: inline-block;
76
+  vertical-align: middle;
77
+  margin-bottom: 0;
78
+  margin-left: 0;
79
+  padding-left: 0;
80
+  .eval_pic_li{
81
+    float: left;
82
+    list-style-type: none;
83
+    border: 1px solid #eee;
84
+    margin: 5px 6px 5px 0;
85
+    img{
86
+      width: 35px;
87
+      height: 35px;
88
+    }
89
+  }
90
+}
91
+
92
+.eva_part{
93
+  :global{
94
+    .ant-rate{
95
+      font-size: 17px !important;
96
+    }
97
+  }
98
+}

+ 371 - 0
admin/src/assets/css/promotion.less

@@ -0,0 +1,371 @@
1
+.voucher_num {
2
+  color: #FF6A12;
3
+  cursor: pointer;
4
+}
5
+
6
+.full_activity {
7
+  .full_acm_activity {
8
+    .item {
9
+      padding-top: 15px;
10
+
11
+      .left {
12
+        width: 200px;
13
+        height: 32px;
14
+        line-height: 32px;
15
+        text-align: right;
16
+        padding-right: 20px;
17
+        font-size: 13px;
18
+      }
19
+
20
+      .right {
21
+        .reset_sel {
22
+          font-size: 13px;
23
+          cursor: pointer;
24
+          color: #FF711E;
25
+          margin-left: 0;
26
+          margin-top: 9px;
27
+          margin-bottom: 10px;
28
+          display: inline-block;
29
+        }
30
+      }
31
+    }
32
+  }
33
+
34
+  .flex_zi {
35
+    flex: 1;
36
+    justify-content: center;
37
+    align-items: center;
38
+  }
39
+
40
+  .common_title_bg {
41
+    height: 36px;
42
+    line-height: 36px;
43
+    background: #FFFAF7;
44
+    border-radius: 2px;
45
+    width: 100%;
46
+
47
+    .title {
48
+      color: #333;
49
+      font-size: 13px;
50
+      padding-left: 10px;
51
+    }
52
+
53
+    .del_ladder_pro {
54
+      display: none;
55
+      padding-right: 15px;
56
+      padding-top: 7px;
57
+    }
58
+  }
59
+
60
+  .add_new {
61
+    margin-top: 15px;
62
+    height: 40px;
63
+    background: #FFFAF7;
64
+    border-radius: 3px;
65
+    width: 100%;
66
+
67
+    .add_new_tip {
68
+      color: #FF7F40;
69
+      font-size: 12px;
70
+      margin-left: 10px;
71
+    }
72
+  }
73
+
74
+  .sel_goods {
75
+    padding-left: 24px;
76
+
77
+    .sel_tip {
78
+      font-size: 12px;
79
+      color: #999;
80
+    }
81
+
82
+    .reset_sel_goods {
83
+      cursor: pointer;
84
+      font-size: 12px;
85
+      color: #FF7F40;
86
+    }
87
+
88
+    .goods_info {
89
+      margin-left: 10px;
90
+      margin-top: 5px;
91
+      height: 60px;
92
+      padding: 10px;
93
+      max-width: 700px;
94
+      min-width: 260px;
95
+      background: #f8f8f8;
96
+      border-radius: 3px;
97
+
98
+      .left {
99
+        width: 40px !important;
100
+        height: 40px !important;
101
+        flex-shrink: 0;
102
+        border-radius: 3px;
103
+        padding-right: 0 !important;
104
+        margin-right: 10px;
105
+        overflow: hidden;
106
+
107
+        img {
108
+          max-width: 100%;
109
+          max-height: 100%;
110
+          border-radius: 3px;
111
+        }
112
+      }
113
+
114
+      .goods_name {
115
+        font-size: 13px;
116
+        color: #333;
117
+      }
118
+
119
+      .goods_price {
120
+        font-size: 12px;
121
+        color: #666;
122
+        margin-top: 3px;
123
+        white-space: nowrap;
124
+      }
125
+    }
126
+
127
+  }
128
+
129
+}
130
+
131
+
132
+.flex_w {
133
+  display: flex;
134
+  width: 900px;
135
+  border: 1px solid gray;
136
+  padding: 5px 10px;
137
+  margin-top: 10px;
138
+  background: #eee;
139
+}
140
+
141
+.flex_w div {
142
+  margin-right: 10px;
143
+  text-align: center;
144
+  flex: 1
145
+}
146
+
147
+.flex_wt {
148
+  display: flex;
149
+  width: 900px;
150
+  border-bottom: 1px solid gray;
151
+  padding: 5px 10px;
152
+  border-left: 1px solid gray;
153
+  border-right: 1px solid gray
154
+}
155
+
156
+.flex_wt div {
157
+  margin-right: 10px;
158
+  text-align: center;
159
+  flex: 1
160
+}
161
+
162
+.coupon_goods_operate {
163
+  height: 60px;
164
+  text-align: center;
165
+  flex-shrink: 0;
166
+  cursor: pointer;
167
+}
168
+
169
+.coupon_goods_operate svg:hover {
170
+  fill: #77B9FE !important;
171
+}
172
+
173
+.seckill {
174
+  .right_show_content {
175
+    height: 32px;
176
+    line-height: 32px;
177
+    font-size: 13px;
178
+  }
179
+
180
+  .sele_goods {
181
+    border: 1px solid #E6E6E6;
182
+    border-radius: 5px;
183
+    margin: 10px 0;
184
+    padding: 10px;
185
+    position: relative;
186
+
187
+    .del_spu {
188
+      position: absolute;
189
+      z-index: 2;
190
+      top: 0;
191
+      right: 0;
192
+      width: 28px;
193
+      height: 30px;
194
+    }
195
+
196
+    .goods_info {
197
+      height: 70px;
198
+      margin-bottom: 10px;
199
+      border-bottom: 1px solid #F4F3F8;
200
+
201
+      .goods_info_left {
202
+        .goods_img_wrap {
203
+          width: 60px;
204
+          height: 60px;
205
+          border-radius: 5px;
206
+          overflow: hidden;
207
+          flex-shrink: 0;
208
+
209
+          .goods_img {
210
+            max-width: 100%;
211
+            max-height: 100%;
212
+          }
213
+        }
214
+
215
+        .goods_name {
216
+          color: #333;
217
+          font-size: 12px;
218
+          margin-left: 10px;
219
+          padding-top: 5px;
220
+          max-width: 320px;
221
+        }
222
+      }
223
+
224
+      .goods_info_right {
225
+        height: 70px;
226
+        padding-bottom: 10px;
227
+
228
+        .batch_btn {
229
+          padding: 0 15px;
230
+          background: #FF711E;
231
+          border-radius: 3px;
232
+          height: 30px;
233
+          color: #fff;
234
+          margin-left: 10px;
235
+          font-size: 13px;
236
+          cursor: pointer;
237
+
238
+          .sel_all {
239
+            color: #fff;
240
+          }
241
+        }
242
+      }
243
+    }
244
+
245
+    .ladder_part {
246
+      padding: 10px;
247
+      background: #F8F7F9;
248
+      margin-bottom: 10px;
249
+
250
+      .deposit_part {
251
+        .tip {
252
+          display: inline-block;
253
+          color: #999;
254
+          font-size: 12px;
255
+          margin-left: 20px;
256
+        }
257
+      }
258
+
259
+      .ladder_item {
260
+        margin-top: 10px;
261
+
262
+        .left_title {
263
+          display: inline-block;
264
+          font-weight: bold;
265
+          color: #333;
266
+          margin-right: 20px;
267
+        }
268
+      }
269
+
270
+      .add_ladder {
271
+        .btn {
272
+          color: blue;
273
+          display: inline-block;
274
+          margin-right: 10px;
275
+        }
276
+
277
+        .tip {
278
+          color: #999;
279
+        }
280
+      }
281
+    }
282
+  }
283
+}
284
+
285
+.spell_group_team_wrap {
286
+  .member {
287
+    width: 60px;
288
+    height: 31px;
289
+    border-radius: 50%;
290
+    flex-shrink: 0;
291
+    margin: 0 10px 10px;
292
+    position: relative;
293
+
294
+    .avatar {
295
+      overflow: hidden;
296
+      background-size: cover;
297
+      background-position: center;
298
+      width: 31px;
299
+      height: 31px;
300
+      border-radius: 50%;
301
+      border: 1px solid #eee;
302
+    }
303
+
304
+    .name {
305
+      position: absolute;
306
+      z-index: 2;
307
+      bottom: -12px;
308
+      width: 60px;
309
+      overflow: hidden;
310
+      text-overflow: ellipsis;
311
+      white-space: nowrap;
312
+      height: 14px;
313
+      line-height: 14px;
314
+      background: #FF711E;
315
+      border-radius: 7px;
316
+      font-size: 12px;
317
+      color: #fff;
318
+      text-align: center;
319
+      padding: 0 5px;
320
+    }
321
+  }
322
+}
323
+
324
+.sign_activity_stat {
325
+  margin-bottom: 20px;
326
+  margin-top: 10px;
327
+  padding: 0 10px;
328
+
329
+  .item {
330
+    max-width: 363px;
331
+    height: 110px;
332
+    box-shadow: 0 1px 6px 0 rgba(0, 0, 0, 0.1);
333
+    border-radius: 10px;
334
+    overflow: hidden;
335
+
336
+    .left {
337
+      width: 110px;
338
+      height: 110px;
339
+
340
+      img {
341
+        width: 64px;
342
+        height: 64px;
343
+      }
344
+    }
345
+
346
+    .right {
347
+      padding-left: 20px;
348
+
349
+      .num {
350
+        height: 30px;
351
+        font-size: 36px;
352
+        font-family: 'Microsoft YaHei';
353
+        font-weight: bold;
354
+        color: #FFF;
355
+        line-height: 30px;
356
+        display: block;
357
+      }
358
+
359
+      .tip {
360
+        height: 20px;
361
+        font-size: 20px;
362
+        font-family: Microsoft YaHei;
363
+        font-weight: 400;
364
+        color: #FFF;
365
+        line-height: 30px;
366
+        margin-top: 15px;
367
+        display: block;
368
+      }
369
+    }
370
+  }
371
+}

+ 14 - 0
admin/src/assets/css/store.less

@@ -0,0 +1,14 @@
1
+.batch_btn{
2
+  padding: 0 15px;
3
+  background: #FF711E;
4
+  border-radius: 3px;
5
+  height: 30px;
6
+  color: #fff;
7
+  margin-left: 10px;
8
+  font-size: 13px;
9
+  cursor: pointer;
10
+  margin-right: 2%;
11
+  .sel_all{
12
+    color: #fff;
13
+  }
14
+}

BIN
admin/src/assets/del_icon.png


BIN
admin/src/assets/del_icon_hover.png


BIN
admin/src/assets/express_empty.png


BIN
admin/src/assets/home_basic/exchange_num.png


BIN
admin/src/assets/home_basic/exchange_num_2.png


BIN
admin/src/assets/home_basic/return_num.png


BIN
admin/src/assets/home_basic/return_num_2.png


BIN
admin/src/assets/home_basic/sld_goods_num.png


BIN
admin/src/assets/home_basic/sld_goods_num_2.png


BIN
admin/src/assets/home_basic/sld_goods_num_new.png


BIN
admin/src/assets/home_basic/sld_goods_num_new_2.png


BIN
admin/src/assets/home_basic/sld_member_num.png


BIN
admin/src/assets/home_basic/sld_member_num_2.png


BIN
admin/src/assets/home_basic/sld_member_num_new.png


BIN
admin/src/assets/home_basic/sld_member_num_new_2.png


BIN
admin/src/assets/home_basic/sld_order_amount.png


BIN
admin/src/assets/home_basic/sld_order_amount_2.png


BIN
admin/src/assets/home_basic/sld_order_num.png


BIN
admin/src/assets/home_basic/sld_order_num_2.png


BIN
admin/src/assets/home_basic/sld_store_num.png


BIN
admin/src/assets/home_basic/sld_store_num_new.png


BIN
admin/src/assets/home_basic/sld_vendor_num.png


BIN
admin/src/assets/home_basic/sld_vendor_num_2.png


BIN
admin/src/assets/home_basic/sld_vendor_num_new.png


BIN
admin/src/assets/home_basic/sld_vendor_num_new_2.png


BIN
admin/src/assets/home_basic/top_num.png


BIN
admin/src/assets/home_basic/top_num_1.png


BIN
admin/src/assets/home_basic/wait_deliver.png


BIN
admin/src/assets/home_basic/wait_deliver_2.png


BIN
admin/src/assets/home_basic/wait_pay.png


BIN
admin/src/assets/home_basic/wait_pay_2.png


BIN
admin/src/assets/integral_bj.png


+ 0 - 0
admin/src/assets/m_diy_img/.DS_Store


Некоторые файлы не были показаны из-за большого количества измененных файлов