allen 1 年之前
當前提交
11c7971a1e
共有 100 個文件被更改,包括 6527 次插入0 次删除
  1. 4 0
      .gitignore
  2. 105 0
      deploy.sh
  3. 8 0
      docker/docker-compose.yml
  4. 9 0
      docker/env_vars
  5. 17 0
      manager-admin/.babelrc
  6. 14 0
      manager-admin/.editorconfig
  7. 7 0
      manager-admin/.eslintignore
  8. 200 0
      manager-admin/.eslintrc.js
  9. 27 0
      manager-admin/.gitignore
  10. 0 0
      manager-admin/.gitkeep
  11. 3 0
      manager-admin/.npmrc
  12. 9 0
      manager-admin/.postcssrc.js
  13. 5 0
      manager-admin/.travis.yml
  14. 13 0
      manager-admin/Dockerfile
  15. 21 0
      manager-admin/README-en.md
  16. 17 0
      manager-admin/README.md
  17. 48 0
      manager-admin/build/build.js
  18. 54 0
      manager-admin/build/check-versions.js
  19. 二進制
      manager-admin/build/logo.png
  20. 101 0
      manager-admin/build/utils.js
  21. 22 0
      manager-admin/build/vue-loader.conf.js
  22. 115 0
      manager-admin/build/webpack.base.conf.js
  23. 88 0
      manager-admin/build/webpack.dev.conf.js
  24. 175 0
      manager-admin/build/webpack.prod.conf.js
  25. 7 0
      manager-admin/config/dev.env.js
  26. 88 0
      manager-admin/config/index.js
  27. 7 0
      manager-admin/config/prod.env.js
  28. 4 0
      manager-admin/config/sit.env.js
  29. 二進制
      manager-admin/favicon.ico
  30. 32 0
      manager-admin/index.html
  31. 51 0
      manager-admin/nginx.conf
  32. 119 0
      manager-admin/package.json
  33. 11 0
      manager-admin/set-envs.sh
  34. 21 0
      manager-admin/src/App.vue
  35. 79 0
      manager-admin/src/api/afterSale.js
  36. 146 0
      manager-admin/src/api/article.js
  37. 144 0
      manager-admin/src/api/auth.js
  38. 79 0
      manager-admin/src/api/brand.js
  39. 135 0
      manager-admin/src/api/category.js
  40. 31 0
      manager-admin/src/api/collection.js
  41. 51 0
      manager-admin/src/api/common.js
  42. 114 0
      manager-admin/src/api/complaint.js
  43. 30 0
      manager-admin/src/api/connect.js
  44. 305 0
      manager-admin/src/api/distribution.js
  45. 54 0
      manager-admin/src/api/electronicReceipt.js
  46. 89 0
      manager-admin/src/api/express.js
  47. 68 0
      manager-admin/src/api/expressPlatform.js
  48. 90 0
      manager-admin/src/api/floor.js
  49. 121 0
      manager-admin/src/api/goods.js
  50. 65 0
      manager-admin/src/api/hotKeyword.js
  51. 41 0
      manager-admin/src/api/login.js
  52. 51 0
      manager-admin/src/api/logs.js
  53. 315 0
      manager-admin/src/api/member.js
  54. 53 0
      manager-admin/src/api/menus.js
  55. 126 0
      manager-admin/src/api/message.js
  56. 185 0
      manager-admin/src/api/order.js
  57. 135 0
      manager-admin/src/api/params.js
  58. 43 0
      manager-admin/src/api/payment.js
  59. 494 0
      manager-admin/src/api/promotion.js
  60. 41 0
      manager-admin/src/api/push.js
  61. 64 0
      manager-admin/src/api/receipt.js
  62. 55 0
      manager-admin/src/api/refund.js
  63. 42 0
      manager-admin/src/api/region.js
  64. 146 0
      manager-admin/src/api/search.js
  65. 41 0
      manager-admin/src/api/sensitiveWords.js
  66. 141 0
      manager-admin/src/api/shop.js
  67. 81 0
      manager-admin/src/api/siteMenu.js
  68. 45 0
      manager-admin/src/api/smsGateway.js
  69. 79 0
      manager-admin/src/api/smtp.js
  70. 82 0
      manager-admin/src/api/spec.js
  71. 39 0
      manager-admin/src/api/staticPage.js
  72. 483 0
      manager-admin/src/api/statistics.js
  73. 56 0
      manager-admin/src/api/storageSolution.js
  74. 50 0
      manager-admin/src/api/systemSetting.js
  75. 41 0
      manager-admin/src/api/task.js
  76. 43 0
      manager-admin/src/api/validatorPlatform.js
  77. 二進制
      manager-admin/src/assets/401_images/401.gif
  78. 二進制
      manager-admin/src/assets/404_images/404.png
  79. 二進制
      manager-admin/src/assets/404_images/404_cloud.png
  80. 二進制
      manager-admin/src/assets/custom-theme/fonts/element-icons.ttf
  81. 二進制
      manager-admin/src/assets/custom-theme/fonts/element-icons.woff
  82. 1 0
      manager-admin/src/assets/custom-theme/index.css
  83. 1 0
      manager-admin/src/assets/echart-map-china.json
  84. 199 0
      manager-admin/src/assets/echarts-macarons.js
  85. 二進制
      manager-admin/src/assets/icon-repair.png
  86. 二進制
      manager-admin/src/assets/icons-mobile-template.png
  87. 二進制
      manager-admin/src/assets/logo_images/logo-javashop-rectangle-dark.png
  88. 二進制
      manager-admin/src/assets/logo_images/logo-javashop-rectangle-light.png
  89. 二進制
      manager-admin/src/assets/logo_images/logo-javashop-square.png
  90. 二進制
      manager-admin/src/assets/logo_images/logo-javashop-white.png
  91. 110 0
      manager-admin/src/assets/particlesjs-config.json
  92. 二進制
      manager-admin/src/assets/pc-tpl-01.png
  93. 二進制
      manager-admin/src/assets/pc-tpl-02.png
  94. 二進制
      manager-admin/src/assets/pc-tpl-03.png
  95. 二進制
      manager-admin/src/assets/pc-tpl-04.png
  96. 73 0
      manager-admin/src/components/AliyunAfs.js
  97. 110 0
      manager-admin/src/components/BackToTop/index.vue
  98. 12 0
      manager-admin/src/components/BrandPicker/index.js
  99. 46 0
      manager-admin/src/components/BrandPicker/src/main.vue
  100. 0 0
      manager-admin/src/components/Breadcrumb/index.vue

+ 4 - 0
.gitignore

@@ -0,0 +1,4 @@
+.DS_Store
+*.log
+.idea
+.idea/*

+ 105 - 0
deploy.sh

@@ -0,0 +1,105 @@
+#! /bin/bash
+
+WEB_PATH=$PWD
+cd $WEB_PATH
+
+# 更新git代码
+if [[ "$1" == "git-pull" ]];then
+  echo "拉取最新的代码..."
+  git reset --hard origin/master
+  git clean -f
+  git pull origin master
+  git pull
+  echo -e "\033[32m代码拉取完成...\033[0m"
+fi
+
+# 拷贝公共文件
+if [[ "$1" == "copy" ]];then
+  echo "拷贝ui-domain..."
+  cp -a $WEB_PATH/ui-domain $WEB_PATH/manager-seller
+  cp -a $WEB_PATH/ui-domain $WEB_PATH/manager-admin
+  echo -e "\033[32m拷贝完成\033[0m"
+  echo "拷贝ui-components..."
+  cp -a $WEB_PATH/ui-components $WEB_PATH/manager-seller
+  cp -a $WEB_PATH/ui-components $WEB_PATH/manager-admin
+  echo -e "\033[32m拷贝完成\033[0m"
+  echo "拷贝ui-utils..."
+  cp -a $WEB_PATH/ui-utils $WEB_PATH/manager-seller
+  cp -a $WEB_PATH/ui-utils $WEB_PATH/manager-admin
+  echo -e "\033[32m拷贝完成\033[0m"
+fi
+
+# 部署nodejs、nginx、pm2
+if [[ "$1" == "base" ]];then
+  # 移除yum lock
+  rm -f /var/run/yum.pid
+
+  # 关闭防火墙
+  systemctl stop firewalld
+  systemctl disable firewalld
+
+  # 安装nodejs
+  cd /usr/local/
+  wget https://npm.taobao.org/mirrors/node/v8.16.2/node-v8.16.2-linux-x64.tar.gz
+  tar -zxvf node-v8.16.2-linux-x64.tar.gz
+  rm -rf node-v8.16.2-linux-x64.tar.gz
+  mv node-v8.16.2-linux-x64 node
+  echo 'export NODE_HOME=/usr/local/node
+export PATH=$NODE_HOME/bin:$PATH'>>/etc/profile
+  source /etc/profile
+
+  # node npm 链接
+  sudo ln -s /usr/local/node/bin/node /usr/bin/node
+  sudo ln -s /usr/local/node/bin/node /usr/lib/node
+  sudo ln -s /usr/local/node/bin/npm /usr/bin/npm
+
+  # 安装yarn
+  npm install yarn -g --registry=https://registry.npm.taobao.org
+
+  # 安装pm2
+  npm install pm2 -g --registry=https://registry.npm.taobao.org
+
+  # pm2 链接
+  sudo ln -s /usr/local/node/bin/pm2 /usr/bin/pm2
+  sudo ln -s /usr/local/node/bin/pm2 /usr/lib/pm2
+  sudo ln -s /usr/local/node/bin/yarn /usr/bin/yarn
+  sudo ln -s /usr/local/node/bin/yarn /usr/lib/yarn
+
+  # nginx安装
+  yum install -y gcc gcc-c++
+  yum install -y pcre pcre-devel
+  yum install -y zlib zlib-devel
+  yum install -y openssl openssl-devel
+
+  cd /usr/local
+  wget https://nginx.org/download/nginx-1.14.0.tar.gz
+  tar -zxvf nginx-1.14.0.tar.gz
+  cd nginx-1.14.0
+  ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
+  make && make install
+  cd ..
+  rm -rf nginx-1.14.0.tar.gz
+  rm -rf nginx-1.14.0
+fi
+
+if [[ ! -n "$1" || "$1" == "manager-admin" ]];then
+  echo "开始部署后台管理(manager-admin)..."
+  cd $WEB_PATH/manager-admin
+  rm -rf node_modules
+  echo "开始安装项目依赖..."
+  sudo npm --registry https://registry.npm.taobao.org install
+  echo "开始打包..."
+  yarn run build:prod
+  echo -e "\033[32m后台管理部署完成...\033[0m"
+fi
+
+if [[ ! -n "$1" || "$1" == "manager-seller" ]];then
+  echo "开始部署商家中心(manager-seller)..."
+  cd $WEB_PATH/manager-seller
+  rm -rf node_modules
+  echo "开始安装项目依赖..."
+  yarn --registry=https://registry.npm.taobao.org
+  echo "开始打包..."
+  yarn run build:prod
+  echo -e "\033[32m商家中心部署完成...\033[0m"
+fi

+ 8 - 0
docker/docker-compose.yml

@@ -0,0 +1,8 @@
+version: '3'
+services:
+  manager-project:
+    image: manager-seller:1.0
+    ports:
+      - 6001:80
+    env_file:
+      - env_vars

+ 9 - 0
docker/env_vars

@@ -0,0 +1,9 @@
+API_MODEL=pro
+API_BASE=http://api.base.javamall.com.cn
+API_BUYER=http://api.buyer.javamall.com.cn
+API_SELLER=http://api.seller.javamall.com.cn
+API_ADMIN=http://api.admin.javamall.com.cn
+DOMAIN_BUYER_PC=http://buyer.javamall.com.cn
+DOMAIN_BUYER_WAP=http://m.buyer.javamall.com.cn
+DOMAIN_SELLER=http://seller.javamall.com.cn
+DOMAIN_ADMIN=http://admin.javamall.com.cn

+ 17 - 0
manager-admin/.babelrc

@@ -0,0 +1,17 @@
+{
+  "presets": [
+    ["env", {
+      "modules": false,
+      "targets": {
+        "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
+      }
+    }],
+    "stage-2"
+  ],
+  "plugins": ["transform-vue-jsx", "transform-decorators-legacy", "transform-runtime"],
+  "env": {
+    "development": {
+      "plugins": ["dynamic-import-node"]
+    }
+  }
+}

+ 14 - 0
manager-admin/.editorconfig

@@ -0,0 +1,14 @@
+# http://editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+insert_final_newline = false
+trim_trailing_whitespace = false

+ 7 - 0
manager-admin/.eslintignore

@@ -0,0 +1,7 @@
+build/*.js
+config/*.js
+src/assets
+src/plugins
+ui-components
+ui-domain
+static

+ 200 - 0
manager-admin/.eslintrc.js

@@ -0,0 +1,200 @@
+module.exports = {
+  root: true,
+  parser: 'babel-eslint',
+  parserOptions: {
+    sourceType: 'module'
+  },
+  env: {
+    browser: true,
+    node: true,
+    es6: true,
+  },
+  extends: 'eslint:recommended',
+  // required to lint *.vue files
+  plugins: [
+    'html'
+  ],
+  // check if imports actually resolve
+  'settings': {
+    'import/resolver': {
+      'webpack': {
+        'config': 'build/webpack.base.conf.js'
+      }
+    }
+  },
+  // add your custom rules here
+  //it is base on https://github.com/vuejs/eslint-config-vue
+  'rules': {
+    'accessor-pairs': 2,
+    'arrow-spacing': [2, {
+      'before': true,
+      'after': true
+    }],
+    'block-spacing': [2, 'always'],
+    'brace-style': [2, '1tbs', {
+      'allowSingleLine': true
+    }],
+    'camelcase': [0, {
+      'properties': 'always'
+    }],
+    'comma-dangle': [2, 'never'],
+    'comma-spacing': [2, {
+      'before': false,
+      'after': true
+    }],
+    'comma-style': [2, 'last'],
+    'constructor-super': 2,
+    'curly': [2, 'multi-line'],
+    'dot-location': [2, 'property'],
+    'eol-last': 2,
+    'eqeqeq': [2, 'allow-null'],
+    'generator-star-spacing': [2, {
+      'before': true,
+      'after': true
+    }],
+    'handle-callback-err': [2, '^(err|error)$'],
+    'indent': [2, 2, {
+      'SwitchCase': 1
+    }],
+    'jsx-quotes': [2, 'prefer-single'],
+    'key-spacing': [2, {
+      'beforeColon': false,
+      'afterColon': true
+    }],
+    'keyword-spacing': [2, {
+      'before': true,
+      'after': true
+    }],
+    'new-cap': [2, {
+      'newIsCap': true,
+      'capIsNew': false
+    }],
+    'new-parens': 2,
+    'no-array-constructor': 2,
+    'no-caller': 2,
+    'no-console': 'off',
+    'no-class-assign': 2,
+    'no-cond-assign': 2,
+    'no-const-assign': 2,
+    'no-control-regex': 0,
+    'no-delete-var': 2,
+    'no-dupe-args': 2,
+    'no-dupe-class-members': 2,
+    'no-dupe-keys': 2,
+    'no-duplicate-case': 2,
+    'no-empty-character-class': 2,
+    'no-empty-pattern': 2,
+    'no-eval': 2,
+    'no-ex-assign': 2,
+    'no-extend-native': 2,
+    'no-extra-bind': 2,
+    'no-extra-boolean-cast': 2,
+    'no-extra-parens': [2, 'functions'],
+    'no-fallthrough': 2,
+    'no-floating-decimal': 2,
+    'no-func-assign': 2,
+    'no-implied-eval': 2,
+    'no-inner-declarations': [2, 'functions'],
+    'no-invalid-regexp': 2,
+    'no-irregular-whitespace': 2,
+    'no-iterator': 2,
+    'no-label-var': 2,
+    'no-labels': [2, {
+      'allowLoop': false,
+      'allowSwitch': false
+    }],
+    'no-lone-blocks': 2,
+    'no-mixed-spaces-and-tabs': 2,
+    'no-multi-spaces': 2,
+    'no-multi-str': 2,
+    'no-multiple-empty-lines': [2, {
+      'max': 1
+    }],
+    'no-native-reassign': 2,
+    'no-negated-in-lhs': 2,
+    'no-new-object': 2,
+    'no-new-require': 2,
+    'no-new-symbol': 2,
+    'no-new-wrappers': 2,
+    'no-obj-calls': 2,
+    'no-octal': 2,
+    'no-octal-escape': 2,
+    'no-path-concat': 2,
+    'no-proto': 2,
+    'no-redeclare': 2,
+    'no-regex-spaces': 2,
+    'no-return-assign': [2, 'except-parens'],
+    'no-self-assign': 2,
+    'no-self-compare': 2,
+    'no-sequences': 2,
+    'no-shadow-restricted-names': 2,
+    'no-spaced-func': 2,
+    'no-sparse-arrays': 2,
+    'no-this-before-super': 2,
+    'no-throw-literal': 2,
+    'no-trailing-spaces': 2,
+    'no-undef': 2,
+    'no-undef-init': 2,
+    'no-unexpected-multiline': 2,
+    'no-unmodified-loop-condition': 2,
+    'no-unneeded-ternary': [2, {
+      'defaultAssignment': false
+    }],
+    'no-unreachable': 2,
+    'no-unsafe-finally': 2,
+    'no-unused-vars': [2, {
+      'vars': 'all',
+      'args': 'none'
+    }],
+    'no-useless-call': 2,
+    'no-useless-computed-key': 2,
+    'no-useless-constructor': 2,
+    'no-useless-escape': 0,
+    'no-whitespace-before-property': 2,
+    'no-with': 2,
+    'one-var': [2, {
+      'initialized': 'never'
+    }],
+    'operator-linebreak': [2, 'after', {
+      'overrides': {
+        '?': 'before',
+        ':': 'before'
+      }
+    }],
+    'padded-blocks': [2, 'never'],
+    'quotes': [2, 'single', {
+      'avoidEscape': true,
+      'allowTemplateLiterals': true
+    }],
+    'semi': [2, 'never'],
+    'semi-spacing': [2, {
+      'before': false,
+      'after': true
+    }],
+    'space-before-blocks': [2, 'always'],
+    'space-before-function-paren': [2, 'never'],
+    'space-in-parens': [2, 'never'],
+    'space-infix-ops': 2,
+    'space-unary-ops': [2, {
+      'words': true,
+      'nonwords': false
+    }],
+    'spaced-comment': [2, 'always', {
+      'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
+    }],
+    'template-curly-spacing': [2, 'never'],
+    'use-isnan': 2,
+    'valid-typeof': 2,
+    'wrap-iife': [2, 'any'],
+    'yield-star-spacing': [2, 'both'],
+    'yoda': [2, 'never'],
+    'prefer-const': 0,
+    'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
+    'object-curly-spacing': [2, 'always', {
+      objectsInObjects: false
+    }],
+    'array-bracket-spacing': [2, 'never'],
+    'no-unused-vars': 0
+  }
+}
+

+ 27 - 0
manager-admin/.gitignore

@@ -0,0 +1,27 @@
+.DS_Store
+node_modules/
+dist/
+gifs/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+test/unit/coverage
+test/e2e/reports
+selenium-debug.log
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+
+yarn.lock
+package-lock.json
+
+ui-utils/
+ui-domain/
+ui-components/
+yarn.lock

+ 0 - 0
manager-admin/.gitkeep


+ 3 - 0
manager-admin/.npmrc

@@ -0,0 +1,3 @@
+phantomjs_cdnurl=http://cnpmjs.org/downloads
+sass_binary_site=https://npm.taobao.org/mirrors/node-sass/
+registry=https://registry.npm.taobao.org

+ 9 - 0
manager-admin/.postcssrc.js

@@ -0,0 +1,9 @@
+// https://github.com/michael-ciniawsky/postcss-load-config
+
+module.exports = {
+  "plugins": {
+    // to edit target browsers: use "browserslist" field in package.json
+    "postcss-import": {},
+    "autoprefixer": {}
+  }
+}

+ 5 - 0
manager-admin/.travis.yml

@@ -0,0 +1,5 @@
+language: node_js
+node_js: stable
+script: npm run test
+notifications:
+  email: false

+ 13 - 0
manager-admin/Dockerfile

@@ -0,0 +1,13 @@
+FROM nginx:alpine
+MAINTAINER Javashop
+
+RUN mkdir -p /app/
+COPY ./dist /app/
+COPY ./nginx.conf /etc/nginx/nginx.conf
+COPY ./set-envs.sh /app/set-envs.sh
+
+RUN ["chmod", "+x", "/app/set-envs.sh"]
+
+EXPOSE 443 80
+
+CMD sh -c "/app/set-envs.sh && exec nginx -g 'daemon off;'"

+ 21 - 0
manager-admin/README-en.md

@@ -0,0 +1,21 @@
+## Development
+
+```bash
+# Install dependencies
+npm install
+
+# Run local dev server
+npm run dev
+```
+
+## Distribution
+
+```bash
+# Build staged environment with webpack-bundle-analyzer
+npm run build:sit-preview
+
+# Build production environment
+npm run build:prod
+```
+
+

+ 17 - 0
manager-admin/README.md

@@ -0,0 +1,17 @@
+## 开发
+```bash
+	# 安装依赖
+	npm install
+
+	# 启动服务
+	npm run dev
+```
+
+## 发布
+```bash
+	# 构建测试环境
+	npm run build:sit
+
+	# 构建生成环境
+	npm run build:prod
+```

+ 48 - 0
manager-admin/build/build.js

@@ -0,0 +1,48 @@
+'use strict'
+require('./check-versions')()
+
+const ora = require('ora')
+const rm = require('rimraf')
+const path = require('path')
+const chalk = require('chalk')
+const webpack = require('webpack')
+const config = require('../config')
+const webpackConfig = require('./webpack.prod.conf')
+const server = require('pushstate-server')
+
+var spinner = ora('building for '+ process.env.env_config+ ' environment...' )
+spinner.start()
+
+rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
+  if (err) throw err
+  webpack(webpackConfig, (err, stats) => {
+    spinner.stop()
+    if (err) throw err
+    process.stdout.write(stats.toString({
+      colors: true,
+      modules: false,
+      children: false,
+      chunks: false,
+      chunkModules: false
+    }) + '\n\n')
+
+    if (stats.hasErrors()) {
+      console.log(chalk.red('  Build failed with errors.\n'))
+      process.exit(1)
+    }
+
+    console.log(chalk.cyan('  Build complete.\n'))
+    console.log(chalk.yellow(
+      '  Tip: built files are meant to be served over an HTTP server.\n' +
+      '  Opening index.html over file:// won\'t work.\n'
+    ))
+    if(process.env.npm_config_preview){
+      server.start({
+          port: 9526,
+          directory: './dist',
+          file: '/index.html'
+      });
+      console.log('> Listening at ' +  'http://localhost:9526' + '\n')
+    }
+  })
+})

+ 54 - 0
manager-admin/build/check-versions.js

@@ -0,0 +1,54 @@
+'use strict'
+const chalk = require('chalk')
+const semver = require('semver')
+const packageConfig = require('../package.json')
+const shell = require('shelljs')
+
+function exec (cmd) {
+  return require('child_process').execSync(cmd).toString().trim()
+}
+
+const versionRequirements = [
+  {
+    name: 'node',
+    currentVersion: semver.clean(process.version),
+    versionRequirement: packageConfig.engines.node
+  }
+]
+
+if (shell.which('npm')) {
+  versionRequirements.push({
+    name: 'npm',
+    currentVersion: exec('npm --version'),
+    versionRequirement: packageConfig.engines.npm
+  })
+}
+
+module.exports = function () {
+  const warnings = []
+
+  for (let i = 0; i < versionRequirements.length; i++) {
+    const mod = versionRequirements[i]
+
+    if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
+      warnings.push(mod.name + ': ' +
+        chalk.red(mod.currentVersion) + ' should be ' +
+        chalk.green(mod.versionRequirement)
+      )
+    }
+  }
+
+  if (warnings.length) {
+    console.log('')
+    console.log(chalk.yellow('To use this template, you must update following to modules:'))
+    console.log()
+
+    for (let i = 0; i < warnings.length; i++) {
+      const warning = warnings[i]
+      console.log('  ' + warning)
+    }
+
+    console.log()
+    process.exit(1)
+  }
+}

二進制
manager-admin/build/logo.png


+ 101 - 0
manager-admin/build/utils.js

@@ -0,0 +1,101 @@
+'use strict'
+const path = require('path')
+const config = require('../config')
+const ExtractTextPlugin = require('extract-text-webpack-plugin')
+const packageConfig = require('../package.json')
+
+exports.assetsPath = function (_path) {
+  const assetsSubDirectory = process.env.NODE_ENV === 'production'
+    ? config.build.assetsSubDirectory
+    : config.dev.assetsSubDirectory
+
+  return path.posix.join(assetsSubDirectory, _path)
+}
+
+exports.cssLoaders = function (options) {
+  options = options || {}
+
+  const cssLoader = {
+    loader: 'css-loader',
+    options: {
+      sourceMap: options.sourceMap
+    }
+  }
+
+  const postcssLoader = {
+    loader: 'postcss-loader',
+    options: {
+      sourceMap: options.sourceMap
+    }
+  }
+
+  // generate loader string to be used with extract text plugin
+  function generateLoaders (loader, loaderOptions) {
+    const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
+
+    if (loader) {
+      loaders.push({
+        loader: loader + '-loader',
+        options: Object.assign({}, loaderOptions, {
+          sourceMap: options.sourceMap
+        })
+      })
+    }
+
+    // Extract CSS when that option is specified
+    // (which is the case during production build)
+    if (options.extract) {
+      return ExtractTextPlugin.extract({
+        use: loaders,
+        fallback: 'vue-style-loader'
+      })
+    } else {
+      return ['vue-style-loader'].concat(loaders)
+    }
+  }
+
+  // https://vue-loader.vuejs.org/en/configurations/extract-css.html
+  return {
+    css: generateLoaders(),
+    postcss: generateLoaders(),
+    less: generateLoaders('less'),
+    sass: generateLoaders('sass', { indentedSyntax: true }),
+    scss: generateLoaders('sass'),
+    stylus: generateLoaders('stylus'),
+    styl: generateLoaders('stylus')
+  }
+}
+
+// Generate loaders for standalone style files (outside of .vue)
+exports.styleLoaders = function (options) {
+  const output = []
+  const loaders = exports.cssLoaders(options)
+
+  for (const extension in loaders) {
+    const loader = loaders[extension]
+    output.push({
+      test: new RegExp('\\.' + extension + '$'),
+      use: loader
+    })
+  }
+
+  return output
+}
+
+exports.createNotifierCallback = () => {
+  const notifier = require('node-notifier')
+
+  return (severity, errors) => {
+    if (severity !== 'error') return
+
+    const error = errors[0]
+    const filename = error.file && error.file.split('!').pop()
+
+    notifier.notify({
+      title: packageConfig.name,
+      message: severity + ': ' + error.name,
+      subtitle: filename || '',
+      icon: path.join(__dirname, 'logo.png')
+    })
+  }
+}

+ 22 - 0
manager-admin/build/vue-loader.conf.js

@@ -0,0 +1,22 @@
+'use strict'
+const utils = require('./utils')
+const config = require('../config')
+const isProduction = process.env.NODE_ENV === 'production'
+const sourceMapEnabled = isProduction
+  ? config.build.productionSourceMap
+  : config.dev.cssSourceMap
+
+module.exports = {
+  loaders: utils.cssLoaders({
+    sourceMap: sourceMapEnabled,
+    extract: isProduction
+  }),
+  cssSourceMap: sourceMapEnabled,
+  cacheBusting: config.dev.cacheBusting,
+  transformToRequire: {
+    video: ['src', 'poster'],
+    source: 'src',
+    img: 'src',
+    image: 'xlink:href'
+  }
+}

+ 115 - 0
manager-admin/build/webpack.base.conf.js

@@ -0,0 +1,115 @@
+'use strict'
+const path = require('path')
+const utils = require('./utils')
+const config = require('../config')
+const vueLoaderConfig = require('./vue-loader.conf')
+const webpack = require('webpack')
+
+function resolve (dir) {
+  return path.join(__dirname, '..', dir)
+}
+
+const createLintingRule = () => ({
+  test: /\.(js|vue)$/,
+  loader: 'eslint-loader',
+  enforce: 'pre',
+  include: [resolve('src'), resolve('test')],
+  options: {
+    formatter: require('eslint-friendly-formatter'),
+    emitWarning: !config.dev.showEslintErrorsInOverlay
+  }
+})
+
+module.exports = {
+  context: path.resolve(__dirname, '../'),
+  entry: {
+    app: ['babel-polyfill', './src/main.js']
+  },
+  externals: {
+    jquery: 'window.$',
+    xlsx: 'window.XLSX',
+    echarts: 'window.echarts',
+    psl: 'window.psl'
+  },
+  output: {
+    path: config.build.assetsRoot,
+    filename: '[name].js',
+    publicPath: process.env.NODE_ENV === 'production'
+      ? config.build.assetsPublicPath
+      : config.dev.assetsPublicPath
+  },
+  resolve: {
+    extensions: ['.js', '.vue', '.json'],
+    alias: {
+      'vue$': 'vue/dist/vue.esm.js',
+      '@': resolve('src'),
+      '~': resolve('')
+    }
+  },
+  module: {
+    rules: [
+      ...(config.dev.useEslint ? [createLintingRule()] : []),
+      {
+        test: /\.vue$/,
+        loader: 'vue-loader',
+        options: vueLoaderConfig
+      },
+      {
+        test: /\.js$/,
+        exclude: /node_modules/,
+        loader: 'babel-loader?cacheDirectory'
+      },
+      {
+        test: /\.svg$/,
+        loader: 'svg-sprite-loader',
+        include: [resolve('src/icons')],
+        options: {
+          symbolId: 'icon-[name]'
+        }
+      },
+      {
+        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
+        loader: 'url-loader',
+        exclude: [resolve('src/icons')],
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('img/[name].[hash:7].[ext]')
+        }
+      },
+      {
+        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('media/[name].[hash:7].[ext]')
+        }
+      },
+      {
+        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
+        }
+      }
+    ]
+  },
+  plugins: [
+    new webpack.ProvidePlugin({
+      jQuery: 'jquery',
+      $: 'jquery'
+    })
+  ],
+  node: {
+    // prevent webpack from injecting useless setImmediate polyfill because Vue
+    // source contains it (although only uses it if it's native).
+    setImmediate: false,
+    // prevent webpack from injecting mocks to Node native modules
+    // that does not make sense for the client
+    dgram: 'empty',
+    fs: 'empty',
+    net: 'empty',
+    tls: 'empty',
+    child_process: 'empty'
+  }
+}

+ 88 - 0
manager-admin/build/webpack.dev.conf.js

@@ -0,0 +1,88 @@
+'use strict'
+const path = require('path')
+const utils = require('./utils')
+const webpack = require('webpack')
+const config = require('../config')
+const merge = require('webpack-merge')
+const baseWebpackConfig = require('./webpack.base.conf')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
+const portfinder = require('portfinder')
+
+function resolve (dir) {
+  return path.join(__dirname, '..', dir)
+}
+
+const HOST = process.env.HOST
+const PORT = process.env.PORT && Number(process.env.PORT)
+
+const devWebpackConfig = merge(baseWebpackConfig, {
+  module: {
+    rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
+  },
+  // cheap-module-eval-source-map is faster for development
+  devtool: config.dev.devtool,
+
+  // these devServer options should be customized in /config/index.js
+  devServer: {
+    clientLogLevel: 'warning',
+    historyApiFallback: true,
+    hot: true,
+    compress: true,
+    host: HOST || config.dev.host,
+    port: PORT || config.dev.port,
+    open: config.dev.autoOpenBrowser,
+    overlay: config.dev.errorOverlay
+      ? { warnings: false, errors: true }
+      : false,
+    publicPath: config.dev.assetsPublicPath,
+    proxy: config.dev.proxyTable,
+    quiet: true, // necessary for FriendlyErrorsPlugin
+    watchOptions: {
+      poll: config.dev.poll,
+    }
+  },
+  plugins: [
+    new webpack.DefinePlugin({
+      'process.env': require('../config/dev.env')
+    }),
+    new webpack.HotModuleReplacementPlugin(),
+    new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
+    new webpack.NoEmitOnErrorsPlugin(),
+    // https://github.com/ampedandwired/html-webpack-plugin
+    new HtmlWebpackPlugin({
+      filename: 'index.html',
+      template: 'index.html',
+      inject: true,
+      favicon: resolve('favicon.ico'),
+      title: 'javashop-admin',
+      path: config.dev.assetsPublicPath + config.dev.assetsSubDirectory
+    }),
+  ]
+})
+
+module.exports = new Promise((resolve, reject) => {
+  portfinder.basePort = process.env.PORT || config.dev.port
+  portfinder.getPort((err, port) => {
+    if (err) {
+      reject(err)
+    } else {
+      // publish the new Port, necessary for e2e tests
+      process.env.PORT = port
+      // add port to devServer config
+      devWebpackConfig.devServer.port = port
+
+      // Add FriendlyErrorsPlugin
+      devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
+        compilationSuccessInfo: {
+          messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
+        },
+        onErrors: config.dev.notifyOnErrors
+        ? utils.createNotifierCallback()
+        : undefined
+      }))
+
+      resolve(devWebpackConfig)
+    }
+  })
+})

+ 175 - 0
manager-admin/build/webpack.prod.conf.js

@@ -0,0 +1,175 @@
+'use strict'
+const path = require('path')
+const utils = require('./utils')
+const webpack = require('webpack')
+const config = require('../config')
+const merge = require('webpack-merge')
+const baseWebpackConfig = require('./webpack.base.conf')
+const CopyWebpackPlugin = require('copy-webpack-plugin')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const ExtractTextPlugin = require('extract-text-webpack-plugin')
+const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
+const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
+
+function resolve (dir) {
+  return path.join(__dirname, '..', dir)
+}
+
+const env = require('../config/'+process.env.env_config+'.env')
+
+const webpackConfig = merge(baseWebpackConfig, {
+  module: {
+    rules: utils.styleLoaders({
+      sourceMap: config.build.productionSourceMap,
+      extract: true,
+      usePostCSS: true
+    })
+  },
+  devtool: config.build.productionSourceMap ? config.build.devtool : false,
+  output: {
+    path: config.build.assetsRoot,
+    filename: utils.assetsPath('js/[name].[chunkhash].js'),
+    chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
+  },
+  plugins: [
+    // http://vuejs.github.io/vue-loader/en/workflow/production.html
+    new webpack.DefinePlugin({
+      'process.env': env
+    }),
+    new UglifyJsPlugin({
+      uglifyOptions: {
+        compress: {
+          warnings: false
+        }
+      },
+      sourceMap: config.build.productionSourceMap,
+      parallel: true
+    }),
+    // extract css into its own file
+    new ExtractTextPlugin({
+      filename: utils.assetsPath('css/[name].[contenthash].css'),
+      // Setting the following option to `false` will not extract CSS from codesplit chunks.
+      // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
+      // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
+      allChunks: false,
+    }),
+    // Compress extracted CSS. We are using this plugin so that possible
+    // duplicated CSS from different components can be deduped.
+    new OptimizeCSSPlugin({
+      cssProcessorOptions: config.build.productionSourceMap
+        ? { safe: true, map: { inline: false } }
+        : { safe: true }
+    }),
+    // generate dist index.html with correct asset hash for caching.
+    // you can customize output by editing /index.html
+    // see https://github.com/ampedandwired/html-webpack-plugin
+    new HtmlWebpackPlugin({
+      filename: config.build.index,
+      template: 'index.html',
+      inject: true,
+      favicon: resolve('favicon.ico'),
+      title: 'javashop-admin',
+      path: config.build.assetsPublicPath + config.build.assetsSubDirectory,
+      minify: {
+        removeComments: true,
+        collapseWhitespace: true,
+        removeAttributeQuotes: true
+        // more options:
+        // https://github.com/kangax/html-minifier#options-quick-reference
+      },
+      // necessary to consistently work with multiple chunks via CommonsChunkPlugin
+      chunksSortMode: 'dependency'
+    }),
+    // keep module.id stable when vender modules does not change
+    new webpack.HashedModuleIdsPlugin(),
+    // enable scope hoisting
+    new webpack.optimize.ModuleConcatenationPlugin(),
+    // split vendor js into its own file
+    new webpack.optimize.CommonsChunkPlugin({
+      name: 'vendor',
+      minChunks (module) {
+        // any required modules inside node_modules are extracted to vendor
+        return (
+          module.resource &&
+          /\.js$/.test(module.resource) &&
+          module.resource.indexOf(
+            path.join(__dirname, '../node_modules')
+          ) === 0
+        )
+      }
+    }),
+    // extract webpack runtime and module manifest to its own file in order to
+    // prevent vendor hash from being updated whenever app bundle is updated
+    new webpack.optimize.CommonsChunkPlugin({
+      name: 'manifest',
+      minChunks: Infinity
+    }),
+    // This instance extracts shared chunks from code splitted chunks and bundles them
+    // in a separate chunk, similar to the vendor chunk
+    // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
+    new webpack.optimize.CommonsChunkPlugin({
+      name: 'app',
+      async: 'vendor-async',
+      children: true,
+      minChunks: 3
+    }),
+    // split echarts into its own file
+    new webpack.optimize.CommonsChunkPlugin({
+      async: 'echarts',
+      minChunks(module) {
+        var context = module.context;
+        return context && (context.indexOf('echarts') >= 0 || context.indexOf('zrender') >= 0);
+      }
+    }),
+    // split xlsx into its own file
+    new webpack.optimize.CommonsChunkPlugin({
+      async: 'xlsx',
+      minChunks(module) {
+        var context = module.context;
+        return context && (context.indexOf('xlsx') >= 0);
+      }
+    }),
+    // split codemirror into its own file
+    new webpack.optimize.CommonsChunkPlugin({
+      async: 'codemirror',
+      minChunks(module) {
+        var context = module.context;
+        return context && (context.indexOf('codemirror') >= 0);
+      }
+    }),
+
+    // copy custom static assets
+    new CopyWebpackPlugin([
+      {
+        from: path.resolve(__dirname, '../static'),
+        to: config.build.assetsSubDirectory,
+        ignore: ['.*']
+      }
+    ])
+  ]
+})
+
+if (config.build.productionGzip) {
+  const CompressionWebpackPlugin = require('compression-webpack-plugin')
+
+  webpackConfig.plugins.push(
+    new CompressionWebpackPlugin({
+      asset: '[path].gz[query]',
+      algorithm: 'gzip',
+      test: new RegExp(
+        '\\.(' +
+        config.build.productionGzipExtensions.join('|') +
+        ')$'
+      ),
+      threshold: 10240,
+      minRatio: 0.8
+    })
+  )
+}
+
+if (config.build.bundleAnalyzerReport) {
+  const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
+  webpackConfig.plugins.push(new BundleAnalyzerPlugin())
+}
+
+module.exports = webpackConfig

+ 7 - 0
manager-admin/config/dev.env.js

@@ -0,0 +1,7 @@
+const { distribution } = require('./index')
+
+module.exports = {
+	NODE_ENV: '"development"',
+	ENV_CONFIG: '"dev"',
+  DISTRIBUTION: distribution
+}

+ 88 - 0
manager-admin/config/index.js

@@ -0,0 +1,88 @@
+'use strict'
+// Template version: 1.2.6
+// see http://vuejs-templates.github.io/webpack for documentation.
+
+const path = require('path')
+
+module.exports = {
+  /**
+   * 分销功能开关
+   * 如果您需要开启分销相关功能,请设置为true
+   */
+  distribution: true,
+  dev: {
+
+    // Paths
+    assetsSubDirectory: 'static',
+    assetsPublicPath: '/',
+    proxyTable: {},
+
+    // Various Dev Server settings
+    host: '0.0.0.0', // can be overwritten by process.env.HOST
+    port: 3003, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
+    autoOpenBrowser: false,
+    errorOverlay: true,
+    notifyOnErrors: false,
+    poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
+
+    // Use Eslint Loader?
+    // If true, your code will be linted during bundling and
+    // linting errors and warnings will be shown in the console.
+    useEslint: true,
+    // If true, eslint errors and warnings will also be shown in the error overlay
+    // in the browser.
+    showEslintErrorsInOverlay: false,
+
+    /**
+     * Source Maps
+     */
+
+    // https://webpack.js.org/configuration/devtool/#development
+    devtool: '#cheap-source-map',
+
+    // If you have problems debugging vue-files in devtools,
+    // set this to false - it *may* help
+    // https://vue-loader.vuejs.org/en/options.html#cachebusting
+    cacheBusting: true,
+
+    // CSS Sourcemaps off by default because relative paths are "buggy"
+    // with this option, according to the CSS-Loader README
+    // (https://github.com/webpack/css-loader#sourcemaps)
+    // In our experience, they generally work as expected,
+    // just be aware of this issue when enabling this option.
+    cssSourceMap: false,
+  },
+
+  build: {
+    // Template for index.html
+    index: path.resolve(__dirname, '../dist/index.html'),
+
+    // Paths
+    assetsRoot: path.resolve(__dirname, '../dist'),
+    assetsSubDirectory: 'static',
+
+    // you can set by youself according to actual condition
+    assetsPublicPath: '/',
+
+    /**
+     * Source Maps
+     */
+
+    productionSourceMap: false,
+    // https://webpack.js.org/configuration/devtool/#production
+    devtool: '#source-map',
+
+    // Gzip off by default as many popular static hosts such as
+    // Surge or Netlify already gzip all static assets for you.
+    // Before setting to `true`, make sure to:
+    // npm install --save-dev compression-webpack-plugin
+    productionGzip: true,
+    productionGzipExtensions: ['js', 'css'],
+
+    // Run the build command with an extra argument to
+    // View the bundle analyzer report after build finishes:
+    // `npm run build --report`
+    // Set to `true` or `false` to always turn it on or off
+    bundleAnalyzerReport: process.env.npm_config_report
+  }
+}

+ 7 - 0
manager-admin/config/prod.env.js

@@ -0,0 +1,7 @@
+const { distribution } = require('./index')
+
+module.exports = {
+	NODE_ENV: '"production"',
+	ENV_CONFIG: '"prod"',
+  DISTRIBUTION: distribution
+}

+ 4 - 0
manager-admin/config/sit.env.js

@@ -0,0 +1,4 @@
+module.exports = {
+	NODE_ENV: '"production"',
+	ENV_CONFIG: '"sit"'
+}

二進制
manager-admin/favicon.ico


+ 32 - 0
manager-admin/index.html

@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <script>
+    var ua = window.navigator.userAgent
+    var isIe = /MSIE|Trident/.test(ua)
+    // if (isIe) window.location.href = 'http://support.dmeng.net/upgrade-your-browser.html?referrer=' + encodeURIComponent(window.location.href)
+  </script>
+  <script src="/static/js/envs.js"></script>
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+  <meta name="renderer" content="webkit">
+  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
+  <title>javashop-admin</title>
+</head>
+<body>
+<div id="app">
+  <div style="display: flex;width: 100vw;height: 100vh;justify-content:center;align-items:center">
+    <img src="/static/img/index.ripple-radio-preloader.gif" alt="">
+  </div>
+</div>
+<!-- built files will be auto injected -->
+<script src="/static/js/jquery.min.js"></script>
+<script src="/static/js/xlsx.full.min.js"></script>
+<script src="/static/js/echarts.min.js"></script>
+<script src="/static/js/psl.js"></script>
+<script src="/static/UE/ueditor.config.js"></script>
+<script src="/static/UE/ueditor.all.js"></script>
+<script src="/static/UE/lang/zh-cn/zh-cn.js"></script>
+<script src="/static/UE/ueditor.parse.js"></script>
+</body>
+</html>

+ 51 - 0
manager-admin/nginx.conf

@@ -0,0 +1,51 @@
+#这个文件给docker用的
+#user  nobody;
+worker_processes  1;
+
+#error_log  logs/error.log;
+#error_log  logs/error.log  notice;
+#error_log  logs/error.log  info;
+
+#pid        logs/nginx.pid;
+
+
+events {
+    worker_connections  1024;
+}
+
+
+http {
+    include       mime.types;
+    default_type  application/octet-stream;
+
+    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
+    #                  '$status $body_bytes_sent "$http_referer" '
+    #                  '"$http_user_agent" "$http_x_forwarded_for"';
+
+    #access_log  logs/access.log  main;
+
+    sendfile        on;
+    #tcp_nopush     on;
+
+    #keepalive_timeout  0;
+    keepalive_timeout  65;
+    client_max_body_size 10m;
+    gzip on;
+    gzip_min_length  5k;
+    gzip_buffers     4 16k;
+    gzip_http_version 1.0;
+    gzip_comp_level 4;
+    gzip_types       text/plain application/x-javascript application/javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
+    gzip_vary on;
+
+    server {
+        listen       80;
+        server_name  localhost;
+
+        location / {
+            root /app;
+            try_files $uri $uri/ /index.html $uri/ =404;
+            index  index.html index.htm;
+        }
+    }
+}

+ 119 - 0
manager-admin/package.json

@@ -0,0 +1,119 @@
+{
+  "name": "javashop-admin",
+  "version": "0.0.1",
+  "description": "javashop 的后台管理",
+  "author": "Pan <panfree23@gmail.com>, javashop",
+  "private": true,
+  "scripts": {
+    "dev": "cross-env BABEL_ENV=development webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
+    "build:prod": "cross-env NODE_ENV=production env_config=prod node build/build.js",
+    "build:sit": "cross-env NODE_ENV=production env_config=sit node build/build.js",
+    "lint": "eslint --ext .js,.vue src",
+    "test": "npm run lint"
+  },
+  "dependencies": {
+    "axios": "0.17.1",
+    "babel-polyfill": "^6.26.0",
+    "clipboard": "1.7.1",
+    "codemirror": "5.32.0",
+    "dropzone": "5.2.0",
+    "echarts": "3.8.5",
+    "element-ui": "^2.9.2",
+    "file-saver": "1.3.3",
+    "font-awesome": "4.7.0",
+    "https": "^1.0.0",
+    "jquery": "^3.2.1",
+    "js-cookie": "2.2.0",
+    "js-md5": "0.7.3",
+    "jsonlint": "1.6.2",
+    "jszip": "3.1.5",
+    "jwt-decode": "^2.2.0",
+    "mockjs": "1.0.1-beta3",
+    "node-sass": "^4.13.0",
+    "normalize.css": "7.0.0",
+    "nprogress": "0.2.0",
+    "particles.js": "2.0.0",
+    "qrcode.vue": "^1.6.0",
+    "qs": "^6.9.1",
+    "screenfull": "^3.3.3",
+    "showdown": "1.8.5",
+    "simplemde": "1.11.2",
+    "sortablejs": "1.7.0",
+    "uuid": "^3.3.2",
+    "v-viewer": "^1.4.2",
+    "vue": "2.5.16",
+    "vue-awesome-swiper": "3.1.3",
+    "vue-count-to": "1.0.13",
+    "vue-draggable-resizable": "^2.1.0",
+    "vue-i18n": "7.3.2",
+    "vue-lazyload": "^1.2.6",
+    "vue-multiselect": "2.0.8",
+    "vue-router": "3.0.1",
+    "vue-splitpane": "1.0.2",
+    "vuedraggable": "2.16.0",
+    "vuex": "3.0.1",
+    "xlsx": "^0.14.2"
+  },
+  "devDependencies": {
+    "autoprefixer": "7.2.3",
+    "babel-core": "6.26.0",
+    "babel-eslint": "8.0.3",
+    "babel-helper-vue-jsx-merge-props": "2.0.3",
+    "babel-loader": "7.1.2",
+    "babel-plugin-component": "0.10.1",
+    "babel-plugin-dynamic-import-node": "1.2.0",
+    "babel-plugin-istanbul": "4.1.5",
+    "babel-plugin-syntax-dynamic-import": "6.18.0",
+    "babel-plugin-syntax-jsx": "6.18.0",
+    "babel-plugin-transform-decorators-legacy": "1.3.4",
+    "babel-plugin-transform-runtime": "6.23.0",
+    "babel-plugin-transform-vue-jsx": "3.5.0",
+    "babel-preset-env": "1.6.1",
+    "babel-preset-stage-2": "6.24.1",
+    "chalk": "2.3.0",
+    "compression-webpack-plugin": "^1.1.11",
+    "copy-webpack-plugin": "4.3.0",
+    "cross-env": "5.1.1",
+    "css-loader": "0.28.7",
+    "eslint": "4.13.1",
+    "eslint-friendly-formatter": "3.0.0",
+    "eslint-loader": "1.9.0",
+    "eslint-plugin-html": "4.0.1",
+    "extract-text-webpack-plugin": "3.0.2",
+    "file-loader": "1.1.5",
+    "friendly-errors-webpack-plugin": "1.6.1",
+    "html-webpack-plugin": "2.30.1",
+    "node-notifier": "5.1.2",
+    "optimize-css-assets-webpack-plugin": "3.2.0",
+    "ora": "1.3.0",
+    "portfinder": "1.0.13",
+    "postcss-import": "11.0.0",
+    "postcss-loader": "2.0.9",
+    "psl": "^1.1.29",
+    "pushstate-server": "3.0.1",
+    "rimraf": "2.6.2",
+    "sass-loader": "6.0.6",
+    "script-loader": "0.7.2",
+    "semver": "5.4.1",
+    "shelljs": "0.7.8",
+    "svg-sprite-loader": "3.5.2",
+    "uglifyjs-webpack-plugin": "1.1.3",
+    "url-loader": "0.6.2",
+    "vue-loader": "^14.2.4",
+    "vue-style-loader": "3.0.3",
+    "vue-template-compiler": "2.5.16",
+    "webpack": "3.10.0",
+    "webpack-bundle-analyzer": "^2.13.1",
+    "webpack-dev-server": "2.9.7",
+    "webpack-merge": "4.1.1"
+  },
+  "engines": {
+    "node": ">= 4.0.0",
+    "npm": ">= 3.0.0"
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not ie <= 8"
+  ]
+}

+ 11 - 0
manager-admin/set-envs.sh

@@ -0,0 +1,11 @@
+echo "window.__NUXT__ = { state: { env: {\
+API_MODEL: '${API_MODEL}',\
+API_BASE: '${API_BASE}',\
+API_BUYER: '${API_BUYER}',\
+API_SELLER: '${API_SELLER}',\
+API_ADMIN: '${API_ADMIN}',\
+DOMAIN_BUYER_PC: '${DOMAIN_BUYER_PC}',\
+DOMAIN_BUYER_WAP: '${DOMAIN_BUYER_WAP}',\
+DOMAIN_SELLER: '${DOMAIN_SELLER}',\
+DOMAIN_ADMIN: '${DOMAIN_ADMIN}'\
+} } }" > /app/static/js/envs.js

+ 21 - 0
manager-admin/src/App.vue

@@ -0,0 +1,21 @@
+<template>
+	<div id="app">
+		<router-view></router-view>
+	</div>
+</template>
+
+<script>
+  import { api } from '~/ui-domain'
+  export default{
+    name: 'App',
+    async mounted() {
+      const { data } = await this.$http.get(`${process.env.API_BASE || api.base}/site-show`)
+      document.title = data.site_name
+    }
+  }
+</script>
+<style type="text/css">
+	body .el-table th.gutter{
+    display: table-cell!important;
+}
+</style>

+ 79 - 0
manager-admin/src/api/afterSale.js

@@ -0,0 +1,79 @@
+/**
+ * 售后服务API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取售后服务记录相关数据
+ * @param params 参数
+ */
+export function getAfterSaleList(params) {
+  return request({
+    url: `admin/after-sales`,
+    method: 'get',
+    params
+  })
+}
+
+/**
+ * 获取售后服务详情数据
+ * @param service_sn 售后服务单编号
+ */
+export function getServiceDetail(service_sn) {
+  return request({
+    url: `admin/after-sales/detail/${service_sn}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 平台退款操作
+ * @param service_sn 售后服务单编号
+ * @param params 提交参数集合
+ */
+export function adminRefund(service_sn, params) {
+  return request({
+    url: `admin/after-sales/refund/${service_sn}`,
+    method: 'post',
+    params
+  })
+}
+
+/**
+ * 获取退款单记录相关数据
+ * @param params 参数
+ */
+export function getRefundList(params) {
+  return request({
+    url: `admin/after-sales/refund`,
+    method: 'get',
+    needToken: true,
+    params
+  })
+}
+
+/**
+ * 导出售后服务数据
+ * @param params 参数
+ */
+export function exportAfterSale(params) {
+  return request({
+    url: `admin/after-sales/export`,
+    method: 'get',
+    needToken: true,
+    params
+  })
+}
+
+/**
+ * 导出退款单
+ * @param params 参数
+ */
+export function exportRefund(params) {
+  return request({
+    url: `admin/after-sales/refund/export`,
+    method: 'get',
+    params
+  })
+}

+ 146 - 0
manager-admin/src/api/article.js

@@ -0,0 +1,146 @@
+/**
+ * 文章相关API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取文章分类
+ */
+export function getArticleCategory(params) {
+  return request({
+    url: 'admin/pages/article-categories',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取文章分类子项
+ * @param id
+ */
+export function getArticleCategoryChildren(id = 0) {
+  return request({
+    url: `admin/pages/article-categories/${id}/children`,
+    method: 'get',
+    loading: false
+  })
+}
+
+/**
+ * 添加文章分类
+ * @param params
+ */
+export function addArticleCategory(params) {
+  return request({
+    url: 'admin/pages/article-categories',
+    method: 'post',
+    data: params
+  })
+}
+
+/**
+ * 获取文章分类详情
+ * @param id
+ */
+export function getArticleCategoryDetail(id) {
+  return request({
+    url: `admin/pages/article-categories/${id}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 编辑文章分类
+ * @param id
+ * @param params
+ */
+export function editArticleCategory(id, params) {
+  return request({
+    url: `admin/pages/article-categories/${id}`,
+    method: 'put',
+    data: params
+  })
+}
+
+/**
+ * 删除文章分类列表
+ * @param id
+ */
+export function deleteAritcleCategory(id) {
+  return request({
+    url: `admin/pages/article-categories/${id}`,
+    method: 'delete'
+  })
+}
+
+/**
+ * 获取文章分类树
+ */
+export function getAritcleCategoryTree() {
+  return request({
+    url: 'admin/pages/article-categories/childrens',
+    method: 'get'
+  })
+}
+
+/**
+ * 获取文章列表
+ * @param params
+ */
+export function getArticleList(params) {
+  return request({
+    url: 'admin/pages/articles',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 添加文章
+ * @param params
+ */
+export function addArticle(params) {
+  return request({
+    url: 'admin/pages/articles',
+    method: 'post',
+    data: params
+  })
+}
+
+/**
+ * 获取文章详情
+ * @param id
+ */
+export function getArticleDetail(id) {
+  return request({
+    url: `admin/pages/articles/${id}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 修改文章
+ * @param id
+ * @param params
+ */
+export function editArticle(id, params) {
+  return request({
+    url: `admin/pages/articles/${id}`,
+    method: 'put',
+    data: params
+  })
+}
+
+/**
+ * 删除文章
+ * @param id
+ */
+export function deleteArticle(id) {
+  return request({
+    url: `admin/pages/articles/${id}`,
+    method: 'delete'
+  })
+}

+ 144 - 0
manager-admin/src/api/auth.js

@@ -0,0 +1,144 @@
+/**
+ * 权限管理相关API
+ */
+
+import request from '@/utils/request'
+import md5 from 'js-md5'
+
+/**
+ * 获取管理员列表
+ * @param params
+ */
+export function getAdministratorList(params) {
+  return request({
+    url: 'admin/systems/manager/admin-users',
+    method: 'get',
+    loaidng: false,
+    params
+  })
+}
+
+/**
+ * 添加管理员
+ * @param params
+ */
+export function addAdministrator(params) {
+  return request({
+    url: 'admin/systems/manager/admin-users',
+    method: 'post',
+    data: params
+  })
+}
+
+/**
+ * 获取管理员详情
+ * @param id
+ */
+export function getAdministratorDetail(id) {
+  return request({
+    url: `admin/systems/manager/admin-users/${id}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 修改管理员
+ * @param id
+ * @param parmas
+ */
+export function editAdministrator(id, parmas) {
+  return request({
+    url: `admin/systems/manager/admin-users/${id}`,
+    method: 'put',
+    data: parmas
+  })
+}
+
+/**
+ * 删除管理员
+ * @param id
+ */
+export function deleteAdministrator(id) {
+  return request({
+    url: `admin/systems/manager/admin-users/${id}`,
+    method: 'delete'
+  })
+}
+
+/**
+ * 获取角色列表
+ * @param params
+ */
+export function getRoleList(params) {
+  return request({
+    url: 'admin/systems/roles',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 删除角色
+ * @param id
+ */
+export function deleteRole(id) {
+  return request({
+    url: `admin/systems/roles/${id}`,
+    method: 'delete'
+  })
+}
+
+/**
+ * 获取角色具体权限
+ * @param id
+ */
+export function getRolePermission(id) {
+  return request({
+    url: `admin/systems/roles/${id}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 添加角色
+ * @param params
+ */
+export function addRole(params) {
+  return request({
+    url: 'admin/systems/roles',
+    method: 'post',
+    headers: { 'Content-Type': 'application/json' },
+    data: params
+  })
+}
+
+/**
+ * 修改角色
+ * @param id
+ * @param params
+ */
+export function editRole(id, params) {
+  return request({
+    url: `admin/systems/roles/${id}`,
+    method: 'put',
+    headers: { 'Content-Type': 'application/json' },
+    data: params
+  })
+}
+
+/**
+ * 修改当前管理员的头像以及密码
+ * @param params
+ */
+export function editUserInfo(params) {
+  if (params.old_passwprd && params.password) {
+    params.old_passwprd = md5(params.old_passwprd)
+    params.password = md5(params.password)
+  }
+  return request({
+    url: 'admin/systems/admin-users',
+    method: 'put',
+    data: params
+  })
+}

+ 79 - 0
manager-admin/src/api/brand.js

@@ -0,0 +1,79 @@
+/**
+ * 品牌管理API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取品牌列表
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function getBrandList(params) {
+  return request({
+    url: 'admin/goods/brands',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 添加品牌
+ * @param params
+ */
+export function addBrand(params) {
+  return request({
+    url: 'admin/goods/brands',
+    method: 'post',
+    data: params
+  })
+}
+
+/**
+ * 获取品牌详情
+ * @param id
+ */
+export function getBrandDetail(id) {
+  return request({
+    url: `admin/goods/brands/${id}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 编辑品牌
+ * @param id
+ * @param params
+ */
+export function editBrand(id, params) {
+  return request({
+    url: `admin/goods/brands/${id}`,
+    method: 'put',
+    data: params
+  })
+}
+
+/**
+ * 删除品牌
+ * @param ids
+ * @returns {Promise<any>}
+ */
+export function deleteBrand(ids) {
+  if (Array.isArray(ids)) ids = ids.join(',')
+  return request({
+    url: `admin/goods/brands/${ids}`,
+    method: 'delete'
+  })
+}
+
+/**
+ * 获取全部品牌列表
+ * @returns {Promise<any>}
+ */
+export function getAllBrandList() {
+  return request({
+    url: 'admin/goods/brands/all',
+    method: 'get'
+  })
+}

+ 135 - 0
manager-admin/src/api/category.js

@@ -0,0 +1,135 @@
+/**
+ * 分类管理API
+ */
+import request from '@/utils/request'
+
+/**
+ * 添加分类
+ * @param params
+ */
+export function addCategory(params) {
+  const _params = {
+    name: params.category_name,
+    parent_id: params.parent_id,
+    category_order: params.category_order,
+    image: params.category_image,
+    isShow: params.is_show,
+    advImage: params.adv_image,
+    advImageLink: params.adv_image_link
+  }
+  return request({
+    url: 'admin/goods/categories',
+    method: 'post',
+    data: _params
+  })
+}
+
+/**
+ * 编辑分类
+ * @param id
+ * @param params
+ */
+export function editCategory(id, params) {
+  const _params = {
+    name: params.category_name,
+    parent_id: params.parent_id,
+    category_order: params.category_order,
+    image: params.category_image,
+    isShow: params.is_show,
+    advImage: params.adv_image,
+    advImageLink: params.adv_image_link
+  }
+  return request({
+    url: `admin/goods/categories/${id}`,
+    method: 'put',
+    data: _params
+  })
+}
+
+/**
+ * 根据分类ID获取分类关联品牌数据
+ * @param category_id
+ * @returns {Promise<any>}
+ */
+export function getBrandByCategoryId(category_id) {
+  return request({
+    url: `admin/goods/categories/${category_id}/brands`,
+    method: 'get'
+  })
+}
+
+/**
+ * 编辑分类关联品牌
+ * @param category_id 分类ID
+ * @param choose_brands 品牌数组
+ */
+export function editCategoryBrand(category_id, choose_brands) {
+  return request({
+    url: `admin/goods/categories/${category_id}/brands`,
+    method: 'put',
+    data: { choose_brands }
+  })
+}
+
+/**
+ * 根据分类ID获取分类关联规格数据
+ * @param category_id
+ * @returns {Promise<any>}
+ */
+export function getSpecsByCategoryId(category_id) {
+  return request({
+    url: `admin/goods/categories/${category_id}/specs`,
+    method: 'get'
+  })
+}
+
+/**
+ * 编辑分类关联规格
+ * @param category_id 分类ID
+ * @param choose_specs 规格数组
+ * @returns {*}
+ */
+export function editCategorySpecs(category_id, choose_specs) {
+  return request({
+    url: `admin/goods/categories/${category_id}/specs`,
+    method: 'put',
+    data: { choose_specs }
+  })
+}
+
+/**
+ * 删除分类
+ * @param ids
+ * @returns {*}
+ */
+export function deleteCategory(ids) {
+  if (Array.isArray(ids)) ids = ids.join(',')
+  return request({
+    url: `admin/goods/categories/${ids}`,
+    method: 'delete'
+  })
+}
+
+/**
+ * 获取分类关联的参数
+ * @param category_id 分类ID
+ * @returns {*}
+ */
+export function getCategoryParams(category_id) {
+  return request({
+    url: `admin/goods/categories/${category_id}/param`,
+    method: 'get'
+  })
+}
+
+/**
+ * 获取分类子集
+ * @param parent_id
+ */
+export function getCategoryChildren(parent_id = 0) {
+  return request({
+    url: `admin/goods/categories/${parent_id}/children`,
+    method: 'get',
+    loading: false
+  })
+}

+ 31 - 0
manager-admin/src/api/collection.js

@@ -0,0 +1,31 @@
+/**
+ * Created by andste.cc@gmail.com on 2018/7/20.
+ * 收款单相关
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取收款单列表
+ * @param params
+ */
+export function getCollectionList(params) {
+  return request({
+    url: 'admin/trade/orders/pay-log',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 导出收款单
+ * @param params
+ */
+export function exportCollection(params) {
+  return request({
+    url: 'admin/trade/orders/pay-log/list',
+    method: 'get',
+    params
+  })
+}

+ 51 - 0
manager-admin/src/api/common.js

@@ -0,0 +1,51 @@
+/**
+ * 公共API
+ */
+
+import { api } from '~/ui-domain'
+import request from '@/utils/request'
+import Storage from '@/utils/storage'
+
+/**
+ * 获取图片验证码URL
+ * @param scene
+ * @param uuid
+ * @returns {string}
+ */
+export function getValidateCodeUrl(scene, uuid) {
+  return `${api.base}/captchas/${uuid}/${scene}?rmd=${new Date().getTime()}`
+}
+
+/**
+ * 获取登陆验证方式
+ */
+export function getValidator() {
+  return request({
+    url: `${api.base}/validator`,
+    method: 'GET'
+  })
+}
+
+/**
+ * 刷新token
+ */
+export function refreshToken() {
+  return request({
+    url: 'admin/systems/admin-users/token',
+    method: 'post',
+    data: {
+      refresh_token: Storage.getItem('admin_refresh_token')
+    }
+  })
+}
+
+/**
+ * 获取首页数据
+ */
+export function getIndexData() {
+  return request({
+    url: 'admin/index/page',
+    method: 'get',
+    loading: false
+  })
+}

+ 114 - 0
manager-admin/src/api/complaint.js

@@ -0,0 +1,114 @@
+/**
+ * 分类管理API
+ */
+import request from '@/utils/request'
+
+/**
+ * 获取投诉主题列表
+ * @param params
+ */
+export function getComplainSubjectList(params) {
+  return request({
+    url: 'admin/systems/complain-topics',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 添加投诉主题
+ * @param params
+ */
+export function addComplainSubject(params) {
+  return request({
+    url: 'admin/systems/complain-topics',
+    method: 'post',
+    params
+  })
+}
+
+/**
+ * 删除投诉主题
+ * @param params
+ */
+export function deleteComplainSubject(id) {
+  return request({
+    url: `admin/systems/complain-topics/${id}`,
+    method: 'DELETE'
+  })
+}
+
+/**
+ * 修改投诉主题
+ * @param params
+ */
+export function modifyComplainSubject(id, params) {
+  return request({
+    url: `admin/systems/complain-topics/${id}`,
+    method: 'PUT',
+    params
+  })
+}
+
+/**
+ * 获取投诉订单列表
+ * @param params
+ */
+export function getComplainList(params) {
+  return request({
+    url: 'admin/trade/order-complains',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取投诉订单的详细信息
+ * @param id
+ */
+export function getComplainInfo(id) {
+  return request({
+    url: `admin/trade/order-complains/${id}`,
+    method: 'get',
+    loading: false
+  })
+}
+
+/**
+ *审核并交由商家申诉
+ * @param id
+ */
+export function examineComplain(id) {
+  return request({
+    url: `admin/trade/order-complains/${id}/to-appeal`,
+    method: 'put'
+  })
+}
+
+/**
+ *直接仲裁结束流程
+ * @param id
+ * @param params
+ */
+export function arbitrationProcess(id, params) {
+  return request({
+    url: `admin/trade/order-complains/${id}/complete`,
+    method: 'put',
+    params
+  })
+}
+
+/**
+ * 发起对话
+ * @param id
+ * @param params
+ */
+export function initiationSession(id, params) {
+  return request({
+    url: `admin/trade/order-complains/${id}/communication`,
+    method: 'put',
+    params
+  })
+}

+ 30 - 0
manager-admin/src/api/connect.js

@@ -0,0 +1,30 @@
+/**
+ * Created by Andste on 2018/6/28.
+ * 信任登录相关API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取信任登录参数
+ */
+export function getConnect() {
+  return request({
+    url: 'admin/members/connect',
+    method: 'get'
+  })
+}
+
+/**
+ * 修改信任登录参数
+ * @param type
+ * @param params
+ */
+export function editConnect(type, params) {
+  return request({
+    url: `admin/members/connect/${type}`,
+    method: 'put',
+    headers: { 'Content-Type': 'application/json' },
+    data: params
+  })
+}

+ 305 - 0
manager-admin/src/api/distribution.js

@@ -0,0 +1,305 @@
+/**
+ * 分销相关API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取个人提成模板列表
+ * @param params
+ */
+export function getPerAccomplishmentTpl(params) {
+  return request({
+    url: 'admin/distribution/commission-tpl',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 添加提成模板
+ * @param params
+ */
+export function addPerTpl(params) {
+  return request({
+    url: 'admin/distribution/commission-tpl',
+    method: 'post',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 修改提成模板
+ * @param params
+ */
+export function editPerTpl(params) {
+  return request({
+    url: `admin/distribution/commission-tpl/${params.id}`,
+    method: 'put',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 删除提成模板
+ * @param id
+ */
+export function delPerTpl(id) {
+  return request({
+    url: `admin/distribution/commission-tpl/${id}`,
+    method: 'delete',
+    loading: false
+  })
+}
+
+/**
+ * 获取提成模板
+ * @param id
+ */
+export function getPerTpl(id) {
+  return request({
+    url: `admin/distribution/commission-tpl/${id}`,
+    method: 'get',
+    loading: false
+  })
+}
+
+/**
+ * 获取分销模板升级日志
+ */
+export function getUpgradeLogs(params) {
+  return request({
+    url: 'admin/distribution/upgradelog',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取个人分销商列表
+ * @param params
+ */
+export function getDistributorList(params) {
+  return request({
+    url: 'admin/distribution/member',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 修改分销商模板
+ * @param params
+ */
+export function modifyTpl(params) {
+  return request({
+    url: `admin/distribution/member/tpl`,
+    method: 'put',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取订单数量图 = 订单数
+ * @param params
+ */
+export function getOrderCountChart(params) {
+  return request({
+    url: 'admin/distribution/statistic/count',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取订单金额图 = 营业额
+ * @param params
+ */
+export function getOrderAmountChart(params) {
+  return request({
+    url: 'admin/distribution/statistic/order',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取订单返现图 = 利润额
+ * @param params
+ */
+export function getProfitChart(params) {
+  return request({
+    url: 'admin/distribution/statistic/push',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 业绩列表
+ * @param params
+ */
+export function getAchievementList(params) {
+  return request({
+    url: 'admin/distribution/bill/total',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 账单列表
+ * @param params
+ */
+export function getBillList(params) {
+  return request({
+    url: 'admin/distribution/bill/member',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取某个账单详情
+ * @param id
+ */
+export function getDisBillDetails(id) {
+  return request({
+    url: `admin/distribution/bill/member/${id}`,
+    method: 'get',
+    loading: false
+  })
+}
+
+/**
+ * 分销订单列表
+ * @param params
+ */
+export function getDisOrderList(params) {
+  return request({
+    url: 'admin/distribution/order',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 分销退款单查询
+ * @param params
+ */
+export function getDisRefundOrderList(params) {
+  return request({
+    url: 'admin/distribution/order/sellback',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取某个分销商下级业绩
+ * @param params
+ */
+export function getDisBillDown(params) {
+  return request({
+    url: 'admin/distribution/bill/member/down',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 提现申请/提现记录列表
+ * @param params
+ */
+export function getWithdrawApplyList(params) {
+  return request({
+    url: 'admin/distribution/withdraw/apply',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 审核提现申请
+ * @param params
+ */
+export function authWithdrawBatchApply(audit_result, params) {
+  return request({
+    url: `admin/distribution/withdraw/batch/auditing?audit_result=${audit_result}`,
+    method: 'post',
+    loading: false,
+    data: params,
+    headers: {
+      'Content-Type': 'application/json'
+    }
+  })
+}
+
+/**
+ * 设为已转账
+ * @param params
+ */
+export function batchSetTransferAccounts(params) {
+  return request({
+    url: 'admin/distribution/withdraw/batch/account/paid',
+    method: 'post',
+    loading: false,
+    data: params,
+    headers: {
+      'Content-Type': 'application/json'
+    }
+  })
+}
+
+/**
+ * 获取提现设置
+ * @param params
+ */
+export function getWithDrawSettings() {
+  return request({
+    url: 'admin/distribution/settings',
+    method: 'get',
+    loading: false
+  })
+}
+
+/**
+ * 保存提现设置
+ * @param params
+ */
+export function reserveWithDrawSettings(params) {
+  return request({
+    url: 'admin/distribution/settings',
+    method: 'put',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 导出提现申请
+ * @param params
+ */
+export function exportWithdrawApplyList(params) {
+  return request({
+    url: 'admin/distribution/withdraw/export',
+    method: 'get',
+    loading: false,
+    params
+  })
+}

+ 54 - 0
manager-admin/src/api/electronicReceipt.js

@@ -0,0 +1,54 @@
+/**
+ * 电子面单相关API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取电子面单列表
+ * @param params
+ */
+export function getElectronicReceiptList(params) {
+  return request({
+    url: 'admin/systems/waybills',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取电子面单详情
+ * @param bean
+ */
+export function getElectronicReceiptDetail(bean) {
+  return request({
+    url: `admin/systems/waybills/${bean}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 编辑电子面单
+ * @param bean
+ * @param params
+ */
+export function editElectronicReceipt(bean, params) {
+  return request({
+    url: `admin/systems/waybills/${bean}`,
+    method: 'put',
+    headers: { 'Content-Type': 'application/json' },
+    data: params
+  })
+}
+
+/**
+ * 开启电子面单
+ * @param bean
+ */
+export function openElectronicReceipt(bean) {
+  return request({
+    url: `admin/systems/waybills/${bean}/open`,
+    method: 'put'
+  })
+}

+ 89 - 0
manager-admin/src/api/express.js

@@ -0,0 +1,89 @@
+addExpress/**
+ * 快递公司相关API
+ */
+
+import request from '@/utils/request'
+import qs from 'qs'
+
+/**
+ * 获取物流公司列表
+ * @param params
+ */
+export function getExpressList(params) {
+  return request({
+    url: 'admin/systems/logi-companies',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 添加物流公司
+ * @param params
+ */
+export function addExpress(params) {
+  let arr = params.formItems
+  delete params.formItems
+  return request({
+    url: `admin/systems/logi-companies?${qs.stringify(params)}`,
+    method: 'post',
+    headers: {
+      'Content-Type': 'application/json'
+    },
+    data: arr
+  })
+}
+
+/**
+ * 删除物流公司
+ * @param id
+ */
+export function deleteExpress(id) {
+  return request({
+    url: `admin/systems/logi-companies/${id}`,
+    method: 'delete'
+  })
+}
+
+/**
+ * 获取物流公司详情
+ * @param id
+ */
+export function getExpressDetail(id) {
+  return request({
+    url: `admin/systems/logi-companies/${id}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 修改物流公司
+ * @param id
+ * @param params
+ */
+export function editExpress(id, params) {
+  let arr = params.formItems
+  delete params.formItems
+  return request({
+    url: `admin/systems/logi-companies/${id}?${qs.stringify(params)}`,
+    method: 'put',
+    headers: {
+      'Content-Type': 'application/json'
+    },
+    data: arr
+  })
+}
+
+/**
+ * 开启或禁用物流公司
+ * @param id
+ * @param status
+ */
+export function openDisableExpress(id, disabled) {
+  return request({
+    url: `admin/systems/logi-companies/${id}`,
+    method: 'post',
+    data: { disabled }
+  })
+}

+ 68 - 0
manager-admin/src/api/expressPlatform.js

@@ -0,0 +1,68 @@
+/**
+ * 快递相关API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取快递平台列表
+ * @param params
+ */
+export function getExpressPlatformList(params) {
+  return request({
+    url: 'admin/systems/express-platforms',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 修改快递平台
+ * @param bean
+ * @param params
+ */
+export function editExpressPlatform(bean, params) {
+  return request({
+    url: `admin/systems/express-platforms/${bean}`,
+    method: 'put',
+    headers: { 'Content-Type': 'application/json' },
+    data: params
+  })
+}
+
+/**
+ * 获取快递平台详细配置
+ * @param bean
+ */
+export function getExpressPlatformDetail(bean) {
+  return request({
+    url: `admin/systems/express-platforms/${bean}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 开启快递平台
+ * @param bean
+ */
+export function openExpressPlatformById(bean) {
+  return request({
+    url: `admin/systems/express-platforms/${bean}/open`,
+    method: 'put'
+  })
+}
+
+/**
+ * 查询快递物流信息
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function getLogisticsInfo(params) {
+  return request({
+    url: `admin/systems/express-platforms/express`,
+    method: 'get',
+    loading: false,
+    params
+  })
+}

+ 90 - 0
manager-admin/src/api/floor.js

@@ -0,0 +1,90 @@
+/**
+ * Created by Andste on 2018/5/16.
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取楼层数据
+ * @param client_type
+ * @param page_type
+ */
+export function getFloor(client_type, page_type) {
+  return request({
+    url: `admin/pages/${client_type}/${page_type}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 修改楼层
+ * @param client_type
+ * @param page_type
+ * @param params
+ */
+export function editFloor(client_type, page_type, params) {
+  return request({
+    url: `admin/pages/${client_type}/${page_type}`,
+    method: 'put',
+    data: params
+  })
+}
+
+/**
+ * 获取焦点图列表
+ * @param client_type
+ */
+export function getFocus(client_type) {
+  return request({
+    url: 'admin/focus-pictures',
+    method: 'get',
+    params: { client_type }
+  })
+}
+
+/**
+ * 添加焦点图
+ * @param params
+ */
+export function addFocus(params) {
+  return request({
+    url: 'admin/focus-pictures',
+    method: 'post',
+    data: params
+  })
+}
+
+/**
+ * 获取焦点图详情
+ * @param id
+ */
+export function getFocusDetail(id) {
+  return request({
+    url: `admin/focus-pictures/${id}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 修改焦点图
+ * @param id
+ * @param params
+ */
+export function editFocus(id, params) {
+  return request({
+    url: `admin/focus-pictures/${id}`,
+    method: 'put',
+    data: params
+  })
+}
+
+/**
+ * 删除焦点图
+ * @param id
+ */
+export function deleteFocus(id) {
+  return request({
+    url: `admin/focus-pictures/${id}`,
+    method: 'delete'
+  })
+}

+ 121 - 0
manager-admin/src/api/goods.js

@@ -0,0 +1,121 @@
+/**
+ * 商品管理API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取商品列表
+ * @param params
+ */
+export function getGoodsList(params) {
+  return request({
+    url: 'admin/goods',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 修改商品搜索优先级
+ * @param goods_id
+ * @param priority
+ */
+export function modifyPriority(goods_id, priority) {
+  return request({
+    url: 'admin/goodssearch/priority',
+    method: 'put',
+    loading: false,
+    params: { goods_id, priority }
+  })
+}
+
+/**
+ * 下架商品
+ * @param goods_id 商品ID
+ * @param reason 下架原因
+ * @returns {*}
+ */
+export function underGoods(goods_id, reason) {
+  return request({
+    url: `admin/goods/${goods_id}/under`,
+    method: 'put',
+    data: { reason }
+  })
+}
+
+/**
+ * 上架商品
+ * @param goods_id 商品ID
+ * @returns {*}
+ */
+export function upGoods(goods_id) {
+  return request({
+    url: `admin/goods/${goods_id}/up`,
+    method: 'put'
+  })
+}
+
+/**
+ * 获取待审核商品列表
+ * @param params
+ */
+export function getAuditGoods(params) {
+  params.is_auth = 0
+  return request({
+    url: `admin/goods`,
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 审核商品
+ * @param goods_ids
+ * @param params
+ * @returns {*}
+ */
+export function batchAuditGoods(param) {
+  return request({
+    url: `admin/goods/batch/audit`,
+    method: 'POST',
+    data: param,
+    headers: {
+      'Content-Type': 'application/json'
+    }
+  })
+}
+
+/**
+ * 商品索引生成
+ */
+export function initSearchIndex() {
+  return request({
+    url: 'admin/goods/search',
+    method: 'get'
+  })
+}
+
+/**
+ * 获取商品设置
+ */
+export function getGoodsSettings() {
+  return request({
+    url: 'admin/goods/settings',
+    method: 'get'
+  })
+}
+
+/**
+ * 修改商品设置
+ * @param params
+ */
+export function editGoodsSettings(params) {
+  return request({
+    url: 'admin/goods/settings',
+    method: 'post',
+    data: params
+  })
+}

+ 65 - 0
manager-admin/src/api/hotKeyword.js

@@ -0,0 +1,65 @@
+/**
+ * 热门关键字相关API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取热门关键字
+ * @param params
+ */
+export function getHotKeywords(params) {
+  return request({
+    url: 'admin/pages/hot-keywords',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 添加热门关键字
+ * @param params
+ */
+export function addHotKeywords(params) {
+  return request({
+    url: 'admin/pages/hot-keywords',
+    method: 'post',
+    data: params
+  })
+}
+
+/**
+ * 获取热门关键字详情
+ * @param id
+ */
+export function getHotKeywordsDetail(id) {
+  return request({
+    url: `admin/pages/hot-keywords/${id}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 修改热门关键字
+ * @param id
+ * @param params
+ */
+export function editHotKeywords(id, params) {
+  return request({
+    url: `admin/pages/hot-keywords/${id}`,
+    method: 'put',
+    data: params
+  })
+}
+
+/**
+ * 删除热门关键词
+ * @param id
+ */
+export function deleteHotKeywords(id) {
+  return request({
+    url: `admin/pages/hot-keywords/${id}`,
+    method: 'delete'
+  })
+}

+ 41 - 0
manager-admin/src/api/login.js

@@ -0,0 +1,41 @@
+import request from '@/utils/request'
+import Storage from '@/utils/storage'
+import md5 from 'js-md5'
+
+/**
+ * 登录
+ * @param params
+ * @returns {*}
+ */
+export function login(params) {
+  params.password = md5(params.password)
+  return request({
+    url: 'admin/systems/admin-users/login',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 退出账户
+ * @returns {*}
+ */
+export function logout() {
+  return request({
+    url: `admin/systems/admin-users/logout?uid=${Storage.getItem('admin_uid')}`,
+    method: 'post'
+  })
+}
+
+/**
+ * 获取用户角色权限
+ * @param role_id
+ * @returns {*}
+ */
+export function getUserRolesPermissions(role_id) {
+  return request({
+    url: `admin/systems/roles/${role_id}/checked`,
+    method: 'get'
+  })
+}

+ 51 - 0
manager-admin/src/api/logs.js

@@ -0,0 +1,51 @@
+/**
+ * 日志分析API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取服务名列表
+ * @param params 参数
+ */
+export function getLogServices() {
+  return request({
+    url: `admin/services`,
+    method: 'get'
+  })
+}
+
+/**
+ * 获取位于列表
+ * @param params 参数
+ */
+export function getInstances(appName) {
+  return request({
+    url: `admin/services/${appName}/instances`,
+    method: 'get'
+  })
+}
+
+/**
+ * 获取日志详情
+ * @param params 参数
+ */
+export function getLogDetails(appName, uuid, params) {
+  return request({
+    url: `/admin/services/${appName}/instances/${uuid}/logs`,
+    method: 'get',
+    params
+  })
+}
+
+/**
+ * 下载日志详情
+ * @param params 参数
+ */
+export function getDownloaderLogDetails(appName, uuid, params) {
+  return request({
+    url: `/admin/services/${appName}/instances/${uuid}/logs/downloader`,
+    method: 'get',
+    params
+  })
+}

+ 315 - 0
manager-admin/src/api/member.js

@@ -0,0 +1,315 @@
+/**
+ * 会员管理API
+ */
+
+import request from '@/utils/request'
+import md5 from 'js-md5'
+
+/**
+ * 获取会员列表
+ * @param params
+ */
+export function getMemberList(params) {
+  return request({
+    url: 'admin/members',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 添加会员
+ * @param params
+ */
+export function addMember(params) {
+  params = JSON.parse(JSON.stringify(params))
+  params.password = md5(params.password)
+  return request({
+    url: 'admin/members',
+    method: 'post',
+    data: params
+  })
+}
+
+/**
+ * 获取会员详情
+ * @param id
+ */
+export function getMemberDetail(id) {
+  return request({
+    url: `admin/members/${id}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 修改会员
+ * @param id
+ * @param params
+ */
+export function editMember(id, params) {
+  if (params.password) {
+    params.password = md5(params.password)
+  }
+  return request({
+    url: `admin/members/${id}`,
+    method: 'put',
+    data: params
+  })
+}
+
+/**
+ * 删除会员
+ * @param id
+ */
+export function deleteMember(id) {
+  return request({
+    url: `admin/members/${id}`,
+    method: 'delete'
+  })
+}
+
+/**
+ * 获取会员回收站列表
+ * @param params
+ */
+export function getRecycleMemberList(params) {
+  return request({
+    url: 'admin/members',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 恢复会员
+ * @param id
+ */
+export function recycleMember(id) {
+  return request({
+    url: `admin/members/${id}`,
+    method: 'post'
+  })
+}
+
+/**
+ * 获取会员收货地址列表
+ * @param member_id
+ * @param params
+ */
+export function getMemberAddress(member_id, params) {
+  return request({
+    url: `admin/members/addresses/${member_id}`,
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取会员咨询列表
+ * @param params
+ */
+export function getMemberAsks(params) {
+  return request({
+    url: 'admin/members/asks',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 删除会员咨询
+ * @param ask_id
+ */
+export function deleteMemberAsk(ask_id) {
+  return request({
+    url: `admin/members/asks/${ask_id}`,
+    method: 'delete'
+  })
+}
+
+/**
+ * 获取会员咨询详情
+ * @param ask_id
+ */
+export function getMemberAsksDetail(ask_id) {
+  return request({
+    url: `admin/members/asks/${ask_id}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 获取会员咨询回复列表
+ * @param params
+ */
+export function getMemberAsksReply(params) {
+  return request({
+    url: 'admin/members/reply',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 删除会员咨询回复
+ * @param id
+ */
+export function deleteMemberAskReply(id) {
+  return request({
+    url: `admin/members/reply/${id}`,
+    method: 'delete'
+  })
+}
+
+/**
+ * 修改会员消费积分
+ * @param member_id
+ * @param point
+ */
+export function editMemberConsumPoint(member_id, point) {
+  return request({
+    url: `admin/members/point/${member_id}`,
+    method: 'put',
+    data: { point }
+  })
+}
+
+/**
+ * 获取会员积分列表
+ * @param params
+ */
+export function getMemberPointList(params) {
+  return request({
+    url: `admin/members/point/${params.member_id}`,
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 审核咨询
+ * @param params
+ * @returns {*}
+ */
+export function batchAuditAsk(param) {
+  return request({
+    url: `admin/members/asks/batch/audit`,
+    method: 'POST',
+    data: param,
+    headers: {
+      'Content-Type': 'application/json'
+    }
+  })
+}
+
+/**
+ * 审核咨询回复
+ * @param params
+ * @returns {*}
+ */
+export function batchAuditReply(param) {
+  return request({
+    url: `admin/members/reply/batch/audit`,
+    method: 'POST',
+    data: param,
+    headers: {
+      'Content-Type': 'application/json'
+    }
+  })
+}
+
+/**
+ * 获取会员评论列表
+ * @param params
+ */
+export function getMemberComments(params) {
+  return request({
+    url: 'admin/members/comments',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 删除会员评论
+ * @param comment_id
+ */
+export function deleteMemberComments(comment_id) {
+  return request({
+    url: `admin/members/comments/${comment_id}`,
+    method: 'delete'
+  })
+}
+
+/**
+ * 审核评论
+ * @param comment_id
+ */
+export function examineMemberComments(comment_id, params) {
+  return request({
+    url: `admin/members/comments/${params}?audit_status=${comment_id}`,
+    method: 'post'
+  })
+}
+
+/**
+ * 审核商品评论
+ * @param params
+ * @returns {*}
+ */
+export function batchAuditComment(param) {
+  return request({
+    url: `admin/members/comments/batch/audit`,
+    method: 'POST',
+    data: param,
+    headers: {
+      'Content-Type': 'application/json'
+    }
+  })
+}
+
+/**
+ * 获取会员评论详情
+ * @param comment_id
+ */
+export function getMemberCommentDetail(comment_id) {
+  return request({
+    url: `admin/members/comments/${comment_id}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 获取会员预存款明细
+ * @param params
+ */
+export function getMemberDepositLog(params) {
+  return request({
+    url: 'admin/members/deposit/log',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取会员充值记录
+ * @param params
+ */
+export function getMemberDepositRecharge(params) {
+  return request({
+    url: 'admin/members/deposit/recharge',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+

+ 53 - 0
manager-admin/src/api/menus.js

@@ -0,0 +1,53 @@
+/**
+ * 菜单管理相关API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取菜单
+ * @param parent_id
+ */
+export function getMenusChildren(parent_id = 0) {
+  return request({
+    url: `admin/systems/menus/${parent_id}/children`,
+    method: 'get',
+    params: { parent_id }
+  })
+}
+
+/**
+ * 添加菜单
+ * @param params
+ */
+export function addMenu(params) {
+  return request({
+    url: 'admin/systems/menus',
+    method: 'post',
+    data: params
+  })
+}
+
+/**
+ * 修改菜单
+ * @param id
+ * @param params
+ */
+export function editMenu(id, params) {
+  return request({
+    url: `admin/systems/menus/${id}`,
+    method: 'put',
+    data: params
+  })
+}
+
+/**
+ * 删除菜单
+ * @param id
+ */
+export function deleteMenu(id) {
+  return request({
+    url: `admin/systems/menus/${id}`,
+    method: 'delete'
+  })
+}

+ 126 - 0
manager-admin/src/api/message.js

@@ -0,0 +1,126 @@
+/**
+ * 消息设置相关API
+ * 消息模板
+ * 站内消息
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取消息模板列表
+ * @param params
+ */
+export function getMessageTemplate(params) {
+  return request({
+    url: 'admin/systems/message-templates',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 编辑消息模板
+ * @param id
+ * @param params
+ */
+export function editMessageTemplate(id, params) {
+  return request({
+    url: `admin/systems/message-templates/${id}`,
+    method: 'put',
+    data: params
+  })
+}
+
+/**
+ * 获取站内消息列表
+ * @param params
+ */
+export function getMessageList(params) {
+  return request({
+    url: 'admin/systems/messages',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 发布新的站内消息
+ * @param params
+ */
+export function releaseMessage(params) {
+  return request({
+    url: 'admin/systems/messages',
+    method: 'post',
+    data: params
+  })
+}
+
+/**
+ * 获取微信服务消息列表
+ * @param params
+ */
+export function getWechatMessageList(params) {
+  return request({
+    url: 'admin/systems/wechat-msg-tmp',
+    method: 'get',
+    params
+  })
+}
+
+/**
+ * 获取一个微信服务消息
+ * @param id
+ */
+export function getWechatMessage(id) {
+  return request({
+    url: `admin/systems/wechat-msg-tmp/${id}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 修改微信服务消息模板
+ * @param id
+ * @param params
+ */
+export function modifyWechatMessage(id, params) {
+  return request({
+    url: `admin/systems/wechat-msg-tmp/${id}`,
+    method: 'put',
+    params
+  })
+}
+
+/**
+ * 删除微信服务消息
+ * @param id
+ */
+export function delWechatMessage(id) {
+  return request({
+    url: `admin/systems/wechat-msg-tmp/${id}`,
+    method: 'delete'
+  })
+}
+
+/**
+ * 同步微信服务消息
+ * @constructor
+ */
+export function SynchronizeWechatMessage() {
+  return request({
+    url: 'admin/systems/wechat-msg-tmp/sync',
+    method: 'post'
+  })
+}
+
+/**
+ * 查询微信服务消息是否已经同步
+ */
+export function getSynchronizeWechatMessage() {
+  return request({
+    url: 'admin/systems/wechat-msg-tmp/sync',
+    method: 'get'
+  })
+}

+ 185 - 0
manager-admin/src/api/order.js

@@ -0,0 +1,185 @@
+/**
+ * 订单相关API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取订单列表
+ * @param params
+ */
+export function getOrderList(params) {
+  return request({
+    url: 'admin/trade/orders',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 根据订单sn获取订单详情
+ * @param order_sn
+ */
+export function getOrderDetail(order_sn) {
+  return request({
+    url: `admin/trade/orders/${order_sn}`,
+    method: 'get',
+    loading: false
+  })
+}
+
+/**
+ * 根据订单sn获取订单日志
+ * @param order_sn
+ */
+export function getOrderLog(order_sn) {
+  return request({
+    url: `admin/trade/orders/${order_sn}/log`,
+    method: 'get',
+    loading: false
+  })
+}
+
+/**
+ * 确认收款
+ * @param order_sn
+ * @param pay_price
+ */
+export function confirmPay(order_sn, pay_price) {
+  return request({
+    url: `admin/trade/orders/${order_sn}/pay`,
+    method: 'post',
+    data: { pay_price }
+  })
+}
+
+/**
+ * 取消订单
+ * @param order_sn
+ */
+export function cancleOrder(order_sn) {
+  return request({
+    url: `admin/trade/orders/${order_sn}/cancelled`,
+    method: 'post'
+  })
+}
+
+/**
+ * 获取所有周期结算单列表
+ * @param params
+ */
+export function getAllSettlement(params) {
+  return request({
+    url: 'admin/order/bills/statistics',
+    method: 'get',
+    params
+  })
+}
+
+/**
+ * 获取某周期内结算单列表
+ * @param params
+ */
+export function getSettlementList(params) {
+  return request({
+    url: 'admin/order/bills',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取结算单详情
+ * @param id
+ */
+export function getSettlementDetail(id) {
+  return request({
+    url: `admin/order/bills/${id}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 获取账单中的订单列表或者退款单列表
+ * @param id
+ * @param type
+ * @param params
+ */
+export function getSettlementOrderList(id, type, params) {
+  return request({
+    url: `admin/order/bills/${id}/${type}`,
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 对账单进行下一步操作
+ * @param id
+ */
+export function operateSettlement(id) {
+  return request({
+    url: `admin/order/bills/${id}/next`,
+    method: 'put'
+  })
+}
+
+/**
+ * 导出结算单
+ * @param bill_id
+ */
+export function exportBill(bill_id) {
+  return request({
+    url: `admin/order/bills/${bill_id}/export`,
+    method: 'get'
+  })
+}
+
+/**
+ * 获取所有周期结算单列表统计
+ * @param id
+ */
+export function getSettlementStatistics(id) {
+  return request({
+    url: 'admin/order/bills/statistics',
+    method: 'get'
+  })
+}
+
+/**
+ * 获取订单设置
+ */
+export function getOrderSettings() {
+  return request({
+    url: 'admin/trade/orders/setting',
+    method: 'get'
+  })
+}
+
+/**
+ * 修改订单设置
+ * @param params
+ */
+export function editOrderSettings(params) {
+  return request({
+    url: 'admin/trade/orders/setting',
+    method: 'post',
+    data: params
+  })
+}
+
+/**
+ * 导出订单
+ * @param params
+ */
+export function exportOrders(params) {
+  return request({
+    url: 'admin/trade/orders/export',
+    method: 'get',
+    timeout: 0,
+    params
+  })
+}

+ 135 - 0
manager-admin/src/api/params.js

@@ -0,0 +1,135 @@
+/**
+ * 参数相关API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 添加参数组
+ * @param params
+ * @returns {*}
+ */
+export function addParamsGroup(params) {
+  return request({
+    url: 'admin/goods/parameter-groups',
+    method: 'post',
+    data: params
+  })
+}
+
+/**
+ * 修改参数组
+ * @param group_id
+ * @param params
+ * @returns {*}
+ */
+export function editParamsGroup(group_id, params) {
+  return request({
+    url: `admin/goods/parameter-groups/${group_id}`,
+    method: 'put',
+    data: params
+  })
+}
+
+/**
+ * 删除参数组
+ * @param group_id
+ * @returns {*}
+ */
+export function deleteParamsGroup(group_id) {
+  return request({
+    url: `admin/goods/parameter-groups/${group_id}`,
+    method: 'delete'
+  })
+}
+
+/**
+ * 参数组排序
+ * @param group_id
+ * @param sort_type
+ * @returns {*}
+ */
+export function sortParamsGroup(group_id, sort_type) {
+  return request({
+    url: `admin/goods/parameter-groups/${group_id}/sort`,
+    method: 'put',
+    data: { sort_type }
+  })
+}
+
+/**
+ * 获取参数组详情
+ * @param id
+ * @returns {*}
+ */
+export function getParamsGroupDetail(id) {
+  return request({
+    url: `admin/goods/parameter-groups/${id}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 添加参数
+ * @param params
+ * @returns {*}
+ */
+export function addParams(params) {
+  return request({
+    url: 'admin/goods/parameters',
+    method: 'post',
+    data: params
+  })
+}
+
+/**
+ * 编辑参数
+ * @param id
+ * @param params
+ * @returns {*}
+ */
+export function editParams(id, params) {
+  return request({
+    url: `admin/goods/parameters/${id}`,
+    method: 'put',
+    data: params
+  })
+}
+
+/**
+ * 删除参数
+ * @param id
+ * @returns {*}
+ */
+export function deleteParams(id) {
+  return request({
+    url: `admin/goods/parameters/${id}`,
+    method: 'delete'
+  })
+}
+
+/**
+ * 参数排序
+ * @param param_id
+ * @param sort_type
+ * @returns {*}
+ */
+export function sortParams(param_id, sort_type) {
+  return request({
+    url: `admin/goods/parameters/${param_id}/sort`,
+    method: 'put',
+    data: { sort_type }
+  })
+}
+
+/**
+ * 获取参数详情
+ * @param id
+ * @returns {*}
+ */
+export function getParamDetail(id) {
+  return request({
+    url: `admin/goods/parameters/${id}`,
+    method: 'get'
+  })
+}

+ 43 - 0
manager-admin/src/api/payment.js

@@ -0,0 +1,43 @@
+/**
+ * 支付方式相关API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取支付方式列表
+ * @param params
+ */
+export function getPaymentList(params) {
+  return request({
+    url: 'admin/payment/payment-methods',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 修改支付方式
+ * @param payment_plugin_id 支付方式code
+ * @param payment_method 支付方式详细配置
+ */
+export function editPayment(payment_plugin_id, payment_method) {
+  return request({
+    url: `admin/payment/payment-methods/${payment_plugin_id}`,
+    method: 'put',
+    headers: { 'Content-Type': 'application/json' },
+    data: { ...payment_method }
+  })
+}
+
+/**
+ * 获取支付方式详情
+ * @param payment_plugin_id
+ */
+export function getPaymentDetail(payment_plugin_id) {
+  return request({
+    url: `admin/payment/payment-methods/${payment_plugin_id}`,
+    method: 'get'
+  })
+}

+ 494 - 0
manager-admin/src/api/promotion.js

@@ -0,0 +1,494 @@
+/**
+ * 促销相关API
+ */
+
+import request from '@/utils/request'
+
+const MockBaseUrl = 'https://www.easy-mock.com/mock/5c3d888e4ac38336de5939b9/'
+
+/**
+ * 获取积分分类下级
+ * @param parent_id
+ */
+export function getExchangeCatsChildren(parent_id = 0) {
+  return request({
+    url: `admin/promotion/exchange-cats/${parent_id}/children`,
+    method: 'get'
+  })
+}
+
+/**
+ * 添加积分兑换分类
+ * @param params
+ */
+export function addExchangeCat(params) {
+  return request({
+    url: 'admin/promotion/exchange-cats',
+    method: 'post',
+    data: params
+  })
+}
+
+/**
+ * 获取积分兑换分类详情
+ * @param id
+ */
+export function getExchangeCatsDetail(id) {
+  return request({
+    url: `admin/promotion/exchange-cats/${id}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 编辑积分兑换分类
+ * @param id
+ * @param params
+ */
+export function editExhcangeCat(id, params) {
+  return request({
+    url: `admin/promotion/exchange-cats/${id}`,
+    method: 'put',
+    data: params
+  })
+}
+
+/**
+ * 删除积分兑换分类
+ * @param id
+ */
+export function deleteExchangeCat(id) {
+  return request({
+    url: `admin/promotion/exchange-cats/${id}`,
+    method: 'delete'
+  })
+}
+
+/**
+ * 获取积分商品列表
+ * @param params
+ */
+export function getExchangeGoods(params) {
+  return request({
+    url: 'admin/promotion/exchange-goods',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取团购活动列表
+ * @param params
+ */
+export function getGroupBuyActives(params) {
+  return request({
+    url: 'admin/promotion/group-buy-actives',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 添加团购活动
+ * @param params
+ */
+export function addGrouBuyActivity(params) {
+  return request({
+    url: 'admin/promotion/group-buy-actives',
+    method: 'post',
+    headers: { 'Content-Type': 'application/json' },
+    data: params
+  })
+}
+
+/**
+ * 获取团购活动商品列表
+ * @param params
+ */
+export function getGroupBuyGoods(params) {
+  return request({
+    url: `admin/promotion/group-buy-goods`,
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取团购商品详情
+ * @param gb_id
+ */
+export function getGroupBuyGoodsDetail(gb_id) {
+  return request({
+    url: `admin/promotion/group-buy-goods/${gb_id}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 编辑团购活动
+ * @param id
+ * @param params
+ */
+export function editGroupBuyActivity(id, params) {
+  return request({
+    url: `admin/promotion/group-buy-actives/${id}`,
+    method: 'put',
+    headers: { 'Content-Type': 'application/json' },
+    data: params
+  })
+}
+
+/**
+ * 删除团购活动
+ * @param id
+ */
+export function deleteGroupBuyActivity(id, delete_reason) {
+  return request({
+    url: `admin/promotion/group-buy-actives/${id}/delete`,
+    method: 'post',
+    data: { delete_reason }
+  })
+}
+
+/**
+ * 审核团购商品
+ * @param act_id
+ * @param params
+ */
+import qs from 'qs'
+export function batchReviewGroupBuyGoods(param) {
+  return request({
+    url: `admin/promotion/group-buy-actives/batch/audit`,
+    method: 'post',
+    data: param,
+    headers: {
+      'Content-Type': 'application/json'
+    }
+  })
+}
+
+/**
+ * 获取团购商品列表
+ * @param params
+ */
+export function getGroupBuyGoodsList(params) {
+  return request({
+    url: `admin/promotion/group-buy-goods`,
+    method: 'get'
+  })
+}
+
+/**
+ * 获取团购分类列表
+ * @param params
+ */
+export function getGroupBuyCategory(params) {
+  return request({
+    url: 'admin/promotion/group-buy-cats',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 添加团购分类
+ * @param params
+ */
+export function addGroupBuyCategory(params) {
+  return request({
+    url: 'admin/promotion/group-buy-cats',
+    method: 'post',
+    headers: { 'Content-Type': 'application/json' },
+    data: params
+  })
+}
+
+/**
+ * 获取团购详情
+ * @param id
+ */
+export function getGroupBuyCategoryDetail(id) {
+  return request({
+    url: `admin/promotion/group-buy-cats/${id}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 编辑团购分类
+ * @param id
+ * @param params
+ */
+export function editGroupBuyCategory(id, params) {
+  return request({
+    url: `admin/promotion/group-buy-cats/${id}`,
+    method: 'put',
+    headers: { 'Content-Type': 'application/json' },
+    data: params
+  })
+}
+
+/**
+ * 删除团购分类
+ * @param id
+ */
+export function deleteGroupBuyCategory(id) {
+  return request({
+    url: `admin/promotion/group-buy-cats/${id}`,
+    method: 'delete'
+  })
+}
+
+/**
+ * 获取限时抢购列表
+ * @param params
+ */
+export function getSeckillList(params) {
+  return request({
+    url: 'admin/promotion/seckills',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 增加限时抢购
+ * @param params
+ */
+export function addSeckill(params) {
+  return request({
+    url: 'admin/promotion/seckills',
+    method: 'post',
+    headers: { 'Content-Type': 'application/json' },
+    data: params
+  })
+}
+
+/**
+ * 获取限时抢购详情
+ * @param id
+ */
+export function getSeckillDetail(id) {
+  return request({
+    url: `admin/promotion/seckills/${id}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 修改限时抢购
+ * @param id
+ * @param params
+ */
+export function editSeckill(id, params) {
+  return request({
+    url: `admin/promotion/seckills/${id}`,
+    method: 'put',
+    headers: { 'Content-Type': 'application/json' },
+    data: params
+  })
+}
+
+/**
+ * 删除限时抢购
+ * @param id
+ */
+export function deleteSeckill(id) {
+  return request({
+    url: `admin/promotion/seckills/${id}`,
+    method: 'delete'
+  })
+}
+
+/**
+ * 发布限时抢购
+ * @param seckill_id
+ * @param params
+ */
+export function releaseSeckill(seckill_id, params) {
+  return request({
+    url: `admin/promotion/seckills/${seckill_id}/release`,
+    method: 'post',
+    headers: { 'Content-Type': 'application/json' },
+    data: params
+  })
+}
+
+/**
+ * 查看限时抢购商品
+ * @param params
+ */
+export function getSeckillGoods(params) {
+  return request({
+    url: `admin/promotion/seckill-applys`,
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 审核限时抢购商品
+ * @param apply_id
+ * @param status
+ * @param fail_reason
+ */
+export function batchReviewSckillGoods(param) {
+  return request({
+    url: 'admin/promotion/seckills/batch/audit',
+    method: 'post',
+    data: param,
+    headers: {
+      'Content-Type': 'application/json'
+    }
+  })
+}
+
+/**
+ * 获取拼团列表
+ */
+export function getAssembleList(params) {
+  return request({
+    url: 'admin/promotion/pintuan',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 关闭某个拼团活动
+ * @param id
+ */
+export function deleteAssemble(id) {
+  return request({
+    url: `admin/promotion/pintuan/${id}/close`,
+    method: 'put',
+    loading: false
+  })
+}
+
+/**
+ * 开启某个拼团活动
+ * @param id
+ */
+export function openAssemble(id) {
+  return request({
+    url: `admin/promotion/pintuan/${id}/open`,
+    method: 'put',
+    loading: false
+  })
+}
+
+/**
+ * 获取某个拼团活动信息的详情
+ * @param id
+ */
+export function getAssembleDetail(id) {
+  return request({
+    url: `admin/promotion/pintuan/${id}`,
+    method: 'get',
+    loading: false
+  })
+}
+
+/**
+ * 获取拼团商品列表
+ * @param id
+ */
+export function getAssembleGoodsList(id, params) {
+  return request({
+    url: `admin/promotion/pintuan/goods/${id}`,
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取优惠劵列表
+ * @param params
+ */
+export function getCouponsList(params) {
+  return request({
+    url: 'admin/promotion/coupons',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 添加优惠券
+ * @param params
+ */
+export function addCoupons(params) {
+  return request({
+    url: 'admin/promotion/coupons',
+    method: 'post',
+    params
+  })
+}
+
+/**
+ * 编辑优惠劵
+ * @param coupon_id
+ * @param params
+ */
+export function editCoupons(coupon_id, params) {
+  return request({
+    url: `admin/promotion/coupons/${coupon_id}`,
+    method: 'put',
+    params
+  })
+}
+
+/**
+ * 删除优惠劵
+ * @param id
+ */
+export function deleteCoupons(id) {
+  return request({
+    url: `admin/promotion/coupons/${id}`,
+    method: 'delete'
+  })
+}
+
+/**
+ * 查询优惠劵
+ * @param id
+ */
+export function queryCoupons(id) {
+  return request({
+    url: `admin/promotion/coupons/${id}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 查询某优惠券领取列表
+ * @param params
+ */
+export function queryReceiveCouponsList(params) {
+  return request({
+    url: 'admin/members/coupon',
+    method: 'get',
+    params
+  })
+}
+
+/**
+ * 查询某优惠券领取列表
+ * @param member_coupon_id
+ */
+export function nullifyCoupons(member_coupon_id) {
+  return request({
+    url: `/admin/members/coupon/${member_coupon_id}/cancel`,
+    method: 'put'
+  })
+}

+ 41 - 0
manager-admin/src/api/push.js

@@ -0,0 +1,41 @@
+/**
+ * Created by Andste on 2018/6/29.
+ * 推送相关API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取推送设置
+ */
+export function getPushSettings() {
+  return request({
+    url: 'admin/systems/push',
+    method: 'get'
+  })
+}
+
+/**
+ * 修改推送设置
+ * @param params
+ */
+export function editPushSettings(params) {
+  return request({
+    url: 'admin/systems/push',
+    method: 'put',
+    data: params
+  })
+}
+
+/**
+ * 商品推送
+ * @param title
+ * @param goods_ids
+ */
+export function pushGoods(title, goods_ids) {
+  return request({
+    url: `admin/systems/push/${goods_ids}`,
+    method: 'get',
+    params: { title }
+  })
+}

+ 64 - 0
manager-admin/src/api/receipt.js

@@ -0,0 +1,64 @@
+/**
+ * 发票相关API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取发票历史
+ * @param params
+ */
+export function getHistoryReceiptList(params) {
+  return request({
+    url: 'admin/members/receipts',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取历史发票详情
+ * @param history_id
+ */
+export function getHistoryReceiptDetail(history_id) {
+  return request({
+    url: `admin/members/receipts/${history_id}/`,
+    method: 'get'
+  })
+}
+
+/**
+ * 获取增票资质信息列表
+ * @param params
+ */
+export function getExamineReceiptList(params) {
+  return request({
+    url: 'admin/members/zpzz',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取增票信息详情
+ * @param params
+ */
+export function getExamineReceiptDetails(id) {
+  return request({
+    url: `admin/members/zpzz/${id}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 审核会员增票资质申请
+ * @param params
+ */
+export function applyExamineQualifications({ id, params }) {
+  return request({
+    url: `admin/members/zpzz/audit/${id}/${params.status}?remark=${params.remark}`,
+    method: 'post'
+  })
+}

+ 55 - 0
manager-admin/src/api/refund.js

@@ -0,0 +1,55 @@
+/**
+ * 退款单API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取退款单列表
+ * @param params
+ */
+export function getRefundList(params) {
+  return request({
+    url: 'admin/after-sales/refund',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取售后详情
+ * @param sn
+ */
+export function getRefundDetail(sn) {
+  return request({
+    url: `admin/after-sales/refund/${sn}`,
+    method: 'get',
+    loading: false
+  })
+}
+
+/**
+ * 平台退款
+ * @param sn
+ * @param params
+ */
+export function refundMoney(sn, params) {
+  return request({
+    url: `admin/after-sales/refunds/${sn}`,
+    method: 'post',
+    data: params
+  })
+}
+
+/**
+ * 导出Excel
+ * @param params
+ */
+export function exportRefundExcel(params) {
+  return request({
+    url: 'admin/after-sales/exports/excel',
+    method: 'get',
+    params
+  })
+}

+ 42 - 0
manager-admin/src/api/region.js

@@ -0,0 +1,42 @@
+/**
+ * 地区管理相关API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 添加地区
+ * @param params
+ */
+export function addRegion(params) {
+  return request({
+    url: 'admin/systems/regions',
+    method: 'post',
+    data: params
+  })
+}
+
+/**
+ * 编辑地区
+ * @param id
+ * @param params
+ */
+export function editRegion(id, params) {
+  return request({
+    url: `admin/systems/regions/${id}`,
+    method: 'put',
+    data: params
+  })
+}
+
+/**
+ * 删除地区
+ * @param id
+ */
+export function deleteRegion(id) {
+  return request({
+    url: `admin/systems/regions/${id}`,
+    method: 'delete'
+  })
+}
+

+ 146 - 0
manager-admin/src/api/search.js

@@ -0,0 +1,146 @@
+/**
+ * 搜索分词相关API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取自定义分词列表
+ * @param params
+ */
+export function getSearchKeywordsList(params) {
+  return request({
+    url: 'admin/goodssearch/custom-words',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 添加自定义分词
+ * @param params
+ */
+export function addSearchKeyword(params) {
+  return request({
+    url: 'admin/goodssearch/custom-words',
+    method: 'post',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 删除自定义分词
+ * @param id
+ */
+export function delSearchKeyword(id) {
+  return request({
+    url: `admin/goodssearch/custom-words/${id}`,
+    method: 'delete',
+    loading: false
+  })
+}
+
+/**
+ * 设置密钥
+ * @param params
+ */
+export function setSecretKey(params) {
+  return request({
+    url: 'admin/goodssearch/custom-words/secret-key',
+    method: 'put',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取密钥
+ */
+export function getSecretKey() {
+  return request({
+    url: 'admin/goodssearch/custom-words/secret-key',
+    method: 'get',
+    loading: false
+  })
+}
+
+/**
+ * 搜索关键词历史列表
+ * @param params
+ */
+export function getSearchHistoryList(params) {
+  return request({
+    url: 'admin/goodssearch/keywords',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取提示词列表
+ * @param params
+ */
+export function getTipsList(params) {
+  return request({
+    url: 'admin/goodssearch/goods-words',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 添加自定义提示词
+ * @param params
+ */
+export function addCustomTips(params) {
+  return request({
+    url: 'admin/goodssearch/goods-words',
+    method: 'post',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 删除自定义提示词
+ * @param id
+ */
+export function delCustomTips(id) {
+  return request({
+    url: `/admin/goodssearch/goods-words/${id}`,
+    method: 'delete',
+    loading: false
+  })
+}
+
+/**
+ * 修改自定义提示词
+ * @param id
+ * @param params
+ */
+export function modifyCustomTips(id, params) {
+  return request({
+    url: `admin/goodssearch/goods-words/${id}/words`,
+    method: 'put',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 修改自定义提示词排序
+ * @param id
+ * @param sort
+ */
+export function modifyCustomTipsSort(id, sort) {
+  return request({
+    url: `admin/goodssearch/goods-words/${id}/sort`,
+    method: 'put',
+    loading: false,
+    params: { sort }
+  })
+}

+ 41 - 0
manager-admin/src/api/sensitiveWords.js

@@ -0,0 +1,41 @@
+/**
+ * 敏感词相关API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取敏感词列表
+ * @param params
+ */
+export function getSensitiveWordsList(params) {
+  return request({
+    url: 'admin/sensitive-words',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 添加敏感词
+ * @param params
+ */
+export function addSensitiveWords(params) {
+  return request({
+    url: 'admin/sensitive-words',
+    method: 'POST',
+    data: params
+  })
+}
+
+/**
+ * 删除敏感词
+ * @param params
+ */
+export function deleSensitiveWords(id) {
+  return request({
+    url: `admin/sensitive-words/${id}`,
+    method: 'DELETE'
+  })
+}

+ 141 - 0
manager-admin/src/api/shop.js

@@ -0,0 +1,141 @@
+/**
+ * 店铺相关API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取店铺列表
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function getShopList(params) {
+  return request({
+    url: 'admin/shops',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取所有店铺
+ */
+export function getAllShopList() {
+  return request({
+    url: 'admin/shops/list',
+    method: 'get',
+    loading: false
+  })
+}
+
+/**
+ * 获取店铺详情
+ * @param shop_id
+ */
+export function getShopDetail(shop_id) {
+  return request({
+    url: `admin/shops/${shop_id}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 关闭店铺
+ * @param shop_id
+ */
+export function closeShop(shop_id) {
+  return request({
+    url: `admin/shops/disable/${shop_id}`,
+    method: 'put'
+  })
+}
+
+/**
+ * 恢复店铺
+ * @param shop_id
+ */
+export function recoverShop(shop_id) {
+  return request({
+    url: `admin/shops/enable/${shop_id}`,
+    method: 'put'
+  })
+}
+
+/**
+ * 修改审核店铺
+ * @param shop_id
+ * @param params
+ */
+export function editAuthShop(shop_id, params) {
+  return request({
+    url: `admin/shops/${shop_id}`,
+    method: 'put',
+    data: params
+  })
+}
+
+/**
+ * 获取店铺模板列表
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function getShopThemeList(params) {
+  return request({
+    url: 'admin/shops/themes',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 添加店铺模板
+ * @param params
+ * @returns {*}
+ */
+export function addShopTheme(params) {
+  return request({
+    url: 'admin/shops/themes',
+    method: 'post',
+    data: params
+  })
+}
+
+/**
+ * 获取店铺模板详情
+ * @param id
+ * @returns {Promise<any>}
+ */
+export function getShopThemeDetail(id) {
+  return request({
+    url: `admin/shops/themes/${id}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 修改店铺模板
+ * @param id
+ * @param params
+ * @returns {*}
+ */
+export function editShopTheme(id, params) {
+  return request({
+    url: `admin/shops/themes/${id}`,
+    method: 'put',
+    data: params
+  })
+}
+
+/**
+ * 删除店铺模板
+ * @param id
+ * @returns {*}
+ */
+export function deleteShopTheme(id) {
+  return request({
+    url: `admin/shops/themes/${id}`,
+    method: 'delete'
+  })
+}

+ 81 - 0
manager-admin/src/api/siteMenu.js

@@ -0,0 +1,81 @@
+/**
+ * 导航栏相关API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取导航菜单列表
+ * @param params
+ */
+export function getSiteMenuList(params) {
+  return request({
+    url: 'admin/pages/site-navigations',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 添加导航菜单
+ * @param client_type
+ * @param params
+ */
+export function addSiteMenu(client_type = 'PC', params) {
+  return request({
+    url: 'admin/pages/site-navigations',
+    method: 'post',
+    data: {
+      ...params,
+      client_type
+    }
+  })
+}
+
+/**
+ * 获取导航菜单详情
+ * @param id
+ */
+export function getSiteMenuDetail(id) {
+  return request({
+    url: `admin/pages/site-navigations/${id}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 修改导航菜单
+ * @param id
+ * @param parmas
+ */
+export function editSiteMenu(id, parmas) {
+  return request({
+    url: `admin/pages/site-navigations/${id}`,
+    method: 'put',
+    data: parmas
+  })
+}
+
+/**
+ * 删除导航菜单
+ * @param id
+ */
+export function deleteSiteMenu(id) {
+  return request({
+    url: `admin/pages/site-navigations/${id}`,
+    method: 'delete'
+  })
+}
+
+/**
+ * 导航排序
+ * @param id
+ * @param sort_type [up|down]
+ */
+export function sortSiteMenu(id, sort_type) {
+  return request({
+    url: `admin/pages/site-navigations/${id}/${sort_type}`,
+    method: 'put'
+  })
+}

+ 45 - 0
manager-admin/src/api/smsGateway.js

@@ -0,0 +1,45 @@
+/**
+ * 短信网关相关API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取短信网关列表
+ * @param params
+ */
+export function getSmsGatewayList(params) {
+  return request({
+    url: 'admin/systems/platforms',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 修改短信网关参数
+ * @param id 短信网关ID
+ * @param params 短信网关参数
+ * @returns {*}
+ */
+export function editSmsGateway(id, params) {
+  return request({
+    url: `admin/systems/platforms/${id}`,
+    method: 'put',
+    headers: { 'Content-Type': 'application/json' },
+    data: params
+  })
+}
+
+/**
+ * 开启短信网关
+ * @param bean
+ * @returns {*}
+ */
+export function openSmsGatewayById(bean) {
+  return request({
+    url: `admin/systems/platforms/${bean}/open`,
+    method: 'put'
+  })
+}

+ 79 - 0
manager-admin/src/api/smtp.js

@@ -0,0 +1,79 @@
+/**
+ * SMTP设置相关API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取smtp列表
+ * @param params
+ */
+export function getSmtpList(params) {
+  return request({
+    url: 'admin/systems/smtps',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 添加smtp
+ * @param params
+ */
+export function addSmtp(params) {
+  return request({
+    url: 'admin/systems/smtps',
+    method: 'post',
+    data: params
+  })
+}
+
+/**
+ * 修改smtp
+ * @param id
+ * @param params
+ */
+export function editSmtp(id, params) {
+  return request({
+    url: `admin/systems/smtps/${id}`,
+    method: 'put',
+    data: params
+  })
+}
+
+/**
+ * 删除smtp
+ * @param ids
+ */
+export function deleteSmtp(ids) {
+  if (Array.isArray(ids)) ids = ids.join(',')
+  return request({
+    url: `admin/systems/smtps/${ids}`,
+    method: 'delete'
+  })
+}
+
+/**
+ * 获取smtp详情
+ * @param id
+ */
+export function getSmtpDetial(id) {
+  return request({
+    url: `admin/systems/smtps/${id}`,
+    method: 'get'
+  })
+}
+
+/**
+ * 发送测试邮件
+ * @param params
+ */
+export function sendTestEmail(params) {
+  return request({
+    url: 'admin/systems/smtps/send',
+    timeout: 20000,
+    method: 'post',
+    data: params
+  })
+}

+ 82 - 0
manager-admin/src/api/spec.js

@@ -0,0 +1,82 @@
+/**
+ * 规格管理API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取规格列表
+ * @param params
+ */
+export function getSpecs(params) {
+  return request({
+    url: 'admin/goods/specs',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 添加规格
+ * @param params
+ */
+export function addSpec(params) {
+  return request({
+    url: 'admin/goods/specs',
+    method: 'post',
+    data: params
+  })
+}
+
+/**
+ * 编辑规格
+ * @param id
+ * @param params
+ */
+export function eidtSpec(id, params) {
+  return request({
+    url: `admin/goods/specs/${id}`,
+    method: 'put',
+    data: params
+  })
+}
+
+/**
+ * 删除规格
+ * @param ids
+ * @returns {*}
+ */
+export function deleteSpecs(ids) {
+  if (Array.isArray(ids)) ids = ids.join(',')
+  return request({
+    url: `admin/goods/specs/${ids}`,
+    method: 'delete'
+  })
+}
+
+/**
+ * 获取规格值
+ * @param spec_id 规格ID
+ * @returns {*}
+ */
+export function getSpecValues(spec_id) {
+  return request({
+    url: `admin/goods/specs/${spec_id}/values`,
+    method: 'get'
+  })
+}
+
+/**
+ * 保存规格值
+ * @param spec_id
+ * @param value_list
+ * @returns {Promise<any>}
+ */
+export function saveSpecValues(spec_id, value_list) {
+  return request({
+    url: `admin/goods/specs/${spec_id}/values`,
+    method: 'post',
+    data: { value_list }
+  })
+}

+ 39 - 0
manager-admin/src/api/staticPage.js

@@ -0,0 +1,39 @@
+/**
+ * 静态页相关API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取静态页生成地址
+ */
+export function getStaticPageAddress() {
+  return request({
+    url: 'admin/page-create/input',
+    method: 'get'
+  })
+}
+
+/**
+ * 保存静态页生成地址
+ * @param params
+ */
+export function saveStaticPageAddress(params) {
+  return request({
+    url: 'admin/page-create/save',
+    method: 'post',
+    data: params
+  })
+}
+
+/**
+ * 生成静态页
+ * @param params
+ */
+export function createStaticPage(params) {
+  return request({
+    url: `admin/page-create/create`,
+    method: 'post',
+    data: params
+  })
+}

+ 483 - 0
manager-admin/src/api/statistics.js

@@ -0,0 +1,483 @@
+/**
+ * 统计相关API
+ */
+
+import request from '@/utils/request'
+
+/** 会员分析 */
+
+/**
+ * 获取会员下单量
+ * @param params
+ */
+export function getMemberOrderNum(params) {
+  return request({
+    url: 'admin/statistics/member/order/quantity',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取会员下单量表格数据
+ * @param params
+ */
+export function getMemberOrderNumPage(params) {
+  return request({
+    url: 'admin/statistics/member/order/quantity/page',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取会员下单商品数
+ * @param params
+ */
+export function getMemberGoodsNum(params) {
+  return request({
+    url: 'admin/statistics/member/order/goods/num',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取会员下单商品数表格数据
+ * @param params
+ */
+export function getMemberGoodsNumPage(params) {
+  return request({
+    url: 'admin/statistics/member/order/goods/num/page',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取会员下单金额
+ * @param params
+ */
+export function getMemberPrice(params) {
+  return request({
+    url: 'admin/statistics/member/order/money',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取会员下单金额表格数据
+ * @param params
+ */
+export function getMemberPricePage(params) {
+  return request({
+    url: 'admin/statistics/member/order/money/page',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 新增会员统计
+ * @param params
+ */
+export function addedMember(params) {
+  return request({
+    url: 'admin/statistics/member/increase/member',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 新增会员统计表格
+ * @param params
+ */
+export function addedMemberPage(params) {
+  return request({
+    url: 'admin/statistics/member/increase/member/page',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/** 商品统计 */
+
+/**
+ * 价格销量
+ * @param params
+ */
+export function getPriceSales(params) {
+  return request({
+    url: 'admin/statistics/goods/price/sales',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取热卖商品下单金额
+ * @param params
+ */
+export function getHotGoodsPrice(params) {
+  return request({
+    url: 'admin/statistics/goods/hot/money',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取热卖商品下单金额表格数据
+ * @param params
+ */
+export function getHotGoodsPricePage(params) {
+  return request({
+    url: 'admin/statistics/goods/hot/money/page',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取热卖商品下单量
+ * @param params
+ */
+export function getHotGoodsNum(params) {
+  return request({
+    url: 'admin/statistics/goods/hot/num',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取热卖商品下单量表格数据
+ * @param params
+ */
+export function getHotGoodsNumPage(params) {
+  return request({
+    url: 'admin/statistics/goods/hot/num/page',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取收藏排行
+ * @param params
+ */
+export function getGoodsCollectTop(params) {
+  return request({
+    url: 'admin/statistics/goods/collect',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取收藏排行表格数据
+ * @param params
+ */
+export function getGoodsCollectTopPage(params) {
+  return request({
+    url: 'admin/statistics/goods/collect/page',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/** 行业分析 */
+
+/**
+ * 获取行业规模下单量
+ * @param params
+ */
+export function getIndustryScaleOrder(params) {
+  return request({
+    url: 'admin/statistics/industry/order/quantity',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取行业规模下单商品数量
+ * @param params
+ */
+export function getIndustryScaleGoods(params) {
+  return request({
+    url: 'admin/statistics/industry/goods/num',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取行业规模下单金额
+ * @param params
+ */
+export function getIndustryScalePrice(params) {
+  return request({
+    url: 'admin/statistics/industry/order/money',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取概括总览数据
+ * @param params
+ */
+export function getGeneralityOverviewData(params) {
+  return request({
+    url: 'admin/statistics/industry/overview',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/** 流量分析 */
+/**
+ * 获取店铺流量数据
+ * @param params
+ */
+export function getTrafficAnalysisShop(params) {
+  return request({
+    url: 'admin/statistics/page_view/shop',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取商品流量数据
+ * @param params
+ */
+export function getTrafficAnalysisGoods(params) {
+  return request({
+    url: 'admin/statistics/page_view/goods',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/** 其它统计 */
+
+/**
+ * 订单统计 - 下单金额
+ * @param params
+ */
+export function getOrderStatisticsPrice(params) {
+  return request({
+    url: 'admin/statistics/order/order/money',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 订单统计 - 下单量
+ * @param params
+ */
+export function getOrderStatisticsOrder(params) {
+  return request({
+    url: 'admin/statistics/order/order/num',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 订单统计 - 下单量表格数据
+ * @param params
+ * @returns {Promise<any>}
+ */
+export function getOrderStatisticsPage(params) {
+  return request({
+    url: 'admin/statistics/order/order/page',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取销售收入统计表格数据
+ * @param params
+ */
+export function getSalesRevenueStatisticsPage(params) {
+  return request({
+    url: 'admin/statistics/order/sales/money',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取销售收入总览
+ * @param params
+ */
+export function getSalesRevenueStatisticsTotal(params) {
+  return request({
+    url: 'admin/statistics/order/sales/total',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取退单记录
+ * @param params
+ */
+export function getSalesAftersaleStatistics(params) {
+  return request({
+    url: 'admin/statistics/order/aftersales/money',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取区域分析表格
+ * @param params
+ */
+export function getRegionalAnalysisTable(params) {
+  return request({
+    url: 'admin/statistics/order/region/form',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取区域分析下单会员数
+ * @param params
+ */
+export function getRegionalAnalysisMember(params) {
+  return request({
+    url: 'admin/statistics/order/region/member',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取区域分析下单金额
+ * @param params
+ */
+export function getRegionalAnalysisPrice(params) {
+  return request({
+    url: 'admin/statistics/order/region/money',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取区域分析下单量
+ * @param params
+ */
+export function getRegionalAnalysisNum(params) {
+  return request({
+    url: 'admin/statistics/order/region/num',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取客单价分布
+ * @param params
+ */
+export function getOrderPriceDistribution(params) {
+  return request({
+    url: 'admin/statistics/order/unit/price',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取购买时段分布
+ * @param params
+ */
+export function getBuyTimeDistribution(params) {
+  return request({
+    url: 'admin/statistics/order/unit/time',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取购买频次数据
+ * @param params
+ */
+export function getBuyFrequency(params) {
+  return request({
+    url: 'admin/statistics/order/unit/num',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 获取退款统计
+ * @param params
+ */
+export function getRefundStatistics(params) {
+  return request({
+    url: 'admin/statistics/order/return/money',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 商品销售明细
+ * @param params
+ */
+export function getGoodsSaleDetail(params) {
+  return request({
+    url: 'admin/statistics/goods/sale/details',
+    method: 'get',
+    loading: false,
+    params
+  })
+}

+ 56 - 0
manager-admin/src/api/storageSolution.js

@@ -0,0 +1,56 @@
+/**
+ * 储存方案相关API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取储存方案列表
+ * @param params
+ */
+export function getStorageSolutionList(params) {
+  return request({
+    url: 'admin/systems/uploaders',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 编辑储存方案
+ * @param bean
+ * @param params
+ */
+export function editStorageSolution(bean, params) {
+  return request({
+    url: `admin/systems/uploaders/${bean}`,
+    method: 'put',
+    headers: { 'Content-Type': 'application/json' },
+    data: params
+  })
+}
+
+/**
+ * 获取储存方案配置项
+ * @param code
+ * @returns {*}
+ */
+export function getStorageSolutionConfig(code) {
+  return request({
+    url: `admin/systems/uploaders/${code}/setting`,
+    method: 'get'
+  })
+}
+
+/**
+ * 开启储存方案
+ * @param bean
+ * @returns {*}
+ */
+export function openStorageSolutionById(bean) {
+  return request({
+    url: `admin/systems/uploaders/${bean}/open`,
+    method: 'put'
+  })
+}

+ 50 - 0
manager-admin/src/api/systemSetting.js

@@ -0,0 +1,50 @@
+/**
+ * 系统设置
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取站点设置
+ */
+export function getSiteSetting() {
+  return request({
+    url: 'admin/settings/site',
+    method: 'get',
+    loading: false
+  })
+}
+
+/**
+ * 修改站点设置
+ * @param params
+ */
+export function editSiteSetting(params) {
+  return request({
+    url: 'admin/settings/site',
+    method: 'put',
+    data: params
+  })
+}
+
+/**
+ * 获取积分设置
+ */
+export function getPointSetting() {
+  return request({
+    url: 'admin/settings/point',
+    method: 'get'
+  })
+}
+
+/**
+ * 修改积分设置
+ * @param params
+ */
+export function editPointSetting(params) {
+  return request({
+    url: 'admin/settings/point',
+    method: 'put',
+    data: params
+  })
+}

+ 41 - 0
manager-admin/src/api/task.js

@@ -0,0 +1,41 @@
+/**
+ * 进度相关API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 查看是否有任务正在进行
+ * @param task_id
+ */
+export function hasTask(task_id) {
+  return request({
+    url: `admin/task/${task_id}`,
+    method: 'get',
+    message: false,
+    loading: false
+  })
+}
+
+/**
+ * 获取进度条
+ * @param task_id
+ */
+export function getProgressById(task_id) {
+  return request({
+    url: `admin/task/${task_id}/progress`,
+    method: 'get',
+    loading: false
+  })
+}
+
+/**
+ * 清除任务
+ * @param task_id
+ */
+export function clearTask(task_id) {
+  return request({
+    url: `admin/task/${task_id}`,
+    method: 'delete'
+  })
+}

+ 43 - 0
manager-admin/src/api/validatorPlatform.js

@@ -0,0 +1,43 @@
+/**
+ * 验证平台相关API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 获取验证平台列表
+ * @param params
+ */
+export function getValidatorPlatformList(params) {
+  return request({
+    url: 'admin/systems/validator',
+    method: 'get',
+    loading: false,
+    params
+  })
+}
+
+/**
+ * 修改验证平台参数
+ * @param pluginId
+ * @param params
+ */
+export function editValidatorPlatform(pluginId, params) {
+  return request({
+    url: `admin/systems/validator/${pluginId}`,
+    method: 'put',
+    headers: { 'Content-Type': 'application/json' },
+    data: params
+  })
+}
+
+/**
+ * 开启验证平台
+ * @param pluginId
+ */
+export function openValidatorPlatformById(pluginId) {
+  return request({
+    url: `admin/systems/validator/${pluginId}/open`,
+    method: 'put'
+  })
+}

二進制
manager-admin/src/assets/401_images/401.gif


二進制
manager-admin/src/assets/404_images/404.png


二進制
manager-admin/src/assets/404_images/404_cloud.png


二進制
manager-admin/src/assets/custom-theme/fonts/element-icons.ttf


二進制
manager-admin/src/assets/custom-theme/fonts/element-icons.woff


文件差異過大導致無法顯示
+ 1 - 0
manager-admin/src/assets/custom-theme/index.css


文件差異過大導致無法顯示
+ 1 - 0
manager-admin/src/assets/echart-map-china.json


+ 199 - 0
manager-admin/src/assets/echarts-macarons.js

@@ -0,0 +1,199 @@
+/* eslint-disable */
+(function (root, factory) {
+    if (typeof define === 'function' && define.amd) {
+        // AMD. Register as an anonymous module.
+        define(['exports', 'echarts'], factory);
+    } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
+        // CommonJS
+        factory(exports, require('echarts'));
+    } else {
+        // Browser globals
+        factory({}, root.echarts);
+    }
+}(this, function (exports, echarts) {
+    var log = function (msg) {
+        if (typeof console !== 'undefined') {
+            console && console.error && console.error(msg);
+        }
+    };
+    if (!echarts) {
+        log('ECharts is not Loaded');
+        return;
+    }
+
+    var colorPalette = [
+        '#2ec7c9','#b6a2de','#5ab1ef','#ffb980','#d87a80',
+        '#8d98b3','#e5cf0d','#97b552','#95706d','#dc69aa',
+        '#07a2a4','#9a7fd1','#588dd5','#f5994e','#c05050',
+        '#59678c','#c9ab00','#7eb00a','#6f5553','#c14089'
+    ];
+
+
+    var theme = {
+        color: colorPalette,
+
+        title: {
+            textStyle: {
+                fontWeight: 'normal',
+                color: '#008acd'
+            }
+        },
+
+        visualMap: {
+            itemWidth: 15,
+            color: ['#5ab1ef','#e0ffff']
+        },
+
+        toolbox: {
+            iconStyle: {
+                normal: {
+                    borderColor: colorPalette[0]
+                }
+            }
+        },
+
+        tooltip: {
+            backgroundColor: 'rgba(50,50,50,0.5)',
+            axisPointer : {
+                type : 'line',
+                lineStyle : {
+                    color: '#008acd'
+                },
+                crossStyle: {
+                    color: '#008acd'
+                },
+                shadowStyle : {
+                    color: 'rgba(200,200,200,0.2)'
+                }
+            }
+        },
+
+        dataZoom: {
+            dataBackgroundColor: '#efefff',
+            fillerColor: 'rgba(182,162,222,0.2)',
+            handleColor: '#008acd'
+        },
+
+        grid: {
+            borderColor: '#eee'
+        },
+
+        categoryAxis: {
+            axisLine: {
+                lineStyle: {
+                    color: '#008acd'
+                }
+            },
+            splitLine: {
+                lineStyle: {
+                    color: ['#eee']
+                }
+            }
+        },
+
+        valueAxis: {
+            axisLine: {
+                lineStyle: {
+                    color: '#008acd'
+                }
+            },
+            splitArea : {
+                show : true,
+                areaStyle : {
+                    color: ['rgba(250,250,250,0.1)','rgba(200,200,200,0.1)']
+                }
+            },
+            splitLine: {
+                lineStyle: {
+                    color: ['#eee']
+                }
+            }
+        },
+
+        timeline : {
+            lineStyle : {
+                color : '#008acd'
+            },
+            controlStyle : {
+                normal : { color : '#008acd'},
+                emphasis : { color : '#008acd'}
+            },
+            symbol : 'emptyCircle',
+            symbolSize : 3
+        },
+
+        line: {
+            smooth : true,
+            symbol: 'emptyCircle',
+            symbolSize: 3
+        },
+
+        candlestick: {
+            itemStyle: {
+                normal: {
+                    color: '#d87a80',
+                    color0: '#2ec7c9',
+                    lineStyle: {
+                        color: '#d87a80',
+                        color0: '#2ec7c9'
+                    }
+                }
+            }
+        },
+
+        scatter: {
+            symbol: 'circle',
+            symbolSize: 4
+        },
+
+        map: {
+            label: {
+                normal: {
+                    textStyle: {
+                        color: '#d87a80'
+                    }
+                }
+            },
+            itemStyle: {
+                normal: {
+                    borderColor: '#eee',
+                    areaColor: '#ddd'
+                },
+                emphasis: {
+                    areaColor: '#fe994e'
+                }
+            }
+        },
+
+        graph: {
+            color: colorPalette
+        },
+
+        gauge : {
+            axisLine: {
+                lineStyle: {
+                    color: [[0.2, '#2ec7c9'],[0.8, '#5ab1ef'],[1, '#d87a80']],
+                    width: 10
+                }
+            },
+            axisTick: {
+                splitNumber: 10,
+                length :15,
+                lineStyle: {
+                    color: 'auto'
+                }
+            },
+            splitLine: {
+                length :22,
+                lineStyle: {
+                    color: 'auto'
+                }
+            },
+            pointer : {
+                width : 5
+            }
+        }
+    };
+
+    echarts.registerTheme('macarons', theme);
+}));

二進制
manager-admin/src/assets/icon-repair.png


二進制
manager-admin/src/assets/icons-mobile-template.png


二進制
manager-admin/src/assets/logo_images/logo-javashop-rectangle-dark.png


二進制
manager-admin/src/assets/logo_images/logo-javashop-rectangle-light.png


二進制
manager-admin/src/assets/logo_images/logo-javashop-square.png


二進制
manager-admin/src/assets/logo_images/logo-javashop-white.png


+ 110 - 0
manager-admin/src/assets/particlesjs-config.json

@@ -0,0 +1,110 @@
+{
+  "particles": {
+    "number": {
+      "value": 160,
+      "density": {
+        "enable": true,
+        "value_area": 800
+      }
+    },
+    "color": {
+      "value": "#409eff"
+    },
+    "shape": {
+      "type": "circle",
+      "stroke": {
+        "width": 0,
+        "color": "#000000"
+      },
+      "polygon": {
+        "nb_sides": 5
+      },
+      "image": {
+        "src": "img/github.svg",
+        "width": 100,
+        "height": 100
+      }
+    },
+    "opacity": {
+      "value": 1,
+      "random": true,
+      "anim": {
+        "enable": true,
+        "speed": 1,
+        "opacity_min": 0,
+        "sync": false
+      }
+    },
+    "size": {
+      "value": 3,
+      "random": true,
+      "anim": {
+        "enable": false,
+        "speed": 4,
+        "size_min": 0.3,
+        "sync": false
+      }
+    },
+    "line_linked": {
+      "enable": true,
+      "distance": 110.48066982851817,
+      "color": "#409eff",
+      "opacity": 0.1815039575754227,
+      "width": 0
+    },
+    "move": {
+      "enable": true,
+      "speed": 1,
+      "direction": "none",
+      "random": true,
+      "straight": false,
+      "out_mode": "bounce",
+      "bounce": false,
+      "attract": {
+        "enable": false,
+        "rotateX": 600,
+        "rotateY": 600
+      }
+    }
+  },
+  "interactivity": {
+    "detect_on": "canvas",
+    "events": {
+      "onhover": {
+        "enable": false,
+        "mode": "grab"
+      },
+      "onclick": {
+        "enable": true,
+        "mode": "push"
+      },
+      "resize": true
+    },
+    "modes": {
+      "grab": {
+        "distance": 60.90579092260088,
+        "line_linked": {
+          "opacity": 1
+        }
+      },
+      "bubble": {
+        "distance": 133.99274002972194,
+        "size": 0,
+        "duration": 2,
+        "opacity": 0,
+        "speed": 3
+      },
+      "repulse": {
+        "distance": 400,
+        "duration": 0.4
+      },
+      "push": {
+        "particles_nb": 4
+      },
+      "remove": {
+        "particles_nb": 2
+      }
+    }
+  },
+  "retina_detect": true
+}

二進制
manager-admin/src/assets/pc-tpl-01.png


二進制
manager-admin/src/assets/pc-tpl-02.png


二進制
manager-admin/src/assets/pc-tpl-03.png


二進制
manager-admin/src/assets/pc-tpl-04.png


+ 73 - 0
manager-admin/src/components/AliyunAfs.js

@@ -0,0 +1,73 @@
+function loadJs(url, callback) {
+  return new Promise((resolve, reject) => {
+    const script = document.createElement('script')
+    script.async = true
+    script.addEventListener('load', () => {
+      callback()
+    })
+    script.addEventListener('error', () => {
+      reject(new Error(`Error loading ${url}`))
+    })
+    script.src = url
+    document.head.appendChild(script)
+  })
+}
+
+export default function(id, scene, appkey, callback) {
+  return {
+    nc: null,
+    init() {
+      var self = this
+
+      function call() {
+        self.show()
+      }
+
+      loadJs('//g.alicdn.com/sd/ncpc/nc.js', call)
+    },
+
+    show() {
+      let nc_token = ['CF_APP_1', (new Date()).getTime(), Math.random()].join(':')
+
+      let NC_Opt = {
+        // 声明滑动验证需要渲染的目标元素ID。
+        renderTo: id,
+        // 应用类型标识。它和使用场景标识(scene字段)一起决定了滑动验证的业务场景与后端对应使用的策略模型。您可以在人机验证控制台的配置管理页签找到对应的appkey字段值,请务必正确填写。
+        appkey: appkey,
+        // 使用场景标识。它和应用类型标识(appkey字段)一起决定了滑动验证的业务场景与后端对应使用的策略模型。您可以在人机验证控制台的配置管理页签找到对应的scene值,请务必正确填写。
+        scene: scene,
+        // 滑动验证码的主键,请勿将该字段定义为固定值。确保每个用户每次打开页面时,其token值都是不同的。系统默认的格式为:”您的appkey”+”时间戳”+”随机数”。
+        token: nc_token,
+        // 滑动条的宽度。
+        customWidth: '100%',
+        // 业务键字段,可为空。为便于线上问题的排查,建议您按照线上问题定位文档中推荐的方法配置该字段值。
+        trans: {},
+        // 语言。PC端Web页面场景默认支持18国语言,详细配置方法请参见自定义文案与多语言文档。
+        language: 'cn',
+        // 是否启用。一般情况,保持默认值(true)即可。
+        isEnabled: true,
+        // 内部网络请求的超时时间。一般情况建议保持默认值(3000ms)。
+        timeout: 3000,
+        // 允许服务器超时重复次数,默认5次。超过重复次数后将触发报错。
+        times: 5,
+        // 前端滑动验证通过时会触发该回调参数。您可以在该回调参数中将请求标识(token)、会话ID(sessionid)、签名串(sig)字段记录下来,随业务请求一同发送至您的服务端调用验签。
+        callback: function(data) {
+          data.nc_token = nc_token
+          callback(data)
+        }
+      }
+      this.nc = new noCaptcha(NC_Opt) // eslint-disable-line
+      // 用于自定义文案。详细配置方法请参见自定义文案与多语言文档。
+      this.nc.upLang('cn', {
+        _startTEXT: '请按住滑块,拖动到最右边',
+        _yesTEXT: '验证通过',
+        _error300: '哎呀,出错了,点击<a href=\"javascript:__nc.reset()\">刷新</a>再来一次',
+        _errorNetwork: '网络不给力,请<a href=\"javascript:__nc.reset()\">点击刷新</a>'
+      })
+    },
+
+    reload() {
+      this.nc.reload()
+    }
+  }
+}

+ 110 - 0
manager-admin/src/components/BackToTop/index.vue

@@ -0,0 +1,110 @@
+<template>
+  <transition :name="transitionName">
+    <div class="back-to-ceiling" @click="backToTop" v-show="visible" :style="customStyle">
+      <svg width="16" height="16" viewBox="0 0 17 17" xmlns="http://www.w3.org/2000/svg" class="Icon Icon--backToTopArrow" aria-hidden="true" style="height: 16px; width: 16px;">
+        <title>回到顶部</title>
+        <g>
+          <path d="M12.036 15.59c0 .55-.453.995-.997.995H5.032c-.55 0-.997-.445-.997-.996V8.584H1.03c-1.1 0-1.36-.633-.578-1.416L7.33.29c.39-.39 1.026-.385 1.412 0l6.878 6.88c.782.78.523 1.415-.58 1.415h-3.004v7.004z" fill-rule="evenodd"></path>
+        </g>
+      </svg>
+    </div>
+  </transition>
+</template>
+
+<script>
+export default {
+  name: 'BackToTop',
+  props: {
+    visibilityHeight: {
+      type: Number,
+      default: 400
+    },
+    backPosition: {
+      type: Number,
+      default: 0
+    },
+    customStyle: {
+      type: Object,
+      default: {
+        right: '50px',
+        bottom: '50px',
+        width: '40px',
+        height: '40px',
+        'border-radius': '4px',
+        'line-height': '45px',
+        background: '#e7eaf1'
+      }
+    },
+    transitionName: {
+      type: String,
+      default: 'fade'
+    }
+  },
+  data() {
+    return {
+      visible: false,
+      interval: null
+    }
+  },
+  mounted() {
+    window.addEventListener('scroll', this.handleScroll)
+  },
+  beforeDestroy() {
+    window.removeEventListener('scroll', this.handleScroll)
+    if (this.interval) {
+      clearInterval(this.interval)
+    }
+  },
+  methods: {
+    handleScroll() {
+      this.visible = window.pageYOffset > this.visibilityHeight
+    },
+    backToTop() {
+      const start = window.pageYOffset
+      let i = 0
+      this.interval = setInterval(() => {
+        const next = Math.floor(this.easeInOutQuad(10 * i, start, -start, 500))
+        if (next <= this.backPosition) {
+          window.scrollTo(0, this.backPosition)
+          clearInterval(this.interval)
+        } else {
+          window.scrollTo(0, next)
+        }
+        i++
+      }, 16.7)
+    },
+    easeInOutQuad(t, b, c, d) {
+      if ((t /= d / 2) < 1) return c / 2 * t * t + b
+      return -c / 2 * (--t * (t - 2) - 1) + b
+    }
+  }
+}
+</script>
+
+<style scoped>
+  .back-to-ceiling {
+    position: fixed;
+    display: inline-block;
+    text-align: center;
+    cursor: pointer;
+  }
+
+  .back-to-ceiling:hover {
+    background: #d5dbe7;
+  }
+
+  .fade-enter-active,
+  .fade-leave-active {
+    transition: opacity .5s;
+  }
+
+  .fade-enter,
+  .fade-leave-to {
+    opacity: 0
+  }
+
+  .back-to-ceiling .Icon {
+    fill: #9aaabf;
+    background: none;
+  }
+</style>

+ 12 - 0
manager-admin/src/components/BrandPicker/index.js

@@ -0,0 +1,12 @@
+/**
+ * 品牌选择组件
+ * 返回brand_id
+ */
+import Vue from 'vue'
+import BrandPicker from './src/main'
+
+BrandPicker.install = () => {
+  Vue.component(BrandPicker.name, BrandPicker)
+}
+
+export default BrandPicker

+ 46 - 0
manager-admin/src/components/BrandPicker/src/main.vue

@@ -0,0 +1,46 @@
+<template>
+  <div style="display: inline-block">
+    <el-select
+      v-model="brand_id"
+      placeholder="选择品牌"
+      @change="handleBrandChanged"
+      style="width: 150px"
+      filterable
+      clearable
+      v-bind="$attrs"
+    >
+      <el-option
+        v-for="item in brandList"
+        :key="item.brand_id"
+        :label="item.name"
+        :value="item.brand_id"/>
+    </el-select>
+  </div>
+</template>
+
+<script>
+  import * as API_brand from '@/api/brand'
+
+  export default {
+    name: 'EnBrandPicker',
+    data() {
+      return {
+        brand_id: '',
+        brandList: []
+      }
+    },
+    created() {
+      API_brand.getAllBrandList().then(response => (this.brandList = response))
+    },
+    methods: {
+      handleBrandChanged() {
+        const brand = this.brandList.filter(item => item.brand_id === this.brand_id)
+        this.$emit('changed', brand[0] || { brand_id: 0, name: '全部' })
+      }
+    }
+  }
+</script>
+
+<style type="text/scss" lang="scss" scoped>
+
+</style>

+ 0 - 0
manager-admin/src/components/Breadcrumb/index.vue


部分文件因文件數量過多而無法顯示