commit 77b4e8ad22006a84cfdef1f4de22fb395df8c631
Author: zhangshengli <18103773227@163.com>
Date: Wed Jul 24 16:14:33 2024 +0800
框架代码初始化1
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..13566b8
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..0548357
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..6bebd37
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/yshi.iml b/.idea/yshi.iml
new file mode 100644
index 0000000..d6ebd48
--- /dev/null
+++ b/.idea/yshi.iml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/fuintAdmin/.editorconfig b/fuintAdmin/.editorconfig
new file mode 100644
index 0000000..7034f9b
--- /dev/null
+++ b/fuintAdmin/.editorconfig
@@ -0,0 +1,22 @@
+# 告诉EditorConfig插件,这是根文件,不用继续往上查找
+root = true
+
+# 匹配全部文件
+[*]
+# 设置字符集
+charset = utf-8
+# 缩进风格,可选space、tab
+indent_style = space
+# 缩进的空格数
+indent_size = 2
+# 结尾换行符,可选lf、cr、crlf
+end_of_line = lf
+# 在文件结尾插入新行
+insert_final_newline = true
+# 删除一行中的前后空格
+trim_trailing_whitespace = true
+
+# 匹配md结尾的文件
+[*.md]
+insert_final_newline = false
+trim_trailing_whitespace = false
diff --git a/fuintAdmin/.env.development b/fuintAdmin/.env.development
new file mode 100644
index 0000000..86f1c7a
--- /dev/null
+++ b/fuintAdmin/.env.development
@@ -0,0 +1,14 @@
+# 页面标题
+VUE_APP_TITLE = 会员演示营销管理系统
+
+# 开发环境配置
+ENV = 'development'
+
+# 会员演示营销系统/开发环境
+VUE_APP_BASE_API = '/dev-api'
+
+# 发布目录
+VUE_APP_PUBLIC_PATH = '/'
+
+# 后端接口地址
+VUE_APP_SERVER_URL = 'http://localhost:8080/'
diff --git a/fuintAdmin/.env.production b/fuintAdmin/.env.production
new file mode 100644
index 0000000..360fe88
--- /dev/null
+++ b/fuintAdmin/.env.production
@@ -0,0 +1,14 @@
+# 页面标题
+VUE_APP_TITLE = 会员演示营销管理系统
+
+# 生产环境配置
+ENV = 'production'
+
+# 会员演示营销系统/生产环境
+VUE_APP_BASE_API = '/fuint-application/'
+
+# 发布目录
+VUE_APP_PUBLIC_PATH = '/fuintAdmin/'
+
+# 后端接口地址
+VUE_APP_SERVER_URL = 'https://www.baidu.com/fuint-application/'
diff --git a/fuintAdmin/.env.staging b/fuintAdmin/.env.staging
new file mode 100644
index 0000000..0818993
--- /dev/null
+++ b/fuintAdmin/.env.staging
@@ -0,0 +1,14 @@
+# 页面标题
+VUE_APP_TITLE = 会员演示营销管理系统
+
+# 测试环境配置
+ENV = 'staging'
+
+# 会员演示营销系统/测试环境
+VUE_APP_BASE_API = '/stage-api'
+
+# 发布目录
+VUE_APP_PUBLIC_PATH = '/'
+
+# 后端接口地址
+VUE_APP_SERVER_URL = 'http://localhost:8082/stage-api/'
diff --git a/fuintAdmin/.eslintignore b/fuintAdmin/.eslintignore
new file mode 100644
index 0000000..89be6f6
--- /dev/null
+++ b/fuintAdmin/.eslintignore
@@ -0,0 +1,10 @@
+# 忽略build目录下类型为js的文件的语法检查
+build/*.js
+# 忽略src/assets目录下文件的语法检查
+src/assets
+# 忽略public目录下文件的语法检查
+public
+# 忽略当前目录下为js的文件的语法检查
+*.js
+# 忽略当前目录下为vue的文件的语法检查
+*.vue
\ No newline at end of file
diff --git a/fuintAdmin/.eslintrc.js b/fuintAdmin/.eslintrc.js
new file mode 100644
index 0000000..82bbdee
--- /dev/null
+++ b/fuintAdmin/.eslintrc.js
@@ -0,0 +1,199 @@
+// ESlint 检查配置
+module.exports = {
+ root: true,
+ parserOptions: {
+ parser: 'babel-eslint',
+ sourceType: 'module'
+ },
+ env: {
+ browser: true,
+ node: true,
+ es6: true,
+ },
+ extends: ['plugin:vue/recommended', 'eslint:recommended'],
+
+ // add your custom rules here
+ //it is base on https://github.com/vuejs/eslint-config-vue
+ rules: {
+ "vue/max-attributes-per-line": [2, {
+ "singleline": 10,
+ "multiline": {
+ "max": 1,
+ "allowFirstLine": false
+ }
+ }],
+ "vue/singleline-html-element-content-newline": "off",
+ "vue/multiline-html-element-content-newline":"off",
+ "vue/name-property-casing": ["error", "PascalCase"],
+ "vue/no-v-html": "off",
+ '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': ["error", "always", {"null": "ignore"}],
+ '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': 2,
+ 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
+ 'object-curly-spacing': [2, 'always', {
+ objectsInObjects: false
+ }],
+ 'array-bracket-spacing': [2, 'never']
+ }
+}
diff --git a/fuintAdmin/.gitignore b/fuintAdmin/.gitignore
new file mode 100644
index 0000000..78a752d
--- /dev/null
+++ b/fuintAdmin/.gitignore
@@ -0,0 +1,23 @@
+.DS_Store
+node_modules/
+dist/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+**/*.log
+
+tests/**/coverage/
+tests/e2e/reports
+selenium-debug.log
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.local
+
+package-lock.json
+yarn.lock
diff --git a/fuintAdmin/README.md b/fuintAdmin/README.md
new file mode 100644
index 0000000..9935fdd
--- /dev/null
+++ b/fuintAdmin/README.md
@@ -0,0 +1,28 @@
+## 开发
+
+```bash
+
+# 进入项目目录
+cd fuintAdmin
+
+# 安装依赖
+npm install
+
+# 建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题
+npm install --registry=https://registry.npmmirror.com
+
+# 启动服务
+npm run dev
+```
+
+浏览器访问 http://localhost:8081
+
+## 发布
+
+```bash
+# 构建测试环境
+npm run build:stage
+
+# 构建生产环境
+npm run build:prod
+```
\ No newline at end of file
diff --git a/fuintAdmin/babel.config.js b/fuintAdmin/babel.config.js
new file mode 100644
index 0000000..b99f001
--- /dev/null
+++ b/fuintAdmin/babel.config.js
@@ -0,0 +1,13 @@
+module.exports = {
+ presets: [
+ // https://github.com/vuejs/vue-cli/tree/master/packages/@vue/babel-preset-app
+ '@vue/cli-plugin-babel/preset'
+ ],
+ 'env': {
+ 'development': {
+ // babel-plugin-dynamic-import-node plugin only does one thing by converting all import() to require().
+ // This plugin can significantly increase the speed of hot updates, when you have a large number of pages.
+ 'plugins': ['dynamic-import-node']
+ }
+ }
+}
diff --git a/fuintAdmin/bin/build.bat b/fuintAdmin/bin/build.bat
new file mode 100644
index 0000000..dda590d
--- /dev/null
+++ b/fuintAdmin/bin/build.bat
@@ -0,0 +1,12 @@
+@echo off
+echo.
+echo [Ϣ] Weḅdistļ
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+npm run build:prod
+
+pause
\ No newline at end of file
diff --git a/fuintAdmin/bin/package.bat b/fuintAdmin/bin/package.bat
new file mode 100644
index 0000000..0e5bc0f
--- /dev/null
+++ b/fuintAdmin/bin/package.bat
@@ -0,0 +1,12 @@
+@echo off
+echo.
+echo [Ϣ] װWeḅnode_modulesļ
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+npm install --registry=https://registry.npmmirror.com
+
+pause
\ No newline at end of file
diff --git a/fuintAdmin/bin/run-web.bat b/fuintAdmin/bin/run-web.bat
new file mode 100644
index 0000000..d30deae
--- /dev/null
+++ b/fuintAdmin/bin/run-web.bat
@@ -0,0 +1,12 @@
+@echo off
+echo.
+echo [Ϣ] ʹ Vue CLI Web ̡
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+npm run dev
+
+pause
\ No newline at end of file
diff --git a/fuintAdmin/build/index.js b/fuintAdmin/build/index.js
new file mode 100644
index 0000000..0c57de2
--- /dev/null
+++ b/fuintAdmin/build/index.js
@@ -0,0 +1,35 @@
+const { run } = require('runjs')
+const chalk = require('chalk')
+const config = require('../vue.config.js')
+const rawArgv = process.argv.slice(2)
+const args = rawArgv.join(' ')
+
+if (process.env.npm_config_preview || rawArgv.includes('--preview')) {
+ const report = rawArgv.includes('--report')
+
+ run(`vue-cli-service build ${args}`)
+
+ const port = 9526
+ const publicPath = config.publicPath
+
+ var connect = require('connect')
+ var serveStatic = require('serve-static')
+ const app = connect()
+
+ app.use(
+ publicPath,
+ serveStatic('./dist', {
+ index: ['index.html', '/']
+ })
+ )
+
+ app.listen(port, function () {
+ console.log(chalk.green(`> Preview at http://localhost:${port}${publicPath}`))
+ if (report) {
+ console.log(chalk.green(`> Report at http://localhost:${port}${publicPath}report.html`))
+ }
+
+ })
+} else {
+ run(`vue-cli-service build ${args}`)
+}
diff --git a/fuintAdmin/package.json b/fuintAdmin/package.json
new file mode 100644
index 0000000..d4801e2
--- /dev/null
+++ b/fuintAdmin/package.json
@@ -0,0 +1,91 @@
+{
+ "name": "fuintAdmin",
+ "version": "3.0.3",
+ "description": "会员演示营销系统后台管理端",
+ "author": "FSQ",
+ "license": "MIT",
+ "scripts": {
+ "dev": "vue-cli-service serve",
+ "build:prod": "vue-cli-service build",
+ "build:stage": "vue-cli-service build --mode staging",
+ "preview": "node build/index.js --preview",
+ "lint": "eslint --ext .js,.vue src"
+ },
+ "husky": {
+ "hooks": {
+ "pre-commit": "lint-staged"
+ }
+ },
+ "lint-staged": {
+ "src/**/*.{js,vue}": [
+ "eslint --fix",
+ "git add"
+ ]
+ },
+ "keywords": [
+ "vue",
+ "admin",
+ "dashboard",
+ "element-ui",
+ "boilerplate",
+ "admin-template",
+ "management-system"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "https://gitee.com/fuint/fuint-uniapp.git"
+ },
+ "dependencies": {
+ "@riophae/vue-treeselect": "0.4.0",
+ "axios": "0.24.0",
+ "clipboard": "2.0.8",
+ "core-js": "3.25.3",
+ "echarts": "4.9.0",
+ "element-ui": "2.15.12",
+ "file-saver": "2.0.5",
+ "fuse.js": "6.4.3",
+ "highlight.js": "9.18.5",
+ "js-beautify": "1.13.0",
+ "js-cookie": "3.0.1",
+ "jsencrypt": "3.0.0-rc.1",
+ "nprogress": "0.2.0",
+ "quill": "1.3.7",
+ "screenfull": "5.0.2",
+ "sortablejs": "1.10.2",
+ "vue": "2.6.12",
+ "vue-count-to": "1.0.13",
+ "vue-cropper": "0.5.5",
+ "vue-meta": "2.4.0",
+ "vue-print-nb": "^1.7.5",
+ "vue-router": "3.4.9",
+ "vuedraggable": "2.24.3",
+ "vuex": "3.6.0"
+ },
+ "devDependencies": {
+ "@vue/cli-plugin-babel": "4.4.6",
+ "@vue/cli-plugin-eslint": "4.4.6",
+ "@vue/cli-service": "4.4.6",
+ "babel-eslint": "10.1.0",
+ "babel-plugin-dynamic-import-node": "2.3.3",
+ "chalk": "4.1.0",
+ "compression-webpack-plugin": "5.0.2",
+ "connect": "3.6.6",
+ "eslint": "^6.0.0",
+ "eslint-plugin-vue": "7.2.0",
+ "lint-staged": "10.5.3",
+ "runjs": "4.4.2",
+ "sass": "1.32.13",
+ "sass-loader": "10.1.1",
+ "script-ext-html-webpack-plugin": "2.1.5",
+ "svg-sprite-loader": "5.1.1",
+ "vue-template-compiler": "2.6.12"
+ },
+ "engines": {
+ "node": ">=8.9",
+ "npm": ">= 3.0.0"
+ },
+ "browserslist": [
+ "> 1%",
+ "last 2 versions"
+ ]
+}
diff --git a/fuintAdmin/public/favicon.ico b/fuintAdmin/public/favicon.ico
new file mode 100644
index 0000000..2535907
Binary files /dev/null and b/fuintAdmin/public/favicon.ico differ
diff --git a/fuintAdmin/public/html/ie.html b/fuintAdmin/public/html/ie.html
new file mode 100644
index 0000000..052ffcd
--- /dev/null
+++ b/fuintAdmin/public/html/ie.html
@@ -0,0 +1,46 @@
+
+
+
+
+
+ 请升级您的浏览器
+
+
+
+
+
+
+请升级您的浏览器,以便我们更好的为您提供服务!
+您正在使用 Internet Explorer 的早期版本(IE11以下版本或使用该内核的浏览器)。这意味着在升级浏览器前,您将无法访问此网站。
+
+请注意:微软公司对Windows XP 及 Internet Explorer 早期版本的支持已经结束
+自 2016 年 1 月 12 日起,Microsoft 不再为 IE 11 以下版本提供相应支持和更新。没有关键的浏览器安全更新,您的电脑可能易受有害病毒、间谍软件和其他恶意软件的攻击,它们可以窃取或损害您的业务数据和信息。请参阅 微软对 Internet Explorer 早期版本的支持将于 2016 年 1 月 12 日结束的说明 。
+
+您可以选择更先进的浏览器
+推荐使用以下浏览器的最新版本。如果您的电脑已有以下浏览器的最新版本则直接使用该浏览器访问即可。
+
+
+
+
\ No newline at end of file
diff --git a/fuintAdmin/public/index.html b/fuintAdmin/public/index.html
new file mode 100644
index 0000000..a3b4312
--- /dev/null
+++ b/fuintAdmin/public/index.html
@@ -0,0 +1,202 @@
+
+
+
+
+
+
+
+
+
+ <%= webpackConfig.name %>
+
+
+
+
+
+
+
+
+
+
正在加载系统资源,请耐心等待...
+
+
+
+
diff --git a/fuintAdmin/public/robots.txt b/fuintAdmin/public/robots.txt
new file mode 100644
index 0000000..77470cb
--- /dev/null
+++ b/fuintAdmin/public/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Disallow: /
\ No newline at end of file
diff --git a/fuintAdmin/src/App.vue b/fuintAdmin/src/App.vue
new file mode 100644
index 0000000..391d951
--- /dev/null
+++ b/fuintAdmin/src/App.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/api/article.js b/fuintAdmin/src/api/article.js
new file mode 100644
index 0000000..1ce90ea
--- /dev/null
+++ b/fuintAdmin/src/api/article.js
@@ -0,0 +1,40 @@
+import request from '@/utils/request'
+
+// 分页查询文章列表
+export function getArticleList(query) {
+ return request({
+ url: 'backendApi/article/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询文章信息
+export function getArticle(articleId) {
+ return request({
+ url: 'backendApi/article/info/' + articleId,
+ method: 'get'
+ })
+}
+
+// 更新文章状态
+export function updateStatus(id, status) {
+ const data = {
+ id,
+ status
+ }
+ return request({
+ url: 'backendApi/article/updateStatus',
+ method: 'post',
+ data: data
+ })
+}
+
+// 保存数据
+export function saveArticle(data) {
+ return request({
+ url: 'backendApi/article/save',
+ method: 'post',
+ data: data
+ })
+}
diff --git a/fuintAdmin/src/api/balance.js b/fuintAdmin/src/api/balance.js
new file mode 100644
index 0000000..2fbf087
--- /dev/null
+++ b/fuintAdmin/src/api/balance.js
@@ -0,0 +1,67 @@
+import request from '@/utils/request'
+
+// 分页查询余额明细列表
+export function getBalanceList(query) {
+ return request({
+ url: 'backendApi/balance/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询明细详情
+export function getBalanceInfo(memberId) {
+ return request({
+ url: 'backendApi/balance/info/' + memberId,
+ method: 'get'
+ })
+}
+
+// 更新状态
+export function updateBalanceStatus(id, status) {
+ const data = {
+ id,
+ status
+ }
+ return request({
+ url: 'backendApi/balance/updateStatus',
+ method: 'post',
+ data: data
+ })
+}
+
+// 获取配置信息
+export function getSettingInfo() {
+ return request({
+ url: 'backendApi/balance/setting',
+ method: 'get'
+ })
+}
+
+// 保存配置
+export function saveSetting(data) {
+ return request({
+ url: 'backendApi/balance/saveSetting',
+ method: 'post',
+ data: data
+ })
+}
+
+// 确定充值
+export function doRecharge(data) {
+ return request({
+ url: 'backendApi/balance/doRecharge',
+ method: 'post',
+ data: data
+ })
+}
+
+// 发放余额
+export function distribute(data) {
+ return request({
+ url: 'backendApi/balance/distribute',
+ method: 'post',
+ data: data
+ })
+}
+
diff --git a/fuintAdmin/src/api/banner.js b/fuintAdmin/src/api/banner.js
new file mode 100644
index 0000000..fcc0ddb
--- /dev/null
+++ b/fuintAdmin/src/api/banner.js
@@ -0,0 +1,40 @@
+import request from '@/utils/request'
+
+// 分页查询banner列表
+export function getBannerList(query) {
+ return request({
+ url: 'backendApi/banner/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询banner信息
+export function getBannerInfo(bannerId) {
+ return request({
+ url: 'backendApi/banner/info/' + bannerId,
+ method: 'get'
+ })
+}
+
+// 更新banner状态
+export function updateBannerStatus(id, status) {
+ const data = {
+ id,
+ status
+ }
+ return request({
+ url: 'backendApi/banner/updateStatus',
+ method: 'post',
+ data: data
+ })
+}
+
+// 保存数据
+export function saveBanner(data) {
+ return request({
+ url: 'backendApi/banner/save',
+ method: 'post',
+ data: data
+ })
+}
diff --git a/fuintAdmin/src/api/cashier.js b/fuintAdmin/src/api/cashier.js
new file mode 100644
index 0000000..2ac1fd1
--- /dev/null
+++ b/fuintAdmin/src/api/cashier.js
@@ -0,0 +1,123 @@
+import request from '@/utils/request'
+
+// 初始化数据
+export function init(userId) {
+ return request({
+ url: 'backendApi/cashier/init/' + userId,
+ method: 'get'
+ })
+}
+
+// 查询商品详情
+export function getGoodsInfo(goodsId) {
+ return request({
+ url: 'backendApi/cashier/getGoodsInfo/' + goodsId,
+ method: 'get'
+ })
+}
+
+// 查询商品
+export function searchGoods(data) {
+ return request({
+ url: 'backendApi/cashier/searchGoods',
+ method: 'post',
+ data: data
+ })
+}
+
+// 查询会员信息
+export function getMemberInfo(data) {
+ return request({
+ url: 'backendApi/cashier/getMemberInfo',
+ method: 'post',
+ data: data
+ })
+}
+
+// 查询会员信息
+export function getMemberInfoById(userId) {
+ return request({
+ url: 'backendApi/cashier/getMemberInfoById/' + userId,
+ method: 'get'
+ })
+}
+
+// 获取购物车列表
+export function getCartList(data) {
+ return request({
+ url: 'clientApi/cart/list',
+ method: 'post',
+ data: data
+ })
+}
+
+// 保存购物车
+export function saveCart(data) {
+ return request({
+ url: 'clientApi/cart/save',
+ method: 'post',
+ data: data
+ })
+}
+
+// 删除购物车
+export function removeFromCart(data) {
+ return request({
+ url: 'clientApi/cart/clear',
+ method: 'post',
+ data: data
+ })
+}
+
+// 提交结算
+export function submitSettlement(data) {
+ return request({
+ url: 'clientApi/settlement/submit',
+ method: 'post',
+ data: data
+ })
+}
+
+// 发起支付
+export function doPay(params) {
+ return request({
+ url: 'clientApi/pay/doPay',
+ method: 'get',
+ params: params
+ })
+}
+
+// 获取订单列表
+export function getOrderList(data) {
+ return request({
+ url: 'backendApi/order/latest',
+ method: 'post',
+ data: data
+ })
+}
+
+// 执行挂单
+export function doHangUp(data) {
+ return request({
+ url: 'backendApi/cashier/doHangUp',
+ method: 'post',
+ data: data
+ })
+}
+
+// 获取挂单
+export function getHangUpList() {
+ return request({
+ url: 'backendApi/cashier/getHangUpList',
+ method: 'get'
+ })
+}
+
+// 删除挂单
+export function removeHangUp(data) {
+ return request({
+ url: 'clientApi/cart/clear',
+ method: 'post',
+ data: data
+ })
+}
diff --git a/fuintAdmin/src/api/commission/cash.js b/fuintAdmin/src/api/commission/cash.js
new file mode 100644
index 0000000..59714b5
--- /dev/null
+++ b/fuintAdmin/src/api/commission/cash.js
@@ -0,0 +1,45 @@
+import request from '@/utils/request'
+
+// 分页查询提现列表
+export function getCashList(query) {
+ return request({
+ url: 'backendApi/commissionCash/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询提现详情
+export function getCashDetail(bannerId) {
+ return request({
+ url: 'backendApi/commissionCash/info/' + bannerId,
+ method: 'get'
+ })
+}
+
+// 更新提现
+export function updateCommissionCash(data) {
+ return request({
+ url: 'backendApi/commissionCash/save',
+ method: 'post',
+ data: data
+ })
+}
+
+// 确认结算
+export function confirmCommissionCash(data) {
+ return request({
+ url: 'backendApi/commissionCash/confirm',
+ method: 'post',
+ data: data
+ })
+}
+
+// 取消结算
+export function cancelCommissionCash(data) {
+ return request({
+ url: 'backendApi/commissionCash/cancel',
+ method: 'post',
+ data: data
+ })
+}
diff --git a/fuintAdmin/src/api/commission/log.js b/fuintAdmin/src/api/commission/log.js
new file mode 100644
index 0000000..fbacbc3
--- /dev/null
+++ b/fuintAdmin/src/api/commission/log.js
@@ -0,0 +1,45 @@
+import request from '@/utils/request'
+
+// 查询分佣记录列表
+export function getCommissionLogList(query) {
+ return request({
+ url: 'backendApi/commissionLog/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询分佣记录详情
+export function getCommissionLogDetail(query) {
+ return request({
+ url: 'backendApi/commissionLog/detail',
+ method: 'get',
+ params: query
+ })
+}
+
+// 更新分佣记录
+export function updateCommissionLog(data) {
+ return request({
+ url: 'backendApi/commissionLog/save',
+ method: 'post',
+ data: data
+ })
+}
+
+// 作废分佣记录
+export function deleteCommissionLog(id) {
+ return request({
+ url: 'backendApi/commissionLog/delete/' + id,
+ method: 'get'
+ })
+}
+
+// 结算分佣记录
+export function doSettle(data) {
+ return request({
+ url: 'backendApi/commissionLog/doSettle',
+ method: 'post',
+ data: data
+ })
+}
diff --git a/fuintAdmin/src/api/commission/rule.js b/fuintAdmin/src/api/commission/rule.js
new file mode 100644
index 0000000..e037c20
--- /dev/null
+++ b/fuintAdmin/src/api/commission/rule.js
@@ -0,0 +1,46 @@
+import request from '@/utils/request'
+
+// 分页查询分销提成规则列表
+export function getCommissionRuleList(query) {
+ return request({
+ url: 'backendApi/commissionRule/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询分销提成规则详情
+export function getCommissionRuleInfo(ruleId) {
+ return request({
+ url: 'backendApi/commissionRule/info/' + ruleId,
+ method: 'get'
+ })
+}
+
+// 更新分销提成规则状态
+export function updateCommissionRuleStatus(ruleId, status) {
+ const data = { ruleId, status }
+ return request({
+ url: 'backendApi/commissionRule/updateStatus',
+ method: 'post',
+ data: data
+ })
+}
+
+// 保存分销提成规则
+export function saveCommissionRule(data) {
+ return request({
+ url: 'backendApi/commissionRule/save',
+ method: 'post',
+ data: data
+ })
+}
+
+// 删除分销提成规则
+export function removeCommissionRule(data) {
+ return request({
+ url: 'backendApi/commissionRule/updateStatus',
+ method: 'post',
+ data: data
+ })
+}
diff --git a/fuintAdmin/src/api/common.js b/fuintAdmin/src/api/common.js
new file mode 100644
index 0000000..64fd674
--- /dev/null
+++ b/fuintAdmin/src/api/common.js
@@ -0,0 +1,11 @@
+import request from '@/utils/request'
+
+// 生成二维码
+export function createQrCode(data) {
+ return request({
+ url: 'backendApi/common/createQrCode',
+ method: 'post',
+ data: data
+ })
+}
+
diff --git a/fuintAdmin/src/api/coupon/confirmLog.js b/fuintAdmin/src/api/coupon/confirmLog.js
new file mode 100644
index 0000000..ec3bed3
--- /dev/null
+++ b/fuintAdmin/src/api/coupon/confirmLog.js
@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+// 分页查询核销流水列表
+export function getConfirmLogList(query) {
+ return request({
+ url: 'backendApi/confirmLog/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 撤销已使用的卡券
+export function rollbackUserCoupon(id, userCouponId) {
+ return request({
+ url: 'backendApi/confirmLog/rollbackUserCoupon/' + id + '?userCouponId=' + userCouponId,
+ method: 'get',
+ })
+}
diff --git a/fuintAdmin/src/api/coupon/coupon.js b/fuintAdmin/src/api/coupon/coupon.js
new file mode 100644
index 0000000..6c6e9d4
--- /dev/null
+++ b/fuintAdmin/src/api/coupon/coupon.js
@@ -0,0 +1,75 @@
+import request from '@/utils/request'
+
+// 分页查询卡券列表
+export function getCouponList(query) {
+ return request({
+ url: 'backendApi/coupon/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询卡券信息
+export function getCouponInfo(id) {
+ return request({
+ url: 'backendApi/coupon/info/' + id,
+ method: 'get'
+ })
+}
+
+// 更新状态
+export function updateCouponStatus(id, status) {
+ const data = {
+ id,
+ status
+ }
+ return request({
+ url: 'backendApi/coupon/updateStatus',
+ method: 'post',
+ data: data
+ })
+}
+
+// 删除卡券
+export function deleteCoupon(id) {
+ return request({
+ url: 'backendApi/coupon/delete/' + id,
+ method: 'get'
+ })
+}
+
+// 保存卡券
+export function saveCoupon(data) {
+ return request({
+ url: 'backendApi/coupon/save',
+ method: 'post',
+ data: data
+ })
+}
+
+// 查询卡券核销信息
+export function getConfirmInfo(data) {
+ return request({
+ url: 'backendApi/doConfirm/info',
+ method: 'post',
+ data: data
+ })
+}
+
+// 执行核销
+export function doConfirm(data) {
+ return request({
+ url: 'backendApi/doConfirm/doConfirm',
+ method: 'post',
+ data: data
+ })
+}
+
+// 发放卡券
+export function sendCoupon(params) {
+ return request({
+ url: 'backendApi/coupon/sendCoupon',
+ method: 'get',
+ params: params
+ })
+}
diff --git a/fuintAdmin/src/api/coupon/give.js b/fuintAdmin/src/api/coupon/give.js
new file mode 100644
index 0000000..ac7cfb6
--- /dev/null
+++ b/fuintAdmin/src/api/coupon/give.js
@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+// 分页查询转赠记录列表
+export function getGiveLogList(query) {
+ return request({
+ url: 'backendApi/give/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 获取转赠详情
+export function getGiveItem(id) {
+ return request({
+ url: 'backendApi/give/giveItem?giveId=' + id,
+ method: 'get',
+ })
+}
diff --git a/fuintAdmin/src/api/coupon/group.js b/fuintAdmin/src/api/coupon/group.js
new file mode 100644
index 0000000..e8dcda7
--- /dev/null
+++ b/fuintAdmin/src/api/coupon/group.js
@@ -0,0 +1,57 @@
+import request from '@/utils/request'
+
+// 分页查询卡券分组列表
+export function getGroupList(query) {
+ return request({
+ url: 'backendApi/couponGroup/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询卡券分组列表
+export function getAllGroupList(query) {
+ return request({
+ url: 'backendApi/couponGroup/quickSearch',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询分组信息
+export function getGroupInfo(id) {
+ return request({
+ url: 'backendApi/couponGroup/info/' + id,
+ method: 'get'
+ })
+}
+
+// 更新状态
+export function updateGroupStatus(id, status) {
+ const data = {
+ id,
+ status
+ }
+ return request({
+ url: 'backendApi/couponGroup/updateStatus',
+ method: 'post',
+ data: data
+ })
+}
+
+// 删除卡券分组
+export function deleteGroup(id) {
+ return request({
+ url: 'backendApi/couponGroup/delete/' + id,
+ method: 'get'
+ })
+}
+
+// 保存卡券分组数据
+export function saveGroup(data) {
+ return request({
+ url: 'backendApi/couponGroup/save',
+ method: 'post',
+ data: data
+ })
+}
diff --git a/fuintAdmin/src/api/coupon/sendLog.js b/fuintAdmin/src/api/coupon/sendLog.js
new file mode 100644
index 0000000..d8b57a9
--- /dev/null
+++ b/fuintAdmin/src/api/coupon/sendLog.js
@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+// 分页查询发券记录列表
+export function getSendLogList(query) {
+ return request({
+ url: 'backendApi/sendLog/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 撤销已发放的卡券
+export function removeUserCoupon(id) {
+ return request({
+ url: 'backendApi/sendLog/removeUserCoupon/' + id,
+ method: 'get',
+ })
+}
diff --git a/fuintAdmin/src/api/coupon/userCoupon.js b/fuintAdmin/src/api/coupon/userCoupon.js
new file mode 100644
index 0000000..d8d7ce5
--- /dev/null
+++ b/fuintAdmin/src/api/coupon/userCoupon.js
@@ -0,0 +1,19 @@
+import request from '@/utils/request'
+
+// 分页查询会员卡券列表
+export function getUserCouponList(query) {
+ return request({
+ url: 'backendApi/userCoupon/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 作废会员卡券
+export function deleteUserCoupon(id) {
+ return request({
+ url: 'backendApi/userCoupon/delete/' + id,
+ method: 'get',
+ })
+}
+
diff --git a/fuintAdmin/src/api/goods.js b/fuintAdmin/src/api/goods.js
new file mode 100644
index 0000000..ce44c40
--- /dev/null
+++ b/fuintAdmin/src/api/goods.js
@@ -0,0 +1,85 @@
+import request from '@/utils/request'
+
+// 分页查询商品列表
+export function getGoodsList(query) {
+ return request({
+ url: 'backendApi/goods/goods/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询商品详情
+export function getGoodsInfo(goodsId) {
+ return request({
+ url: 'backendApi/goods/goods/info/' + goodsId,
+ method: 'get'
+ })
+}
+
+// 更新状态
+export function updateGoodsStatus(id, status) {
+ const data = {
+ id,
+ status
+ }
+ return request({
+ url: 'backendApi/goods/goods/updateStatus',
+ method: 'post',
+ data: data
+ })
+}
+
+// 保存分类数据
+export function saveGoods(data) {
+ return request({
+ url: 'backendApi/goods/goods/save',
+ method: 'post',
+ data: data
+ })
+}
+
+// 保存商品规格名称
+export function saveSpecName(data) {
+ return request({
+ url: 'backendApi/goods/goods/saveSpecName',
+ method: 'post',
+ data: data
+ })
+}
+
+// 保存商品规格值
+export function saveSpecValue(data) {
+ return request({
+ url: 'backendApi/goods/goods/saveSpecValue',
+ method: 'post',
+ data: data
+ })
+}
+
+// 删除商品规格
+export function deleteSpec(query) {
+ return request({
+ url: 'backendApi/goods/goods/deleteSpec',
+ method: 'get',
+ params: query
+ })
+}
+
+// 删除商品规格值
+export function deleteSpecValue(query) {
+ return request({
+ url: 'backendApi/goods/goods/deleteSpecValue',
+ method: 'get',
+ params: query
+ })
+}
+
+// 获取选择商品列表
+export function selectGoodsList(data) {
+ return request({
+ url: 'backendApi/goods/goods/selectGoods',
+ method: 'post',
+ data: data
+ })
+}
diff --git a/fuintAdmin/src/api/goodsCate.js b/fuintAdmin/src/api/goodsCate.js
new file mode 100644
index 0000000..e277b16
--- /dev/null
+++ b/fuintAdmin/src/api/goodsCate.js
@@ -0,0 +1,40 @@
+import request from '@/utils/request'
+
+// 分页查询商品分类列表
+export function getGoodsCateList(query) {
+ return request({
+ url: 'backendApi/goods/cate/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询商品分类详情
+export function getGoodsCateInfo(cateId) {
+ return request({
+ url: 'backendApi/goods/cate/info/' + cateId,
+ method: 'get'
+ })
+}
+
+// 更新状态
+export function updateGoodsCateStatus(id, status) {
+ const data = {
+ id,
+ status
+ }
+ return request({
+ url: 'backendApi/goods/cate/updateStatus',
+ method: 'post',
+ data: data
+ })
+}
+
+// 保存分类数据
+export function saveGoodsCate(data) {
+ return request({
+ url: 'backendApi/goods/cate/save',
+ method: 'post',
+ data: data
+ })
+}
diff --git a/fuintAdmin/src/api/home.js b/fuintAdmin/src/api/home.js
new file mode 100644
index 0000000..a8d1e03
--- /dev/null
+++ b/fuintAdmin/src/api/home.js
@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+// 获取首页数据
+export function getHomeData() {
+ return request({
+ url: 'backendApi/home/index',
+ method: 'get'
+ })
+}
+
+// 获取统计数据
+export function getStatisticData(query) {
+ return request({
+ url: 'backendApi/home/statistic',
+ method: 'get',
+ params: query
+ })
+}
diff --git a/fuintAdmin/src/api/login.js b/fuintAdmin/src/api/login.js
new file mode 100644
index 0000000..fca43c0
--- /dev/null
+++ b/fuintAdmin/src/api/login.js
@@ -0,0 +1,43 @@
+import request from '@/utils/request'
+
+// 登录方法
+export function login(username, password, captchaCode, uuid) {
+ const data = {
+ username,
+ password,
+ captchaCode,
+ uuid
+ }
+ return request({
+ url: 'backendApi/login/doLogin',
+ headers: {
+ isToken: false
+ },
+ method: 'post',
+ data: data
+ })
+}
+
+// 获取用户详细信息
+export function getInfo() {
+ return request({
+ url: 'backendApi/login/getInfo',
+ method: 'get'
+ })
+}
+
+// 退出方法
+export function logout() {
+ return request({
+ url: 'backendApi/login/logout',
+ method: 'post'
+ })
+}
+
+// 获取验证码
+export function getCodeImg() {
+ return request({
+ url: 'clientApi/captcha/getCode',
+ method: 'get'
+ })
+}
diff --git a/fuintAdmin/src/api/member.js b/fuintAdmin/src/api/member.js
new file mode 100644
index 0000000..5c07d71
--- /dev/null
+++ b/fuintAdmin/src/api/member.js
@@ -0,0 +1,92 @@
+import request from '@/utils/request'
+
+// 分页查询会员列表
+export function getMemberList(query) {
+ return request({
+ url: 'backendApi/member/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询会员信息
+export function getMemberInfo(memberId) {
+ return request({
+ url: 'backendApi/member/info/' + memberId,
+ method: 'get'
+ })
+}
+
+// 查询会员设置
+export function getMemberSetting() {
+ return request({
+ url: 'backendApi/member/setting',
+ method: 'get'
+ })
+}
+
+// 保存会员设置
+export function saveSetting(data) {
+ return request({
+ url: 'backendApi/member/saveSetting',
+ method: 'post',
+ data: data
+ })
+}
+
+// 更新会员状态
+export function updateMemberStatus(userId, status) {
+ const data = {
+ userId,
+ status
+ }
+ return request({
+ url: 'backendApi/member/updateStatus',
+ method: 'post',
+ data: data
+ })
+}
+
+// 删除会员信息
+export function deleteMember(memberId) {
+ return request({
+ url: 'backendApi/member/delete/' + memberId,
+ method: 'get'
+ })
+}
+
+// 保存会员信息
+export function saveMember(data) {
+ return request({
+ url: 'backendApi/member/save',
+ method: 'post',
+ data: data
+ })
+}
+
+// 查询会员分组列表
+export function getGroupList(query) {
+ return request({
+ url: 'backendApi/member/groupList',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查找会员
+export function searchMembers(query) {
+ return request({
+ url: 'backendApi/member/searchMembers',
+ method: 'get',
+ params: query
+ })
+}
+
+// 重置会员密码
+export function resetMemberPwd(data) {
+ return request({
+ url: 'backendApi/member/resetPwd',
+ method: 'post',
+ data: data
+ })
+}
diff --git a/fuintAdmin/src/api/memberGroup.js b/fuintAdmin/src/api/memberGroup.js
new file mode 100644
index 0000000..a4b7586
--- /dev/null
+++ b/fuintAdmin/src/api/memberGroup.js
@@ -0,0 +1,57 @@
+import request from '@/utils/request'
+
+// 分页查询会员分组列表
+export function getGroupList(query) {
+ return request({
+ url: 'backendApi/memberGroup/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询会员分组列表
+export function getAllGroupList(query) {
+ return request({
+ url: 'backendApi/memberGroup/quickSearch',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询会员分组信息
+export function getGroupInfo(id) {
+ return request({
+ url: 'backendApi/memberGroup/info/' + id,
+ method: 'get'
+ })
+}
+
+// 更新会员分组状态
+export function updateGroupStatus(id, status) {
+ const data = {
+ id,
+ status
+ }
+ return request({
+ url: 'backendApi/memberGroup/updateStatus',
+ method: 'post',
+ data: data
+ })
+}
+
+// 删除会员分组
+export function deleteGroup(id) {
+ return request({
+ url: 'backendApi/memberGroup/delete/' + id,
+ method: 'get'
+ })
+}
+
+// 保存会员分组数据
+export function saveGroup(data) {
+ return request({
+ url: 'backendApi/memberGroup/save',
+ method: 'post',
+ data: data
+ })
+}
diff --git a/fuintAdmin/src/api/menu.js b/fuintAdmin/src/api/menu.js
new file mode 100644
index 0000000..f65ebe0
--- /dev/null
+++ b/fuintAdmin/src/api/menu.js
@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+// 获取路由
+export const getRouters = () => {
+ return request({
+ url: 'backendApi/login/getRouters',
+ method: 'get'
+ })
+}
diff --git a/fuintAdmin/src/api/merchant.js b/fuintAdmin/src/api/merchant.js
new file mode 100644
index 0000000..3d9a868
--- /dev/null
+++ b/fuintAdmin/src/api/merchant.js
@@ -0,0 +1,49 @@
+import request from '@/utils/request'
+
+// 分页查询商户列表
+export function getMerchantList(query) {
+ return request({
+ url: 'backendApi/merchant/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询商户信息
+export function getMerchantInfo(merchantId) {
+ return request({
+ url: 'backendApi/merchant/info/' + merchantId,
+ method: 'get'
+ })
+}
+
+// 查询商户列表
+export function searchMerchant(param) {
+ return request({
+ url: 'backendApi/merchant/searchMerchant',
+ method: 'get',
+ params: param
+ })
+}
+
+// 更新商户状态
+export function updateMerchantStatus(merchantId, status) {
+ const data = {
+ merchantId,
+ status
+ }
+ return request({
+ url: 'backendApi/merchant/updateStatus',
+ method: 'post',
+ data: data
+ })
+}
+
+// 保存商户信息
+export function saveMerchant(data) {
+ return request({
+ url: 'backendApi/merchant/save',
+ method: 'post',
+ data: data
+ })
+}
diff --git a/fuintAdmin/src/api/openGift.js b/fuintAdmin/src/api/openGift.js
new file mode 100644
index 0000000..1337497
--- /dev/null
+++ b/fuintAdmin/src/api/openGift.js
@@ -0,0 +1,48 @@
+import request from '@/utils/request'
+
+// 分页查询开卡赠礼列表
+export function getOpenGiftList(query) {
+ return request({
+ url: 'backendApi/openGift/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询信息
+export function getOpenGiftInfo(id) {
+ return request({
+ url: 'backendApi/openGift/info/' + id,
+ method: 'get'
+ })
+}
+
+// 更新状态
+export function updateOpenGiftStatus(id, status) {
+ const data = {
+ id,
+ status
+ }
+ return request({
+ url: 'backendApi/openGift/updateStatus',
+ method: 'post',
+ data: data
+ })
+}
+
+// 删除开卡赠礼
+export function deleteOpenGift(id) {
+ return request({
+ url: 'backendApi/openGift/delete/' + id,
+ method: 'get'
+ })
+}
+
+// 保存数据
+export function saveOpenGift(data) {
+ return request({
+ url: 'backendApi/openGift/save',
+ method: 'post',
+ data: data
+ })
+}
diff --git a/fuintAdmin/src/api/order.js b/fuintAdmin/src/api/order.js
new file mode 100644
index 0000000..4ab73ab
--- /dev/null
+++ b/fuintAdmin/src/api/order.js
@@ -0,0 +1,83 @@
+import request from '@/utils/request'
+
+// 分页查询订单列表
+export function getOrderList(data) {
+ return request({
+ url: 'backendApi/order/list',
+ method: 'post',
+ data: data
+ })
+}
+
+// 查询订单信息
+export function getOrderInfo(orderId) {
+ return request({
+ url: 'backendApi/order/info/' + orderId,
+ method: 'get'
+ })
+}
+
+// 更新订单状态
+export function updateOrderStatus(orderId, status) {
+ const data = {
+ orderId,
+ status
+ }
+ return request({
+ url: 'backendApi/order/updateStatus',
+ method: 'post',
+ data: data
+ })
+}
+
+// 删除订单
+export function deleteOrder(orderId) {
+ return request({
+ url: 'backendApi/order/delete/' + orderId,
+ method: 'get'
+ })
+}
+
+// 保存订单数据
+export function saveOrder(data) {
+ return request({
+ url: 'backendApi/order/save',
+ method: 'post',
+ data: data
+ })
+}
+
+// 验证核销订单
+export function verifyOrder(data) {
+ return request({
+ url: 'backendApi/order/verify',
+ method: 'post',
+ data: data
+ })
+}
+
+// 提交发货信息
+export function delivered(data) {
+ return request({
+ url: 'backendApi/order/delivered',
+ method: 'post',
+ data: data
+ })
+}
+
+// 获取配置信息
+export function getSettingInfo() {
+ return request({
+ url: 'backendApi/order/setting',
+ method: 'get'
+ })
+}
+
+// 保存配置
+export function saveSetting(data) {
+ return request({
+ url: 'backendApi/order/saveSetting',
+ method: 'post',
+ data: data
+ })
+}
diff --git a/fuintAdmin/src/api/point.js b/fuintAdmin/src/api/point.js
new file mode 100644
index 0000000..9427b6a
--- /dev/null
+++ b/fuintAdmin/src/api/point.js
@@ -0,0 +1,58 @@
+import request from '@/utils/request'
+
+// 分页查询积分明细列表
+export function getPointList(query) {
+ return request({
+ url: 'backendApi/point/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询明细详情
+export function getPointInfo(memberId) {
+ return request({
+ url: 'backendApi/point/info/' + memberId,
+ method: 'get'
+ })
+}
+
+// 更新状态
+export function updatePointStatus(id, status) {
+ const data = {
+ id,
+ status
+ }
+ return request({
+ url: 'backendApi/point/updateStatus',
+ method: 'post',
+ data: data
+ })
+}
+
+// 获取配置信息
+export function getSettingInfo() {
+ return request({
+ url: 'backendApi/point/setting',
+ method: 'get'
+ })
+}
+
+// 保存配置
+export function saveSetting(data) {
+ return request({
+ url: 'backendApi/point/saveSetting',
+ method: 'post',
+ data: data
+ })
+}
+
+// 确定充值
+export function doRecharge(data) {
+ return request({
+ url: 'backendApi/point/doRecharge',
+ method: 'post',
+ data: data
+ })
+}
+
diff --git a/fuintAdmin/src/api/refund.js b/fuintAdmin/src/api/refund.js
new file mode 100644
index 0000000..7cba536
--- /dev/null
+++ b/fuintAdmin/src/api/refund.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 分页查询退款订单列表
+export function getRefundList(query) {
+ return request({
+ url: 'backendApi/refund/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询订单信息
+export function getRefundInfo(refundId) {
+ return request({
+ url: 'backendApi/refund/info/' + refundId,
+ method: 'get'
+ })
+}
+
+// 订单退款
+export function doRefund(data) {
+ return request({
+ url: 'backendApi/refund/doRefund',
+ method: 'post',
+ data: data
+ })
+}
+
+// 删除退款订单
+export function deleteRefund(refundId) {
+ return request({
+ url: 'backendApi/refund/delete/' + refundId,
+ method: 'get'
+ })
+}
+
+// 保存退款订单
+export function saveRefund(data) {
+ return request({
+ url: 'backendApi/refund/save',
+ method: 'post',
+ data: data
+ })
+}
diff --git a/fuintAdmin/src/api/settlement.js b/fuintAdmin/src/api/settlement.js
new file mode 100644
index 0000000..a14a760
--- /dev/null
+++ b/fuintAdmin/src/api/settlement.js
@@ -0,0 +1,39 @@
+import request from '@/utils/request'
+
+// 分页查询结算列表
+export function getSettlementList(query) {
+ return request({
+ url: 'backendApi/settlement/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询结算详情
+export function getSettlementInfo(query) {
+ return request({
+ url: 'backendApi/settlement/info/',
+ method: 'get',
+ params: query
+ })
+}
+
+// 提交结算
+export function doSubmit(data) {
+ return request({
+ url: 'backendApi/settlement/doSubmit',
+ method: 'post',
+ data: data
+ })
+}
+
+// 提交确认
+export function doConfirm(data) {
+ return request({
+ url: 'backendApi/settlement/doConfirm',
+ method: 'post',
+ data: data
+ })
+}
+
+
diff --git a/fuintAdmin/src/api/smsManager.js b/fuintAdmin/src/api/smsManager.js
new file mode 100644
index 0000000..886ad2f
--- /dev/null
+++ b/fuintAdmin/src/api/smsManager.js
@@ -0,0 +1,19 @@
+import request from '@/utils/request'
+
+// 分页查询短信列表
+export function getSmsList(query) {
+ return request({
+ url: 'backendApi/smsManager/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 发送短信
+export function sendSms(data) {
+ return request({
+ url: 'backendApi/smsManager/send',
+ method: 'post',
+ data: data
+ })
+}
diff --git a/fuintAdmin/src/api/smsTemplate.js b/fuintAdmin/src/api/smsTemplate.js
new file mode 100644
index 0000000..9b49c3e
--- /dev/null
+++ b/fuintAdmin/src/api/smsTemplate.js
@@ -0,0 +1,48 @@
+import request from '@/utils/request'
+
+// 分页查询短信模板列表
+export function getSmsTemplateList(query) {
+ return request({
+ url: 'backendApi/smsTemplate/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询信息
+export function getSmsTemplateInfo(id) {
+ return request({
+ url: 'backendApi/smsTemplate/info/' + id,
+ method: 'get'
+ })
+}
+
+// 更新状态
+export function updateSmsTemplateStatus(id, status) {
+ const data = {
+ id,
+ status
+ }
+ return request({
+ url: 'backendApi/smsTemplate/updateStatus',
+ method: 'post',
+ data: data
+ })
+}
+
+// 删除短信模板
+export function deleteSmsTemplate(id) {
+ return request({
+ url: 'backendApi/smsTemplate/delete/' + id,
+ method: 'get'
+ })
+}
+
+// 保存数据
+export function saveSmsTemplate(data) {
+ return request({
+ url: 'backendApi/smsTemplate/save',
+ method: 'post',
+ data: data
+ })
+}
diff --git a/fuintAdmin/src/api/staff.js b/fuintAdmin/src/api/staff.js
new file mode 100644
index 0000000..b7bc210
--- /dev/null
+++ b/fuintAdmin/src/api/staff.js
@@ -0,0 +1,56 @@
+import request from '@/utils/request'
+
+// 查询员工列表
+export function getStaffList(query) {
+ return request({
+ url: 'backendApi/staff/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询员工信息
+export function getStaffInfo(staffId) {
+ return request({
+ url: 'backendApi/staff/info/' + staffId,
+ method: 'get'
+ })
+}
+
+// 删除员工信息
+export function deleteStaff(staffId) {
+ return request({
+ url: 'backendApi/staff/delete/' + staffId,
+ method: 'get'
+ })
+}
+
+// 获取店铺员工列表
+export function getStoreStaffList(storeId) {
+ return request({
+ url: 'backendApi/staff/storeStaffList/' + storeId,
+ method: 'get'
+ })
+}
+
+// 更新员工状态
+export function updateStaffStatus(id, status) {
+ const data = {
+ id,
+ status
+ }
+ return request({
+ url: 'backendApi/staff/updateStatus',
+ method: 'post',
+ data: data
+ })
+}
+
+// 保存员工信息
+export function saveStaff(data) {
+ return request({
+ url: 'backendApi/staff/save',
+ method: 'post',
+ data: data
+ })
+}
diff --git a/fuintAdmin/src/api/statistic.js b/fuintAdmin/src/api/statistic.js
new file mode 100644
index 0000000..0c1c93e
--- /dev/null
+++ b/fuintAdmin/src/api/statistic.js
@@ -0,0 +1,27 @@
+import request from '@/utils/request'
+
+// 获取看板数据
+export function getMainData(params) {
+ return request({
+ url: 'backendApi/statistic/main',
+ method: 'post',
+ data: params
+ })
+}
+
+// 获取排行榜数据
+export function getTopData(params) {
+ return request({
+ url: 'backendApi/statistic/top',
+ method: 'post',
+ data: params
+ })
+}
+
+// 获取总会员数量
+export function getTotalMember() {
+ return request({
+ url: 'backendApi/statistic/totalMember',
+ method: 'get'
+ })
+}
diff --git a/fuintAdmin/src/api/stock.js b/fuintAdmin/src/api/stock.js
new file mode 100644
index 0000000..fac99fa
--- /dev/null
+++ b/fuintAdmin/src/api/stock.js
@@ -0,0 +1,40 @@
+import request from '@/utils/request'
+
+// 分页查询库存管理记录列表
+export function getStockList(query) {
+ return request({
+ url: 'backendApi/stock/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 删除库存管理记录
+export function deleteStock(id, status) {
+ const data = {
+ id,
+ status
+ }
+ return request({
+ url: 'backendApi/stock/delete',
+ method: 'post',
+ data: data
+ })
+}
+
+// 保存库存管理记录
+export function saveStock(data) {
+ return request({
+ url: 'backendApi/stock/save',
+ method: 'post',
+ data: data
+ })
+}
+
+// 获取库存管理记录详情
+export function getStockInfo(cateId) {
+ return request({
+ url: 'backendApi/stock/info/' + cateId,
+ method: 'get'
+ })
+}
diff --git a/fuintAdmin/src/api/store.js b/fuintAdmin/src/api/store.js
new file mode 100644
index 0000000..8f7b51c
--- /dev/null
+++ b/fuintAdmin/src/api/store.js
@@ -0,0 +1,49 @@
+import request from '@/utils/request'
+
+// 分页查询店铺列表
+export function getStoreList(query) {
+ return request({
+ url: 'backendApi/store/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询店铺信息
+export function getStoreInfo(storeId) {
+ return request({
+ url: 'backendApi/store/info/' + storeId,
+ method: 'get'
+ })
+}
+
+// 查询店铺列表
+export function searchStore(param) {
+ return request({
+ url: 'backendApi/store/searchStore',
+ method: 'get',
+ params: param
+ })
+}
+
+// 更新店铺状态
+export function updateStoreStatus(storeId, status) {
+ const data = {
+ storeId,
+ status
+ }
+ return request({
+ url: 'backendApi/store/updateStatus',
+ method: 'post',
+ data: data
+ })
+}
+
+// 保存店铺
+export function saveStore(data) {
+ return request({
+ url: 'backendApi/store/save',
+ method: 'post',
+ data: data
+ })
+}
diff --git a/fuintAdmin/src/api/subMessage.js b/fuintAdmin/src/api/subMessage.js
new file mode 100644
index 0000000..1aeea5e
--- /dev/null
+++ b/fuintAdmin/src/api/subMessage.js
@@ -0,0 +1,48 @@
+import request from '@/utils/request'
+
+// 分页查询订阅消息列表
+export function getSubMessageList(query) {
+ return request({
+ url: 'backendApi/subMessage/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询信息
+export function getSubMessageInfo(id) {
+ return request({
+ url: 'backendApi/subMessage/info/' + id,
+ method: 'get'
+ })
+}
+
+// 更新状态
+export function updateSubMessageStatus(id, status) {
+ const data = {
+ id,
+ status
+ }
+ return request({
+ url: 'backendApi/subMessage/updateStatus',
+ method: 'post',
+ data: data
+ })
+}
+
+// 删除订阅消息
+export function deleteSubMessage(id) {
+ return request({
+ url: 'backendApi/subMessage/delete/' + id,
+ method: 'get'
+ })
+}
+
+// 保存数据
+export function saveSubMessage(data) {
+ return request({
+ url: 'backendApi/subMessage/save',
+ method: 'post',
+ data: data
+ })
+}
diff --git a/fuintAdmin/src/api/system/account.js b/fuintAdmin/src/api/system/account.js
new file mode 100644
index 0000000..5820135
--- /dev/null
+++ b/fuintAdmin/src/api/system/account.js
@@ -0,0 +1,127 @@
+import request from '@/utils/request'
+import { parseStrEmpty } from "@/utils/fuint";
+
+// 查询用户列表
+export function getAccountList(query) {
+ return request({
+ url: 'backendApi/account/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询用户详细
+export function getAccount(userId) {
+ return request({
+ url: 'backendApi/account/info/' + parseStrEmpty(userId),
+ method: 'get'
+ })
+}
+
+// 新增用户
+export function addAccount(data) {
+ return request({
+ url: 'backendApi/account/doCreate',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改用户
+export function updateAccount(data) {
+ return request({
+ url: 'backendApi/account/update',
+ method: 'post',
+ data: data
+ })
+}
+
+// 删除用户
+export function delAccount(userId) {
+ return request({
+ url: 'backendApi/account/delete/' + userId,
+ method: 'get'
+ })
+}
+
+// 用户密码重置
+export function resetAccountPwd(userId, password) {
+ const data = {
+ userId,
+ password
+ }
+ return request({
+ url: 'backendApi/account/resetPwd',
+ method: 'post',
+ data: data
+ })
+}
+
+// 用户状态修改
+export function changeAccountStatus(userId, status) {
+ const data = {
+ userId,
+ status
+ }
+ return request({
+ url: 'backendApi/account/updateStatus',
+ method: 'post',
+ data: data
+ })
+}
+
+// 查询用户个人信息
+export function getAccountProfile() {
+ return request({
+ url: 'backendApi/account/profile',
+ method: 'get'
+ })
+}
+
+// 修改用户个人信息
+export function updateAccountProfile(data) {
+ return request({
+ url: 'backendApi/account/profile',
+ method: 'post',
+ data: data
+ })
+}
+
+// 用户密码重置
+export function updateAccountPwd(oldPassword, newPassword) {
+ const data = {
+ oldPassword,
+ newPassword
+ }
+ return request({
+ url: 'backendApi/account/profile/updatePwd',
+ method: 'post',
+ params: data
+ })
+}
+
+// 用户头像上传
+export function uploadAvatar(data) {
+ return request({
+ url: 'backendApi/account/profile/avatar',
+ method: 'post',
+ data: data
+ })
+}
+
+// 查询授权角色
+export function getAuthRole(userId) {
+ return request({
+ url: 'backendApi/account/authRole/' + userId,
+ method: 'get'
+ })
+}
+
+// 保存授权角色
+export function updateAuthRole(data) {
+ return request({
+ url: 'backendApi/account/authRole',
+ method: 'post',
+ params: data
+ })
+}
diff --git a/fuintAdmin/src/api/system/config.js b/fuintAdmin/src/api/system/config.js
new file mode 100644
index 0000000..a404d82
--- /dev/null
+++ b/fuintAdmin/src/api/system/config.js
@@ -0,0 +1,60 @@
+import request from '@/utils/request'
+
+// 查询参数列表
+export function listConfig(query) {
+ return request({
+ url: '/system/config/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询参数详细
+export function getConfig(configId) {
+ return request({
+ url: '/system/config/' + configId,
+ method: 'get'
+ })
+}
+
+// 根据参数键名查询参数值
+export function getConfigKey(configKey) {
+ return request({
+ url: '/system/config/configKey/' + configKey,
+ method: 'get'
+ })
+}
+
+// 新增参数配置
+export function addConfig(data) {
+ return request({
+ url: '/system/config',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改参数配置
+export function updateConfig(data) {
+ return request({
+ url: '/system/config',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除参数配置
+export function delConfig(configId) {
+ return request({
+ url: '/system/config/' + configId,
+ method: 'delete'
+ })
+}
+
+// 刷新参数缓存
+export function refreshCache() {
+ return request({
+ url: '/system/config/refreshCache',
+ method: 'delete'
+ })
+}
diff --git a/fuintAdmin/src/api/system/dict/data.js b/fuintAdmin/src/api/system/dict/data.js
new file mode 100644
index 0000000..6c9eb79
--- /dev/null
+++ b/fuintAdmin/src/api/system/dict/data.js
@@ -0,0 +1,52 @@
+import request from '@/utils/request'
+
+// 查询字典数据列表
+export function listData(query) {
+ return request({
+ url: '/system/dict/data/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询字典数据详细
+export function getData(dictCode) {
+ return request({
+ url: '/system/dict/data/' + dictCode,
+ method: 'get'
+ })
+}
+
+// 根据字典类型查询字典数据信息
+export function getDicts(dictType) {
+ return request({
+ url: '/system/dict/data/type/' + dictType,
+ method: 'get'
+ })
+}
+
+// 新增字典数据
+export function addData(data) {
+ return request({
+ url: '/system/dict/data',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改字典数据
+export function updateData(data) {
+ return request({
+ url: '/system/dict/data',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除字典数据
+export function delData(dictCode) {
+ return request({
+ url: '/system/dict/data/' + dictCode,
+ method: 'delete'
+ })
+}
diff --git a/fuintAdmin/src/api/system/dict/type.js b/fuintAdmin/src/api/system/dict/type.js
new file mode 100644
index 0000000..a7a6e01
--- /dev/null
+++ b/fuintAdmin/src/api/system/dict/type.js
@@ -0,0 +1,60 @@
+import request from '@/utils/request'
+
+// 查询字典类型列表
+export function listType(query) {
+ return request({
+ url: '/system/dict/type/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询字典类型详细
+export function getType(dictId) {
+ return request({
+ url: '/system/dict/type/' + dictId,
+ method: 'get'
+ })
+}
+
+// 新增字典类型
+export function addType(data) {
+ return request({
+ url: '/system/dict/type',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改字典类型
+export function updateType(data) {
+ return request({
+ url: '/system/dict/type',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除字典类型
+export function delType(dictId) {
+ return request({
+ url: '/system/dict/type/' + dictId,
+ method: 'delete'
+ })
+}
+
+// 刷新字典缓存
+export function refreshCache() {
+ return request({
+ url: '/system/dict/type/refreshCache',
+ method: 'delete'
+ })
+}
+
+// 获取字典选择框列表
+export function optionselect() {
+ return request({
+ url: '/system/dict/type/optionselect',
+ method: 'get'
+ })
+}
\ No newline at end of file
diff --git a/fuintAdmin/src/api/system/genCode.js b/fuintAdmin/src/api/system/genCode.js
new file mode 100644
index 0000000..e678359
--- /dev/null
+++ b/fuintAdmin/src/api/system/genCode.js
@@ -0,0 +1,48 @@
+import request from '@/utils/request'
+
+// 分页查询生成代码列表
+export function getGenCodeList(query) {
+ return request({
+ url: 'backendApi/genCode/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询生成代码信息
+export function getGenCodeInfo(id) {
+ return request({
+ url: 'backendApi/genCode/info/' + id,
+ method: 'get'
+ })
+}
+
+// 更新生成代码状态
+export function updateGenCodeStatus(id, status) {
+ const data = {
+ id,
+ status
+ }
+ return request({
+ url: 'backendApi/genCode/updateStatus',
+ method: 'post',
+ data: data
+ })
+}
+
+// 保存生成代码
+export function saveGenCode(data) {
+ return request({
+ url: 'backendApi/genCode/save',
+ method: 'post',
+ data: data
+ })
+}
+
+// 执行生成代码
+export function doGenCode(id) {
+ return request({
+ url: 'backendApi/genCode/gen/' + id,
+ method: 'get'
+ })
+}
diff --git a/fuintAdmin/src/api/system/logs.js b/fuintAdmin/src/api/system/logs.js
new file mode 100644
index 0000000..69ceb25
--- /dev/null
+++ b/fuintAdmin/src/api/system/logs.js
@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+// 查询操作日志列表
+export function list(query) {
+ return request({
+ url: 'backendApi/actlog/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 删除操作日志
+export function delOperlog(logId) {
+ return request({
+ url: 'backendApi/actlog/delete/' + logId,
+ method: 'get'
+ })
+}
diff --git a/fuintAdmin/src/api/system/menu.js b/fuintAdmin/src/api/system/menu.js
new file mode 100644
index 0000000..0c5dd33
--- /dev/null
+++ b/fuintAdmin/src/api/system/menu.js
@@ -0,0 +1,60 @@
+import request from '@/utils/request'
+
+// 查询菜单列表
+export function listMenu(query) {
+ return request({
+ url: 'backendApi/source/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询菜单详细
+export function getMenu(menuId) {
+ return request({
+ url: 'backendApi/source/info/' + menuId,
+ method: 'get'
+ })
+}
+
+// 查询菜单下拉树结构
+export function treeselect() {
+ return request({
+ url: 'backendApi/source/treeselect',
+ method: 'get'
+ })
+}
+
+// 根据角色ID查询菜单下拉树结构
+export function roleMenuTreeselect(roleId) {
+ return request({
+ url: 'backendApi/source/roleMenuTreeselect/' + roleId,
+ method: 'get'
+ })
+}
+
+// 新增菜单
+export function addMenu(data) {
+ return request({
+ url: 'backendApi/source/add',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改菜单
+export function updateMenu(data) {
+ return request({
+ url: 'backendApi/source/update',
+ method: 'post',
+ data: data
+ })
+}
+
+// 删除菜单
+export function delMenu(menuId) {
+ return request({
+ url: 'backendApi/source/delete/' + menuId,
+ method: 'get'
+ })
+}
diff --git a/fuintAdmin/src/api/system/notice.js b/fuintAdmin/src/api/system/notice.js
new file mode 100644
index 0000000..c274ea5
--- /dev/null
+++ b/fuintAdmin/src/api/system/notice.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询公告列表
+export function listNotice(query) {
+ return request({
+ url: '/system/notice/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询公告详细
+export function getNotice(noticeId) {
+ return request({
+ url: '/system/notice/' + noticeId,
+ method: 'get'
+ })
+}
+
+// 新增公告
+export function addNotice(data) {
+ return request({
+ url: '/system/notice',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改公告
+export function updateNotice(data) {
+ return request({
+ url: '/system/notice',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除公告
+export function delNotice(noticeId) {
+ return request({
+ url: '/system/notice/' + noticeId,
+ method: 'delete'
+ })
+}
\ No newline at end of file
diff --git a/fuintAdmin/src/api/system/role.js b/fuintAdmin/src/api/system/role.js
new file mode 100644
index 0000000..8af7673
--- /dev/null
+++ b/fuintAdmin/src/api/system/role.js
@@ -0,0 +1,111 @@
+import request from '@/utils/request'
+
+// 查询角色列表
+export function listRole(query) {
+ return request({
+ url: 'backendApi/duty/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询角色详细
+export function getRole(roleId) {
+ return request({
+ url: 'backendApi/duty/info/' + roleId,
+ method: 'get'
+ })
+}
+
+// 新增角色
+export function addRole(data) {
+ return request({
+ url: 'backendApi/duty/add',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改角色
+export function updateRole(data) {
+ return request({
+ url: 'backendApi/duty/update',
+ method: 'post',
+ data: data
+ })
+}
+
+// 角色数据权限
+export function dataScope(data) {
+ return request({
+ url: 'backendApi/duty/dataScope',
+ method: 'post',
+ data: data
+ })
+}
+
+// 角色状态修改
+export function changeRoleStatus(roleId, status) {
+ const data = {
+ roleId,
+ status
+ }
+ return request({
+ url: 'backendApi/duty/changeStatus',
+ method: 'post',
+ data: data
+ })
+}
+
+// 删除角色
+export function delRole(roleId) {
+ return request({
+ url: 'backendApi/duty/delete/' + roleId,
+ method: 'post'
+ })
+}
+
+// 查询角色已授权用户列表
+export function getRoleUserList(query) {
+ return request({
+ url: 'backendApi/duty/getRoleUserList',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询角色未授权用户列表
+export function unallocatedUserList(query) {
+ return request({
+ url: 'backendApi/duty/authUser/unallocatedList',
+ method: 'get',
+ params: query
+ })
+}
+
+// 取消用户授权角色
+export function authUserCancel(data) {
+ return request({
+ url: 'backendApi/duty/authUser/cancel',
+ method: 'post',
+ data: data
+ })
+}
+
+// 批量取消用户授权角色
+export function authUserCancelAll(data) {
+ return request({
+ url: 'backendApi/duty/authUser/cancelAll',
+ method: 'post',
+ params: data
+ })
+}
+
+// 授权用户选择
+export function authUserSelectAll(data) {
+ return request({
+ url: 'backendApi/duty/authUser/selectAll',
+ method: 'post',
+ params: data
+ })
+}
diff --git a/fuintAdmin/src/api/tool/gen.js b/fuintAdmin/src/api/tool/gen.js
new file mode 100644
index 0000000..4506927
--- /dev/null
+++ b/fuintAdmin/src/api/tool/gen.js
@@ -0,0 +1,76 @@
+import request from '@/utils/request'
+
+// 查询生成表数据
+export function listTable(query) {
+ return request({
+ url: '/tool/gen/list',
+ method: 'get',
+ params: query
+ })
+}
+// 查询db数据库列表
+export function listDbTable(query) {
+ return request({
+ url: '/tool/gen/db/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询表详细信息
+export function getGenTable(tableId) {
+ return request({
+ url: '/tool/gen/' + tableId,
+ method: 'get'
+ })
+}
+
+// 修改代码生成信息
+export function updateGenTable(data) {
+ return request({
+ url: '/tool/gen',
+ method: 'put',
+ data: data
+ })
+}
+
+// 导入表
+export function importTable(data) {
+ return request({
+ url: '/tool/gen/importTable',
+ method: 'post',
+ params: data
+ })
+}
+
+// 预览生成代码
+export function previewTable(tableId) {
+ return request({
+ url: '/tool/gen/preview/' + tableId,
+ method: 'get'
+ })
+}
+
+// 删除表数据
+export function delTable(tableId) {
+ return request({
+ url: '/tool/gen/' + tableId,
+ method: 'delete'
+ })
+}
+
+// 生成代码(自定义路径)
+export function genCode(tableName) {
+ return request({
+ url: '/tool/gen/genCode/' + tableName,
+ method: 'get'
+ })
+}
+
+// 同步数据库
+export function synchDb(tableName) {
+ return request({
+ url: '/tool/gen/synchDb/' + tableName,
+ method: 'get'
+ })
+}
diff --git a/fuintAdmin/src/api/userGrade.js b/fuintAdmin/src/api/userGrade.js
new file mode 100644
index 0000000..0f0b64d
--- /dev/null
+++ b/fuintAdmin/src/api/userGrade.js
@@ -0,0 +1,48 @@
+import request from '@/utils/request'
+
+// 分页查询会员等级列表
+export function getUserGradeList(query) {
+ return request({
+ url: 'backendApi/userGrade/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询等级信息
+export function getUserGradeInfo(memberId) {
+ return request({
+ url: 'backendApi/userGrade/info/' + memberId,
+ method: 'get'
+ })
+}
+
+// 更新状态
+export function updateUserGradeStatus(userGradeId, status) {
+ const data = {
+ userGradeId,
+ status
+ }
+ return request({
+ url: 'backendApi/userGrade/updateStatus',
+ method: 'post',
+ data: data
+ })
+}
+
+// 删除会员等级信息
+export function deleteUserGrade(gradeId) {
+ return request({
+ url: 'backendApi/userGrade/delete/' + gradeId,
+ method: 'get'
+ })
+}
+
+// 保存数据
+export function saveUserGrade(data) {
+ return request({
+ url: 'backendApi/userGrade/save',
+ method: 'post',
+ data: data
+ })
+}
diff --git a/fuintAdmin/src/assets/401_images/401.gif b/fuintAdmin/src/assets/401_images/401.gif
new file mode 100644
index 0000000..cd6e0d9
Binary files /dev/null and b/fuintAdmin/src/assets/401_images/401.gif differ
diff --git a/fuintAdmin/src/assets/404_images/404.png b/fuintAdmin/src/assets/404_images/404.png
new file mode 100644
index 0000000..3d8e230
Binary files /dev/null and b/fuintAdmin/src/assets/404_images/404.png differ
diff --git a/fuintAdmin/src/assets/404_images/404_cloud.png b/fuintAdmin/src/assets/404_images/404_cloud.png
new file mode 100644
index 0000000..c6281d0
Binary files /dev/null and b/fuintAdmin/src/assets/404_images/404_cloud.png differ
diff --git a/fuintAdmin/src/assets/icons/index.js b/fuintAdmin/src/assets/icons/index.js
new file mode 100644
index 0000000..2c6b309
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/index.js
@@ -0,0 +1,9 @@
+import Vue from 'vue'
+import SvgIcon from '@/components/SvgIcon'// svg component
+
+// register globally
+Vue.component('svg-icon', SvgIcon)
+
+const req = require.context('./svg', false, /\.svg$/)
+const requireAll = requireContext => requireContext.keys().map(requireContext)
+requireAll(req)
diff --git a/fuintAdmin/src/assets/icons/svg/404.svg b/fuintAdmin/src/assets/icons/svg/404.svg
new file mode 100644
index 0000000..6df5019
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/404.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/bug.svg b/fuintAdmin/src/assets/icons/svg/bug.svg
new file mode 100644
index 0000000..05a150d
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/bug.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/build.svg b/fuintAdmin/src/assets/icons/svg/build.svg
new file mode 100644
index 0000000..97c4688
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/build.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/button.svg b/fuintAdmin/src/assets/icons/svg/button.svg
new file mode 100644
index 0000000..904fddc
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/button.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/cascader.svg b/fuintAdmin/src/assets/icons/svg/cascader.svg
new file mode 100644
index 0000000..e256024
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/cascader.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/chart.svg b/fuintAdmin/src/assets/icons/svg/chart.svg
new file mode 100644
index 0000000..27728fb
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/chart.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/checkbox.svg b/fuintAdmin/src/assets/icons/svg/checkbox.svg
new file mode 100644
index 0000000..013fd3a
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/checkbox.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/clipboard.svg b/fuintAdmin/src/assets/icons/svg/clipboard.svg
new file mode 100644
index 0000000..90923ff
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/clipboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/code.svg b/fuintAdmin/src/assets/icons/svg/code.svg
new file mode 100644
index 0000000..ed4d23c
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/code.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/color.svg b/fuintAdmin/src/assets/icons/svg/color.svg
new file mode 100644
index 0000000..44a81aa
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/color.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/component.svg b/fuintAdmin/src/assets/icons/svg/component.svg
new file mode 100644
index 0000000..29c3458
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/component.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/dashboard.svg b/fuintAdmin/src/assets/icons/svg/dashboard.svg
new file mode 100644
index 0000000..5317d37
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/dashboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/date-range.svg b/fuintAdmin/src/assets/icons/svg/date-range.svg
new file mode 100644
index 0000000..fda571e
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/date-range.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/date.svg b/fuintAdmin/src/assets/icons/svg/date.svg
new file mode 100644
index 0000000..52dc73e
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/date.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/dict.svg b/fuintAdmin/src/assets/icons/svg/dict.svg
new file mode 100644
index 0000000..4849377
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/dict.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/documentation.svg b/fuintAdmin/src/assets/icons/svg/documentation.svg
new file mode 100644
index 0000000..7043122
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/documentation.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/download.svg b/fuintAdmin/src/assets/icons/svg/download.svg
new file mode 100644
index 0000000..c896951
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/download.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/drag.svg b/fuintAdmin/src/assets/icons/svg/drag.svg
new file mode 100644
index 0000000..4185d3c
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/drag.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/druid.svg b/fuintAdmin/src/assets/icons/svg/druid.svg
new file mode 100644
index 0000000..a2b4b4e
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/druid.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/edit.svg b/fuintAdmin/src/assets/icons/svg/edit.svg
new file mode 100644
index 0000000..d26101f
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/edit.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/education.svg b/fuintAdmin/src/assets/icons/svg/education.svg
new file mode 100644
index 0000000..7bfb01d
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/education.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/email.svg b/fuintAdmin/src/assets/icons/svg/email.svg
new file mode 100644
index 0000000..74d25e2
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/email.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/example.svg b/fuintAdmin/src/assets/icons/svg/example.svg
new file mode 100644
index 0000000..46f42b5
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/example.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/excel.svg b/fuintAdmin/src/assets/icons/svg/excel.svg
new file mode 100644
index 0000000..74d97b8
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/excel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/exit-fullscreen.svg b/fuintAdmin/src/assets/icons/svg/exit-fullscreen.svg
new file mode 100644
index 0000000..485c128
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/exit-fullscreen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/eye-open.svg b/fuintAdmin/src/assets/icons/svg/eye-open.svg
new file mode 100644
index 0000000..88dcc98
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/eye-open.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/eye.svg b/fuintAdmin/src/assets/icons/svg/eye.svg
new file mode 100644
index 0000000..16ed2d8
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/eye.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/form.svg b/fuintAdmin/src/assets/icons/svg/form.svg
new file mode 100644
index 0000000..dcbaa18
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/form.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/fullscreen.svg b/fuintAdmin/src/assets/icons/svg/fullscreen.svg
new file mode 100644
index 0000000..0e86b6f
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/fullscreen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/github.svg b/fuintAdmin/src/assets/icons/svg/github.svg
new file mode 100644
index 0000000..db0a0d4
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/github.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/guide.svg b/fuintAdmin/src/assets/icons/svg/guide.svg
new file mode 100644
index 0000000..b271001
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/guide.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/icon.svg b/fuintAdmin/src/assets/icons/svg/icon.svg
new file mode 100644
index 0000000..82be8ee
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/input.svg b/fuintAdmin/src/assets/icons/svg/input.svg
new file mode 100644
index 0000000..ab91381
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/input.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/international.svg b/fuintAdmin/src/assets/icons/svg/international.svg
new file mode 100644
index 0000000..e9b56ee
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/international.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/job.svg b/fuintAdmin/src/assets/icons/svg/job.svg
new file mode 100644
index 0000000..2a93a25
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/job.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/language.svg b/fuintAdmin/src/assets/icons/svg/language.svg
new file mode 100644
index 0000000..0082b57
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/language.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/link.svg b/fuintAdmin/src/assets/icons/svg/link.svg
new file mode 100644
index 0000000..48197ba
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/link.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/list.svg b/fuintAdmin/src/assets/icons/svg/list.svg
new file mode 100644
index 0000000..20259ed
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/list.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/lock.svg b/fuintAdmin/src/assets/icons/svg/lock.svg
new file mode 100644
index 0000000..74fee54
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/lock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/log.svg b/fuintAdmin/src/assets/icons/svg/log.svg
new file mode 100644
index 0000000..d879d33
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/log.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/logininfor.svg b/fuintAdmin/src/assets/icons/svg/logininfor.svg
new file mode 100644
index 0000000..267f844
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/logininfor.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/message.svg b/fuintAdmin/src/assets/icons/svg/message.svg
new file mode 100644
index 0000000..14ca817
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/message.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/money.svg b/fuintAdmin/src/assets/icons/svg/money.svg
new file mode 100644
index 0000000..c1580de
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/money.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/monitor.svg b/fuintAdmin/src/assets/icons/svg/monitor.svg
new file mode 100644
index 0000000..bc308cb
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/monitor.svg
@@ -0,0 +1,2 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/nested.svg b/fuintAdmin/src/assets/icons/svg/nested.svg
new file mode 100644
index 0000000..06713a8
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/nested.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/number.svg b/fuintAdmin/src/assets/icons/svg/number.svg
new file mode 100644
index 0000000..ad5ce9a
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/number.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/online.svg b/fuintAdmin/src/assets/icons/svg/online.svg
new file mode 100644
index 0000000..330a202
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/online.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/password.svg b/fuintAdmin/src/assets/icons/svg/password.svg
new file mode 100644
index 0000000..6c64def
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/password.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/pdf.svg b/fuintAdmin/src/assets/icons/svg/pdf.svg
new file mode 100644
index 0000000..957aa0c
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/pdf.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/people.svg b/fuintAdmin/src/assets/icons/svg/people.svg
new file mode 100644
index 0000000..2bd54ae
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/people.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/peoples.svg b/fuintAdmin/src/assets/icons/svg/peoples.svg
new file mode 100644
index 0000000..aab852e
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/peoples.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/phone.svg b/fuintAdmin/src/assets/icons/svg/phone.svg
new file mode 100644
index 0000000..ab8e8c4
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/phone.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/post.svg b/fuintAdmin/src/assets/icons/svg/post.svg
new file mode 100644
index 0000000..2922c61
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/post.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/qq.svg b/fuintAdmin/src/assets/icons/svg/qq.svg
new file mode 100644
index 0000000..ee13d4e
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/qq.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/question.svg b/fuintAdmin/src/assets/icons/svg/question.svg
new file mode 100644
index 0000000..cf75bd4
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/question.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/radio.svg b/fuintAdmin/src/assets/icons/svg/radio.svg
new file mode 100644
index 0000000..0cde345
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/radio.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/rate.svg b/fuintAdmin/src/assets/icons/svg/rate.svg
new file mode 100644
index 0000000..aa3b14d
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/rate.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/redis.svg b/fuintAdmin/src/assets/icons/svg/redis.svg
new file mode 100644
index 0000000..2f1d62d
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/redis.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/row.svg b/fuintAdmin/src/assets/icons/svg/row.svg
new file mode 100644
index 0000000..0780992
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/row.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/search.svg b/fuintAdmin/src/assets/icons/svg/search.svg
new file mode 100644
index 0000000..84233dd
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/search.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/select.svg b/fuintAdmin/src/assets/icons/svg/select.svg
new file mode 100644
index 0000000..d628382
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/select.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/server.svg b/fuintAdmin/src/assets/icons/svg/server.svg
new file mode 100644
index 0000000..ca37b00
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/server.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/shopping.svg b/fuintAdmin/src/assets/icons/svg/shopping.svg
new file mode 100644
index 0000000..87513e7
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/shopping.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/size.svg b/fuintAdmin/src/assets/icons/svg/size.svg
new file mode 100644
index 0000000..ddb25b8
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/size.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/skill.svg b/fuintAdmin/src/assets/icons/svg/skill.svg
new file mode 100644
index 0000000..a3b7312
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/skill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/slider.svg b/fuintAdmin/src/assets/icons/svg/slider.svg
new file mode 100644
index 0000000..fbe4f39
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/slider.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/star.svg b/fuintAdmin/src/assets/icons/svg/star.svg
new file mode 100644
index 0000000..6cf86e6
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/star.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/swagger.svg b/fuintAdmin/src/assets/icons/svg/swagger.svg
new file mode 100644
index 0000000..05d4e7b
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/swagger.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/switch.svg b/fuintAdmin/src/assets/icons/svg/switch.svg
new file mode 100644
index 0000000..0ba61e3
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/switch.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/system.svg b/fuintAdmin/src/assets/icons/svg/system.svg
new file mode 100644
index 0000000..dba28cf
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/system.svg
@@ -0,0 +1,2 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/tab.svg b/fuintAdmin/src/assets/icons/svg/tab.svg
new file mode 100644
index 0000000..b4b48e4
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/tab.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/table.svg b/fuintAdmin/src/assets/icons/svg/table.svg
new file mode 100644
index 0000000..0e3dc9d
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/table.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/textarea.svg b/fuintAdmin/src/assets/icons/svg/textarea.svg
new file mode 100644
index 0000000..2709f29
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/textarea.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/theme.svg b/fuintAdmin/src/assets/icons/svg/theme.svg
new file mode 100644
index 0000000..5982a2f
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/theme.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/time-range.svg b/fuintAdmin/src/assets/icons/svg/time-range.svg
new file mode 100644
index 0000000..13c1202
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/time-range.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/time.svg b/fuintAdmin/src/assets/icons/svg/time.svg
new file mode 100644
index 0000000..b376e32
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/time.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/tool.svg b/fuintAdmin/src/assets/icons/svg/tool.svg
new file mode 100644
index 0000000..c813067
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/tool.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/tree-table.svg b/fuintAdmin/src/assets/icons/svg/tree-table.svg
new file mode 100644
index 0000000..8aafdb8
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/tree-table.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/tree.svg b/fuintAdmin/src/assets/icons/svg/tree.svg
new file mode 100644
index 0000000..dd4b7dd
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/tree.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/upload.svg b/fuintAdmin/src/assets/icons/svg/upload.svg
new file mode 100644
index 0000000..bae49c0
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/upload.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/user.svg b/fuintAdmin/src/assets/icons/svg/user.svg
new file mode 100644
index 0000000..0ba0716
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/user.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/validCode.svg b/fuintAdmin/src/assets/icons/svg/validCode.svg
new file mode 100644
index 0000000..cfb1021
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/validCode.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/wechat.svg b/fuintAdmin/src/assets/icons/svg/wechat.svg
new file mode 100644
index 0000000..c586e55
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/wechat.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svg/zip.svg b/fuintAdmin/src/assets/icons/svg/zip.svg
new file mode 100644
index 0000000..f806fc4
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svg/zip.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/icons/svgo.yml b/fuintAdmin/src/assets/icons/svgo.yml
new file mode 100644
index 0000000..d11906a
--- /dev/null
+++ b/fuintAdmin/src/assets/icons/svgo.yml
@@ -0,0 +1,22 @@
+# replace default config
+
+# multipass: true
+# full: true
+
+plugins:
+
+ # - name
+ #
+ # or:
+ # - name: false
+ # - name: true
+ #
+ # or:
+ # - name:
+ # param1: 1
+ # param2: 2
+
+- removeAttrs:
+ attrs:
+ - 'fill'
+ - 'fill-rule'
diff --git a/fuintAdmin/src/assets/images/all-cate.svg b/fuintAdmin/src/assets/images/all-cate.svg
new file mode 100644
index 0000000..ff281ed
--- /dev/null
+++ b/fuintAdmin/src/assets/images/all-cate.svg
@@ -0,0 +1,2 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/images/avatar.png b/fuintAdmin/src/assets/images/avatar.png
new file mode 100644
index 0000000..cc951fb
Binary files /dev/null and b/fuintAdmin/src/assets/images/avatar.png differ
diff --git a/fuintAdmin/src/assets/images/cashier.png b/fuintAdmin/src/assets/images/cashier.png
new file mode 100644
index 0000000..2f45e4a
Binary files /dev/null and b/fuintAdmin/src/assets/images/cashier.png differ
diff --git a/fuintAdmin/src/assets/images/cashier.svg b/fuintAdmin/src/assets/images/cashier.svg
new file mode 100644
index 0000000..5144284
--- /dev/null
+++ b/fuintAdmin/src/assets/images/cashier.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/images/dark.svg b/fuintAdmin/src/assets/images/dark.svg
new file mode 100644
index 0000000..f646bd7
--- /dev/null
+++ b/fuintAdmin/src/assets/images/dark.svg
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/images/goods.png b/fuintAdmin/src/assets/images/goods.png
new file mode 100644
index 0000000..e226ba7
Binary files /dev/null and b/fuintAdmin/src/assets/images/goods.png differ
diff --git a/fuintAdmin/src/assets/images/home/card.png b/fuintAdmin/src/assets/images/home/card.png
new file mode 100644
index 0000000..96371bf
Binary files /dev/null and b/fuintAdmin/src/assets/images/home/card.png differ
diff --git a/fuintAdmin/src/assets/images/home/coupon.png b/fuintAdmin/src/assets/images/home/coupon.png
new file mode 100644
index 0000000..c282eb2
Binary files /dev/null and b/fuintAdmin/src/assets/images/home/coupon.png differ
diff --git a/fuintAdmin/src/assets/images/home/goods.png b/fuintAdmin/src/assets/images/home/goods.png
new file mode 100644
index 0000000..8a2844d
Binary files /dev/null and b/fuintAdmin/src/assets/images/home/goods.png differ
diff --git a/fuintAdmin/src/assets/images/home/member.png b/fuintAdmin/src/assets/images/home/member.png
new file mode 100644
index 0000000..f198c38
Binary files /dev/null and b/fuintAdmin/src/assets/images/home/member.png differ
diff --git a/fuintAdmin/src/assets/images/home/order.png b/fuintAdmin/src/assets/images/home/order.png
new file mode 100644
index 0000000..c5a3340
Binary files /dev/null and b/fuintAdmin/src/assets/images/home/order.png differ
diff --git a/fuintAdmin/src/assets/images/home/pay.png b/fuintAdmin/src/assets/images/home/pay.png
new file mode 100644
index 0000000..b9cb819
Binary files /dev/null and b/fuintAdmin/src/assets/images/home/pay.png differ
diff --git a/fuintAdmin/src/assets/images/hot.png b/fuintAdmin/src/assets/images/hot.png
new file mode 100644
index 0000000..164072f
Binary files /dev/null and b/fuintAdmin/src/assets/images/hot.png differ
diff --git a/fuintAdmin/src/assets/images/icon-cart.svg b/fuintAdmin/src/assets/images/icon-cart.svg
new file mode 100644
index 0000000..65c2eb9
--- /dev/null
+++ b/fuintAdmin/src/assets/images/icon-cart.svg
@@ -0,0 +1,2 @@
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/images/life.png b/fuintAdmin/src/assets/images/life.png
new file mode 100644
index 0000000..1d04c05
Binary files /dev/null and b/fuintAdmin/src/assets/images/life.png differ
diff --git a/fuintAdmin/src/assets/images/light.svg b/fuintAdmin/src/assets/images/light.svg
new file mode 100644
index 0000000..ab7cc08
--- /dev/null
+++ b/fuintAdmin/src/assets/images/light.svg
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/fuintAdmin/src/assets/images/login-bg.png b/fuintAdmin/src/assets/images/login-bg.png
new file mode 100644
index 0000000..9f1e494
Binary files /dev/null and b/fuintAdmin/src/assets/images/login-bg.png differ
diff --git a/fuintAdmin/src/assets/images/love.png b/fuintAdmin/src/assets/images/love.png
new file mode 100644
index 0000000..6de11fe
Binary files /dev/null and b/fuintAdmin/src/assets/images/love.png differ
diff --git a/fuintAdmin/src/assets/images/office.png b/fuintAdmin/src/assets/images/office.png
new file mode 100644
index 0000000..d569f0d
Binary files /dev/null and b/fuintAdmin/src/assets/images/office.png differ
diff --git a/fuintAdmin/src/assets/images/order.png b/fuintAdmin/src/assets/images/order.png
new file mode 100644
index 0000000..9de8744
Binary files /dev/null and b/fuintAdmin/src/assets/images/order.png differ
diff --git a/fuintAdmin/src/assets/logo/logo.png b/fuintAdmin/src/assets/logo/logo.png
new file mode 100644
index 0000000..36d00d3
Binary files /dev/null and b/fuintAdmin/src/assets/logo/logo.png differ
diff --git a/fuintAdmin/src/assets/styles/btn.scss b/fuintAdmin/src/assets/styles/btn.scss
new file mode 100644
index 0000000..e6ba1a8
--- /dev/null
+++ b/fuintAdmin/src/assets/styles/btn.scss
@@ -0,0 +1,99 @@
+@import './variables.scss';
+
+@mixin colorBtn($color) {
+ background: $color;
+
+ &:hover {
+ color: $color;
+
+ &:before,
+ &:after {
+ background: $color;
+ }
+ }
+}
+
+.blue-btn {
+ @include colorBtn($blue)
+}
+
+.light-blue-btn {
+ @include colorBtn($light-blue)
+}
+
+.red-btn {
+ @include colorBtn($red)
+}
+
+.pink-btn {
+ @include colorBtn($pink)
+}
+
+.green-btn {
+ @include colorBtn($green)
+}
+
+.tiffany-btn {
+ @include colorBtn($tiffany)
+}
+
+.yellow-btn {
+ @include colorBtn($yellow)
+}
+
+.pan-btn {
+ font-size: 14px;
+ color: #fff;
+ padding: 14px 36px;
+ border-radius: 8px;
+ border: none;
+ outline: none;
+ transition: 600ms ease all;
+ position: relative;
+ display: inline-block;
+
+ &:hover {
+ background: #fff;
+
+ &:before,
+ &:after {
+ width: 100%;
+ transition: 600ms ease all;
+ }
+ }
+
+ &:before,
+ &:after {
+ content: '';
+ position: absolute;
+ top: 0;
+ right: 0;
+ height: 2px;
+ width: 0;
+ transition: 400ms ease all;
+ }
+
+ &::after {
+ right: inherit;
+ top: inherit;
+ left: 0;
+ bottom: 0;
+ }
+}
+
+.custom-button {
+ display: inline-block;
+ line-height: 1;
+ white-space: nowrap;
+ cursor: pointer;
+ background: #fff;
+ color: #fff;
+ -webkit-appearance: none;
+ text-align: center;
+ box-sizing: border-box;
+ outline: 0;
+ margin: 0;
+ padding: 10px 15px;
+ font-size: 14px;
+ border-radius: 4px;
+}
diff --git a/fuintAdmin/src/assets/styles/element-ui.scss b/fuintAdmin/src/assets/styles/element-ui.scss
new file mode 100644
index 0000000..ccfdd3a
--- /dev/null
+++ b/fuintAdmin/src/assets/styles/element-ui.scss
@@ -0,0 +1,116 @@
+// cover some element-ui styles
+
+.el-breadcrumb__inner,
+.el-breadcrumb__inner a {
+ font-weight: 400 !important;
+}
+
+.el-upload {
+ input[type="file"] {
+ display: none !important;
+ }
+}
+
+.el-upload__input {
+ display: none;
+}
+
+.cell {
+ .el-tag {
+ margin-right: 0px;
+ }
+}
+
+.small-padding {
+ .cell {
+ padding-left: 5px;
+ padding-right: 5px;
+ }
+}
+
+.fixed-width {
+ .el-button--mini {
+ padding: 7px 10px;
+ width: 60px;
+ }
+}
+
+.status-col {
+ .cell {
+ padding: 0 10px;
+ text-align: center;
+
+ .el-tag {
+ margin-right: 0px;
+ }
+ }
+}
+
+// to fixed https://github.com/ElemeFE/element/issues/2461
+.el-dialog {
+ transform: none;
+ left: 0;
+ position: relative;
+ margin: 0 auto;
+}
+
+// refine element ui upload
+.upload-container {
+ .el-upload {
+ width: 100%;
+
+ .el-upload-dragger {
+ width: 100%;
+ height: 200px;
+ }
+ }
+}
+
+// dropdown
+.el-dropdown-menu {
+ a {
+ display: block
+ }
+}
+
+// fix date-picker ui bug in filter-item
+.el-range-editor.el-input__inner {
+ display: inline-flex !important;
+}
+
+// to fix el-date-picker css style
+.el-range-separator {
+ box-sizing: content-box;
+}
+
+.el-menu--collapse
+ > div
+ > .el-submenu
+ > .el-submenu__title
+ .el-submenu__icon-arrow {
+ display: none;
+}
+
+.common-dialog {
+ .el-dialog {
+ border: solid 6px #00acac;
+ }
+ .el-dialog__header{
+ background: #00acac;
+ padding: 10px;
+ }
+ .el-dialog__headerbtn {
+ top: 15px;
+ }
+ .el-dialog__body {
+ padding: 30px;
+ }
+ .el-dialog__title,.el-dialog__close{
+ color: #fff;
+ font-size: 14px;
+ }
+ .el-dialog__title,.el-dialog__close:hover{
+ color: #fff;
+ font-weight: bold;
+ }
+}
diff --git a/fuintAdmin/src/assets/styles/element-variables.scss b/fuintAdmin/src/assets/styles/element-variables.scss
new file mode 100644
index 0000000..3ae7d05
--- /dev/null
+++ b/fuintAdmin/src/assets/styles/element-variables.scss
@@ -0,0 +1,31 @@
+/**
+* I think element-ui's default theme color is too light for long-term use.
+* So I modified the default color and you can modify it to your liking.
+**/
+
+/* theme color */
+$--color-primary: #00acac;
+$--color-success: #13ce66;
+$--color-warning: #ffba00;
+$--color-danger: #ff4949;
+// $--color-info: #1E1E1E;
+
+$--button-font-weight: 400;
+
+// $--color-text-regular: #1f2d3d;
+
+$--border-color-light: #dfe4ed;
+$--border-color-lighter: #e6ebf5;
+
+$--table-border:1px solid #dfe6ec;
+
+/* icon font path, required */
+$--font-path: '~element-ui/lib/theme-chalk/fonts';
+
+@import "~element-ui/packages/theme-chalk/src/index";
+
+// the :export directive is the magic sauce for webpack
+// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
+:export {
+ theme: $--color-primary;
+}
diff --git a/fuintAdmin/src/assets/styles/fuint.scss b/fuintAdmin/src/assets/styles/fuint.scss
new file mode 100644
index 0000000..cdf2b55
--- /dev/null
+++ b/fuintAdmin/src/assets/styles/fuint.scss
@@ -0,0 +1,404 @@
+ /**
+ * 通用css样式布局处理
+ * Copyright (c) 2022 https://www.baidu.com
+ */
+ /** 基础通用 **/
+.pt5 {
+ padding-top: 5px;
+}
+.pr5 {
+ padding-right: 5px;
+}
+.pb5 {
+ padding-bottom: 5px;
+}
+.mt5 {
+ margin-top: 5px;
+}
+.mr5 {
+ margin-right: 5px;
+}
+.mb5 {
+ margin-bottom: 5px;
+}
+.mb8 {
+ margin-bottom: 8px;
+}
+.ml5 {
+ margin-left: 5px;
+}
+.mt10 {
+ margin-top: 10px;
+}
+.mr10 {
+ margin-right: 10px;
+}
+.mb10 {
+ margin-bottom: 10px;
+}
+.ml10 {
+ margin-left: 10px;
+}
+.mt20 {
+ margin-top: 20px;
+}
+.mr20 {
+ margin-right: 20px;
+}
+.mb20 {
+ margin-bottom: 20px;
+}
+.ml20 {
+ margin-left: 20px;
+}
+.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 {
+ font-family: inherit;
+ font-weight: 500;
+ line-height: 1.1;
+ color: inherit;
+}
+.main-panel {
+ border: solid 1px #ccc;
+ padding: 25px 10px 20px 10px;
+ .input {
+ width: 450px;
+ }
+ .min-input {
+ width: 240px;
+ }
+ .el-upload {
+ width: 80px;
+ height: 80px;
+ line-height: 88px;
+ }
+ .el-upload-list__item {
+ width: 80px;
+ height: 80px;
+ }
+ .footer {
+ margin-left: 80px;
+ }
+}
+.el-dialog:not(.is-fullscreen) {
+ margin-top: 6vh !important;
+}
+.el-dialog__wrapper.scrollbar .el-dialog .el-dialog__body {
+ overflow: auto;
+ overflow-x: hidden;
+ max-height: 70vh;
+ padding: 10px 20px 0;
+}
+.el-table {
+ .el-table__header-wrapper, .el-table__fixed-header-wrapper {
+ th {
+ word-break: break-word;
+ background-color: #f8f8f9;
+ color: #515a6e;
+ height: 40px;
+ font-size: 13px;
+ }
+ }
+ .el-table__body-wrapper {
+ .el-button [class*="el-icon-"] + span {
+ margin-left: 1px;
+ }
+ }
+}
+
+/** 表单布局 **/
+.form-header {
+ font-size:15px;
+ color:#6379bb;
+ border-bottom:1px solid #ddd;
+ margin:8px 10px 25px 10px;
+ padding-bottom:5px
+}
+
+/** 表单提示 **/
+.form-tips {
+ font-size: 12px;
+ color: #888;
+ height: 12px;
+ padding-left: 5px;
+ line-height: 12px;
+ margin-top: 5px;
+}
+
+/** 表格布局 **/
+.pagination-container {
+ position: relative;
+ height: 25px;
+ margin-bottom: 10px;
+ margin-top: 15px;
+ padding: 10px 20px !important;
+}
+
+/* tree border */
+.tree-border {
+ margin-top: 5px;
+ border: 1px solid #e5e6e7;
+ background: #FFFFFF none;
+ border-radius:4px;
+}
+
+.pagination-container .el-pagination {
+ right: 0;
+ position: absolute;
+}
+
+@media ( max-width : 768px) {
+ .pagination-container .el-pagination > .el-pagination__jump {
+ display: none !important;
+ }
+ .pagination-container .el-pagination > .el-pagination__sizes {
+ display: none !important;
+ }
+}
+
+.el-table .fixed-width .el-button--mini {
+ padding-left: 0;
+ padding-right: 0;
+ width: inherit;
+}
+
+/** 表格更多操作下拉样式 */
+.el-table .el-dropdown-link {
+ cursor: pointer;
+ color: #00acac;
+ margin-left: 5px;
+}
+
+.el-table .el-dropdown, .el-icon-arrow-down {
+ font-size: 12px;
+}
+
+.el-tree-node__content > .el-checkbox {
+ margin-right: 8px;
+}
+
+.list-group-striped > .list-group-item {
+ border-left: 0;
+ border-right: 0;
+ border-radius: 0;
+ padding-left: 0;
+ padding-right: 0;
+}
+
+.list-group {
+ padding-left: 0px;
+ list-style: none;
+}
+
+.list-group-item {
+ border-bottom: 1px solid #e7eaec;
+ border-top: 1px solid #e7eaec;
+ margin-bottom: -1px;
+ padding: 11px 0px;
+ font-size: 13px;
+}
+
+.pull-right {
+ float: right !important;
+}
+
+.el-card__header {
+ padding: 14px 15px 7px;
+ min-height: 40px;
+}
+
+.el-card__body {
+ padding: 15px 20px 20px 20px;
+}
+
+.card-box {
+ padding-right: 15px;
+ padding-left: 15px;
+ margin-bottom: 10px;
+}
+
+/* button color */
+.el-button--cyan.is-active,
+.el-button--cyan:active {
+ background: #20B2AA;
+ border-color: #20B2AA;
+ color: #FFFFFF;
+}
+
+.el-button--cyan:focus,
+.el-button--cyan:hover {
+ background: #48D1CC;
+ border-color: #48D1CC;
+ color: #FFFFFF;
+}
+
+.el-button--cyan {
+ background-color: #20B2AA;
+ border-color: #20B2AA;
+ color: #FFFFFF;
+}
+
+/* text color */
+.text-navy {
+ color: #1ab394;
+}
+
+.text-primary {
+ color: inherit;
+}
+
+.text-success {
+ color: #00acac;
+}
+
+.text-info {
+ color: #23c6c8;
+}
+
+.text-warning {
+ color: #f8ac59;
+}
+
+.text-danger {
+ color: #ed5565;
+}
+
+.text-muted {
+ color: #888888;
+}
+
+/* image */
+.img-circle {
+ border-radius: 50%;
+}
+
+.img-lg {
+ width: 120px;
+ height: 120px;
+}
+
+.avatar-upload-preview {
+ position: absolute;
+ top: 50%;
+ transform: translate(50%, -50%);
+ width: 200px;
+ height: 200px;
+ border-radius: 50%;
+ box-shadow: 0 0 4px #ccc;
+ overflow: hidden;
+}
+
+/* 拖拽列样式 */
+.sortable-ghost{
+ opacity: .8;
+ color: #fff!important;
+ background: #42b983!important;
+}
+
+.top-right-btn {
+ position: relative;
+ float: right;
+}
+.no-border {
+ border: none;
+}
+.list-img {
+ width: 58px;
+ height: 48px;
+ border-radius: 5px;
+ border: 1px solid #ccc;
+}
+.list-qr {
+ width: 70px;
+ height: 70px;
+ border-radius: 5px;
+ border: 1px solid #ccc;
+}
+.list-avatar {
+ width: 45px;
+ height: 45px;
+ border-radius: 30px;
+ border: 1px solid #ccc;
+ }
+.el-upload {
+ width: 150px;
+ height: 150px;
+ line-height: 150px;
+}
+.mini-btn {
+ padding: 4px 8px 4px 8px;
+}
+.status-active {
+ color: #52c41a;
+ background: #f6ffed;
+ border: #b7eb8f solid 1px;
+ border-radius: 20px;
+ display: block;
+ font-size: 90%;
+ text-align: center;
+}
+.status-disabled {
+ color: #f5222d;
+ background: #fff1f0;
+ border: #ffa39e solid 1px;
+ border-radius: 20px;
+ font-size: 90%;
+ display: block;
+ text-align: center;
+}
+.status-normal {
+ color: #666666;
+ background: #ffffff;
+ border: #666666 solid 1px;
+ border-radius: 20px;
+ display: block;
+ font-size: 90%;
+ text-align: center;
+ cursor: pointer;
+}
+.nav-icon {
+ cursor: pointer;
+}
+.nav-tool {
+ cursor: pointer;
+ text-align: center;
+ .icon {
+ margin-left: 10px;
+ margin-top: 6px;
+ width: 25px;
+ height: 25px;
+ clear: both;
+ display: block;
+ }
+ .name {
+ font-size: 12px;
+ clear: both;
+ padding: 0px;
+ margin: 0px;
+ line-height: 20px;
+ font-weight: bold;
+ }
+}
+.main-search {
+ background: #f5f5f5;
+ padding: 10px;
+ border-radius: 3px;
+ margin-bottom: 3px;
+ border: solid 1px #cccccc;
+}
+.dialog-qr {
+ text-align: center;
+ .qr-detail {
+ margin-bottom: 10px;
+ .title {
+ text-align: left;
+ font-weight: bold;
+ padding-left: 100px;
+ }
+ .qr-code {
+ margin: 0 auto;
+ width: 200px;
+ height: 210px;
+ border: solid 1px #ccc;
+ }
+ }
+}
diff --git a/fuintAdmin/src/assets/styles/index.scss b/fuintAdmin/src/assets/styles/index.scss
new file mode 100644
index 0000000..96095ef
--- /dev/null
+++ b/fuintAdmin/src/assets/styles/index.scss
@@ -0,0 +1,191 @@
+@import './variables.scss';
+@import './mixin.scss';
+@import './transition.scss';
+@import './element-ui.scss';
+@import './sidebar.scss';
+@import './btn.scss';
+
+body {
+ height: 100%;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-font-smoothing: antialiased;
+ text-rendering: optimizeLegibility;
+ font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
+}
+
+label {
+ font-weight: 700;
+}
+
+html {
+ height: 100%;
+ box-sizing: border-box;
+}
+
+#app {
+ height: 100%;
+}
+
+*,
+*:before,
+*:after {
+ box-sizing: inherit;
+}
+
+.no-padding {
+ padding: 0px !important;
+}
+
+.padding-content {
+ padding: 4px 0;
+}
+
+a:focus,
+a:active {
+ outline: none;
+}
+
+a,
+a:focus,
+a:hover {
+ cursor: pointer;
+ color: inherit;
+ text-decoration: none;
+}
+
+div:focus {
+ outline: none;
+}
+
+.fr {
+ float: right;
+}
+
+.fl {
+ float: left;
+}
+
+.pr-5 {
+ padding-right: 5px;
+}
+
+.pl-5 {
+ padding-left: 5px;
+}
+
+.block {
+ display: block;
+}
+
+.pointer {
+ cursor: pointer;
+}
+
+.inlineBlock {
+ display: block;
+}
+
+.clearfix {
+ &:after {
+ visibility: hidden;
+ display: block;
+ font-size: 0;
+ content: " ";
+ clear: both;
+ height: 0;
+ }
+}
+
+aside {
+ background: #eef1f6;
+ padding: 8px 24px;
+ margin-bottom: 20px;
+ border-radius: 2px;
+ display: block;
+ line-height: 32px;
+ font-size: 16px;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
+ color: #2c3e50;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+
+ a {
+ color: #337ab7;
+ cursor: pointer;
+
+ &:hover {
+ color: rgb(32, 160, 255);
+ }
+ }
+}
+
+//main-container全局样式
+.app-container {
+ padding: 20px;
+}
+
+.components-container {
+ margin: 30px 50px;
+ position: relative;
+}
+
+.pagination-container {
+ margin-top: 30px;
+}
+
+.text-center {
+ text-align: center
+}
+
+.sub-navbar {
+ height: 50px;
+ line-height: 50px;
+ position: relative;
+ width: 100%;
+ text-align: right;
+ padding-right: 20px;
+ transition: 600ms ease position;
+ background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%);
+
+ .subtitle {
+ font-size: 20px;
+ color: #fff;
+ }
+
+ &.draft {
+ background: #d0d0d0;
+ }
+
+ &.deleted {
+ background: #d0d0d0;
+ }
+}
+
+.link-type,
+.link-type:focus {
+ color: #337ab7;
+ cursor: pointer;
+
+ &:hover {
+ color: rgb(32, 160, 255);
+ }
+}
+
+.filter-container {
+ padding-bottom: 10px;
+
+ .filter-item {
+ display: inline-block;
+ vertical-align: middle;
+ margin-bottom: 10px;
+ }
+}
+
+//refine vue-multiselect plugin
+.multiselect {
+ line-height: 16px;
+}
+
+.multiselect--active {
+ z-index: 1000 !important;
+}
diff --git a/fuintAdmin/src/assets/styles/mixin.scss b/fuintAdmin/src/assets/styles/mixin.scss
new file mode 100644
index 0000000..06fa061
--- /dev/null
+++ b/fuintAdmin/src/assets/styles/mixin.scss
@@ -0,0 +1,66 @@
+@mixin clearfix {
+ &:after {
+ content: "";
+ display: table;
+ clear: both;
+ }
+}
+
+@mixin scrollBar {
+ &::-webkit-scrollbar-track-piece {
+ background: #d3dce6;
+ }
+
+ &::-webkit-scrollbar {
+ width: 6px;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background: #99a9bf;
+ border-radius: 20px;
+ }
+}
+
+@mixin relative {
+ position: relative;
+ width: 100%;
+ height: 100%;
+}
+
+@mixin pct($pct) {
+ width: #{$pct};
+ position: relative;
+ margin: 0 auto;
+}
+
+@mixin triangle($width, $height, $color, $direction) {
+ $width: $width/2;
+ $color-border-style: $height solid $color;
+ $transparent-border-style: $width solid transparent;
+ height: 0;
+ width: 0;
+
+ @if $direction==up {
+ border-bottom: $color-border-style;
+ border-left: $transparent-border-style;
+ border-right: $transparent-border-style;
+ }
+
+ @else if $direction==right {
+ border-left: $color-border-style;
+ border-top: $transparent-border-style;
+ border-bottom: $transparent-border-style;
+ }
+
+ @else if $direction==down {
+ border-top: $color-border-style;
+ border-left: $transparent-border-style;
+ border-right: $transparent-border-style;
+ }
+
+ @else if $direction==left {
+ border-right: $color-border-style;
+ border-top: $transparent-border-style;
+ border-bottom: $transparent-border-style;
+ }
+}
diff --git a/fuintAdmin/src/assets/styles/sidebar.scss b/fuintAdmin/src/assets/styles/sidebar.scss
new file mode 100644
index 0000000..f827d32
--- /dev/null
+++ b/fuintAdmin/src/assets/styles/sidebar.scss
@@ -0,0 +1,228 @@
+#app {
+
+ .main-container {
+ min-height: 100%;
+ transition: margin-left .28s;
+ margin-left: $base-sidebar-width;
+ position: relative;
+ }
+
+ .sidebarHide {
+ margin-left: 0!important;
+ }
+
+ .sidebar-container {
+ -webkit-transition: width .28s;
+ transition: width 0.28s;
+ width: $base-sidebar-width !important;
+ background-color: $base-menu-background;
+ height: 100%;
+ position: fixed;
+ font-size: 0px;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1001;
+ overflow: hidden;
+ -webkit-box-shadow: 2px 0 6px rgba(0,21,41,.35);
+ box-shadow: 2px 0 6px rgba(0,21,41,.35);
+ margin-bottom: 100px;
+ // reset element-ui css
+ .horizontal-collapse-transition {
+ transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out;
+ }
+
+ .scrollbar-wrapper {
+ overflow-x: hidden !important;
+ }
+
+ .el-scrollbar__bar.is-vertical {
+ right: 0px;
+ }
+
+ .el-scrollbar {
+ height: 100%;
+ }
+
+ &.has-logo {
+ .el-scrollbar {
+ height: calc(100% - 50px);
+ }
+ }
+
+ .is-horizontal {
+ display: none;
+ }
+
+ a {
+ display: inline-block;
+ width: 100%;
+ overflow: hidden;
+ }
+
+ .svg-icon {
+ margin-right: 16px;
+ }
+
+ .el-menu {
+ border: none;
+ height: 100%;
+ width: 100% !important;
+ }
+
+ .el-menu-item, .el-submenu__title {
+ overflow: hidden !important;
+ text-overflow: ellipsis !important;
+ white-space: nowrap !important;
+ height: 48px;
+ line-height: 48px;
+ }
+
+ // menu hover
+ .submenu-title-noDropdown,
+ .el-submenu__title {
+ &:hover {
+ background-color: rgba(0, 0, 0, 0.06) !important;
+ }
+ }
+
+ & .theme-dark .is-active > .el-submenu__title {
+ color: $base-menu-color-active !important;
+ }
+
+ & .nest-menu .el-submenu>.el-submenu__title,
+ & .el-submenu .el-menu-item {
+ min-width: $base-sidebar-width !important;
+ background: red;
+ &:hover {
+ background-color: rgba(0, 0, 0, 0.06) !important;
+ }
+ }
+
+ & .theme-dark .nest-menu .el-submenu>.el-submenu__title,
+ & .theme-dark .el-submenu .el-menu-item {
+ background-color: $base-sub-menu-background !important;
+
+ &:hover {
+ background-color: $base-sub-menu-hover !important;
+ }
+ }
+ }
+
+ .hideSidebar {
+ .sidebar-container {
+ width: 54px !important;
+ }
+
+ .main-container {
+ margin-left: 54px;
+ }
+
+ .submenu-title-noDropdown {
+ padding: 0 !important;
+ position: relative;
+ .el-tooltip {
+ padding: 0 !important;
+
+ .svg-icon {
+ margin-left: 20px;
+ }
+ }
+ }
+
+ .el-submenu {
+ overflow: hidden;
+
+ &>.el-submenu__title {
+ padding: 0 !important;
+
+ .svg-icon {
+ margin-left: 20px;
+ }
+
+ }
+ }
+
+ .el-menu--collapse {
+ .el-submenu {
+ &>.el-submenu__title {
+ &>span {
+ height: 0;
+ width: 0;
+ overflow: hidden;
+ visibility: hidden;
+ display: inline-block;
+ }
+ }
+ }
+ }
+ }
+
+ .el-menu--collapse .el-menu .el-submenu {
+ min-width: $base-sidebar-width !important;
+ }
+
+ // mobile responsive
+ .mobile {
+ .main-container {
+ margin-left: 0px;
+ }
+
+ .sidebar-container {
+ transition: transform .28s;
+ width: $base-sidebar-width !important;
+ }
+
+ &.hideSidebar {
+ .sidebar-container {
+ pointer-events: none;
+ transition-duration: 0.3s;
+ transform: translate3d(-$base-sidebar-width, 0, 0);
+ }
+ }
+ }
+
+ .withoutAnimation {
+
+ .main-container,
+ .sidebar-container {
+ transition: none;
+ }
+ }
+}
+
+// when menu collapsed
+.el-menu--vertical {
+ &>.el-menu {
+ .svg-icon {
+ margin-right: 16px;
+ }
+ }
+
+ .nest-menu .el-submenu>.el-submenu__title,
+ .el-menu-item {
+ &:hover {
+ // you can use $subMenuHover
+ background-color: rgba(0, 0, 0, 0.06) !important;
+ }
+ }
+
+ // the scroll bar appears when the subMenu is too long
+ >.el-menu--popup {
+ max-height: 100vh;
+ overflow-y: auto;
+
+ &::-webkit-scrollbar-track-piece {
+ background: #d3dce6;
+ }
+
+ &::-webkit-scrollbar {
+ width: 6px;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background: #99a9bf;
+ border-radius: 20px;
+ }
+ }
+}
diff --git a/fuintAdmin/src/assets/styles/transition.scss b/fuintAdmin/src/assets/styles/transition.scss
new file mode 100644
index 0000000..4cb27cc
--- /dev/null
+++ b/fuintAdmin/src/assets/styles/transition.scss
@@ -0,0 +1,48 @@
+// global transition css
+
+/* fade */
+.fade-enter-active,
+.fade-leave-active {
+ transition: opacity 0.28s;
+}
+
+.fade-enter,
+.fade-leave-active {
+ opacity: 0;
+}
+
+/* fade-transform */
+.fade-transform-leave-active,
+.fade-transform-enter-active {
+ transition: all .5s;
+}
+
+.fade-transform-enter {
+ opacity: 0;
+ transform: translateX(-30px);
+}
+
+.fade-transform-leave-to {
+ opacity: 0;
+ transform: translateX(30px);
+}
+
+/* breadcrumb transition */
+.breadcrumb-enter-active,
+.breadcrumb-leave-active {
+ transition: all .5s;
+}
+
+.breadcrumb-enter,
+.breadcrumb-leave-active {
+ opacity: 0;
+ transform: translateX(20px);
+}
+
+.breadcrumb-move {
+ transition: all .5s;
+}
+
+.breadcrumb-leave-active {
+ position: absolute;
+}
diff --git a/fuintAdmin/src/assets/styles/variables.scss b/fuintAdmin/src/assets/styles/variables.scss
new file mode 100644
index 0000000..fa32342
--- /dev/null
+++ b/fuintAdmin/src/assets/styles/variables.scss
@@ -0,0 +1,39 @@
+// base color
+$blue:#324157;
+$light-blue:#3A71A8;
+$red:#C03639;
+$pink: #E65D6E;
+$green: #30B08F;
+$tiffany: #4AB7BD;
+$yellow:#FEC171;
+$panGreen: #30B08F;
+
+// 默认菜单主题风格
+$base-menu-color:#bfcbd9;
+$base-menu-color-active:#f4f4f5;
+$base-menu-background:#304156;
+$base-logo-title-color: #ffffff;
+
+$base-menu-light-color:rgba(0,0,0,.70);
+$base-menu-light-background:#ffffff;
+$base-logo-light-title-color: #001529;
+
+$base-sub-menu-background:#1f2d3d;
+$base-sub-menu-hover:#001528;
+
+$base-sidebar-width: 200px;
+
+// the :export directive is the magic sauce for webpack
+// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
+:export {
+ menuColor: $base-menu-color;
+ menuLightColor: $base-menu-light-color;
+ menuColorActive: $base-menu-color-active;
+ menuBackground: $base-menu-background;
+ menuLightBackground: $base-menu-light-background;
+ subMenuBackground: $base-sub-menu-background;
+ subMenuHover: $base-sub-menu-hover;
+ sideBarWidth: $base-sidebar-width;
+ logoTitleColor: $base-logo-title-color;
+ logoLightTitleColor: $base-logo-light-title-color
+}
diff --git a/fuintAdmin/src/components/Breadcrumb/index.vue b/fuintAdmin/src/components/Breadcrumb/index.vue
new file mode 100644
index 0000000..1696f54
--- /dev/null
+++ b/fuintAdmin/src/components/Breadcrumb/index.vue
@@ -0,0 +1,74 @@
+
+
+
+
+ {{ item.meta.title }}
+ {{ item.meta.title }}
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/Crontab/day.vue b/fuintAdmin/src/components/Crontab/day.vue
new file mode 100644
index 0000000..19ba773
--- /dev/null
+++ b/fuintAdmin/src/components/Crontab/day.vue
@@ -0,0 +1,161 @@
+
+
+
+
+ 日,允许的通配符[, - * ? / L W]
+
+
+
+
+
+ 不指定
+
+
+
+
+
+ 周期从
+ -
+ 日
+
+
+
+
+
+ 从
+ 号开始,每
+ 日执行一次
+
+
+
+
+
+ 每月
+ 号最近的那个工作日
+
+
+
+
+
+ 本月最后一天
+
+
+
+
+
+ 指定
+
+ {{item}}
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/Crontab/hour.vue b/fuintAdmin/src/components/Crontab/hour.vue
new file mode 100644
index 0000000..1c171c1
--- /dev/null
+++ b/fuintAdmin/src/components/Crontab/hour.vue
@@ -0,0 +1,114 @@
+
+
+
+
+ 小时,允许的通配符[, - * /]
+
+
+
+
+
+ 周期从
+ -
+ 小时
+
+
+
+
+
+ 从
+ 小时开始,每
+ 小时执行一次
+
+
+
+
+
+ 指定
+
+ {{item-1}}
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/Crontab/index.vue b/fuintAdmin/src/components/Crontab/index.vue
new file mode 100644
index 0000000..3963df2
--- /dev/null
+++ b/fuintAdmin/src/components/Crontab/index.vue
@@ -0,0 +1,430 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 确定
+ 重置
+ 取消
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/Crontab/min.vue b/fuintAdmin/src/components/Crontab/min.vue
new file mode 100644
index 0000000..685a9cc
--- /dev/null
+++ b/fuintAdmin/src/components/Crontab/min.vue
@@ -0,0 +1,116 @@
+
+
+
+
+ 分钟,允许的通配符[, - * /]
+
+
+
+
+
+ 周期从
+ -
+ 分钟
+
+
+
+
+
+ 从
+ 分钟开始,每
+ 分钟执行一次
+
+
+
+
+
+ 指定
+
+ {{item-1}}
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/Crontab/month.vue b/fuintAdmin/src/components/Crontab/month.vue
new file mode 100644
index 0000000..5e0008e
--- /dev/null
+++ b/fuintAdmin/src/components/Crontab/month.vue
@@ -0,0 +1,114 @@
+
+
+
+
+ 月,允许的通配符[, - * /]
+
+
+
+
+
+ 周期从
+ -
+ 月
+
+
+
+
+
+ 从
+ 月开始,每
+ 月月执行一次
+
+
+
+
+
+ 指定
+
+ {{item}}
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/Crontab/result.vue b/fuintAdmin/src/components/Crontab/result.vue
new file mode 100644
index 0000000..ddd8f04
--- /dev/null
+++ b/fuintAdmin/src/components/Crontab/result.vue
@@ -0,0 +1,559 @@
+
+
+
+
+
diff --git a/fuintAdmin/src/components/Crontab/second.vue b/fuintAdmin/src/components/Crontab/second.vue
new file mode 100644
index 0000000..bf381df
--- /dev/null
+++ b/fuintAdmin/src/components/Crontab/second.vue
@@ -0,0 +1,117 @@
+
+
+
+
+ 秒,允许的通配符[, - * /]
+
+
+
+
+
+ 周期从
+ -
+ 秒
+
+
+
+
+
+ 从
+ 秒开始,每
+ 秒执行一次
+
+
+
+
+
+ 指定
+
+ {{item-1}}
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/Crontab/week.vue b/fuintAdmin/src/components/Crontab/week.vue
new file mode 100644
index 0000000..06d0367
--- /dev/null
+++ b/fuintAdmin/src/components/Crontab/week.vue
@@ -0,0 +1,202 @@
+
+
+
+
+ 周,允许的通配符[, - * ? / L #]
+
+
+
+
+
+ 不指定
+
+
+
+
+
+ 周期从星期
+
+ {{item.value}}
+
+ -
+
+ {{item.value}}
+
+
+
+
+
+
+ 第
+ 周的星期
+
+ {{item.value}}
+
+
+
+
+
+
+ 本月最后一个星期
+
+ {{item.value}}
+
+
+
+
+
+
+ 指定
+
+ {{item.value}}
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/Crontab/year.vue b/fuintAdmin/src/components/Crontab/year.vue
new file mode 100644
index 0000000..3019a11
--- /dev/null
+++ b/fuintAdmin/src/components/Crontab/year.vue
@@ -0,0 +1,131 @@
+
+
+
+
+ 不填,允许的通配符[, - * /]
+
+
+
+
+
+ 每年
+
+
+
+
+
+ 周期从
+ -
+
+
+
+
+
+
+ 从
+ 年开始,每
+ 年执行一次
+
+
+
+
+
+
+ 指定
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/DictData/index.js b/fuintAdmin/src/components/DictData/index.js
new file mode 100644
index 0000000..c2a0359
--- /dev/null
+++ b/fuintAdmin/src/components/DictData/index.js
@@ -0,0 +1,21 @@
+import Vue from 'vue'
+import DataDict from '@/utils/dict'
+import { getDicts as getDicts } from '@/api/system/dict/data'
+
+function install() {
+ Vue.use(DataDict, {
+ metas: {
+ '*': {
+ labelField: 'dictLabel',
+ valueField: 'dictValue',
+ request(dictMeta) {
+ return getDicts(dictMeta.type).then(res => res.data)
+ },
+ },
+ },
+ })
+}
+
+export default {
+ install,
+}
\ No newline at end of file
diff --git a/fuintAdmin/src/components/DictTag/index.vue b/fuintAdmin/src/components/DictTag/index.vue
new file mode 100644
index 0000000..4c196c4
--- /dev/null
+++ b/fuintAdmin/src/components/DictTag/index.vue
@@ -0,0 +1,52 @@
+
+
+
+
+ {{ item.label }}
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/fuintAdmin/src/components/Editor/index.vue b/fuintAdmin/src/components/Editor/index.vue
new file mode 100644
index 0000000..8edb34e
--- /dev/null
+++ b/fuintAdmin/src/components/Editor/index.vue
@@ -0,0 +1,272 @@
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/FileUpload/index.vue b/fuintAdmin/src/components/FileUpload/index.vue
new file mode 100644
index 0000000..472db76
--- /dev/null
+++ b/fuintAdmin/src/components/FileUpload/index.vue
@@ -0,0 +1,209 @@
+
+
+
+
+ 选取文件
+
+
+ 请上传
+ 大小不超过 {{ fileSize }}MB
+ 格式为 {{ fileType.join("/") }}
+ 的文件
+
+
+
+
+
+
+
+ {{ getFileName(file.name) }}
+
+
+ 删除
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/Fuint/Cashier/index.vue b/fuintAdmin/src/components/Fuint/Cashier/index.vue
new file mode 100644
index 0000000..c487ab2
--- /dev/null
+++ b/fuintAdmin/src/components/Fuint/Cashier/index.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
diff --git a/fuintAdmin/src/components/Fuint/Doc/index.vue b/fuintAdmin/src/components/Fuint/Doc/index.vue
new file mode 100644
index 0000000..bb66935
--- /dev/null
+++ b/fuintAdmin/src/components/Fuint/Doc/index.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/Fuint/Git/index.vue b/fuintAdmin/src/components/Fuint/Git/index.vue
new file mode 100644
index 0000000..0d33b75
--- /dev/null
+++ b/fuintAdmin/src/components/Fuint/Git/index.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/Fuint/QrCode/index.vue b/fuintAdmin/src/components/Fuint/QrCode/index.vue
new file mode 100644
index 0000000..9684ce6
--- /dev/null
+++ b/fuintAdmin/src/components/Fuint/QrCode/index.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+
小程序:
+
+
+
+
h5:
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/Hamburger/index.vue b/fuintAdmin/src/components/Hamburger/index.vue
new file mode 100644
index 0000000..368b002
--- /dev/null
+++ b/fuintAdmin/src/components/Hamburger/index.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/HeaderSearch/index.vue b/fuintAdmin/src/components/HeaderSearch/index.vue
new file mode 100644
index 0000000..83548d5
--- /dev/null
+++ b/fuintAdmin/src/components/HeaderSearch/index.vue
@@ -0,0 +1,188 @@
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/IconSelect/index.vue b/fuintAdmin/src/components/IconSelect/index.vue
new file mode 100644
index 0000000..b0ec9fa
--- /dev/null
+++ b/fuintAdmin/src/components/IconSelect/index.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/IconSelect/requireIcons.js b/fuintAdmin/src/components/IconSelect/requireIcons.js
new file mode 100644
index 0000000..99e5c54
--- /dev/null
+++ b/fuintAdmin/src/components/IconSelect/requireIcons.js
@@ -0,0 +1,11 @@
+
+const req = require.context('../../assets/icons/svg', false, /\.svg$/)
+const requireAll = requireContext => requireContext.keys()
+
+const re = /\.\/(.*)\.svg/
+
+const icons = requireAll(req).map(i => {
+ return i.match(re)[1]
+})
+
+export default icons
diff --git a/fuintAdmin/src/components/ImagePreview/index.vue b/fuintAdmin/src/components/ImagePreview/index.vue
new file mode 100644
index 0000000..743d8d5
--- /dev/null
+++ b/fuintAdmin/src/components/ImagePreview/index.vue
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/ImageUpload/index.vue b/fuintAdmin/src/components/ImageUpload/index.vue
new file mode 100644
index 0000000..8192c87
--- /dev/null
+++ b/fuintAdmin/src/components/ImageUpload/index.vue
@@ -0,0 +1,212 @@
+
+
+
+
+
+
+
+
+ 请上传
+ 大小不超过 {{ fileSize }}MB
+ 格式为 {{ fileType.join("/") }}
+ 的文件
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/Pagination/index.vue b/fuintAdmin/src/components/Pagination/index.vue
new file mode 100644
index 0000000..56f5a6b
--- /dev/null
+++ b/fuintAdmin/src/components/Pagination/index.vue
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/PanThumb/index.vue b/fuintAdmin/src/components/PanThumb/index.vue
new file mode 100644
index 0000000..1bcf417
--- /dev/null
+++ b/fuintAdmin/src/components/PanThumb/index.vue
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/ParentView/index.vue b/fuintAdmin/src/components/ParentView/index.vue
new file mode 100644
index 0000000..7bf6148
--- /dev/null
+++ b/fuintAdmin/src/components/ParentView/index.vue
@@ -0,0 +1,3 @@
+
+
+
diff --git a/fuintAdmin/src/components/RightPanel/index.vue b/fuintAdmin/src/components/RightPanel/index.vue
new file mode 100644
index 0000000..fbf27eb
--- /dev/null
+++ b/fuintAdmin/src/components/RightPanel/index.vue
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/RightToolbar/index.vue b/fuintAdmin/src/components/RightToolbar/index.vue
new file mode 100644
index 0000000..f7663a3
--- /dev/null
+++ b/fuintAdmin/src/components/RightToolbar/index.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/Screenfull/index.vue b/fuintAdmin/src/components/Screenfull/index.vue
new file mode 100644
index 0000000..c8bc9a5
--- /dev/null
+++ b/fuintAdmin/src/components/Screenfull/index.vue
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/SizeSelect/index.vue b/fuintAdmin/src/components/SizeSelect/index.vue
new file mode 100644
index 0000000..069b5de
--- /dev/null
+++ b/fuintAdmin/src/components/SizeSelect/index.vue
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/SvgIcon/index.vue b/fuintAdmin/src/components/SvgIcon/index.vue
new file mode 100644
index 0000000..e4bf5ad
--- /dev/null
+++ b/fuintAdmin/src/components/SvgIcon/index.vue
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/ThemePicker/index.vue b/fuintAdmin/src/components/ThemePicker/index.vue
new file mode 100644
index 0000000..3a41b9b
--- /dev/null
+++ b/fuintAdmin/src/components/ThemePicker/index.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/TopNav/index.vue b/fuintAdmin/src/components/TopNav/index.vue
new file mode 100644
index 0000000..f780b16
--- /dev/null
+++ b/fuintAdmin/src/components/TopNav/index.vue
@@ -0,0 +1,181 @@
+
+
+
+
+ {{ item.meta.title }}
+
+
+
+
+ 更多菜单
+
+
+ {{ item.meta.title }}
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/TreeSelect/index.vue b/fuintAdmin/src/components/TreeSelect/index.vue
new file mode 100644
index 0000000..bcf5e09
--- /dev/null
+++ b/fuintAdmin/src/components/TreeSelect/index.vue
@@ -0,0 +1,194 @@
+
+
+
+
+
+
+ {{ data.name }}
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/UserSelect/index.vue b/fuintAdmin/src/components/UserSelect/index.vue
new file mode 100644
index 0000000..5d6741f
--- /dev/null
+++ b/fuintAdmin/src/components/UserSelect/index.vue
@@ -0,0 +1,196 @@
+
+
+
+
+
+
+ 共{{ memberList.length }}会员,已选择{{ memberIds.length }}位会员
+
+
+
+
+ {{ scope.row.userNo }}
+
+
+
+
+
+ {{ scope.row.mobile ? scope.row.mobile : '-' }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/components/iFrame/index.vue b/fuintAdmin/src/components/iFrame/index.vue
new file mode 100644
index 0000000..426857f
--- /dev/null
+++ b/fuintAdmin/src/components/iFrame/index.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
diff --git a/fuintAdmin/src/directive/dialog/drag.js b/fuintAdmin/src/directive/dialog/drag.js
new file mode 100644
index 0000000..ce61ffe
--- /dev/null
+++ b/fuintAdmin/src/directive/dialog/drag.js
@@ -0,0 +1,64 @@
+/**
+* v-dialogDrag 弹窗拖拽
+* Copyright (c) 2022 fuint
+*/
+
+export default {
+ bind(el, binding, vnode, oldVnode) {
+ const value = binding.value
+ if (value == false) return
+ // 获取拖拽内容头部
+ const dialogHeaderEl = el.querySelector('.el-dialog__header');
+ const dragDom = el.querySelector('.el-dialog');
+ dialogHeaderEl.style.cursor = 'move';
+ // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
+ const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null);
+ dragDom.style.position = 'absolute';
+ dragDom.style.marginTop = 0;
+ let width = dragDom.style.width;
+ if (width.includes('%')) {
+ width = +document.body.clientWidth * (+width.replace(/\%/g, '') / 100);
+ } else {
+ width = +width.replace(/\px/g, '');
+ }
+ dragDom.style.left = `${(document.body.clientWidth - width) / 2}px`;
+ // 鼠标按下事件
+ dialogHeaderEl.onmousedown = (e) => {
+ // 鼠标按下,计算当前元素距离可视区的距离 (鼠标点击位置距离可视窗口的距离)
+ const disX = e.clientX - dialogHeaderEl.offsetLeft;
+ const disY = e.clientY - dialogHeaderEl.offsetTop;
+
+ // 获取到的值带px 正则匹配替换
+ let styL, styT;
+
+ // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
+ if (sty.left.includes('%')) {
+ styL = +document.body.clientWidth * (+sty.left.replace(/\%/g, '') / 100);
+ styT = +document.body.clientHeight * (+sty.top.replace(/\%/g, '') / 100);
+ } else {
+ styL = +sty.left.replace(/\px/g, '');
+ styT = +sty.top.replace(/\px/g, '');
+ };
+
+ // 鼠标拖拽事件
+ document.onmousemove = function (e) {
+ // 通过事件委托,计算移动的距离 (开始拖拽至结束拖拽的距离)
+ const l = e.clientX - disX;
+ const t = e.clientY - disY;
+
+ let finallyL = l + styL
+ let finallyT = t + styT
+
+ // 移动当前元素
+ dragDom.style.left = `${finallyL}px`;
+ dragDom.style.top = `${finallyT}px`;
+
+ };
+
+ document.onmouseup = function (e) {
+ document.onmousemove = null;
+ document.onmouseup = null;
+ };
+ }
+ }
+};
diff --git a/fuintAdmin/src/directive/dialog/dragHeight.js b/fuintAdmin/src/directive/dialog/dragHeight.js
new file mode 100644
index 0000000..36886d6
--- /dev/null
+++ b/fuintAdmin/src/directive/dialog/dragHeight.js
@@ -0,0 +1,34 @@
+/**
+* v-dialogDragWidth 可拖动弹窗高度(右下角)
+* Copyright (c) 2022 fuint
+*/
+
+export default {
+ bind(el) {
+ const dragDom = el.querySelector('.el-dialog');
+ const lineEl = document.createElement('div');
+ lineEl.style = 'width: 6px; background: inherit; height: 10px; position: absolute; right: 0; bottom: 0; margin: auto; z-index: 1; cursor: nwse-resize;';
+ lineEl.addEventListener('mousedown',
+ function(e) {
+ // 鼠标按下,计算当前元素距离可视区的距离
+ const disX = e.clientX - el.offsetLeft;
+ const disY = e.clientY - el.offsetTop;
+ // 当前宽度 高度
+ const curWidth = dragDom.offsetWidth;
+ const curHeight = dragDom.offsetHeight;
+ document.onmousemove = function(e) {
+ e.preventDefault(); // 移动时禁用默认事件
+ // 通过事件委托,计算移动的距离
+ const xl = e.clientX - disX;
+ const yl = e.clientY - disY
+ dragDom.style.width = `${curWidth + xl}px`;
+ dragDom.style.height = `${curHeight + yl}px`;
+ };
+ document.onmouseup = function(e) {
+ document.onmousemove = null;
+ document.onmouseup = null;
+ };
+ }, false);
+ dragDom.appendChild(lineEl);
+ }
+}
diff --git a/fuintAdmin/src/directive/dialog/dragWidth.js b/fuintAdmin/src/directive/dialog/dragWidth.js
new file mode 100644
index 0000000..89188ec
--- /dev/null
+++ b/fuintAdmin/src/directive/dialog/dragWidth.js
@@ -0,0 +1,30 @@
+/**
+* v-dialogDragWidth 可拖动弹窗宽度(右侧边)
+* Copyright (c) 2022 fuint
+*/
+
+export default {
+ bind(el) {
+ const dragDom = el.querySelector('.el-dialog');
+ const lineEl = document.createElement('div');
+ lineEl.style = 'width: 5px; background: inherit; height: 80%; position: absolute; right: 0; top: 0; bottom: 0; margin: auto; z-index: 1; cursor: w-resize;';
+ lineEl.addEventListener('mousedown',
+ function (e) {
+ // 鼠标按下,计算当前元素距离可视区的距离
+ const disX = e.clientX - el.offsetLeft;
+ // 当前宽度
+ const curWidth = dragDom.offsetWidth;
+ document.onmousemove = function (e) {
+ e.preventDefault(); // 移动时禁用默认事件
+ // 通过事件委托,计算移动的距离
+ const l = e.clientX - disX;
+ dragDom.style.width = `${curWidth + l}px`;
+ };
+ document.onmouseup = function (e) {
+ document.onmousemove = null;
+ document.onmouseup = null;
+ };
+ }, false);
+ dragDom.appendChild(lineEl);
+ }
+}
diff --git a/fuintAdmin/src/directive/index.js b/fuintAdmin/src/directive/index.js
new file mode 100644
index 0000000..b9b07da
--- /dev/null
+++ b/fuintAdmin/src/directive/index.js
@@ -0,0 +1,23 @@
+import hasRole from './permission/hasRole'
+import hasPermi from './permission/hasPermi'
+import dialogDrag from './dialog/drag'
+import dialogDragWidth from './dialog/dragWidth'
+import dialogDragHeight from './dialog/dragHeight'
+import clipboard from './module/clipboard'
+
+const install = function(Vue) {
+ Vue.directive('hasRole', hasRole)
+ Vue.directive('hasPermi', hasPermi)
+ Vue.directive('clipboard', clipboard)
+ Vue.directive('dialogDrag', dialogDrag)
+ Vue.directive('dialogDragWidth', dialogDragWidth)
+ Vue.directive('dialogDragHeight', dialogDragHeight)
+}
+
+if (window.Vue) {
+ window['hasRole'] = hasRole
+ window['hasPermi'] = hasPermi
+ Vue.use(install); // eslint-disable-line
+}
+
+export default install
diff --git a/fuintAdmin/src/directive/module/clipboard.js b/fuintAdmin/src/directive/module/clipboard.js
new file mode 100644
index 0000000..800ca17
--- /dev/null
+++ b/fuintAdmin/src/directive/module/clipboard.js
@@ -0,0 +1,54 @@
+/**
+* v-clipboard 文字复制剪贴
+* Copyright (c) 2022 fuint
+*/
+
+import Clipboard from 'clipboard'
+export default {
+ bind(el, binding, vnode) {
+ switch (binding.arg) {
+ case 'success':
+ el._vClipBoard_success = binding.value;
+ break;
+ case 'error':
+ el._vClipBoard_error = binding.value;
+ break;
+ default: {
+ const clipboard = new Clipboard(el, {
+ text: () => binding.value,
+ action: () => binding.arg === 'cut' ? 'cut' : 'copy'
+ });
+ clipboard.on('success', e => {
+ const callback = el._vClipBoard_success;
+ callback && callback(e);
+ });
+ clipboard.on('error', e => {
+ const callback = el._vClipBoard_error;
+ callback && callback(e);
+ });
+ el._vClipBoard = clipboard;
+ }
+ }
+ },
+ update(el, binding) {
+ if (binding.arg === 'success') {
+ el._vClipBoard_success = binding.value;
+ } else if (binding.arg === 'error') {
+ el._vClipBoard_error = binding.value;
+ } else {
+ el._vClipBoard.text = function () { return binding.value; };
+ el._vClipBoard.action = () => binding.arg === 'cut' ? 'cut' : 'copy';
+ }
+ },
+ unbind(el, binding) {
+ if (!el._vClipboard) return
+ if (binding.arg === 'success') {
+ delete el._vClipBoard_success;
+ } else if (binding.arg === 'error') {
+ delete el._vClipBoard_error;
+ } else {
+ el._vClipBoard.destroy();
+ delete el._vClipBoard;
+ }
+ }
+}
diff --git a/fuintAdmin/src/directive/permission/hasPermi.js b/fuintAdmin/src/directive/permission/hasPermi.js
new file mode 100644
index 0000000..c4bb43e
--- /dev/null
+++ b/fuintAdmin/src/directive/permission/hasPermi.js
@@ -0,0 +1,28 @@
+ /**
+ * v-hasPermi 操作权限处理
+ * Copyright (c) 2023 https://www.baidu.com
+ */
+
+import store from '@/store'
+
+export default {
+ inserted(el, binding, vnode) {
+ const { value } = binding
+ const all_permission = "*:*:*";
+ const permissions = store.getters && store.getters.permissions
+
+ if (value && value instanceof Array && value.length > 0) {
+ const permissionFlag = value
+
+ const hasPermissions = permissions.some(permission => {
+ return all_permission === permission || permissionFlag.includes(permission)
+ })
+
+ if (!hasPermissions) {
+ el.parentNode && el.parentNode.removeChild(el)
+ }
+ } else {
+ throw new Error(`请设置操作权限标签值`)
+ }
+ }
+}
diff --git a/fuintAdmin/src/directive/permission/hasRole.js b/fuintAdmin/src/directive/permission/hasRole.js
new file mode 100644
index 0000000..70851cd
--- /dev/null
+++ b/fuintAdmin/src/directive/permission/hasRole.js
@@ -0,0 +1,28 @@
+ /**
+ * v-hasRole 角色权限处理
+ * Copyright (c) 2022 fuint
+ */
+
+import store from '@/store'
+
+export default {
+ inserted(el, binding, vnode) {
+ const { value } = binding
+ const super_admin = "admin";
+ const roles = store.getters && store.getters.roles
+
+ if (value && value instanceof Array && value.length > 0) {
+ const roleFlag = value
+
+ const hasRole = roles.some(role => {
+ return super_admin === role || roleFlag.includes(role)
+ })
+
+ if (!hasRole) {
+ el.parentNode && el.parentNode.removeChild(el)
+ }
+ } else {
+ throw new Error(`请设置角色权限标签值"`)
+ }
+ }
+}
diff --git a/fuintAdmin/src/layout/components/AppMain.vue b/fuintAdmin/src/layout/components/AppMain.vue
new file mode 100644
index 0000000..0c6f4b7
--- /dev/null
+++ b/fuintAdmin/src/layout/components/AppMain.vue
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/layout/components/InnerLink/index.vue b/fuintAdmin/src/layout/components/InnerLink/index.vue
new file mode 100644
index 0000000..a45d1a4
--- /dev/null
+++ b/fuintAdmin/src/layout/components/InnerLink/index.vue
@@ -0,0 +1,27 @@
+
diff --git a/fuintAdmin/src/layout/components/Navbar.vue b/fuintAdmin/src/layout/components/Navbar.vue
new file mode 100644
index 0000000..58597be
--- /dev/null
+++ b/fuintAdmin/src/layout/components/Navbar.vue
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/layout/components/Settings/index.vue b/fuintAdmin/src/layout/components/Settings/index.vue
new file mode 100644
index 0000000..59815f1
--- /dev/null
+++ b/fuintAdmin/src/layout/components/Settings/index.vue
@@ -0,0 +1,257 @@
+
+
+
+
+
+
主题风格设置
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 主题颜色
+
+
+
+
+
+
+
系统布局配置
+
+
+ 开启 TopNav
+
+
+
+
+ 开启 Tags-Views
+
+
+
+
+ 固定 Header
+
+
+
+
+ 显示 Logo
+
+
+
+
+ 动态标题
+
+
+
+
+
+
保存配置
+
重置配置
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/layout/components/Sidebar/FixiOSBug.js b/fuintAdmin/src/layout/components/Sidebar/FixiOSBug.js
new file mode 100644
index 0000000..6823726
--- /dev/null
+++ b/fuintAdmin/src/layout/components/Sidebar/FixiOSBug.js
@@ -0,0 +1,25 @@
+export default {
+ computed: {
+ device() {
+ return this.$store.state.app.device
+ }
+ },
+ mounted() {
+ // In order to fix the click on menu on the ios device will trigger the mouseleave bug
+ this.fixBugIniOS()
+ },
+ methods: {
+ fixBugIniOS() {
+ const $subMenu = this.$refs.subMenu
+ if ($subMenu) {
+ const handleMouseleave = $subMenu.handleMouseleave
+ $subMenu.handleMouseleave = (e) => {
+ if (this.device === 'mobile') {
+ return
+ }
+ handleMouseleave(e)
+ }
+ }
+ }
+ }
+}
diff --git a/fuintAdmin/src/layout/components/Sidebar/Item.vue b/fuintAdmin/src/layout/components/Sidebar/Item.vue
new file mode 100644
index 0000000..be3285d
--- /dev/null
+++ b/fuintAdmin/src/layout/components/Sidebar/Item.vue
@@ -0,0 +1,33 @@
+
diff --git a/fuintAdmin/src/layout/components/Sidebar/Link.vue b/fuintAdmin/src/layout/components/Sidebar/Link.vue
new file mode 100644
index 0000000..8b0bc93
--- /dev/null
+++ b/fuintAdmin/src/layout/components/Sidebar/Link.vue
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/layout/components/Sidebar/Logo.vue b/fuintAdmin/src/layout/components/Sidebar/Logo.vue
new file mode 100644
index 0000000..116863e
--- /dev/null
+++ b/fuintAdmin/src/layout/components/Sidebar/Logo.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/layout/components/Sidebar/SidebarItem.vue b/fuintAdmin/src/layout/components/Sidebar/SidebarItem.vue
new file mode 100644
index 0000000..4853fbb
--- /dev/null
+++ b/fuintAdmin/src/layout/components/Sidebar/SidebarItem.vue
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/layout/components/Sidebar/index.vue b/fuintAdmin/src/layout/components/Sidebar/index.vue
new file mode 100644
index 0000000..b6d9624
--- /dev/null
+++ b/fuintAdmin/src/layout/components/Sidebar/index.vue
@@ -0,0 +1,104 @@
+
+
+
+
+
{{ storeName }}
+
({{ role }})
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/layout/components/TagsView/ScrollPane.vue b/fuintAdmin/src/layout/components/TagsView/ScrollPane.vue
new file mode 100644
index 0000000..bb753a1
--- /dev/null
+++ b/fuintAdmin/src/layout/components/TagsView/ScrollPane.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/layout/components/TagsView/index.vue b/fuintAdmin/src/layout/components/TagsView/index.vue
new file mode 100644
index 0000000..a46951d
--- /dev/null
+++ b/fuintAdmin/src/layout/components/TagsView/index.vue
@@ -0,0 +1,326 @@
+
+
+
+
+ {{ tag.title }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/layout/components/index.js b/fuintAdmin/src/layout/components/index.js
new file mode 100644
index 0000000..104bd3a
--- /dev/null
+++ b/fuintAdmin/src/layout/components/index.js
@@ -0,0 +1,5 @@
+export { default as AppMain } from './AppMain'
+export { default as Navbar } from './Navbar'
+export { default as Settings } from './Settings'
+export { default as Sidebar } from './Sidebar/index.vue'
+export { default as TagsView } from './TagsView/index.vue'
diff --git a/fuintAdmin/src/layout/index.vue b/fuintAdmin/src/layout/index.vue
new file mode 100644
index 0000000..600f4db
--- /dev/null
+++ b/fuintAdmin/src/layout/index.vue
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/layout/mixin/ResizeHandler.js b/fuintAdmin/src/layout/mixin/ResizeHandler.js
new file mode 100644
index 0000000..e8d0df8
--- /dev/null
+++ b/fuintAdmin/src/layout/mixin/ResizeHandler.js
@@ -0,0 +1,45 @@
+import store from '@/store'
+
+const { body } = document
+const WIDTH = 992 // refer to Bootstrap's responsive design
+
+export default {
+ watch: {
+ $route(route) {
+ if (this.device === 'mobile' && this.sidebar.opened) {
+ store.dispatch('app/closeSideBar', { withoutAnimation: false })
+ }
+ }
+ },
+ beforeMount() {
+ window.addEventListener('resize', this.$_resizeHandler)
+ },
+ beforeDestroy() {
+ window.removeEventListener('resize', this.$_resizeHandler)
+ },
+ mounted() {
+ const isMobile = this.$_isMobile()
+ if (isMobile) {
+ store.dispatch('app/toggleDevice', 'mobile')
+ store.dispatch('app/closeSideBar', { withoutAnimation: true })
+ }
+ },
+ methods: {
+ // use $_ for mixins properties
+ // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
+ $_isMobile() {
+ const rect = body.getBoundingClientRect()
+ return rect.width - 1 < WIDTH
+ },
+ $_resizeHandler() {
+ if (!document.hidden) {
+ const isMobile = this.$_isMobile()
+ store.dispatch('app/toggleDevice', isMobile ? 'mobile' : 'desktop')
+
+ if (isMobile) {
+ store.dispatch('app/closeSideBar', { withoutAnimation: true })
+ }
+ }
+ }
+ }
+}
diff --git a/fuintAdmin/src/main.js b/fuintAdmin/src/main.js
new file mode 100644
index 0000000..43b4aa1
--- /dev/null
+++ b/fuintAdmin/src/main.js
@@ -0,0 +1,92 @@
+import Vue from 'vue'
+
+import Cookies from 'js-cookie'
+
+import Element from 'element-ui'
+import './assets/styles/element-variables.scss'
+
+import '@/assets/styles/index.scss' // global css
+import '@/assets/styles/fuint.scss' // fuint.css
+import App from './App'
+import store from './store'
+import router from './router'
+import directive from './directive' // directive
+import plugins from './plugins' // plugins
+import { download } from '@/utils/request'
+
+import './assets/icons' // icon
+import './permission' // permission control
+import { getConfigKey } from "@/api/system/config";
+import { parseTime, resetForm, addDateRange, getName, handleTree } from "@/utils/fuint";
+// 分页组件
+import Pagination from "@/components/Pagination";
+// 自定义表格工具组件
+import RightToolbar from "@/components/RightToolbar"
+// 富文本组件
+import Editor from "@/components/Editor"
+// 文件上传组件
+import FileUpload from "@/components/FileUpload"
+// 图片上传组件
+import ImageUpload from "@/components/ImageUpload"
+// 图片预览组件
+import ImagePreview from "@/components/ImagePreview"
+// 字典标签组件
+import DictTag from '@/components/DictTag'
+// 头部标签组件
+import VueMeta from 'vue-meta'
+// 字典数据组件
+import DictData from '@/components/DictData'
+// 打印插件
+import Print from 'vue-print-nb'
+// 树形选择组件
+import TreeSelect from '@/components/TreeSelect'
+// 会员选择组件
+import UserSelect from '@/components/UserSelect'
+
+// 全局方法挂载
+Vue.prototype.getConfigKey = getConfigKey
+Vue.prototype.parseTime = parseTime
+Vue.prototype.resetForm = resetForm
+Vue.prototype.addDateRange = addDateRange
+Vue.prototype.getName = getName
+Vue.prototype.download = download
+Vue.prototype.handleTree = handleTree
+
+// 全局组件挂载
+Vue.component('DictTag', DictTag)
+Vue.component('Pagination', Pagination)
+Vue.component('RightToolbar', RightToolbar)
+Vue.component('Editor', Editor)
+Vue.component('FileUpload', FileUpload)
+Vue.component('ImageUpload', ImageUpload)
+Vue.component('ImagePreview', ImagePreview)
+Vue.component('TreeSelect', TreeSelect)
+Vue.component('UserSelect', UserSelect)
+
+Vue.use(directive)
+Vue.use(plugins)
+Vue.use(VueMeta)
+Vue.use(Print);
+DictData.install()
+
+/**
+ * If you don't want to use mock-server
+ * you want to use MockJs for mock api
+ * you can execute: mockXHR()
+ *
+ * Currently MockJs will be used in the production environment,
+ * please remove it before going online! ! !
+ */
+
+Vue.use(Element, {
+ size: Cookies.get('size') || 'medium' // set element-ui default size
+})
+
+Vue.config.productionTip = false
+
+new Vue({
+ el: '#app',
+ router,
+ store,
+ render: h => h(App)
+})
diff --git a/fuintAdmin/src/permission.js b/fuintAdmin/src/permission.js
new file mode 100644
index 0000000..856ea86
--- /dev/null
+++ b/fuintAdmin/src/permission.js
@@ -0,0 +1,56 @@
+import router from './router'
+import store from './store'
+import { Message } from 'element-ui'
+import NProgress from 'nprogress'
+import 'nprogress/nprogress.css'
+import { getToken } from '@/utils/auth'
+import { isRelogin } from '@/utils/request'
+
+NProgress.configure({ showSpinner: false })
+
+const whiteList = ['/login', '/form', '/auth-redirect']
+
+router.beforeEach((to, from, next) => {
+ NProgress.start()
+ if (getToken()) {
+ to.meta.title && store.dispatch('settings/setTitle', to.meta.title)
+ /* has token*/
+ if (to.path === '/login') {
+ next({ path: '/' })
+ NProgress.done()
+ } else {
+ if (store.getters.roles.length === 0) {
+ isRelogin.show = true
+ // 判断当前用户是否已拉取完user_info信息
+ store.dispatch('GetInfo').then(() => {
+ isRelogin.show = false
+ store.dispatch('GenerateRoutes').then(accessRoutes => {
+ // 根据roles权限生成可访问的路由表
+ router.addRoutes(accessRoutes) // 动态添加可访问路由表
+ next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
+ })
+ }).catch(err => {
+ store.dispatch('LogOut').then(() => {
+ Message.error(err)
+ next({ path: '/' })
+ })
+ })
+ } else {
+ next()
+ }
+ }
+ } else {
+ // 没有token
+ if (whiteList.indexOf(to.path) !== -1) {
+ // 在免登录白名单,直接进入
+ next()
+ } else {
+ next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页
+ NProgress.done()
+ }
+ }
+})
+
+router.afterEach(() => {
+ NProgress.done()
+})
diff --git a/fuintAdmin/src/plugins/auth.js b/fuintAdmin/src/plugins/auth.js
new file mode 100644
index 0000000..6c6bc24
--- /dev/null
+++ b/fuintAdmin/src/plugins/auth.js
@@ -0,0 +1,60 @@
+import store from '@/store'
+
+function authPermission(permission) {
+ const all_permission = "*:*:*";
+ const permissions = store.getters && store.getters.permissions
+ if (permission && permission.length > 0) {
+ return permissions.some(v => {
+ return all_permission === v || v === permission
+ })
+ } else {
+ return false
+ }
+}
+
+function authRole(role) {
+ const super_admin = "admin";
+ const roles = store.getters && store.getters.roles
+ if (role && role.length > 0) {
+ return roles.some(v => {
+ return super_admin === v || v === role
+ })
+ } else {
+ return false
+ }
+}
+
+export default {
+ // 验证用户是否具备某权限
+ hasPermi(permission) {
+ return authPermission(permission);
+ },
+ // 验证用户是否含有指定权限,只需包含其中一个
+ hasPermiOr(permissions) {
+ return permissions.some(item => {
+ return authPermission(item)
+ })
+ },
+ // 验证用户是否含有指定权限,必须全部拥有
+ hasPermiAnd(permissions) {
+ return permissions.every(item => {
+ return authPermission(item)
+ })
+ },
+ // 验证用户是否具备某角色
+ hasRole(role) {
+ return authRole(role);
+ },
+ // 验证用户是否含有指定角色,只需包含其中一个
+ hasRoleOr(roles) {
+ return roles.some(item => {
+ return authRole(item)
+ })
+ },
+ // 验证用户是否含有指定角色,必须全部拥有
+ hasRoleAnd(roles) {
+ return roles.every(item => {
+ return authRole(item)
+ })
+ }
+}
diff --git a/fuintAdmin/src/plugins/cache.js b/fuintAdmin/src/plugins/cache.js
new file mode 100644
index 0000000..6b5c00b
--- /dev/null
+++ b/fuintAdmin/src/plugins/cache.js
@@ -0,0 +1,77 @@
+const sessionCache = {
+ set (key, value) {
+ if (!sessionStorage) {
+ return
+ }
+ if (key != null && value != null) {
+ sessionStorage.setItem(key, value)
+ }
+ },
+ get (key) {
+ if (!sessionStorage) {
+ return null
+ }
+ if (key == null) {
+ return null
+ }
+ return sessionStorage.getItem(key)
+ },
+ setJSON (key, jsonValue) {
+ if (jsonValue != null) {
+ this.set(key, JSON.stringify(jsonValue))
+ }
+ },
+ getJSON (key) {
+ const value = this.get(key)
+ if (value != null) {
+ return JSON.parse(value)
+ }
+ },
+ remove (key) {
+ sessionStorage.removeItem(key);
+ }
+}
+const localCache = {
+ set (key, value) {
+ if (!localStorage) {
+ return
+ }
+ if (key != null && value != null) {
+ localStorage.setItem(key, value)
+ }
+ },
+ get (key) {
+ if (!localStorage) {
+ return null
+ }
+ if (key == null) {
+ return null
+ }
+ return localStorage.getItem(key)
+ },
+ setJSON (key, jsonValue) {
+ if (jsonValue != null) {
+ this.set(key, JSON.stringify(jsonValue))
+ }
+ },
+ getJSON (key) {
+ const value = this.get(key)
+ if (value != null) {
+ return JSON.parse(value)
+ }
+ },
+ remove (key) {
+ localStorage.removeItem(key);
+ }
+}
+
+export default {
+ /**
+ * 会话级缓存
+ */
+ session: sessionCache,
+ /**
+ * 本地缓存
+ */
+ local: localCache
+}
diff --git a/fuintAdmin/src/plugins/download.js b/fuintAdmin/src/plugins/download.js
new file mode 100644
index 0000000..f2ba266
--- /dev/null
+++ b/fuintAdmin/src/plugins/download.js
@@ -0,0 +1,72 @@
+import axios from 'axios'
+import { Message } from 'element-ui'
+import { saveAs } from 'file-saver'
+import { getToken } from '@/utils/auth'
+import errorCode from '@/utils/errorCode'
+import { blobValidate } from "@/utils/fuint";
+
+const baseURL = process.env.VUE_APP_BASE_API
+
+export default {
+ name(name, isDelete = true) {
+ var url = baseURL + "/common/download?fileName=" + encodeURI(name) + "&delete=" + isDelete
+ axios({
+ method: 'get',
+ url: url,
+ responseType: 'blob',
+ headers: { 'Access-Token': getToken() }
+ }).then(async (res) => {
+ const isLogin = await blobValidate(res.data);
+ if (isLogin) {
+ const blob = new Blob([res.data])
+ this.saveAs(blob, decodeURI(res.headers['download-filename']))
+ } else {
+ this.printErrMsg(res.data);
+ }
+ })
+ },
+ resource(resource) {
+ var url = baseURL + "/common/download/resource?resource=" + encodeURI(resource);
+ axios({
+ method: 'get',
+ url: url,
+ responseType: 'blob',
+ headers: { 'Access-Token': getToken() }
+ }).then(async (res) => {
+ const isLogin = await blobValidate(res.data);
+ if (isLogin) {
+ const blob = new Blob([res.data])
+ this.saveAs(blob, decodeURI(res.headers['download-filename']))
+ } else {
+ this.printErrMsg(res.data);
+ }
+ })
+ },
+ zip(url, name) {
+ var url = baseURL + url
+ axios({
+ method: 'get',
+ url: url,
+ responseType: 'blob',
+ headers: { 'Access-Token': getToken() }
+ }).then(async (res) => {
+ const isLogin = await blobValidate(res.data);
+ if (isLogin) {
+ const blob = new Blob([res.data], { type: 'application/zip' })
+ this.saveAs(blob, name)
+ } else {
+ this.printErrMsg(res.data);
+ }
+ })
+ },
+ saveAs(text, name, opts) {
+ saveAs(text, name, opts);
+ },
+ async printErrMsg(data) {
+ const resText = await data.text();
+ const rspObj = JSON.parse(resText);
+ const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
+ Message.error(errMsg);
+ }
+}
+
diff --git a/fuintAdmin/src/plugins/index.js b/fuintAdmin/src/plugins/index.js
new file mode 100644
index 0000000..d000f2d
--- /dev/null
+++ b/fuintAdmin/src/plugins/index.js
@@ -0,0 +1,20 @@
+import tab from './tab'
+import auth from './auth'
+import cache from './cache'
+import modal from './modal'
+import download from './download'
+
+export default {
+ install(Vue) {
+ // 页签操作
+ Vue.prototype.$tab = tab
+ // 认证对象
+ Vue.prototype.$auth = auth
+ // 缓存对象
+ Vue.prototype.$cache = cache
+ // 模态框对象
+ Vue.prototype.$modal = modal
+ // 下载文件
+ Vue.prototype.$download = download
+ }
+}
diff --git a/fuintAdmin/src/plugins/modal.js b/fuintAdmin/src/plugins/modal.js
new file mode 100644
index 0000000..b37ca14
--- /dev/null
+++ b/fuintAdmin/src/plugins/modal.js
@@ -0,0 +1,83 @@
+import { Message, MessageBox, Notification, Loading } from 'element-ui'
+
+let loadingInstance;
+
+export default {
+ // 消息提示
+ msg(content) {
+ Message.info(content)
+ },
+ // 错误消息
+ msgError(content) {
+ Message.error(content)
+ },
+ // 成功消息
+ msgSuccess(content) {
+ Message.success(content)
+ },
+ // 警告消息
+ msgWarning(content) {
+ Message.warning(content)
+ },
+ // 弹出提示
+ alert(content) {
+ MessageBox.alert(content, "系统提示")
+ },
+ // 错误提示
+ alertError(content) {
+ MessageBox.alert(content, "系统提示", { type: 'error' })
+ },
+ // 成功提示
+ alertSuccess(content) {
+ MessageBox.alert(content, "系统提示", { type: 'success' })
+ },
+ // 警告提示
+ alertWarning(content) {
+ MessageBox.alert(content, "系统提示", { type: 'warning' })
+ },
+ // 通知提示
+ notify(content) {
+ Notification.info(content)
+ },
+ // 错误通知
+ notifyError(content) {
+ Notification.error(content);
+ },
+ // 成功通知
+ notifySuccess(content) {
+ Notification.success(content)
+ },
+ // 警告通知
+ notifyWarning(content) {
+ Notification.warning(content)
+ },
+ // 确认窗体
+ confirm(content) {
+ return MessageBox.confirm(content, "系统提示", {
+ confirmButtonText: '确定',
+ cancelButtonText: '取消',
+ type: "warning",
+ })
+ },
+ // 提交内容
+ prompt(content) {
+ return MessageBox.prompt(content, "系统提示", {
+ confirmButtonText: '确定',
+ cancelButtonText: '取消',
+ type: "warning",
+ })
+ },
+ // 打开遮罩层
+ loading(content) {
+ loadingInstance = Loading.service({
+ lock: true,
+ text: content,
+ spinner: "el-icon-loading",
+ background: "rgba(0, 0, 0, 0.7)",
+ })
+ },
+ // 关闭遮罩层
+ closeLoading() {
+ loadingInstance.close();
+ }
+}
diff --git a/fuintAdmin/src/plugins/tab.js b/fuintAdmin/src/plugins/tab.js
new file mode 100644
index 0000000..cade9f7
--- /dev/null
+++ b/fuintAdmin/src/plugins/tab.js
@@ -0,0 +1,67 @@
+import store from '@/store'
+import router from '@/router';
+
+export default {
+ // 刷新当前tab页签
+ refreshPage(obj) {
+ const { path, query, matched } = router.currentRoute;
+ if (obj === undefined) {
+ matched.forEach((m) => {
+ if (m.components && m.components.default && m.components.default.name) {
+ if (!['Layout', 'ParentView'].includes(m.components.default.name)) {
+ obj = { name: m.components.default.name, path: path, query: query };
+ }
+ }
+ });
+ }
+ return store.dispatch('tagsView/delCachedView', obj).then(() => {
+ const { path, query } = obj
+ router.replace({
+ path: '/redirect' + path,
+ query: query
+ })
+ })
+ },
+ // 关闭当前tab页签,打开新页签
+ closeOpenPage(obj) {
+ store.dispatch("tagsView/delView", router.currentRoute);
+ if (obj !== undefined) {
+ return router.push(obj);
+ }
+ },
+ // 关闭指定tab页签
+ closePage(obj) {
+ if (obj === undefined) {
+ return store.dispatch('tagsView/delView', router.currentRoute).then(({ lastPath }) => {
+ return router.push(lastPath || '/');
+ });
+ }
+ return store.dispatch('tagsView/delView', obj);
+ },
+ // 关闭所有tab页签
+ closeAllPage() {
+ return store.dispatch('tagsView/delAllViews');
+ },
+ // 关闭左侧tab页签
+ closeLeftPage(obj) {
+ return store.dispatch('tagsView/delLeftTags', obj || router.currentRoute);
+ },
+ // 关闭右侧tab页签
+ closeRightPage(obj) {
+ return store.dispatch('tagsView/delRightTags', obj || router.currentRoute);
+ },
+ // 关闭其他tab页签
+ closeOtherPage(obj) {
+ return store.dispatch('tagsView/delOthersViews', obj || router.currentRoute);
+ },
+ // 添加tab页签
+ openPage(title, url, params) {
+ var obj = { path: url, meta: { title: title } }
+ store.dispatch('tagsView/addView', obj);
+ return router.push({ path: url, query: params });
+ },
+ // 修改tab页签
+ updatePage(obj) {
+ return store.dispatch('tagsView/updateVisitedView', obj);
+ }
+}
diff --git a/fuintAdmin/src/router/index.js b/fuintAdmin/src/router/index.js
new file mode 100644
index 0000000..3797096
--- /dev/null
+++ b/fuintAdmin/src/router/index.js
@@ -0,0 +1,101 @@
+import Vue from 'vue'
+import Router from 'vue-router'
+
+Vue.use(Router)
+
+/* Layout */
+import Layout from '@/layout'
+
+/**
+ * Note: 路由配置项
+ *
+ * hidden: true // 当设置 true 的时候该路由不会再侧边栏出现 如401,login等页面,或者如一些编辑页面/edit/1
+ * alwaysShow: true // 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面
+ * // 只有一个时,会将那个子路由当做根路由显示在侧边栏--如引导页面
+ * // 若你想不管路由下面的 children 声明的个数都显示你的根路由
+ * // 你可以设置 alwaysShow: true,这样它就会忽略之前定义的规则,一直显示根路由
+ * redirect: noRedirect // 当设置 noRedirect 的时候该路由在面包屑导航中不可被点击
+ * name:'router-name' // 设定路由的名字,一定要填写不然使用时会出现各种问题
+ * query: '{"id": 1, "name": "ry"}' // 访问路由的默认传递参数
+ * roles: ['admin', 'common'] // 访问路由的角色权限
+ * permissions: ['a:a:a', 'b:b:b'] // 访问路由的菜单权限
+ * meta : {
+ noCache: true // 如果设置为true,则不会被 缓存(默认 false)
+ title: 'title' // 设置该路由在侧边栏和面包屑中展示的名字
+ icon: 'svg-name' // 设置该路由的图标,对应路径src/assets/icons/svg
+ breadcrumb: false // 如果设置为false,则不会在breadcrumb面包屑中显示
+ activeMenu: '/system/account' // 当路由设置了该属性,则会高亮相对应的侧边栏。
+ }
+ */
+
+// 公共路由
+export const constantRoutes = [
+ {
+ path: '/redirect',
+ component: Layout,
+ hidden: true,
+ children: [
+ {
+ path: '/redirect/:path(.*)',
+ component: () => import('@/views/redirect')
+ }
+ ]
+ },
+ {
+ path: '/login',
+ component: () => import('@/views/login'),
+ hidden: true
+ },
+ {
+ path: '/404',
+ component: () => import('@/views/error/404'),
+ hidden: true
+ },
+ {
+ path: '/401',
+ component: () => import('@/views/error/401'),
+ hidden: true
+ },
+ {
+ path: '',
+ component: Layout,
+ redirect: 'index',
+ children: [
+ {
+ path: 'index',
+ component: () => import('@/views/index'),
+ name: 'Index',
+ meta: { title: '系统首页', icon: 'dashboard', affix: true }
+ }
+ ]
+ },
+ {
+ path: '/account',
+ component: Layout,
+ hidden: true,
+ redirect: 'noredirect',
+ children: [
+ {
+ path: 'profile',
+ component: () => import('@/views/system/account/profile/index'),
+ name: 'Profile',
+ meta: { title: '个人中心', icon: 'user' }
+ }
+ ]
+ }
+]
+
+// 动态路由,基于用户权限动态去加载
+export const dynamicRoutes = []
+
+// 防止连续点击多次路由报错
+let routerPush = Router.prototype.push;
+Router.prototype.push = function push(location) {
+ return routerPush.call(this, location).catch(err => err)
+}
+
+export default new Router({
+ // mode: 'history', // 去掉url中的#
+ scrollBehavior: () => ({ y: 0 }),
+ routes: constantRoutes
+})
diff --git a/fuintAdmin/src/settings.js b/fuintAdmin/src/settings.js
new file mode 100644
index 0000000..b6990cd
--- /dev/null
+++ b/fuintAdmin/src/settings.js
@@ -0,0 +1,44 @@
+module.exports = {
+ /**
+ * 侧边栏主题 深色主题theme-dark,浅色主题theme-light
+ */
+ sideTheme: 'theme-dark',
+
+ /**
+ * 是否系统布局配置
+ */
+ showSettings: false,
+
+ /**
+ * 是否显示顶部导航
+ */
+ topNav: false,
+
+ /**
+ * 是否显示 tagsView
+ */
+ tagsView: true,
+
+ /**
+ * 是否固定头部
+ */
+ fixedHeader: true,
+
+ /**
+ * 是否显示logo
+ */
+ sidebarLogo: true,
+
+ /**
+ * 是否显示动态标题
+ */
+ dynamicTitle: false,
+
+ /**
+ * @type {string | array} 'production' | ['production', 'development']
+ * @description Need show err logs component.
+ * The default is only used in the production env
+ * If you want to also use it in dev, you can pass ['production', 'development']
+ */
+ errorLog: 'development'
+}
diff --git a/fuintAdmin/src/store/getters.js b/fuintAdmin/src/store/getters.js
new file mode 100644
index 0000000..4b5a68d
--- /dev/null
+++ b/fuintAdmin/src/store/getters.js
@@ -0,0 +1,22 @@
+const getters = {
+ sidebar: state => state.app.sidebar,
+ size: state => state.app.size,
+ device: state => state.app.device,
+ visitedViews: state => state.tagsView.visitedViews,
+ cachedViews: state => state.tagsView.cachedViews,
+ token: state => state.user.token,
+ avatar: state => state.user.avatar,
+ name: state => state.user.name,
+ introduction: state => state.user.introduction,
+ roles: state => state.user.roles,
+ permissions: state => state.user.permissions,
+ merchantId: state => state.user.merchantId,
+ merchantName: state => state.user.merchantName,
+ storeId: state => state.user.storeId,
+ storeName: state => state.user.storeName,
+ permission_routes: state => state.permission.routes,
+ topbarRouters:state => state.permission.topbarRouters,
+ defaultRoutes:state => state.permission.defaultRoutes,
+ sidebarRouters:state => state.permission.sidebarRouters,
+}
+export default getters
diff --git a/fuintAdmin/src/store/index.js b/fuintAdmin/src/store/index.js
new file mode 100644
index 0000000..53b8437
--- /dev/null
+++ b/fuintAdmin/src/store/index.js
@@ -0,0 +1,23 @@
+import Vue from 'vue'
+import Vuex from 'vuex'
+import app from './modules/app'
+import user from './modules/user'
+import tagsView from './modules/tagsView'
+import permission from './modules/permission'
+import settings from './modules/settings'
+import getters from './getters'
+
+Vue.use(Vuex)
+
+const store = new Vuex.Store({
+ modules: {
+ app,
+ user,
+ tagsView,
+ permission,
+ settings
+ },
+ getters
+})
+
+export default store
diff --git a/fuintAdmin/src/store/modules/app.js b/fuintAdmin/src/store/modules/app.js
new file mode 100644
index 0000000..3e22d1c
--- /dev/null
+++ b/fuintAdmin/src/store/modules/app.js
@@ -0,0 +1,66 @@
+import Cookies from 'js-cookie'
+
+const state = {
+ sidebar: {
+ opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,
+ withoutAnimation: false,
+ hide: false
+ },
+ device: 'desktop',
+ size: Cookies.get('size') || 'medium'
+}
+
+const mutations = {
+ TOGGLE_SIDEBAR: state => {
+ if (state.sidebar.hide) {
+ return false;
+ }
+ state.sidebar.opened = !state.sidebar.opened
+ state.sidebar.withoutAnimation = false
+ if (state.sidebar.opened) {
+ Cookies.set('sidebarStatus', 1)
+ } else {
+ Cookies.set('sidebarStatus', 0)
+ }
+ },
+ CLOSE_SIDEBAR: (state, withoutAnimation) => {
+ Cookies.set('sidebarStatus', 0)
+ state.sidebar.opened = false
+ state.sidebar.withoutAnimation = withoutAnimation
+ },
+ TOGGLE_DEVICE: (state, device) => {
+ state.device = device
+ },
+ SET_SIZE: (state, size) => {
+ state.size = size
+ Cookies.set('size', size)
+ },
+ SET_SIDEBAR_HIDE: (state, status) => {
+ state.sidebar.hide = status
+ }
+}
+
+const actions = {
+ toggleSideBar({ commit }) {
+ commit('TOGGLE_SIDEBAR')
+ },
+ closeSideBar({ commit }, { withoutAnimation }) {
+ commit('CLOSE_SIDEBAR', withoutAnimation)
+ },
+ toggleDevice({ commit }, device) {
+ commit('TOGGLE_DEVICE', device)
+ },
+ setSize({ commit }, size) {
+ commit('SET_SIZE', size)
+ },
+ toggleSideBarHide({ commit }, status) {
+ commit('SET_SIDEBAR_HIDE', status)
+ }
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
diff --git a/fuintAdmin/src/store/modules/permission.js b/fuintAdmin/src/store/modules/permission.js
new file mode 100644
index 0000000..2287665
--- /dev/null
+++ b/fuintAdmin/src/store/modules/permission.js
@@ -0,0 +1,133 @@
+import auth from '@/plugins/auth'
+import router, { constantRoutes, dynamicRoutes } from '@/router'
+import { getRouters } from '@/api/menu'
+import Layout from '@/layout/index'
+import ParentView from '@/components/ParentView'
+import InnerLink from '@/layout/components/InnerLink'
+
+const permission = {
+ state: {
+ routes: [],
+ addRoutes: [],
+ defaultRoutes: [],
+ topbarRouters: [],
+ sidebarRouters: []
+ },
+ mutations: {
+ SET_ROUTES: (state, routes) => {
+ state.addRoutes = routes
+ state.routes = constantRoutes.concat(routes)
+ },
+ SET_DEFAULT_ROUTES: (state, routes) => {
+ state.defaultRoutes = constantRoutes.concat(routes)
+ },
+ SET_TOPBAR_ROUTES: (state, routes) => {
+ state.topbarRouters = routes
+ },
+ SET_SIDEBAR_ROUTERS: (state, routes) => {
+ state.sidebarRouters = routes
+ },
+ },
+ actions: {
+ // 生成路由
+ GenerateRoutes({ commit }) {
+ return new Promise(resolve => {
+ // 向后端请求路由数据
+ getRouters().then(res => {
+ const sdata = JSON.parse(JSON.stringify(res.data))
+ const rdata = JSON.parse(JSON.stringify(res.data))
+ const sidebarRoutes = filterAsyncRouter(sdata)
+ const rewriteRoutes = filterAsyncRouter(rdata, false, true)
+ const asyncRoutes = filterDynamicRoutes(dynamicRoutes);
+ rewriteRoutes.push({ path: '*', redirect: '/404', hidden: true })
+ router.addRoutes(asyncRoutes);
+ commit('SET_ROUTES', rewriteRoutes)
+ commit('SET_SIDEBAR_ROUTERS', constantRoutes.concat(sidebarRoutes))
+ commit('SET_DEFAULT_ROUTES', sidebarRoutes)
+ commit('SET_TOPBAR_ROUTES', sidebarRoutes)
+ resolve(rewriteRoutes)
+ })
+ })
+ }
+ }
+}
+
+// 遍历后台传来的路由字符串,转换为组件对象
+function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) {
+ return asyncRouterMap.filter(route => {
+ if (type && route.children) {
+ route.children = filterChildren(route.children)
+ }
+ if (route.component) {
+ // Layout ParentView 组件特殊处理
+ if (route.component === 'Layout') {
+ route.component = Layout
+ } else if (route.component === 'ParentView') {
+ route.component = ParentView
+ } else if (route.component === 'InnerLink') {
+ route.component = InnerLink
+ } else {
+ route.component = loadView(route.component)
+ }
+ }
+ if (route.children != null && route.children && route.children.length) {
+ route.children = filterAsyncRouter(route.children, route, type)
+ } else {
+ delete route['children']
+ delete route['redirect']
+ }
+ return true
+ })
+}
+
+function filterChildren(childrenMap, lastRouter = false) {
+ var children = []
+ childrenMap.forEach((el, index) => {
+ if (el.children && el.children.length) {
+ if (el.component === 'ParentView' && !lastRouter) {
+ el.children.forEach(c => {
+ c.path = el.path + '/' + c.path
+ if (c.children && c.children.length) {
+ children = children.concat(filterChildren(c.children, c))
+ return
+ }
+ children.push(c)
+ })
+ return
+ }
+ }
+ if (lastRouter) {
+ el.path = lastRouter.path + '/' + el.path
+ }
+ children = children.concat(el)
+ })
+ return children
+}
+
+// 动态路由遍历,验证是否具备权限
+export function filterDynamicRoutes(routes) {
+ const res = []
+ routes.forEach(route => {
+ if (route.permissions) {
+ if (auth.hasPermiOr(route.permissions)) {
+ res.push(route)
+ }
+ } else if (route.roles) {
+ if (auth.hasRoleOr(route.roles)) {
+ res.push(route)
+ }
+ }
+ })
+ return res
+}
+
+export const loadView = (view) => {
+ if (process.env.NODE_ENV === 'development') {
+ return (resolve) => require([`@/views/${view}`], resolve)
+ } else {
+ // 使用 import 实现生产环境的路由懒加载
+ return () => import(`@/views/${view}`)
+ }
+}
+
+export default permission
diff --git a/fuintAdmin/src/store/modules/settings.js b/fuintAdmin/src/store/modules/settings.js
new file mode 100644
index 0000000..d98f37b
--- /dev/null
+++ b/fuintAdmin/src/store/modules/settings.js
@@ -0,0 +1,42 @@
+import defaultSettings from '@/settings'
+
+const { sideTheme, showSettings, topNav, tagsView, fixedHeader, sidebarLogo, dynamicTitle } = defaultSettings
+
+const storageSetting = JSON.parse(localStorage.getItem('layout-setting')) || ''
+const state = {
+ title: '',
+ theme: storageSetting.theme || '#00acac',
+ sideTheme: storageSetting.sideTheme || sideTheme,
+ showSettings: showSettings,
+ topNav: storageSetting.topNav === undefined ? topNav : storageSetting.topNav,
+ tagsView: storageSetting.tagsView === undefined ? tagsView : storageSetting.tagsView,
+ fixedHeader: storageSetting.fixedHeader === undefined ? fixedHeader : storageSetting.fixedHeader,
+ sidebarLogo: storageSetting.sidebarLogo === undefined ? sidebarLogo : storageSetting.sidebarLogo,
+ dynamicTitle: storageSetting.dynamicTitle === undefined ? dynamicTitle : storageSetting.dynamicTitle
+}
+const mutations = {
+ CHANGE_SETTING: (state, { key, value }) => {
+ if (state.hasOwnProperty(key)) {
+ state[key] = value
+ }
+ }
+}
+
+const actions = {
+ // 修改布局设置
+ changeSetting({ commit }, data) {
+ commit('CHANGE_SETTING', data)
+ },
+ // 设置网页标题
+ setTitle({ commit }, title) {
+ state.title = title
+ }
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
+
diff --git a/fuintAdmin/src/store/modules/tagsView.js b/fuintAdmin/src/store/modules/tagsView.js
new file mode 100644
index 0000000..d12c8d8
--- /dev/null
+++ b/fuintAdmin/src/store/modules/tagsView.js
@@ -0,0 +1,207 @@
+const state = {
+ visitedViews: [],
+ cachedViews: []
+}
+
+const mutations = {
+ ADD_VISITED_VIEW: (state, view) => {
+ if (state.visitedViews.some(v => v.path === view.path)) return
+ state.visitedViews.push(
+ Object.assign({}, view, {
+ title: view.meta.title || 'no-name'
+ })
+ )
+ },
+ ADD_CACHED_VIEW: (state, view) => {
+ if (state.cachedViews.includes(view.name)) return
+ if (view.meta && !view.meta.noCache) {
+ state.cachedViews.push(view.name)
+ }
+ },
+
+ DEL_VISITED_VIEW: (state, view) => {
+ for (const [i, v] of state.visitedViews.entries()) {
+ if (v.path === view.path) {
+ state.visitedViews.splice(i, 1)
+ break
+ }
+ }
+ },
+ DEL_CACHED_VIEW: (state, view) => {
+ const index = state.cachedViews.indexOf(view.name)
+ index > -1 && state.cachedViews.splice(index, 1)
+ },
+
+ DEL_OTHERS_VISITED_VIEWS: (state, view) => {
+ state.visitedViews = state.visitedViews.filter(v => {
+ return v.meta.affix || v.path === view.path
+ })
+ },
+ DEL_OTHERS_CACHED_VIEWS: (state, view) => {
+ const index = state.cachedViews.indexOf(view.name)
+ if (index > -1) {
+ state.cachedViews = state.cachedViews.slice(index, index + 1)
+ } else {
+ state.cachedViews = []
+ }
+ },
+
+ DEL_ALL_VISITED_VIEWS: state => {
+ // keep affix tags
+ const affixTags = state.visitedViews.filter(tag => tag.meta.affix)
+ state.visitedViews = affixTags
+ },
+ DEL_ALL_CACHED_VIEWS: state => {
+ state.cachedViews = []
+ },
+
+ UPDATE_VISITED_VIEW: (state, view) => {
+ for (let v of state.visitedViews) {
+ if (v.path === view.path) {
+ v = Object.assign(v, view)
+ break
+ }
+ }
+ },
+
+ DEL_RIGHT_VIEWS: (state, view) => {
+ const index = state.visitedViews.findIndex(v => v.path === view.path)
+ if (index === -1) {
+ return
+ }
+ state.visitedViews = state.visitedViews.filter((item, idx) => {
+ if (idx <= index || (item.meta && item.meta.affix)) {
+ return true
+ }
+ const i = state.cachedViews.indexOf(item.name)
+ if (i > -1) {
+ state.cachedViews.splice(i, 1)
+ }
+ return false
+ })
+ },
+
+ DEL_LEFT_VIEWS: (state, view) => {
+ const index = state.visitedViews.findIndex(v => v.path === view.path)
+ if (index === -1) {
+ return
+ }
+ state.visitedViews = state.visitedViews.filter((item, idx) => {
+ if (idx >= index || (item.meta && item.meta.affix)) {
+ return true
+ }
+ const i = state.cachedViews.indexOf(item.name)
+ if (i > -1) {
+ state.cachedViews.splice(i, 1)
+ }
+ return false
+ })
+ }
+}
+
+const actions = {
+ addView({ dispatch }, view) {
+ dispatch('addVisitedView', view)
+ dispatch('addCachedView', view)
+ },
+ addVisitedView({ commit }, view) {
+ commit('ADD_VISITED_VIEW', view)
+ },
+ addCachedView({ commit }, view) {
+ commit('ADD_CACHED_VIEW', view)
+ },
+
+ delView({ dispatch, state }, view) {
+ return new Promise(resolve => {
+ dispatch('delVisitedView', view)
+ dispatch('delCachedView', view)
+ resolve({
+ visitedViews: [...state.visitedViews],
+ cachedViews: [...state.cachedViews]
+ })
+ })
+ },
+ delVisitedView({ commit, state }, view) {
+ return new Promise(resolve => {
+ commit('DEL_VISITED_VIEW', view)
+ resolve([...state.visitedViews])
+ })
+ },
+ delCachedView({ commit, state }, view) {
+ return new Promise(resolve => {
+ commit('DEL_CACHED_VIEW', view)
+ resolve([...state.cachedViews])
+ })
+ },
+
+ delOthersViews({ dispatch, state }, view) {
+ return new Promise(resolve => {
+ dispatch('delOthersVisitedViews', view)
+ dispatch('delOthersCachedViews', view)
+ resolve({
+ visitedViews: [...state.visitedViews],
+ cachedViews: [...state.cachedViews]
+ })
+ })
+ },
+ delOthersVisitedViews({ commit, state }, view) {
+ return new Promise(resolve => {
+ commit('DEL_OTHERS_VISITED_VIEWS', view)
+ resolve([...state.visitedViews])
+ })
+ },
+ delOthersCachedViews({ commit, state }, view) {
+ return new Promise(resolve => {
+ commit('DEL_OTHERS_CACHED_VIEWS', view)
+ resolve([...state.cachedViews])
+ })
+ },
+
+ delAllViews({ dispatch, state }, view) {
+ return new Promise(resolve => {
+ dispatch('delAllVisitedViews', view)
+ dispatch('delAllCachedViews', view)
+ resolve({
+ visitedViews: [...state.visitedViews],
+ cachedViews: [...state.cachedViews]
+ })
+ })
+ },
+ delAllVisitedViews({ commit, state }) {
+ return new Promise(resolve => {
+ commit('DEL_ALL_VISITED_VIEWS')
+ resolve([...state.visitedViews])
+ })
+ },
+ delAllCachedViews({ commit, state }) {
+ return new Promise(resolve => {
+ commit('DEL_ALL_CACHED_VIEWS')
+ resolve([...state.cachedViews])
+ })
+ },
+
+ updateVisitedView({ commit }, view) {
+ commit('UPDATE_VISITED_VIEW', view)
+ },
+
+ delRightTags({ commit }, view) {
+ return new Promise(resolve => {
+ commit('DEL_RIGHT_VIEWS', view)
+ resolve([...state.visitedViews])
+ })
+ },
+
+ delLeftTags({ commit }, view) {
+ return new Promise(resolve => {
+ commit('DEL_LEFT_VIEWS', view)
+ resolve([...state.visitedViews])
+ })
+ },
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
diff --git a/fuintAdmin/src/store/modules/user.js b/fuintAdmin/src/store/modules/user.js
new file mode 100644
index 0000000..54a7744
--- /dev/null
+++ b/fuintAdmin/src/store/modules/user.js
@@ -0,0 +1,111 @@
+import { login, logout, getInfo } from '@/api/login'
+import { getToken, setToken, removeToken } from '@/utils/auth'
+
+const user = {
+ state: {
+ token: getToken(),
+ name: '',
+ avatar: '',
+ roles: [],
+ permissions: [],
+ merchantId: '',
+ merchantName: '',
+ storeId: '',
+ storeName: ''
+ },
+
+ mutations: {
+ SET_TOKEN: (state, token) => {
+ state.token = token
+ },
+ SET_NAME: (state, name) => {
+ state.name = name
+ },
+ SET_AVATAR: (state, avatar) => {
+ state.avatar = avatar
+ },
+ SET_ROLES: (state, roles) => {
+ state.roles = roles
+ },
+ SET_PERMISSIONS: (state, permissions) => {
+ state.permissions = permissions
+ },
+ SET_MERCHANT_ID: (state, merchantId) => {
+ state.merchantId = merchantId
+ },
+ SET_MERCHANT_NAME: (state, merchantName) => {
+ state.merchantName = merchantName
+ },
+ SET_STORE_ID: (state, storeId) => {
+ state.storeId = storeId
+ },
+ SET_STORE_NAME: (state, storeName) => {
+ state.storeName = storeName
+ },
+ },
+
+ actions: {
+ // 登录
+ Login({ commit }, userInfo) {
+ const username = userInfo.username.trim()
+ const password = userInfo.password
+ const captchaCode = userInfo.captchaCode
+ const uuid = userInfo.uuid
+ return new Promise((resolve, reject) => {
+ login(username, password, captchaCode, uuid).then(res => {
+ setToken(res.data.token)
+ commit('SET_TOKEN', res.data.token)
+ resolve()
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ },
+
+ // 获取用户信息
+ GetInfo({ commit, state }) {
+ return new Promise((resolve, reject) => {
+ getInfo().then(res => {
+ const user = res.data.accountInfo
+ const avatar = (user.avatar == "" || user.avatar == null) ? require("@/assets/images/avatar.png") : process.env.VUE_APP_BASE_API + user.avatar;
+ if (res.data.roles && res.data.roles.length > 0) { // 验证返回的roles是否是一个非空数组
+ commit('SET_ROLES', res.data.roles);
+ commit('SET_PERMISSIONS', res.data.permissions);
+ } else {
+ commit('SET_ROLES', ['ROLE_DEFAULT']);
+ }
+ commit('SET_NAME', user.accountName);
+ commit('SET_AVATAR', avatar);
+ commit('SET_MERCHANT_ID', user.merchantId);
+ commit('SET_MERCHANT_NAME', user.merchantName);
+ commit('SET_STORE_ID', user.storeId);
+ commit('SET_STORE_NAME', user.storeName);
+ resolve(res);
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ },
+
+ // 退出系统
+ LogOut({ commit, state }) {
+ return new Promise((resolve, reject) => {
+ logout(state.token).then(() => {
+ commit('SET_TOKEN', '')
+ commit('SET_ROLES', [])
+ commit('SET_PERMISSIONS', [])
+ commit('SET_MERCHANT_ID', '')
+ commit('SET_MERCHANT_NAME', '')
+ commit('SET_STORE_ID', '')
+ commit('SET_STORE_NAME', '')
+ removeToken()
+ resolve()
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ }
+ }
+}
+
+export default user
diff --git a/fuintAdmin/src/utils/auth.js b/fuintAdmin/src/utils/auth.js
new file mode 100644
index 0000000..4fb70fa
--- /dev/null
+++ b/fuintAdmin/src/utils/auth.js
@@ -0,0 +1,29 @@
+import Cookies from 'js-cookie'
+
+const TokenKey = 'Access-Token'
+const UserKey = 'User-Id'
+
+export function getToken() {
+ return Cookies.get(TokenKey)
+}
+
+export function setToken(token) {
+ return Cookies.set(TokenKey, token)
+}
+
+export function removeToken() {
+ return Cookies.remove(TokenKey)
+}
+
+export function getUserId() {
+ return Cookies.get(UserKey)
+}
+
+export function setUserId(userId) {
+ return Cookies.set(UserKey, userId)
+}
+
+export function removeUserId() {
+ return Cookies.remove(UserKey)
+}
+
diff --git a/fuintAdmin/src/utils/dict/Dict.js b/fuintAdmin/src/utils/dict/Dict.js
new file mode 100644
index 0000000..c5b6747
--- /dev/null
+++ b/fuintAdmin/src/utils/dict/Dict.js
@@ -0,0 +1,82 @@
+import Vue from 'vue'
+import { mergeRecursive } from "@/utils/fuint";
+import DictMeta from './DictMeta'
+import DictData from './DictData'
+
+const DEFAULT_DICT_OPTIONS = {
+ types: [],
+}
+
+/**
+ * @classdesc 字典
+ * @property {Object} label 标签对象,内部属性名为字典类型名称
+ * @property {Object} dict 字段数组,内部属性名为字典类型名称
+ * @property {Array.} _dictMetas 字典元数据数组
+ */
+export default class Dict {
+ constructor() {
+ this.owner = null
+ this.label = {}
+ this.type = {}
+ }
+
+ init(options) {
+ if (options instanceof Array) {
+ options = { types: options }
+ }
+ const opts = mergeRecursive(DEFAULT_DICT_OPTIONS, options)
+ if (opts.types === undefined) {
+ throw new Error('need dict types')
+ }
+ const ps = []
+ this._dictMetas = opts.types.map(t => DictMeta.parse(t))
+ this._dictMetas.forEach(dictMeta => {
+ const type = dictMeta.type
+ Vue.set(this.label, type, {})
+ Vue.set(this.type, type, [])
+ if (dictMeta.lazy) {
+ return
+ }
+ ps.push(loadDict(this, dictMeta))
+ })
+ return Promise.all(ps)
+ }
+
+ /**
+ * 重新加载字典
+ * @param {String} type 字典类型
+ */
+ reloadDict(type) {
+ const dictMeta = this._dictMetas.find(e => e.type === type)
+ if (dictMeta === undefined) {
+ return Promise.reject(`the dict meta of ${type} was not found`)
+ }
+ return loadDict(this, dictMeta)
+ }
+}
+
+/**
+ * 加载字典
+ * @param {Dict} dict 字典
+ * @param {DictMeta} dictMeta 字典元数据
+ * @returns {Promise}
+ */
+function loadDict(dict, dictMeta) {
+ return dictMeta.request(dictMeta)
+ .then(response => {
+ const type = dictMeta.type
+ let dicts = dictMeta.responseConverter(response, dictMeta)
+ if (!(dicts instanceof Array)) {
+ console.error('the return of responseConverter must be Array.')
+ dicts = []
+ } else if (dicts.filter(d => d instanceof DictData).length !== dicts.length) {
+ console.error('the type of elements in dicts must be DictData')
+ dicts = []
+ }
+ dict.type[type].splice(0, Number.MAX_SAFE_INTEGER, ...dicts)
+ dicts.forEach(d => {
+ Vue.set(dict.label[type], d.value, d.label)
+ })
+ return dicts
+ })
+}
diff --git a/fuintAdmin/src/utils/dict/DictConverter.js b/fuintAdmin/src/utils/dict/DictConverter.js
new file mode 100644
index 0000000..0cf5df8
--- /dev/null
+++ b/fuintAdmin/src/utils/dict/DictConverter.js
@@ -0,0 +1,17 @@
+import DictOptions from './DictOptions'
+import DictData from './DictData'
+
+export default function(dict, dictMeta) {
+ const label = determineDictField(dict, dictMeta.labelField, ...DictOptions.DEFAULT_LABEL_FIELDS)
+ const value = determineDictField(dict, dictMeta.valueField, ...DictOptions.DEFAULT_VALUE_FIELDS)
+ return new DictData(dict[label], dict[value], dict)
+}
+
+/**
+ * 确定字典字段
+ * @param {DictData} dict
+ * @param {...String} fields
+ */
+function determineDictField(dict, ...fields) {
+ return fields.find(f => Object.prototype.hasOwnProperty.call(dict, f))
+}
diff --git a/fuintAdmin/src/utils/dict/DictData.js b/fuintAdmin/src/utils/dict/DictData.js
new file mode 100644
index 0000000..afc763e
--- /dev/null
+++ b/fuintAdmin/src/utils/dict/DictData.js
@@ -0,0 +1,13 @@
+/**
+ * @classdesc 字典数据
+ * @property {String} label 标签
+ * @property {*} value 标签
+ * @property {Object} raw 原始数据
+ */
+export default class DictData {
+ constructor(label, value, raw) {
+ this.label = label
+ this.value = value
+ this.raw = raw
+ }
+}
diff --git a/fuintAdmin/src/utils/dict/DictMeta.js b/fuintAdmin/src/utils/dict/DictMeta.js
new file mode 100644
index 0000000..7582643
--- /dev/null
+++ b/fuintAdmin/src/utils/dict/DictMeta.js
@@ -0,0 +1,38 @@
+import { mergeRecursive } from "@/utils/fuint";
+import DictOptions from './DictOptions'
+
+/**
+ * @classdesc 字典元数据
+ * @property {String} type 类型
+ * @property {Function} request 请求
+ * @property {String} label 标签字段
+ * @property {String} value 值字段
+ */
+export default class DictMeta {
+ constructor(options) {
+ this.type = options.type
+ this.request = options.request,
+ this.responseConverter = options.responseConverter
+ this.labelField = options.labelField
+ this.valueField = options.valueField
+ this.lazy = options.lazy === true
+ }
+}
+
+
+/**
+ * 解析字典元数据
+ * @param {Object} options
+ * @returns {DictMeta}
+ */
+DictMeta.parse= function(options) {
+ let opts = null
+ if (typeof options === 'string') {
+ opts = DictOptions.metas[options] || {}
+ opts.type = options
+ } else if (typeof options === 'object') {
+ opts = options
+ }
+ opts = mergeRecursive(DictOptions.metas['*'], opts)
+ return new DictMeta(opts)
+}
diff --git a/fuintAdmin/src/utils/dict/DictOptions.js b/fuintAdmin/src/utils/dict/DictOptions.js
new file mode 100644
index 0000000..83dac7e
--- /dev/null
+++ b/fuintAdmin/src/utils/dict/DictOptions.js
@@ -0,0 +1,51 @@
+import { mergeRecursive } from "@/utils/fuint";
+import dictConverter from './DictConverter'
+
+export const options = {
+ metas: {
+ '*': {
+ /**
+ * 字典请求,方法签名为function(dictMeta: DictMeta): Promise
+ */
+ request: (dictMeta) => {
+ console.log(`load dict ${dictMeta.type}`)
+ return Promise.resolve([])
+ },
+ /**
+ * 字典响应数据转换器,方法签名为function(response: Object, dictMeta: DictMeta): DictData
+ */
+ responseConverter,
+ labelField: 'label',
+ valueField: 'value',
+ },
+ },
+ /**
+ * 默认标签字段
+ */
+ DEFAULT_LABEL_FIELDS: ['label', 'name', 'title'],
+ /**
+ * 默认值字段
+ */
+ DEFAULT_VALUE_FIELDS: ['value', 'id', 'uid', 'key'],
+}
+
+/**
+ * 映射字典
+ * @param {Object} response 字典数据
+ * @param {DictMeta} dictMeta 字典元数据
+ * @returns {DictData}
+ */
+function responseConverter(response, dictMeta) {
+ const dicts = response.content instanceof Array ? response.content : response
+ if (dicts === undefined) {
+ console.warn(`no dict data of "${dictMeta.type}" found in the response`)
+ return []
+ }
+ return dicts.map(d => dictConverter(d, dictMeta))
+}
+
+export function mergeOptions(src) {
+ mergeRecursive(options, src)
+}
+
+export default options
diff --git a/fuintAdmin/src/utils/dict/index.js b/fuintAdmin/src/utils/dict/index.js
new file mode 100644
index 0000000..215eb9e
--- /dev/null
+++ b/fuintAdmin/src/utils/dict/index.js
@@ -0,0 +1,33 @@
+import Dict from './Dict'
+import { mergeOptions } from './DictOptions'
+
+export default function(Vue, options) {
+ mergeOptions(options)
+ Vue.mixin({
+ data() {
+ if (this.$options === undefined || this.$options.dicts === undefined || this.$options.dicts === null) {
+ return {}
+ }
+ const dict = new Dict()
+ dict.owner = this
+ return {
+ dict
+ }
+ },
+ created() {
+ if (!(this.dict instanceof Dict)) {
+ return
+ }
+ options.onCreated && options.onCreated(this.dict)
+ this.dict.init(this.$options.dicts).then(() => {
+ options.onReady && options.onReady(this.dict)
+ this.$nextTick(() => {
+ this.$emit('dictReady', this.dict)
+ if (this.$options.methods && this.$options.methods.onDictReady instanceof Function) {
+ this.$options.methods.onDictReady.call(this, this.dict)
+ }
+ })
+ })
+ },
+ })
+}
diff --git a/fuintAdmin/src/utils/errorCode.js b/fuintAdmin/src/utils/errorCode.js
new file mode 100644
index 0000000..598a100
--- /dev/null
+++ b/fuintAdmin/src/utils/errorCode.js
@@ -0,0 +1,6 @@
+export default {
+ '401': '认证失败,无法访问系统资源',
+ '403': '当前操作没有权限',
+ '404': '您访问资源不存在',
+ 'default': '系统未知错误,请反馈给管理员'
+}
diff --git a/fuintAdmin/src/utils/fuint.js b/fuintAdmin/src/utils/fuint.js
new file mode 100644
index 0000000..fbfaade
--- /dev/null
+++ b/fuintAdmin/src/utils/fuint.js
@@ -0,0 +1,226 @@
+/**
+ * 通用js方法封装处理
+ * Copyright (c) 2022 https://www.baidu.com
+ */
+
+// 获取过去n天时间
+export function getNumDayTime(dayNum) {
+ let currentDate = new Date(); // 获取当前日期
+ currentDate.setDate(currentDate.getDate() - dayNum); // 将当前日期减去30天
+
+ let year = currentDate.getFullYear(); // 获取年份
+ let month = currentDate.getMonth() + 1; // 获取月份(注意月份从0开始,需要加1)
+ let day = currentDate.getDate(); // 获取日期
+ let h = dayNum > 0 ? 0 : currentDate.getHours();
+ let m = dayNum > 0 ? 0 : currentDate.getMinutes();
+ let i = dayNum > 0 ? 0 : currentDate.getSeconds();
+
+ // 格式化日期为字符串(例如:YYYY-MM-DD)
+ let formattedDate = `${year}-${month < 10 ? '0' + month : month}-${day < 10 ? '0' + day : day} ${h}:${m}:${i}`;
+ return formattedDate;
+}
+
+
+// 日期格式化
+export function parseTime(time, pattern) {
+ if (arguments.length === 0 || !time) {
+ return null
+ }
+ const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
+ let date
+ if (typeof time === 'object') {
+ date = time
+ } else {
+ if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
+ time = parseInt(time)
+ } else if (typeof time === 'string') {
+ time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), '');
+ }
+ if ((typeof time === 'number') && (time.toString().length === 10)) {
+ time = time * 1000
+ }
+ date = new Date(time)
+ }
+ const formatObj = {
+ y: date.getFullYear(),
+ m: date.getMonth() + 1,
+ d: date.getDate(),
+ h: date.getHours(),
+ i: date.getMinutes(),
+ s: date.getSeconds(),
+ a: date.getDay()
+ }
+ const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
+ let value = formatObj[key]
+ // Note: getDay() returns 0 on Sunday
+ if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] }
+ if (result.length > 0 && value < 10) {
+ value = '0' + value
+ }
+ return value || 0
+ })
+ return time_str
+}
+
+// 表单重置
+export function resetForm(refName) {
+ if (this.$refs[refName]) {
+ this.$refs[refName].resetFields();
+ }
+}
+
+// 添加日期范围
+export function addDateRange(params, dateRange, propName) {
+ let search = params;
+ search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {};
+ dateRange = Array.isArray(dateRange) ? dateRange : [];
+ if (typeof (propName) === 'undefined') {
+ search.params['beginTime'] = dateRange[0];
+ search.params['endTime'] = dateRange[1];
+ } else {
+ search.params['begin' + propName] = dateRange[0];
+ search.params['end' + propName] = dateRange[1];
+ }
+ return search;
+}
+
+// 回显数据字典
+export function getName(datas, value) {
+ if (datas.length < 1) {
+ return "-"
+ }
+ let result = "-";
+ datas.forEach(function(item) {
+ if (item.id == value || item.key == value) {
+ result = item.name;
+ }
+ })
+ return result
+}
+
+// 字符串格式化(%s )
+export function sprintf(str) {
+ var args = arguments, flag = true, i = 1;
+ str = str.replace(/%s/g, function () {
+ var arg = args[i++];
+ if (typeof arg === 'undefined') {
+ flag = false;
+ return '';
+ }
+ return arg;
+ });
+ return flag ? str : '';
+}
+
+// 转换字符串,undefined,null等转化为""
+export function parseStrEmpty(str) {
+ if (!str || str == "undefined" || str == "null") {
+ return "";
+ }
+ return str;
+}
+
+// 数据合并
+export function mergeRecursive(source, target) {
+ for (var p in target) {
+ try {
+ if (target[p].constructor == Object) {
+ source[p] = mergeRecursive(source[p], target[p]);
+ } else {
+ source[p] = target[p];
+ }
+ } catch (e) {
+ source[p] = target[p];
+ }
+ }
+ return source;
+};
+
+/**
+ * 构造树型结构数据
+ * @param {*} data 数据源
+ * @param {*} id id字段 默认 'id'
+ * @param {*} parentId 父节点字段 默认 'parentId'
+ * @param {*} children 孩子节点字段 默认 'children'
+ */
+export function handleTree(data, id, parentId, children) {
+ let config = {
+ id: id || 'id',
+ parentId: parentId || 'parentId',
+ childrenList: children || 'children'
+ };
+
+ var childrenListMap = {};
+ var nodeIds = {};
+ var tree = [];
+
+ for (let d of data) {
+ let parentId = d[config.parentId];
+ if (childrenListMap[parentId] == null) {
+ childrenListMap[parentId] = [];
+ }
+ nodeIds[d[config.id]] = d;
+ childrenListMap[parentId].push(d);
+ }
+
+ for (let d of data) {
+ let parentId = d[config.parentId];
+ if (nodeIds[parentId] == null) {
+ tree.push(d);
+ }
+ }
+
+ for (let t of tree) {
+ adaptToChildrenList(t);
+ }
+
+ function adaptToChildrenList(o) {
+ if (childrenListMap[o[config.id]] !== null) {
+ o[config.childrenList] = childrenListMap[o[config.id]];
+ }
+ if (o[config.childrenList]) {
+ for (let c of o[config.childrenList]) {
+ adaptToChildrenList(c);
+ }
+ }
+ }
+ return tree;
+}
+
+/**
+* 参数处理
+* @param {*} params 参数
+*/
+export function tansParams(params) {
+ let result = ''
+ for (const propName of Object.keys(params)) {
+ const value = params[propName];
+ var part = encodeURIComponent(propName) + "=";
+ if (value !== null && typeof (value) !== "undefined") {
+ if (typeof value === 'object') {
+ for (const key of Object.keys(value)) {
+ if (value[key] !== null && typeof (value[key]) !== 'undefined') {
+ let params = propName + '[' + key + ']';
+ var subPart = encodeURIComponent(params) + "=";
+ result += subPart + encodeURIComponent(value[key]) + "&";
+ }
+ }
+ } else {
+ result += part + encodeURIComponent(value) + "&";
+ }
+ }
+ }
+ return result
+}
+
+// 验证是否为blob格式
+export async function blobValidate(data) {
+ try {
+ const text = await data.text();
+ JSON.parse(text);
+ return false;
+ } catch (error) {
+ return true;
+ }
+}
+
diff --git a/fuintAdmin/src/utils/generator/config.js b/fuintAdmin/src/utils/generator/config.js
new file mode 100644
index 0000000..7abf227
--- /dev/null
+++ b/fuintAdmin/src/utils/generator/config.js
@@ -0,0 +1,438 @@
+export const formConf = {
+ formRef: 'elForm',
+ formModel: 'formData',
+ size: 'medium',
+ labelPosition: 'right',
+ labelWidth: 100,
+ formRules: 'rules',
+ gutter: 15,
+ disabled: false,
+ span: 24,
+ formBtns: true
+}
+
+export const inputComponents = [
+ {
+ label: '单行文本',
+ tag: 'el-input',
+ tagIcon: 'input',
+ placeholder: '请输入',
+ defaultValue: undefined,
+ span: 24,
+ labelWidth: null,
+ style: { width: '100%' },
+ clearable: true,
+ prepend: '',
+ append: '',
+ 'prefix-icon': '',
+ 'suffix-icon': '',
+ maxlength: null,
+ 'show-word-limit': false,
+ readonly: false,
+ disabled: false,
+ required: true,
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/input'
+ },
+ {
+ label: '多行文本',
+ tag: 'el-input',
+ tagIcon: 'textarea',
+ type: 'textarea',
+ placeholder: '请输入',
+ defaultValue: undefined,
+ span: 24,
+ labelWidth: null,
+ autosize: {
+ minRows: 4,
+ maxRows: 4
+ },
+ style: { width: '100%' },
+ maxlength: null,
+ 'show-word-limit': false,
+ readonly: false,
+ disabled: false,
+ required: true,
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/input'
+ },
+ {
+ label: '密码',
+ tag: 'el-input',
+ tagIcon: 'password',
+ placeholder: '请输入',
+ defaultValue: undefined,
+ span: 24,
+ 'show-password': true,
+ labelWidth: null,
+ style: { width: '100%' },
+ clearable: true,
+ prepend: '',
+ append: '',
+ 'prefix-icon': '',
+ 'suffix-icon': '',
+ maxlength: null,
+ 'show-word-limit': false,
+ readonly: false,
+ disabled: false,
+ required: true,
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/input'
+ },
+ {
+ label: '计数器',
+ tag: 'el-input-number',
+ tagIcon: 'number',
+ placeholder: '',
+ defaultValue: undefined,
+ span: 24,
+ labelWidth: null,
+ min: undefined,
+ max: undefined,
+ step: undefined,
+ 'step-strictly': false,
+ precision: undefined,
+ 'controls-position': '',
+ disabled: false,
+ required: true,
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/input-number'
+ }
+]
+
+export const selectComponents = [
+ {
+ label: '下拉选择',
+ tag: 'el-select',
+ tagIcon: 'select',
+ placeholder: '请选择',
+ defaultValue: undefined,
+ span: 24,
+ labelWidth: null,
+ style: { width: '100%' },
+ clearable: true,
+ disabled: false,
+ required: true,
+ filterable: false,
+ multiple: false,
+ options: [{
+ label: '选项一',
+ value: 1
+ }, {
+ label: '选项二',
+ value: 2
+ }],
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/select'
+ },
+ {
+ label: '级联选择',
+ tag: 'el-cascader',
+ tagIcon: 'cascader',
+ placeholder: '请选择',
+ defaultValue: [],
+ span: 24,
+ labelWidth: null,
+ style: { width: '100%' },
+ props: {
+ props: {
+ multiple: false
+ }
+ },
+ 'show-all-levels': true,
+ disabled: false,
+ clearable: true,
+ filterable: false,
+ required: true,
+ options: [{
+ id: 1,
+ value: 1,
+ label: '选项1',
+ children: [{
+ id: 2,
+ value: 2,
+ label: '选项1-1'
+ }]
+ }],
+ dataType: 'dynamic',
+ labelKey: 'label',
+ valueKey: 'value',
+ childrenKey: 'children',
+ separator: '/',
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/cascader'
+ },
+ {
+ label: '单选框组',
+ tag: 'el-radio-group',
+ tagIcon: 'radio',
+ defaultValue: undefined,
+ span: 24,
+ labelWidth: null,
+ style: {},
+ optionType: 'default',
+ border: false,
+ size: 'medium',
+ disabled: false,
+ required: true,
+ options: [{
+ label: '选项一',
+ value: 1
+ }, {
+ label: '选项二',
+ value: 2
+ }],
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/radio'
+ },
+ {
+ label: '多选框组',
+ tag: 'el-checkbox-group',
+ tagIcon: 'checkbox',
+ defaultValue: [],
+ span: 24,
+ labelWidth: null,
+ style: {},
+ optionType: 'default',
+ border: false,
+ size: 'medium',
+ disabled: false,
+ required: true,
+ options: [{
+ label: '选项一',
+ value: 1
+ }, {
+ label: '选项二',
+ value: 2
+ }],
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/checkbox'
+ },
+ {
+ label: '开关',
+ tag: 'el-switch',
+ tagIcon: 'switch',
+ defaultValue: false,
+ span: 24,
+ labelWidth: null,
+ style: {},
+ disabled: false,
+ required: true,
+ 'active-text': '',
+ 'inactive-text': '',
+ 'active-color': null,
+ 'inactive-color': null,
+ 'active-value': true,
+ 'inactive-value': false,
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/switch'
+ },
+ {
+ label: '滑块',
+ tag: 'el-slider',
+ tagIcon: 'slider',
+ defaultValue: null,
+ span: 24,
+ labelWidth: null,
+ disabled: false,
+ required: true,
+ min: 0,
+ max: 100,
+ step: 1,
+ 'show-stops': false,
+ range: false,
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/slider'
+ },
+ {
+ label: '时间选择',
+ tag: 'el-time-picker',
+ tagIcon: 'time',
+ placeholder: '请选择',
+ defaultValue: null,
+ span: 24,
+ labelWidth: null,
+ style: { width: '100%' },
+ disabled: false,
+ clearable: true,
+ required: true,
+ 'picker-options': {
+ selectableRange: '00:00:00-23:59:59'
+ },
+ format: 'HH:mm:ss',
+ 'value-format': 'HH:mm:ss',
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/time-picker'
+ },
+ {
+ label: '时间范围',
+ tag: 'el-time-picker',
+ tagIcon: 'time-range',
+ defaultValue: null,
+ span: 24,
+ labelWidth: null,
+ style: { width: '100%' },
+ disabled: false,
+ clearable: true,
+ required: true,
+ 'is-range': true,
+ 'range-separator': '至',
+ 'start-placeholder': '开始时间',
+ 'end-placeholder': '结束时间',
+ format: 'HH:mm:ss',
+ 'value-format': 'HH:mm:ss',
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/time-picker'
+ },
+ {
+ label: '日期选择',
+ tag: 'el-date-picker',
+ tagIcon: 'date',
+ placeholder: '请选择',
+ defaultValue: null,
+ type: 'date',
+ span: 24,
+ labelWidth: null,
+ style: { width: '100%' },
+ disabled: false,
+ clearable: true,
+ required: true,
+ format: 'yyyy-MM-dd',
+ 'value-format': 'yyyy-MM-dd',
+ readonly: false,
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/date-picker'
+ },
+ {
+ label: '日期范围',
+ tag: 'el-date-picker',
+ tagIcon: 'date-range',
+ defaultValue: null,
+ span: 24,
+ labelWidth: null,
+ style: { width: '100%' },
+ type: 'daterange',
+ 'range-separator': '至',
+ 'start-placeholder': '开始日期',
+ 'end-placeholder': '结束日期',
+ disabled: false,
+ clearable: true,
+ required: true,
+ format: 'yyyy-MM-dd',
+ 'value-format': 'yyyy-MM-dd',
+ readonly: false,
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/date-picker'
+ },
+ {
+ label: '评分',
+ tag: 'el-rate',
+ tagIcon: 'rate',
+ defaultValue: 0,
+ span: 24,
+ labelWidth: null,
+ style: {},
+ max: 5,
+ 'allow-half': false,
+ 'show-text': false,
+ 'show-score': false,
+ disabled: false,
+ required: true,
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/rate'
+ },
+ {
+ label: '颜色选择',
+ tag: 'el-color-picker',
+ tagIcon: 'color',
+ defaultValue: null,
+ labelWidth: null,
+ 'show-alpha': false,
+ 'color-format': '',
+ disabled: false,
+ required: true,
+ size: 'medium',
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/color-picker'
+ },
+ {
+ label: '上传',
+ tag: 'el-upload',
+ tagIcon: 'upload',
+ action: 'https://jsonplaceholder.typicode.com/posts/',
+ defaultValue: null,
+ labelWidth: null,
+ disabled: false,
+ required: true,
+ accept: '',
+ name: 'file',
+ 'auto-upload': true,
+ showTip: false,
+ buttonText: '点击上传',
+ fileSize: 2,
+ sizeUnit: 'MB',
+ 'list-type': 'text',
+ multiple: false,
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/upload'
+ }
+]
+
+export const layoutComponents = [
+ {
+ layout: 'rowFormItem',
+ tagIcon: 'row',
+ type: 'default',
+ justify: 'start',
+ align: 'top',
+ label: '行容器',
+ layoutTree: true,
+ children: [],
+ document: 'https://element.eleme.cn/#/zh-CN/component/layout'
+ },
+ {
+ layout: 'colFormItem',
+ label: '按钮',
+ changeTag: true,
+ labelWidth: null,
+ tag: 'el-button',
+ tagIcon: 'button',
+ span: 24,
+ default: '主要按钮',
+ type: 'primary',
+ icon: 'el-icon-search',
+ size: 'medium',
+ disabled: false,
+ document: 'https://element.eleme.cn/#/zh-CN/component/button'
+ }
+]
+
+// 组件rule的触发方式,无触发方式的组件不生成rule
+export const trigger = {
+ 'el-input': 'blur',
+ 'el-input-number': 'blur',
+ 'el-select': 'change',
+ 'el-radio-group': 'change',
+ 'el-checkbox-group': 'change',
+ 'el-cascader': 'change',
+ 'el-time-picker': 'change',
+ 'el-date-picker': 'change',
+ 'el-rate': 'change'
+}
diff --git a/fuintAdmin/src/utils/generator/css.js b/fuintAdmin/src/utils/generator/css.js
new file mode 100644
index 0000000..c1c62e6
--- /dev/null
+++ b/fuintAdmin/src/utils/generator/css.js
@@ -0,0 +1,18 @@
+const styles = {
+ 'el-rate': '.el-rate{display: inline-block; vertical-align: text-top;}',
+ 'el-upload': '.el-upload__tip{line-height: 1.2;}'
+}
+
+function addCss(cssList, el) {
+ const css = styles[el.tag]
+ css && cssList.indexOf(css) === -1 && cssList.push(css)
+ if (el.children) {
+ el.children.forEach(el2 => addCss(cssList, el2))
+ }
+}
+
+export function makeUpCss(conf) {
+ const cssList = []
+ conf.fields.forEach(el => addCss(cssList, el))
+ return cssList.join('\n')
+}
diff --git a/fuintAdmin/src/utils/generator/drawingDefault.js b/fuintAdmin/src/utils/generator/drawingDefault.js
new file mode 100644
index 0000000..09f133c
--- /dev/null
+++ b/fuintAdmin/src/utils/generator/drawingDefault.js
@@ -0,0 +1,29 @@
+export default [
+ {
+ layout: 'colFormItem',
+ tagIcon: 'input',
+ label: '手机号',
+ vModel: 'mobile',
+ formId: 6,
+ tag: 'el-input',
+ placeholder: '请输入手机号',
+ defaultValue: '',
+ span: 24,
+ style: { width: '100%' },
+ clearable: true,
+ prepend: '',
+ append: '',
+ 'prefix-icon': 'el-icon-mobile',
+ 'suffix-icon': '',
+ maxlength: 11,
+ 'show-word-limit': true,
+ readonly: false,
+ disabled: false,
+ required: true,
+ changeTag: true,
+ regList: [{
+ pattern: '/^1(3|4|5|7|8|9)\\d{9}$/',
+ message: '手机号格式错误'
+ }]
+ }
+]
diff --git a/fuintAdmin/src/utils/generator/html.js b/fuintAdmin/src/utils/generator/html.js
new file mode 100644
index 0000000..9bcc536
--- /dev/null
+++ b/fuintAdmin/src/utils/generator/html.js
@@ -0,0 +1,359 @@
+/* eslint-disable max-len */
+import { trigger } from './config'
+
+let confGlobal
+let someSpanIsNot24
+
+export function dialogWrapper(str) {
+ return `
+ ${str}
+
+ 取消
+ 确定
+
+ `
+}
+
+export function vueTemplate(str) {
+ return `
+
+ ${str}
+
+ `
+}
+
+export function vueScript(str) {
+ return ``
+}
+
+export function cssStyle(cssStr) {
+ return ``
+}
+
+function buildFormTemplate(conf, child, type) {
+ let labelPosition = ''
+ if (conf.labelPosition !== 'right') {
+ labelPosition = `label-position="${conf.labelPosition}"`
+ }
+ const disabled = conf.disabled ? `:disabled="${conf.disabled}"` : ''
+ let str = `
+ ${child}
+ ${buildFromBtns(conf, type)}
+ `
+ if (someSpanIsNot24) {
+ str = `
+ ${str}
+ `
+ }
+ return str
+}
+
+function buildFromBtns(conf, type) {
+ let str = ''
+ if (conf.formBtns && type === 'file') {
+ str = `
+ 提交
+ 重置
+ `
+ if (someSpanIsNot24) {
+ str = `
+ ${str}
+ `
+ }
+ }
+ return str
+}
+
+// span不为24的用el-col包裹
+function colWrapper(element, str) {
+ if (someSpanIsNot24 || element.span !== 24) {
+ return `
+ ${str}
+ `
+ }
+ return str
+}
+
+const layouts = {
+ colFormItem(element) {
+ let labelWidth = ''
+ if (element.labelWidth && element.labelWidth !== confGlobal.labelWidth) {
+ labelWidth = `label-width="${element.labelWidth}px"`
+ }
+ const required = !trigger[element.tag] && element.required ? 'required' : ''
+ const tagDom = tags[element.tag] ? tags[element.tag](element) : null
+ let str = `
+ ${tagDom}
+ `
+ str = colWrapper(element, str)
+ return str
+ },
+ rowFormItem(element) {
+ const type = element.type === 'default' ? '' : `type="${element.type}"`
+ const justify = element.type === 'default' ? '' : `justify="${element.justify}"`
+ const align = element.type === 'default' ? '' : `align="${element.align}"`
+ const gutter = element.gutter ? `gutter="${element.gutter}"` : ''
+ const children = element.children.map(el => layouts[el.layout](el))
+ let str = `
+ ${children.join('\n')}
+ `
+ str = colWrapper(element, str)
+ return str
+ }
+}
+
+const tags = {
+ 'el-button': el => {
+ const {
+ tag, disabled
+ } = attrBuilder(el)
+ const type = el.type ? `type="${el.type}"` : ''
+ const icon = el.icon ? `icon="${el.icon}"` : ''
+ const size = el.size ? `size="${el.size}"` : ''
+ let child = buildElButtonChild(el)
+
+ if (child) child = `\n${child}\n` // 换行
+ return `<${el.tag} ${type} ${icon} ${size} ${disabled}>${child}${el.tag}>`
+ },
+ 'el-input': el => {
+ const {
+ disabled, vModel, clearable, placeholder, width
+ } = attrBuilder(el)
+ const maxlength = el.maxlength ? `:maxlength="${el.maxlength}"` : ''
+ const showWordLimit = el['show-word-limit'] ? 'show-word-limit' : ''
+ const readonly = el.readonly ? 'readonly' : ''
+ const prefixIcon = el['prefix-icon'] ? `prefix-icon='${el['prefix-icon']}'` : ''
+ const suffixIcon = el['suffix-icon'] ? `suffix-icon='${el['suffix-icon']}'` : ''
+ const showPassword = el['show-password'] ? 'show-password' : ''
+ const type = el.type ? `type="${el.type}"` : ''
+ const autosize = el.autosize && el.autosize.minRows
+ ? `:autosize="{minRows: ${el.autosize.minRows}, maxRows: ${el.autosize.maxRows}}"`
+ : ''
+ let child = buildElInputChild(el)
+
+ if (child) child = `\n${child}\n` // 换行
+ return `<${el.tag} ${vModel} ${type} ${placeholder} ${maxlength} ${showWordLimit} ${readonly} ${disabled} ${clearable} ${prefixIcon} ${suffixIcon} ${showPassword} ${autosize} ${width}>${child}${el.tag}>`
+ },
+ 'el-input-number': el => {
+ const { disabled, vModel, placeholder } = attrBuilder(el)
+ const controlsPosition = el['controls-position'] ? `controls-position=${el['controls-position']}` : ''
+ const min = el.min ? `:min='${el.min}'` : ''
+ const max = el.max ? `:max='${el.max}'` : ''
+ const step = el.step ? `:step='${el.step}'` : ''
+ const stepStrictly = el['step-strictly'] ? 'step-strictly' : ''
+ const precision = el.precision ? `:precision='${el.precision}'` : ''
+
+ return `<${el.tag} ${vModel} ${placeholder} ${step} ${stepStrictly} ${precision} ${controlsPosition} ${min} ${max} ${disabled}>${el.tag}>`
+ },
+ 'el-select': el => {
+ const {
+ disabled, vModel, clearable, placeholder, width
+ } = attrBuilder(el)
+ const filterable = el.filterable ? 'filterable' : ''
+ const multiple = el.multiple ? 'multiple' : ''
+ let child = buildElSelectChild(el)
+
+ if (child) child = `\n${child}\n` // 换行
+ return `<${el.tag} ${vModel} ${placeholder} ${disabled} ${multiple} ${filterable} ${clearable} ${width}>${child}${el.tag}>`
+ },
+ 'el-radio-group': el => {
+ const { disabled, vModel } = attrBuilder(el)
+ const size = `size="${el.size}"`
+ let child = buildElRadioGroupChild(el)
+
+ if (child) child = `\n${child}\n` // 换行
+ return `<${el.tag} ${vModel} ${size} ${disabled}>${child}${el.tag}>`
+ },
+ 'el-checkbox-group': el => {
+ const { disabled, vModel } = attrBuilder(el)
+ const size = `size="${el.size}"`
+ const min = el.min ? `:min="${el.min}"` : ''
+ const max = el.max ? `:max="${el.max}"` : ''
+ let child = buildElCheckboxGroupChild(el)
+
+ if (child) child = `\n${child}\n` // 换行
+ return `<${el.tag} ${vModel} ${min} ${max} ${size} ${disabled}>${child}${el.tag}>`
+ },
+ 'el-switch': el => {
+ const { disabled, vModel } = attrBuilder(el)
+ const activeText = el['active-text'] ? `active-text="${el['active-text']}"` : ''
+ const inactiveText = el['inactive-text'] ? `inactive-text="${el['inactive-text']}"` : ''
+ const activeColor = el['active-color'] ? `active-color="${el['active-color']}"` : ''
+ const inactiveColor = el['inactive-color'] ? `inactive-color="${el['inactive-color']}"` : ''
+ const activeValue = el['active-value'] !== true ? `:active-value='${JSON.stringify(el['active-value'])}'` : ''
+ const inactiveValue = el['inactive-value'] !== false ? `:inactive-value='${JSON.stringify(el['inactive-value'])}'` : ''
+
+ return `<${el.tag} ${vModel} ${activeText} ${inactiveText} ${activeColor} ${inactiveColor} ${activeValue} ${inactiveValue} ${disabled}>${el.tag}>`
+ },
+ 'el-cascader': el => {
+ const {
+ disabled, vModel, clearable, placeholder, width
+ } = attrBuilder(el)
+ const options = el.options ? `:options="${el.vModel}Options"` : ''
+ const props = el.props ? `:props="${el.vModel}Props"` : ''
+ const showAllLevels = el['show-all-levels'] ? '' : ':show-all-levels="false"'
+ const filterable = el.filterable ? 'filterable' : ''
+ const separator = el.separator === '/' ? '' : `separator="${el.separator}"`
+
+ return `<${el.tag} ${vModel} ${options} ${props} ${width} ${showAllLevels} ${placeholder} ${separator} ${filterable} ${clearable} ${disabled}>${el.tag}>`
+ },
+ 'el-slider': el => {
+ const { disabled, vModel } = attrBuilder(el)
+ const min = el.min ? `:min='${el.min}'` : ''
+ const max = el.max ? `:max='${el.max}'` : ''
+ const step = el.step ? `:step='${el.step}'` : ''
+ const range = el.range ? 'range' : ''
+ const showStops = el['show-stops'] ? `:show-stops="${el['show-stops']}"` : ''
+
+ return `<${el.tag} ${min} ${max} ${step} ${vModel} ${range} ${showStops} ${disabled}>${el.tag}>`
+ },
+ 'el-time-picker': el => {
+ const {
+ disabled, vModel, clearable, placeholder, width
+ } = attrBuilder(el)
+ const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : ''
+ const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : ''
+ const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : ''
+ const isRange = el['is-range'] ? 'is-range' : ''
+ const format = el.format ? `format="${el.format}"` : ''
+ const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : ''
+ const pickerOptions = el['picker-options'] ? `:picker-options='${JSON.stringify(el['picker-options'])}'` : ''
+
+ return `<${el.tag} ${vModel} ${isRange} ${format} ${valueFormat} ${pickerOptions} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${disabled}>${el.tag}>`
+ },
+ 'el-date-picker': el => {
+ const {
+ disabled, vModel, clearable, placeholder, width
+ } = attrBuilder(el)
+ const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : ''
+ const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : ''
+ const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : ''
+ const format = el.format ? `format="${el.format}"` : ''
+ const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : ''
+ const type = el.type === 'date' ? '' : `type="${el.type}"`
+ const readonly = el.readonly ? 'readonly' : ''
+
+ return `<${el.tag} ${type} ${vModel} ${format} ${valueFormat} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${readonly} ${disabled}>${el.tag}>`
+ },
+ 'el-rate': el => {
+ const { disabled, vModel } = attrBuilder(el)
+ const max = el.max ? `:max='${el.max}'` : ''
+ const allowHalf = el['allow-half'] ? 'allow-half' : ''
+ const showText = el['show-text'] ? 'show-text' : ''
+ const showScore = el['show-score'] ? 'show-score' : ''
+
+ return `<${el.tag} ${vModel} ${allowHalf} ${showText} ${showScore} ${disabled}>${el.tag}>`
+ },
+ 'el-color-picker': el => {
+ const { disabled, vModel } = attrBuilder(el)
+ const size = `size="${el.size}"`
+ const showAlpha = el['show-alpha'] ? 'show-alpha' : ''
+ const colorFormat = el['color-format'] ? `color-format="${el['color-format']}"` : ''
+
+ return `<${el.tag} ${vModel} ${size} ${showAlpha} ${colorFormat} ${disabled}>${el.tag}>`
+ },
+ 'el-upload': el => {
+ const disabled = el.disabled ? ':disabled=\'true\'' : ''
+ const action = el.action ? `:action="${el.vModel}Action"` : ''
+ const multiple = el.multiple ? 'multiple' : ''
+ const listType = el['list-type'] !== 'text' ? `list-type="${el['list-type']}"` : ''
+ const accept = el.accept ? `accept="${el.accept}"` : ''
+ const name = el.name !== 'file' ? `name="${el.name}"` : ''
+ const autoUpload = el['auto-upload'] === false ? ':auto-upload="false"' : ''
+ const beforeUpload = `:before-upload="${el.vModel}BeforeUpload"`
+ const fileList = `:file-list="${el.vModel}fileList"`
+ const ref = `ref="${el.vModel}"`
+ let child = buildElUploadChild(el)
+
+ if (child) child = `\n${child}\n` // 换行
+ return `<${el.tag} ${ref} ${fileList} ${action} ${autoUpload} ${multiple} ${beforeUpload} ${listType} ${accept} ${name} ${disabled}>${child}${el.tag}>`
+ }
+}
+
+function attrBuilder(el) {
+ return {
+ vModel: `v-model="${confGlobal.formModel}.${el.vModel}"`,
+ clearable: el.clearable ? 'clearable' : '',
+ placeholder: el.placeholder ? `placeholder="${el.placeholder}"` : '',
+ width: el.style && el.style.width ? ':style="{width: \'100%\'}"' : '',
+ disabled: el.disabled ? ':disabled=\'true\'' : ''
+ }
+}
+
+// el-buttin 子级
+function buildElButtonChild(conf) {
+ const children = []
+ if (conf.default) {
+ children.push(conf.default)
+ }
+ return children.join('\n')
+}
+
+// el-input innerHTML
+function buildElInputChild(conf) {
+ const children = []
+ if (conf.prepend) {
+ children.push(`${conf.prepend} `)
+ }
+ if (conf.append) {
+ children.push(`${conf.append} `)
+ }
+ return children.join('\n')
+}
+
+function buildElSelectChild(conf) {
+ const children = []
+ if (conf.options && conf.options.length) {
+ children.push(` `)
+ }
+ return children.join('\n')
+}
+
+function buildElRadioGroupChild(conf) {
+ const children = []
+ if (conf.options && conf.options.length) {
+ const tag = conf.optionType === 'button' ? 'el-radio-button' : 'el-radio'
+ const border = conf.border ? 'border' : ''
+ children.push(`<${tag} v-for="(item, index) in ${conf.vModel}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}${tag}>`)
+ }
+ return children.join('\n')
+}
+
+function buildElCheckboxGroupChild(conf) {
+ const children = []
+ if (conf.options && conf.options.length) {
+ const tag = conf.optionType === 'button' ? 'el-checkbox-button' : 'el-checkbox'
+ const border = conf.border ? 'border' : ''
+ children.push(`<${tag} v-for="(item, index) in ${conf.vModel}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}${tag}>`)
+ }
+ return children.join('\n')
+}
+
+function buildElUploadChild(conf) {
+ const list = []
+ if (conf['list-type'] === 'picture-card') list.push(' ')
+ else list.push(`${conf.buttonText} `)
+ if (conf.showTip) list.push(`只能上传不超过 ${conf.fileSize}${conf.sizeUnit} 的${conf.accept}文件
`)
+ return list.join('\n')
+}
+
+export function makeUpHtml(conf, type) {
+ const htmlList = []
+ confGlobal = conf
+ someSpanIsNot24 = conf.fields.some(item => item.span !== 24)
+ conf.fields.forEach(el => {
+ htmlList.push(layouts[el.layout](el))
+ })
+ const htmlStr = htmlList.join('\n')
+
+ let temp = buildFormTemplate(conf, htmlStr, type)
+ if (type === 'dialog') {
+ temp = dialogWrapper(temp)
+ }
+ confGlobal = null
+ return temp
+}
diff --git a/fuintAdmin/src/utils/generator/icon.json b/fuintAdmin/src/utils/generator/icon.json
new file mode 100644
index 0000000..2d9999a
--- /dev/null
+++ b/fuintAdmin/src/utils/generator/icon.json
@@ -0,0 +1 @@
+["platform-eleme","eleme","delete-solid","delete","s-tools","setting","user-solid","user","phone","phone-outline","more","more-outline","star-on","star-off","s-goods","goods","warning","warning-outline","question","info","remove","circle-plus","success","error","zoom-in","zoom-out","remove-outline","circle-plus-outline","circle-check","circle-close","s-help","help","minus","plus","check","close","picture","picture-outline","picture-outline-round","upload","upload2","download","camera-solid","camera","video-camera-solid","video-camera","message-solid","bell","s-cooperation","s-order","s-platform","s-fold","s-unfold","s-operation","s-promotion","s-home","s-release","s-ticket","s-management","s-open","s-shop","s-marketing","s-flag","s-comment","s-finance","s-claim","s-custom","s-opportunity","s-data","s-check","s-grid","menu","share","d-caret","caret-left","caret-right","caret-bottom","caret-top","bottom-left","bottom-right","back","right","bottom","top","top-left","top-right","arrow-left","arrow-right","arrow-down","arrow-up","d-arrow-left","d-arrow-right","video-pause","video-play","refresh","refresh-right","refresh-left","finished","sort","sort-up","sort-down","rank","loading","view","c-scale-to-original","date","edit","edit-outline","folder","folder-opened","folder-add","folder-remove","folder-delete","folder-checked","tickets","document-remove","document-delete","document-copy","document-checked","document","document-add","printer","paperclip","takeaway-box","search","monitor","attract","mobile","scissors","umbrella","headset","brush","mouse","coordinate","magic-stick","reading","data-line","data-board","pie-chart","data-analysis","collection-tag","film","suitcase","suitcase-1","receiving","collection","files","notebook-1","notebook-2","toilet-paper","office-building","school","table-lamp","house","no-smoking","smoking","shopping-cart-full","shopping-cart-1","shopping-cart-2","shopping-bag-1","shopping-bag-2","sold-out","sell","present","box","bank-card","money","coin","wallet","discount","price-tag","news","guide","male","female","thumb","cpu","link","connection","open","turn-off","set-up","chat-round","chat-line-round","chat-square","chat-dot-round","chat-dot-square","chat-line-square","message","postcard","position","turn-off-microphone","microphone","close-notification","bangzhu","time","odometer","crop","aim","switch-button","full-screen","copy-document","mic","stopwatch","medal-1","medal","trophy","trophy-1","first-aid-kit","discover","place","location","location-outline","location-information","add-location","delete-location","map-location","alarm-clock","timer","watch-1","watch","lock","unlock","key","service","mobile-phone","bicycle","truck","ship","basketball","football","soccer","baseball","wind-power","light-rain","lightning","heavy-rain","sunrise","sunrise-1","sunset","sunny","cloudy","partly-cloudy","cloudy-and-sunny","moon","moon-night","dish","dish-1","food","chicken","fork-spoon","knife-fork","burger","tableware","sugar","dessert","ice-cream","hot-water","water-cup","coffee-cup","cold-drink","goblet","goblet-full","goblet-square","goblet-square-full","refrigerator","grape","watermelon","cherry","apple","pear","orange","coffee","ice-tea","ice-drink","milk-tea","potato-strips","lollipop","ice-cream-square","ice-cream-round"]
\ No newline at end of file
diff --git a/fuintAdmin/src/utils/generator/js.js b/fuintAdmin/src/utils/generator/js.js
new file mode 100644
index 0000000..35e3e21
--- /dev/null
+++ b/fuintAdmin/src/utils/generator/js.js
@@ -0,0 +1,236 @@
+import { isArray } from 'util'
+import { exportDefault, titleCase } from '@/utils/index'
+import { trigger } from './config'
+
+const units = {
+ KB: '1024',
+ MB: '1024 / 1024',
+ GB: '1024 / 1024 / 1024'
+}
+let confGlobal
+const inheritAttrs = {
+ file: '',
+ dialog: 'inheritAttrs: false,'
+}
+
+
+export function makeUpJs(conf, type) {
+ confGlobal = conf = JSON.parse(JSON.stringify(conf))
+ const dataList = []
+ const ruleList = []
+ const optionsList = []
+ const propsList = []
+ const methodList = mixinMethod(type)
+ const uploadVarList = []
+
+ conf.fields.forEach(el => {
+ buildAttributes(el, dataList, ruleList, optionsList, methodList, propsList, uploadVarList)
+ })
+
+ const script = buildexport(
+ conf,
+ type,
+ dataList.join('\n'),
+ ruleList.join('\n'),
+ optionsList.join('\n'),
+ uploadVarList.join('\n'),
+ propsList.join('\n'),
+ methodList.join('\n')
+ )
+ confGlobal = null
+ return script
+}
+
+function buildAttributes(el, dataList, ruleList, optionsList, methodList, propsList, uploadVarList) {
+ buildData(el, dataList)
+ buildRules(el, ruleList)
+
+ if (el.options && el.options.length) {
+ buildOptions(el, optionsList)
+ if (el.dataType === 'dynamic') {
+ const model = `${el.vModel}Options`
+ const options = titleCase(model)
+ buildOptionMethod(`get${options}`, model, methodList)
+ }
+ }
+
+ if (el.props && el.props.props) {
+ buildProps(el, propsList)
+ }
+
+ if (el.action && el.tag === 'el-upload') {
+ uploadVarList.push(
+ `${el.vModel}Action: '${el.action}',
+ ${el.vModel}fileList: [],`
+ )
+ methodList.push(buildBeforeUpload(el))
+ if (!el['auto-upload']) {
+ methodList.push(buildSubmitUpload(el))
+ }
+ }
+
+ if (el.children) {
+ el.children.forEach(el2 => {
+ buildAttributes(el2, dataList, ruleList, optionsList, methodList, propsList, uploadVarList)
+ })
+ }
+}
+
+function mixinMethod(type) {
+ const list = []; const
+ minxins = {
+ file: confGlobal.formBtns ? {
+ submitForm: `submitForm() {
+ this.$refs['${confGlobal.formRef}'].validate(valid => {
+ if(!valid) return
+ // TODO 提交表单
+ })
+ },`,
+ resetForm: `resetForm() {
+ this.$refs['${confGlobal.formRef}'].resetFields()
+ },`
+ } : null,
+ dialog: {
+ onOpen: 'onOpen() {},',
+ onClose: `onClose() {
+ this.$refs['${confGlobal.formRef}'].resetFields()
+ },`,
+ close: `close() {
+ this.$emit('update:visible', false)
+ },`,
+ handleConfirm: `handleConfirm() {
+ this.$refs['${confGlobal.formRef}'].validate(valid => {
+ if(!valid) return
+ this.close()
+ })
+ },`
+ }
+ }
+
+ const methods = minxins[type]
+ if (methods) {
+ Object.keys(methods).forEach(key => {
+ list.push(methods[key])
+ })
+ }
+
+ return list
+}
+
+function buildData(conf, dataList) {
+ if (conf.vModel === undefined) return
+ let defaultValue
+ if (typeof (conf.defaultValue) === 'string' && !conf.multiple) {
+ defaultValue = `'${conf.defaultValue}'`
+ } else {
+ defaultValue = `${JSON.stringify(conf.defaultValue)}`
+ }
+ dataList.push(`${conf.vModel}: ${defaultValue},`)
+}
+
+function buildRules(conf, ruleList) {
+ if (conf.vModel === undefined) return
+ const rules = []
+ if (trigger[conf.tag]) {
+ if (conf.required) {
+ const type = isArray(conf.defaultValue) ? 'type: \'array\',' : ''
+ let message = isArray(conf.defaultValue) ? `请至少选择一个${conf.vModel}` : conf.placeholder
+ if (message === undefined) message = `${conf.label}不能为空`
+ rules.push(`{ required: true, ${type} message: '${message}', trigger: '${trigger[conf.tag]}' }`)
+ }
+ if (conf.regList && isArray(conf.regList)) {
+ conf.regList.forEach(item => {
+ if (item.pattern) {
+ rules.push(`{ pattern: ${eval(item.pattern)}, message: '${item.message}', trigger: '${trigger[conf.tag]}' }`)
+ }
+ })
+ }
+ ruleList.push(`${conf.vModel}: [${rules.join(',')}],`)
+ }
+}
+
+function buildOptions(conf, optionsList) {
+ if (conf.vModel === undefined) return
+ if (conf.dataType === 'dynamic') { conf.options = [] }
+ const str = `${conf.vModel}Options: ${JSON.stringify(conf.options)},`
+ optionsList.push(str)
+}
+
+function buildProps(conf, propsList) {
+ if (conf.dataType === 'dynamic') {
+ conf.valueKey !== 'value' && (conf.props.props.value = conf.valueKey)
+ conf.labelKey !== 'label' && (conf.props.props.label = conf.labelKey)
+ conf.childrenKey !== 'children' && (conf.props.props.children = conf.childrenKey)
+ }
+ const str = `${conf.vModel}Props: ${JSON.stringify(conf.props.props)},`
+ propsList.push(str)
+}
+
+function buildBeforeUpload(conf) {
+ const unitNum = units[conf.sizeUnit]; let rightSizeCode = ''; let acceptCode = ''; const
+ returnList = []
+ if (conf.fileSize) {
+ rightSizeCode = `let isRightSize = file.size / ${unitNum} < ${conf.fileSize}
+ if(!isRightSize){
+ this.$message.error('文件大小超过 ${conf.fileSize}${conf.sizeUnit}')
+ }`
+ returnList.push('isRightSize')
+ }
+ if (conf.accept) {
+ acceptCode = `let isAccept = new RegExp('${conf.accept}').test(file.type)
+ if(!isAccept){
+ this.$message.error('应该选择${conf.accept}类型的文件')
+ }`
+ returnList.push('isAccept')
+ }
+ const str = `${conf.vModel}BeforeUpload(file) {
+ ${rightSizeCode}
+ ${acceptCode}
+ return ${returnList.join('&&')}
+ },`
+ return returnList.length ? str : ''
+}
+
+function buildSubmitUpload(conf) {
+ const str = `submitUpload() {
+ this.$refs['${conf.vModel}'].submit()
+ },`
+ return str
+}
+
+function buildOptionMethod(methodName, model, methodList) {
+ const str = `${methodName}() {
+ // TODO 发起请求获取数据
+ this.${model}
+ },`
+ methodList.push(str)
+}
+
+function buildexport(conf, type, data, rules, selectOptions, uploadVar, props, methods) {
+ const str = `${exportDefault}{
+ ${inheritAttrs[type]}
+ components: {},
+ props: [],
+ data () {
+ return {
+ ${conf.formModel}: {
+ ${data}
+ },
+ ${conf.formRules}: {
+ ${rules}
+ },
+ ${uploadVar}
+ ${selectOptions}
+ ${props}
+ }
+ },
+ computed: {},
+ watch: {},
+ created () {},
+ mounted () {},
+ methods: {
+ ${methods}
+ }
+}`
+ return str
+}
diff --git a/fuintAdmin/src/utils/generator/render.js b/fuintAdmin/src/utils/generator/render.js
new file mode 100644
index 0000000..e8640f0
--- /dev/null
+++ b/fuintAdmin/src/utils/generator/render.js
@@ -0,0 +1,126 @@
+import { makeMap } from '@/utils/index'
+
+// 参考https://github.com/vuejs/vue/blob/v2.6.10/src/platforms/web/server/util.js
+const isAttr = makeMap(
+ 'accept,accept-charset,accesskey,action,align,alt,async,autocomplete,'
+ + 'autofocus,autoplay,autosave,bgcolor,border,buffered,challenge,charset,'
+ + 'checked,cite,class,code,codebase,color,cols,colspan,content,http-equiv,'
+ + 'name,contenteditable,contextmenu,controls,coords,data,datetime,default,'
+ + 'defer,dir,dirname,disabled,download,draggable,dropzone,enctype,method,for,'
+ + 'form,formaction,headers,height,hidden,high,href,hreflang,http-equiv,'
+ + 'icon,id,ismap,itemprop,keytype,kind,label,lang,language,list,loop,low,'
+ + 'manifest,max,maxlength,media,method,GET,POST,min,multiple,email,file,'
+ + 'muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,'
+ + 'preload,radiogroup,readonly,rel,required,reversed,rows,rowspan,sandbox,'
+ + 'scope,scoped,seamless,selected,shape,size,type,text,password,sizes,span,'
+ + 'spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,'
+ + 'target,title,type,usemap,value,width,wrap'
+)
+
+function vModel(self, dataObject, defaultValue) {
+ dataObject.props.value = defaultValue
+
+ dataObject.on.input = val => {
+ self.$emit('input', val)
+ }
+}
+
+const componentChild = {
+ 'el-button': {
+ default(h, conf, key) {
+ return conf[key]
+ },
+ },
+ 'el-input': {
+ prepend(h, conf, key) {
+ return {conf[key]}
+ },
+ append(h, conf, key) {
+ return {conf[key]}
+ }
+ },
+ 'el-select': {
+ options(h, conf, key) {
+ const list = []
+ conf.options.forEach(item => {
+ list.push( )
+ })
+ return list
+ }
+ },
+ 'el-radio-group': {
+ options(h, conf, key) {
+ const list = []
+ conf.options.forEach(item => {
+ if (conf.optionType === 'button') list.push({item.label} )
+ else list.push({item.label} )
+ })
+ return list
+ }
+ },
+ 'el-checkbox-group': {
+ options(h, conf, key) {
+ const list = []
+ conf.options.forEach(item => {
+ if (conf.optionType === 'button') {
+ list.push({item.label} )
+ } else {
+ list.push({item.label} )
+ }
+ })
+ return list
+ }
+ },
+ 'el-upload': {
+ 'list-type': (h, conf, key) => {
+ const list = []
+ if (conf['list-type'] === 'picture-card') {
+ list.push( )
+ } else {
+ list.push({conf.buttonText} )
+ }
+ if (conf.showTip) {
+ list.push(只能上传不超过 {conf.fileSize}{conf.sizeUnit} 的{conf.accept}文件
)
+ }
+ return list
+ }
+ }
+}
+
+export default {
+ render(h) {
+ const dataObject = {
+ attrs: {},
+ props: {},
+ on: {},
+ style: {}
+ }
+ const confClone = JSON.parse(JSON.stringify(this.conf))
+ const children = []
+
+ const childObjs = componentChild[confClone.tag]
+ if (childObjs) {
+ Object.keys(childObjs).forEach(key => {
+ const childFunc = childObjs[key]
+ if (confClone[key]) {
+ children.push(childFunc(h, confClone, key))
+ }
+ })
+ }
+
+ Object.keys(confClone).forEach(key => {
+ const val = confClone[key]
+ if (key === 'vModel') {
+ vModel(this, dataObject, confClone.defaultValue)
+ } else if (dataObject[key]) {
+ dataObject[key] = val
+ } else if (!isAttr(key)) {
+ dataObject.props[key] = val
+ } else {
+ dataObject.attrs[key] = val
+ }
+ })
+ return h(this.conf.tag, dataObject, children)
+ },
+ props: ['conf']
+}
diff --git a/fuintAdmin/src/utils/index.js b/fuintAdmin/src/utils/index.js
new file mode 100644
index 0000000..64fc0bc
--- /dev/null
+++ b/fuintAdmin/src/utils/index.js
@@ -0,0 +1,390 @@
+import { parseTime } from './fuint'
+
+/**
+ * 表格时间格式化
+ */
+export function formatDate(cellValue) {
+ if (cellValue == null || cellValue == "") return "";
+ var date = new Date(cellValue)
+ var year = date.getFullYear()
+ var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
+ var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
+ var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
+ var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
+ var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
+ return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
+}
+
+/**
+ * @param {number} time
+ * @param {string} option
+ * @returns {string}
+ */
+export function formatTime(time, option) {
+ if (('' + time).length === 10) {
+ time = parseInt(time) * 1000
+ } else {
+ time = +time
+ }
+ const d = new Date(time)
+ const now = Date.now()
+
+ const diff = (now - d) / 1000
+
+ if (diff < 30) {
+ return '刚刚'
+ } else if (diff < 3600) {
+ // less 1 hour
+ return Math.ceil(diff / 60) + '分钟前'
+ } else if (diff < 3600 * 24) {
+ return Math.ceil(diff / 3600) + '小时前'
+ } else if (diff < 3600 * 24 * 2) {
+ return '1天前'
+ }
+ if (option) {
+ return parseTime(time, option)
+ } else {
+ return (
+ d.getMonth() +
+ 1 +
+ '月' +
+ d.getDate() +
+ '日' +
+ d.getHours() +
+ '时' +
+ d.getMinutes() +
+ '分'
+ )
+ }
+}
+
+/**
+ * @param {string} url
+ * @returns {Object}
+ */
+export function getQueryObject(url) {
+ url = url == null ? window.location.href : url
+ const search = url.substring(url.lastIndexOf('?') + 1)
+ const obj = {}
+ const reg = /([^?&=]+)=([^?&=]*)/g
+ search.replace(reg, (rs, $1, $2) => {
+ const name = decodeURIComponent($1)
+ let val = decodeURIComponent($2)
+ val = String(val)
+ obj[name] = val
+ return rs
+ })
+ return obj
+}
+
+/**
+ * @param {string} input value
+ * @returns {number} output value
+ */
+export function byteLength(str) {
+ // returns the byte length of an utf8 string
+ let s = str.length
+ for (var i = str.length - 1; i >= 0; i--) {
+ const code = str.charCodeAt(i)
+ if (code > 0x7f && code <= 0x7ff) s++
+ else if (code > 0x7ff && code <= 0xffff) s += 2
+ if (code >= 0xDC00 && code <= 0xDFFF) i--
+ }
+ return s
+}
+
+/**
+ * @param {Array} actual
+ * @returns {Array}
+ */
+export function cleanArray(actual) {
+ const newArray = []
+ for (let i = 0; i < actual.length; i++) {
+ if (actual[i]) {
+ newArray.push(actual[i])
+ }
+ }
+ return newArray
+}
+
+/**
+ * @param {Object} json
+ * @returns {Array}
+ */
+export function param(json) {
+ if (!json) return ''
+ return cleanArray(
+ Object.keys(json).map(key => {
+ if (json[key] === undefined) return ''
+ return encodeURIComponent(key) + '=' + encodeURIComponent(json[key])
+ })
+ ).join('&')
+}
+
+/**
+ * @param {string} url
+ * @returns {Object}
+ */
+export function param2Obj(url) {
+ const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ')
+ if (!search) {
+ return {}
+ }
+ const obj = {}
+ const searchArr = search.split('&')
+ searchArr.forEach(v => {
+ const index = v.indexOf('=')
+ if (index !== -1) {
+ const name = v.substring(0, index)
+ const val = v.substring(index + 1, v.length)
+ obj[name] = val
+ }
+ })
+ return obj
+}
+
+/**
+ * @param {string} val
+ * @returns {string}
+ */
+export function html2Text(val) {
+ const div = document.createElement('div')
+ div.innerHTML = val
+ return div.textContent || div.innerText
+}
+
+/**
+ * Merges two objects, giving the last one precedence
+ * @param {Object} target
+ * @param {(Object|Array)} source
+ * @returns {Object}
+ */
+export function objectMerge(target, source) {
+ if (typeof target !== 'object') {
+ target = {}
+ }
+ if (Array.isArray(source)) {
+ return source.slice()
+ }
+ Object.keys(source).forEach(property => {
+ const sourceProperty = source[property]
+ if (typeof sourceProperty === 'object') {
+ target[property] = objectMerge(target[property], sourceProperty)
+ } else {
+ target[property] = sourceProperty
+ }
+ })
+ return target
+}
+
+/**
+ * @param {HTMLElement} element
+ * @param {string} className
+ */
+export function toggleClass(element, className) {
+ if (!element || !className) {
+ return
+ }
+ let classString = element.className
+ const nameIndex = classString.indexOf(className)
+ if (nameIndex === -1) {
+ classString += '' + className
+ } else {
+ classString =
+ classString.substr(0, nameIndex) +
+ classString.substr(nameIndex + className.length)
+ }
+ element.className = classString
+}
+
+/**
+ * @param {string} type
+ * @returns {Date}
+ */
+export function getTime(type) {
+ if (type === 'start') {
+ return new Date().getTime() - 3600 * 1000 * 24 * 90
+ } else {
+ return new Date(new Date().toDateString())
+ }
+}
+
+/**
+ * @param {Function} func
+ * @param {number} wait
+ * @param {boolean} immediate
+ * @return {*}
+ */
+export function debounce(func, wait, immediate) {
+ let timeout, args, context, timestamp, result
+
+ const later = function() {
+ // 据上一次触发时间间隔
+ const last = +new Date() - timestamp
+
+ // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
+ if (last < wait && last > 0) {
+ timeout = setTimeout(later, wait - last)
+ } else {
+ timeout = null
+ // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
+ if (!immediate) {
+ result = func.apply(context, args)
+ if (!timeout) context = args = null
+ }
+ }
+ }
+
+ return function(...args) {
+ context = this
+ timestamp = +new Date()
+ const callNow = immediate && !timeout
+ // 如果延时不存在,重新设定延时
+ if (!timeout) timeout = setTimeout(later, wait)
+ if (callNow) {
+ result = func.apply(context, args)
+ context = args = null
+ }
+
+ return result
+ }
+}
+
+/**
+ * This is just a simple version of deep copy
+ * Has a lot of edge cases bug
+ * If you want to use a perfect deep copy, use lodash's _.cloneDeep
+ * @param {Object} source
+ * @returns {Object}
+ */
+export function deepClone(source) {
+ if (!source && typeof source !== 'object') {
+ throw new Error('error arguments', 'deepClone')
+ }
+ const targetObj = source.constructor === Array ? [] : {}
+ Object.keys(source).forEach(keys => {
+ if (source[keys] && typeof source[keys] === 'object') {
+ targetObj[keys] = deepClone(source[keys])
+ } else {
+ targetObj[keys] = source[keys]
+ }
+ })
+ return targetObj
+}
+
+/**
+ * @param {Array} arr
+ * @returns {Array}
+ */
+export function uniqueArr(arr) {
+ return Array.from(new Set(arr))
+}
+
+/**
+ * @returns {string}
+ */
+export function createUniqueString() {
+ const timestamp = +new Date() + ''
+ const randomNum = parseInt((1 + Math.random()) * 65536) + ''
+ return (+(randomNum + timestamp)).toString(32)
+}
+
+/**
+ * Check if an element has a class
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ * @returns {boolean}
+ */
+export function hasClass(ele, cls) {
+ return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'))
+}
+
+/**
+ * Add class to element
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ */
+export function addClass(ele, cls) {
+ if (!hasClass(ele, cls)) ele.className += ' ' + cls
+}
+
+/**
+ * Remove class from element
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ */
+export function removeClass(ele, cls) {
+ if (hasClass(ele, cls)) {
+ const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)')
+ ele.className = ele.className.replace(reg, ' ')
+ }
+}
+
+export function makeMap(str, expectsLowerCase) {
+ const map = Object.create(null)
+ const list = str.split(',')
+ for (let i = 0; i < list.length; i++) {
+ map[list[i]] = true
+ }
+ return expectsLowerCase
+ ? val => map[val.toLowerCase()]
+ : val => map[val]
+}
+
+export const exportDefault = 'export default '
+
+export const beautifierConf = {
+ html: {
+ indent_size: '2',
+ indent_char: ' ',
+ max_preserve_newlines: '-1',
+ preserve_newlines: false,
+ keep_array_indentation: false,
+ break_chained_methods: false,
+ indent_scripts: 'separate',
+ brace_style: 'end-expand',
+ space_before_conditional: true,
+ unescape_strings: false,
+ jslint_happy: false,
+ end_with_newline: true,
+ wrap_line_length: '110',
+ indent_inner_html: true,
+ comma_first: false,
+ e4x: true,
+ indent_empty_lines: true
+ },
+ js: {
+ indent_size: '2',
+ indent_char: ' ',
+ max_preserve_newlines: '-1',
+ preserve_newlines: false,
+ keep_array_indentation: false,
+ break_chained_methods: false,
+ indent_scripts: 'normal',
+ brace_style: 'end-expand',
+ space_before_conditional: true,
+ unescape_strings: false,
+ jslint_happy: true,
+ end_with_newline: true,
+ wrap_line_length: '110',
+ indent_inner_html: true,
+ comma_first: false,
+ e4x: true,
+ indent_empty_lines: true
+ }
+}
+
+// 首字母大小
+export function titleCase(str) {
+ return str.replace(/( |^)[a-z]/g, L => L.toUpperCase())
+}
+
+// 下划转驼峰
+export function camelCase(str) {
+ return str.replace(/_[a-z]/g, str1 => str1.substr(-1).toUpperCase())
+}
+
+export function isNumberStr(str) {
+ return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str)
+}
+
diff --git a/fuintAdmin/src/utils/jsencrypt.js b/fuintAdmin/src/utils/jsencrypt.js
new file mode 100644
index 0000000..78d9523
--- /dev/null
+++ b/fuintAdmin/src/utils/jsencrypt.js
@@ -0,0 +1,30 @@
+import JSEncrypt from 'jsencrypt/bin/jsencrypt.min'
+
+// 密钥对生成 http://web.chacuo.net/netrsakeypair
+
+const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' +
+ 'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ=='
+
+const privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' +
+ '7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' +
+ 'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' +
+ 'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' +
+ 'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' +
+ 'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' +
+ 'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' +
+ 'UP8iWi1Qw0Y='
+
+// 加密
+export function encrypt(txt) {
+ const encryptor = new JSEncrypt()
+ encryptor.setPublicKey(publicKey) // 设置公钥
+ return encryptor.encrypt(txt) // 对数据进行加密
+}
+
+// 解密
+export function decrypt(txt) {
+ const encryptor = new JSEncrypt()
+ encryptor.setPrivateKey(privateKey) // 设置私钥
+ return encryptor.decrypt(txt) // 对数据进行解密
+}
+
diff --git a/fuintAdmin/src/utils/permission.js b/fuintAdmin/src/utils/permission.js
new file mode 100644
index 0000000..1730e33
--- /dev/null
+++ b/fuintAdmin/src/utils/permission.js
@@ -0,0 +1,51 @@
+import store from '@/store'
+
+/**
+ * 字符权限校验
+ * @param {Array} value 校验值
+ * @returns {Boolean}
+ */
+export function checkPermi(value) {
+ if (value && value instanceof Array && value.length > 0) {
+ const permissions = store.getters && store.getters.permissions
+ const permissionDatas = value
+ const all_permission = "*:*:*";
+
+ const hasPermission = permissions.some(permission => {
+ return all_permission === permission || permissionDatas.includes(permission)
+ })
+
+ if (!hasPermission) {
+ return false
+ }
+ return true
+ } else {
+ console.error(`need roles! Like checkPermi="['system:user:add','system:user:edit']"`)
+ return false
+ }
+}
+
+/**
+ * 角色权限校验
+ * @param {Array} value 校验值
+ * @returns {Boolean}
+ */
+export function checkRole(value) {
+ if (value && value instanceof Array && value.length > 0) {
+ const roles = store.getters && store.getters.roles
+ const permissionRoles = value
+ const super_admin = "admin";
+
+ const hasRole = roles.some(role => {
+ return super_admin === role || permissionRoles.includes(role)
+ })
+
+ if (!hasRole) {
+ return false
+ }
+ return true
+ } else {
+ console.error(`need roles! Like checkRole="['admin','editor']"`)
+ return false
+ }
+}
\ No newline at end of file
diff --git a/fuintAdmin/src/utils/request.js b/fuintAdmin/src/utils/request.js
new file mode 100644
index 0000000..178388b
--- /dev/null
+++ b/fuintAdmin/src/utils/request.js
@@ -0,0 +1,149 @@
+import axios from 'axios'
+import { Notification, MessageBox, Message } from 'element-ui'
+import store from '@/store'
+import { getToken } from '@/utils/auth'
+import errorCode from '@/utils/errorCode'
+import { tansParams } from "@/utils/fuint";
+import cache from '@/plugins/cache'
+
+// 是否显示重新登录
+export let isRelogin = { show: false };
+
+axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
+// 创建axios实例
+const service = axios.create({
+ // axios中请求配置有baseURL选项,表示请求URL公共部分
+ baseURL: process.env.VUE_APP_BASE_API,
+ // 超时
+ timeout: 30000
+})
+
+// request拦截器
+service.interceptors.request.use(config => {
+ // 是否需要防止数据重复提交
+ const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
+
+ if (getToken()) {
+ config.headers['Access-Token'] = getToken();
+ }
+
+ config.headers['platform'] = 'PC';
+
+ // get请求映射params参数
+ if (config.method === 'get' && config.params) {
+ let url = config.url + '?' + tansParams(config.params);
+ url = url.slice(0, -1);
+ config.params = {};
+ config.url = url;
+ }
+ if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
+ const requestObj = {
+ url: config.url,
+ data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
+ time: new Date().getTime()
+ }
+ const sessionObj = cache.session.getJSON('sessionObj')
+ if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
+ cache.session.setJSON('sessionObj', requestObj)
+ } else {
+ const s_url = sessionObj.url; // 请求地址
+ const s_data = sessionObj.data; // 请求数据
+ const s_time = sessionObj.time; // 请求时间
+ const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
+ if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
+ const message = '数据正在处理,请耐心等待';
+ console.warn(`[${s_url}]: ` + message)
+ return Promise.reject(new Error(message))
+ } else {
+ cache.session.setJSON('sessionObj', requestObj)
+ }
+ }
+ }
+ return config
+}, error => {
+ console.log(error)
+ Promise.reject(error)
+})
+
+// 响应拦截器
+service.interceptors.response.use(res => {
+ // 未设置状态码则默认成功状态
+ const code = res.data.code || 200;
+ // 获取错误信息
+ const msg = errorCode[code] || res.data.message || errorCode['default']
+ // 二进制数据则直接返回
+ if(res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer'){
+ return res.data
+ }
+ if (code === 401) {
+ if (!isRelogin.show) {
+ isRelogin.show = true;
+ MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
+ confirmButtonText: '重新登录',
+ cancelButtonText: '取消',
+ type: 'warning'
+ }
+ ).then(() => {
+ isRelogin.show = false;
+ store.dispatch('LogOut').then(() => {
+ location.href = '/index';
+ })
+ }).catch(() => {
+ isRelogin.show = false;
+ });
+ }
+ return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
+ } else if (code === 500) {
+ Message({
+ message: msg,
+ type: 'error'
+ })
+ return Promise.reject(new Error(msg))
+ } else if (code !== 200) {
+ Notification.error({
+ title: msg
+ })
+ return Promise.reject('error')
+ } else {
+ return res.data
+ }
+ },
+ error => {
+ console.log('err' + error)
+ let { message } = error;
+ if (message == "Network Error") {
+ message = "后端接口连接异常";
+ }
+ else if (message.includes("timeout")) {
+ message = "系统接口请求超时";
+ }
+ else if (message.includes("Request failed with status code")) {
+ message = "系统接口" + message.substr(message.length - 3) + "异常";
+ }
+ Message({
+ message: message,
+ type: 'error',
+ duration: 5 * 1000
+ })
+ return Promise.reject(error)
+ }
+)
+
+// 通用下载方法
+export function download(url, params) {
+ url = process.env.VUE_APP_BASE_API + url + '?token='+ getToken() + '&'+ param(params)
+ window.open(url, '_blank')
+}
+
+// 组织参数
+export function param(data) {
+ let url = ''
+ for(const k in data) {
+ const value = data[k] !== undefined ? data[k] : ''
+ url += '&' + k + '=' + encodeURIComponent(value)
+ }
+ // 去除第一个&
+ return url ? url.substring(1) : ''
+}
+
+export default service
diff --git a/fuintAdmin/src/utils/scroll-to.js b/fuintAdmin/src/utils/scroll-to.js
new file mode 100644
index 0000000..c5d8e04
--- /dev/null
+++ b/fuintAdmin/src/utils/scroll-to.js
@@ -0,0 +1,58 @@
+Math.easeInOutQuad = function(t, b, c, d) {
+ t /= d / 2
+ if (t < 1) {
+ return c / 2 * t * t + b
+ }
+ t--
+ return -c / 2 * (t * (t - 2) - 1) + b
+}
+
+// requestAnimationFrame for Smart Animating http://goo.gl/sx5sts
+var requestAnimFrame = (function() {
+ return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60) }
+})()
+
+/**
+ * Because it's so fucking difficult to detect the scrolling element, just move them all
+ * @param {number} amount
+ */
+function move(amount) {
+ document.documentElement.scrollTop = amount
+ document.body.parentNode.scrollTop = amount
+ document.body.scrollTop = amount
+}
+
+function position() {
+ return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop
+}
+
+/**
+ * @param {number} to
+ * @param {number} duration
+ * @param {Function} callback
+ */
+export function scrollTo(to, duration, callback) {
+ const start = position()
+ const change = to - start
+ const increment = 20
+ let currentTime = 0
+ duration = (typeof (duration) === 'undefined') ? 500 : duration
+ var animateScroll = function() {
+ // increment the time
+ currentTime += increment
+ // find the value with the quadratic in-out easing function
+ var val = Math.easeInOutQuad(currentTime, start, change, duration)
+ // move the document.body
+ move(val)
+ // do the animation unless its over
+ if (currentTime < duration) {
+ requestAnimFrame(animateScroll)
+ } else {
+ if (callback && typeof (callback) === 'function') {
+ // the animation is done so lets callback
+ callback()
+ }
+ }
+ }
+ animateScroll()
+}
diff --git a/fuintAdmin/src/utils/validate.js b/fuintAdmin/src/utils/validate.js
new file mode 100644
index 0000000..adfa254
--- /dev/null
+++ b/fuintAdmin/src/utils/validate.js
@@ -0,0 +1,83 @@
+/**
+ * @param {string} path
+ * @returns {Boolean}
+ */
+export function isExternal(path) {
+ return /^(https?:|mailto:|tel:)/.test(path)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validUsername(str) {
+ const valid_map = ['admin', 'editor']
+ return valid_map.indexOf(str.trim()) >= 0
+}
+
+/**
+ * @param {string} url
+ * @returns {Boolean}
+ */
+export function validURL(url) {
+ const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
+ return reg.test(url)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validLowerCase(str) {
+ const reg = /^[a-z]+$/
+ return reg.test(str)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validUpperCase(str) {
+ const reg = /^[A-Z]+$/
+ return reg.test(str)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validAlphabets(str) {
+ const reg = /^[A-Za-z]+$/
+ return reg.test(str)
+}
+
+/**
+ * @param {string} email
+ * @returns {Boolean}
+ */
+export function validEmail(email) {
+ const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
+ return reg.test(email)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function isString(str) {
+ if (typeof str === 'string' || str instanceof String) {
+ return true
+ }
+ return false
+}
+
+/**
+ * @param {Array} arg
+ * @returns {Boolean}
+ */
+export function isArray(arg) {
+ if (typeof Array.isArray === 'undefined') {
+ return Object.prototype.toString.call(arg) === '[object Array]'
+ }
+ return Array.isArray(arg)
+}
diff --git a/fuintAdmin/src/views/balance/distribute.vue b/fuintAdmin/src/views/balance/distribute.vue
new file mode 100644
index 0000000..79423f3
--- /dev/null
+++ b/fuintAdmin/src/views/balance/distribute.vue
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+
+ 全部会员
+ 部分会员
+ 总会员数:{{ totalMember }}
+ 选择会员(已选{{ form.memberIds.length }}人)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/balance/list.vue b/fuintAdmin/src/views/balance/list.vue
new file mode 100644
index 0000000..07aa71f
--- /dev/null
+++ b/fuintAdmin/src/views/balance/list.vue
@@ -0,0 +1,184 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+ {{ scope.row.userId }}
+ 全体会员
+
+
+
+
+ {{ scope.row.userInfo.userNo }}
+ -
+
+
+
+
+ {{ scope.row.userInfo.mobile }}
+ -
+
+
+
+
+
+ {{ scope.row.userInfo.name }}
+
+ -
+
+
+
+
+ +{{ scope.row.amount }}
+ {{ scope.row.amount }}
+
+
+
+
+ {{ scope.row.description }}
+ 无
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+ -
+
+
+
+
+ {{ scope.row.operator }}
+ -
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/balance/setting.vue b/fuintAdmin/src/views/balance/setting.vue
new file mode 100644
index 0000000..8945392
--- /dev/null
+++ b/fuintAdmin/src/views/balance/setting.vue
@@ -0,0 +1,171 @@
+
+
+
+
+ 充值规则设置
+
+
+
+
+ 赠送
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 开启
+ 关闭
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/cashier/components/hangUpDialog.vue b/fuintAdmin/src/views/cashier/components/hangUpDialog.vue
new file mode 100644
index 0000000..a2655b7
--- /dev/null
+++ b/fuintAdmin/src/views/cashier/components/hangUpDialog.vue
@@ -0,0 +1,172 @@
+
+
+
+
+
+
+
{{ orderInfo.hangNo }}
+
+
会员:{{ orderInfo.memberInfo ? orderInfo.memberInfo.name : '游客' }}
+
件数:{{ orderInfo.num }}
+
金额:¥{{ orderInfo.amount }}
+
{{ orderInfo.dateTime }}
+
+
+
+
{{ orderInfo.hangNo }}
+
空白位置
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/cashier/components/noGoodsCashier.vue b/fuintAdmin/src/views/cashier/components/noGoodsCashier.vue
new file mode 100644
index 0000000..9519417
--- /dev/null
+++ b/fuintAdmin/src/views/cashier/components/noGoodsCashier.vue
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+ ( 单位:元 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/cashier/components/orderPrintDialog.vue b/fuintAdmin/src/views/cashier/components/orderPrintDialog.vue
new file mode 100644
index 0000000..ac7bd01
--- /dev/null
+++ b/fuintAdmin/src/views/cashier/components/orderPrintDialog.vue
@@ -0,0 +1,175 @@
+
+
+
+
+
{{ storeInfo.name }}
+
NO:{{ orderInfo.orderSn }}
+
+
****************************************
+
+
+ {{ index+1 }}.{{ goodsInfo.name }}
+ x{{ goodsInfo.num }}
+ ¥{{ goodsInfo.price }}
+
+
+
****************************************
+
+
会员名称: {{ orderInfo.userInfo.name }}
+
会员号码: {{ orderInfo.userInfo.userNo ? orderInfo.userInfo.userNo : '-' }}
+
会员信息: 无
+
+
****************************************
+
+
订单类型:{{ orderInfo.typeName }}
+
订单时间:{{ orderInfo.createTime }}
+
优惠金额:¥{{ orderInfo.discount.toFixed(2) }}
+
应收金额:¥{{ orderInfo.payAmount.toFixed(2) }}
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/cashier/components/payResultDialog.vue b/fuintAdmin/src/views/cashier/components/payResultDialog.vue
new file mode 100644
index 0000000..4afc980
--- /dev/null
+++ b/fuintAdmin/src/views/cashier/components/payResultDialog.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+ ¥{{ payResult.payAmount.toFixed(2) }}
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/cashier/components/scanPayCodeDialog.vue b/fuintAdmin/src/views/cashier/components/scanPayCodeDialog.vue
new file mode 100644
index 0000000..e0ac8f4
--- /dev/null
+++ b/fuintAdmin/src/views/cashier/components/scanPayCodeDialog.vue
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+ ¥{{ payAmount.toFixed(2) }}
+
+
请使用扫码枪,扫描会员付款码!
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/cashier/components/settlementDialog.vue b/fuintAdmin/src/views/cashier/components/settlementDialog.vue
new file mode 100644
index 0000000..ce53641
--- /dev/null
+++ b/fuintAdmin/src/views/cashier/components/settlementDialog.vue
@@ -0,0 +1,447 @@
+
+
+
+
+
暂无可用卡券
+
+
+
+
+
¥{{ coupon.amount }}
+
{{ coupon.description }}
+
+
+
{{ coupon.name }}
+
{{ coupon.effectiveDate }}
+
+
+
+
+
+
+
+
+
+
+
结算信息
+
+
+
可用卡券:({{ memberInfo ? couponList.length : 0 }})
+
+
+
+
+
+
+
+
+ 折扣:(折)
+
+
+
+
+
+ 立减:(元)
+
+
+
+
+
+
+
+ 优惠金额:¥{{ discountPrice.toFixed(2) }}
+ 应付金额:¥{{ newTotalPrice.toFixed(2) }}
+
+
+
+
+
会员信息
+
+
+
+
+
+
手机号:
{{ memberInfo.mobile ? memberInfo.mobile : '暂无' }}
+
会员号:
{{ memberInfo.userNo ? memberInfo.userNo : '暂无' }}
+
可用余额:
{{ memberInfo.balance ? memberInfo.balance.toFixed(2) : 0.00 }}(元)
+
可用积分:
{{ memberInfo.point ? memberInfo.point : '0' }}
+
+
+
+ 关联会员
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/cashier/components/switchMemberDialog.vue b/fuintAdmin/src/views/cashier/components/switchMemberDialog.vue
new file mode 100644
index 0000000..4db7999
--- /dev/null
+++ b/fuintAdmin/src/views/cashier/components/switchMemberDialog.vue
@@ -0,0 +1,133 @@
+
+
+
+
+
+
+
+
+
+
+
+
会员名称:{{ memberInfo.name }}
+
会员性别:{{ memberInfo.sex == '1' ? '男' : '女' }}
+
+
+
手机号码:{{ memberInfo.mobile ? memberInfo.mobile : '暂无' }}
+
会员号码:{{ memberInfo.userNo ? memberInfo.userNo : '暂无' }}
+
+
+
可用余额:{{ memberInfo.balance ? memberInfo.balance.toFixed(2) : '0.00' }}(元)
+
可用积分:{{ memberInfo.point ? memberInfo.point : '0' }}
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/cashier/index.vue b/fuintAdmin/src/views/cashier/index.vue
new file mode 100644
index 0000000..fc0d3b3
--- /dev/null
+++ b/fuintAdmin/src/views/cashier/index.vue
@@ -0,0 +1,1247 @@
+
+
+
+
+
+
+
收银台
+
({{ storeInfo.name }})
+
您好,{{ accountInfo.realName }}!
+
+
+
+
+
+
+
+
+
+ 查询商品
+
+
+
+
+
+
+
+
+
+
+
{{ goodsInfo.name }}
+
¥{{ goodsInfo.price }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ memberInfo.mobile ? memberInfo.mobile : memberInfo.name }}
+ 当前为游客
+ 关联会员
+
+
+
+
+
+
+
+
+ 结算商品
+
+
+
+
+
{{ cartInfo.name }}
+
+ {{ spec.value }}
+
+
+
+
+
+
¥{{ (cartInfo.price * cartInfo.buyNum).toFixed(2) }}
+
+
+
+
+
+
+
+
+ 订单列表
+
+
+
+
单号:{{ orderItem.orderSn }}
+
金额:¥{{ orderItem.amount }}
+
会员:{{ orderItem.userInfo.name }} {{ orderItem.userInfo.mobile }}
+
会员:游客
+
时间:{{ orderItem.createTime }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ goodsInfo.name }}
+
¥{{ goodsInfo.price }}
+
+
+
+
{{ specInfo.name }}
+
+ {{ value.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/commission/cash/detail.vue b/fuintAdmin/src/views/commission/cash/detail.vue
new file mode 100644
index 0000000..5174f68
--- /dev/null
+++ b/fuintAdmin/src/views/commission/cash/detail.vue
@@ -0,0 +1,112 @@
+
+
+
+
+
+ {{ scope.row.orderInfo.orderSn }}
+
+
+
+
+ {{ getName(targetList, scope.row.target) }}
+
+
+
+
+ {{ scope.row.staffInfo ? scope.row.staffInfo.realName : '-' }}
+
+
+
+
+ {{ scope.row.userInfo ? scope.row.userInfo.userName : '-' }}
+
+
+
+
+
+ {{ scope.row.storeInfo.name }}
+
+
+
+
+ {{ parseTime(scope.row.orderInfo.createTime) }}
+
+
+
+
+ {{ scope.row.amount.toFixed(2) }}
+
+
+
+
+ {{ scope.row.ruleInfo.name }}
+
+
+
+
+ {{ getName(statusList, scope.row.status) }}
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/commission/cash/index.vue b/fuintAdmin/src/views/commission/cash/index.vue
new file mode 100644
index 0000000..807df7a
--- /dev/null
+++ b/fuintAdmin/src/views/commission/cash/index.vue
@@ -0,0 +1,282 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+ {{ scope.row.staffInfo ? scope.row.staffInfo.mobile : '-' }}
+
+
+
+
+ {{ scope.row.staffInfo ? scope.row.staffInfo.realName : '-' }}
+
+
+
+
+ {{ scope.row.userInfo ? scope.row.userInfo.userName : '-' }}
+
+
+
+
+ {{ scope.row.storeInfo ? scope.row.storeInfo.name : '-' }}
+
+
+
+
+ ¥{{scope.row.amount}}
+
+
+
+
+ {{ getName(statusList, scope.row.status) }}
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+
+ 详情
+
+ 修改
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/commission/log/index.vue b/fuintAdmin/src/views/commission/log/index.vue
new file mode 100644
index 0000000..ff92b65
--- /dev/null
+++ b/fuintAdmin/src/views/commission/log/index.vue
@@ -0,0 +1,466 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ~
+
+
+
+ 搜索
+ 重置
+ 发起结算
+
+
+
+
+
+
+ {{ scope.row.orderInfo.orderSn }}
+
+
+
+
+ {{ getName(targetList, scope.row.target) }}
+
+
+
+
+ {{ scope.row.staffInfo ? scope.row.staffInfo.realName : '-' }}
+
+
+
+
+ {{ scope.row.userInfo ? scope.row.userInfo.userName : '-' }}
+
+
+
+
+
+ {{ scope.row.storeInfo.name }}
+
+
+
+
+ {{ parseTime(scope.row.orderInfo.createTime) }}
+
+
+
+
+ {{ scope.row.amount.toFixed(2) }}
+
+
+
+
+ {{ scope.row.ruleInfo.name }}
+
+
+
+
+ {{ getName(statusList, scope.row.status) }}
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ 修改
+
+ 作废
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 正常
+ 作废
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.staffInfo ? scope.row.staffInfo.mobile : '-' }}
+
+
+
+
+ {{ scope.row.staffInfo ? scope.row.staffInfo.realName : '-' }}
+
+
+
+
+ {{ scope.row.userInfo ? scope.row.userInfo.userName : '-' }}
+
+
+
+
+ {{ scope.row.storeInfo.name }}
+ -
+
+
+
+
+ {{ scope.row.amount.toFixed(2) }}
+ 0.00
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/commission/relation/index.vue b/fuintAdmin/src/views/commission/relation/index.vue
new file mode 100644
index 0000000..e5e6e3a
--- /dev/null
+++ b/fuintAdmin/src/views/commission/relation/index.vue
@@ -0,0 +1,377 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+ 新增
+
+
+
+
+
+
+
+
+
+ {{ getName(storeList, scope.row.storeId) }}
+
+ 公共所有
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ {{ parseTime(scope.row.updateTime) }}
+
+
+
+
+
+
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (提示:点击图片修改,建议尺寸:640 x 350)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 启用
+ 禁用
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/commission/rule/index.vue b/fuintAdmin/src/views/commission/rule/index.vue
new file mode 100644
index 0000000..c37c5dc
--- /dev/null
+++ b/fuintAdmin/src/views/commission/rule/index.vue
@@ -0,0 +1,517 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 新增方案
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ {{ parseTime(scope.row.updateTime) }}
+
+
+
+
+ 修改
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 员工提成
+ 会员分销
+
+
+
+
+
+
+
+
+ {{ orderType.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ * 详细规则配置:
+ 添加项目
+
+
+
+
+
+
+
+
+
+
+ ¥ {{scope.row.price}} 元
+
+
+
+
+
+ 按比率提成(%)
+ 按固定提成(元)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ¥{{scope.row.price}} 元
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/components/charts/index.vue b/fuintAdmin/src/views/components/charts/index.vue
new file mode 100644
index 0000000..a3a7a22
--- /dev/null
+++ b/fuintAdmin/src/views/components/charts/index.vue
@@ -0,0 +1,228 @@
+
+
+
+
+
diff --git a/fuintAdmin/src/views/components/charts/mixins/resize.js b/fuintAdmin/src/views/components/charts/mixins/resize.js
new file mode 100644
index 0000000..b1e76e9
--- /dev/null
+++ b/fuintAdmin/src/views/components/charts/mixins/resize.js
@@ -0,0 +1,56 @@
+import { debounce } from '@/utils'
+
+export default {
+ data() {
+ return {
+ $_sidebarElm: null,
+ $_resizeHandler: null
+ }
+ },
+ mounted() {
+ this.initListener()
+ },
+ activated() {
+ if (!this.$_resizeHandler) {
+ // avoid duplication init
+ this.initListener()
+ }
+
+ // when keep-alive chart activated, auto resize
+ this.resize()
+ },
+ beforeDestroy() {
+ this.destroyListener()
+ },
+ deactivated() {
+ this.destroyListener()
+ },
+ methods: {
+ // use $_ for mixins properties
+ // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
+ $_sidebarResizeHandler(e) {
+ if (e.propertyName === 'width') {
+ this.$_resizeHandler()
+ }
+ },
+ initListener() {
+ this.$_resizeHandler = debounce(() => {
+ this.resize()
+ }, 100)
+ window.addEventListener('resize', this.$_resizeHandler)
+
+ this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0]
+ this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler)
+ },
+ destroyListener() {
+ window.removeEventListener('resize', this.$_resizeHandler)
+ this.$_resizeHandler = null
+
+ this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler)
+ },
+ resize() {
+ const { chart } = this
+ chart && chart.resize()
+ }
+ }
+}
diff --git a/fuintAdmin/src/views/components/icons/element-icons.js b/fuintAdmin/src/views/components/icons/element-icons.js
new file mode 100644
index 0000000..9ea4d63
--- /dev/null
+++ b/fuintAdmin/src/views/components/icons/element-icons.js
@@ -0,0 +1,3 @@
+const elementIcons = ['platform-eleme', 'eleme', 'delete-solid', 'delete', 's-tools', 'setting', 'user-solid', 'user', 'phone', 'phone-outline', 'more', 'more-outline', 'star-on', 'star-off', 's-goods', 'goods', 'warning', 'warning-outline', 'question', 'info', 'remove', 'circle-plus', 'success', 'error', 'zoom-in', 'zoom-out', 'remove-outline', 'circle-plus-outline', 'circle-check', 'circle-close', 's-help', 'help', 'minus', 'plus', 'check', 'close', 'picture', 'picture-outline', 'picture-outline-round', 'upload', 'upload2', 'download', 'camera-solid', 'camera', 'video-camera-solid', 'video-camera', 'message-solid', 'bell', 's-cooperation', 's-order', 's-platform', 's-fold', 's-unfold', 's-operation', 's-promotion', 's-home', 's-release', 's-ticket', 's-management', 's-open', 's-shop', 's-marketing', 's-flag', 's-comment', 's-finance', 's-claim', 's-custom', 's-opportunity', 's-data', 's-check', 's-grid', 'menu', 'share', 'd-caret', 'caret-left', 'caret-right', 'caret-bottom', 'caret-top', 'bottom-left', 'bottom-right', 'back', 'right', 'bottom', 'top', 'top-left', 'top-right', 'arrow-left', 'arrow-right', 'arrow-down', 'arrow-up', 'd-arrow-left', 'd-arrow-right', 'video-pause', 'video-play', 'refresh', 'refresh-right', 'refresh-left', 'finished', 'sort', 'sort-up', 'sort-down', 'rank', 'loading', 'view', 'c-scale-to-original', 'date', 'edit', 'edit-outline', 'folder', 'folder-opened', 'folder-add', 'folder-remove', 'folder-delete', 'folder-checked', 'tickets', 'document-remove', 'document-delete', 'document-copy', 'document-checked', 'document', 'document-add', 'printer', 'paperclip', 'takeaway-box', 'search', 'monitor', 'attract', 'mobile', 'scissors', 'umbrella', 'headset', 'brush', 'mouse', 'coordinate', 'magic-stick', 'reading', 'data-line', 'data-board', 'pie-chart', 'data-analysis', 'collection-tag', 'film', 'suitcase', 'suitcase-1', 'receiving', 'collection', 'files', 'notebook-1', 'notebook-2', 'toilet-paper', 'office-building', 'school', 'table-lamp', 'house', 'no-smoking', 'smoking', 'shopping-cart-full', 'shopping-cart-1', 'shopping-cart-2', 'shopping-bag-1', 'shopping-bag-2', 'sold-out', 'sell', 'present', 'box', 'bank-card', 'money', 'coin', 'wallet', 'discount', 'price-tag', 'news', 'guide', 'male', 'female', 'thumb', 'cpu', 'link', 'connection', 'open', 'turn-off', 'set-up', 'chat-round', 'chat-line-round', 'chat-square', 'chat-dot-round', 'chat-dot-square', 'chat-line-square', 'message', 'postcard', 'position', 'turn-off-microphone', 'microphone', 'close-notification', 'bangzhu', 'time', 'odometer', 'crop', 'aim', 'switch-button', 'full-screen', 'copy-document', 'mic', 'stopwatch', 'medal-1', 'medal', 'trophy', 'trophy-1', 'first-aid-kit', 'discover', 'place', 'location', 'location-outline', 'location-information', 'add-location', 'delete-location', 'map-location', 'alarm-clock', 'timer', 'watch-1', 'watch', 'lock', 'unlock', 'key', 'service', 'mobile-phone', 'bicycle', 'truck', 'ship', 'basketball', 'football', 'soccer', 'baseball', 'wind-power', 'light-rain', 'lightning', 'heavy-rain', 'sunrise', 'sunrise-1', 'sunset', 'sunny', 'cloudy', 'partly-cloudy', 'cloudy-and-sunny', 'moon', 'moon-night', 'dish', 'dish-1', 'food', 'chicken', 'fork-spoon', 'knife-fork', 'burger', 'tableware', 'sugar', 'dessert', 'ice-cream', 'hot-water', 'water-cup', 'coffee-cup', 'cold-drink', 'goblet', 'goblet-full', 'goblet-square', 'goblet-square-full', 'refrigerator', 'grape', 'watermelon', 'cherry', 'apple', 'pear', 'orange', 'coffee', 'ice-tea', 'ice-drink', 'milk-tea', 'potato-strips', 'lollipop', 'ice-cream-square', 'ice-cream-round']
+
+export default elementIcons
diff --git a/fuintAdmin/src/views/components/icons/index.vue b/fuintAdmin/src/views/components/icons/index.vue
new file mode 100644
index 0000000..d3c9a71
--- /dev/null
+++ b/fuintAdmin/src/views/components/icons/index.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ {{ generateIconCode(item) }}
+
+
+
+ {{ item }}
+
+
+
+
+
+
+
+
+ {{ generateElementIconCode(item) }}
+
+
+
+ {{ item }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/components/icons/svg-icons.js b/fuintAdmin/src/views/components/icons/svg-icons.js
new file mode 100644
index 0000000..724cd8e
--- /dev/null
+++ b/fuintAdmin/src/views/components/icons/svg-icons.js
@@ -0,0 +1,10 @@
+const req = require.context('../../../assets/icons/svg', false, /\.svg$/)
+const requireAll = requireContext => requireContext.keys()
+
+const re = /\.\/(.*)\.svg/
+
+const svgIcons = requireAll(req).map(i => {
+ return i.match(re)[1]
+})
+
+export default svgIcons
diff --git a/fuintAdmin/src/views/content/article/index.vue b/fuintAdmin/src/views/content/article/index.vue
new file mode 100644
index 0000000..2ac51d1
--- /dev/null
+++ b/fuintAdmin/src/views/content/article/index.vue
@@ -0,0 +1,364 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+ 新增
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (提示:点击图片修改,建议尺寸:640 x 350)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 启用
+ 禁用
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/content/banner/list.vue b/fuintAdmin/src/views/content/banner/list.vue
new file mode 100644
index 0000000..3edfcb0
--- /dev/null
+++ b/fuintAdmin/src/views/content/banner/list.vue
@@ -0,0 +1,382 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+ 新增
+
+
+
+
+
+
+
+
+
+ {{ getName(storeList, scope.row.storeId) }}
+
+ 公共所有
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ {{ parseTime(scope.row.updateTime) }}
+
+
+
+
+
+
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (提示:点击图片修改,建议尺寸:640 x 350)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 启用
+ 禁用
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/coupon/confirm/index.vue b/fuintAdmin/src/views/coupon/confirm/index.vue
new file mode 100644
index 0000000..31b028b
--- /dev/null
+++ b/fuintAdmin/src/views/coupon/confirm/index.vue
@@ -0,0 +1,215 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 确定核销
+ 返回列表
+
+
+
+
+
+
+
+
+
+ [{{ getName(typeList, couponInfo.type) }}]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 元
+
+
+
+
+
+
+
+ 元
+
+
+
+
+
+
+
+ 元
+
+
+
+
+
+
+
+ 总共{{ couponInfo.useRule }} 次,已核销 {{ couponInfo.confirmCount }} 次
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/coupon/confirmLog/index.vue b/fuintAdmin/src/views/coupon/confirmLog/index.vue
new file mode 100644
index 0000000..40289b9
--- /dev/null
+++ b/fuintAdmin/src/views/coupon/confirmLog/index.vue
@@ -0,0 +1,216 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+
+ {{ scope.row.userInfo.mobile }}
+ -
+
+
+
+
+
+ {{ scope.row.userInfo.name }}
+
+ -
+
+
+
+
+ {{ getName(typeList, scope.row.couponInfo.type) }}
+ -
+
+
+
+
+ {{ scope.row.couponInfo.name }}
+ -
+
+
+
+
+ {{ scope.row.storeInfo.name }}
+ 暂无
+
+
+
+
+ {{ scope.row.amount }}元
+ -
+
+
+
+
+ {{ scope.row.remark }}
+
+
+
+
+ {{scope.row.operator }}
+ -
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+ -
+
+
+
+
+ 正常
+ 撤销
+
+
+
+
+ 撤销
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/coupon/coupon/index.vue b/fuintAdmin/src/views/coupon/coupon/index.vue
new file mode 100644
index 0000000..08f783a
--- /dev/null
+++ b/fuintAdmin/src/views/coupon/coupon/index.vue
@@ -0,0 +1,960 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+ 新增
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.name }}
+ 无
+
+
+
+
+
+ {{ getName(groupList, scope.row.groupId) }}
+
+ 无
+
+
+
+
+
+ {{ getName(typeList, scope.row.type) }}
+
+ 无
+
+
+
+
+ {{ parseTime(scope.row.beginTime) }}
+ {{ parseTime(scope.row.endTime) }}
+ 领取后{{ scope.row.expireTime }}天
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ {{ getName(statusList, scope.row.status) }}
+
+
+
+
+ 发券
+ 二维码
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 固定时间
+ 领取后生效
+
+
+
+
+
+
+
+
+ 至
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 后台发放
+ 前台领取
+ 线下发放
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 不允许
+ 允许
+
+
+
+
+
+
+
+
+ 全场通用
+ 指定商品
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 添加
+
+
+ 到账
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 后台发放
+ 前台领取
+ 线下发放
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (提示:点击图片修改,建议尺寸:300 x 240)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 部分会员
+ 全部会员
+ 总会员数:{{ totalMember }}
+ 选择会员(已选{{ sendForm.memberIds.length }}人)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/coupon/give/index.vue b/fuintAdmin/src/views/coupon/give/index.vue
new file mode 100644
index 0000000..f1065a9
--- /dev/null
+++ b/fuintAdmin/src/views/coupon/give/index.vue
@@ -0,0 +1,217 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+
+ {{ scope.row.mobile }}
+ -
+
+
+
+
+ {{ scope.row.couponNames }}
+ -
+
+
+
+
+ {{ scope.row.userMobile }}
+ -
+
+
+
+
+ {{ scope.row.num }}
+
+
+
+
+ {{scope.row.money }}
+ -
+
+
+
+
+ {{ scope.row.createTime }}
+ -
+
+
+
+
+ 正常
+ 撤销
+
+
+
+
+ 查看
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/coupon/group/index.vue b/fuintAdmin/src/views/coupon/group/index.vue
new file mode 100644
index 0000000..1602d5c
--- /dev/null
+++ b/fuintAdmin/src/views/coupon/group/index.vue
@@ -0,0 +1,294 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+ 新增
+
+
+
+
+
+
+
+
+ {{ scope.row.num }}
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ {{ parseTime(scope.row.updateTime) }}
+
+
+
+
+
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 启用
+ 禁用
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/coupon/sendLog/index.vue b/fuintAdmin/src/views/coupon/sendLog/index.vue
new file mode 100644
index 0000000..0bf9a88
--- /dev/null
+++ b/fuintAdmin/src/views/coupon/sendLog/index.vue
@@ -0,0 +1,184 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+
+ {{ scope.row.mobile }}
+ -
+
+
+
+
+ {{ scope.row.couponId }}
+
+
+
+
+ 正常
+ 撤销
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+ -
+
+
+
+
+ {{scope.row.operator }}
+ -
+
+
+
+
+ 撤销
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/coupon/userCoupon/index.vue b/fuintAdmin/src/views/coupon/userCoupon/index.vue
new file mode 100644
index 0000000..efecf1c
--- /dev/null
+++ b/fuintAdmin/src/views/coupon/userCoupon/index.vue
@@ -0,0 +1,272 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 导出
+ 重置
+
+
+
+
+
+
+
+
+
+ {{ scope.row.userInfo.id }}
+
+ -
+
+
+
+
+ {{ scope.row.userInfo.userNo }}
+ -
+
+
+
+
+ {{ scope.row.userInfo.mobile ? scope.row.userInfo.mobile : '-' }}
+ -
+
+
+
+
+
+ {{ scope.row.userInfo.name }}
+
+ -
+
+
+
+
+ {{ getName(typeList, scope.row.type) }}
+ -
+
+
+
+
+
+ {{ scope.row.storeInfo.name }}
+ 暂无
+
+
+
+
+ {{ scope.row.amount }}
+
+
+
+
+ {{ scope.row.balance }}
+ {{ scope.row.amount }}
+
+
+
+
+ {{ getName(statusList, scope.row.status) }}
+ 无
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+ -
+
+
+
+
+ 核销
+ 作废
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/dashboard/BarChart.vue b/fuintAdmin/src/views/dashboard/BarChart.vue
new file mode 100644
index 0000000..be0af34
--- /dev/null
+++ b/fuintAdmin/src/views/dashboard/BarChart.vue
@@ -0,0 +1,102 @@
+
+
+
+
+
diff --git a/fuintAdmin/src/views/dashboard/LineChart.vue b/fuintAdmin/src/views/dashboard/LineChart.vue
new file mode 100644
index 0000000..e654168
--- /dev/null
+++ b/fuintAdmin/src/views/dashboard/LineChart.vue
@@ -0,0 +1,135 @@
+
+
+
+
+
diff --git a/fuintAdmin/src/views/dashboard/PanelGroup.vue b/fuintAdmin/src/views/dashboard/PanelGroup.vue
new file mode 100644
index 0000000..1a1081f
--- /dev/null
+++ b/fuintAdmin/src/views/dashboard/PanelGroup.vue
@@ -0,0 +1,181 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/dashboard/PieChart.vue b/fuintAdmin/src/views/dashboard/PieChart.vue
new file mode 100644
index 0000000..4d2ef32
--- /dev/null
+++ b/fuintAdmin/src/views/dashboard/PieChart.vue
@@ -0,0 +1,79 @@
+
+
+
+
+
diff --git a/fuintAdmin/src/views/dashboard/RaddarChart.vue b/fuintAdmin/src/views/dashboard/RaddarChart.vue
new file mode 100644
index 0000000..6823af3
--- /dev/null
+++ b/fuintAdmin/src/views/dashboard/RaddarChart.vue
@@ -0,0 +1,116 @@
+
+
+
+
+
diff --git a/fuintAdmin/src/views/dashboard/mixins/resize.js b/fuintAdmin/src/views/dashboard/mixins/resize.js
new file mode 100644
index 0000000..b1e76e9
--- /dev/null
+++ b/fuintAdmin/src/views/dashboard/mixins/resize.js
@@ -0,0 +1,56 @@
+import { debounce } from '@/utils'
+
+export default {
+ data() {
+ return {
+ $_sidebarElm: null,
+ $_resizeHandler: null
+ }
+ },
+ mounted() {
+ this.initListener()
+ },
+ activated() {
+ if (!this.$_resizeHandler) {
+ // avoid duplication init
+ this.initListener()
+ }
+
+ // when keep-alive chart activated, auto resize
+ this.resize()
+ },
+ beforeDestroy() {
+ this.destroyListener()
+ },
+ deactivated() {
+ this.destroyListener()
+ },
+ methods: {
+ // use $_ for mixins properties
+ // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
+ $_sidebarResizeHandler(e) {
+ if (e.propertyName === 'width') {
+ this.$_resizeHandler()
+ }
+ },
+ initListener() {
+ this.$_resizeHandler = debounce(() => {
+ this.resize()
+ }, 100)
+ window.addEventListener('resize', this.$_resizeHandler)
+
+ this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0]
+ this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler)
+ },
+ destroyListener() {
+ window.removeEventListener('resize', this.$_resizeHandler)
+ this.$_resizeHandler = null
+
+ this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler)
+ },
+ resize() {
+ const { chart } = this
+ chart && chart.resize()
+ }
+ }
+}
diff --git a/fuintAdmin/src/views/error/401.vue b/fuintAdmin/src/views/error/401.vue
new file mode 100644
index 0000000..448b6ec
--- /dev/null
+++ b/fuintAdmin/src/views/error/401.vue
@@ -0,0 +1,88 @@
+
+
+
+ 返回
+
+
+
+
+ 401错误!
+
+ 您没有访问权限!
+ 对不起,您没有访问权限,请不要进行非法操作!您可以返回主页面
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/error/404.vue b/fuintAdmin/src/views/error/404.vue
new file mode 100644
index 0000000..96f075c
--- /dev/null
+++ b/fuintAdmin/src/views/error/404.vue
@@ -0,0 +1,233 @@
+
+
+
+
+
+
+ 404错误!
+
+
+ {{ message }}
+
+
+ 对不起,您正在寻找的页面不存在。尝试检查URL的错误,然后按浏览器上的刷新按钮或尝试在我们的应用程序中找到其他内容。
+
+
+ 返回首页
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/goods/cate/index.vue b/fuintAdmin/src/views/goods/cate/index.vue
new file mode 100644
index 0000000..df1c0fb
--- /dev/null
+++ b/fuintAdmin/src/views/goods/cate/index.vue
@@ -0,0 +1,384 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+ 新增
+
+
+
+
+
+
+
+ {{ scope.row.storeName }}
+ 公共所有
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ {{ parseTime(scope.row.updateTime) }}
+
+
+
+
+
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 提示:未选择则属于公共分类
+
+
+
+
+
+
+
+ 提示:数值越小,排行越靠前
+
+
+
+
+
+
+
+
+
+
+
+
+ (提示:点击图片修改,建议尺寸:128 x 128)
+
+
+
+
+
+
+
+
+
+
+
+
+ 启用
+ 禁用
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/goods/components/Sku.vue b/fuintAdmin/src/views/goods/components/Sku.vue
new file mode 100644
index 0000000..a9984f9
--- /dev/null
+++ b/fuintAdmin/src/views/goods/components/Sku.vue
@@ -0,0 +1,444 @@
+
+
+
+
+ 添加规格
+
+
+
+
+ 规格名
+
+
+
+
规格值
+
+ {{ subItem.name }}
+ 添加
+
+
+
+
删除规格
+
+
+
+
+ 批量设置
+
+ 随机生成
+
+
+
+
+ 确认设置
+
+
+
+
+
+ {{ scope.$index + 1 }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ spec.value }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/goods/goods/add.vue b/fuintAdmin/src/views/goods/goods/add.vue
new file mode 100644
index 0000000..3c54e8e
--- /dev/null
+++ b/fuintAdmin/src/views/goods/goods/add.vue
@@ -0,0 +1,12 @@
+
+
+
+
+
diff --git a/fuintAdmin/src/views/goods/goods/edit.vue b/fuintAdmin/src/views/goods/goods/edit.vue
new file mode 100644
index 0000000..c488a13
--- /dev/null
+++ b/fuintAdmin/src/views/goods/goods/edit.vue
@@ -0,0 +1,12 @@
+
+
+
+
+
diff --git a/fuintAdmin/src/views/goods/goods/goodsForm.vue b/fuintAdmin/src/views/goods/goods/goodsForm.vue
new file mode 100644
index 0000000..1bb4618
--- /dev/null
+++ b/fuintAdmin/src/views/goods/goods/goodsForm.vue
@@ -0,0 +1,499 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 随机生成条码
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 提示:未选择则属于公共商品
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 提示:数值越小,排行越靠前
+
+
+
+
+
+
+
+ 上架
+ 下架
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 可用
+ 不可用
+
+
+
+
+
+
+
+
+ 有折扣
+ 无折扣
+
+
+
+
+
+
+
+
+ 单规格
+ 多规格
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 提示:输入数字,单位:分钟
+
+
+
+
+
+
+
+
+ 提示:购买的卡券ID,英文逗号分隔
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 单位:元
+
+
+
+
+
+
+
+ 单位:元
+
+
+
+
+
+
+
+ 提示:输入数字,虚拟销量
+
+
+
+
+
+
+
+ 提示:输入数字,单位kg
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/goods/goods/index.vue b/fuintAdmin/src/views/goods/goods/index.vue
new file mode 100644
index 0000000..1d22b6f
--- /dev/null
+++ b/fuintAdmin/src/views/goods/goods/index.vue
@@ -0,0 +1,318 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+ 新增
+
+
+
+
+
+
+
+ {{ scope.row.storeInfo.name }}
+ 公共所有
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.cateInfo.name }}
+
+
+
+
+ {{ scope.row.price.toFixed(2) }}
+ 0.00
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ {{ parseTime(scope.row.updateTime) }}
+
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/index.vue b/fuintAdmin/src/views/index.vue
new file mode 100644
index 0000000..4bc25c8
--- /dev/null
+++ b/fuintAdmin/src/views/index.vue
@@ -0,0 +1,249 @@
+
+
+
+
运营概况
+
+
+
+
+
+
今日新增订单数(笔)
+
{{ homeData.todayOrder }}
+
+
+
+
+
+
今日交易金额(元)
+
{{ homeData.todayPay ? homeData.todayPay.toFixed(2) : 0.00.toFixed(2) }}
+
+
+
+
+
+
今日新增会员数
+
{{ homeData.todayUser }}
+
+
+
+
+
+
今日活跃会员数
+
{{ homeData.todayActiveUser }}
+
+
+
+
+
+
+
+
总会员数
+
{{ homeData.totalUser }}
+
+
+
+
+
+
总交易金额(元)
+
{{ homeData.totalPay ? homeData.totalPay : '0.00'}}
+
+
+
+
+
+
总订单数
+
{{ homeData.totalOrder }}
+
+
+
+
+
+
总支付人数
+
{{ homeData.totalPayUser }}
+
+
+
+
+
+
+
常用功能
+
+
+ 收银下单
+ 核销卡券
+ 会员管理
+
+
+ 订单管理
+ 卡券管理
+ 商品管理
+
+
+
+
+
报表统计
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/login.vue b/fuintAdmin/src/views/login.vue
new file mode 100644
index 0000000..6de03cf
--- /dev/null
+++ b/fuintAdmin/src/views/login.vue
@@ -0,0 +1,270 @@
+
+
+
+
+
{{ systemName }}
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/member/balanceRecharge.vue b/fuintAdmin/src/views/member/balanceRecharge.vue
new file mode 100644
index 0000000..93841c7
--- /dev/null
+++ b/fuintAdmin/src/views/member/balanceRecharge.vue
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+ {{ memberInfo.name }}(ID:{{ memberInfo.id }})
+
+
+
+
+
+
+ ¥{{ memberInfo.balance.toFixed(2) }}
+
+
+
+
+
+
+
+ 增加
+ 扣减
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/member/group/index.vue b/fuintAdmin/src/views/member/group/index.vue
new file mode 100644
index 0000000..88ac743
--- /dev/null
+++ b/fuintAdmin/src/views/member/group/index.vue
@@ -0,0 +1,330 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+ 新增
+
+
+
+
+
+
+
+
+ {{ scope.row.memberNum ? scope.row.memberNum : 0 }}
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ {{ parseTime(scope.row.updateTime) }}
+
+
+
+
+
+
+
+
+
+ 修改
+ 添加子级
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 启用
+ 禁用
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/member/index.vue b/fuintAdmin/src/views/member/index.vue
new file mode 100644
index 0000000..75281b7
--- /dev/null
+++ b/fuintAdmin/src/views/member/index.vue
@@ -0,0 +1,618 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ~
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+ 新增
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.mobile ? scope.row.mobile : '-' }}
+
+
+
+
+ {{ scope.row.gradeId ? getName(userGradeList, scope.row.gradeId) : '-' }}
+
+
+
+
+ {{ scope.row.storeId ? scope.row.storeName: '-' }}
+
+
+
+
+ {{ scope.row.balance ? scope.row.balance.toFixed(2) : '0.00' }}
+ 充值
+
+
+
+
+ {{ scope.row.point ? scope.row.point : '0.00' }}
+ 变更
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ {{ parseTime(scope.row.updateTime) }}
+
+
+
+
+
+
+
+
+
+ 修改
+ 删除
+ handleCommand(command, scope.row)" v-hasPermi="['system:account:resetPwd', 'system:account:edit']">
+
+ 更多
+
+
+ 重置密码
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 至
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 男
+ 女
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 正常
+ 禁用
+
+
+
+
+
+
+
+
+
+ 未知
+ 微信小程序
+ 微信公众号
+ 后台添加
+ H5注册
+ 手机号登录注册
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/member/memberCard.vue b/fuintAdmin/src/views/member/memberCard.vue
new file mode 100644
index 0000000..f0ae0c8
--- /dev/null
+++ b/fuintAdmin/src/views/member/memberCard.vue
@@ -0,0 +1,265 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (提示:点击图片修改,建议尺寸:300 x 300)
+
+
+
+
+
+
+
+
+
+
+
+
+ 是
+ 否
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 是
+ 否
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 是
+ 否
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/member/pointRecharge.vue b/fuintAdmin/src/views/member/pointRecharge.vue
new file mode 100644
index 0000000..ccb3580
--- /dev/null
+++ b/fuintAdmin/src/views/member/pointRecharge.vue
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+ {{ memberInfo.name }}(ID:{{ memberInfo.id }})
+
+
+
+
+
+
+ {{ memberInfo.point }}
+
+
+
+
+
+
+
+ 增加
+ 扣减
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/member/setting.vue b/fuintAdmin/src/views/member/setting.vue
new file mode 100644
index 0000000..9eb35c0
--- /dev/null
+++ b/fuintAdmin/src/views/member/setting.vue
@@ -0,0 +1,131 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 设置会员卡
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/merchant/index.vue b/fuintAdmin/src/views/merchant/index.vue
new file mode 100644
index 0000000..b65396c
--- /dev/null
+++ b/fuintAdmin/src/views/merchant/index.vue
@@ -0,0 +1,419 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+ 新增商户
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 提示:选择适合的行业
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (提示:点击图片修改)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 启用
+ 禁用
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/openGift/index.vue b/fuintAdmin/src/views/openGift/index.vue
new file mode 100644
index 0000000..d4ec49f
--- /dev/null
+++ b/fuintAdmin/src/views/openGift/index.vue
@@ -0,0 +1,323 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+ 新增
+
+
+
+
+
+
+
+
+
+ {{ scope.row.couponInfo.name }}
+
+ 无
+
+
+
+
+
+ {{ scope.row.point }}
+ 无
+
+
+
+
+ {{ scope.row.createTime }}
+
+
+
+
+ {{ scope.row.updateTime }}
+
+
+
+
+
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/order/detail.vue b/fuintAdmin/src/views/order/detail.vue
new file mode 100644
index 0000000..e0be0be
--- /dev/null
+++ b/fuintAdmin/src/views/order/detail.vue
@@ -0,0 +1,309 @@
+
+
+
+
+
基础信息
+
+
+
+ 订单号:
+ {{ orderInfo.orderSn }}
+
+
+ 总金额:
+ ¥{{ orderInfo.amount }}
+
+
+ 订单状态:
+ {{ orderInfo.statusText }}
+
+
+
+
+ 订单类型:
+ {{ orderInfo.typeName }}
+
+
+ 订单时间:
+ {{ orderInfo.createTime }}
+
+
+ 备注信息:
+ {{ orderInfo.remark ? orderInfo.remark : '暂无'}}
+
+
+
+
+
+
支付信息
+
+
+
+ 支付金额:
+ ¥{{ orderInfo.payAmount.toFixed(2) }}
+
+
+ 支付状态:
+ {{ getName(payStatusList, orderInfo.payStatus) }}
+ {{ getName(payStatusList, orderInfo.payStatus) }}
+
+
+ 减免金额:
+ ¥{{ orderInfo.discount.toFixed(2) }}
+
+
+
+
+ 支付方式:
+ {{ getName(payTypeList, orderInfo.payType) }}
+
+
+ 支付时间:
+ {{ orderInfo.payTime ? orderInfo.payTime : '--' }}
+
+
+ 使用卡券:
+ {{ orderInfo.couponInfo ? '¥' + orderInfo.couponInfo.amount + '(' + orderInfo.couponInfo.name + ')' : '--' }}
+
+
+
+
+ 使用积分:
+ {{ orderInfo.usePoint ? orderInfo.usePoint : 0 }}
+
+
+ 积分金额:
+ ¥{{ orderInfo.pointAmount.toFixed(2) }}
+
+
+ 配送费用:
+ ¥{{ orderInfo.deliveryFee ? orderInfo.deliveryFee.toFixed(2) : '-' }}
+
+
+
+
+
+
+
会员信息
+
+
+
+ 会员ID:
+ {{ orderInfo.userInfo.id }}
+ 游客
+
+
+ 会员号:
+ {{ orderInfo.userInfo.no }}
+ 游客
+
+
+ 会员名称:
+ {{ orderInfo.userInfo.name }}
+ 游客(管理员{{ orderInfo.userInfo.name }}代下单)
+
+
+ 手机号:
+ {{ orderInfo.userInfo.mobile ? orderInfo.userInfo.mobile : '无' }}
+
+
+
+
+
+
+
商品信息
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.name }}
+
+
+
+
+
+ {{ spec.specValue }}
+
+ --
+
+
+
+
+
+
+
+
+
+
+
配送信息
+
+
+
+ 配送方式:
+ 门店自提
+ 物流配送
+
+
+ 自提地址:
+ {{orderInfo.storeInfo.name}} {{orderInfo.storeInfo.phone}} {{orderInfo.storeInfo.address}}
+
+
+ 收货人:
+ {{ orderInfo.address.name ? orderInfo.address.name : '--' }}
+
+
+ 联系电话:
+ {{ orderInfo.address.mobile ? orderInfo.address.mobile : '无' }}
+
+
+
+
+ 详细地址:
+ {{orderInfo.address.provinceName}}{{orderInfo.address.cityName}}{{orderInfo.address.provinceName}}{{orderInfo.address.regionName}}{{orderInfo.address.detail}}
+
+
+
+
+
+
+
物流信息
+
+
+
+ 物流公司:
+ {{ orderInfo.expressInfo.expressCompany }}
+ --
+
+
+ 物流单号:
+ {{ orderInfo.expressInfo.expressNo }}
+ --
+
+
+ 发货时间:
+ {{orderInfo.expressInfo.expressTime}}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/order/index.vue b/fuintAdmin/src/views/order/index.vue
new file mode 100644
index 0000000..aa1a7a5
--- /dev/null
+++ b/fuintAdmin/src/views/order/index.vue
@@ -0,0 +1,774 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ~
+
+
+
+ 查询
+ 重置
+
+
+
+
+
+
+
+ {{ scope.row.orderSn }}
+
+
+
+
+
+ {{ scope.row.userInfo.name }}
+
+ 游客
+
+
+
+
+ {{ scope.row.typeName }}
+
+
+
+
+ {{ scope.row.storeInfo.name }}
+ -
+
+
+
+
+ {{ scope.row.amount.toFixed(2) }}
+ 0.00
+
+
+
+
+ {{ getName(payStatusList, scope.row.payStatus) }}
+ {{ getName(payStatusList, scope.row.payStatus) }}
+
+
+
+
+ {{ getName(statusList, scope.row.status) }}
+
+
+
+
+ {{ getName(orderModeList, scope.row.orderMode) }}
+
+
+
+
+ {{ scope.row.createTime }}
+
+
+
+
+ {{ scope.row.payAmount.toFixed(2) }}
+ 0.00
+
+
+
+
+ {{ scope.row.discount.toFixed(2) }}
+ 0.00
+
+
+
+
+ {{ scope.row.pointAmount.toFixed(2) }}
+ 0.00
+
+
+
+
+ {{ scope.row.updateTime }}
+
+
+
+
+ 修改
+ 发货
+ 核销
+ handleCommand(command, scope.row)" v-hasPermi="['order:edit', 'order:delete']">
+
+ 更多
+
+
+ 查看详情
+ 打印小票
+ 立即退款
+ 删除订单
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ( 提示:单位元 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/order/setting.vue b/fuintAdmin/src/views/order/setting.vue
new file mode 100644
index 0000000..4ff0153
--- /dev/null
+++ b/fuintAdmin/src/views/order/setting.vue
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+ 否
+ 是
+
+
+
+
+
+
+
+
+ 单位:元
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/point/list.vue b/fuintAdmin/src/views/point/list.vue
new file mode 100644
index 0000000..d10d1d8
--- /dev/null
+++ b/fuintAdmin/src/views/point/list.vue
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+
+ {{ scope.row.userInfo.userNo }}
+ -
+
+
+
+
+ {{ scope.row.userInfo.mobile }}
+ -
+
+
+
+
+
+ {{ scope.row.userInfo.name }}
+
+ -
+
+
+
+
+ +{{ scope.row.amount }}
+ {{ scope.row.amount }}
+
+
+
+
+ {{ scope.row.description }}
+ 无
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+ -
+
+
+
+
+ {{ scope.row.operator }}
+ -
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/point/setting.vue b/fuintAdmin/src/views/point/setting.vue
new file mode 100644
index 0000000..89581ba
--- /dev/null
+++ b/fuintAdmin/src/views/point/setting.vue
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 是
+ 否
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/redirect.vue b/fuintAdmin/src/views/redirect.vue
new file mode 100644
index 0000000..db4c1d6
--- /dev/null
+++ b/fuintAdmin/src/views/redirect.vue
@@ -0,0 +1,12 @@
+
diff --git a/fuintAdmin/src/views/refund/index.vue b/fuintAdmin/src/views/refund/index.vue
new file mode 100644
index 0000000..bf4f646
--- /dev/null
+++ b/fuintAdmin/src/views/refund/index.vue
@@ -0,0 +1,330 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ~
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+ {{ scope.row.orderInfo.orderSn }}
+ -
+
+
+
+
+
+ {{ scope.row.storeInfo.name }}
+ -
+
+
+
+
+ {{ getName(refundTypeList, scope.row.type) }}
+
+
+
+
+ {{ scope.row.amount.toFixed(2) }}
+ 无
+
+
+
+
+ {{ scope.row.remark }}
+ 无
+
+
+
+
+ {{ getName(statusList, scope.row.status) }}
+ {{ getName(statusList, scope.row.status) }}
+ {{ getName(statusList, scope.row.status) }}
+
+
+
+
+ {{ scope.row.createTime }}
+
+
+
+
+ {{ scope.row.updateTime }}
+
+
+
+
+ 订单详情
+ 审核
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/settlement/index.vue b/fuintAdmin/src/views/settlement/index.vue
new file mode 100644
index 0000000..264e908
--- /dev/null
+++ b/fuintAdmin/src/views/settlement/index.vue
@@ -0,0 +1,440 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+ 发起结算
+
+
+
+
+
+
+
+
+ {{ scope.row.totalOrderAmount.toFixed(2) }}
+
+
+
+
+ {{ scope.row.amount.toFixed(2) }}
+
+
+
+
+ {{ scope.row.description }}
+ 无
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+ -
+
+
+
+
+ {{ getName(settleStatusList, scope.row.status) }}
+
+
+
+
+ {{ scope.row.operator }}
+ -
+
+
+
+
+ 详情
+ 确认
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ~
+
+
+
+ 查询订单
+
+
+
+
+
+
+
+
+
+ {{ scope.row.typeName }}
+
+
+
+
+ {{ scope.row.storeInfo.name }}
+ -
+
+
+
+
+ {{ scope.row.amount.toFixed(2) }}
+ 0.00
+
+
+
+
+ {{ scope.row.createTime }}
+
+
+
+
+ {{ getName(statusList, scope.row.status) }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.orderInfo.id }}
+
+
+
+
+ {{ scope.row.orderInfo.orderSn }}
+
+
+
+
+ {{ scope.row.orderInfo.typeName }}
+
+
+
+
+ {{ scope.row.orderInfo.storeInfo.name }}
+ -
+
+
+
+
+ {{ scope.row.orderInfo.amount.toFixed(2) }}
+ 0.00
+
+
+
+
+ {{ scope.row.orderInfo.createTime }}
+
+
+
+
+ {{ getName(statusList, scope.row.orderInfo.status) }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/smsManager/index.vue b/fuintAdmin/src/views/smsManager/index.vue
new file mode 100644
index 0000000..bf17e2d
--- /dev/null
+++ b/fuintAdmin/src/views/smsManager/index.vue
@@ -0,0 +1,218 @@
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+ 发送短信
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 启用
+ 禁用
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/smsTemplate/index.vue b/fuintAdmin/src/views/smsTemplate/index.vue
new file mode 100644
index 0000000..761a585
--- /dev/null
+++ b/fuintAdmin/src/views/smsTemplate/index.vue
@@ -0,0 +1,302 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+ 新增
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ {{ parseTime(scope.row.updateTime) }}
+
+
+
+
+
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 启用
+ 禁用
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/staff/list.vue b/fuintAdmin/src/views/staff/list.vue
new file mode 100644
index 0000000..c176584
--- /dev/null
+++ b/fuintAdmin/src/views/staff/list.vue
@@ -0,0 +1,382 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+ 新增员工
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ getName(categoryOptions, scope.row.category) }}
+
+ -
+
+
+
+
+
+
+
+
+ {{ getName(storeOptions, scope.row.storeId) }}
+
+ 无
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ {{ parseTime(scope.row.updateTime) }}
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 启用
+ 禁用
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/statistic/index.vue b/fuintAdmin/src/views/statistic/index.vue
new file mode 100644
index 0000000..d641d66
--- /dev/null
+++ b/fuintAdmin/src/views/statistic/index.vue
@@ -0,0 +1,322 @@
+
+
+
+
数据概况
+
+
+
+
+ ~
+
+
+
+ 重置
+ 查询
+ 近3天
+ 近7天
+ 近15天
+ 近30天
+
+
+
+
+
+
+
订单数(笔)
+
{{ mainData.orderCount }}
+
+
+
+
+
+
交易金额(元)
+
{{ mainData.payAmount ? mainData.payAmount.toFixed(2) : 0.00.toFixed(2) }}
+
+
+
+
+
+
新增会员数
+
{{ mainData.userCount }}
+
+
+
+
+
+
活跃会员数
+
{{ mainData.activeUserCount }}
+
+
+
+
+
+
+
+
总会员数
+
{{ mainData.totalUserCount }}
+
+
+
+
+
+
总支付金额(元)
+
{{ mainData.totalPayAmount ? mainData.totalPayAmount : '0.00'}}
+
+
+
+
+
+
总订单数(笔)
+
{{ mainData.totalOrderCount }}
+
+
+
+
+
+
总支付人数
+
{{ mainData.totalPayUserCount }}
+
+
+
+
+
+
+
运营走势
+
+
+
+
+
+
+
+
+
+
+
+
+
数据排行
+
+
+
+ 商品销售排行
+
+
+
+
+ {{ scope.row.name }}
+
+
+
+
+
+ {{ scope.row.amount.toFixed(2) }}
+
+
+
+
+
+ 用户消费排行
+
+
+
+
+ {{ scope.row.name }}
+
+
+
+
+
+ {{ scope.row.amount.toFixed(2) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/stock/index.vue b/fuintAdmin/src/views/stock/index.vue
new file mode 100644
index 0000000..66faa31
--- /dev/null
+++ b/fuintAdmin/src/views/stock/index.vue
@@ -0,0 +1,406 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+ 新增入库
+ 新增出库
+
+
+
+
+
+
+
+ 出库
+ 入库
+
+
+
+
+
+ {{ getName(storeOptions, scope.row.storeId) }}
+
+ 公共所有
+
+
+
+
+ {{ scope.row.description ? scope.row.description : '--' }}
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ {{ parseTime(scope.row.updateTime) }}
+
+
+
+
+ 详情
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 提示:未选择则属于公共所有
+
+
+
+
+
+
+
+
+
+
+
+
+ 添加商品
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.name ? scope.row.name : '--' }}
+
+
+
+
+
+ {{ spec.value }}
+
+ --
+
+
+
+
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/stock/selectGoodsDialog.vue b/fuintAdmin/src/views/stock/selectGoodsDialog.vue
new file mode 100644
index 0000000..dd5e975
--- /dev/null
+++ b/fuintAdmin/src/views/stock/selectGoodsDialog.vue
@@ -0,0 +1,178 @@
+
+
+
+
+
+
+
+ 查找商品
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.name ? scope.row.name : '--' }}
+
+
+
+
+
+ {{ spec.value }}
+
+ --
+
+
+
+
+ {{ scope.row.stock ? scope.row.stock : '0' }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/store/list.vue b/fuintAdmin/src/views/store/list.vue
new file mode 100644
index 0000000..c52615e
--- /dev/null
+++ b/fuintAdmin/src/views/store/list.vue
@@ -0,0 +1,570 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+ 新增店铺
+
+
+
+
+
+
+
+
+ {{ scope.row.merchantName ? scope.row.merchantName : '-' }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+
+ 二维码
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (提示:点击图片修改)
+
+
+
+
+
+ 否
+ 是
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (提示:点击图片修改)
+ (查看大图)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ wxCertPath }}
+ 点击上传
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 启用
+ 禁用
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/subMessage/index.vue b/fuintAdmin/src/views/subMessage/index.vue
new file mode 100644
index 0000000..d143cd0
--- /dev/null
+++ b/fuintAdmin/src/views/subMessage/index.vue
@@ -0,0 +1,253 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+ {{ scope.row.title }}
+
+
+
+
+
+
+ {{ scope.row.key }}
+
+ 无
+
+
+
+
+ 启用
+ 禁用
+
+
+
+
+ 修改
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/system/account/authRole.vue b/fuintAdmin/src/views/system/account/authRole.vue
new file mode 100644
index 0000000..bc5bbfa
--- /dev/null
+++ b/fuintAdmin/src/views/system/account/authRole.vue
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{(page - 1) * pageSize + scope.$index + 1}}
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+ 提交
+ 返回
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/system/account/index.vue b/fuintAdmin/src/views/system/account/index.vue
new file mode 100644
index 0000000..7f48833
--- /dev/null
+++ b/fuintAdmin/src/views/system/account/index.vue
@@ -0,0 +1,522 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.realName ? scope.row.realName : '-' }}
+
+
+
+
+ {{ scope.row.merchantName ? scope.row.merchantName : '平台方' }}
+
+
+
+
+ {{ scope.row.storeName ? scope.row.storeName : '-' }}
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createDate) }}
+
+
+
+
+ 修改
+ 删除
+ handleCommand(command, scope.row)" v-hasPermi="['system:account:resetPwd', 'system:account:edit']">
+
+ 更多
+
+
+ 重置密码
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 启用
+ 禁用
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (提示:不选择则可管理所有店铺的数据)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/system/account/profile/index.vue b/fuintAdmin/src/views/system/account/profile/index.vue
new file mode 100644
index 0000000..e73984c
--- /dev/null
+++ b/fuintAdmin/src/views/system/account/profile/index.vue
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+ 个人信息
+
+
+
+
+
+
+
+ 基本资料
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/system/account/profile/resetPwd.vue b/fuintAdmin/src/views/system/account/profile/resetPwd.vue
new file mode 100644
index 0000000..96db74a
--- /dev/null
+++ b/fuintAdmin/src/views/system/account/profile/resetPwd.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+ 关闭
+
+
+
+
+
diff --git a/fuintAdmin/src/views/system/account/profile/userAvatar.vue b/fuintAdmin/src/views/system/account/profile/userAvatar.vue
new file mode 100644
index 0000000..bbcbb80
--- /dev/null
+++ b/fuintAdmin/src/views/system/account/profile/userAvatar.vue
@@ -0,0 +1,172 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 选择
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 提 交
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/system/account/profile/userInfo.vue b/fuintAdmin/src/views/system/account/profile/userInfo.vue
new file mode 100644
index 0000000..3c8138b
--- /dev/null
+++ b/fuintAdmin/src/views/system/account/profile/userInfo.vue
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 男
+ 女
+
+
+
+ 保存
+ 关闭
+
+
+
+
+
diff --git a/fuintAdmin/src/views/system/config/index.vue b/fuintAdmin/src/views/system/config/index.vue
new file mode 100644
index 0000000..0965a75
--- /dev/null
+++ b/fuintAdmin/src/views/system/config/index.vue
@@ -0,0 +1,343 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+ 导出
+
+
+ 刷新缓存
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{dict.label}}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/system/dict/data.vue b/fuintAdmin/src/views/system/dict/data.vue
new file mode 100644
index 0000000..ee40902
--- /dev/null
+++ b/fuintAdmin/src/views/system/dict/data.vue
@@ -0,0 +1,399 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+ 导出
+
+
+ 关闭
+
+
+
+
+
+
+
+
+
+ {{scope.row.dictLabel}}
+ {{scope.row.dictLabel}}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{dict.label}}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/system/dict/index.vue b/fuintAdmin/src/views/system/dict/index.vue
new file mode 100644
index 0000000..112f8c2
--- /dev/null
+++ b/fuintAdmin/src/views/system/dict/index.vue
@@ -0,0 +1,346 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+ 导出
+
+
+ 刷新缓存
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.dictType }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{dict.label}}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/system/genCode/index.vue b/fuintAdmin/src/views/system/genCode/index.vue
new file mode 100644
index 0000000..9eb5d61
--- /dev/null
+++ b/fuintAdmin/src/views/system/genCode/index.vue
@@ -0,0 +1,334 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+ 新增
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ {{ parseTime(scope.row.updateTime) }}
+
+
+
+
+
+
+
+
+
+ 修改
+ 生成代码
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 启用
+ 禁用
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/system/logs/index.vue b/fuintAdmin/src/views/system/logs/index.vue
new file mode 100644
index 0000000..f1f46d5
--- /dev/null
+++ b/fuintAdmin/src/views/system/logs/index.vue
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.actionTime) }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ form.title }}
+ {{ form.operName }} / {{ form.operIp }} / {{ form.operLocation }}
+
+
+ {{ form.operUrl }}
+ {{ form.requestMethod }}
+
+
+ {{ form.method }}
+
+
+ {{ form.operParam }}
+
+
+ {{ form.jsonResult }}
+
+
+
+ 正常
+ 失败
+
+
+
+ {{ parseTime(form.operTime) }}
+
+
+ {{ form.errorMsg }}
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/system/menu/index.vue b/fuintAdmin/src/views/system/menu/index.vue
new file mode 100644
index 0000000..49e0a96
--- /dev/null
+++ b/fuintAdmin/src/views/system/menu/index.vue
@@ -0,0 +1,343 @@
+
+
+
+
+ 新增
+
+
+ 展开/折叠
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 修改
+ 新增
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 目录
+ 菜单
+ 按钮
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 组件路径
+
+
+
+
+
+
+
+
+
+
+ 菜单状态
+
+
+ 启用
+ 禁用
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/system/notice/index.vue b/fuintAdmin/src/views/system/notice/index.vue
new file mode 100644
index 0000000..548d3c5
--- /dev/null
+++ b/fuintAdmin/src/views/system/notice/index.vue
@@ -0,0 +1,312 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{dict.label}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/system/role/authUser.vue b/fuintAdmin/src/views/system/role/authUser.vue
new file mode 100644
index 0000000..a35acea
--- /dev/null
+++ b/fuintAdmin/src/views/system/role/authUser.vue
@@ -0,0 +1,180 @@
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+ 添加用户
+
+
+ 批量取消授权
+
+
+ 关闭
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ 取消授权
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/system/role/index.vue b/fuintAdmin/src/views/system/role/index.vue
new file mode 100644
index 0000000..56187ac
--- /dev/null
+++ b/fuintAdmin/src/views/system/role/index.vue
@@ -0,0 +1,398 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 启用
+ 禁用
+
+
+
+ 展开/折叠
+ 全选/全不选
+ 父子联动
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/system/role/selectUser.vue b/fuintAdmin/src/views/system/role/selectUser.vue
new file mode 100644
index 0000000..4ad18eb
--- /dev/null
+++ b/fuintAdmin/src/views/system/role/selectUser.vue
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/tool/build/CodeTypeDialog.vue b/fuintAdmin/src/views/tool/build/CodeTypeDialog.vue
new file mode 100644
index 0000000..b5c2e2e
--- /dev/null
+++ b/fuintAdmin/src/views/tool/build/CodeTypeDialog.vue
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+
+
+ 确定
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/tool/build/DraggableItem.vue b/fuintAdmin/src/views/tool/build/DraggableItem.vue
new file mode 100644
index 0000000..e881778
--- /dev/null
+++ b/fuintAdmin/src/views/tool/build/DraggableItem.vue
@@ -0,0 +1,100 @@
+
diff --git a/fuintAdmin/src/views/tool/build/IconsDialog.vue b/fuintAdmin/src/views/tool/build/IconsDialog.vue
new file mode 100644
index 0000000..958be50
--- /dev/null
+++ b/fuintAdmin/src/views/tool/build/IconsDialog.vue
@@ -0,0 +1,123 @@
+
+
+
+
+
diff --git a/fuintAdmin/src/views/tool/build/RightPanel.vue b/fuintAdmin/src/views/tool/build/RightPanel.vue
new file mode 100644
index 0000000..d53fe38
--- /dev/null
+++ b/fuintAdmin/src/views/tool/build/RightPanel.vue
@@ -0,0 +1,946 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+ {{ activeData.componentName }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 选择
+
+
+
+
+
+
+ 选择
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 默认
+
+
+ 右侧
+
+
+
+
+
+
+ 个字符
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text
+
+
+ picture
+
+
+ picture-card
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 选项
+
+
+
+
+
+ 添加选项
+
+
+
+
+
+
+ 选项
+
+
+
+ 动态数据
+
+
+ 静态数据
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 添加父级
+
+
+
+
+
+
+
+
+ 默认
+
+
+ 按钮
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 中等
+
+
+ 较小
+
+
+ 迷你
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 布局结构树
+
+
+
+
+ {{ node.label }}
+
+
+
+
+
+
+ 正则校验
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 添加规则
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 中等
+
+
+ 较小
+
+
+ 迷你
+
+
+
+
+
+
+ 左对齐
+
+
+ 右对齐
+
+
+ 顶部对齐
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/tool/build/TreeNodeDialog.vue b/fuintAdmin/src/views/tool/build/TreeNodeDialog.vue
new file mode 100644
index 0000000..fa7f0b2
--- /dev/null
+++ b/fuintAdmin/src/views/tool/build/TreeNodeDialog.vue
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 确定
+
+
+ 取消
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/tool/build/index.vue b/fuintAdmin/src/views/tool/build/index.vue
new file mode 100644
index 0000000..d1f8f6d
--- /dev/null
+++ b/fuintAdmin/src/views/tool/build/index.vue
@@ -0,0 +1,783 @@
+
+
+
+
+
+
Form Generator
+
+
+
+
+
+ 输入型组件
+
+
+
+
+
+ {{ element.label }}
+
+
+
+
+ 选择型组件
+
+
+
+
+
+ {{ element.label }}
+
+
+
+
+ 布局型组件
+
+
+
+
+
+ {{ element.label }}
+
+
+
+
+
+
+
+
+
+
+ 导出vue文件
+
+
+ 复制代码
+
+
+ 清空
+
+
+
+
+
+
+
+
+
+ 从左侧拖入或点选组件进行表单设计
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/tool/gen/basicInfoForm.vue b/fuintAdmin/src/views/tool/gen/basicInfoForm.vue
new file mode 100644
index 0000000..7029529
--- /dev/null
+++ b/fuintAdmin/src/views/tool/gen/basicInfoForm.vue
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/tool/gen/editTable.vue b/fuintAdmin/src/views/tool/gen/editTable.vue
new file mode 100644
index 0000000..d87a493
--- /dev/null
+++ b/fuintAdmin/src/views/tool/gen/editTable.vue
@@ -0,0 +1,234 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dict.dictName }}
+ {{ dict.dictType }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 提交
+ 返回
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/tool/gen/genInfoForm.vue b/fuintAdmin/src/views/tool/gen/genInfoForm.vue
new file mode 100644
index 0000000..63463a0
--- /dev/null
+++ b/fuintAdmin/src/views/tool/gen/genInfoForm.vue
@@ -0,0 +1,299 @@
+
+
+
+
+
+ 生成模板
+
+
+
+
+
+
+
+
+
+
+ 生成包路径
+
+
+
+
+
+
+
+
+
+
+
+ 生成模块名
+
+
+
+
+
+
+
+
+
+
+
+ 生成业务名
+
+
+
+
+
+
+
+
+
+
+
+ 生成功能名
+
+
+
+
+
+
+
+
+
+
+
+ 上级菜单
+
+
+
+
+
+
+
+
+
+
+
+ 生成代码方式
+
+
+
+
+ zip压缩包
+ 自定义路径
+
+
+
+
+
+
+ 自定义路径
+
+
+
+
+
+
+
+ 最近路径快速选择
+
+
+
+ 恢复默认的生成基础路径
+
+
+
+
+
+
+
+
+
+
+
+
+ 树编码字段
+
+
+
+
+
+
+
+
+
+
+
+
+ 树父编码字段
+
+
+
+
+
+
+
+
+
+
+
+
+ 树名称字段
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关联子表的表名
+
+
+
+
+
+
+
+
+
+
+
+
+ 子表关联的外键名
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/tool/gen/importTable.vue b/fuintAdmin/src/views/tool/gen/importTable.vue
new file mode 100644
index 0000000..0258597
--- /dev/null
+++ b/fuintAdmin/src/views/tool/gen/importTable.vue
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/tool/gen/index.vue b/fuintAdmin/src/views/tool/gen/index.vue
new file mode 100644
index 0000000..65cc782
--- /dev/null
+++ b/fuintAdmin/src/views/tool/gen/index.vue
@@ -0,0 +1,337 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 生成
+
+
+ 导入
+
+
+ 修改
+
+
+ 删除
+
+
+
+
+
+
+
+
+ {{(queryParams.page - 1) * queryParams.pageSize + scope.$index + 1}}
+
+
+
+
+
+
+
+
+
+ 预览
+ 编辑
+ 删除
+ 同步
+ 生成代码
+
+
+
+
+
+
+
+
+ 复制
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/src/views/tool/swagger/index.vue b/fuintAdmin/src/views/tool/swagger/index.vue
new file mode 100644
index 0000000..b8becc6
--- /dev/null
+++ b/fuintAdmin/src/views/tool/swagger/index.vue
@@ -0,0 +1,15 @@
+
+
+
+
diff --git a/fuintAdmin/src/views/userGrade/index.vue b/fuintAdmin/src/views/userGrade/index.vue
new file mode 100644
index 0000000..8dc6e07
--- /dev/null
+++ b/fuintAdmin/src/views/userGrade/index.vue
@@ -0,0 +1,389 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+ 新增
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.catchValue }}
+
+ 无条件
+
+
+
+
+ {{ scope.row.validDay + '天' }}
+ 永久
+
+
+
+
+ {{ scope.row.discount + '折' }}
+ 无折扣
+
+
+
+
+ {{ scope.row.speedPoint + '倍数' }}
+ 不加倍
+
+
+
+
+
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 启用
+ 禁用
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fuintAdmin/vue.config.js b/fuintAdmin/vue.config.js
new file mode 100644
index 0000000..23c870b
--- /dev/null
+++ b/fuintAdmin/vue.config.js
@@ -0,0 +1,136 @@
+'use strict'
+const path = require('path')
+
+function resolve(dir) {
+ return path.join(__dirname, dir)
+}
+
+const CompressionPlugin = require('compression-webpack-plugin')
+
+const name = process.env.VUE_APP_TITLE || '会员演示营销管理系统' // 网页标题
+
+const port = process.env.port || process.env.npm_config_port || 81 // 端口
+
+const serverUrl = process.env.VUE_APP_SERVER_URL || 'https://www.baidu.com'
+
+// vue.config.js 配置说明
+//官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions
+// 这里只列一部分,具体配置参考文档
+module.exports = {
+ // 部署生产环境和开发环境下的URL。
+ // 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上
+ // 例如 https://www.baidu.com/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.baidu.com/admin/,则设置 baseUrl 为 /admin/。
+ publicPath: process.env.VUE_APP_PUBLIC_PATH,
+ // 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist)
+ outputDir: 'dist',
+ // 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下)
+ assetsDir: 'static',
+ // 是否开启eslint保存检测,有效值:ture | false | 'error'
+ lintOnSave: process.env.NODE_ENV === 'development',
+ // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。
+ productionSourceMap: false,
+ // webpack-dev-server 相关配置
+ devServer: {
+ host: '0.0.0.0',
+ port: port,
+ open: true,
+ proxy: {
+ // detail: https://cli.vuejs.org/config/#devserver-proxy
+ [process.env.VUE_APP_BASE_API]: {
+ target: serverUrl,
+ changeOrigin: true,
+ pathRewrite: {
+ ['^' + process.env.VUE_APP_BASE_API]: ''
+ }
+ }
+ },
+ disableHostCheck: true
+ },
+ css: {
+ loaderOptions: {
+ sass: {
+ sassOptions: { outputStyle: "expanded" }
+ }
+ }
+ },
+ configureWebpack: {
+ name: name,
+ resolve: {
+ alias: {
+ '@': resolve('src')
+ }
+ },
+ plugins: [
+ new CompressionPlugin({
+ test: /\.(js|css|html)?$/i, // 压缩文件格式
+ filename: '[path].gz[query]', // 压缩后的文件名
+ algorithm: 'gzip', // 使用gzip压缩
+ minRatio: 0.8 // 压缩率小于1才会压缩
+ })
+ ],
+ },
+ chainWebpack(config) {
+ config.plugins.delete('preload') // TODO: need test
+ config.plugins.delete('prefetch') // TODO: need test
+
+ // set svg-sprite-loader
+ config.module
+ .rule('svg')
+ .exclude.add(resolve('src/assets/icons'))
+ .end()
+ config.module
+ .rule('icons')
+ .test(/\.svg$/)
+ .include.add(resolve('src/assets/icons'))
+ .end()
+ .use('svg-sprite-loader')
+ .loader('svg-sprite-loader')
+ .options({
+ symbolId: 'icon-[name]'
+ })
+ .end()
+
+ config
+ .when(process.env.NODE_ENV !== 'development',
+ config => {
+ config
+ .plugin('ScriptExtHtmlWebpackPlugin')
+ .after('html')
+ .use('script-ext-html-webpack-plugin', [{
+ // `runtime` must same as runtimeChunk name. default is `runtime`
+ inline: /runtime\..*\.js$/
+ }])
+ .end()
+ config
+ .optimization.splitChunks({
+ chunks: 'all',
+ cacheGroups: {
+ libs: {
+ name: 'chunk-libs',
+ test: /[\\/]node_modules[\\/]/,
+ priority: 10,
+ chunks: 'initial' // only package third parties that are initially dependent
+ },
+ elementUI: {
+ name: 'chunk-elementUI', // split elementUI into a single package
+ priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
+ test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
+ },
+ commons: {
+ name: 'chunk-commons',
+ test: resolve('src/components'), // can customize your rules
+ minChunks: 3, // minimum common number
+ priority: 5,
+ reuseExistingChunk: true
+ }
+ }
+ })
+ config.optimization.runtimeChunk('single'),
+ {
+ from: path.resolve(__dirname, './public/robots.txt'), //防爬虫文件
+ to: './' //到根目录下
+ }
+ }
+ )
+ }
+}
diff --git a/fuintBackend/.gitignore b/fuintBackend/.gitignore
new file mode 100644
index 0000000..08d3169
--- /dev/null
+++ b/fuintBackend/.gitignore
@@ -0,0 +1,12 @@
+.buildpath
+.project
+.settings
+.idea/
+.mvn/
+wsdl/
+caches/
+target/
+src/main/resources/static/
+.DS_Store
+*.iml
+dump.rdb
diff --git a/fuintBackend/LICENSE b/fuintBackend/LICENSE
new file mode 100644
index 0000000..dbbe355
--- /dev/null
+++ b/fuintBackend/LICENSE
@@ -0,0 +1,661 @@
+ GNU AFFERO GENERAL PUBLIC LICENSE
+ Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+ A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate. Many developers of free software are heartened and
+encouraged by the resulting cooperation. However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+ The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community. It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server. Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+ An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals. This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU Affero General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Remote Network Interaction; Use with the GNU General Public License.
+
+ Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software. This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time. Such new versions
+will be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source. For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code. There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+ .
diff --git a/fuintBackend/README.md b/fuintBackend/README.md
new file mode 100644
index 0000000..317d319
--- /dev/null
+++ b/fuintBackend/README.md
@@ -0,0 +1,123 @@
+# fuint会员营销系统介绍
+
+#### 介绍
+fuint会员营销系统是一套开源的实体店铺会员管理和营销系统。系统基于前后端分离的架构,后端采用Java SpringBoot + Mysql ,前端基于当前流行的Uniapp ,Element UI ,支持小程序、h5。主要功能包含电子优惠券、储值卡、实体卡、集次卡(计次卡)、短信发送、储值卡、会员积分、会员等级权益体系,支付收款等会员日常营销工具。本系统适用于各类实体店铺,如零售超市、酒吧、酒店、汽车4S店、鲜花店、奶茶店、甜品店、餐饮店、农家乐等,是实体店铺会员营销必备的一款利器。
+以下是前台的页面展示:
+
+
+
+
+
+
+fuint侧重于线下实体店的私域流量的运营,同时提供会员端小程序和收银系统的线上线下统一渠道,帮助商户降低获客成本。顾客通过扫码支付成为私域流量,支付即可成为会员。积分和卡券功能建立起会员等级体系,通过消息推送和短信营销方便触达用户。
+1、会员运营自动化:商家通过日常活动设置,如开卡礼设置,沉睡唤醒等,成为会员后自动给顾客送优惠券,让顾客更有黏性,提升会员运营效率。
+2、打通收银系统和会员营销的壁垒,代客下单收银,支付即成为会员。
+3、会员体系完整化:积分兑换、积分转赠、会员等级权益、积分加速、买单折扣。
+4、会员卡券齐全:储值卡、电子券、优惠券、集次卡、计次卡、实体卡购买并兑换、会员充值、余额支付。
+5、线上代客下单收银系统,后台管理员可帮助临柜的会员下单、扫码支付。
+6、支持手机短信、站内弹框消息、微信订阅消息:支持包括发货消息、卡券到期提醒、活动提醒、会员到期提醒、积分余额变动提醒等消息。
+小程序前端仓库:https://gitee.com/fuint/fuint-uniapp
+扫码小程序演示:
+
+
+官网演示地址:
+
+ 1、官网:https://www.fuint.cn 点击 -> 系统演示,演示账号:fuint / 123456
+ 2、swagger接口文档:https://www.fuint.cn/fuint-application/swagger-ui.html
+
+
+#### 软件架构
+后端:JAVA SpringBoot + MYSQL Mybatis Plus + Redis
+前端:采用基于Vue的Uniapp、Element UI,前后端分离,支持微信小程序、h5等
+后台截图:
+
+
+
+前端使用技术
+2.1 Vue2
+2.2 Uniapp
+2.3 Element UI
+2.4 Nodejs 14或16版本
+
+后端使用技术
+1.1 SpringBoot 2.5
+1.2 Mybatis Plus
+1.3 Maven
+1.4 SpringSecurity
+1.5 Druid
+1.6 Slf4j
+1.7 Fastjson
+1.8 JWT
+1.9 Redis
+1.10 Quartz
+1.11 Mysql 5.7或8版
+1.12 Swagger UI
+
+
+#### 安装步骤
+推荐软件环境版本:jdk 1.8、mysql 5.8
+1. 导入db目录下的数据库文件。
+2. 修改config目录下的配置文件。
+3. 将工程打包,把jar包上传并执行。
+提示:无后端和linux基础的朋友,可以使用宝塔 部署,非常方便简单。
+
+
+#### 前台使用说明
+
+1. 会员登录,登录成功后可看到会员的卡券列表。
+2. 卡券领取和购买,预存券的充值等。
+3. 核销卡券,会员在前台出示二维码,管理员用微信扫一扫即可核销。
+4. 卡券转赠,会员可将自己的卡券转赠给其他用户,输入对方的手机号即可完成转赠,获赠的好友会收到卡券赠送的短信。
+
+
+
+
+#### 后台使用
+1. 会员管理:会员新增、导入、禁用等。
+2. 内容管理:焦点图管理、文章管理等。
+3. 卡券管理:电子券管理为2层结构,即电子券组和电子券。
+4. 会员积分:会员积分管理,会员积分的操作,会员积分明细查看。
+5. 转赠管理:卡券转赠记录。
+6. 短信管理:短信营销功能,已发送的短信列表。
+7. 系统配置:配置系统管理员权限等。
+8. 店铺管理:支持多店铺模式。
+9. 核销管理员:核销人员管理主要包含3个功能:核销人员列表、核销人员审核、核销人员信息编辑。
+10. 短信模板管理:可配置不同场景和业务的短信内容。
+11. 卡券发放:单独发放、批量发放,发放成功后给会员发送短信通知
+12. 操作日志主要针对电子券系统后台的一些关键操作进行日志记录,方便排查相关操作人的行为等问题。
+13. 发券记录主要根据发券的实际操作情况来记录,分为单用户发券和批量发券,同时可针对该次发券记录进行作废操作。
+14. 代客下单、收银功能。
+卡券营销:
+
+
+收银代客下单功能:店员角色登录后台,从首页的“下单首页”菜单可进入代客收银下单界面,完成代客下单收银的流程。
+
+发起结算:
+
+
+#### 开发计划
+1. 完善的报表统计;
+2. 分享助力、分享领券、分享获得积分;
+3. 员工提成、分销功能;
+4. 店铺结算功能;
+5. 更多营销工具,比如签到等。
+
+
+#### 允许使用范围:
+1. 允许个人学习使用
+2. 允许用于毕业设计、论文参考代码
+3. 推荐Watch、Star项目,获取项目第一时间更新,同时也是对项目最好的支持
+4. 希望大家多多支持原创软件
+5. 请勿去除版权标签,要商用请购买源码授权(非常便宜),感谢理解!
+
+不足和待完善之处请谅解!源码仅供学习交流,更多功能欢迎进群咨询讨论,或需安装帮助请联系我们(麻烦先点star!!!!!! )。
+官方网站:https://www.fuint.cn
+开源不易,感谢支持!
+作者wx:fsq_better:
+
+
+
+特别鸣谢:
+Mybaits Plus: https://github.com/baomidou/mybatis-plus
+Vue: https://github.com/vuejs/vue
+Element UI: https://element.eleme.cn
\ No newline at end of file
diff --git a/fuintBackend/configure/dev/application.properties b/fuintBackend/configure/dev/application.properties
new file mode 100644
index 0000000..4e5c24f
--- /dev/null
+++ b/fuintBackend/configure/dev/application.properties
@@ -0,0 +1,119 @@
+# \u6570\u636E\u5E93\u914D\u7F6E
+spring.datasource.url=jdbc:mysql://221.176.140.236:6666/fuint-db1?useUnicode=true&characterEncoding=UTF8&useSSL=false
+spring.datasource.username=root
+spring.datasource.password=ee62c1ec01cc5a26
+
+# Redis\u914D\u7F6E
+spring.session.store-type=redis
+spring.session.redis.namespace=fuint
+# Redis\u6570\u636E\u5E93\u7D22\u5F15\uFF08\u9ED8\u8BA4\u4E3A0\uFF09
+spring.redis.database=0
+# Redis\u670D\u52A1\u5668\u5730\u5740(\u751F\u4EA7)
+spring.redis.host=120.46.159.203
+# Redis\u670D\u52A1\u5668\u8FDE\u63A5\u7AEF\u53E3
+spring.redis.port=16379
+# Redis\u670D\u52A1\u5668\u8FDE\u63A5\u5BC6\u7801\uFF08\u9ED8\u8BA4\u4E3A\u7A7A\uFF09
+spring.redis.password=a8EYUSoT8wHbuRkX
+# \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
+spring.redis.pool.max-active=-1
+# \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09
+spring.redis.pool.max-wait=-1
+# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5927\u7A7A\u95F2\u8FDE\u63A5
+spring.redis.pool.max-idle=8
+# \u8FDE\u63A5\u6C60\u4E2D\u7684\u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5
+spring.redis.pool.min-idle=0
+# \u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09
+spring.redis.timeout=0
+
+# \u7CFB\u7EDF\u540D\u79F0
+system.name = fuint\u4F1A\u5458\u8425\u9500\u7BA1\u7406\u7CFB\u7EDF
+
+# \u524D\u7AEFh5\u5730\u5740
+website.url=https://www.huamar.com/h5/
+
+# \u4E0A\u4F20\u56FE\u7247\u672C\u5730\u5730\u5740
+images.root=D:/daima/yshi/fuintBackend/fuint-application/target/classes
+images.path=/static/uploadImages/
+
+# \u4E0A\u4F20\u56FE\u7247\u670D\u52A1\u5668\u57DF\u540D
+images.upload.url=http://localhost:8080
+
+# \u4E0A\u4F20\u56FE\u7247\u5141\u8BB8\u7684\u5927\u5C0F\uFF08\u5355\u4F4D\uFF1AMB\uFF09
+images.upload.maxSize=5
+
+################## \u5B9A\u65F6\u811A\u672C\u914D\u7F6E #########################
+# \u5B9A\u65F6\u53D1\u9001\u6D88\u606F
+message.job.switch = 1
+message.job.time = 0 0/1 * * * ?
+
+# \u5361\u5238\u5230\u671F\u5904\u7406
+couponExpire.job.switch = 1
+couponExpire.job.time = 0 0/1 * * * ?
+
+# \u8BA2\u5355\u8D85\u65F6\u53D6\u6D88
+orderCancel.job.switch = 1
+orderCancel.job.time = 0 0/1 * * * ?
+
+# \u5206\u4F63\u63D0\u6210\u8BA1\u7B97
+commission.job.switch = 1
+commission.job.time = 0 0/1 * * * ?
+
+################## \u963F\u91CC\u4E91\u77ED\u4FE1\u914D\u7F6E #######################
+# \u77ED\u4FE1\u63A5\u53E3\u6A21\u5F0F[0-\u5173\u95ED 1-\u6253\u5F00]
+aliyun.sms.mode = 0
+aliyun.sms.accessKeyId=LTAI4GJMjV123oXsrQJLnPZt
+aliyun.sms.accessKeySecret=eGVBL30u5Ypj234d7XODlwYKWTaGT
+# \u963F\u91CC\u4E91\u77ED\u4FE1\u7B7E\u540D
+aliyun.sms.signName=\u5EF6\u79BE\u6280\u672F
+
+
+
+################## \u963F\u91CC\u4E91OSS\u5B58\u50A8\u914D\u7F6E######################
+# \u6A21\u5F0F[0-\u5173\u95ED 1-\u6253\u5F00]
+aliyun.oss.mode = 0
+aliyun.oss.accessKeyId = LTAI4FxWczZd7sojZBYonMnV
+aliyun.oss.accessKeySecret = LJXig28y5CMMV8jORlGZ08MNLXGzg1
+aliyun.oss.endpoint = https://oss-cn-zhangjiakou.aliyuncs.com
+aliyun.oss.bucketName = fuint-application
+# \u4E0A\u4F20\u6587\u4EF6\u5939
+aliyun.oss.folder = uploads
+# \u8BBF\u95EE\u57DF\u540D
+aliyun.oss.domain = https://wine-east-img.oss-cn-zhangjiakou.aliyuncs.com
+
+################## \u5FAE\u4FE1\u76F8\u5173\u914D\u7F6E ##########################
+# \u516C\u4F17\u53F7\u914D\u7F6E
+weixin.official.appId=wxf4327ef05c27a0
+weixin.official.appSecret=1f55e8749332234d9a074873d8e6a3
+
+# \u5C0F\u7A0B\u5E8F\u914D\u7F6E
+wxpay.appId = wx53b5ac263b9cdb5b
+wxpay.appSecret = baa127ca662344cf9b0b8e52b26bac9d
+wxpay.mchId=1485526382
+wxpay.apiV2=f5aacf8f7ff800f4cd039f2514c5d7da
+
+#\u5FAE\u4FE1\u5C0F\u7A0B\u5E8Fappid: wx53b5ac263b9cdb5b
+#\u5FAE\u4FE1\u5C0F\u7A0B\u5E8FAppSecret: baa127ca662344cf9b0b8e52b26bac9d
+#\u5FAE\u4FE1\u652F\u4ED8: 1485526382
+#\u5FAE\u4FE1\u652F\u4ED8mchKey: HUAMARYUN20171104QAZWSXEDCRFVTGB
+#\u5FAE\u4FE1\u652F\u4ED8apiv2\u5BC6\u94A5\uFF1Af5aacf8f7ff800f4cd039f2514c5d7da
+#\u5FAE\u4FE1\u652F\u4ED8apiv3\u5BC6\u94A5\uFF1Af5aacf8f7ff800f4cd039f2514c5d7da
+
+
+wxpay.certPath=D:/apiclient_cert.p12
+wxpay.domain=https://yanghaodong.51vip.biz
+
+################## \u652F\u4ED8\u5B9D\u652F\u4ED8\u76F8\u5173\u914D\u7F6E ######################
+alipay.appId = \u5E94\u7528\u7F16\u53F7
+alipay.privateKey = \u5E94\u7528\u79C1\u94A5
+alipay.publicKey = \u652F\u4ED8\u5B9D\u516C\u94A5\uFF08\u901A\u8FC7\u5E94\u7528\u516C\u94A5\u4E0A\u4F20\u5230\u652F\u4ED8\u5B9D\u5F00\u653E\u5E73\u53F0\u6362\u53D6\u652F\u4ED8\u5B9D\u516C\u94A5\uFF09
+alipay.serverUrl=https://openapi.alipay.com/gateway.do
+alipay.domain=https://www.huamar.com/fuint-application/clientApi/pay/aliPayCallback
+
+################ \u5FAE\u4FE1\u8BA2\u9605\u6A21\u677F\u6D88\u606F\u914D\u7F6E ######################
+weixin.subMessage.orderCreated=[{'key':'time', 'name':'\u8BA2\u5355\u65F6\u95F4'},{'key':'orderSn', 'name':'\u8BA2\u5355\u53F7'},{'key':'remark', 'name':'\u5907\u6CE8\u4FE1\u606F'}]
+weixin.subMessage.deliverGoods=[{'key':'receiver', 'name':'\u6536\u8D27\u4EBA'}, {'key':'orderSn', 'name':'\u8BA2\u5355\u53F7'}, {'key':'expressCompany', 'name':'\u5FEB\u9012\u516C\u53F8'}, {'key':'expressNo', 'name':'\u5FEB\u9012\u5355\u53F7'}]
+weixin.subMessage.couponExpire=[{'key':'name', 'name':'\u5361\u5238\u540D\u79F0'}, {'key':'expireTime', 'name':'\u5230\u671F\u65F6\u95F4'},{'key':'tips', 'name':'\u6E29\u99A8\u63D0\u793A'}]
+weixin.subMessage.couponArrival=[{'key':'name', 'name':'\u5361\u5238\u540D\u79F0'},{'key':'amount', 'name':'\u91D1\u989D'},{'key':'tips', 'name':'\u6E29\u99A8\u63D0\u793A'}]
+weixin.subMessage.balanceChange=[{'key':'amount', 'name':'\u53D8\u52A8\u91D1\u989D'},{'key':'time', 'name':'\u53D8\u52A8\u65F6\u95F4'},{'key':'tips', 'name':'\u6E29\u99A8\u63D0\u793A'}]
+weixin.subMessage.couponConfirm=[{'key':'name', 'name':'\u5361\u5238\u540D\u79F0'},{'key':'time', 'name':'\u6838\u9500\u65F6\u95F4'}]
+weixin.subMessage.pointChange=[{'key':'amount', 'name':'\u53D8\u52A8\u6570\u91CF'},{'key':'time', 'name':'\u53D8\u52A8\u65F6\u95F4'},{'key':'remark', 'name':'\u5907\u6CE8\u4FE1\u606F'}]
diff --git a/fuintBackend/configure/prod/application.properties b/fuintBackend/configure/prod/application.properties
new file mode 100644
index 0000000..51621c9
--- /dev/null
+++ b/fuintBackend/configure/prod/application.properties
@@ -0,0 +1,108 @@
+# 数据库配置
+spring.datasource.url=jdbc:mysql://localhost:3306/fuint-db?useUnicode=true&characterEncoding=UTF8&useSSL=false
+spring.datasource.username=root
+spring.datasource.password=root
+
+# Redis配置
+spring.session.store-type=redis
+spring.session.redis.namespace=fuint
+# Redis数据库索引(默认为0)
+spring.redis.database=0
+# Redis服务器地址(生产)
+spring.redis.host=127.0.0.1
+# Redis服务器连接端口
+spring.redis.port=6379
+# Redis服务器连接密码(默认为空)
+spring.redis.password=
+# 连接池最大连接数(使用负值表示没有限制)
+spring.redis.pool.max-active=-1
+# 连接池最大阻塞等待时间(使用负值表示没有限制)
+spring.redis.pool.max-wait=-1
+# 连接池中的最大空闲连接
+spring.redis.pool.max-idle=8
+# 连接池中的最小空闲连接
+spring.redis.pool.min-idle=0
+# 连接超时时间(毫秒)
+spring.redis.timeout=0
+
+# 系统名称
+system.name = fuint会员营销管理系统
+
+# 前端h5地址
+website.url=https://www.fuint.cn/h5/
+
+# 上传图片本地地址
+images.root=/www/wwwroot/www.xxx.com
+images.path=/static/uploadImages/
+
+# 上传图片服务器域名
+images.upload.url=http://localhost:8080
+
+# 上传图片允许的大小(单位:MB)
+images.upload.maxSize=5
+
+################## 定时脚本配置 #########################
+# 定时发送消息
+message.job.switch = 1
+message.job.time = 0 0/1 * * * ?
+
+# 卡券到期处理
+couponExpire.job.switch = 1
+couponExpire.job.time = 0 0/1 * * * ?
+
+# 订单超时取消
+orderCancel.job.switch = 1
+orderCancel.job.time = 0 0/1 * * * ?
+
+# 分佣提成计算
+commission.job.switch = 1
+commission.job.time = 0 0/1 * * * ?
+
+################## 阿里云短信配置 #######################
+# 短信接口模式[0-关闭 1-打开]
+aliyun.sms.mode = 0
+aliyun.sms.accessKeyId=LTAI4GJMjV123oXsrQJLnPZt
+aliyun.sms.accessKeySecret=eGVBL30u5Ypj234d7XODlwYKWTaGT
+# 阿里云短信签名
+aliyun.sms.signName=延禾技术
+
+################## 阿里云OSS存储配置######################
+# 模式[0-关闭 1-打开]
+aliyun.oss.mode = 0
+aliyun.oss.accessKeyId = LTAI4GJMjVhBa212rQJLnPZt
+aliyun.oss.accessKeySecret = eGVBL30u53456gXd7XODlwYKWTaGT
+aliyun.oss.endpoint = https://oss-cn-shenzhen.aliyuncs.com
+aliyun.oss.bucketName = fuint-application
+# 上传文件夹
+aliyun.oss.folder = uploads
+# 访问域名
+aliyun.oss.domain = https://fuint-application.oss-cn-shenzhen.aliyuncs.com
+
+################## 微信相关配置 ##########################
+# 公众号配置
+weixin.official.appId=wxf4327ef05c27a0
+weixin.official.appSecret=1f55e8749332234d9a074873d8e6a3
+
+# 小程序配置
+wxpay.appId = wxb6af3741234162bc
+wxpay.appSecret = 76a538bfa5b55a4564d5f2be5540
+wxpay.mchId=1636980812
+wxpay.apiV2=34354320201030y323e432342343
+wxpay.certPath=/usr/local/fuint/cert/apiclient_cert.p12
+wxpay.domain=https://www.fuint.cn/fuint-application
+
+################## 支付宝支付相关配置 ######################
+alipay.appId = 应用编号
+alipay.privateKey = 应用私钥
+alipay.publicKey = 支付宝公钥(通过应用公钥上传到支付宝开放平台换取支付宝公钥)
+alipay.serverUrl=https://openapi.alipay.com/gateway.do
+alipay.domain=https://www.fuint.cn/fuint-application/clientApi/pay/aliPayCallback
+
+################ 微信订阅模板消息配置 ######################
+weixin.subMessage.orderCreated=[{'key':'time', 'name':'订单时间'},{'key':'orderSn', 'name':'订单号'},{'key':'remark', 'name':'备注信息'}]
+weixin.subMessage.deliverGoods=[{'key':'receiver', 'name':'收货人'}, {'key':'orderSn', 'name':'订单号'}, {'key':'expressCompany', 'name':'快递公司'}, {'key':'expressNo', 'name':'快递单号'}]
+weixin.subMessage.couponExpire=[{'key':'name', 'name':'卡券名称'}, {'key':'expireTime', 'name':'到期时间'},{'key':'tips', 'name':'温馨提示'}]
+weixin.subMessage.couponArrival=[{'key':'name', 'name':'卡券名称'},{'key':'amount', 'name':'金额'},{'key':'tips', 'name':'温馨提示'}]
+weixin.subMessage.balanceChange=[{'key':'amount', 'name':'变动金额'},{'key':'time', 'name':'变动时间'},{'key':'tips', 'name':'温馨提示'}]
+weixin.subMessage.couponConfirm=[{'key':'name', 'name':'卡券名称'},{'key':'time', 'name':'核销时间'}]
+weixin.subMessage.pointChange=[{'key':'amount', 'name':'变动数量'},{'key':'time', 'name':'变动时间'},{'key':'remark', 'name':'备注信息'}]
\ No newline at end of file
diff --git a/fuintBackend/db/fuint-db.sql b/fuintBackend/db/fuint-db.sql
new file mode 100644
index 0000000..7b0e43e
--- /dev/null
+++ b/fuintBackend/db/fuint-db.sql
@@ -0,0 +1,6434 @@
+CREATE DATABASE /*!32312 IF NOT EXISTS*/`fuint-db` /*!40100 DEFAULT CHARACTER SET utf8 */ /*!80016 DEFAULT ENCRYPTION='N' */;
+
+USE `fuint-db`;
+
+/*Table structure for table `mt_address` */
+
+DROP TABLE IF EXISTS `mt_address`;
+
+CREATE TABLE `mt_address` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `USER_ID` int NOT NULL DEFAULT '0' COMMENT '用户ID',
+ `NAME` varchar(30) NOT NULL DEFAULT '' COMMENT '收货人姓名',
+ `MOBILE` varchar(20) DEFAULT '' COMMENT '收货手机号',
+ `PROVINCE_ID` int unsigned DEFAULT '0' COMMENT '省份ID',
+ `CITY_ID` int unsigned DEFAULT '0' COMMENT '城市ID',
+ `REGION_ID` int DEFAULT '0' COMMENT '区/县ID',
+ `DETAIL` varchar(255) DEFAULT '' COMMENT '详细地址',
+ `IS_DEFAULT` char(1) DEFAULT 'N' COMMENT '是否默认',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `STATUS` char(1) DEFAULT 'A' COMMENT '状态',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='会员地址表';
+
+/*Data for the table `mt_address` */
+
+/*Table structure for table `mt_article` */
+
+DROP TABLE IF EXISTS `mt_article`;
+
+CREATE TABLE `mt_article` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `STORE_ID` int NOT NULL DEFAULT '0' COMMENT '目录ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID',
+ `TITLE` varchar(100) DEFAULT '' COMMENT '标题',
+ `BRIEF` varchar(500) DEFAULT '' COMMENT '简介',
+ `URL` varchar(100) DEFAULT '' COMMENT '链接地址',
+ `IMAGE` varchar(200) DEFAULT '' COMMENT '图片地址',
+ `DESCRIPTION` text COMMENT '描述',
+ `CLICK` int DEFAULT '0' COMMENT '点击次数',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `OPERATOR` varchar(30) DEFAULT NULL COMMENT '最后操作人',
+ `SORT` int DEFAULT '0' COMMENT '排序',
+ `STATUS` char(1) DEFAULT 'A' COMMENT 'A:正常;N:禁用;D:删除',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB AUTO_INCREMENT=71 DEFAULT CHARSET=utf8 COMMENT='文章表';
+
+/*Data for the table `mt_article` */
+
+insert into `mt_article`(`ID`,`STORE_ID`,`MERCHANT_ID`,`TITLE`,`BRIEF`,`URL`,`IMAGE`,`DESCRIPTION`,`CLICK`,`CREATE_TIME`,`UPDATE_TIME`,`OPERATOR`,`SORT`,`STATUS`) values
+(3,7,1,'“美食荒漠”? 温州:不存在的!','吃妈妈做的菜?或者足不出户,优哉游哉?不管在哪,假期的意义,绝对少不了一个“吃”。周刊君特别推出“五一就要吃”评论系列,小伙伴们会来讲讲,他们各自心心念念的家乡美食。也欢迎大家留言参与,看看哪个更馋人。','','/static/defaultImage/banner-2.png?v=1','oi五一假期终于来了,你在哪?是去看人山人海,搞“特种兵式的旅行”,还是回老家,吃妈妈做的菜?或者足不出户,优哉游哉?不管在哪,假期的意义,绝对少不了一个“吃”。周刊君特别推出“五一就要吃”评论系列,小伙伴们会来讲讲,他们各自心心念念的家乡美食。也欢迎大家留言参与,看看哪个更馋人。 我的家乡,是一座山城相拥、海陆交融的山水之城。
诗画山水,温润之州,是为温州。
这里有“欲写龙湫难下笔,不游雁荡是虚生”中国东南第一山雁荡山,有山水诗的发祥地楠溪江,有山与海的尽头、东海明珠南麂岛,更有“走遍千山万水、想尽千方百计、说尽千言万语、吃尽千辛万苦”的温州精神。
温州古为瓯越大地,也称东瓯,故这里的食物被称为“瓯菜”。
这里山川湖海汇聚,美食自然丰富多样。山里的、海里的、湖里的、江里的、溪里的,各有各的滋味,所谓一方水土一方美食,无外乎如此。
很多人对温州美食的初印象,来自电视剧《温州一家人》,这部由李立群、殷桃、张译主演的热播剧,讲述了温州一个普通家庭的草根创业奋斗史。
在这部剧中,温州的美食伴随着市井烟火气,令人垂涎欲滴。但现实却是,或许是温州人对于这些美食太过习以为常,又或许是温州于经商一途上声名太响,让人潜意识里忽略了这里的吃食,误以为是“美食荒漠”,并不为太多人所熟知,以至于忽略了这里蕴藏着一座城的美食。
至少来温州旅游的人,很少是冲着美食来的。
',105,'2023-05-12 09:12:16','2023-06-20 17:14:24','fuint',0,'A'),
+(5,1,1,'又到一年最佳赏樱季','又到一年最佳赏樱季,一直想去亲眼目睹一次被誉为“世界三大赏樱胜地”之一 的无锡鼋头渚,正值无锡太湖鼋头渚国际樱花节 ,3万多株、100多个品种的樱花树,着实让人期待。','','/static/defaultImage/banner-1.png?v=1','又到一年最佳赏樱季,一直想去亲眼目睹一次被誉为“世界三大赏樱胜地”之一 的无锡鼋头渚,正值无锡太湖鼋头渚国际樱花节 ,3万多株、100多个品种的樱花树,着实让人期待。
无锡太湖鼋头渚国际樱花节将从3月1日持续至5月3日,这期间来可以看到早樱、中樱、晚樱等各品种的樱花独揽芳华,晨赏、日赏、暮赏、夜赏,能看到千姿百态的樱花。
走在鼋头渚的小道上,空气里都是芬芳的樱花味道,漫山遍野的樱花,粉白、玫红、粉红色……不同的颜色交叠,层次感丰富,浪漫迷人~
我喜欢这里樱花盛开的时候,建筑的设计和樱花的飘落,虽然去的那天是阴天,但是却也别有一番诗情画意,小桥流水,樱花古韵,水波带着花影泛起阵阵涟漪,随手一拍就会有一种中式浪漫的感觉,沉醉在江南意境中,尤其穿上汉服拍照,绝美!
',88,'2023-05-12 18:29:01','2023-07-05 15:05:37','fuint',1,'A');
+
+/*Table structure for table `mt_balance` */
+
+DROP TABLE IF EXISTS `mt_balance`;
+
+CREATE TABLE `mt_balance` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '所属商户ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '所属店铺ID',
+ `MOBILE` varchar(11) DEFAULT '' COMMENT '手机号',
+ `USER_ID` int NOT NULL DEFAULT '0' COMMENT '用户ID',
+ `ORDER_SN` varchar(32) DEFAULT '' COMMENT '订单号',
+ `AMOUNT` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '余额变化数量',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `DESCRIPTION` varchar(200) DEFAULT '' COMMENT '备注说明',
+ `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人',
+ `STATUS` char(1) DEFAULT 'A' COMMENT '状态,A正常;D作废',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='余额变化表';
+
+/*Data for the table `mt_balance` */
+
+insert into `mt_balance`(`ID`,`MERCHANT_ID`,`STORE_ID`,`MOBILE`,`USER_ID`,`ORDER_SN`,`AMOUNT`,`CREATE_TIME`,`UPDATE_TIME`,`DESCRIPTION`,`OPERATOR`,`STATUS`) values
+(1,1,0,'18976679980',163,'202309082201183531567',-72.08,'2023-09-08 22:01:18','2023-09-08 22:01:18','','','A'),
+(2,1,0,'18976679980',163,'202309082204254176805',-72.08,'2023-09-08 22:04:25','2023-09-08 22:04:25','','','A'),
+(4,0,3,'18976679980',163,'202309201800308947963',-4.04,'2023-09-20 18:00:31','2023-09-20 18:00:31','','','A'),
+(5,0,3,'18976679980',163,'202309210835395956418',-80.00,'2023-09-21 08:35:40','2023-09-21 08:35:40','','','A');
+
+/*Table structure for table `mt_banner` */
+
+DROP TABLE IF EXISTS `mt_banner`;
+
+CREATE TABLE `mt_banner` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `TITLE` varchar(100) DEFAULT '' COMMENT '标题',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '所属商户ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '所属店铺ID',
+ `URL` varchar(100) DEFAULT '' COMMENT '链接地址',
+ `IMAGE` varchar(200) DEFAULT '' COMMENT '图片地址',
+ `DESCRIPTION` text COMMENT '描述',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `OPERATOR` varchar(30) DEFAULT NULL COMMENT '最后操作人',
+ `SORT` int DEFAULT '0' COMMENT '排序',
+ `STATUS` char(1) DEFAULT 'A' COMMENT 'A:正常;D:删除',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB AUTO_INCREMENT=215 DEFAULT CHARSET=utf8 COMMENT='会员端焦点图表';
+
+/*Data for the table `mt_banner` */
+
+insert into `mt_banner`(`ID`,`TITLE`,`MERCHANT_ID`,`STORE_ID`,`URL`,`IMAGE`,`DESCRIPTION`,`CREATE_TIME`,`UPDATE_TIME`,`OPERATOR`,`SORT`,`STATUS`) values
+(1,'活动',1,0,'pages/user/index','/static/defaultImage/banner-2.png?v=1','','2021-04-14 09:38:20','2023-08-01 07:52:08','fuint',1,'A'),
+(2,'活动',2,0,'pages/category/index','/static/defaultImage/banner-1.png?v=1','','2021-04-14 09:38:36','2023-07-25 17:37:40','fuint',1,'A');
+
+/*Table structure for table `mt_book` */
+
+DROP TABLE IF EXISTS `mt_book`;
+
+CREATE TABLE `mt_book` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '所属商户ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '店铺ID',
+ `GOODS_ID` int DEFAULT '0' COMMENT '预约服务ID',
+ `SERVICE_DATES` varchar(1000) DEFAULT '' COMMENT '可预约日期',
+ `SERVICE_TIMES` varchar(1000) DEFAULT '' COMMENT '可预约时间段',
+ `SERVICE_STAFF_IDS` varchar(1000) DEFAULT '' COMMENT '可预约员工',
+ `DESCRIPTION` varchar(1000) DEFAULT '' COMMENT '预约说明',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人',
+ `STATUS` char(1) DEFAULT 'A' COMMENT '订单状态',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='预约表';
+
+/*Data for the table `mt_book` */
+
+insert into `mt_book`(`ID`,`MERCHANT_ID`,`STORE_ID`,`GOODS_ID`,`SERVICE_DATES`,`SERVICE_TIMES`,`SERVICE_STAFF_IDS`,`DESCRIPTION`,`CREATE_TIME`,`UPDATE_TIME`,`OPERATOR`,`STATUS`) values
+(1,1,1,1,'2023-02-04_2023-02-08,2023-03-04_2023-05-08','9:00-11:00,14:00-16:00,20:00-22:00','1,2,4,5,6,7,10','针灸预约','2023-02-14 11:45:54','2023-02-15 11:45:57','','A');
+
+/*Table structure for table `mt_book_item` */
+
+DROP TABLE IF EXISTS `mt_book_item`;
+
+CREATE TABLE `mt_book_item` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '所属商户ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '店铺ID',
+ `GOODS_ID` int DEFAULT '0' COMMENT '预约服务ID',
+ `CONTACT` varchar(30) DEFAULT NULL COMMENT '预约联系人',
+ `MOBILE` varchar(30) DEFAULT NULL COMMENT '预约手机号',
+ `SERVICE_START_TIME` datetime DEFAULT NULL COMMENT '预约开始日期',
+ `SERVICE_END_TIME` datetime DEFAULT NULL COMMENT '预约结束日期',
+ `SERVICE_STAFF_ID` varchar(1000) DEFAULT '' COMMENT '可预约员工',
+ `REMARK` varchar(1000) DEFAULT '' COMMENT '预约说明',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人',
+ `STATUS` char(1) DEFAULT 'A' COMMENT '状态',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='预约详情表';
+
+/*Data for the table `mt_book_item` */
+
+/*Table structure for table `mt_cart` */
+
+DROP TABLE IF EXISTS `mt_cart`;
+
+CREATE TABLE `mt_cart` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `USER_ID` int NOT NULL DEFAULT '0' COMMENT '会员ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '店铺ID',
+ `IS_VISITOR` char(1) DEFAULT 'N' COMMENT '是否游客',
+ `HANG_NO` varchar(10) DEFAULT '' COMMENT '挂单号',
+ `SKU_ID` int DEFAULT '0' COMMENT 'skuID',
+ `GOODS_ID` int DEFAULT '0' COMMENT '商品ID',
+ `NUM` int DEFAULT '1' COMMENT '数量',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `STATUS` char(1) DEFAULT 'A' COMMENT '状态',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COMMENT='购物车';
+
+/*Data for the table `mt_cart` */
+
+/*Table structure for table `mt_commission_cash` */
+
+DROP TABLE IF EXISTS `mt_commission_cash`;
+
+CREATE TABLE `mt_commission_cash` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `SETTLE_NO` varchar(32) DEFAULT NULL COMMENT '结算单号',
+ `UUID` varchar(32) DEFAULT NULL COMMENT '结算UUID',
+ `MERCHANT_ID` int NOT NULL COMMENT '商户ID',
+ `STORE_ID` int DEFAULT NULL COMMENT '店铺ID',
+ `USER_ID` int DEFAULT NULL COMMENT '会员ID',
+ `STAFF_ID` int DEFAULT NULL COMMENT '员工ID',
+ `AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '金额',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `DESCRIPTION` varchar(500) DEFAULT NULL COMMENT '备注信息',
+ `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人',
+ `STATUS` char(1) DEFAULT 'A' COMMENT '状态,A:待确认,B:已确认,C:已支付,D:已作废',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='分佣提现记录表';
+
+/*Data for the table `mt_commission_cash` */
+
+/*Table structure for table `mt_commission_log` */
+
+DROP TABLE IF EXISTS `mt_commission_log`;
+
+CREATE TABLE `mt_commission_log` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `MERCHANT_ID` int NOT NULL COMMENT '商户ID',
+ `TARGET` varchar(30) DEFAULT '' COMMENT '对象,member:会员分销;staff:员工提成',
+ `TYPE` varchar(30) NOT NULL COMMENT '分佣类型',
+ `LEVEL` int DEFAULT '1' COMMENT '分销等级',
+ `USER_ID` int DEFAULT NULL COMMENT '会员ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '店铺ID',
+ `STAFF_ID` int DEFAULT '0' COMMENT '员工ID',
+ `ORDER_ID` int DEFAULT '0' COMMENT '订单ID',
+ `AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '分佣金额',
+ `RULE_ID` int DEFAULT NULL COMMENT '分佣规则ID',
+ `RULE_ITEM_ID` int DEFAULT NULL COMMENT '分佣规则项ID',
+ `DESCRIPTION` varchar(500) DEFAULT NULL COMMENT '备注信息',
+ `SETTLE_UUID` varchar(32) DEFAULT NULL COMMENT '结算uuid',
+ `CASH_ID` int DEFAULT NULL COMMENT '提现记录ID',
+ `IS_CASH` char(1) DEFAULT 'N' COMMENT '是否提现,Y:是;N:否',
+ `CASH_TIME` datetime DEFAULT NULL COMMENT '提现时间',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `STATUS` char(1) DEFAULT 'A' COMMENT '状态,A:待结算;B:已结算;C:已作废',
+ `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='佣金记录表';
+
+/*Data for the table `mt_commission_log` */
+
+/*Table structure for table `mt_commission_relation` */
+
+DROP TABLE IF EXISTS `mt_commission_relation`;
+
+CREATE TABLE `mt_commission_relation` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `MERCHANT_ID` int NOT NULL COMMENT '商户ID',
+ `USER_ID` int DEFAULT NULL COMMENT '邀请会员ID',
+ `LEVEL` int DEFAULT '1' COMMENT '等级',
+ `INVITE_CODE` varchar(32) DEFAULT '' COMMENT '邀请码',
+ `SUB_USER_ID` int DEFAULT NULL COMMENT '被邀请会员ID',
+ `DESCRIPTION` varchar(500) DEFAULT NULL COMMENT '说明',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `STATUS` char(1) DEFAULT 'A' COMMENT '状态,A:激活;D:删除',
+ `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='会员分销关系表';
+
+/*Data for the table `mt_commission_relation` */
+
+/*Table structure for table `mt_commission_rule` */
+
+DROP TABLE IF EXISTS `mt_commission_rule`;
+
+CREATE TABLE `mt_commission_rule` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `NAME` varchar(100) DEFAULT '' COMMENT '规则名称',
+ `TYPE` varchar(30) DEFAULT NULL COMMENT '方案类型',
+ `TARGET` varchar(30) DEFAULT '' COMMENT '方案对象,member:会员分销;staff:员工提成',
+ `MERCHANT_ID` int NOT NULL COMMENT '商户ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '店铺ID',
+ `STORE_IDS` varchar(500) DEFAULT '' COMMENT '适用店铺',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `DESCRIPTION` varchar(1000) DEFAULT NULL COMMENT '备注信息',
+ `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人',
+ `STATUS` char(1) DEFAULT 'A' COMMENT '状态,A:激活;N:禁用;D:删除',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='方案规则表';
+
+/*Data for the table `mt_commission_rule` */
+
+/*Table structure for table `mt_commission_rule_item` */
+
+DROP TABLE IF EXISTS `mt_commission_rule_item`;
+
+CREATE TABLE `mt_commission_rule_item` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `TYPE` varchar(30) DEFAULT NULL COMMENT '分佣类型',
+ `RULE_ID` int NOT NULL DEFAULT '0' COMMENT '规则ID',
+ `MERCHANT_ID` int NOT NULL COMMENT '商户ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '适用店铺',
+ `TARGET` varchar(30) DEFAULT NULL COMMENT '分佣对象',
+ `TARGET_ID` int NOT NULL DEFAULT '0' COMMENT '对象ID',
+ `METHOD` varchar(30) DEFAULT NULL COMMENT '提成方式(按比例/固定金额)',
+ `STORE_IDS` varchar(500) DEFAULT '' COMMENT '适用店铺',
+ `GUEST` decimal(10,2) DEFAULT NULL COMMENT '散客佣金',
+ `SUB_GUEST` decimal(10,2) DEFAULT NULL COMMENT '二级散客佣金',
+ `MEMBER` decimal(10,2) DEFAULT NULL COMMENT '会员佣金',
+ `SUB_MEMBER` decimal(10,2) DEFAULT NULL COMMENT '二级会员佣金',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人',
+ `STATUS` char(1) DEFAULT 'A' COMMENT '状态,A:激活;N:禁用;D:删除',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='分佣提成规则项目表';
+
+/*Data for the table `mt_commission_rule_item` */
+
+/*Table structure for table `mt_confirm_log` */
+
+DROP TABLE IF EXISTS `mt_confirm_log`;
+
+CREATE TABLE `mt_confirm_log` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `CODE` varchar(32) NOT NULL DEFAULT '' COMMENT '编码',
+ `AMOUNT` decimal(10,2) DEFAULT '0.00' COMMENT '核销金额',
+ `COUPON_ID` int DEFAULT '0' COMMENT '卡券ID',
+ `USER_COUPON_ID` int NOT NULL DEFAULT '0' COMMENT '用户券ID',
+ `ORDER_ID` int DEFAULT '0' COMMENT '订单ID',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `USER_ID` int NOT NULL DEFAULT '0' COMMENT '卡券所属用户ID',
+ `OPERATOR_USER_ID` int DEFAULT NULL COMMENT '核销者用户ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID',
+ `STORE_ID` int NOT NULL DEFAULT '0' COMMENT '核销店铺ID',
+ `STATUS` varchar(1) NOT NULL COMMENT '状态,A正常核销;D:撤销使用',
+ `CANCEL_TIME` datetime DEFAULT NULL COMMENT '撤销时间',
+ `OPERATOR` varchar(30) DEFAULT NULL COMMENT '最后操作人',
+ `OPERATOR_FROM` varchar(30) DEFAULT 'mt_user' COMMENT '操作来源user_id对应表t_account 还是 mt_user',
+ `REMARK` varchar(500) DEFAULT '' COMMENT '备注信息',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='核销记录表';
+
+/*Data for the table `mt_confirm_log` */
+
+/*Table structure for table `mt_coupon` */
+
+DROP TABLE IF EXISTS `mt_coupon`;
+
+CREATE TABLE `mt_coupon` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '店铺ID',
+ `GROUP_ID` int NOT NULL DEFAULT '0' COMMENT '券组ID',
+ `TYPE` char(1) DEFAULT 'C' COMMENT '券类型,C优惠券;P预存卡;T集次卡',
+ `NAME` varchar(100) NOT NULL DEFAULT '' COMMENT '券名称',
+ `IS_GIVE` tinyint(1) DEFAULT '0' COMMENT '是否允许转赠',
+ `GRADE_IDS` varchar(100) DEFAULT '' COMMENT '适用会员等级',
+ `POINT` int DEFAULT '0' COMMENT '获得卡券所消耗积分',
+ `APPLY_GOODS` varchar(20) DEFAULT '' COMMENT '适用商品:allGoods、parkGoods',
+ `RECEIVE_CODE` varchar(32) DEFAULT '' COMMENT '领取码',
+ `USE_FOR` varchar(30) DEFAULT '' COMMENT '使用专项',
+ `EXPIRE_TYPE` varchar(30) DEFAULT '' COMMENT '过期类型',
+ `EXPIRE_TIME` int DEFAULT '0' COMMENT '有效期,单位:天',
+ `BEGIN_TIME` datetime DEFAULT NULL COMMENT '开始有效期',
+ `END_TIME` datetime DEFAULT NULL COMMENT '结束有效期',
+ `AMOUNT` decimal(10,2) DEFAULT '0.00' COMMENT '面额',
+ `SEND_WAY` varchar(20) DEFAULT 'backend' COMMENT '发放方式',
+ `SEND_NUM` int unsigned DEFAULT '1' COMMENT '每次发放数量',
+ `TOTAL` int DEFAULT '0' COMMENT '发行数量',
+ `LIMIT_NUM` int DEFAULT '1' COMMENT '每人拥有数量限制',
+ `EXCEPT_TIME` varchar(500) DEFAULT '' COMMENT '不可用日期,逗号隔开。周末:weekend;其他:2019-01-02_2019-02-09',
+ `STORE_IDS` varchar(100) DEFAULT '' COMMENT '所属店铺ID,逗号隔开',
+ `DESCRIPTION` varchar(2000) DEFAULT '' COMMENT '描述信息',
+ `IMAGE` varchar(100) DEFAULT '' COMMENT '效果图片',
+ `REMARKS` varchar(1000) DEFAULT '' COMMENT '后台备注',
+ `IN_RULE` varchar(1000) DEFAULT '' COMMENT '获取券的规则',
+ `OUT_RULE` varchar(1000) DEFAULT '' COMMENT '核销券的规则',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人',
+ `STATUS` char(1) DEFAULT 'A' COMMENT 'A:正常;D:删除',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='卡券信息表';
+
+/*Data for the table `mt_coupon` */
+
+/*Table structure for table `mt_coupon_goods` */
+
+DROP TABLE IF EXISTS `mt_coupon_goods`;
+
+CREATE TABLE `mt_coupon_goods` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `COUPON_ID` int NOT NULL COMMENT '卡券ID',
+ `GOODS_ID` int NOT NULL COMMENT '商品ID',
+ `CREATE_TIME` datetime NOT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime NOT NULL COMMENT '更新时间',
+ `STATUS` char(1) NOT NULL DEFAULT 'A' COMMENT '状态',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='卡券商品表';
+
+/*Data for the table `mt_coupon_goods` */
+
+/*Table structure for table `mt_coupon_group` */
+
+DROP TABLE IF EXISTS `mt_coupon_group`;
+
+CREATE TABLE `mt_coupon_group` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '店铺ID',
+ `NAME` varchar(100) NOT NULL DEFAULT '' COMMENT '券组名称',
+ `MONEY` decimal(18,2) DEFAULT '0.00' COMMENT '价值金额',
+ `NUM` int DEFAULT '0' COMMENT '券种类数量',
+ `TOTAL` int DEFAULT '0' COMMENT '发行数量',
+ `DESCRIPTION` varchar(2000) DEFAULT '' COMMENT '备注',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建日期',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新日期',
+ `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人',
+ `STATUS` char(1) NOT NULL DEFAULT 'A' COMMENT 'A:正常;D:删除',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='优惠券组';
+
+/*Data for the table `mt_coupon_group` */
+
+/*Table structure for table `mt_freight` */
+
+DROP TABLE IF EXISTS `mt_freight`;
+
+CREATE TABLE `mt_freight` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '店铺ID',
+ `NAME` varchar(100) NOT NULL COMMENT '名称',
+ `TYPE` int NOT NULL COMMENT '计费类型,1:按件数;2:按重量',
+ `AMOUNT` decimal(10,2) NOT NULL COMMENT '费用',
+ `INCRE_AMOUNT` decimal(10,2) NOT NULL COMMENT '续费',
+ `CREATE_TIME` datetime NOT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime NOT NULL COMMENT '更新时间',
+ `STATUS` char(1) NOT NULL COMMENT '状态',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='运费模板';
+
+/*Data for the table `mt_freight` */
+
+/*Table structure for table `mt_freight_region` */
+
+DROP TABLE IF EXISTS `mt_freight_region`;
+
+CREATE TABLE `mt_freight_region` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `FREIGHT_ID` int NOT NULL COMMENT '运费模板ID',
+ `PROVINCE_ID` int NOT NULL COMMENT '省份ID',
+ `CITY_ID` int NOT NULL COMMENT '城市ID',
+ `AREA_ID` int NOT NULL COMMENT '区域ID',
+ `CREATE_TIME` datetime NOT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime NOT NULL COMMENT '更新时间',
+ `STATUS` char(1) NOT NULL COMMENT '状态',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='运费模板地区';
+
+/*Data for the table `mt_freight_region` */
+
+/*Table structure for table `mt_give` */
+
+DROP TABLE IF EXISTS `mt_give`;
+
+CREATE TABLE `mt_give` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增',
+ `USER_ID` int NOT NULL DEFAULT '0' COMMENT '获赠者用户ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '店铺ID',
+ `GIVE_USER_ID` int NOT NULL DEFAULT '0' COMMENT '赠送者用户ID',
+ `MOBILE` varchar(20) NOT NULL DEFAULT '' COMMENT '赠予对象手机号',
+ `USER_MOBILE` varchar(20) NOT NULL DEFAULT '' COMMENT '用户手机',
+ `GROUP_IDS` varchar(200) NOT NULL DEFAULT '' COMMENT '券组ID,逗号隔开',
+ `GROUP_NAMES` varchar(500) NOT NULL DEFAULT '' COMMENT '券组名称,逗号隔开',
+ `COUPON_IDS` varchar(200) NOT NULL DEFAULT '' COMMENT '券ID,逗号隔开',
+ `COUPON_NAMES` varchar(500) NOT NULL DEFAULT '' COMMENT '券名称,逗号隔开',
+ `NUM` int NOT NULL DEFAULT '0' COMMENT '数量',
+ `MONEY` decimal(10,2) NOT NULL COMMENT '总金额',
+ `NOTE` varchar(200) DEFAULT '' COMMENT '备注',
+ `MESSAGE` varchar(500) DEFAULT '' COMMENT '留言',
+ `CREATE_TIME` datetime NOT NULL COMMENT '赠送时间',
+ `UPDATE_TIME` datetime NOT NULL COMMENT '更新时间',
+ `STATUS` char(1) NOT NULL DEFAULT 'A' COMMENT '状态,A正常;C取消',
+ PRIMARY KEY (`ID`),
+ KEY `index_user_id` (`USER_ID`) USING BTREE,
+ KEY `index_give_user_id` (`GIVE_USER_ID`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='转赠记录表';
+
+/*Data for the table `mt_give` */
+
+insert into `mt_give`(`ID`,`USER_ID`,`MERCHANT_ID`,`STORE_ID`,`GIVE_USER_ID`,`MOBILE`,`USER_MOBILE`,`GROUP_IDS`,`GROUP_NAMES`,`COUPON_IDS`,`COUPON_NAMES`,`NUM`,`MONEY`,`NOTE`,`MESSAGE`,`CREATE_TIME`,`UPDATE_TIME`,`STATUS`) values
+(1,163,1,1,693,'18976679980','18888884444','4','2021年中秋','4','酬宾早餐优惠券',1,50.00,'','转赠一张优惠券给你','2022-02-11 13:43:47','2022-02-11 13:43:47','A'),
+(2,772,1,1,772,'18175702219','18175702219','12','26656','30','tanyi',1,10.00,'','转赠一张优惠券给你','2022-03-06 20:19:18','2022-03-06 20:19:18','A'),
+(3,921,1,1,921,'13882064775','13882064775','6','十月份活动','14','优惠券10元',1,100.00,'','转赠一张优惠券给你','2022-04-13 19:46:41','2022-04-13 19:46:41','A'),
+(4,1,1,1,163,'18976679981','18976679980','5','2021十一活动','15','100元优惠券',1,20.00,'','转赠一张优惠券给你','2022-05-11 20:43:02','2022-05-11 20:43:02','A'),
+(5,1,1,1,163,'18976679981','18976679980','4','2021年中秋','3','2022年51限额500名活动预存券',1,200.00,'','转赠一张优惠券给你','2022-05-11 21:28:41','2022-05-11 21:28:41','A'),
+(6,1162,1,1,1126,'18818996621','','26','全场典藏卡券(测试)','70','全场典藏卡券(测试)',1,50.00,'','转赠一张优惠券给你','2022-06-06 15:40:11','2022-06-06 15:40:11','A'),
+(7,1234,1,1,1233,'13560320801','','26','全场典藏卡券(测试)','71','全场免单优惠券',1,999.00,'','转赠一张优惠券给你','2022-06-22 10:01:14','2022-06-22 10:01:14','A'),
+(8,1235,1,1,1233,'13711105014','','5','2021十一活动','17','10月份优惠券',1,18.00,'','转赠一张优惠券给你','2022-06-22 10:01:25','2022-06-22 10:01:25','A'),
+(9,1,1,1,163,'18976679981','18976679980','6','十月份活动','14','优惠券10元',1,100.00,'','转赠一张优惠券给你','2022-06-28 15:22:41','2022-06-28 15:22:41','A'),
+(10,1322,1,1,1069,'17796656160','','5','2021十一活动','17','10月份优惠券',1,18.00,'','转赠一张优惠券给你','2022-07-14 09:35:37','2022-07-14 09:35:37','A'),
+(11,1359,1,1,1356,'18208252470','','5','2021十一活动','17','10月份优惠券',1,18.00,'','转赠一张优惠券给你','2022-07-22 18:39:17','2022-07-22 18:39:17','A'),
+(12,1385,1,1,1369,'15713899276','18695879188','31','test分组','94','test22272109',1,10.00,'','转赠一张优惠券给你','2022-07-29 16:54:15','2022-07-29 16:54:15','A'),
+(13,1386,1,1,1369,'15713899276','18695879188','31','test分组','94','test22272109',1,10.00,'','转赠一张优惠券给你','2022-07-29 17:04:24','2022-07-29 17:04:24','A'),
+(14,1392,1,1,1392,'15988426226','15988426226','35','你妹','95','你妹洗脚优惠100元抵250元',1,100.00,'','转赠一张优惠券给你','2022-07-30 18:00:13','2022-07-30 18:00:13','A'),
+(15,1496,1,1,1495,'15968205442','','5','2021十一活动','17','10月份优惠券',1,18.00,'','转赠一张优惠券给你','2022-08-20 00:18:24','2022-08-20 00:18:24','A'),
+(16,1592,1,1,1592,'15117012015','15117012015','12','26656','29','新年快乐',1,10.00,'','转赠一张优惠券给你','2022-09-13 21:21:16','2022-09-13 21:21:16','A'),
+(17,1650,1,1,1649,'18531161003','','12','26656','29','新年快乐',1,10.00,'','转赠一张优惠券给你','2022-09-26 08:23:22','2022-09-26 08:23:22','A'),
+(18,1980,1,1,1977,'18946222313','','5','2021十一活动','17','10月份优惠券',1,18.00,'','转赠一张优惠券给你','2022-11-20 17:31:21','2022-11-20 17:31:21','A'),
+(19,1981,1,1,1977,'13645684859','','5','2021十一活动','15','100元优惠券',1,20.00,'','转赠一张优惠券给你','2022-11-20 17:31:59','2022-11-20 17:31:59','A'),
+(20,1992,1,1,1991,'18616998528','','4','2021年中秋','11','10元无门槛电子券',1,10.00,'','转赠一张优惠券给你','2022-11-21 18:11:18','2022-11-21 18:11:18','A'),
+(21,2031,1,1,1508,'18667669897','18105765365','43','用于购买会员卡券','140','升级专用001',1,599.00,'','转赠一张优惠券给你','2022-11-25 18:22:52','2022-11-25 18:22:52','A'),
+(22,2100,1,1,2099,'14716981537','','4','2021年中秋','18','12月份优惠券',1,6.00,'','转赠一张优惠券给你','2022-12-06 19:24:32','2022-12-06 19:24:32','A'),
+(23,2228,1,1,163,'18988877767','18976679980','39','卡券测试1','139','店庆预存卡1',1,20000.00,'','转赠一张优惠券给你','2023-01-08 23:20:49','2023-01-08 23:20:49','A'),
+(24,2229,1,1,163,'18978878878','18976679980','39','卡券测试1','139','店庆预存卡1',1,20000.00,'','转赠一张优惠券给你','2023-01-08 23:21:12','2023-01-08 23:21:12','A'),
+(25,2230,1,1,163,'18977776678','18976679980','39','卡券测试1','139','店庆预存卡1',1,20000.00,'','转赠一张优惠券给你','2023-01-08 23:21:39','2023-01-08 23:21:39','A'),
+(26,2231,1,1,163,'18966643218','18976679980','39','卡券测试1','139','店庆预存卡1',1,20000.00,'','转赠一张优惠券给你','2023-01-08 23:28:34','2023-01-08 23:28:34','A'),
+(27,2232,1,1,163,'18976656656','18976679980','39','卡券测试1','139','店庆预存卡1',1,20000.00,'','转赠一张优惠券给你','2023-01-09 07:50:51','2023-01-09 07:50:51','A'),
+(28,163,1,1,163,'18976679980','18976679980','39','卡券测试1','139','店庆预存卡1',1,10000.00,'','转赠一张优惠券给你','2023-01-09 08:03:08','2023-01-09 08:03:08','A'),
+(29,2021,1,1,163,'18976679981','18976679980','39','卡券测试1','139','店庆预存卡1',1,10000.00,'','转赠一张优惠券给你','2023-01-09 08:03:30','2023-01-09 08:03:30','A'),
+(30,2021,1,1,163,'18976679981','18976679980','56','贷款手续费抵用券10','148','自制品礼品卡',1,10.00,'','转赠一张优惠券给你','2023-01-09 08:04:02','2023-01-09 08:04:02','A'),
+(31,2021,1,1,163,'18976679981','18976679980','39','卡券测试1','139','店庆预存卡1',1,20000.00,'','转赠一张优惠券给你','2023-01-09 14:30:55','2023-01-09 14:30:55','A'),
+(32,2376,1,1,2369,'15721593486','','57','2023年套餐一','153','20元优惠券',1,20.00,'','转赠一张优惠券给你','2023-02-03 14:50:39','2023-02-03 14:50:39','A'),
+(33,2408,1,1,2364,'17743256453','','60','早餐','163','前台卡券',1,200.00,'','转赠一张优惠券给你','2023-02-07 15:13:34','2023-02-07 15:13:34','A'),
+(34,2733,1,1,2733,'18333615432','18333615432','64','d卡券分组','180','储值卡',1,100.00,'','转赠一张优惠券给你','2023-03-07 10:58:12','2023-03-07 10:58:12','A'),
+(35,3375,1,1,975,'18921201520','','45','优惠券','210','满200送50',1,50.00,'','转赠一张优惠券给你','2023-04-23 11:16:08','2023-04-23 11:16:08','A'),
+(36,3586,1,1,3583,'18566798813','16620860215','71','优惠券','241','五一优惠券',1,10.00,'','转赠一张优惠券给你','2023-05-12 16:20:24','2023-05-12 16:20:24','A'),
+(37,3582,1,1,3583,'18566798813','16620860215','71','优惠券','241','五一优惠券',1,10.00,'','转赠一张优惠券给你','2023-05-12 16:23:38','2023-05-12 16:23:38','A'),
+(38,3627,1,1,3627,'17762624971','17762624971','71','优惠券','241','五一优惠券',1,10.00,'','转赠一张优惠券给你','2023-05-16 14:03:15','2023-05-16 14:03:15','A'),
+(39,3631,1,1,3627,'17608449215','17762624971','71','优惠券','241','五一优惠券',1,10.00,'','转赠一张优惠券给你','2023-05-16 14:26:45','2023-05-16 14:26:45','A'),
+(40,3646,1,1,3645,'13316396329','13620482612','45','优惠券','246','卡币',1,100.00,'','转赠一张优惠券给你','2023-05-17 09:59:18','2023-05-17 09:59:18','A'),
+(41,4010,1,1,3907,'13730420256','','45','优惠券','210','满200送50',1,50.00,'','转赠一张优惠券给你','2023-06-13 09:29:39','2023-06-13 09:29:39','A'),
+(42,3907,1,1,3907,'13730420256','13730420256','76','服务卡项','274','洗车券',1,10.00,'','转赠一张优惠券给你','2023-06-13 10:46:58','2023-06-13 10:46:58','A'),
+(43,4492,1,1,3721,'13122858538','','71','优惠券','314','积分优惠券',1,10.00,'','转赠一张优惠券给你','2023-07-11 20:18:34','2023-07-11 20:18:34','A'),
+(44,4493,1,1,3721,'17310014243','','71','优惠券','314','积分优惠券',1,10.00,'','转赠一张优惠券给你','2023-07-11 20:22:04','2023-07-11 20:22:04','A'),
+(45,4493,1,1,3721,'17310014243','','71','优惠券','314','积分优惠券',1,10.00,'','转赠一张优惠券给你','2023-07-11 20:27:51','2023-07-11 20:27:51','A'),
+(46,4510,1,1,4550,'18188889999','18112345678','91','游戏充值','321','穿越火线满100减50优惠券',1,50.00,'','转赠一张优惠券给你','2023-07-13 11:40:41','2023-07-13 11:40:41','A'),
+(47,4493,1,1,3721,'17310014243','','71','优惠券','314','积分优惠券',1,10.00,'','转赠一张优惠券给你','2023-07-13 17:01:49','2023-07-13 17:01:49','A'),
+(48,4567,1,1,4365,'15317665576','','71','优惠券','314','积分优惠券',1,10.00,'','转赠一张优惠券给你','2023-07-13 17:12:08','2023-07-13 17:12:08','A'),
+(49,4567,1,1,4365,'15317665576','','71','优惠券','314','积分优惠券',1,10.00,'','转赠一张优惠券给你','2023-07-13 17:38:50','2023-07-13 17:38:50','A'),
+(50,4493,1,1,3721,'17310014243','','71','优惠券','314','积分优惠券',1,10.00,'','转赠一张优惠券给你','2023-07-13 17:57:46','2023-07-13 17:57:46','A'),
+(51,4493,1,1,3721,'17310014243','','71','优惠券','314','积分优惠券',1,10.00,'','转赠一张优惠券给你','2023-07-13 18:34:45','2023-07-13 18:34:45','A'),
+(52,6000,1,1,6002,'18728796753','','57','2023年套餐一','153','20元优惠券',1,34.00,'','转赠一张优惠券给你','2023-07-24 19:28:55','2023-07-24 19:28:55','A'),
+(53,6000,1,1,6002,'18728796753','','57','2023年套餐一','153','20元优惠券',1,34.00,'','转赠一张优惠券给你','2023-07-24 19:29:50','2023-07-24 19:29:50','A'),
+(54,6038,1,1,6036,'18645122682','','57','2023年套餐一','153','20元优惠券',1,20.00,'','转赠一张优惠券给你','2023-07-25 10:16:37','2023-07-25 10:16:37','A');
+
+/*Table structure for table `mt_give_item` */
+
+DROP TABLE IF EXISTS `mt_give_item`;
+
+CREATE TABLE `mt_give_item` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `GIVE_ID` int NOT NULL COMMENT '转赠ID',
+ `USER_COUPON_ID` int NOT NULL COMMENT '用户电子券ID',
+ `CREATE_TIME` datetime NOT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime NOT NULL COMMENT '更新时间',
+ `STATUS` char(1) NOT NULL COMMENT '状态,A正常;D删除',
+ PRIMARY KEY (`ID`),
+ KEY `index_give_id` (`GIVE_ID`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='转赠明细表';
+
+/*Data for the table `mt_give_item` */
+
+insert into `mt_give_item`(`ID`,`GIVE_ID`,`USER_COUPON_ID`,`CREATE_TIME`,`UPDATE_TIME`,`STATUS`) values
+(1,1,613,'2022-02-11 13:43:47','2022-02-11 13:43:47','A'),
+(2,2,1658,'2022-03-06 20:19:18','2022-03-06 20:19:18','A'),
+(3,3,122298,'2022-04-13 19:46:41','2022-04-13 19:46:41','A'),
+(4,4,15,'2022-05-11 20:43:02','2022-05-11 20:43:02','A'),
+(5,5,44,'2022-05-11 21:28:41','2022-05-11 21:28:41','A'),
+(6,6,1798,'2022-06-06 15:40:11','2022-06-06 15:40:11','A'),
+(7,7,2404,'2022-06-22 10:01:14','2022-06-22 10:01:14','A'),
+(8,8,2405,'2022-06-22 10:01:25','2022-06-22 10:01:25','A'),
+(9,9,2621,'2022-06-28 15:22:41','2022-06-28 15:22:41','A'),
+(10,10,67,'2022-07-14 09:35:37','2022-07-14 09:35:37','A'),
+(11,11,23,'2022-07-22 18:39:17','2022-07-22 18:39:17','A'),
+(12,12,400,'2022-07-29 16:54:15','2022-07-29 16:54:15','A'),
+(13,13,399,'2022-07-29 17:04:24','2022-07-29 17:04:24','A'),
+(14,14,419,'2022-07-30 18:00:13','2022-07-30 18:00:13','A'),
+(15,15,30701,'2022-08-20 00:18:24','2022-08-20 00:18:24','A'),
+(16,16,211369,'2022-09-13 21:21:16','2022-09-13 21:21:16','A'),
+(17,17,211502,'2022-09-26 08:23:22','2022-09-26 08:23:22','A'),
+(18,18,19294,'2022-11-20 17:31:21','2022-11-20 17:31:21','A'),
+(19,19,19548,'2022-11-20 17:31:59','2022-11-20 17:31:59','A'),
+(20,20,19575,'2022-11-21 18:11:18','2022-11-21 18:11:18','A'),
+(21,21,20280,'2022-11-25 18:22:52','2022-11-25 18:22:52','A'),
+(22,22,29107,'2022-12-06 19:24:32','2022-12-06 19:24:32','A'),
+(23,23,31903,'2023-01-08 23:20:49','2023-01-08 23:20:49','A'),
+(24,24,31903,'2023-01-08 23:21:12','2023-01-08 23:21:12','A'),
+(25,25,31903,'2023-01-08 23:21:39','2023-01-08 23:21:39','A'),
+(26,26,31903,'2023-01-08 23:28:34','2023-01-08 23:28:34','A'),
+(27,27,31903,'2023-01-09 07:50:51','2023-01-09 07:50:51','A'),
+(28,28,31902,'2023-01-09 08:03:08','2023-01-09 08:03:08','A'),
+(29,29,31902,'2023-01-09 08:03:30','2023-01-09 08:03:30','A'),
+(30,30,31765,'2023-01-09 08:04:02','2023-01-09 08:04:02','A'),
+(31,31,26562,'2023-01-09 14:30:55','2023-01-09 14:30:55','A'),
+(32,32,42627,'2023-02-03 14:50:39','2023-02-03 14:50:39','A'),
+(33,33,42858,'2023-02-07 15:13:34','2023-02-07 15:13:34','A'),
+(34,34,600134,'2023-03-07 10:58:12','2023-03-07 10:58:12','A'),
+(35,35,7000,'2023-04-23 11:16:08','2023-04-23 11:16:08','A'),
+(36,36,674,'2023-05-12 16:20:24','2023-05-12 16:20:24','A'),
+(37,37,670,'2023-05-12 16:23:38','2023-05-12 16:23:38','A'),
+(38,38,854,'2023-05-16 14:03:15','2023-05-16 14:03:15','A'),
+(39,39,854,'2023-05-16 14:26:45','2023-05-16 14:26:45','A'),
+(40,40,870,'2023-05-17 09:59:18','2023-05-17 09:59:18','A'),
+(41,41,1166,'2023-06-13 09:29:39','2023-06-13 09:29:39','A'),
+(42,42,1198,'2023-06-13 10:46:58','2023-06-13 10:46:58','A'),
+(43,43,1520,'2023-07-11 20:18:34','2023-07-11 20:18:34','A'),
+(44,44,1521,'2023-07-11 20:22:04','2023-07-11 20:22:04','A'),
+(45,45,1522,'2023-07-11 20:27:51','2023-07-11 20:27:51','A'),
+(46,46,1555,'2023-07-13 11:40:41','2023-07-13 11:40:41','A'),
+(47,47,1558,'2023-07-13 17:01:49','2023-07-13 17:01:49','A'),
+(48,48,1560,'2023-07-13 17:12:08','2023-07-13 17:12:08','A'),
+(49,49,1561,'2023-07-13 17:38:50','2023-07-13 17:38:50','A'),
+(50,50,1559,'2023-07-13 17:57:46','2023-07-13 17:57:46','A'),
+(51,51,1570,'2023-07-13 18:34:45','2023-07-13 18:34:45','A'),
+(52,52,5114,'2023-07-24 19:28:55','2023-07-24 19:28:55','A'),
+(53,53,5128,'2023-07-24 19:29:50','2023-07-24 19:29:50','A'),
+(54,54,5152,'2023-07-25 10:16:37','2023-07-25 10:16:37','A');
+
+/*Table structure for table `mt_goods` */
+
+DROP TABLE IF EXISTS `mt_goods`;
+
+CREATE TABLE `mt_goods` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `TYPE` varchar(30) DEFAULT 'product' COMMENT '商品类别',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '所属商户ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '所属店铺ID',
+ `NAME` varchar(100) DEFAULT '' COMMENT '商品名称',
+ `CATE_ID` int DEFAULT '0' COMMENT '分类ID',
+ `GOODS_NO` varchar(100) DEFAULT '' COMMENT '商品编码',
+ `IS_SINGLE_SPEC` char(1) NOT NULL DEFAULT 'Y' COMMENT '是否单规格',
+ `LOGO` varchar(200) DEFAULT '' COMMENT '主图地址',
+ `IMAGES` varchar(1000) DEFAULT '' COMMENT '图片地址',
+ `PRICE` decimal(10,2) unsigned DEFAULT '0.00' COMMENT '价格',
+ `LINE_PRICE` decimal(10,2) unsigned DEFAULT '0.00' COMMENT '划线价格',
+ `STOCK` int unsigned DEFAULT '0' COMMENT '库存',
+ `WEIGHT` decimal(10,2) DEFAULT '0.00' COMMENT '重量',
+ `COUPON_IDS` varchar(500) DEFAULT '' COMMENT '关联卡券ID',
+ `SERVICE_TIME` int DEFAULT '0' COMMENT '服务时长,单位:分钟',
+ `INIT_SALE` int DEFAULT '0' COMMENT '初始销量',
+ `SALE_POINT` varchar(100) DEFAULT '' COMMENT '商品卖点',
+ `CAN_USE_POINT` char(1) DEFAULT 'N' COMMENT '可否使用积分抵扣',
+ `IS_MEMBER_DISCOUNT` char(1) DEFAULT 'Y' COMMENT '会员是否有折扣',
+ `SORT` int DEFAULT '0' COMMENT '排序',
+ `DESCRIPTION` text COMMENT '商品描述',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `OPERATOR` varchar(30) DEFAULT NULL COMMENT '最后操作人',
+ `STATUS` char(1) DEFAULT 'A' COMMENT 'A:正常;D:删除',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB AUTO_INCREMENT=386 DEFAULT CHARSET=utf8 COMMENT='商品表';
+
+/*Data for the table `mt_goods` */
+
+insert into `mt_goods`(`ID`,`TYPE`,`MERCHANT_ID`,`STORE_ID`,`NAME`,`CATE_ID`,`GOODS_NO`,`IS_SINGLE_SPEC`,`LOGO`,`IMAGES`,`PRICE`,`LINE_PRICE`,`STOCK`,`WEIGHT`,`COUPON_IDS`,`SERVICE_TIME`,`INIT_SALE`,`SALE_POINT`,`CAN_USE_POINT`,`IS_MEMBER_DISCOUNT`,`SORT`,`DESCRIPTION`,`CREATE_TIME`,`UPDATE_TIME`,`OPERATOR`,`STATUS`) values
+(1,'product',1,0,'韩式防水围裙',1,'9983242340','N','/static/uploadImages/20220110/4c90921a7fc34c97b0f62cebf314d2bb.jpg','[\"/static/uploadImages/20220110/4c90921a7fc34c97b0f62cebf314d2bb.jpg\",\"/static/uploadImages/20220110/9b64b3d65fa04296b62de186899f24ea.jpg\",\"/static/uploadImages/20220110/ff4809f7a17d4142ace9bc287aab105a.jpg\"]',88.00,99.00,90013,1.00,'',0,747,'超级防水','Y','Y',1,'1234444
','2021-10-13 13:56:04','2023-07-31 19:51:21','fuint','A'),
+(2,'product',1,0,'小清新水果刀三件套',4,'6975486820418','Y','/static/uploadImages/20220110/6b67b70f35734ff28a03aa3d82ac96a0.jpg','[\"/static/uploadImages/20220110/6b67b70f35734ff28a03aa3d82ac96a0.jpg\"]',0.01,20.00,1946,2.00,'',0,33,'小清新','Y','N',1,'123 ','2021-10-13 14:19:45','2023-07-31 20:01:44','fuint','A'),
+(3,'product',1,0,'可爱旅行大号牙刷杯两个装',3,'92342342342','N','/static/uploadImages/20220110/56e306c812f240f89c0ed96ab8f94ad0.jpg','[\"/static/uploadImages/20220110/56e306c812f240f89c0ed96ab8f94ad0.jpg\",\"/static/uploadImages/20220110/56e306c812f240f89c0ed96ab8f94ad0.jpg\",\"/static/uploadImages/20220110/d39f84568b9746f89d9f6a368b8067c4.jpg\"]',99.00,120.00,6000,1.00,'',0,1532,'超级实惠','Y','Y',1,'
','2021-10-14 01:08:45','2023-09-22 13:38:42','fuint','A'),
+(4,'product',1,0,'筷子便携餐盒3件套',1,'6914068026176','N','/static/uploadImages/20220110/31cbf7ad0ef442a4b10dcefc24db0662.jpg','[\"/static/uploadImages/20220110/31cbf7ad0ef442a4b10dcefc24db0662.jpg\"]',80.00,99.00,4010,1.00,'',0,1325,'一体成型','Y','N',1,'测试商品
','2021-10-14 05:46:23','2023-07-28 15:13:50','fuint','A'),
+(5,'product',1,0,'简壳 一拖三可收纳伸缩充电线',2,'6922577729501','N','/static/uploadImages/20220110/856dbc96197e4782b4febb7a6e671bcb.jpg','[\"/static/uploadImages/20220110/856dbc96197e4782b4febb7a6e671bcb.jpg\"]',0.10,100.00,3877,0.00,'',0,1168,'可伸缩','Y','Y',1,'
','2021-10-14 05:47:31','2023-07-24 19:00:45','fuint','A'),
+(6,'product',1,0,'抽绳垃圾袋16只*4卷',1,'6975486820418','Y','/static/uploadImages/20220110/6083071182cd48afa6c2b9e23f181832.jpg','[\"/static/uploadImages/20220110/6083071182cd48afa6c2b9e23f181832.jpg\",\"/static/uploadImages/20220110/ee5c67ed338442fc90e5c647ccbfd381.jpg\"]',18.00,20.00,109528,1.00,'',11,4209,'厨房必备小帮手','Y','Y',0,'
','2021-10-14 05:48:43','2023-07-31 20:00:49','fuint','A');
+
+/*Table structure for table `mt_goods_cate` */
+
+DROP TABLE IF EXISTS `mt_goods_cate`;
+
+CREATE TABLE `mt_goods_cate` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '所属商户',
+ `STORE_ID` int DEFAULT '0' COMMENT '所属店铺',
+ `NAME` varchar(100) DEFAULT '' COMMENT '分类名称',
+ `LOGO` varchar(200) DEFAULT '' COMMENT 'LOGO地址',
+ `DESCRIPTION` text COMMENT '分类描述',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `OPERATOR` varchar(30) DEFAULT NULL COMMENT '最后操作人',
+ `SORT` int DEFAULT '0' COMMENT '排序',
+ `STATUS` char(1) DEFAULT 'A' COMMENT 'A:正常;D:删除',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB AUTO_INCREMENT=189 DEFAULT CHARSET=utf8 COMMENT='商品分类表';
+
+/*Data for the table `mt_goods_cate` */
+
+insert into `mt_goods_cate`(`ID`,`MERCHANT_ID`,`STORE_ID`,`NAME`,`LOGO`,`DESCRIPTION`,`CREATE_TIME`,`UPDATE_TIME`,`OPERATOR`,`SORT`,`STATUS`) values
+(1,1,0,'生活用品','/static/defaultImage/life.png','1234','2021-10-09 06:27:11','2023-07-24 23:30:10','fuint',1,'A'),
+(2,1,0,'办公用品','/static/defaultImage/office.png','','2021-10-09 06:27:11','2023-07-21 18:47:52','fuint',3,'A'),
+(3,1,0,'好物推荐','/static/defaultImage/love.png','好物推荐','2021-10-09 06:27:11','2023-07-24 19:13:13','fuint',1,'A'),
+(4,1,0,'打折热销','/static/defaultImage/hot.png','低价甩卖','2021-10-14 02:20:00','2023-07-27 17:04:42','fuint',3,'A'),
+(187,2,0,'美妆','/static/uploadImages/20230918/7567dc29707c41dca8381cc072944d2f.PNG','123','2023-09-18 17:53:49','2023-09-18 17:53:49','anan',0,'A'),
+(188,2,0,'办公','/static/uploadImages/20230918/ebfab5816a374bec97fb223b51cf63fe.png','123','2023-09-18 17:54:37','2023-09-18 17:54:37','anan',0,'A');
+
+/*Table structure for table `mt_goods_sku` */
+
+DROP TABLE IF EXISTS `mt_goods_sku`;
+
+CREATE TABLE `mt_goods_sku` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `SKU_NO` varchar(50) DEFAULT '' COMMENT 'sku编码',
+ `LOGO` varchar(255) DEFAULT '' COMMENT '图片',
+ `GOODS_ID` int NOT NULL DEFAULT '0' COMMENT '商品ID',
+ `SPEC_IDS` varchar(100) NOT NULL DEFAULT '' COMMENT '规格ID',
+ `STOCK` int NOT NULL DEFAULT '0' COMMENT '库存',
+ `PRICE` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '价格',
+ `LINE_PRICE` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '划线价格',
+ `WEIGHT` decimal(10,2) DEFAULT '0.00' COMMENT '重量',
+ `STATUS` char(1) NOT NULL DEFAULT 'A' COMMENT '状态',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB AUTO_INCREMENT=745 DEFAULT CHARSET=utf8 COMMENT='商品SKU表';
+
+/*Data for the table `mt_goods_sku` */
+
+insert into `mt_goods_sku`(`ID`,`SKU_NO`,`LOGO`,`GOODS_ID`,`SPEC_IDS`,`STOCK`,`PRICE`,`LINE_PRICE`,`WEIGHT`,`STATUS`) values
+(142,'','',27,'46',0,0.00,0.00,0.00,'A'),
+(143,'','',27,'47',0,0.00,0.00,0.00,'A'),
+(145,'','',37,'56',51,200.00,300.00,1.20,'A'),
+(189,'','',40,'66-69',1,1.00,1.00,1.00,'A'),
+(190,'','',40,'66-70',1,1.00,1.00,1.00,'A'),
+(191,'','',40,'67-69',1,1.00,1.00,1.00,'A'),
+(192,'','',40,'67-70',1,1.00,1.00,1.00,'A'),
+(193,'','',40,'68-69',1,1.00,1.00,1.00,'A'),
+(194,'','',40,'68-70',1,1.00,1.00,1.00,'A'),
+(261,'8888880','',45,'86',88,10.00,20.00,2.00,'A'),
+(262,'8888881','',45,'87',90,10.00,20.00,2.00,'A'),
+(263,'8888882','',45,'88',89,10.00,20.00,2.00,'A'),
+(264,'8888883','',45,'89',90,10.00,20.00,2.00,'A'),
+(265,'34234','',48,'90',220,21.00,112.00,1.00,'A'),
+(266,'234230','',51,'92',100,10.00,12.00,1.00,'A'),
+(267,'234231','',51,'93',98,10.00,12.00,1.00,'A'),
+(269,'34235','',48,'95',887,20.00,120.00,1.00,'A'),
+(315,'2222','/uploads/20230228/656a1aef1e8c4a8e8e80c5b817e15255.jpg',79,'138-142',999,24.00,24.00,2.00,'A'),
+(317,'4444','',79,'139-142',999,24.00,24.00,2.00,'A'),
+(339,'111111','/uploads/20230307/55126b64546945f4a6393ad5259cfc03.jpg',86,'153',100,0.01,99.00,0.00,'A'),
+(340,'222222','/uploads/20230307/67d54c99787b4114affd86c5248d1431.jpg',86,'157',100,0.01,99.00,0.00,'A'),
+(341,'333333','/uploads/20230307/72cc5a1c16ee4c21a8ea35612741f87e.jpg',86,'158',98,0.01,99.00,0.00,'A'),
+(386,'','',91,'185',0,0.00,0.00,0.00,'A'),
+(387,'SKU12434','/uploads/20230314/7333fe6a66884de59e560278c2de609b.jpg',95,'191-193',99,10.00,15.00,1.00,'A'),
+(388,'SKU12432','/uploads/20230314/0d4f3ea2741e495f82a23f8443b54e18.jpg',95,'191-194',98,10.00,15.00,1.00,'A'),
+(389,'SKU12442','/uploads/20230314/e87014e2f81c466398e35a01472cedb4.jpg',95,'192-193',100,19.00,25.00,1.00,'A'),
+(390,'SKU12423','/uploads/20230314/4aab2fc389a54de6b66c19b69eff8ebc.jpg',95,'192-194',98,19.00,25.00,1.00,'A'),
+(391,'瓶','',96,'195',4,3.00,3.00,500.00,'A'),
+(424,'1230','',119,'220',100,1.00,0.00,1.00,'A'),
+(425,'1231','',119,'223',100,1.00,0.00,1.00,'A'),
+(426,'1232','',119,'224',100,1.00,0.00,1.00,'A'),
+(427,'1233','',119,'225',100,1.00,0.00,1.00,'A'),
+(515,'34423423420','',5,'214-215',898,99.00,100.00,1.00,'A'),
+(516,'34423423421','',5,'214-217',931,99.00,100.00,1.00,'A'),
+(517,'34423423422','',5,'216-215',954,99.00,100.00,1.00,'A'),
+(518,'34423423423','',5,'216-217',838,99.00,100.00,1.00,'A'),
+(519,'','',140,'262',0,0.00,0.00,0.00,'A'),
+(547,'79232344230','',165,'274',100,3.99,5.00,0.25,'A'),
+(548,'79232344231','',165,'275',100,6.00,7.00,0.25,'A'),
+(555,'','',169,'282-286',9,189.00,289.00,0.00,'A'),
+(556,'','',169,'282-287',10,189.00,289.00,0.00,'A'),
+(557,'','',169,'282-288',10,189.00,289.00,0.00,'A'),
+(558,'','',169,'282-289',10,189.00,289.00,0.00,'A'),
+(559,'','',169,'282-290',10,189.00,289.00,0.00,'A'),
+(560,'','',169,'283-286',10,189.00,289.00,0.00,'A'),
+(561,'','',169,'283-287',9,189.00,289.00,0.00,'A'),
+(562,'','',169,'283-288',9,189.00,289.00,0.00,'A'),
+(563,'','',169,'283-289',10,189.00,289.00,0.00,'A'),
+(564,'','',169,'283-290',10,189.00,289.00,0.00,'A'),
+(565,'','',169,'285-286',10,189.00,289.00,0.00,'A'),
+(566,'','',169,'285-287',10,189.00,289.00,0.00,'A'),
+(567,'','',169,'285-288',8,189.00,289.00,0.00,'A'),
+(568,'','',169,'285-289',9,189.00,289.00,0.00,'A'),
+(569,'','',169,'285-290',6,189.00,289.00,0.00,'A'),
+(583,'4353452','/uploads/20230609/92a39796268246c7865ff10d560a9d10.gif',176,'296',7,56.00,80.00,0.00,'A'),
+(584,'45345','',177,'297',88,677.00,5888.00,0.00,'A'),
+(585,'45345345','',177,'299',75,888.00,8888.00,0.00,'A'),
+(604,'','',169,'309-286',0,0.00,0.00,0.00,'A'),
+(605,'','',169,'309-287',0,0.00,0.00,0.00,'A'),
+(606,'','',169,'309-288',0,0.00,0.00,0.00,'A'),
+(607,'','',169,'309-289',0,0.00,0.00,0.00,'A'),
+(608,'','',169,'309-290',0,0.00,0.00,0.00,'A'),
+(609,'','',183,'310-311',10,99.00,0.00,0.00,'A'),
+(610,'','',183,'310-312',10,99.00,0.00,0.00,'A'),
+(611,'','',183,'310-313',10,99.00,0.00,0.00,'A'),
+(612,'','',183,'310-314',10,99.00,0.00,0.00,'A'),
+(613,'','',183,'310-315',10,99.00,0.00,0.00,'A'),
+(614,'','',183,'310-316',10,99.00,0.00,0.00,'A'),
+(615,'','',183,'317-311',10,99.00,0.00,0.00,'A'),
+(616,'','',183,'317-312',10,99.00,0.00,0.00,'A'),
+(617,'','',183,'317-313',10,99.00,0.00,0.00,'A'),
+(618,'','',183,'317-314',10,99.00,0.00,0.00,'A'),
+(619,'','',183,'317-315',10,99.00,0.00,0.00,'A'),
+(620,'','',183,'317-316',10,99.00,0.00,0.00,'A'),
+(621,'','',183,'318-311',10,99.00,0.00,0.00,'A'),
+(622,'','',183,'318-312',10,99.00,0.00,0.00,'A'),
+(623,'','',183,'318-313',10,99.00,0.00,0.00,'A'),
+(624,'','',183,'318-314',10,99.00,0.00,0.00,'A'),
+(625,'','',183,'318-315',10,99.00,0.00,0.00,'A'),
+(626,'','',183,'318-316',9,99.00,0.00,0.00,'A'),
+(627,'1','',187,'324',20,22.00,25.00,0.50,'A'),
+(628,'2','',187,'325',20,40.00,50.00,1.00,'A'),
+(629,'1','',185,'327',0,120.00,150.00,5.00,'A'),
+(630,'2','',185,'328',1,150.00,180.00,5.00,'A'),
+(631,'3','',185,'329',0,200.00,250.00,5.00,'A'),
+(644,'','/uploads/20230628/0c17bcee89dc4838be59aba2db990e22.png',197,'339',997,68.00,0.00,0.00,'A'),
+(659,'180521342436380','',207,'345-351-353',1,1.00,1.00,1.00,'A'),
+(660,'180521342436381','',207,'348-351-353',1,1.00,1.00,1.00,'A'),
+(661,'179699761475660','',232,'355-356',10,20.00,30.00,1.00,'A'),
+(662,'179699761475661','',232,'355-357',10,30.00,60.00,1.00,'A'),
+(663,'179699761475662','',232,'358-356',1,20.00,30.00,1.00,'A'),
+(664,'179699761475663','',232,'358-357',2,30.00,60.00,1.00,'A'),
+(669,'148503337738370','',305,'372-374',10,99.00,299.00,0.00,'A'),
+(670,'148503337738371','',305,'372-375',10,99.00,299.00,0.00,'A'),
+(671,'148503337738372','',305,'373-374',10,99.00,299.00,0.00,'A'),
+(672,'148503337738373','',305,'373-375',10,99.00,299.00,0.00,'A'),
+(673,'','',361,'388',0,0.00,0.00,0.00,'A'),
+(674,'','',361,'389',0,0.00,0.00,0.00,'A'),
+(675,'','',361,'390',0,0.00,0.00,0.00,'A'),
+(676,'','',361,'391',0,0.00,0.00,0.00,'A'),
+(677,'','',361,'393',0,0.00,0.00,0.00,'A'),
+(689,'164348379384740','',382,'413-416-419',990,18.00,0.00,0.00,'A'),
+(690,'164348379384741','',382,'413-417-419',990,18.00,0.00,0.00,'A'),
+(691,'164348379384742','',382,'413-418-419',990,18.00,0.00,0.00,'A'),
+(692,'164348379384743','',382,'414-416-419',990,18.00,0.00,0.00,'A'),
+(693,'164348379384744','',382,'414-417-419',990,18.00,0.00,0.00,'A'),
+(694,'164348379384745','',382,'414-418-419',990,18.00,0.00,0.00,'A'),
+(695,'164348379384746','',382,'415-416-419',990,18.00,0.00,0.00,'A'),
+(696,'164348379384747','',382,'415-417-419',990,18.00,0.00,0.00,'A'),
+(697,'164348379384748','',382,'415-418-419',990,18.00,0.00,0.00,'A'),
+(710,'125946837840450','',1,'107-180',10004,88.00,99.00,1.00,'A'),
+(711,'125946837840451','',1,'107-331',10002,88.00,99.00,1.00,'A'),
+(712,'125946837840452','',1,'107-421',10001,88.00,99.00,1.00,'A'),
+(716,'134518978667720','',4,'402-404',1000,80.00,99.00,1.00,'A'),
+(717,'134518978667721','',4,'402-405',1000,80.00,99.00,1.00,'A'),
+(718,'134518978667722','',4,'403-404',997,80.00,99.00,1.00,'A'),
+(719,'134518978667723','',4,'403-405',995,80.00,99.00,1.00,'A'),
+(732,'155430306154340','',384,'430',1,1.00,1.00,1.00,'A'),
+(733,'125946837840453','',1,'431-180',10000,88.00,99.00,1.00,'A'),
+(734,'125946837840454','',1,'431-331',9998,88.00,99.00,1.00,'A'),
+(735,'125946837840455','',1,'431-421',10000,88.00,99.00,1.00,'A'),
+(736,'125946837840456','',1,'432-180',10000,88.00,99.00,1.00,'A'),
+(737,'125946837840457','',1,'432-331',9999,88.00,99.00,1.00,'A'),
+(738,'125946837840458','',1,'432-421',9998,88.00,99.00,1.00,'A'),
+(739,'197171320996910','',3,'6-74-401',1000,99.00,120.00,1.00,'A'),
+(740,'197171320996911','',3,'6-75-401',1000,99.00,120.00,1.00,'A'),
+(741,'197171320996912','',3,'6-429-401',1000,99.00,120.00,1.00,'A'),
+(742,'197171320996913','',3,'7-74-401',1000,99.00,120.00,1.00,'A'),
+(743,'197171320996914','',3,'7-75-401',1000,99.00,120.00,1.00,'A'),
+(744,'197171320996915','',3,'7-429-401',1000,99.00,120.00,1.00,'A');
+
+/*Table structure for table `mt_goods_spec` */
+
+DROP TABLE IF EXISTS `mt_goods_spec`;
+
+CREATE TABLE `mt_goods_spec` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `GOODS_ID` int NOT NULL DEFAULT '0' COMMENT '商品ID',
+ `NAME` varchar(100) NOT NULL DEFAULT '' COMMENT '规格名称',
+ `VALUE` varchar(100) NOT NULL DEFAULT '' COMMENT '规格值',
+ `STATUS` char(1) DEFAULT 'A' COMMENT '状态',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB AUTO_INCREMENT=433 DEFAULT CHARSET=utf8 COMMENT='规格表';
+
+/*Data for the table `mt_goods_spec` */
+
+insert into `mt_goods_spec`(`ID`,`GOODS_ID`,`NAME`,`VALUE`,`STATUS`) values
+(1,6,'厚度','正常','D'),
+(2,6,'厚度','加厚','D'),
+(3,6,'糖分','黑色','D'),
+(4,6,'糖分','黄色','D'),
+(5,6,'糖分','白色','D'),
+(6,3,'材质','304不锈钢','A'),
+(7,3,'材质','塑料','A'),
+(8,6,'尺码','m','D'),
+(9,6,'尺码','l','D'),
+(10,6,'口味','1','D'),
+(11,6,'口味','2','D'),
+(12,6,'口味','3','D'),
+(13,2,'m','m','D'),
+(14,6,'厚度','超薄','D'),
+(15,16,'风味','孜然','D'),
+(16,16,'特色','炭火','D'),
+(17,16,'风味','秘制','D'),
+(18,16,'特色','木炭','D'),
+(19,16,'特色','风味小吃','D'),
+(20,6,'大小','啥啥啥','D'),
+(21,6,'大小','L','D'),
+(22,24,'500ML','7','D'),
+(23,24,'700ML','10','D'),
+(24,24,'小杯','500ML','A'),
+(25,24,'大杯','700ML','D'),
+(26,24,'大杯','700ML','D'),
+(27,24,'小杯','122','D'),
+(28,24,'小杯','任天野','D'),
+(29,24,'小杯','700ML','A'),
+(30,6,'大小','12','D'),
+(31,6,'2','3','D'),
+(32,6,'1','','D'),
+(33,6,'大小','M','D'),
+(34,6,'大小','L','D'),
+(35,11,'ddd','rr','A'),
+(36,11,'gggg','ttt','A'),
+(37,11,'ddd','yyu','A'),
+(38,11,'gggg','==999','A'),
+(39,12,'1','1,2','A'),
+(40,16,'年份','82年','A'),
+(41,16,'年份','90年','A'),
+(42,16,'年份','00年','A'),
+(43,6,'尺码','大','D'),
+(44,6,'尺码','小','D'),
+(45,2,'7','','D'),
+(46,27,'颜色','红色','A'),
+(47,27,'颜色','白色','A'),
+(48,2,'大小','5','D'),
+(49,2,'品牌','6','D'),
+(50,2,'大小','IIS','D'),
+(51,2,'品牌','8','D'),
+(52,6,'xxx','','D'),
+(53,6,'糖分','绿色','D'),
+(54,37,'test1','12','D'),
+(55,37,'test2','13','D'),
+(56,37,'test1','123','A'),
+(57,38,'颜色','黑色','A'),
+(58,38,'颜色','蓝色','A'),
+(59,38,'颜色','绿色','D'),
+(60,38,'大小','大号','A'),
+(61,38,'大小','小号','A'),
+(62,38,'颜色','绿色','D'),
+(63,4,'颜色','红色','D'),
+(64,6,'重量','10KG','D'),
+(65,6,'重量','10g','D'),
+(66,40,'时长','两小时','A'),
+(67,40,'时长','三小时','A'),
+(68,40,'时长','四小时','A'),
+(69,40,'面积','80平米','A'),
+(70,40,'面积','100平米','A'),
+(71,41,'11','1','A'),
+(72,41,'11','11','A'),
+(73,41,'11','111','A'),
+(74,3,'颜色','粉红色','A'),
+(75,3,'颜色','黑色','A'),
+(76,6,'jj','','D'),
+(77,6,'重量','nihao','D'),
+(78,6,'糖分','红色','D'),
+(79,6,'糖分','紫色','D'),
+(80,6,'nih','hth','D'),
+(81,2,'颜色','1111','D'),
+(82,6,'糖分','蓝色','D'),
+(83,6,'大小','XL','D'),
+(84,6,'呃呃','','D'),
+(86,45,'容量','300W','A'),
+(87,45,'容量','300W','A'),
+(88,45,'容量','300','A'),
+(89,45,'容量','300','A'),
+(90,48,'颜色','红色','A'),
+(91,48,'1','','D'),
+(92,51,'颜色','白色','A'),
+(93,51,'颜色','黑色','A'),
+(94,51,'颜色','绿色','D'),
+(95,48,'颜色','黑色','A'),
+(96,52,'eee','12','D'),
+(97,52,'eee','222','D'),
+(98,52,'dfsfsa','33','A'),
+(99,52,'dfsfsa','22','A'),
+(100,53,'ddd','','D'),
+(101,53,'天泰','营业','A'),
+(102,52,'eee','22','D'),
+(103,1,'123','123','D'),
+(104,1,'123123','','D'),
+(105,1,'123','qwe123','D'),
+(106,1,'123','qwe123','D'),
+(107,1,'尺码','39','A'),
+(108,1,'尺码','39','D'),
+(109,1,'尺码','40','D'),
+(110,6,'糖分','d','D'),
+(111,5,'abg','1','D'),
+(112,5,'abg','1234','D'),
+(113,6,'款式','长','D'),
+(114,6,'款式','A','D'),
+(115,6,'款式','宽','D'),
+(116,65,'套房','套一','A'),
+(117,69,'小码','S','A'),
+(118,69,'小码','d','A'),
+(119,4,'颜色','蓝色','D'),
+(120,4,'颜色','蓝色','D'),
+(121,2,'大小','L','D'),
+(122,2,'品牌','10','D'),
+(123,4,'颜色','白色','D'),
+(124,4,'颜色','黑色','D'),
+(125,4,'颜色','黑色','D'),
+(126,6,'test','1','D'),
+(127,76,'颜色','黄色','A'),
+(128,76,'颜色','黄','D'),
+(129,76,'尺码','L','A'),
+(130,76,'颜色','1','D'),
+(131,76,'颜色','蓝色','A'),
+(132,76,'尺码','M','A'),
+(133,6,'款式','高','D'),
+(134,6,'款式','宽','D'),
+(135,6,'款式','宽','D'),
+(136,79,'颜色','大小','D'),
+(137,79,'颜色','规格','D'),
+(138,79,'颜色','红色','A'),
+(139,79,'颜色','绿色','A'),
+(140,79,'大小','黄色','D'),
+(141,79,'大小','500ml','D'),
+(142,79,'大小','1L','A'),
+(143,6,'款式','宽','D'),
+(144,6,'款式','宽','D'),
+(145,6,'款式','宽','D'),
+(146,6,'款式','11','D'),
+(147,81,'caoi','1','A'),
+(148,81,'caoi','1','A'),
+(149,81,'caoi','2','A'),
+(150,81,'iphone','64g','A'),
+(151,81,'iphone','128g','A'),
+(152,81,'iphone','256g','D'),
+(153,86,'颜色','红','A'),
+(154,86,'颜色','黄色','D'),
+(155,86,'颜色','红色','D'),
+(156,86,'颜色','绿色','D'),
+(157,86,'颜色','黄','A'),
+(158,86,'颜色','绿','A'),
+(159,90,'33','33','A'),
+(160,90,'3','','A'),
+(161,90,'4','5','A'),
+(162,91,'华为','1号','D'),
+(163,91,'hw','01','D'),
+(164,91,'xm','01','A'),
+(165,91,'xm','02','A'),
+(166,91,'xm','03','A'),
+(167,91,'hw','02','A'),
+(168,91,'hw','03','A'),
+(169,91,'xm','01','D'),
+(170,91,'xm','02','D'),
+(171,91,'xm','03','D'),
+(172,91,'hw','01','D'),
+(173,91,'xm','01','D'),
+(174,91,'hw','02','D'),
+(175,91,'xm','02','D'),
+(176,91,'hw','03','D'),
+(177,91,'xm','03','D'),
+(178,91,'xm','04','D'),
+(179,91,'xm','04','D'),
+(180,1,'颜色','黑色','A'),
+(181,1,'颜色','蓝色','D'),
+(182,1,'颜色','黄色','D'),
+(183,1,'卡通图','米老鼠','D'),
+(184,1,'卡通图','唐老鸭','D'),
+(185,91,'原味','','A'),
+(186,91,'味道','原味','A'),
+(187,91,'味道','酸辣','A'),
+(188,93,'打包','小包','A'),
+(189,93,'打包','的','A'),
+(190,95,'数量','口味','D'),
+(191,95,'数量','一包','A'),
+(192,95,'数量','两包','A'),
+(193,95,'口味','奶香味','A'),
+(194,95,'口味','草莓味','A'),
+(195,96,'口味','普通','A'),
+(196,110,'lll','iiii','A'),
+(197,110,'lll','iiii','A'),
+(198,110,'9999','llll','A'),
+(199,110,'9999','9999','A'),
+(200,110,'8888','99999','A'),
+(201,110,'8888','7777','A'),
+(202,1,'尺码','43','D'),
+(203,6,'111','11','D'),
+(204,6,'糖分','1','D'),
+(205,6,'糖分','2','D'),
+(206,6,'糖分','3','D'),
+(207,6,'糖分','4','D'),
+(208,6,'糖分','5','D'),
+(209,6,'糖分','6','D'),
+(210,6,'糖分','7','D'),
+(211,6,'糖分','8','D'),
+(212,6,'糖分','9','D'),
+(213,6,'糖分','10','D'),
+(214,5,'A','A-1','A'),
+(215,5,'B','B-1','A'),
+(216,5,'A','A-2','A'),
+(217,5,'B','B-2','A'),
+(218,6,'款式','13','D'),
+(219,119,'代杀','1','D'),
+(220,119,'可选备注','','A'),
+(221,119,'代杀','代杀','A'),
+(222,119,'代杀','不杀','A'),
+(223,119,'可选备注','杀(清洗)','A'),
+(224,119,'可选备注','杀(不清洗)','A'),
+(225,119,'可选备注','不杀','A'),
+(226,122,'大小','小','A'),
+(227,122,'大小','中','A'),
+(228,122,'大小','大','A'),
+(229,122,'甜度','少','A'),
+(230,122,'甜度','多','A'),
+(231,122,'甜度','超多','A'),
+(232,122,'abc','1','A'),
+(233,122,'abc','23','A'),
+(234,122,'abc','33','D'),
+(235,131,'小轿车','','A'),
+(236,131,'法拉利','','A'),
+(237,131,'兰博基尼','','A'),
+(238,122,'234','','A'),
+(239,5,'qwe','','D'),
+(240,5,'B','w','D'),
+(241,5,'B','3','D'),
+(242,6,'长度','1','D'),
+(243,6,'长度','2','D'),
+(244,6,'长度','0','D'),
+(245,6,'款式','西米','D'),
+(246,6,'款式','红豆','D'),
+(247,135,'尺寸','大杯','A'),
+(248,135,'尺寸','中杯','A'),
+(249,135,'尺寸','小杯','A'),
+(250,135,'温度','热','A'),
+(251,135,'温度','常温','A'),
+(252,135,'温度','冰','A'),
+(253,135,'颜色','白色','A'),
+(254,135,'颜色','白色','D'),
+(255,135,'颜色','黑色','A'),
+(258,6,'nihoa','','D'),
+(260,2,'大小','M','D'),
+(261,2,'大小','XL','D'),
+(262,140,'222','333','A'),
+(263,141,'123','345','D'),
+(264,141,'小','1','D'),
+(265,141,'小','2','D'),
+(266,3,'颜色','白色','D'),
+(267,6,'大小','s','D'),
+(268,6,'大小','XXL','D'),
+(269,6,'长度','3','D'),
+(270,6,'长度','ww','D'),
+(271,6,'宽度','1','D'),
+(272,1,'卡通图','唐老鸭','D'),
+(273,165,'单卖','包装','D'),
+(274,165,'单卖','1','A'),
+(275,165,'单卖','2','A'),
+(276,6,'长度','1M','D'),
+(277,6,'长度','2M','D'),
+(278,6,'宽度','10CM','D'),
+(279,6,'宽度','20CM','D'),
+(280,6,'宽度','30CM','D'),
+(281,6,'长度','3','D'),
+(282,169,'颜色','红色','A'),
+(283,169,'颜色','蓝色','A'),
+(284,169,'颜色','皇上','D'),
+(285,169,'颜色','黄色','A'),
+(286,169,'尺码','S','A'),
+(287,169,'尺码','M','A'),
+(288,169,'尺码','L','A'),
+(289,169,'尺码','XL','A'),
+(290,169,'尺码','XXL','A'),
+(291,1,'卡通图','3','D'),
+(292,6,'长度','36','D'),
+(293,6,'3','','D'),
+(294,6,'宽度','3','D'),
+(295,6,'656','','D'),
+(296,176,'测试1','25','A'),
+(297,177,'规格1','个','A'),
+(298,177,'规格2','包','D'),
+(299,177,'规格1','包','A'),
+(300,181,'颜色','红色','A'),
+(301,181,'尺码','S','A'),
+(302,181,'颜色','蓝色','A'),
+(303,181,'尺码','M','A'),
+(304,181,'尺码','L','A'),
+(305,6,'颜色','大','D'),
+(306,6,'宽度','6','D'),
+(307,6,'长度','52','D'),
+(308,1,'卡通图','cs','D'),
+(309,169,'颜色','213','A'),
+(310,183,'颜色','红','A'),
+(311,183,'尺码','35','A'),
+(312,183,'尺码','36','A'),
+(313,183,'尺码','37','A'),
+(314,183,'尺码','38','A'),
+(315,183,'尺码','39','A'),
+(316,183,'尺码','40','A'),
+(317,183,'颜色','白','A'),
+(318,183,'颜色','黑','A'),
+(319,185,'八寸蛋糕','10寸蛋糕','D'),
+(320,185,'八寸蛋糕','8寸','D'),
+(321,185,'八寸蛋糕','12寸','D'),
+(322,185,'八寸蛋糕','15寸','D'),
+(323,187,'紫薯包','','D'),
+(324,187,'紫薯包','x6','A'),
+(325,187,'紫薯包','x12','A'),
+(326,187,'紫薯包','x32','A'),
+(327,185,'尺寸','8寸','A'),
+(328,185,'尺寸','10寸','A'),
+(329,185,'尺寸','14寸','A'),
+(330,1,'尺码','40','D'),
+(331,1,'颜色','白色','A'),
+(332,1,'ddd','333','D'),
+(333,1,'ddd','222','D'),
+(334,1,'ddd','111','D'),
+(335,1,'ddd','22','D'),
+(336,6,'高度','2M','D'),
+(337,6,'高度','3M','D'),
+(338,6,'长度','3','D'),
+(339,197,'颜色','款式','A'),
+(340,199,'分享','20分钟','A'),
+(341,199,'预约','30分钟','A'),
+(342,6,'高度','黑','D'),
+(343,6,'颜色','红','D'),
+(344,6,'颜色','黄','D'),
+(345,207,'颜色','黑色','A'),
+(346,207,'12332','红色','D'),
+(347,207,'颜色','黑色','D'),
+(348,207,'颜色','红色','A'),
+(349,196,'111','11111','A'),
+(350,196,'111','1111111','A'),
+(351,207,'尺码','S','A'),
+(352,207,'尺码','L','A'),
+(353,207,'赠礼','1','A'),
+(354,207,'赠礼','2','A'),
+(355,232,'颜色','白色','A'),
+(356,232,'数量','5包','A'),
+(357,232,'数量','10包','A'),
+(358,232,'颜色','黑色','A'),
+(359,233,'22222','22222','A'),
+(360,245,'码数','34码','A'),
+(361,245,'码数','35码','A'),
+(362,245,'码数','36码','A'),
+(363,245,'码数','37码','A'),
+(364,245,'颜色','红色','A'),
+(365,245,'颜色','白色','A'),
+(366,245,'颜色','黑色','A'),
+(367,2,'xl','xxl','D'),
+(368,2,'xl','xl','D'),
+(369,2,'l','l','D'),
+(370,2,'m','l','D'),
+(371,2,'l','22','D'),
+(372,305,'颜色','蓝色','A'),
+(373,305,'颜色','黑色','A'),
+(374,305,'尺码','22','A'),
+(375,305,'尺码','23','A'),
+(376,2,'l','vv','D'),
+(377,358,'热尔特谈','','D'),
+(378,358,'111','111','D'),
+(379,358,'热尔特谈','111','D'),
+(380,358,'热尔特谈','1实物','D'),
+(381,358,'热尔特谈','1是qqq','D'),
+(382,358,'热尔特谈','111SSS安徽','D'),
+(383,358,'热尔特谈','111sss汉字###','D'),
+(384,358,'热尔特谈','汉字','D'),
+(385,358,'热尔特谈','汉字sss','D'),
+(386,358,'i0p','h8iuh','A'),
+(387,358,'i0p','oljiho;ok\'','A'),
+(388,361,'111','111','A'),
+(389,361,'111','222','A'),
+(390,361,'111','111','A'),
+(391,361,'111','444','A'),
+(392,361,'111','77','D'),
+(393,361,'111','11111','A'),
+(394,2,'m','隔热','D'),
+(395,2,'l','1','D'),
+(396,6,'chicun','1','D'),
+(397,6,'chicun','2','D'),
+(398,6,'chicun','3','D'),
+(399,6,'颜色','中','D'),
+(400,6,'颜色','小','D'),
+(401,3,'大小','12G','A'),
+(402,4,'着色','白','A'),
+(403,4,'着色','红','A'),
+(404,4,'大小','11','A'),
+(405,4,'大小','22','A'),
+(406,378,'杯','60ml','D'),
+(407,378,'瓶','750ml','D'),
+(408,6,'颜色','111','D'),
+(409,6,'111','111111','D'),
+(410,378,'5','6','D'),
+(411,378,'5','6','D'),
+(412,378,'瓶','100','D'),
+(413,382,'温度','正常冰','A'),
+(414,382,'温度','少冰','A'),
+(415,382,'温度','去冰','A'),
+(416,382,'甜度','正常糖(推荐)','A'),
+(417,382,'甜度','少糖','A'),
+(418,382,'甜度','不另外放糖(不推荐)','A'),
+(419,382,'特殊口味','标准搭配','A'),
+(420,382,'脆波波','','D'),
+(421,1,'颜色','蓝色','A'),
+(422,1,'重量','1KG','D'),
+(423,1,'重量','2KG','D'),
+(424,1,'长度','11','D'),
+(425,1,'长度','22','D'),
+(426,6,'111','11','D'),
+(427,6,'111','11','D'),
+(428,6,'111','22','D'),
+(429,3,'颜色','蓝色','A'),
+(430,384,'时长','12','A'),
+(431,1,'尺码','45','A'),
+(432,1,'尺码','55','A');
+
+/*Table structure for table `mt_merchant` */
+
+DROP TABLE IF EXISTS `mt_merchant`;
+
+CREATE TABLE `mt_merchant` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `TYPE` varchar(30) DEFAULT '' COMMENT '类型,restaurant:餐饮;retail:零售;service:服务;other:其他',
+ `LOGO` varchar(255) DEFAULT '' COMMENT 'logo',
+ `NO` varchar(20) NOT NULL DEFAULT '' COMMENT '商户号',
+ `NAME` varchar(50) NOT NULL DEFAULT '' COMMENT '商户名称',
+ `CONTACT` varchar(30) DEFAULT '' COMMENT '联系人姓名',
+ `PHONE` varchar(20) DEFAULT '' COMMENT '联系电话',
+ `ADDRESS` varchar(100) DEFAULT '' COMMENT '联系地址',
+ `WX_APP_ID` varchar(50) DEFAULT '' COMMENT '微信小程序appId',
+ `WX_APP_SECRET` varchar(50) DEFAULT '' COMMENT '微信小程序秘钥',
+ `WX_OFFICIAL_APP_ID` varchar(50) DEFAULT '' COMMENT '微信公众号appId',
+ `WX_OFFICIAL_APP_SECRET` varchar(50) DEFAULT '' COMMENT '微信公众号秘钥',
+ `DESCRIPTION` varchar(2000) DEFAULT '' COMMENT '备注信息',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `STATUS` char(1) DEFAULT 'A' COMMENT '状态,A:有效/启用;D:无效',
+ `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='商户表';
+
+/*Data for the table `mt_merchant` */
+
+insert into `mt_merchant`(`ID`,`TYPE`,`LOGO`,`NO`,`NAME`,`CONTACT`,`PHONE`,`ADDRESS`,`WX_APP_ID`,`WX_APP_SECRET`,`WX_OFFICIAL_APP_ID`,`WX_OFFICIAL_APP_SECRET`,`DESCRIPTION`,`CREATE_TIME`,`UPDATE_TIME`,`STATUS`,`OPERATOR`) values
+(1,'','/uploads/20230804/8e5893378bec4b8ab3cabb77e15162d2.PNG','10001','小隅安商行','安安','18976679980','海口市永万路7号','','','','','默认','2023-08-01 12:03:55','2023-08-04 09:55:37','A','fuint'),
+(2,'','/uploads/20230804/11f9b3135db043488e4b9bdcadda9f56.png','10002','延禾技术','FSQ','18976679980','海口市国兴大道100号','','','','','测试','2023-08-01 14:04:14','2023-08-04 09:56:04','A','fuint');
+
+/*Table structure for table `mt_message` */
+
+DROP TABLE IF EXISTS `mt_message`;
+
+CREATE TABLE `mt_message` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID',
+ `USER_ID` int NOT NULL COMMENT '用户ID',
+ `TYPE` varchar(30) NOT NULL DEFAULT '' COMMENT '消息类型',
+ `TITLE` varchar(200) DEFAULT '友情提示' COMMENT '消息标题',
+ `CONTENT` varchar(500) NOT NULL DEFAULT '' COMMENT '消息内容',
+ `IS_READ` char(1) DEFAULT 'N' COMMENT '是否已读',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `PARAMS` varchar(1000) DEFAULT '' COMMENT '参数信息',
+ `IS_SEND` char(1) DEFAULT 'N' COMMENT '是否已发送',
+ `SEND_TIME` datetime DEFAULT NULL COMMENT '发送时间',
+ `STATUS` char(1) DEFAULT 'A' COMMENT '状态',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8 COMMENT='系统消息表';
+
+/*Data for the table `mt_message` */
+
+insert into `mt_message`(`ID`,`MERCHANT_ID`,`USER_ID`,`TYPE`,`TITLE`,`CONTENT`,`IS_READ`,`CREATE_TIME`,`UPDATE_TIME`,`PARAMS`,`IS_SEND`,`SEND_TIME`,`STATUS`) values
+(1,0,163,'sub','积分变更提醒','积分变更提醒','Y','2023-08-03 08:51:17','2023-08-03 08:53:01','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"thing7\":{\"value\":\"-1000\"},\"thing3\":{\"value\":\"您的积分发生了变动,请留意~\"},\"date2\":{\"value\":\"2023-08-03 08:51\"}},\"template_id\":\"MJCUWLiPDVPnuCgqsjbl5X385bowwoKwshuLmnUU5Ss\",\"page\":\"pages/user/index\"}','Y','2023-08-03 08:52:17','A'),
+(2,0,163,'sub','积分变更提醒','积分变更提醒','N','2023-08-03 08:51:36','2023-08-03 08:53:01','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"thing7\":{\"value\":\"1000\"},\"thing3\":{\"value\":\"您的积分发生了变动,请留意~\"},\"date2\":{\"value\":\"2023-08-03 08:51\"}},\"template_id\":\"MJCUWLiPDVPnuCgqsjbl5X385bowwoKwshuLmnUU5Ss\",\"page\":\"pages/user/index\"}','Y','2023-08-03 08:52:36','A'),
+(3,0,163,'sub','余额变动提醒','余额变动提醒','Y','2023-08-03 08:58:26','2023-08-03 09:00:01','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"amount6\":{\"value\":\"-0.01\"},\"thing3\":{\"value\":\"您的余额发生了变动,请留意~\"},\"time8\":{\"value\":\"2023-08-03 08:58\"}},\"template_id\":\"6Klx5n119OFezK2AUr8J_YeNp_B2acCGNNUGoAoYsgw\",\"page\":\"pages/user/index\"}','Y','2023-08-03 08:59:26','A'),
+(4,0,163,'sub','订单生成提醒','订单生成提醒','N','2023-08-03 08:58:26','2023-08-03 09:00:01','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"time1\":{\"value\":\"2023-08-03 08:58\"},\"character_string4\":{\"value\":\"202308030858262038964\"},\"thing5.DATA}\":{\"value\":\"您的订单已生成,请留意~\"}},\"template_id\":\"2MxTzfak92lcn-uTN4_WSv9AmuFvqmKrUXNQ7ph3rls\",\"page\":\"pages/order/index\"}','Y','2023-08-03 08:59:26','A'),
+(5,0,163,'sub','积分变更提醒','积分变更提醒','N','2023-08-03 09:13:11','2023-08-03 09:15:01','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"thing7\":{\"value\":\"-1000\"},\"thing3\":{\"value\":\"您的积分发生了变动,请留意~\"},\"date2\":{\"value\":\"2023-08-03 09:13\"}},\"template_id\":\"MJCUWLiPDVPnuCgqsjbl5X385bowwoKwshuLmnUU5Ss\",\"page\":\"pages/user/index\"}','Y','2023-08-03 09:14:11','A'),
+(6,0,163,'sub','订单生成提醒','订单生成提醒','N','2023-08-03 09:13:11','2023-08-03 09:15:01','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"time1\":{\"value\":\"2023-08-03 09:13\"},\"character_string4\":{\"value\":\"202308030913107144301\"},\"thing5.DATA}\":{\"value\":\"您的订单已生成,请留意~\"}},\"template_id\":\"2MxTzfak92lcn-uTN4_WSv9AmuFvqmKrUXNQ7ph3rls\",\"page\":\"pages/order/index\"}','Y','2023-08-03 09:14:11','A'),
+(7,0,163,'sub','余额变动提醒','余额变动提醒','Y','2023-08-03 09:14:47','2023-08-03 09:16:01','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"amount6\":{\"value\":\"-0.01\"},\"thing3\":{\"value\":\"您的余额发生了变动,请留意~\"},\"time8\":{\"value\":\"2023-08-03 09:14\"}},\"template_id\":\"6Klx5n119OFezK2AUr8J_YeNp_B2acCGNNUGoAoYsgw\",\"page\":\"pages/user/index\"}','Y','2023-08-03 09:15:47','A'),
+(8,0,163,'sub','订单生成提醒','订单生成提醒','N','2023-08-03 09:14:47','2023-08-03 09:16:01','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"time1\":{\"value\":\"2023-08-03 09:14\"},\"character_string4\":{\"value\":\"202308030914470447532\"},\"thing5.DATA}\":{\"value\":\"您的订单已生成,请留意~\"}},\"template_id\":\"2MxTzfak92lcn-uTN4_WSv9AmuFvqmKrUXNQ7ph3rls\",\"page\":\"pages/order/index\"}','Y','2023-08-03 09:15:47','A'),
+(9,0,163,'sub','余额变动提醒','余额变动提醒','Y','2023-08-03 09:16:18','2023-08-03 09:34:07','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"amount6\":{\"value\":\"-0.02\"},\"thing3\":{\"value\":\"您的余额发生了变动,请留意~\"},\"time8\":{\"value\":\"2023-08-03 09:16\"}},\"template_id\":\"6Klx5n119OFezK2AUr8J_YeNp_B2acCGNNUGoAoYsgw\",\"page\":\"pages/user/index\"}','Y','2023-08-03 09:17:18','A'),
+(10,0,163,'sub','订单生成提醒','订单生成提醒','N','2023-08-03 09:16:18','2023-08-03 09:34:07','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"time1\":{\"value\":\"2023-08-03 09:16\"},\"character_string4\":{\"value\":\"202308030916183312747\"},\"thing5.DATA}\":{\"value\":\"您的订单已生成,请留意~\"}},\"template_id\":\"2MxTzfak92lcn-uTN4_WSv9AmuFvqmKrUXNQ7ph3rls\",\"page\":\"pages/order/index\"}','Y','2023-08-03 09:17:18','A'),
+(11,0,163,'sub','余额变动提醒','余额变动提醒','Y','2023-08-03 09:16:32','2023-08-03 09:34:08','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"amount6\":{\"value\":\"-0.79\"},\"thing3\":{\"value\":\"您的余额发生了变动,请留意~\"},\"time8\":{\"value\":\"2023-08-03 09:16\"}},\"template_id\":\"6Klx5n119OFezK2AUr8J_YeNp_B2acCGNNUGoAoYsgw\",\"page\":\"pages/user/index\"}','Y','2023-08-03 09:17:32','A'),
+(12,0,163,'sub','订单生成提醒','订单生成提醒','N','2023-08-03 09:16:32','2023-08-03 09:34:08','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"time1\":{\"value\":\"2023-08-03 09:16\"},\"character_string4\":{\"value\":\"202308030916315008766\"},\"thing5.DATA}\":{\"value\":\"您的订单已生成,请留意~\"}},\"template_id\":\"2MxTzfak92lcn-uTN4_WSv9AmuFvqmKrUXNQ7ph3rls\",\"page\":\"pages/order/index\"}','Y','2023-08-03 09:17:32','A'),
+(13,0,163,'sub','积分变更提醒','积分变更提醒','N','2023-08-03 09:17:07','2023-08-03 09:34:08','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"thing7\":{\"value\":\"1000\"},\"thing3\":{\"value\":\"您的积分发生了变动,请留意~\"},\"date2\":{\"value\":\"2023-08-03 09:17\"}},\"template_id\":\"MJCUWLiPDVPnuCgqsjbl5X385bowwoKwshuLmnUU5Ss\",\"page\":\"pages/user/index\"}','Y','2023-08-03 09:18:07','A'),
+(14,0,163,'sub','积分变更提醒','积分变更提醒','Y','2023-09-08 21:58:25','2023-09-08 22:00:01','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"thing7\":{\"value\":\"-1000\"},\"thing3\":{\"value\":\"您的积分发生了变动,请留意~\"},\"date2\":{\"value\":\"2023-09-08 21:58\"}},\"template_id\":\"MJCUWLiPDVPnuCgqsjbl5X385bowwoKwshuLmnUU5Ss\",\"page\":\"pages/user/index\"}','Y','2023-09-08 21:59:24','A'),
+(15,0,163,'sub','订单生成提醒','订单生成提醒','N','2023-09-08 21:58:25','2023-09-08 22:00:01','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"time1\":{\"value\":\"2023-09-08 21:58\"},\"character_string4\":{\"value\":\"202309082158244549616\"},\"thing5.DATA}\":{\"value\":\"您的订单已生成,请留意~\"}},\"template_id\":\"2MxTzfak92lcn-uTN4_WSv9AmuFvqmKrUXNQ7ph3rls\",\"page\":\"pages/order/index\"}','Y','2023-09-08 21:59:25','A'),
+(16,0,163,'sub','余额变动提醒','余额变动提醒','N','2023-09-08 22:01:18','2023-09-08 22:03:00','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"amount6\":{\"value\":\"-72.08\"},\"thing3\":{\"value\":\"您的余额发生了变动,请留意~\"},\"time8\":{\"value\":\"2023-09-08 22:01\"}},\"template_id\":\"6Klx5n119OFezK2AUr8J_YeNp_B2acCGNNUGoAoYsgw\",\"page\":\"pages/user/index\"}','Y','2023-09-08 22:02:18','A'),
+(17,0,163,'sub','订单生成提醒','订单生成提醒','N','2023-09-08 22:01:18','2023-09-08 22:03:01','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"time1\":{\"value\":\"2023-09-08 22:01\"},\"character_string4\":{\"value\":\"202309082201183531567\"},\"thing5.DATA}\":{\"value\":\"您的订单已生成,请留意~\"}},\"template_id\":\"2MxTzfak92lcn-uTN4_WSv9AmuFvqmKrUXNQ7ph3rls\",\"page\":\"pages/order/index\"}','Y','2023-09-08 22:02:18','A'),
+(18,0,163,'sub','余额变动提醒','余额变动提醒','N','2023-09-08 22:04:25','2023-09-10 09:58:01','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"amount6\":{\"value\":\"-72.08\"},\"thing3\":{\"value\":\"您的余额发生了变动,请留意~\"},\"time8\":{\"value\":\"2023-09-08 22:04\"}},\"template_id\":\"6Klx5n119OFezK2AUr8J_YeNp_B2acCGNNUGoAoYsgw\",\"page\":\"pages/user/index\"}','Y','2023-09-08 22:05:25','A'),
+(19,0,163,'sub','订单生成提醒','订单生成提醒','N','2023-09-08 22:04:25','2023-09-10 09:58:01','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"time1\":{\"value\":\"2023-09-08 22:04\"},\"character_string4\":{\"value\":\"202309082204254176805\"},\"thing5.DATA}\":{\"value\":\"您的订单已生成,请留意~\"}},\"template_id\":\"2MxTzfak92lcn-uTN4_WSv9AmuFvqmKrUXNQ7ph3rls\",\"page\":\"pages/order/index\"}','Y','2023-09-08 22:05:25','A'),
+(20,0,163,'sub','积分变更提醒','积分变更提醒','Y','2023-09-10 09:58:01','2023-09-11 08:54:03','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"thing7\":{\"value\":\"1000\"},\"thing3\":{\"value\":\"您的积分发生了变动,请留意~\"},\"date2\":{\"value\":\"2023-09-10 09:58\"}},\"template_id\":\"MJCUWLiPDVPnuCgqsjbl5X385bowwoKwshuLmnUU5Ss\",\"page\":\"pages/user/index\"}','Y','2023-09-10 09:59:01','A'),
+(21,0,6143,'pop','温馨提示','系统赠送您价值¥20.00卡券和1000积分,请注意查收!','Y','2023-09-18 18:02:18','2023-09-18 18:02:25','','Y','2023-09-18 18:02:18','A'),
+(23,0,163,'sub','积分变更提醒','积分变更提醒','Y','2023-09-20 18:00:31','2023-09-20 18:02:01','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"thing7\":{\"value\":\"-1000\"},\"thing3\":{\"value\":\"您的积分发生了变动,请留意~\"},\"date2\":{\"value\":\"2023-09-20 18:00\"}},\"template_id\":\"MJCUWLiPDVPnuCgqsjbl5X385bowwoKwshuLmnUU5Ss\",\"page\":\"pages/user/index\"}','Y','2023-09-20 18:01:31','A'),
+(24,0,163,'sub','订单生成提醒','订单生成提醒','N','2023-09-20 18:00:31','2023-09-20 18:02:01','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"time1\":{\"value\":\"2023-09-20 18:00\"},\"character_string4\":{\"value\":\"202309201800308947963\"},\"thing5.DATA}\":{\"value\":\"您的订单已生成,请留意~\"}},\"template_id\":\"2MxTzfak92lcn-uTN4_WSv9AmuFvqmKrUXNQ7ph3rls\",\"page\":\"pages/order/index\"}','Y','2023-09-20 18:01:31','A'),
+(25,0,163,'sub','订单生成提醒','订单生成提醒','N','2023-09-21 08:35:40','2023-09-21 08:37:06','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"time1\":{\"value\":\"2023-09-21 08:35\"},\"character_string4\":{\"value\":\"202309210835395956418\"},\"thing5.DATA}\":{\"value\":\"您的订单已生成,请留意~\"}},\"template_id\":\"2MxTzfak92lcn-uTN4_WSv9AmuFvqmKrUXNQ7ph3rls\",\"page\":\"pages/order/index\"}','Y','2023-09-21 08:36:40','A'),
+(26,0,163,'sub','订单生成提醒','订单生成提醒','N','2023-09-21 08:39:39','2023-09-21 08:41:01','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"time1\":{\"value\":\"2023-09-21 08:39\"},\"character_string4\":{\"value\":\"202309210839381673661\"},\"thing5.DATA}\":{\"value\":\"您的订单已生成,请留意~\"}},\"template_id\":\"2MxTzfak92lcn-uTN4_WSv9AmuFvqmKrUXNQ7ph3rls\",\"page\":\"pages/order/index\"}','Y','2023-09-21 08:40:39','A'),
+(27,0,163,'sub','订单生成提醒','订单生成提醒','N','2023-09-22 10:18:47','2023-09-22 10:20:03','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"time1\":{\"value\":\"2023-09-22 10:18\"},\"character_string4\":{\"value\":\"202309221018463011586\"},\"thing5.DATA}\":{\"value\":\"您的订单已生成,请留意~\"}},\"template_id\":\"2MxTzfak92lcn-uTN4_WSv9AmuFvqmKrUXNQ7ph3rls\",\"page\":\"pages/order/index\"}','Y','2023-09-22 10:19:46','A'),
+(28,1,1,'sub','积分变更提醒','积分变更提醒','N','2023-10-19 09:39:45','2023-10-19 09:41:01','{\"touser\":\"owOWg5cYFQr15C2QJkuAPfvMpHTQ\",\"data\":{\"thing7\":{\"value\":\"1000\"},\"thing3\":{\"value\":\"您的积分发生了变动,请留意~\"},\"date2\":{\"value\":\"2023-10-19 09:39\"}},\"template_id\":\"MJCUWLiPDVPnuCgqsjbl5X385bowwoKwshuLmnUU5Ss\",\"page\":\"pages/user/index\"}','Y','2023-10-19 09:40:45','A'),
+(29,1,1,'pop','温馨提示','系统赠送您1000积分,请注意查收!','Y','2023-10-19 09:39:45','2023-10-19 09:39:48','','Y','2023-10-19 09:39:45','A'),
+(30,1,1,'pop','温馨提示','系统赠送您1000积分,请注意查收!','N','2024-04-09 14:40:19','2024-04-09 14:40:19','','Y','2024-04-09 14:40:19','A'),
+(31,1,2,'pop','温馨提示','系统赠送您1000积分,请注意查收!','N','2024-04-09 14:40:21','2024-04-09 14:40:21','','Y','2024-04-09 14:40:21','A');
+
+/*Table structure for table `mt_open_gift` */
+
+DROP TABLE IF EXISTS `mt_open_gift`;
+
+CREATE TABLE `mt_open_gift` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID',
+ `STORE_ID` int NOT NULL DEFAULT '0' COMMENT '门店ID',
+ `GRADE_ID` int NOT NULL DEFAULT '0' COMMENT '会员等级ID',
+ `POINT` int NOT NULL DEFAULT '0' COMMENT '赠送积分',
+ `COUPON_ID` int NOT NULL DEFAULT '0' COMMENT '卡券ID',
+ `COUPON_NUM` int NOT NULL DEFAULT '1' COMMENT '卡券数量',
+ `CREATE_TIME` datetime NOT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime NOT NULL COMMENT '更新时间',
+ `STATUS` char(1) DEFAULT 'A' COMMENT '状态',
+ `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB AUTO_INCREMENT=117 DEFAULT CHARSET=utf8 COMMENT='会员开卡赠礼';
+
+/*Data for the table `mt_open_gift` */
+
+insert into `mt_open_gift`(`ID`,`MERCHANT_ID`,`STORE_ID`,`GRADE_ID`,`POINT`,`COUPON_ID`,`COUPON_NUM`,`CREATE_TIME`,`UPDATE_TIME`,`STATUS`,`OPERATOR`) values
+(115,1,0,1,1000,0,0,'2023-07-24 20:06:48','2023-07-24 20:06:48','A','fuint'),
+(116,1,0,1,0,153,1,'2023-07-24 22:17:38','2023-07-24 22:17:38','A','fuint');
+
+/*Table structure for table `mt_open_gift_item` */
+
+DROP TABLE IF EXISTS `mt_open_gift_item`;
+
+CREATE TABLE `mt_open_gift_item` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `USER_ID` int NOT NULL COMMENT '会用ID',
+ `OPEN_GIFT_ID` int NOT NULL COMMENT '赠礼ID',
+ `CREATE_TIME` datetime NOT NULL COMMENT '创建时间',
+ `STATUS` char(1) NOT NULL COMMENT '状态',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf32 COMMENT='开卡赠礼明细表';
+
+/*Data for the table `mt_open_gift_item` */
+
+/*Table structure for table `mt_order` */
+
+DROP TABLE IF EXISTS `mt_order`;
+
+CREATE TABLE `mt_order` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `TYPE` varchar(30) DEFAULT NULL COMMENT '订单类型',
+ `PAY_TYPE` varchar(30) DEFAULT 'JSAPI' COMMENT '支付类型',
+ `ORDER_MODE` varchar(30) DEFAULT 'express' COMMENT '订单模式',
+ `ORDER_SN` varchar(32) NOT NULL DEFAULT '' COMMENT '订单号',
+ `COUPON_ID` int DEFAULT '0' COMMENT '卡券ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '所属商户ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '所属店铺ID',
+ `USER_ID` int NOT NULL DEFAULT '0' COMMENT '用户ID',
+ `VERIFY_CODE` varchar(10) DEFAULT '' COMMENT '核销验证码',
+ `IS_VISITOR` char(1) DEFAULT 'N' COMMENT '是否游客',
+ `AMOUNT` decimal(10,2) DEFAULT '0.00' COMMENT '订单金额',
+ `PAY_AMOUNT` decimal(10,2) DEFAULT '0.00' COMMENT '支付金额',
+ `USE_POINT` int DEFAULT '0' COMMENT '使用积分数量',
+ `POINT_AMOUNT` decimal(10,2) DEFAULT '0.00' COMMENT '积分金额',
+ `DISCOUNT` decimal(10,2) DEFAULT '0.00' COMMENT '折扣金额',
+ `DELIVERY_FEE` decimal(10,2) DEFAULT '0.00' COMMENT '配送费用',
+ `PARAM` varchar(500) DEFAULT '' COMMENT '订单参数',
+ `EXPRESS_INFO` varchar(500) DEFAULT '' COMMENT '物流信息',
+ `REMARK` varchar(500) DEFAULT '' COMMENT '用户备注',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `STATUS` char(1) DEFAULT 'A' COMMENT '订单状态',
+ `PAY_TIME` datetime DEFAULT NULL COMMENT '支付时间',
+ `PAY_STATUS` char(1) DEFAULT '' COMMENT '支付状态',
+ `SETTLE_STATUS` char(1) DEFAULT 'A' COMMENT '结算状态',
+ `STAFF_ID` int DEFAULT '0' COMMENT '操作员工',
+ `COMMISSION_STATUS` char(1) DEFAULT 'A' COMMENT '分佣提成计算状态',
+ `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单表';
+
+/*Data for the table `mt_order` */
+
+/*Table structure for table `mt_order_address` */
+
+DROP TABLE IF EXISTS `mt_order_address`;
+
+CREATE TABLE `mt_order_address` (
+ `ID` int unsigned NOT NULL AUTO_INCREMENT COMMENT '地址ID',
+ `NAME` varchar(30) NOT NULL DEFAULT '' COMMENT '收货人姓名',
+ `MOBILE` varchar(20) NOT NULL DEFAULT '' COMMENT '联系电话',
+ `PROVINCE_ID` int unsigned NOT NULL DEFAULT '0' COMMENT '省份ID',
+ `CITY_ID` int unsigned NOT NULL DEFAULT '0' COMMENT '城市ID',
+ `REGION_ID` int unsigned NOT NULL DEFAULT '0' COMMENT '区/县ID',
+ `DETAIL` varchar(255) NOT NULL DEFAULT '' COMMENT '详细地址',
+ `ORDER_ID` int unsigned NOT NULL DEFAULT '0' COMMENT '订单ID',
+ `USER_ID` int unsigned NOT NULL DEFAULT '0' COMMENT '用户ID',
+ `CREATE_TIME` datetime NOT NULL COMMENT '创建时间',
+ PRIMARY KEY (`ID`) USING BTREE,
+ KEY `ORDER_ID` (`ORDER_ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单收货地址记录表';
+
+/*Data for the table `mt_order_address` */
+
+/*Table structure for table `mt_order_goods` */
+
+DROP TABLE IF EXISTS `mt_order_goods`;
+
+CREATE TABLE `mt_order_goods` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `ORDER_ID` int NOT NULL DEFAULT '0' COMMENT '订单ID',
+ `GOODS_ID` int NOT NULL DEFAULT '0' COMMENT '商品ID',
+ `SKU_ID` int DEFAULT '0' COMMENT 'skuID',
+ `PRICE` decimal(10,2) DEFAULT '0.00' COMMENT '价格',
+ `DISCOUNT` decimal(10,2) DEFAULT '0.00' COMMENT '优惠价',
+ `NUM` int NOT NULL DEFAULT '0' COMMENT '商品数量',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `STATUS` char(1) DEFAULT 'A' COMMENT 'A:正常;D:删除',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单商品表';
+
+/*Data for the table `mt_order_goods` */
+
+/*Table structure for table `mt_point` */
+
+DROP TABLE IF EXISTS `mt_point`;
+
+CREATE TABLE `mt_point` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '所属商户ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '所属店铺ID',
+ `USER_ID` int NOT NULL DEFAULT '0' COMMENT '用户ID',
+ `ORDER_SN` varchar(32) DEFAULT '' COMMENT '订单号',
+ `AMOUNT` int NOT NULL DEFAULT '0' COMMENT '积分变化数量',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `DESCRIPTION` varchar(200) DEFAULT '' COMMENT '备注说明',
+ `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人',
+ `STATUS` char(1) DEFAULT 'A' COMMENT '状态,A正常;D作废',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='积分变化表';
+
+/*Data for the table `mt_point` */
+
+insert into `mt_point`(`ID`,`MERCHANT_ID`,`STORE_ID`,`USER_ID`,`ORDER_SN`,`AMOUNT`,`CREATE_TIME`,`UPDATE_TIME`,`DESCRIPTION`,`OPERATOR`,`STATUS`) values
+(1,0,0,163,'202309082158244549616',-1000,'2023-09-08 21:58:24','2023-09-08 21:58:24','支付扣除1000积分','','A'),
+(2,0,0,163,'202309082158244549616',1000,'2023-09-10 09:58:01','2023-09-10 09:58:01','订单取消202309082158244549616退回1000积分','','A'),
+(3,2,7,6143,'',1000,'2023-09-18 18:02:17','2023-09-18 18:02:17','开卡赠送1000积分','系统','A'),
+(5,1,3,163,'202309201800308947963',-1000,'2023-09-20 18:00:31','2023-09-20 18:00:31','支付扣除1000积分','','A'),
+(6,1,2,1,'',1000,'2023-10-19 09:39:45','2023-10-19 09:39:45','开卡赠送1000积分','系统','A'),
+(7,1,3,1,'',1000,'2024-04-09 14:40:19','2024-04-09 14:40:19','开卡赠送1000积分','系统','A'),
+(8,1,3,2,'',1000,'2024-04-09 14:40:21','2024-04-09 14:40:21','开卡赠送1000积分','系统','A');
+
+/*Table structure for table `mt_refund` */
+
+DROP TABLE IF EXISTS `mt_refund`;
+
+CREATE TABLE `mt_refund` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `ORDER_ID` int NOT NULL COMMENT '订单ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '所属商户ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '店铺ID',
+ `USER_ID` int NOT NULL COMMENT '会员ID',
+ `AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '退款金额',
+ `TYPE` varchar(20) DEFAULT '' COMMENT '售后类型',
+ `REMARK` varchar(500) DEFAULT '' COMMENT '退款备注',
+ `REJECT_REASON` varchar(1000) DEFAULT NULL COMMENT '拒绝原因',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `STATUS` char(1) DEFAULT 'A' COMMENT '状态',
+ `IMAGES` varchar(1000) DEFAULT NULL COMMENT '图片',
+ `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='售后表';
+
+/*Data for the table `mt_refund` */
+
+/*Table structure for table `mt_region` */
+
+DROP TABLE IF EXISTS `mt_region`;
+
+CREATE TABLE `mt_region` (
+ `ID` int unsigned NOT NULL AUTO_INCREMENT COMMENT '区划信息ID',
+ `NAME` varchar(255) NOT NULL DEFAULT '' COMMENT '区划名称',
+ `PID` int unsigned NOT NULL DEFAULT '0' COMMENT '父级ID',
+ `CODE` varchar(255) NOT NULL DEFAULT '' COMMENT '区划编码',
+ `LEVEL` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '层级(1省级 2市级 3区/县级)',
+ PRIMARY KEY (`ID`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=3705 DEFAULT CHARSET=utf8 COMMENT='省市区数据表';
+
+/*Data for the table `mt_region` */
+
+insert into `mt_region`(`ID`,`NAME`,`PID`,`CODE`,`LEVEL`) values
+(1,'北京',0,'110000',1),
+(2,'北京市',1,'110010',2),
+(3,'东城区',2,'110101',3),
+(4,'西城区',2,'110102',3),
+(5,'朝阳区',2,'110105',3),
+(6,'丰台区',2,'110106',3),
+(7,'石景山区',2,'110107',3),
+(8,'海淀区',2,'110108',3),
+(9,'门头沟区',2,'110109',3),
+(10,'房山区',2,'110111',3),
+(11,'通州区',2,'110112',3),
+(12,'顺义区',2,'110113',3),
+(13,'昌平区',2,'110114',3),
+(14,'大兴区',2,'110115',3),
+(15,'怀柔区',2,'110116',3),
+(16,'平谷区',2,'110117',3),
+(17,'密云区',2,'110118',3),
+(18,'延庆区',2,'110119',3),
+(19,'天津',0,'120000',1),
+(20,'天津市',19,'120010',2),
+(21,'和平区',20,'120101',3),
+(22,'河东区',20,'120102',3),
+(23,'河西区',20,'120103',3),
+(24,'南开区',20,'120104',3),
+(25,'河北区',20,'120105',3),
+(26,'红桥区',20,'120106',3),
+(27,'东丽区',20,'120110',3),
+(28,'西青区',20,'120111',3),
+(29,'津南区',20,'120112',3),
+(30,'北辰区',20,'120113',3),
+(31,'武清区',20,'120114',3),
+(32,'宝坻区',20,'120115',3),
+(33,'滨海新区',20,'120116',3),
+(34,'宁河区',20,'120117',3),
+(35,'静海区',20,'120118',3),
+(36,'蓟州区',20,'120119',3),
+(37,'河北省',0,'130000',1),
+(38,'石家庄市',37,'130100',2),
+(39,'长安区',38,'130102',3),
+(40,'桥西区',38,'130104',3),
+(41,'新华区',38,'130105',3),
+(42,'井陉矿区',38,'130107',3),
+(43,'裕华区',38,'130108',3),
+(44,'藁城区',38,'130109',3),
+(45,'鹿泉区',38,'130110',3),
+(46,'栾城区',38,'130111',3),
+(47,'井陉县',38,'130121',3),
+(48,'正定县',38,'130123',3),
+(49,'行唐县',38,'130125',3),
+(50,'灵寿县',38,'130126',3),
+(51,'高邑县',38,'130127',3),
+(52,'深泽县',38,'130128',3),
+(53,'赞皇县',38,'130129',3),
+(54,'无极县',38,'130130',3),
+(55,'平山县',38,'130131',3),
+(56,'元氏县',38,'130132',3),
+(57,'赵县',38,'130133',3),
+(58,'辛集市',38,'130181',3),
+(59,'晋州市',38,'130183',3),
+(60,'新乐市',38,'130184',3),
+(61,'唐山市',37,'130200',2),
+(62,'路南区',61,'130202',3),
+(63,'路北区',61,'130203',3),
+(64,'古冶区',61,'130204',3),
+(65,'开平区',61,'130205',3),
+(66,'丰南区',61,'130207',3),
+(67,'丰润区',61,'130208',3),
+(68,'曹妃甸区',61,'130209',3),
+(69,'滦南县',61,'130224',3),
+(70,'乐亭县',61,'130225',3),
+(71,'迁西县',61,'130227',3),
+(72,'玉田县',61,'130229',3),
+(73,'遵化市',61,'130281',3),
+(74,'迁安市',61,'130283',3),
+(75,'滦州市',61,'130284',3),
+(76,'秦皇岛市',37,'130300',2),
+(77,'海港区',76,'130302',3),
+(78,'山海关区',76,'130303',3),
+(79,'北戴河区',76,'130304',3),
+(80,'抚宁区',76,'130306',3),
+(81,'青龙满族自治县',76,'130321',3),
+(82,'昌黎县',76,'130322',3),
+(83,'卢龙县',76,'130324',3),
+(84,'邯郸市',37,'130400',2),
+(85,'邯山区',84,'130402',3),
+(86,'丛台区',84,'130403',3),
+(87,'复兴区',84,'130404',3),
+(88,'峰峰矿区',84,'130406',3),
+(89,'肥乡区',84,'130407',3),
+(90,'永年区',84,'130408',3),
+(91,'临漳县',84,'130423',3),
+(92,'成安县',84,'130424',3),
+(93,'大名县',84,'130425',3),
+(94,'涉县',84,'130426',3),
+(95,'磁县',84,'130427',3),
+(96,'邱县',84,'130430',3),
+(97,'鸡泽县',84,'130431',3),
+(98,'广平县',84,'130432',3),
+(99,'馆陶县',84,'130433',3),
+(100,'魏县',84,'130434',3),
+(101,'曲周县',84,'130435',3),
+(102,'武安市',84,'130481',3),
+(103,'邢台市',37,'130500',2),
+(104,'桥东区',103,'130502',3),
+(105,'桥西区',103,'130503',3),
+(106,'邢台县',103,'130521',3),
+(107,'临城县',103,'130522',3),
+(108,'内丘县',103,'130523',3),
+(109,'柏乡县',103,'130524',3),
+(110,'隆尧县',103,'130525',3),
+(111,'任县',103,'130526',3),
+(112,'南和县',103,'130527',3),
+(113,'宁晋县',103,'130528',3),
+(114,'巨鹿县',103,'130529',3),
+(115,'新河县',103,'130530',3),
+(116,'广宗县',103,'130531',3),
+(117,'平乡县',103,'130532',3),
+(118,'威县',103,'130533',3),
+(119,'清河县',103,'130534',3),
+(120,'临西县',103,'130535',3),
+(121,'南宫市',103,'130581',3),
+(122,'沙河市',103,'130582',3),
+(123,'保定市',37,'130600',2),
+(124,'竞秀区',123,'130602',3),
+(125,'莲池区',123,'130606',3),
+(126,'满城区',123,'130607',3),
+(127,'清苑区',123,'130608',3),
+(128,'徐水区',123,'130609',3),
+(129,'涞水县',123,'130623',3),
+(130,'阜平县',123,'130624',3),
+(131,'定兴县',123,'130626',3),
+(132,'唐县',123,'130627',3),
+(133,'高阳县',123,'130628',3),
+(134,'容城县',123,'130629',3),
+(135,'涞源县',123,'130630',3),
+(136,'望都县',123,'130631',3),
+(137,'安新县',123,'130632',3),
+(138,'易县',123,'130633',3),
+(139,'曲阳县',123,'130634',3),
+(140,'蠡县',123,'130635',3),
+(141,'顺平县',123,'130636',3),
+(142,'博野县',123,'130637',3),
+(143,'雄县',123,'130638',3),
+(144,'涿州市',123,'130681',3),
+(145,'定州市',123,'130682',3),
+(146,'安国市',123,'130683',3),
+(147,'高碑店市',123,'130684',3),
+(148,'张家口市',37,'130700',2),
+(149,'桥东区',148,'130702',3),
+(150,'桥西区',148,'130703',3),
+(151,'宣化区',148,'130705',3),
+(152,'下花园区',148,'130706',3),
+(153,'万全区',148,'130708',3),
+(154,'崇礼区',148,'130709',3),
+(155,'张北县',148,'130722',3),
+(156,'康保县',148,'130723',3),
+(157,'沽源县',148,'130724',3),
+(158,'尚义县',148,'130725',3),
+(159,'蔚县',148,'130726',3),
+(160,'阳原县',148,'130727',3),
+(161,'怀安县',148,'130728',3),
+(162,'怀来县',148,'130730',3),
+(163,'涿鹿县',148,'130731',3),
+(164,'赤城县',148,'130732',3),
+(165,'承德市',37,'130800',2),
+(166,'双桥区',165,'130802',3),
+(167,'双滦区',165,'130803',3),
+(168,'鹰手营子矿区',165,'130804',3),
+(169,'承德县',165,'130821',3),
+(170,'兴隆县',165,'130822',3),
+(171,'滦平县',165,'130824',3),
+(172,'隆化县',165,'130825',3),
+(173,'丰宁满族自治县',165,'130826',3),
+(174,'宽城满族自治县',165,'130827',3),
+(175,'围场满族蒙古族自治县',165,'130828',3),
+(176,'平泉市',165,'130881',3),
+(177,'沧州市',37,'130900',2),
+(178,'新华区',177,'130902',3),
+(179,'运河区',177,'130903',3),
+(180,'沧县',177,'130921',3),
+(181,'青县',177,'130922',3),
+(182,'东光县',177,'130923',3),
+(183,'海兴县',177,'130924',3),
+(184,'盐山县',177,'130925',3),
+(185,'肃宁县',177,'130926',3),
+(186,'南皮县',177,'130927',3),
+(187,'吴桥县',177,'130928',3),
+(188,'献县',177,'130929',3),
+(189,'孟村回族自治县',177,'130930',3),
+(190,'泊头市',177,'130981',3),
+(191,'任丘市',177,'130982',3),
+(192,'黄骅市',177,'130983',3),
+(193,'河间市',177,'130984',3),
+(194,'廊坊市',37,'131000',2),
+(195,'安次区',194,'131002',3),
+(196,'广阳区',194,'131003',3),
+(197,'固安县',194,'131022',3),
+(198,'永清县',194,'131023',3),
+(199,'香河县',194,'131024',3),
+(200,'大城县',194,'131025',3),
+(201,'文安县',194,'131026',3),
+(202,'大厂回族自治县',194,'131028',3),
+(203,'霸州市',194,'131081',3),
+(204,'三河市',194,'131082',3),
+(205,'衡水市',37,'131100',2),
+(206,'桃城区',205,'131102',3),
+(207,'冀州区',205,'131103',3),
+(208,'枣强县',205,'131121',3),
+(209,'武邑县',205,'131122',3),
+(210,'武强县',205,'131123',3),
+(211,'饶阳县',205,'131124',3),
+(212,'安平县',205,'131125',3),
+(213,'故城县',205,'131126',3),
+(214,'景县',205,'131127',3),
+(215,'阜城县',205,'131128',3),
+(216,'深州市',205,'131182',3),
+(217,'山西省',0,'140000',1),
+(218,'太原市',217,'140100',2),
+(219,'小店区',218,'140105',3),
+(220,'迎泽区',218,'140106',3),
+(221,'杏花岭区',218,'140107',3),
+(222,'尖草坪区',218,'140108',3),
+(223,'万柏林区',218,'140109',3),
+(224,'晋源区',218,'140110',3),
+(225,'清徐县',218,'140121',3),
+(226,'阳曲县',218,'140122',3),
+(227,'娄烦县',218,'140123',3),
+(228,'古交市',218,'140181',3),
+(229,'大同市',217,'140200',2),
+(230,'新荣区',229,'140212',3),
+(231,'平城区',229,'140213',3),
+(232,'云冈区',229,'140214',3),
+(233,'云州区',229,'140215',3),
+(234,'阳高县',229,'140221',3),
+(235,'天镇县',229,'140222',3),
+(236,'广灵县',229,'140223',3),
+(237,'灵丘县',229,'140224',3),
+(238,'浑源县',229,'140225',3),
+(239,'左云县',229,'140226',3),
+(240,'阳泉市',217,'140300',2),
+(241,'城区',240,'140302',3),
+(242,'矿区',240,'140303',3),
+(243,'郊区',240,'140311',3),
+(244,'平定县',240,'140321',3),
+(245,'盂县',240,'140322',3),
+(246,'长治市',217,'140400',2),
+(247,'潞州区',246,'140403',3),
+(248,'上党区',246,'140404',3),
+(249,'屯留区',246,'140405',3),
+(250,'潞城区',246,'140406',3),
+(251,'襄垣县',246,'140423',3),
+(252,'平顺县',246,'140425',3),
+(253,'黎城县',246,'140426',3),
+(254,'壶关县',246,'140427',3),
+(255,'长子县',246,'140428',3),
+(256,'武乡县',246,'140429',3),
+(257,'沁县',246,'140430',3),
+(258,'沁源县',246,'140431',3),
+(259,'晋城市',217,'140500',2),
+(260,'城区',259,'140502',3),
+(261,'沁水县',259,'140521',3),
+(262,'阳城县',259,'140522',3),
+(263,'陵川县',259,'140524',3),
+(264,'泽州县',259,'140525',3),
+(265,'高平市',259,'140581',3),
+(266,'朔州市',217,'140600',2),
+(267,'朔城区',266,'140602',3),
+(268,'平鲁区',266,'140603',3),
+(269,'山阴县',266,'140621',3),
+(270,'应县',266,'140622',3),
+(271,'右玉县',266,'140623',3),
+(272,'怀仁市',266,'140681',3),
+(273,'晋中市',217,'140700',2),
+(274,'榆次区',273,'140702',3),
+(275,'太谷区',273,'140703',3),
+(276,'榆社县',273,'140721',3),
+(277,'左权县',273,'140722',3),
+(278,'和顺县',273,'140723',3),
+(279,'昔阳县',273,'140724',3),
+(280,'寿阳县',273,'140725',3),
+(281,'祁县',273,'140727',3),
+(282,'平遥县',273,'140728',3),
+(283,'灵石县',273,'140729',3),
+(284,'介休市',273,'140781',3),
+(285,'运城市',217,'140800',2),
+(286,'盐湖区',285,'140802',3),
+(287,'临猗县',285,'140821',3),
+(288,'万荣县',285,'140822',3),
+(289,'闻喜县',285,'140823',3),
+(290,'稷山县',285,'140824',3),
+(291,'新绛县',285,'140825',3),
+(292,'绛县',285,'140826',3),
+(293,'垣曲县',285,'140827',3),
+(294,'夏县',285,'140828',3),
+(295,'平陆县',285,'140829',3),
+(296,'芮城县',285,'140830',3),
+(297,'永济市',285,'140881',3),
+(298,'河津市',285,'140882',3),
+(299,'忻州市',217,'140900',2),
+(300,'忻府区',299,'140902',3),
+(301,'定襄县',299,'140921',3),
+(302,'五台县',299,'140922',3),
+(303,'代县',299,'140923',3),
+(304,'繁峙县',299,'140924',3),
+(305,'宁武县',299,'140925',3),
+(306,'静乐县',299,'140926',3),
+(307,'神池县',299,'140927',3),
+(308,'五寨县',299,'140928',3),
+(309,'岢岚县',299,'140929',3),
+(310,'河曲县',299,'140930',3),
+(311,'保德县',299,'140931',3),
+(312,'偏关县',299,'140932',3),
+(313,'原平市',299,'140981',3),
+(314,'临汾市',217,'141000',2),
+(315,'尧都区',314,'141002',3),
+(316,'曲沃县',314,'141021',3),
+(317,'翼城县',314,'141022',3),
+(318,'襄汾县',314,'141023',3),
+(319,'洪洞县',314,'141024',3),
+(320,'古县',314,'141025',3),
+(321,'安泽县',314,'141026',3),
+(322,'浮山县',314,'141027',3),
+(323,'吉县',314,'141028',3),
+(324,'乡宁县',314,'141029',3),
+(325,'大宁县',314,'141030',3),
+(326,'隰县',314,'141031',3),
+(327,'永和县',314,'141032',3),
+(328,'蒲县',314,'141033',3),
+(329,'汾西县',314,'141034',3),
+(330,'侯马市',314,'141081',3),
+(331,'霍州市',314,'141082',3),
+(332,'吕梁市',217,'141100',2),
+(333,'离石区',332,'141102',3),
+(334,'文水县',332,'141121',3),
+(335,'交城县',332,'141122',3),
+(336,'兴县',332,'141123',3),
+(337,'临县',332,'141124',3),
+(338,'柳林县',332,'141125',3),
+(339,'石楼县',332,'141126',3),
+(340,'岚县',332,'141127',3),
+(341,'方山县',332,'141128',3),
+(342,'中阳县',332,'141129',3),
+(343,'交口县',332,'141130',3),
+(344,'孝义市',332,'141181',3),
+(345,'汾阳市',332,'141182',3),
+(346,'内蒙古自治区',0,'150000',1),
+(347,'呼和浩特市',346,'150100',2),
+(348,'新城区',347,'150102',3),
+(349,'回民区',347,'150103',3),
+(350,'玉泉区',347,'150104',3),
+(351,'赛罕区',347,'150105',3),
+(352,'土默特左旗',347,'150121',3),
+(353,'托克托县',347,'150122',3),
+(354,'和林格尔县',347,'150123',3),
+(355,'清水河县',347,'150124',3),
+(356,'武川县',347,'150125',3),
+(357,'包头市',346,'150200',2),
+(358,'东河区',357,'150202',3),
+(359,'昆都仑区',357,'150203',3),
+(360,'青山区',357,'150204',3),
+(361,'石拐区',357,'150205',3),
+(362,'白云鄂博矿区',357,'150206',3),
+(363,'九原区',357,'150207',3),
+(364,'土默特右旗',357,'150221',3),
+(365,'固阳县',357,'150222',3),
+(366,'达尔罕茂明安联合旗',357,'150223',3),
+(367,'乌海市',346,'150300',2),
+(368,'海勃湾区',367,'150302',3),
+(369,'海南区',367,'150303',3),
+(370,'乌达区',367,'150304',3),
+(371,'赤峰市',346,'150400',2),
+(372,'红山区',371,'150402',3),
+(373,'元宝山区',371,'150403',3),
+(374,'松山区',371,'150404',3),
+(375,'阿鲁科尔沁旗',371,'150421',3),
+(376,'巴林左旗',371,'150422',3),
+(377,'巴林右旗',371,'150423',3),
+(378,'林西县',371,'150424',3),
+(379,'克什克腾旗',371,'150425',3),
+(380,'翁牛特旗',371,'150426',3),
+(381,'喀喇沁旗',371,'150428',3),
+(382,'宁城县',371,'150429',3),
+(383,'敖汉旗',371,'150430',3),
+(384,'通辽市',346,'150500',2),
+(385,'科尔沁区',384,'150502',3),
+(386,'科尔沁左翼中旗',384,'150521',3),
+(387,'科尔沁左翼后旗',384,'150522',3),
+(388,'开鲁县',384,'150523',3),
+(389,'库伦旗',384,'150524',3),
+(390,'奈曼旗',384,'150525',3),
+(391,'扎鲁特旗',384,'150526',3),
+(392,'霍林郭勒市',384,'150581',3),
+(393,'鄂尔多斯市',346,'150600',2),
+(394,'东胜区',393,'150602',3),
+(395,'康巴什区',393,'150603',3),
+(396,'达拉特旗',393,'150621',3),
+(397,'准格尔旗',393,'150622',3),
+(398,'鄂托克前旗',393,'150623',3),
+(399,'鄂托克旗',393,'150624',3),
+(400,'杭锦旗',393,'150625',3),
+(401,'乌审旗',393,'150626',3),
+(402,'伊金霍洛旗',393,'150627',3),
+(403,'呼伦贝尔市',346,'150700',2),
+(404,'海拉尔区',403,'150702',3),
+(405,'扎赉诺尔区',403,'150703',3),
+(406,'阿荣旗',403,'150721',3),
+(407,'莫力达瓦达斡尔族自治旗',403,'150722',3),
+(408,'鄂伦春自治旗',403,'150723',3),
+(409,'鄂温克族自治旗',403,'150724',3),
+(410,'陈巴尔虎旗',403,'150725',3),
+(411,'新巴尔虎左旗',403,'150726',3),
+(412,'新巴尔虎右旗',403,'150727',3),
+(413,'满洲里市',403,'150781',3),
+(414,'牙克石市',403,'150782',3),
+(415,'扎兰屯市',403,'150783',3),
+(416,'额尔古纳市',403,'150784',3),
+(417,'根河市',403,'150785',3),
+(418,'巴彦淖尔市',346,'150800',2),
+(419,'临河区',418,'150802',3),
+(420,'五原县',418,'150821',3),
+(421,'磴口县',418,'150822',3),
+(422,'乌拉特前旗',418,'150823',3),
+(423,'乌拉特中旗',418,'150824',3),
+(424,'乌拉特后旗',418,'150825',3),
+(425,'杭锦后旗',418,'150826',3),
+(426,'乌兰察布市',346,'150900',2),
+(427,'集宁区',426,'150902',3),
+(428,'卓资县',426,'150921',3),
+(429,'化德县',426,'150922',3),
+(430,'商都县',426,'150923',3),
+(431,'兴和县',426,'150924',3),
+(432,'凉城县',426,'150925',3),
+(433,'察哈尔右翼前旗',426,'150926',3),
+(434,'察哈尔右翼中旗',426,'150927',3),
+(435,'察哈尔右翼后旗',426,'150928',3),
+(436,'四子王旗',426,'150929',3),
+(437,'丰镇市',426,'150981',3),
+(438,'兴安盟',346,'152200',2),
+(439,'乌兰浩特市',438,'152201',3),
+(440,'阿尔山市',438,'152202',3),
+(441,'科尔沁右翼前旗',438,'152221',3),
+(442,'科尔沁右翼中旗',438,'152222',3),
+(443,'扎赉特旗',438,'152223',3),
+(444,'突泉县',438,'152224',3),
+(445,'锡林郭勒盟',346,'152500',2),
+(446,'二连浩特市',445,'152501',3),
+(447,'锡林浩特市',445,'152502',3),
+(448,'阿巴嘎旗',445,'152522',3),
+(449,'苏尼特左旗',445,'152523',3),
+(450,'苏尼特右旗',445,'152524',3),
+(451,'东乌珠穆沁旗',445,'152525',3),
+(452,'西乌珠穆沁旗',445,'152526',3),
+(453,'太仆寺旗',445,'152527',3),
+(454,'镶黄旗',445,'152528',3),
+(455,'正镶白旗',445,'152529',3),
+(456,'正蓝旗',445,'152530',3),
+(457,'多伦县',445,'152531',3),
+(458,'阿拉善盟',346,'152900',2),
+(459,'阿拉善左旗',458,'152921',3),
+(460,'阿拉善右旗',458,'152922',3),
+(461,'额济纳旗',458,'152923',3),
+(462,'辽宁省',0,'210000',1),
+(463,'沈阳市',462,'210100',2),
+(464,'和平区',463,'210102',3),
+(465,'沈河区',463,'210103',3),
+(466,'大东区',463,'210104',3),
+(467,'皇姑区',463,'210105',3),
+(468,'铁西区',463,'210106',3),
+(469,'苏家屯区',463,'210111',3),
+(470,'浑南区',463,'210112',3),
+(471,'沈北新区',463,'210113',3),
+(472,'于洪区',463,'210114',3),
+(473,'辽中区',463,'210115',3),
+(474,'康平县',463,'210123',3),
+(475,'法库县',463,'210124',3),
+(476,'新民市',463,'210181',3),
+(477,'大连市',462,'210200',2),
+(478,'中山区',477,'210202',3),
+(479,'西岗区',477,'210203',3),
+(480,'沙河口区',477,'210204',3),
+(481,'甘井子区',477,'210211',3),
+(482,'旅顺口区',477,'210212',3),
+(483,'金州区',477,'210213',3),
+(484,'普兰店区',477,'210214',3),
+(485,'长海县',477,'210224',3),
+(486,'瓦房店市',477,'210281',3),
+(487,'庄河市',477,'210283',3),
+(488,'鞍山市',462,'210300',2),
+(489,'铁东区',488,'210302',3),
+(490,'铁西区',488,'210303',3),
+(491,'立山区',488,'210304',3),
+(492,'千山区',488,'210311',3),
+(493,'台安县',488,'210321',3),
+(494,'岫岩满族自治县',488,'210323',3),
+(495,'海城市',488,'210381',3),
+(496,'抚顺市',462,'210400',2),
+(497,'新抚区',496,'210402',3),
+(498,'东洲区',496,'210403',3),
+(499,'望花区',496,'210404',3),
+(500,'顺城区',496,'210411',3),
+(501,'抚顺县',496,'210421',3),
+(502,'新宾满族自治县',496,'210422',3),
+(503,'清原满族自治县',496,'210423',3),
+(504,'本溪市',462,'210500',2),
+(505,'平山区',504,'210502',3),
+(506,'溪湖区',504,'210503',3),
+(507,'明山区',504,'210504',3),
+(508,'南芬区',504,'210505',3),
+(509,'本溪满族自治县',504,'210521',3),
+(510,'桓仁满族自治县',504,'210522',3),
+(511,'丹东市',462,'210600',2),
+(512,'元宝区',511,'210602',3),
+(513,'振兴区',511,'210603',3),
+(514,'振安区',511,'210604',3),
+(515,'宽甸满族自治县',511,'210624',3),
+(516,'东港市',511,'210681',3),
+(517,'凤城市',511,'210682',3),
+(518,'锦州市',462,'210700',2),
+(519,'古塔区',518,'210702',3),
+(520,'凌河区',518,'210703',3),
+(521,'太和区',518,'210711',3),
+(522,'黑山县',518,'210726',3),
+(523,'义县',518,'210727',3),
+(524,'凌海市',518,'210781',3),
+(525,'北镇市',518,'210782',3),
+(526,'营口市',462,'210800',2),
+(527,'站前区',526,'210802',3),
+(528,'西市区',526,'210803',3),
+(529,'鲅鱼圈区',526,'210804',3),
+(530,'老边区',526,'210811',3),
+(531,'盖州市',526,'210881',3),
+(532,'大石桥市',526,'210882',3),
+(533,'阜新市',462,'210900',2),
+(534,'海州区',533,'210902',3),
+(535,'新邱区',533,'210903',3),
+(536,'太平区',533,'210904',3),
+(537,'清河门区',533,'210905',3),
+(538,'细河区',533,'210911',3),
+(539,'阜新蒙古族自治县',533,'210921',3),
+(540,'彰武县',533,'210922',3),
+(541,'辽阳市',462,'211000',2),
+(542,'白塔区',541,'211002',3),
+(543,'文圣区',541,'211003',3),
+(544,'宏伟区',541,'211004',3),
+(545,'弓长岭区',541,'211005',3),
+(546,'太子河区',541,'211011',3),
+(547,'辽阳县',541,'211021',3),
+(548,'灯塔市',541,'211081',3),
+(549,'盘锦市',462,'211100',2),
+(550,'双台子区',549,'211102',3),
+(551,'兴隆台区',549,'211103',3),
+(552,'大洼区',549,'211104',3),
+(553,'盘山县',549,'211122',3),
+(554,'铁岭市',462,'211200',2),
+(555,'银州区',554,'211202',3),
+(556,'清河区',554,'211204',3),
+(557,'铁岭县',554,'211221',3),
+(558,'西丰县',554,'211223',3),
+(559,'昌图县',554,'211224',3),
+(560,'调兵山市',554,'211281',3),
+(561,'开原市',554,'211282',3),
+(562,'朝阳市',462,'211300',2),
+(563,'双塔区',562,'211302',3),
+(564,'龙城区',562,'211303',3),
+(565,'朝阳县',562,'211321',3),
+(566,'建平县',562,'211322',3),
+(567,'喀喇沁左翼蒙古族自治县',562,'211324',3),
+(568,'北票市',562,'211381',3),
+(569,'凌源市',562,'211382',3),
+(570,'葫芦岛市',462,'211400',2),
+(571,'连山区',570,'211402',3),
+(572,'龙港区',570,'211403',3),
+(573,'南票区',570,'211404',3),
+(574,'绥中县',570,'211421',3),
+(575,'建昌县',570,'211422',3),
+(576,'兴城市',570,'211481',3),
+(577,'吉林省',0,'220000',1),
+(578,'长春市',577,'220100',2),
+(579,'南关区',578,'220102',3),
+(580,'宽城区',578,'220103',3),
+(581,'朝阳区',578,'220104',3),
+(582,'二道区',578,'220105',3),
+(583,'绿园区',578,'220106',3),
+(584,'双阳区',578,'220112',3),
+(585,'九台区',578,'220113',3),
+(586,'农安县',578,'220122',3),
+(587,'榆树市',578,'220182',3),
+(588,'德惠市',578,'220183',3),
+(589,'吉林市',577,'220200',2),
+(590,'昌邑区',589,'220202',3),
+(591,'龙潭区',589,'220203',3),
+(592,'船营区',589,'220204',3),
+(593,'丰满区',589,'220211',3),
+(594,'永吉县',589,'220221',3),
+(595,'蛟河市',589,'220281',3),
+(596,'桦甸市',589,'220282',3),
+(597,'舒兰市',589,'220283',3),
+(598,'磐石市',589,'220284',3),
+(599,'四平市',577,'220300',2),
+(600,'铁西区',599,'220302',3),
+(601,'铁东区',599,'220303',3),
+(602,'梨树县',599,'220322',3),
+(603,'伊通满族自治县',599,'220323',3),
+(604,'公主岭市',599,'220381',3),
+(605,'双辽市',599,'220382',3),
+(606,'辽源市',577,'220400',2),
+(607,'龙山区',606,'220402',3),
+(608,'西安区',606,'220403',3),
+(609,'东丰县',606,'220421',3),
+(610,'东辽县',606,'220422',3),
+(611,'通化市',577,'220500',2),
+(612,'东昌区',611,'220502',3),
+(613,'二道江区',611,'220503',3),
+(614,'通化县',611,'220521',3),
+(615,'辉南县',611,'220523',3),
+(616,'柳河县',611,'220524',3),
+(617,'梅河口市',611,'220581',3),
+(618,'集安市',611,'220582',3),
+(619,'白山市',577,'220600',2),
+(620,'浑江区',619,'220602',3),
+(621,'江源区',619,'220605',3),
+(622,'抚松县',619,'220621',3),
+(623,'靖宇县',619,'220622',3),
+(624,'长白朝鲜族自治县',619,'220623',3),
+(625,'临江市',619,'220681',3),
+(626,'松原市',577,'220700',2),
+(627,'宁江区',626,'220702',3),
+(628,'前郭尔罗斯蒙古族自治县',626,'220721',3),
+(629,'长岭县',626,'220722',3),
+(630,'乾安县',626,'220723',3),
+(631,'扶余市',626,'220781',3),
+(632,'白城市',577,'220800',2),
+(633,'洮北区',632,'220802',3),
+(634,'镇赉县',632,'220821',3),
+(635,'通榆县',632,'220822',3),
+(636,'洮南市',632,'220881',3),
+(637,'大安市',632,'220882',3),
+(638,'延边朝鲜族自治州',577,'222400',2),
+(639,'延吉市',638,'222401',3),
+(640,'图们市',638,'222402',3),
+(641,'敦化市',638,'222403',3),
+(642,'珲春市',638,'222404',3),
+(643,'龙井市',638,'222405',3),
+(644,'和龙市',638,'222406',3),
+(645,'汪清县',638,'222424',3),
+(646,'安图县',638,'222426',3),
+(647,'黑龙江省',0,'230000',1),
+(648,'哈尔滨市',647,'230100',2),
+(649,'道里区',648,'230102',3),
+(650,'南岗区',648,'230103',3),
+(651,'道外区',648,'230104',3),
+(652,'平房区',648,'230108',3),
+(653,'松北区',648,'230109',3),
+(654,'香坊区',648,'230110',3),
+(655,'呼兰区',648,'230111',3),
+(656,'阿城区',648,'230112',3),
+(657,'双城区',648,'230113',3),
+(658,'依兰县',648,'230123',3),
+(659,'方正县',648,'230124',3),
+(660,'宾县',648,'230125',3),
+(661,'巴彦县',648,'230126',3),
+(662,'木兰县',648,'230127',3),
+(663,'通河县',648,'230128',3),
+(664,'延寿县',648,'230129',3),
+(665,'尚志市',648,'230183',3),
+(666,'五常市',648,'230184',3),
+(667,'齐齐哈尔市',647,'230200',2),
+(668,'龙沙区',667,'230202',3),
+(669,'建华区',667,'230203',3),
+(670,'铁锋区',667,'230204',3),
+(671,'昂昂溪区',667,'230205',3),
+(672,'富拉尔基区',667,'230206',3),
+(673,'碾子山区',667,'230207',3),
+(674,'梅里斯达斡尔族区',667,'230208',3),
+(675,'龙江县',667,'230221',3),
+(676,'依安县',667,'230223',3),
+(677,'泰来县',667,'230224',3),
+(678,'甘南县',667,'230225',3),
+(679,'富裕县',667,'230227',3),
+(680,'克山县',667,'230229',3),
+(681,'克东县',667,'230230',3),
+(682,'拜泉县',667,'230231',3),
+(683,'讷河市',667,'230281',3),
+(684,'鸡西市',647,'230300',2),
+(685,'鸡冠区',684,'230302',3),
+(686,'恒山区',684,'230303',3),
+(687,'滴道区',684,'230304',3),
+(688,'梨树区',684,'230305',3),
+(689,'城子河区',684,'230306',3),
+(690,'麻山区',684,'230307',3),
+(691,'鸡东县',684,'230321',3),
+(692,'虎林市',684,'230381',3),
+(693,'密山市',684,'230382',3),
+(694,'鹤岗市',647,'230400',2),
+(695,'向阳区',694,'230402',3),
+(696,'工农区',694,'230403',3),
+(697,'南山区',694,'230404',3),
+(698,'兴安区',694,'230405',3),
+(699,'东山区',694,'230406',3),
+(700,'兴山区',694,'230407',3),
+(701,'萝北县',694,'230421',3),
+(702,'绥滨县',694,'230422',3),
+(703,'双鸭山市',647,'230500',2),
+(704,'尖山区',703,'230502',3),
+(705,'岭东区',703,'230503',3),
+(706,'四方台区',703,'230505',3),
+(707,'宝山区',703,'230506',3),
+(708,'集贤县',703,'230521',3),
+(709,'友谊县',703,'230522',3),
+(710,'宝清县',703,'230523',3),
+(711,'饶河县',703,'230524',3),
+(712,'大庆市',647,'230600',2),
+(713,'萨尔图区',712,'230602',3),
+(714,'龙凤区',712,'230603',3),
+(715,'让胡路区',712,'230604',3),
+(716,'红岗区',712,'230605',3),
+(717,'大同区',712,'230606',3),
+(718,'肇州县',712,'230621',3),
+(719,'肇源县',712,'230622',3),
+(720,'林甸县',712,'230623',3),
+(721,'杜尔伯特蒙古族自治县',712,'230624',3),
+(722,'伊春市',647,'230700',2),
+(723,'伊美区',722,'230717',3),
+(724,'乌翠区',722,'230718',3),
+(725,'友好区',722,'230719',3),
+(726,'嘉荫县',722,'230722',3),
+(727,'汤旺县',722,'230723',3),
+(728,'丰林县',722,'230724',3),
+(729,'大箐山县',722,'230725',3),
+(730,'南岔县',722,'230726',3),
+(731,'金林区',722,'230751',3),
+(732,'铁力市',722,'230781',3),
+(733,'佳木斯市',647,'230800',2),
+(734,'向阳区',733,'230803',3),
+(735,'前进区',733,'230804',3),
+(736,'东风区',733,'230805',3),
+(737,'郊区',733,'230811',3),
+(738,'桦南县',733,'230822',3),
+(739,'桦川县',733,'230826',3),
+(740,'汤原县',733,'230828',3),
+(741,'同江市',733,'230881',3),
+(742,'富锦市',733,'230882',3),
+(743,'抚远市',733,'230883',3),
+(744,'七台河市',647,'230900',2),
+(745,'新兴区',744,'230902',3),
+(746,'桃山区',744,'230903',3),
+(747,'茄子河区',744,'230904',3),
+(748,'勃利县',744,'230921',3),
+(749,'牡丹江市',647,'231000',2),
+(750,'东安区',749,'231002',3),
+(751,'阳明区',749,'231003',3),
+(752,'爱民区',749,'231004',3),
+(753,'西安区',749,'231005',3),
+(754,'林口县',749,'231025',3),
+(755,'绥芬河市',749,'231081',3),
+(756,'海林市',749,'231083',3),
+(757,'宁安市',749,'231084',3),
+(758,'穆棱市',749,'231085',3),
+(759,'东宁市',749,'231086',3),
+(760,'黑河市',647,'231100',2),
+(761,'爱辉区',760,'231102',3),
+(762,'逊克县',760,'231123',3),
+(763,'孙吴县',760,'231124',3),
+(764,'北安市',760,'231181',3),
+(765,'五大连池市',760,'231182',3),
+(766,'嫩江市',760,'231183',3),
+(767,'绥化市',647,'231200',2),
+(768,'北林区',767,'231202',3),
+(769,'望奎县',767,'231221',3),
+(770,'兰西县',767,'231222',3),
+(771,'青冈县',767,'231223',3),
+(772,'庆安县',767,'231224',3),
+(773,'明水县',767,'231225',3),
+(774,'绥棱县',767,'231226',3),
+(775,'安达市',767,'231281',3),
+(776,'肇东市',767,'231282',3),
+(777,'海伦市',767,'231283',3),
+(778,'大兴安岭地区',647,'232700',2),
+(779,'漠河市',778,'232701',3),
+(780,'呼玛县',778,'232721',3),
+(781,'塔河县',778,'232722',3),
+(782,'上海',0,'310000',1),
+(783,'上海市',782,'310010',2),
+(784,'黄浦区',783,'310101',3),
+(785,'徐汇区',783,'310104',3),
+(786,'长宁区',783,'310105',3),
+(787,'静安区',783,'310106',3),
+(788,'普陀区',783,'310107',3),
+(789,'虹口区',783,'310109',3),
+(790,'杨浦区',783,'310110',3),
+(791,'闵行区',783,'310112',3),
+(792,'宝山区',783,'310113',3),
+(793,'嘉定区',783,'310114',3),
+(794,'浦东新区',783,'310115',3),
+(795,'金山区',783,'310116',3),
+(796,'松江区',783,'310117',3),
+(797,'青浦区',783,'310118',3),
+(798,'奉贤区',783,'310120',3),
+(799,'崇明区',783,'310151',3),
+(800,'江苏省',0,'320000',1),
+(801,'南京市',800,'320100',2),
+(802,'玄武区',801,'320102',3),
+(803,'秦淮区',801,'320104',3),
+(804,'建邺区',801,'320105',3),
+(805,'鼓楼区',801,'320106',3),
+(806,'浦口区',801,'320111',3),
+(807,'栖霞区',801,'320113',3),
+(808,'雨花台区',801,'320114',3),
+(809,'江宁区',801,'320115',3),
+(810,'六合区',801,'320116',3),
+(811,'溧水区',801,'320117',3),
+(812,'高淳区',801,'320118',3),
+(813,'无锡市',800,'320200',2),
+(814,'锡山区',813,'320205',3),
+(815,'惠山区',813,'320206',3),
+(816,'滨湖区',813,'320211',3),
+(817,'梁溪区',813,'320213',3),
+(818,'新吴区',813,'320214',3),
+(819,'江阴市',813,'320281',3),
+(820,'宜兴市',813,'320282',3),
+(821,'徐州市',800,'320300',2),
+(822,'鼓楼区',821,'320302',3),
+(823,'云龙区',821,'320303',3),
+(824,'贾汪区',821,'320305',3),
+(825,'泉山区',821,'320311',3),
+(826,'铜山区',821,'320312',3),
+(827,'丰县',821,'320321',3),
+(828,'沛县',821,'320322',3),
+(829,'睢宁县',821,'320324',3),
+(830,'新沂市',821,'320381',3),
+(831,'邳州市',821,'320382',3),
+(832,'常州市',800,'320400',2),
+(833,'天宁区',832,'320402',3),
+(834,'钟楼区',832,'320404',3),
+(835,'新北区',832,'320411',3),
+(836,'武进区',832,'320412',3),
+(837,'金坛区',832,'320413',3),
+(838,'溧阳市',832,'320481',3),
+(839,'苏州市',800,'320500',2),
+(840,'虎丘区',839,'320505',3),
+(841,'吴中区',839,'320506',3),
+(842,'相城区',839,'320507',3),
+(843,'姑苏区',839,'320508',3),
+(844,'吴江区',839,'320509',3),
+(845,'常熟市',839,'320581',3),
+(846,'张家港市',839,'320582',3),
+(847,'昆山市',839,'320583',3),
+(848,'太仓市',839,'320585',3),
+(849,'南通市',800,'320600',2),
+(850,'崇川区',849,'320602',3),
+(851,'港闸区',849,'320611',3),
+(852,'通州区',849,'320612',3),
+(853,'如东县',849,'320623',3),
+(854,'启东市',849,'320681',3),
+(855,'如皋市',849,'320682',3),
+(856,'海门市',849,'320684',3),
+(857,'海安市',849,'320685',3),
+(858,'连云港市',800,'320700',2),
+(859,'连云区',858,'320703',3),
+(860,'海州区',858,'320706',3),
+(861,'赣榆区',858,'320707',3),
+(862,'东海县',858,'320722',3),
+(863,'灌云县',858,'320723',3),
+(864,'灌南县',858,'320724',3),
+(865,'淮安市',800,'320800',2),
+(866,'淮安区',865,'320803',3),
+(867,'淮阴区',865,'320804',3),
+(868,'清江浦区',865,'320812',3),
+(869,'洪泽区',865,'320813',3),
+(870,'涟水县',865,'320826',3),
+(871,'盱眙县',865,'320830',3),
+(872,'金湖县',865,'320831',3),
+(873,'盐城市',800,'320900',2),
+(874,'亭湖区',873,'320902',3),
+(875,'盐都区',873,'320903',3),
+(876,'大丰区',873,'320904',3),
+(877,'响水县',873,'320921',3),
+(878,'滨海县',873,'320922',3),
+(879,'阜宁县',873,'320923',3),
+(880,'射阳县',873,'320924',3),
+(881,'建湖县',873,'320925',3),
+(882,'东台市',873,'320981',3),
+(883,'扬州市',800,'321000',2),
+(884,'广陵区',883,'321002',3),
+(885,'邗江区',883,'321003',3),
+(886,'江都区',883,'321012',3),
+(887,'宝应县',883,'321023',3),
+(888,'仪征市',883,'321081',3),
+(889,'高邮市',883,'321084',3),
+(890,'镇江市',800,'321100',2),
+(891,'京口区',890,'321102',3),
+(892,'润州区',890,'321111',3),
+(893,'丹徒区',890,'321112',3),
+(894,'丹阳市',890,'321181',3),
+(895,'扬中市',890,'321182',3),
+(896,'句容市',890,'321183',3),
+(897,'泰州市',800,'321200',2),
+(898,'海陵区',897,'321202',3),
+(899,'高港区',897,'321203',3),
+(900,'姜堰区',897,'321204',3),
+(901,'兴化市',897,'321281',3),
+(902,'靖江市',897,'321282',3),
+(903,'泰兴市',897,'321283',3),
+(904,'宿迁市',800,'321300',2),
+(905,'宿城区',904,'321302',3),
+(906,'宿豫区',904,'321311',3),
+(907,'沭阳县',904,'321322',3),
+(908,'泗阳县',904,'321323',3),
+(909,'泗洪县',904,'321324',3),
+(910,'浙江省',0,'330000',1),
+(911,'杭州市',910,'330100',2),
+(912,'上城区',911,'330102',3),
+(913,'下城区',911,'330103',3),
+(914,'江干区',911,'330104',3),
+(915,'拱墅区',911,'330105',3),
+(916,'西湖区',911,'330106',3),
+(917,'滨江区',911,'330108',3),
+(918,'萧山区',911,'330109',3),
+(919,'余杭区',911,'330110',3),
+(920,'富阳区',911,'330111',3),
+(921,'临安区',911,'330112',3),
+(922,'桐庐县',911,'330122',3),
+(923,'淳安县',911,'330127',3),
+(924,'建德市',911,'330182',3),
+(925,'宁波市',910,'330200',2),
+(926,'海曙区',925,'330203',3),
+(927,'江北区',925,'330205',3),
+(928,'北仑区',925,'330206',3),
+(929,'镇海区',925,'330211',3),
+(930,'鄞州区',925,'330212',3),
+(931,'奉化区',925,'330213',3),
+(932,'象山县',925,'330225',3),
+(933,'宁海县',925,'330226',3),
+(934,'余姚市',925,'330281',3),
+(935,'慈溪市',925,'330282',3),
+(936,'温州市',910,'330300',2),
+(937,'鹿城区',936,'330302',3),
+(938,'龙湾区',936,'330303',3),
+(939,'瓯海区',936,'330304',3),
+(940,'洞头区',936,'330305',3),
+(941,'永嘉县',936,'330324',3),
+(942,'平阳县',936,'330326',3),
+(943,'苍南县',936,'330327',3),
+(944,'文成县',936,'330328',3),
+(945,'泰顺县',936,'330329',3),
+(946,'瑞安市',936,'330381',3),
+(947,'乐清市',936,'330382',3),
+(948,'龙港市',936,'330383',3),
+(949,'嘉兴市',910,'330400',2),
+(950,'南湖区',949,'330402',3),
+(951,'秀洲区',949,'330411',3),
+(952,'嘉善县',949,'330421',3),
+(953,'海盐县',949,'330424',3),
+(954,'海宁市',949,'330481',3),
+(955,'平湖市',949,'330482',3),
+(956,'桐乡市',949,'330483',3),
+(957,'湖州市',910,'330500',2),
+(958,'吴兴区',957,'330502',3),
+(959,'南浔区',957,'330503',3),
+(960,'德清县',957,'330521',3),
+(961,'长兴县',957,'330522',3),
+(962,'安吉县',957,'330523',3),
+(963,'绍兴市',910,'330600',2),
+(964,'越城区',963,'330602',3),
+(965,'柯桥区',963,'330603',3),
+(966,'上虞区',963,'330604',3),
+(967,'新昌县',963,'330624',3),
+(968,'诸暨市',963,'330681',3),
+(969,'嵊州市',963,'330683',3),
+(970,'金华市',910,'330700',2),
+(971,'婺城区',970,'330702',3),
+(972,'金东区',970,'330703',3),
+(973,'武义县',970,'330723',3),
+(974,'浦江县',970,'330726',3),
+(975,'磐安县',970,'330727',3),
+(976,'兰溪市',970,'330781',3),
+(977,'义乌市',970,'330782',3),
+(978,'东阳市',970,'330783',3),
+(979,'永康市',970,'330784',3),
+(980,'衢州市',910,'330800',2),
+(981,'柯城区',980,'330802',3),
+(982,'衢江区',980,'330803',3),
+(983,'常山县',980,'330822',3),
+(984,'开化县',980,'330824',3),
+(985,'龙游县',980,'330825',3),
+(986,'江山市',980,'330881',3),
+(987,'舟山市',910,'330900',2),
+(988,'定海区',987,'330902',3),
+(989,'普陀区',987,'330903',3),
+(990,'岱山县',987,'330921',3),
+(991,'嵊泗县',987,'330922',3),
+(992,'台州市',910,'331000',2),
+(993,'椒江区',992,'331002',3),
+(994,'黄岩区',992,'331003',3),
+(995,'路桥区',992,'331004',3),
+(996,'三门县',992,'331022',3),
+(997,'天台县',992,'331023',3),
+(998,'仙居县',992,'331024',3),
+(999,'温岭市',992,'331081',3),
+(1000,'临海市',992,'331082',3),
+(1001,'玉环市',992,'331083',3),
+(1002,'丽水市',910,'331100',2),
+(1003,'莲都区',1002,'331102',3),
+(1004,'青田县',1002,'331121',3),
+(1005,'缙云县',1002,'331122',3),
+(1006,'遂昌县',1002,'331123',3),
+(1007,'松阳县',1002,'331124',3),
+(1008,'云和县',1002,'331125',3),
+(1009,'庆元县',1002,'331126',3),
+(1010,'景宁畲族自治县',1002,'331127',3),
+(1011,'龙泉市',1002,'331181',3),
+(1012,'安徽省',0,'340000',1),
+(1013,'合肥市',1012,'340100',2),
+(1014,'瑶海区',1013,'340102',3),
+(1015,'庐阳区',1013,'340103',3),
+(1016,'蜀山区',1013,'340104',3),
+(1017,'包河区',1013,'340111',3),
+(1018,'长丰县',1013,'340121',3),
+(1019,'肥东县',1013,'340122',3),
+(1020,'肥西县',1013,'340123',3),
+(1021,'庐江县',1013,'340124',3),
+(1022,'巢湖市',1013,'340181',3),
+(1023,'芜湖市',1012,'340200',2),
+(1024,'镜湖区',1023,'340202',3),
+(1025,'弋江区',1023,'340203',3),
+(1026,'鸠江区',1023,'340207',3),
+(1027,'三山区',1023,'340208',3),
+(1028,'芜湖县',1023,'340221',3),
+(1029,'繁昌县',1023,'340222',3),
+(1030,'南陵县',1023,'340223',3),
+(1031,'无为市',1023,'340281',3),
+(1032,'蚌埠市',1012,'340300',2),
+(1033,'龙子湖区',1032,'340302',3),
+(1034,'蚌山区',1032,'340303',3),
+(1035,'禹会区',1032,'340304',3),
+(1036,'淮上区',1032,'340311',3),
+(1037,'怀远县',1032,'340321',3),
+(1038,'五河县',1032,'340322',3),
+(1039,'固镇县',1032,'340323',3),
+(1040,'淮南市',1012,'340400',2),
+(1041,'大通区',1040,'340402',3),
+(1042,'田家庵区',1040,'340403',3),
+(1043,'谢家集区',1040,'340404',3),
+(1044,'八公山区',1040,'340405',3),
+(1045,'潘集区',1040,'340406',3),
+(1046,'凤台县',1040,'340421',3),
+(1047,'寿县',1040,'340422',3),
+(1048,'马鞍山市',1012,'340500',2),
+(1049,'花山区',1048,'340503',3),
+(1050,'雨山区',1048,'340504',3),
+(1051,'博望区',1048,'340506',3),
+(1052,'当涂县',1048,'340521',3),
+(1053,'含山县',1048,'340522',3),
+(1054,'和县',1048,'340523',3),
+(1055,'淮北市',1012,'340600',2),
+(1056,'杜集区',1055,'340602',3),
+(1057,'相山区',1055,'340603',3),
+(1058,'烈山区',1055,'340604',3),
+(1059,'濉溪县',1055,'340621',3),
+(1060,'铜陵市',1012,'340700',2),
+(1061,'铜官区',1060,'340705',3),
+(1062,'义安区',1060,'340706',3),
+(1063,'郊区',1060,'340711',3),
+(1064,'枞阳县',1060,'340722',3),
+(1065,'安庆市',1012,'340800',2),
+(1066,'迎江区',1065,'340802',3),
+(1067,'大观区',1065,'340803',3),
+(1068,'宜秀区',1065,'340811',3),
+(1069,'怀宁县',1065,'340822',3),
+(1070,'太湖县',1065,'340825',3),
+(1071,'宿松县',1065,'340826',3),
+(1072,'望江县',1065,'340827',3),
+(1073,'岳西县',1065,'340828',3),
+(1074,'桐城市',1065,'340881',3),
+(1075,'潜山市',1065,'340882',3),
+(1076,'黄山市',1012,'341000',2),
+(1077,'屯溪区',1076,'341002',3),
+(1078,'黄山区',1076,'341003',3),
+(1079,'徽州区',1076,'341004',3),
+(1080,'歙县',1076,'341021',3),
+(1081,'休宁县',1076,'341022',3),
+(1082,'黟县',1076,'341023',3),
+(1083,'祁门县',1076,'341024',3),
+(1084,'滁州市',1012,'341100',2),
+(1085,'琅琊区',1084,'341102',3),
+(1086,'南谯区',1084,'341103',3),
+(1087,'来安县',1084,'341122',3),
+(1088,'全椒县',1084,'341124',3),
+(1089,'定远县',1084,'341125',3),
+(1090,'凤阳县',1084,'341126',3),
+(1091,'天长市',1084,'341181',3),
+(1092,'明光市',1084,'341182',3),
+(1093,'阜阳市',1012,'341200',2),
+(1094,'颍州区',1093,'341202',3),
+(1095,'颍东区',1093,'341203',3),
+(1096,'颍泉区',1093,'341204',3),
+(1097,'临泉县',1093,'341221',3),
+(1098,'太和县',1093,'341222',3),
+(1099,'阜南县',1093,'341225',3),
+(1100,'颍上县',1093,'341226',3),
+(1101,'界首市',1093,'341282',3),
+(1102,'宿州市',1012,'341300',2),
+(1103,'埇桥区',1102,'341302',3),
+(1104,'砀山县',1102,'341321',3),
+(1105,'萧县',1102,'341322',3),
+(1106,'灵璧县',1102,'341323',3),
+(1107,'泗县',1102,'341324',3),
+(1108,'六安市',1012,'341500',2),
+(1109,'金安区',1108,'341502',3),
+(1110,'裕安区',1108,'341503',3),
+(1111,'叶集区',1108,'341504',3),
+(1112,'霍邱县',1108,'341522',3),
+(1113,'舒城县',1108,'341523',3),
+(1114,'金寨县',1108,'341524',3),
+(1115,'霍山县',1108,'341525',3),
+(1116,'亳州市',1012,'341600',2),
+(1117,'谯城区',1116,'341602',3),
+(1118,'涡阳县',1116,'341621',3),
+(1119,'蒙城县',1116,'341622',3),
+(1120,'利辛县',1116,'341623',3),
+(1121,'池州市',1012,'341700',2),
+(1122,'贵池区',1121,'341702',3),
+(1123,'东至县',1121,'341721',3),
+(1124,'石台县',1121,'341722',3),
+(1125,'青阳县',1121,'341723',3),
+(1126,'宣城市',1012,'341800',2),
+(1127,'宣州区',1126,'341802',3),
+(1128,'郎溪县',1126,'341821',3),
+(1129,'泾县',1126,'341823',3),
+(1130,'绩溪县',1126,'341824',3),
+(1131,'旌德县',1126,'341825',3),
+(1132,'宁国市',1126,'341881',3),
+(1133,'广德市',1126,'341882',3),
+(1134,'福建省',0,'350000',1),
+(1135,'福州市',1134,'350100',2),
+(1136,'鼓楼区',1135,'350102',3),
+(1137,'台江区',1135,'350103',3),
+(1138,'仓山区',1135,'350104',3),
+(1139,'马尾区',1135,'350105',3),
+(1140,'晋安区',1135,'350111',3),
+(1141,'长乐区',1135,'350112',3),
+(1142,'闽侯县',1135,'350121',3),
+(1143,'连江县',1135,'350122',3),
+(1144,'罗源县',1135,'350123',3),
+(1145,'闽清县',1135,'350124',3),
+(1146,'永泰县',1135,'350125',3),
+(1147,'平潭县',1135,'350128',3),
+(1148,'福清市',1135,'350181',3),
+(1149,'厦门市',1134,'350200',2),
+(1150,'思明区',1149,'350203',3),
+(1151,'海沧区',1149,'350205',3),
+(1152,'湖里区',1149,'350206',3),
+(1153,'集美区',1149,'350211',3),
+(1154,'同安区',1149,'350212',3),
+(1155,'翔安区',1149,'350213',3),
+(1156,'莆田市',1134,'350300',2),
+(1157,'城厢区',1156,'350302',3),
+(1158,'涵江区',1156,'350303',3),
+(1159,'荔城区',1156,'350304',3),
+(1160,'秀屿区',1156,'350305',3),
+(1161,'仙游县',1156,'350322',3),
+(1162,'三明市',1134,'350400',2),
+(1163,'梅列区',1162,'350402',3),
+(1164,'三元区',1162,'350403',3),
+(1165,'明溪县',1162,'350421',3),
+(1166,'清流县',1162,'350423',3),
+(1167,'宁化县',1162,'350424',3),
+(1168,'大田县',1162,'350425',3),
+(1169,'尤溪县',1162,'350426',3),
+(1170,'沙县',1162,'350427',3),
+(1171,'将乐县',1162,'350428',3),
+(1172,'泰宁县',1162,'350429',3),
+(1173,'建宁县',1162,'350430',3),
+(1174,'永安市',1162,'350481',3),
+(1175,'泉州市',1134,'350500',2),
+(1176,'鲤城区',1175,'350502',3),
+(1177,'丰泽区',1175,'350503',3),
+(1178,'洛江区',1175,'350504',3),
+(1179,'泉港区',1175,'350505',3),
+(1180,'惠安县',1175,'350521',3),
+(1181,'安溪县',1175,'350524',3),
+(1182,'永春县',1175,'350525',3),
+(1183,'德化县',1175,'350526',3),
+(1184,'金门县',1175,'350527',3),
+(1185,'石狮市',1175,'350581',3),
+(1186,'晋江市',1175,'350582',3),
+(1187,'南安市',1175,'350583',3),
+(1188,'漳州市',1134,'350600',2),
+(1189,'芗城区',1188,'350602',3),
+(1190,'龙文区',1188,'350603',3),
+(1191,'云霄县',1188,'350622',3),
+(1192,'漳浦县',1188,'350623',3),
+(1193,'诏安县',1188,'350624',3),
+(1194,'长泰县',1188,'350625',3),
+(1195,'东山县',1188,'350626',3),
+(1196,'南靖县',1188,'350627',3),
+(1197,'平和县',1188,'350628',3),
+(1198,'华安县',1188,'350629',3),
+(1199,'龙海市',1188,'350681',3),
+(1200,'南平市',1134,'350700',2),
+(1201,'延平区',1200,'350702',3),
+(1202,'建阳区',1200,'350703',3),
+(1203,'顺昌县',1200,'350721',3),
+(1204,'浦城县',1200,'350722',3),
+(1205,'光泽县',1200,'350723',3),
+(1206,'松溪县',1200,'350724',3),
+(1207,'政和县',1200,'350725',3),
+(1208,'邵武市',1200,'350781',3),
+(1209,'武夷山市',1200,'350782',3),
+(1210,'建瓯市',1200,'350783',3),
+(1211,'龙岩市',1134,'350800',2),
+(1212,'新罗区',1211,'350802',3),
+(1213,'永定区',1211,'350803',3),
+(1214,'长汀县',1211,'350821',3),
+(1215,'上杭县',1211,'350823',3),
+(1216,'武平县',1211,'350824',3),
+(1217,'连城县',1211,'350825',3),
+(1218,'漳平市',1211,'350881',3),
+(1219,'宁德市',1134,'350900',2),
+(1220,'蕉城区',1219,'350902',3),
+(1221,'霞浦县',1219,'350921',3),
+(1222,'古田县',1219,'350922',3),
+(1223,'屏南县',1219,'350923',3),
+(1224,'寿宁县',1219,'350924',3),
+(1225,'周宁县',1219,'350925',3),
+(1226,'柘荣县',1219,'350926',3),
+(1227,'福安市',1219,'350981',3),
+(1228,'福鼎市',1219,'350982',3),
+(1229,'江西省',0,'360000',1),
+(1230,'南昌市',1229,'360100',2),
+(1231,'东湖区',1230,'360102',3),
+(1232,'西湖区',1230,'360103',3),
+(1233,'青云谱区',1230,'360104',3),
+(1234,'青山湖区',1230,'360111',3),
+(1235,'新建区',1230,'360112',3),
+(1236,'红谷滩区',1230,'360113',3),
+(1237,'南昌县',1230,'360121',3),
+(1238,'安义县',1230,'360123',3),
+(1239,'进贤县',1230,'360124',3),
+(1240,'景德镇市',1229,'360200',2),
+(1241,'昌江区',1240,'360202',3),
+(1242,'珠山区',1240,'360203',3),
+(1243,'浮梁县',1240,'360222',3),
+(1244,'乐平市',1240,'360281',3),
+(1245,'萍乡市',1229,'360300',2),
+(1246,'安源区',1245,'360302',3),
+(1247,'湘东区',1245,'360313',3),
+(1248,'莲花县',1245,'360321',3),
+(1249,'上栗县',1245,'360322',3),
+(1250,'芦溪县',1245,'360323',3),
+(1251,'九江市',1229,'360400',2),
+(1252,'濂溪区',1251,'360402',3),
+(1253,'浔阳区',1251,'360403',3),
+(1254,'柴桑区',1251,'360404',3),
+(1255,'武宁县',1251,'360423',3),
+(1256,'修水县',1251,'360424',3),
+(1257,'永修县',1251,'360425',3),
+(1258,'德安县',1251,'360426',3),
+(1259,'都昌县',1251,'360428',3),
+(1260,'湖口县',1251,'360429',3),
+(1261,'彭泽县',1251,'360430',3),
+(1262,'瑞昌市',1251,'360481',3),
+(1263,'共青城市',1251,'360482',3),
+(1264,'庐山市',1251,'360483',3),
+(1265,'新余市',1229,'360500',2),
+(1266,'渝水区',1265,'360502',3),
+(1267,'分宜县',1265,'360521',3),
+(1268,'鹰潭市',1229,'360600',2),
+(1269,'月湖区',1268,'360602',3),
+(1270,'余江区',1268,'360603',3),
+(1271,'贵溪市',1268,'360681',3),
+(1272,'赣州市',1229,'360700',2),
+(1273,'章贡区',1272,'360702',3),
+(1274,'南康区',1272,'360703',3),
+(1275,'赣县区',1272,'360704',3),
+(1276,'信丰县',1272,'360722',3),
+(1277,'大余县',1272,'360723',3),
+(1278,'上犹县',1272,'360724',3),
+(1279,'崇义县',1272,'360725',3),
+(1280,'安远县',1272,'360726',3),
+(1281,'龙南县',1272,'360727',3),
+(1282,'定南县',1272,'360728',3),
+(1283,'全南县',1272,'360729',3),
+(1284,'宁都县',1272,'360730',3),
+(1285,'于都县',1272,'360731',3),
+(1286,'兴国县',1272,'360732',3),
+(1287,'会昌县',1272,'360733',3),
+(1288,'寻乌县',1272,'360734',3),
+(1289,'石城县',1272,'360735',3),
+(1290,'瑞金市',1272,'360781',3),
+(1291,'吉安市',1229,'360800',2),
+(1292,'吉州区',1291,'360802',3),
+(1293,'青原区',1291,'360803',3),
+(1294,'吉安县',1291,'360821',3),
+(1295,'吉水县',1291,'360822',3),
+(1296,'峡江县',1291,'360823',3),
+(1297,'新干县',1291,'360824',3),
+(1298,'永丰县',1291,'360825',3),
+(1299,'泰和县',1291,'360826',3),
+(1300,'遂川县',1291,'360827',3),
+(1301,'万安县',1291,'360828',3),
+(1302,'安福县',1291,'360829',3),
+(1303,'永新县',1291,'360830',3),
+(1304,'井冈山市',1291,'360881',3),
+(1305,'宜春市',1229,'360900',2),
+(1306,'袁州区',1305,'360902',3),
+(1307,'奉新县',1305,'360921',3),
+(1308,'万载县',1305,'360922',3),
+(1309,'上高县',1305,'360923',3),
+(1310,'宜丰县',1305,'360924',3),
+(1311,'靖安县',1305,'360925',3),
+(1312,'铜鼓县',1305,'360926',3),
+(1313,'丰城市',1305,'360981',3),
+(1314,'樟树市',1305,'360982',3),
+(1315,'高安市',1305,'360983',3),
+(1316,'抚州市',1229,'361000',2),
+(1317,'临川区',1316,'361002',3),
+(1318,'东乡区',1316,'361003',3),
+(1319,'南城县',1316,'361021',3),
+(1320,'黎川县',1316,'361022',3),
+(1321,'南丰县',1316,'361023',3),
+(1322,'崇仁县',1316,'361024',3),
+(1323,'乐安县',1316,'361025',3),
+(1324,'宜黄县',1316,'361026',3),
+(1325,'金溪县',1316,'361027',3),
+(1326,'资溪县',1316,'361028',3),
+(1327,'广昌县',1316,'361030',3),
+(1328,'上饶市',1229,'361100',2),
+(1329,'信州区',1328,'361102',3),
+(1330,'广丰区',1328,'361103',3),
+(1331,'广信区',1328,'361104',3),
+(1332,'玉山县',1328,'361123',3),
+(1333,'铅山县',1328,'361124',3),
+(1334,'横峰县',1328,'361125',3),
+(1335,'弋阳县',1328,'361126',3),
+(1336,'余干县',1328,'361127',3),
+(1337,'鄱阳县',1328,'361128',3),
+(1338,'万年县',1328,'361129',3),
+(1339,'婺源县',1328,'361130',3),
+(1340,'德兴市',1328,'361181',3),
+(1341,'山东省',0,'370000',1),
+(1342,'济南市',1341,'370100',2),
+(1343,'历下区',1342,'370102',3),
+(1344,'市中区',1342,'370103',3),
+(1345,'槐荫区',1342,'370104',3),
+(1346,'天桥区',1342,'370105',3),
+(1347,'历城区',1342,'370112',3),
+(1348,'长清区',1342,'370113',3),
+(1349,'章丘区',1342,'370114',3),
+(1350,'济阳区',1342,'370115',3),
+(1351,'莱芜区',1342,'370116',3),
+(1352,'钢城区',1342,'370117',3),
+(1353,'平阴县',1342,'370124',3),
+(1354,'商河县',1342,'370126',3),
+(1355,'青岛市',1341,'370200',2),
+(1356,'市南区',1355,'370202',3),
+(1357,'市北区',1355,'370203',3),
+(1358,'黄岛区',1355,'370211',3),
+(1359,'崂山区',1355,'370212',3),
+(1360,'李沧区',1355,'370213',3),
+(1361,'城阳区',1355,'370214',3),
+(1362,'即墨区',1355,'370215',3),
+(1363,'胶州市',1355,'370281',3),
+(1364,'平度市',1355,'370283',3),
+(1365,'莱西市',1355,'370285',3),
+(1366,'淄博市',1341,'370300',2),
+(1367,'淄川区',1366,'370302',3),
+(1368,'张店区',1366,'370303',3),
+(1369,'博山区',1366,'370304',3),
+(1370,'临淄区',1366,'370305',3),
+(1371,'周村区',1366,'370306',3),
+(1372,'桓台县',1366,'370321',3),
+(1373,'高青县',1366,'370322',3),
+(1374,'沂源县',1366,'370323',3),
+(1375,'枣庄市',1341,'370400',2),
+(1376,'市中区',1375,'370402',3),
+(1377,'薛城区',1375,'370403',3),
+(1378,'峄城区',1375,'370404',3),
+(1379,'台儿庄区',1375,'370405',3),
+(1380,'山亭区',1375,'370406',3),
+(1381,'滕州市',1375,'370481',3),
+(1382,'东营市',1341,'370500',2),
+(1383,'东营区',1382,'370502',3),
+(1384,'河口区',1382,'370503',3),
+(1385,'垦利区',1382,'370505',3),
+(1386,'利津县',1382,'370522',3),
+(1387,'广饶县',1382,'370523',3),
+(1388,'烟台市',1341,'370600',2),
+(1389,'芝罘区',1388,'370602',3),
+(1390,'福山区',1388,'370611',3),
+(1391,'牟平区',1388,'370612',3),
+(1392,'莱山区',1388,'370613',3),
+(1393,'长岛县',1388,'370634',3),
+(1394,'龙口市',1388,'370681',3),
+(1395,'莱阳市',1388,'370682',3),
+(1396,'莱州市',1388,'370683',3),
+(1397,'蓬莱市',1388,'370684',3),
+(1398,'招远市',1388,'370685',3),
+(1399,'栖霞市',1388,'370686',3),
+(1400,'海阳市',1388,'370687',3),
+(1401,'潍坊市',1341,'370700',2),
+(1402,'潍城区',1401,'370702',3),
+(1403,'寒亭区',1401,'370703',3),
+(1404,'坊子区',1401,'370704',3),
+(1405,'奎文区',1401,'370705',3),
+(1406,'临朐县',1401,'370724',3),
+(1407,'昌乐县',1401,'370725',3),
+(1408,'青州市',1401,'370781',3),
+(1409,'诸城市',1401,'370782',3),
+(1410,'寿光市',1401,'370783',3),
+(1411,'安丘市',1401,'370784',3),
+(1412,'高密市',1401,'370785',3),
+(1413,'昌邑市',1401,'370786',3),
+(1414,'济宁市',1341,'370800',2),
+(1415,'任城区',1414,'370811',3),
+(1416,'兖州区',1414,'370812',3),
+(1417,'微山县',1414,'370826',3),
+(1418,'鱼台县',1414,'370827',3),
+(1419,'金乡县',1414,'370828',3),
+(1420,'嘉祥县',1414,'370829',3),
+(1421,'汶上县',1414,'370830',3),
+(1422,'泗水县',1414,'370831',3),
+(1423,'梁山县',1414,'370832',3),
+(1424,'曲阜市',1414,'370881',3),
+(1425,'邹城市',1414,'370883',3),
+(1426,'泰安市',1341,'370900',2),
+(1427,'泰山区',1426,'370902',3),
+(1428,'岱岳区',1426,'370911',3),
+(1429,'宁阳县',1426,'370921',3),
+(1430,'东平县',1426,'370923',3),
+(1431,'新泰市',1426,'370982',3),
+(1432,'肥城市',1426,'370983',3),
+(1433,'威海市',1341,'371000',2),
+(1434,'环翠区',1433,'371002',3),
+(1435,'文登区',1433,'371003',3),
+(1436,'荣成市',1433,'371082',3),
+(1437,'乳山市',1433,'371083',3),
+(1438,'日照市',1341,'371100',2),
+(1439,'东港区',1438,'371102',3),
+(1440,'岚山区',1438,'371103',3),
+(1441,'五莲县',1438,'371121',3),
+(1442,'莒县',1438,'371122',3),
+(1443,'临沂市',1341,'371300',2),
+(1444,'兰山区',1443,'371302',3),
+(1445,'罗庄区',1443,'371311',3),
+(1446,'河东区',1443,'371312',3),
+(1447,'沂南县',1443,'371321',3),
+(1448,'郯城县',1443,'371322',3),
+(1449,'沂水县',1443,'371323',3),
+(1450,'兰陵县',1443,'371324',3),
+(1451,'费县',1443,'371325',3),
+(1452,'平邑县',1443,'371326',3),
+(1453,'莒南县',1443,'371327',3),
+(1454,'蒙阴县',1443,'371328',3),
+(1455,'临沭县',1443,'371329',3),
+(1456,'德州市',1341,'371400',2),
+(1457,'德城区',1456,'371402',3),
+(1458,'陵城区',1456,'371403',3),
+(1459,'宁津县',1456,'371422',3),
+(1460,'庆云县',1456,'371423',3),
+(1461,'临邑县',1456,'371424',3),
+(1462,'齐河县',1456,'371425',3),
+(1463,'平原县',1456,'371426',3),
+(1464,'夏津县',1456,'371427',3),
+(1465,'武城县',1456,'371428',3),
+(1466,'乐陵市',1456,'371481',3),
+(1467,'禹城市',1456,'371482',3),
+(1468,'聊城市',1341,'371500',2),
+(1469,'东昌府区',1468,'371502',3),
+(1470,'茌平区',1468,'371503',3),
+(1471,'阳谷县',1468,'371521',3),
+(1472,'莘县',1468,'371522',3),
+(1473,'东阿县',1468,'371524',3),
+(1474,'冠县',1468,'371525',3),
+(1475,'高唐县',1468,'371526',3),
+(1476,'临清市',1468,'371581',3),
+(1477,'滨州市',1341,'371600',2),
+(1478,'滨城区',1477,'371602',3),
+(1479,'沾化区',1477,'371603',3),
+(1480,'惠民县',1477,'371621',3),
+(1481,'阳信县',1477,'371622',3),
+(1482,'无棣县',1477,'371623',3),
+(1483,'博兴县',1477,'371625',3),
+(1484,'邹平市',1477,'371681',3),
+(1485,'菏泽市',1341,'371700',2),
+(1486,'牡丹区',1485,'371702',3),
+(1487,'定陶区',1485,'371703',3),
+(1488,'曹县',1485,'371721',3),
+(1489,'单县',1485,'371722',3),
+(1490,'成武县',1485,'371723',3),
+(1491,'巨野县',1485,'371724',3),
+(1492,'郓城县',1485,'371725',3),
+(1493,'鄄城县',1485,'371726',3),
+(1494,'东明县',1485,'371728',3),
+(1495,'河南省',0,'410000',1),
+(1496,'郑州市',1495,'410100',2),
+(1497,'中原区',1496,'410102',3),
+(1498,'二七区',1496,'410103',3),
+(1499,'管城回族区',1496,'410104',3),
+(1500,'金水区',1496,'410105',3),
+(1501,'上街区',1496,'410106',3),
+(1502,'惠济区',1496,'410108',3),
+(1503,'中牟县',1496,'410122',3),
+(1504,'巩义市',1496,'410181',3),
+(1505,'荥阳市',1496,'410182',3),
+(1506,'新密市',1496,'410183',3),
+(1507,'新郑市',1496,'410184',3),
+(1508,'登封市',1496,'410185',3),
+(1509,'开封市',1495,'410200',2),
+(1510,'龙亭区',1509,'410202',3),
+(1511,'顺河回族区',1509,'410203',3),
+(1512,'鼓楼区',1509,'410204',3),
+(1513,'禹王台区',1509,'410205',3),
+(1514,'祥符区',1509,'410212',3),
+(1515,'杞县',1509,'410221',3),
+(1516,'通许县',1509,'410222',3),
+(1517,'尉氏县',1509,'410223',3),
+(1518,'兰考县',1509,'410225',3),
+(1519,'洛阳市',1495,'410300',2),
+(1520,'老城区',1519,'410302',3),
+(1521,'西工区',1519,'410303',3),
+(1522,'瀍河回族区',1519,'410304',3),
+(1523,'涧西区',1519,'410305',3),
+(1524,'吉利区',1519,'410306',3),
+(1525,'洛龙区',1519,'410311',3),
+(1526,'孟津县',1519,'410322',3),
+(1527,'新安县',1519,'410323',3),
+(1528,'栾川县',1519,'410324',3),
+(1529,'嵩县',1519,'410325',3),
+(1530,'汝阳县',1519,'410326',3),
+(1531,'宜阳县',1519,'410327',3),
+(1532,'洛宁县',1519,'410328',3),
+(1533,'伊川县',1519,'410329',3),
+(1534,'偃师市',1519,'410381',3),
+(1535,'平顶山市',1495,'410400',2),
+(1536,'新华区',1535,'410402',3),
+(1537,'卫东区',1535,'410403',3),
+(1538,'石龙区',1535,'410404',3),
+(1539,'湛河区',1535,'410411',3),
+(1540,'宝丰县',1535,'410421',3),
+(1541,'叶县',1535,'410422',3),
+(1542,'鲁山县',1535,'410423',3),
+(1543,'郏县',1535,'410425',3),
+(1544,'舞钢市',1535,'410481',3),
+(1545,'汝州市',1535,'410482',3),
+(1546,'安阳市',1495,'410500',2),
+(1547,'文峰区',1546,'410502',3),
+(1548,'北关区',1546,'410503',3),
+(1549,'殷都区',1546,'410505',3),
+(1550,'龙安区',1546,'410506',3),
+(1551,'安阳县',1546,'410522',3),
+(1552,'汤阴县',1546,'410523',3),
+(1553,'滑县',1546,'410526',3),
+(1554,'内黄县',1546,'410527',3),
+(1555,'林州市',1546,'410581',3),
+(1556,'鹤壁市',1495,'410600',2),
+(1557,'鹤山区',1556,'410602',3),
+(1558,'山城区',1556,'410603',3),
+(1559,'淇滨区',1556,'410611',3),
+(1560,'浚县',1556,'410621',3),
+(1561,'淇县',1556,'410622',3),
+(1562,'新乡市',1495,'410700',2),
+(1563,'红旗区',1562,'410702',3),
+(1564,'卫滨区',1562,'410703',3),
+(1565,'凤泉区',1562,'410704',3),
+(1566,'牧野区',1562,'410711',3),
+(1567,'新乡县',1562,'410721',3),
+(1568,'获嘉县',1562,'410724',3),
+(1569,'原阳县',1562,'410725',3),
+(1570,'延津县',1562,'410726',3),
+(1571,'封丘县',1562,'410727',3),
+(1572,'卫辉市',1562,'410781',3),
+(1573,'辉县市',1562,'410782',3),
+(1574,'长垣市',1562,'410783',3),
+(1575,'焦作市',1495,'410800',2),
+(1576,'解放区',1575,'410802',3),
+(1577,'中站区',1575,'410803',3),
+(1578,'马村区',1575,'410804',3),
+(1579,'山阳区',1575,'410811',3),
+(1580,'修武县',1575,'410821',3),
+(1581,'博爱县',1575,'410822',3),
+(1582,'武陟县',1575,'410823',3),
+(1583,'温县',1575,'410825',3),
+(1584,'沁阳市',1575,'410882',3),
+(1585,'孟州市',1575,'410883',3),
+(1586,'濮阳市',1495,'410900',2),
+(1587,'华龙区',1586,'410902',3),
+(1588,'清丰县',1586,'410922',3),
+(1589,'南乐县',1586,'410923',3),
+(1590,'范县',1586,'410926',3),
+(1591,'台前县',1586,'410927',3),
+(1592,'濮阳县',1586,'410928',3),
+(1593,'许昌市',1495,'411000',2),
+(1594,'魏都区',1593,'411002',3),
+(1595,'建安区',1593,'411003',3),
+(1596,'鄢陵县',1593,'411024',3),
+(1597,'襄城县',1593,'411025',3),
+(1598,'禹州市',1593,'411081',3),
+(1599,'长葛市',1593,'411082',3),
+(1600,'漯河市',1495,'411100',2),
+(1601,'源汇区',1600,'411102',3),
+(1602,'郾城区',1600,'411103',3),
+(1603,'召陵区',1600,'411104',3),
+(1604,'舞阳县',1600,'411121',3),
+(1605,'临颍县',1600,'411122',3),
+(1606,'三门峡市',1495,'411200',2),
+(1607,'湖滨区',1606,'411202',3),
+(1608,'陕州区',1606,'411203',3),
+(1609,'渑池县',1606,'411221',3),
+(1610,'卢氏县',1606,'411224',3),
+(1611,'义马市',1606,'411281',3),
+(1612,'灵宝市',1606,'411282',3),
+(1613,'南阳市',1495,'411300',2),
+(1614,'宛城区',1613,'411302',3),
+(1615,'卧龙区',1613,'411303',3),
+(1616,'南召县',1613,'411321',3),
+(1617,'方城县',1613,'411322',3),
+(1618,'西峡县',1613,'411323',3),
+(1619,'镇平县',1613,'411324',3),
+(1620,'内乡县',1613,'411325',3),
+(1621,'淅川县',1613,'411326',3),
+(1622,'社旗县',1613,'411327',3),
+(1623,'唐河县',1613,'411328',3),
+(1624,'新野县',1613,'411329',3),
+(1625,'桐柏县',1613,'411330',3),
+(1626,'邓州市',1613,'411381',3),
+(1627,'商丘市',1495,'411400',2),
+(1628,'梁园区',1627,'411402',3),
+(1629,'睢阳区',1627,'411403',3),
+(1630,'民权县',1627,'411421',3),
+(1631,'睢县',1627,'411422',3),
+(1632,'宁陵县',1627,'411423',3),
+(1633,'柘城县',1627,'411424',3),
+(1634,'虞城县',1627,'411425',3),
+(1635,'夏邑县',1627,'411426',3),
+(1636,'永城市',1627,'411481',3),
+(1637,'信阳市',1495,'411500',2),
+(1638,'浉河区',1637,'411502',3),
+(1639,'平桥区',1637,'411503',3),
+(1640,'罗山县',1637,'411521',3),
+(1641,'光山县',1637,'411522',3),
+(1642,'新县',1637,'411523',3),
+(1643,'商城县',1637,'411524',3),
+(1644,'固始县',1637,'411525',3),
+(1645,'潢川县',1637,'411526',3),
+(1646,'淮滨县',1637,'411527',3),
+(1647,'息县',1637,'411528',3),
+(1648,'周口市',1495,'411600',2),
+(1649,'川汇区',1648,'411602',3),
+(1650,'淮阳区',1648,'411603',3),
+(1651,'扶沟县',1648,'411621',3),
+(1652,'西华县',1648,'411622',3),
+(1653,'商水县',1648,'411623',3),
+(1654,'沈丘县',1648,'411624',3),
+(1655,'郸城县',1648,'411625',3),
+(1656,'太康县',1648,'411627',3),
+(1657,'鹿邑县',1648,'411628',3),
+(1658,'项城市',1648,'411681',3),
+(1659,'驻马店市',1495,'411700',2),
+(1660,'驿城区',1659,'411702',3),
+(1661,'西平县',1659,'411721',3),
+(1662,'上蔡县',1659,'411722',3),
+(1663,'平舆县',1659,'411723',3),
+(1664,'正阳县',1659,'411724',3),
+(1665,'确山县',1659,'411725',3),
+(1666,'泌阳县',1659,'411726',3),
+(1667,'汝南县',1659,'411727',3),
+(1668,'遂平县',1659,'411728',3),
+(1669,'新蔡县',1659,'411729',3),
+(1670,'济源市',1495,'419001',3),
+(1671,'湖北省',0,'420000',1),
+(1672,'武汉市',1671,'420100',2),
+(1673,'江岸区',1672,'420102',3),
+(1674,'江汉区',1672,'420103',3),
+(1675,'硚口区',1672,'420104',3),
+(1676,'汉阳区',1672,'420105',3),
+(1677,'武昌区',1672,'420106',3),
+(1678,'青山区',1672,'420107',3),
+(1679,'洪山区',1672,'420111',3),
+(1680,'东西湖区',1672,'420112',3),
+(1681,'汉南区',1672,'420113',3),
+(1682,'蔡甸区',1672,'420114',3),
+(1683,'江夏区',1672,'420115',3),
+(1684,'黄陂区',1672,'420116',3),
+(1685,'新洲区',1672,'420117',3),
+(1686,'黄石市',1671,'420200',2),
+(1687,'黄石港区',1686,'420202',3),
+(1688,'西塞山区',1686,'420203',3),
+(1689,'下陆区',1686,'420204',3),
+(1690,'铁山区',1686,'420205',3),
+(1691,'阳新县',1686,'420222',3),
+(1692,'大冶市',1686,'420281',3),
+(1693,'十堰市',1671,'420300',2),
+(1694,'茅箭区',1693,'420302',3),
+(1695,'张湾区',1693,'420303',3),
+(1696,'郧阳区',1693,'420304',3),
+(1697,'郧西县',1693,'420322',3),
+(1698,'竹山县',1693,'420323',3),
+(1699,'竹溪县',1693,'420324',3),
+(1700,'房县',1693,'420325',3),
+(1701,'丹江口市',1693,'420381',3),
+(1702,'宜昌市',1671,'420500',2),
+(1703,'西陵区',1702,'420502',3),
+(1704,'伍家岗区',1702,'420503',3),
+(1705,'点军区',1702,'420504',3),
+(1706,'猇亭区',1702,'420505',3),
+(1707,'夷陵区',1702,'420506',3),
+(1708,'远安县',1702,'420525',3),
+(1709,'兴山县',1702,'420526',3),
+(1710,'秭归县',1702,'420527',3),
+(1711,'长阳土家族自治县',1702,'420528',3),
+(1712,'五峰土家族自治县',1702,'420529',3),
+(1713,'宜都市',1702,'420581',3),
+(1714,'当阳市',1702,'420582',3),
+(1715,'枝江市',1702,'420583',3),
+(1716,'襄阳市',1671,'420600',2),
+(1717,'襄城区',1716,'420602',3),
+(1718,'樊城区',1716,'420606',3),
+(1719,'襄州区',1716,'420607',3),
+(1720,'南漳县',1716,'420624',3),
+(1721,'谷城县',1716,'420625',3),
+(1722,'保康县',1716,'420626',3),
+(1723,'老河口市',1716,'420682',3),
+(1724,'枣阳市',1716,'420683',3),
+(1725,'宜城市',1716,'420684',3),
+(1726,'鄂州市',1671,'420700',2),
+(1727,'梁子湖区',1726,'420702',3),
+(1728,'华容区',1726,'420703',3),
+(1729,'鄂城区',1726,'420704',3),
+(1730,'荆门市',1671,'420800',2),
+(1731,'东宝区',1730,'420802',3),
+(1732,'掇刀区',1730,'420804',3),
+(1733,'沙洋县',1730,'420822',3),
+(1734,'钟祥市',1730,'420881',3),
+(1735,'京山市',1730,'420882',3),
+(1736,'孝感市',1671,'420900',2),
+(1737,'孝南区',1736,'420902',3),
+(1738,'孝昌县',1736,'420921',3),
+(1739,'大悟县',1736,'420922',3),
+(1740,'云梦县',1736,'420923',3),
+(1741,'应城市',1736,'420981',3),
+(1742,'安陆市',1736,'420982',3),
+(1743,'汉川市',1736,'420984',3),
+(1744,'荆州市',1671,'421000',2),
+(1745,'沙市区',1744,'421002',3),
+(1746,'荆州区',1744,'421003',3),
+(1747,'公安县',1744,'421022',3),
+(1748,'监利县',1744,'421023',3),
+(1749,'江陵县',1744,'421024',3),
+(1750,'石首市',1744,'421081',3),
+(1751,'洪湖市',1744,'421083',3),
+(1752,'松滋市',1744,'421087',3),
+(1753,'黄冈市',1671,'421100',2),
+(1754,'黄州区',1753,'421102',3),
+(1755,'团风县',1753,'421121',3),
+(1756,'红安县',1753,'421122',3),
+(1757,'罗田县',1753,'421123',3),
+(1758,'英山县',1753,'421124',3),
+(1759,'浠水县',1753,'421125',3),
+(1760,'蕲春县',1753,'421126',3),
+(1761,'黄梅县',1753,'421127',3),
+(1762,'麻城市',1753,'421181',3),
+(1763,'武穴市',1753,'421182',3),
+(1764,'咸宁市',1671,'421200',2),
+(1765,'咸安区',1764,'421202',3),
+(1766,'嘉鱼县',1764,'421221',3),
+(1767,'通城县',1764,'421222',3),
+(1768,'崇阳县',1764,'421223',3),
+(1769,'通山县',1764,'421224',3),
+(1770,'赤壁市',1764,'421281',3),
+(1771,'随州市',1671,'421300',2),
+(1772,'曾都区',1771,'421303',3),
+(1773,'随县',1771,'421321',3),
+(1774,'广水市',1771,'421381',3),
+(1775,'恩施土家族苗族自治州',1671,'422800',2),
+(1776,'恩施市',1775,'422801',3),
+(1777,'利川市',1775,'422802',3),
+(1778,'建始县',1775,'422822',3),
+(1779,'巴东县',1775,'422823',3),
+(1780,'宣恩县',1775,'422825',3),
+(1781,'咸丰县',1775,'422826',3),
+(1782,'来凤县',1775,'422827',3),
+(1783,'鹤峰县',1775,'422828',3),
+(1784,'仙桃市',1671,'429004',3),
+(1785,'潜江市',1671,'429005',3),
+(1786,'天门市',1671,'429006',3),
+(1787,'神农架林区',1671,'429021',3),
+(1788,'湖南省',0,'430000',1),
+(1789,'长沙市',1788,'430100',2),
+(1790,'芙蓉区',1789,'430102',3),
+(1791,'天心区',1789,'430103',3),
+(1792,'岳麓区',1789,'430104',3),
+(1793,'开福区',1789,'430105',3),
+(1794,'雨花区',1789,'430111',3),
+(1795,'望城区',1789,'430112',3),
+(1796,'长沙县',1789,'430121',3),
+(1797,'浏阳市',1789,'430181',3),
+(1798,'宁乡市',1789,'430182',3),
+(1799,'株洲市',1788,'430200',2),
+(1800,'荷塘区',1799,'430202',3),
+(1801,'芦淞区',1799,'430203',3),
+(1802,'石峰区',1799,'430204',3),
+(1803,'天元区',1799,'430211',3),
+(1804,'渌口区',1799,'430212',3),
+(1805,'攸县',1799,'430223',3),
+(1806,'茶陵县',1799,'430224',3),
+(1807,'炎陵县',1799,'430225',3),
+(1808,'醴陵市',1799,'430281',3),
+(1809,'湘潭市',1788,'430300',2),
+(1810,'雨湖区',1809,'430302',3),
+(1811,'岳塘区',1809,'430304',3),
+(1812,'湘潭县',1809,'430321',3),
+(1813,'湘乡市',1809,'430381',3),
+(1814,'韶山市',1809,'430382',3),
+(1815,'衡阳市',1788,'430400',2),
+(1816,'珠晖区',1815,'430405',3),
+(1817,'雁峰区',1815,'430406',3),
+(1818,'石鼓区',1815,'430407',3),
+(1819,'蒸湘区',1815,'430408',3),
+(1820,'南岳区',1815,'430412',3),
+(1821,'衡阳县',1815,'430421',3),
+(1822,'衡南县',1815,'430422',3),
+(1823,'衡山县',1815,'430423',3),
+(1824,'衡东县',1815,'430424',3),
+(1825,'祁东县',1815,'430426',3),
+(1826,'耒阳市',1815,'430481',3),
+(1827,'常宁市',1815,'430482',3),
+(1828,'邵阳市',1788,'430500',2),
+(1829,'双清区',1828,'430502',3),
+(1830,'大祥区',1828,'430503',3),
+(1831,'北塔区',1828,'430511',3),
+(1832,'新邵县',1828,'430522',3),
+(1833,'邵阳县',1828,'430523',3),
+(1834,'隆回县',1828,'430524',3),
+(1835,'洞口县',1828,'430525',3),
+(1836,'绥宁县',1828,'430527',3),
+(1837,'新宁县',1828,'430528',3),
+(1838,'城步苗族自治县',1828,'430529',3),
+(1839,'武冈市',1828,'430581',3),
+(1840,'邵东市',1828,'430582',3),
+(1841,'岳阳市',1788,'430600',2),
+(1842,'岳阳楼区',1841,'430602',3),
+(1843,'云溪区',1841,'430603',3),
+(1844,'君山区',1841,'430611',3),
+(1845,'岳阳县',1841,'430621',3),
+(1846,'华容县',1841,'430623',3),
+(1847,'湘阴县',1841,'430624',3),
+(1848,'平江县',1841,'430626',3),
+(1849,'汨罗市',1841,'430681',3),
+(1850,'临湘市',1841,'430682',3),
+(1851,'常德市',1788,'430700',2),
+(1852,'武陵区',1851,'430702',3),
+(1853,'鼎城区',1851,'430703',3),
+(1854,'安乡县',1851,'430721',3),
+(1855,'汉寿县',1851,'430722',3),
+(1856,'澧县',1851,'430723',3),
+(1857,'临澧县',1851,'430724',3),
+(1858,'桃源县',1851,'430725',3),
+(1859,'石门县',1851,'430726',3),
+(1860,'津市市',1851,'430781',3),
+(1861,'张家界市',1788,'430800',2),
+(1862,'永定区',1861,'430802',3),
+(1863,'武陵源区',1861,'430811',3),
+(1864,'慈利县',1861,'430821',3),
+(1865,'桑植县',1861,'430822',3),
+(1866,'益阳市',1788,'430900',2),
+(1867,'资阳区',1866,'430902',3),
+(1868,'赫山区',1866,'430903',3),
+(1869,'南县',1866,'430921',3),
+(1870,'桃江县',1866,'430922',3),
+(1871,'安化县',1866,'430923',3),
+(1872,'沅江市',1866,'430981',3),
+(1873,'郴州市',1788,'431000',2),
+(1874,'北湖区',1873,'431002',3),
+(1875,'苏仙区',1873,'431003',3),
+(1876,'桂阳县',1873,'431021',3),
+(1877,'宜章县',1873,'431022',3),
+(1878,'永兴县',1873,'431023',3),
+(1879,'嘉禾县',1873,'431024',3),
+(1880,'临武县',1873,'431025',3),
+(1881,'汝城县',1873,'431026',3),
+(1882,'桂东县',1873,'431027',3),
+(1883,'安仁县',1873,'431028',3),
+(1884,'资兴市',1873,'431081',3),
+(1885,'永州市',1788,'431100',2),
+(1886,'零陵区',1885,'431102',3),
+(1887,'冷水滩区',1885,'431103',3),
+(1888,'祁阳县',1885,'431121',3),
+(1889,'东安县',1885,'431122',3),
+(1890,'双牌县',1885,'431123',3),
+(1891,'道县',1885,'431124',3),
+(1892,'江永县',1885,'431125',3),
+(1893,'宁远县',1885,'431126',3),
+(1894,'蓝山县',1885,'431127',3),
+(1895,'新田县',1885,'431128',3),
+(1896,'江华瑶族自治县',1885,'431129',3),
+(1897,'怀化市',1788,'431200',2),
+(1898,'鹤城区',1897,'431202',3),
+(1899,'中方县',1897,'431221',3),
+(1900,'沅陵县',1897,'431222',3),
+(1901,'辰溪县',1897,'431223',3),
+(1902,'溆浦县',1897,'431224',3),
+(1903,'会同县',1897,'431225',3),
+(1904,'麻阳苗族自治县',1897,'431226',3),
+(1905,'新晃侗族自治县',1897,'431227',3),
+(1906,'芷江侗族自治县',1897,'431228',3),
+(1907,'靖州苗族侗族自治县',1897,'431229',3),
+(1908,'通道侗族自治县',1897,'431230',3),
+(1909,'洪江市',1897,'431281',3),
+(1910,'娄底市',1788,'431300',2),
+(1911,'娄星区',1910,'431302',3),
+(1912,'双峰县',1910,'431321',3),
+(1913,'新化县',1910,'431322',3),
+(1914,'冷水江市',1910,'431381',3),
+(1915,'涟源市',1910,'431382',3),
+(1916,'湘西土家族苗族自治州',1788,'433100',2),
+(1917,'吉首市',1916,'433101',3),
+(1918,'泸溪县',1916,'433122',3),
+(1919,'凤凰县',1916,'433123',3),
+(1920,'花垣县',1916,'433124',3),
+(1921,'保靖县',1916,'433125',3),
+(1922,'古丈县',1916,'433126',3),
+(1923,'永顺县',1916,'433127',3),
+(1924,'龙山县',1916,'433130',3),
+(1925,'广东省',0,'440000',1),
+(1926,'广州市',1925,'440100',2),
+(1927,'荔湾区',1926,'440103',3),
+(1928,'越秀区',1926,'440104',3),
+(1929,'海珠区',1926,'440105',3),
+(1930,'天河区',1926,'440106',3),
+(1931,'白云区',1926,'440111',3),
+(1932,'黄埔区',1926,'440112',3),
+(1933,'番禺区',1926,'440113',3),
+(1934,'花都区',1926,'440114',3),
+(1935,'南沙区',1926,'440115',3),
+(1936,'从化区',1926,'440117',3),
+(1937,'增城区',1926,'440118',3),
+(1938,'韶关市',1925,'440200',2),
+(1939,'武江区',1938,'440203',3),
+(1940,'浈江区',1938,'440204',3),
+(1941,'曲江区',1938,'440205',3),
+(1942,'始兴县',1938,'440222',3),
+(1943,'仁化县',1938,'440224',3),
+(1944,'翁源县',1938,'440229',3),
+(1945,'乳源瑶族自治县',1938,'440232',3),
+(1946,'新丰县',1938,'440233',3),
+(1947,'乐昌市',1938,'440281',3),
+(1948,'南雄市',1938,'440282',3),
+(1949,'深圳市',1925,'440300',2),
+(1950,'罗湖区',1949,'440303',3),
+(1951,'福田区',1949,'440304',3),
+(1952,'南山区',1949,'440305',3),
+(1953,'宝安区',1949,'440306',3),
+(1954,'龙岗区',1949,'440307',3),
+(1955,'盐田区',1949,'440308',3),
+(1956,'龙华区',1949,'440309',3),
+(1957,'坪山区',1949,'440310',3),
+(1958,'光明区',1949,'440311',3),
+(1959,'珠海市',1925,'440400',2),
+(1960,'香洲区',1959,'440402',3),
+(1961,'斗门区',1959,'440403',3),
+(1962,'金湾区',1959,'440404',3),
+(1963,'汕头市',1925,'440500',2),
+(1964,'龙湖区',1963,'440507',3),
+(1965,'金平区',1963,'440511',3),
+(1966,'濠江区',1963,'440512',3),
+(1967,'潮阳区',1963,'440513',3),
+(1968,'潮南区',1963,'440514',3),
+(1969,'澄海区',1963,'440515',3),
+(1970,'南澳县',1963,'440523',3),
+(1971,'佛山市',1925,'440600',2),
+(1972,'禅城区',1971,'440604',3),
+(1973,'南海区',1971,'440605',3),
+(1974,'顺德区',1971,'440606',3),
+(1975,'三水区',1971,'440607',3),
+(1976,'高明区',1971,'440608',3),
+(1977,'江门市',1925,'440700',2),
+(1978,'蓬江区',1977,'440703',3),
+(1979,'江海区',1977,'440704',3),
+(1980,'新会区',1977,'440705',3),
+(1981,'台山市',1977,'440781',3),
+(1982,'开平市',1977,'440783',3),
+(1983,'鹤山市',1977,'440784',3),
+(1984,'恩平市',1977,'440785',3),
+(1985,'湛江市',1925,'440800',2),
+(1986,'赤坎区',1985,'440802',3),
+(1987,'霞山区',1985,'440803',3),
+(1988,'坡头区',1985,'440804',3),
+(1989,'麻章区',1985,'440811',3),
+(1990,'遂溪县',1985,'440823',3),
+(1991,'徐闻县',1985,'440825',3),
+(1992,'廉江市',1985,'440881',3),
+(1993,'雷州市',1985,'440882',3),
+(1994,'吴川市',1985,'440883',3),
+(1995,'茂名市',1925,'440900',2),
+(1996,'茂南区',1995,'440902',3),
+(1997,'电白区',1995,'440904',3),
+(1998,'高州市',1995,'440981',3),
+(1999,'化州市',1995,'440982',3),
+(2000,'信宜市',1995,'440983',3),
+(2001,'肇庆市',1925,'441200',2),
+(2002,'端州区',2001,'441202',3),
+(2003,'鼎湖区',2001,'441203',3),
+(2004,'高要区',2001,'441204',3),
+(2005,'广宁县',2001,'441223',3),
+(2006,'怀集县',2001,'441224',3),
+(2007,'封开县',2001,'441225',3),
+(2008,'德庆县',2001,'441226',3),
+(2009,'四会市',2001,'441284',3),
+(2010,'惠州市',1925,'441300',2),
+(2011,'惠城区',2010,'441302',3),
+(2012,'惠阳区',2010,'441303',3),
+(2013,'博罗县',2010,'441322',3),
+(2014,'惠东县',2010,'441323',3),
+(2015,'龙门县',2010,'441324',3),
+(2016,'梅州市',1925,'441400',2),
+(2017,'梅江区',2016,'441402',3),
+(2018,'梅县区',2016,'441403',3),
+(2019,'大埔县',2016,'441422',3),
+(2020,'丰顺县',2016,'441423',3),
+(2021,'五华县',2016,'441424',3),
+(2022,'平远县',2016,'441426',3),
+(2023,'蕉岭县',2016,'441427',3),
+(2024,'兴宁市',2016,'441481',3),
+(2025,'汕尾市',1925,'441500',2),
+(2026,'城区',2025,'441502',3),
+(2027,'海丰县',2025,'441521',3),
+(2028,'陆河县',2025,'441523',3),
+(2029,'陆丰市',2025,'441581',3),
+(2030,'河源市',1925,'441600',2),
+(2031,'源城区',2030,'441602',3),
+(2032,'紫金县',2030,'441621',3),
+(2033,'龙川县',2030,'441622',3),
+(2034,'连平县',2030,'441623',3),
+(2035,'和平县',2030,'441624',3),
+(2036,'东源县',2030,'441625',3),
+(2037,'阳江市',1925,'441700',2),
+(2038,'江城区',2037,'441702',3),
+(2039,'阳东区',2037,'441704',3),
+(2040,'阳西县',2037,'441721',3),
+(2041,'阳春市',2037,'441781',3),
+(2042,'清远市',1925,'441800',2),
+(2043,'清城区',2042,'441802',3),
+(2044,'清新区',2042,'441803',3),
+(2045,'佛冈县',2042,'441821',3),
+(2046,'阳山县',2042,'441823',3),
+(2047,'连山壮族瑶族自治县',2042,'441825',3),
+(2048,'连南瑶族自治县',2042,'441826',3),
+(2049,'英德市',2042,'441881',3),
+(2050,'连州市',2042,'441882',3),
+(2051,'东莞市',1925,'441900',2),
+(2052,'中山市',1925,'442000',2),
+(2053,'潮州市',1925,'445100',2),
+(2054,'湘桥区',2053,'445102',3),
+(2055,'潮安区',2053,'445103',3),
+(2056,'饶平县',2053,'445122',3),
+(2057,'揭阳市',1925,'445200',2),
+(2058,'榕城区',2057,'445202',3),
+(2059,'揭东区',2057,'445203',3),
+(2060,'揭西县',2057,'445222',3),
+(2061,'惠来县',2057,'445224',3),
+(2062,'普宁市',2057,'445281',3),
+(2063,'云浮市',1925,'445300',2),
+(2064,'云城区',2063,'445302',3),
+(2065,'云安区',2063,'445303',3),
+(2066,'新兴县',2063,'445321',3),
+(2067,'郁南县',2063,'445322',3),
+(2068,'罗定市',2063,'445381',3),
+(2069,'广西壮族自治区',0,'450000',1),
+(2070,'南宁市',2069,'450100',2),
+(2071,'兴宁区',2070,'450102',3),
+(2072,'青秀区',2070,'450103',3),
+(2073,'江南区',2070,'450105',3),
+(2074,'西乡塘区',2070,'450107',3),
+(2075,'良庆区',2070,'450108',3),
+(2076,'邕宁区',2070,'450109',3),
+(2077,'武鸣区',2070,'450110',3),
+(2078,'隆安县',2070,'450123',3),
+(2079,'马山县',2070,'450124',3),
+(2080,'上林县',2070,'450125',3),
+(2081,'宾阳县',2070,'450126',3),
+(2082,'横县',2070,'450127',3),
+(2083,'柳州市',2069,'450200',2),
+(2084,'城中区',2083,'450202',3),
+(2085,'鱼峰区',2083,'450203',3),
+(2086,'柳南区',2083,'450204',3),
+(2087,'柳北区',2083,'450205',3),
+(2088,'柳江区',2083,'450206',3),
+(2089,'柳城县',2083,'450222',3),
+(2090,'鹿寨县',2083,'450223',3),
+(2091,'融安县',2083,'450224',3),
+(2092,'融水苗族自治县',2083,'450225',3),
+(2093,'三江侗族自治县',2083,'450226',3),
+(2094,'桂林市',2069,'450300',2),
+(2095,'秀峰区',2094,'450302',3),
+(2096,'叠彩区',2094,'450303',3),
+(2097,'象山区',2094,'450304',3),
+(2098,'七星区',2094,'450305',3),
+(2099,'雁山区',2094,'450311',3),
+(2100,'临桂区',2094,'450312',3),
+(2101,'阳朔县',2094,'450321',3),
+(2102,'灵川县',2094,'450323',3),
+(2103,'全州县',2094,'450324',3),
+(2104,'兴安县',2094,'450325',3),
+(2105,'永福县',2094,'450326',3),
+(2106,'灌阳县',2094,'450327',3),
+(2107,'龙胜各族自治县',2094,'450328',3),
+(2108,'资源县',2094,'450329',3),
+(2109,'平乐县',2094,'450330',3),
+(2110,'荔浦市',2094,'450381',3),
+(2111,'恭城瑶族自治县',2094,'450332',3),
+(2112,'梧州市',2069,'450400',2),
+(2113,'万秀区',2112,'450403',3),
+(2114,'长洲区',2112,'450405',3),
+(2115,'龙圩区',2112,'450406',3),
+(2116,'苍梧县',2112,'450421',3),
+(2117,'藤县',2112,'450422',3),
+(2118,'蒙山县',2112,'450423',3),
+(2119,'岑溪市',2112,'450481',3),
+(2120,'北海市',2069,'450500',2),
+(2121,'海城区',2120,'450502',3),
+(2122,'银海区',2120,'450503',3),
+(2123,'铁山港区',2120,'450512',3),
+(2124,'合浦县',2120,'450521',3),
+(2125,'防城港市',2069,'450600',2),
+(2126,'港口区',2125,'450602',3),
+(2127,'防城区',2125,'450603',3),
+(2128,'上思县',2125,'450621',3),
+(2129,'东兴市',2125,'450681',3),
+(2130,'钦州市',2069,'450700',2),
+(2131,'钦南区',2130,'450702',3),
+(2132,'钦北区',2130,'450703',3),
+(2133,'灵山县',2130,'450721',3),
+(2134,'浦北县',2130,'450722',3),
+(2135,'贵港市',2069,'450800',2),
+(2136,'港北区',2135,'450802',3),
+(2137,'港南区',2135,'450803',3),
+(2138,'覃塘区',2135,'450804',3),
+(2139,'平南县',2135,'450821',3),
+(2140,'桂平市',2135,'450881',3),
+(2141,'玉林市',2069,'450900',2),
+(2142,'玉州区',2141,'450902',3),
+(2143,'福绵区',2141,'450903',3),
+(2144,'容县',2141,'450921',3),
+(2145,'陆川县',2141,'450922',3),
+(2146,'博白县',2141,'450923',3),
+(2147,'兴业县',2141,'450924',3),
+(2148,'北流市',2141,'450981',3),
+(2149,'百色市',2069,'451000',2),
+(2150,'右江区',2149,'451002',3),
+(2151,'田阳区',2149,'451003',3),
+(2152,'田东县',2149,'451022',3),
+(2153,'德保县',2149,'451024',3),
+(2154,'那坡县',2149,'451026',3),
+(2155,'凌云县',2149,'451027',3),
+(2156,'乐业县',2149,'451028',3),
+(2157,'田林县',2149,'451029',3),
+(2158,'西林县',2149,'451030',3),
+(2159,'隆林各族自治县',2149,'451031',3),
+(2160,'靖西市',2149,'451081',3),
+(2161,'平果市',2149,'451082',3),
+(2162,'贺州市',2069,'451100',2),
+(2163,'八步区',2162,'451102',3),
+(2164,'平桂区',2162,'451103',3),
+(2165,'昭平县',2162,'451121',3),
+(2166,'钟山县',2162,'451122',3),
+(2167,'富川瑶族自治县',2162,'451123',3),
+(2168,'河池市',2069,'451200',2),
+(2169,'金城江区',2168,'451202',3),
+(2170,'宜州区',2168,'451203',3),
+(2171,'南丹县',2168,'451221',3),
+(2172,'天峨县',2168,'451222',3),
+(2173,'凤山县',2168,'451223',3),
+(2174,'东兰县',2168,'451224',3),
+(2175,'罗城仫佬族自治县',2168,'451225',3),
+(2176,'环江毛南族自治县',2168,'451226',3),
+(2177,'巴马瑶族自治县',2168,'451227',3),
+(2178,'都安瑶族自治县',2168,'451228',3),
+(2179,'大化瑶族自治县',2168,'451229',3),
+(2180,'来宾市',2069,'451300',2),
+(2181,'兴宾区',2180,'451302',3),
+(2182,'忻城县',2180,'451321',3),
+(2183,'象州县',2180,'451322',3),
+(2184,'武宣县',2180,'451323',3),
+(2185,'金秀瑶族自治县',2180,'451324',3),
+(2186,'合山市',2180,'451381',3),
+(2187,'崇左市',2069,'451400',2),
+(2188,'江州区',2187,'451402',3),
+(2189,'扶绥县',2187,'451421',3),
+(2190,'宁明县',2187,'451422',3),
+(2191,'龙州县',2187,'451423',3),
+(2192,'大新县',2187,'451424',3),
+(2193,'天等县',2187,'451425',3),
+(2194,'凭祥市',2187,'451481',3),
+(2195,'海南省',0,'460000',1),
+(2196,'海口市',2195,'460100',2),
+(2197,'秀英区',2196,'460105',3),
+(2198,'龙华区',2196,'460106',3),
+(2199,'琼山区',2196,'460107',3),
+(2200,'美兰区',2196,'460108',3),
+(2201,'三亚市',2195,'460200',2),
+(2202,'海棠区',2201,'460202',3),
+(2203,'吉阳区',2201,'460203',3),
+(2204,'天涯区',2201,'460204',3),
+(2205,'崖州区',2201,'460205',3),
+(2206,'三沙市',2195,'460300',2),
+(2207,'儋州市',2195,'460400',2),
+(2208,'五指山市',2195,'469001',3),
+(2209,'琼海市',2195,'469002',3),
+(2210,'文昌市',2195,'469005',3),
+(2211,'万宁市',2195,'469006',3),
+(2212,'东方市',2195,'469007',3),
+(2213,'定安县',2195,'469021',3),
+(2214,'屯昌县',2195,'469022',3),
+(2215,'澄迈县',2195,'469023',3),
+(2216,'临高县',2195,'469024',3),
+(2217,'白沙黎族自治县',2195,'469025',3),
+(2218,'昌江黎族自治县',2195,'469026',3),
+(2219,'乐东黎族自治县',2195,'469027',3),
+(2220,'陵水黎族自治县',2195,'469028',3),
+(2221,'保亭黎族苗族自治县',2195,'469029',3),
+(2222,'琼中黎族苗族自治县',2195,'469030',3),
+(2223,'重庆',0,'500000',1),
+(2224,'重庆市',2223,'500010',2),
+(2225,'万州区',2224,'500101',3),
+(2226,'涪陵区',2224,'500102',3),
+(2227,'渝中区',2224,'500103',3),
+(2228,'大渡口区',2224,'500104',3),
+(2229,'江北区',2224,'500105',3),
+(2230,'沙坪坝区',2224,'500106',3),
+(2231,'九龙坡区',2224,'500107',3),
+(2232,'南岸区',2224,'500108',3),
+(2233,'北碚区',2224,'500109',3),
+(2234,'綦江区',2224,'500110',3),
+(2235,'大足区',2224,'500111',3),
+(2236,'渝北区',2224,'500112',3),
+(2237,'巴南区',2224,'500113',3),
+(2238,'黔江区',2224,'500114',3),
+(2239,'长寿区',2224,'500115',3),
+(2240,'江津区',2224,'500116',3),
+(2241,'合川区',2224,'500117',3),
+(2242,'永川区',2224,'500118',3),
+(2243,'南川区',2224,'500119',3),
+(2244,'璧山区',2224,'500120',3),
+(2245,'铜梁区',2224,'500151',3),
+(2246,'潼南区',2224,'500152',3),
+(2247,'荣昌区',2224,'500153',3),
+(2248,'开州区',2224,'500154',3),
+(2249,'梁平区',2224,'500155',3),
+(2250,'武隆区',2224,'500156',3),
+(2251,'城口县',2224,'500229',3),
+(2252,'丰都县',2224,'500230',3),
+(2253,'垫江县',2224,'500231',3),
+(2254,'忠县',2224,'500233',3),
+(2255,'云阳县',2224,'500235',3),
+(2256,'奉节县',2224,'500236',3),
+(2257,'巫山县',2224,'500237',3),
+(2258,'巫溪县',2224,'500238',3),
+(2259,'石柱土家族自治县',2224,'500240',3),
+(2260,'秀山土家族苗族自治县',2224,'500241',3),
+(2261,'酉阳土家族苗族自治县',2224,'500242',3),
+(2262,'彭水苗族土家族自治县',2224,'500243',3),
+(2263,'四川省',0,'510000',1),
+(2264,'成都市',2263,'510100',2),
+(2265,'锦江区',2264,'510104',3),
+(2266,'青羊区',2264,'510105',3),
+(2267,'金牛区',2264,'510106',3),
+(2268,'武侯区',2264,'510107',3),
+(2269,'成华区',2264,'510108',3),
+(2270,'龙泉驿区',2264,'510112',3),
+(2271,'青白江区',2264,'510113',3),
+(2272,'新都区',2264,'510114',3),
+(2273,'温江区',2264,'510115',3),
+(2274,'双流区',2264,'510116',3),
+(2275,'郫都区',2264,'510117',3),
+(2276,'金堂县',2264,'510121',3),
+(2277,'大邑县',2264,'510129',3),
+(2278,'蒲江县',2264,'510131',3),
+(2279,'新津县',2264,'510132',3),
+(2280,'都江堰市',2264,'510181',3),
+(2281,'彭州市',2264,'510182',3),
+(2282,'邛崃市',2264,'510183',3),
+(2283,'崇州市',2264,'510184',3),
+(2284,'简阳市',2264,'510185',3),
+(2285,'自贡市',2263,'510300',2),
+(2286,'自流井区',2285,'510302',3),
+(2287,'贡井区',2285,'510303',3),
+(2288,'大安区',2285,'510304',3),
+(2289,'沿滩区',2285,'510311',3),
+(2290,'荣县',2285,'510321',3),
+(2291,'富顺县',2285,'510322',3),
+(2292,'攀枝花市',2263,'510400',2),
+(2293,'东区',2292,'510402',3),
+(2294,'西区',2292,'510403',3),
+(2295,'仁和区',2292,'510411',3),
+(2296,'米易县',2292,'510421',3),
+(2297,'盐边县',2292,'510422',3),
+(2298,'泸州市',2263,'510500',2),
+(2299,'江阳区',2298,'510502',3),
+(2300,'纳溪区',2298,'510503',3),
+(2301,'龙马潭区',2298,'510504',3),
+(2302,'泸县',2298,'510521',3),
+(2303,'合江县',2298,'510522',3),
+(2304,'叙永县',2298,'510524',3),
+(2305,'古蔺县',2298,'510525',3),
+(2306,'德阳市',2263,'510600',2),
+(2307,'旌阳区',2306,'510603',3),
+(2308,'罗江区',2306,'510604',3),
+(2309,'中江县',2306,'510623',3),
+(2310,'广汉市',2306,'510681',3),
+(2311,'什邡市',2306,'510682',3),
+(2312,'绵竹市',2306,'510683',3),
+(2313,'绵阳市',2263,'510700',2),
+(2314,'涪城区',2313,'510703',3),
+(2315,'游仙区',2313,'510704',3),
+(2316,'安州区',2313,'510705',3),
+(2317,'三台县',2313,'510722',3),
+(2318,'盐亭县',2313,'510723',3),
+(2319,'梓潼县',2313,'510725',3),
+(2320,'北川羌族自治县',2313,'510726',3),
+(2321,'平武县',2313,'510727',3),
+(2322,'江油市',2313,'510781',3),
+(2323,'广元市',2263,'510800',2),
+(2324,'利州区',2323,'510802',3),
+(2325,'昭化区',2323,'510811',3),
+(2326,'朝天区',2323,'510812',3),
+(2327,'旺苍县',2323,'510821',3),
+(2328,'青川县',2323,'510822',3),
+(2329,'剑阁县',2323,'510823',3),
+(2330,'苍溪县',2323,'510824',3),
+(2331,'遂宁市',2263,'510900',2),
+(2332,'船山区',2331,'510903',3),
+(2333,'安居区',2331,'510904',3),
+(2334,'蓬溪县',2331,'510921',3),
+(2335,'大英县',2331,'510923',3),
+(2336,'射洪市',2331,'510981',3),
+(2337,'内江市',2263,'511000',2),
+(2338,'市中区',2337,'511002',3),
+(2339,'东兴区',2337,'511011',3),
+(2340,'威远县',2337,'511024',3),
+(2341,'资中县',2337,'511025',3),
+(2342,'隆昌市',2337,'511083',3),
+(2343,'乐山市',2263,'511100',2),
+(2344,'市中区',2343,'511102',3),
+(2345,'沙湾区',2343,'511111',3),
+(2346,'五通桥区',2343,'511112',3),
+(2347,'金口河区',2343,'511113',3),
+(2348,'犍为县',2343,'511123',3),
+(2349,'井研县',2343,'511124',3),
+(2350,'夹江县',2343,'511126',3),
+(2351,'沐川县',2343,'511129',3),
+(2352,'峨边彝族自治县',2343,'511132',3),
+(2353,'马边彝族自治县',2343,'511133',3),
+(2354,'峨眉山市',2343,'511181',3),
+(2355,'南充市',2263,'511300',2),
+(2356,'顺庆区',2355,'511302',3),
+(2357,'高坪区',2355,'511303',3),
+(2358,'嘉陵区',2355,'511304',3),
+(2359,'南部县',2355,'511321',3),
+(2360,'营山县',2355,'511322',3),
+(2361,'蓬安县',2355,'511323',3),
+(2362,'仪陇县',2355,'511324',3),
+(2363,'西充县',2355,'511325',3),
+(2364,'阆中市',2355,'511381',3),
+(2365,'眉山市',2263,'511400',2),
+(2366,'东坡区',2365,'511402',3),
+(2367,'彭山区',2365,'511403',3),
+(2368,'仁寿县',2365,'511421',3),
+(2369,'洪雅县',2365,'511423',3),
+(2370,'丹棱县',2365,'511424',3),
+(2371,'青神县',2365,'511425',3),
+(2372,'宜宾市',2263,'511500',2),
+(2373,'翠屏区',2372,'511502',3),
+(2374,'南溪区',2372,'511503',3),
+(2375,'叙州区',2372,'511504',3),
+(2376,'江安县',2372,'511523',3),
+(2377,'长宁县',2372,'511524',3),
+(2378,'高县',2372,'511525',3),
+(2379,'珙县',2372,'511526',3),
+(2380,'筠连县',2372,'511527',3),
+(2381,'兴文县',2372,'511528',3),
+(2382,'屏山县',2372,'511529',3),
+(2383,'广安市',2263,'511600',2),
+(2384,'广安区',2383,'511602',3),
+(2385,'前锋区',2383,'511603',3),
+(2386,'岳池县',2383,'511621',3),
+(2387,'武胜县',2383,'511622',3),
+(2388,'邻水县',2383,'511623',3),
+(2389,'华蓥市',2383,'511681',3),
+(2390,'达州市',2263,'511700',2),
+(2391,'通川区',2390,'511702',3),
+(2392,'达川区',2390,'511703',3),
+(2393,'宣汉县',2390,'511722',3),
+(2394,'开江县',2390,'511723',3),
+(2395,'大竹县',2390,'511724',3),
+(2396,'渠县',2390,'511725',3),
+(2397,'万源市',2390,'511781',3),
+(2398,'雅安市',2263,'511800',2),
+(2399,'雨城区',2398,'511802',3),
+(2400,'名山区',2398,'511803',3),
+(2401,'荥经县',2398,'511822',3),
+(2402,'汉源县',2398,'511823',3),
+(2403,'石棉县',2398,'511824',3),
+(2404,'天全县',2398,'511825',3),
+(2405,'芦山县',2398,'511826',3),
+(2406,'宝兴县',2398,'511827',3),
+(2407,'巴中市',2263,'511900',2),
+(2408,'巴州区',2407,'511902',3),
+(2409,'恩阳区',2407,'511903',3),
+(2410,'通江县',2407,'511921',3),
+(2411,'南江县',2407,'511922',3),
+(2412,'平昌县',2407,'511923',3),
+(2413,'资阳市',2263,'512000',2),
+(2414,'雁江区',2413,'512002',3),
+(2415,'安岳县',2413,'512021',3),
+(2416,'乐至县',2413,'512022',3),
+(2417,'阿坝藏族羌族自治州',2263,'513200',2),
+(2418,'马尔康市',2417,'513201',3),
+(2419,'汶川县',2417,'513221',3),
+(2420,'理县',2417,'513222',3),
+(2421,'茂县',2417,'513223',3),
+(2422,'松潘县',2417,'513224',3),
+(2423,'九寨沟县',2417,'513225',3),
+(2424,'金川县',2417,'513226',3),
+(2425,'小金县',2417,'513227',3),
+(2426,'黑水县',2417,'513228',3),
+(2427,'壤塘县',2417,'513230',3),
+(2428,'阿坝县',2417,'513231',3),
+(2429,'若尔盖县',2417,'513232',3),
+(2430,'红原县',2417,'513233',3),
+(2431,'甘孜藏族自治州',2263,'513300',2),
+(2432,'康定市',2431,'513301',3),
+(2433,'泸定县',2431,'513322',3),
+(2434,'丹巴县',2431,'513323',3),
+(2435,'九龙县',2431,'513324',3),
+(2436,'雅江县',2431,'513325',3),
+(2437,'道孚县',2431,'513326',3),
+(2438,'炉霍县',2431,'513327',3),
+(2439,'甘孜县',2431,'513328',3),
+(2440,'新龙县',2431,'513329',3),
+(2441,'德格县',2431,'513330',3),
+(2442,'白玉县',2431,'513331',3),
+(2443,'石渠县',2431,'513332',3),
+(2444,'色达县',2431,'513333',3),
+(2445,'理塘县',2431,'513334',3),
+(2446,'巴塘县',2431,'513335',3),
+(2447,'乡城县',2431,'513336',3),
+(2448,'稻城县',2431,'513337',3),
+(2449,'得荣县',2431,'513338',3),
+(2450,'凉山彝族自治州',2263,'513400',2),
+(2451,'西昌市',2450,'513401',3),
+(2452,'木里藏族自治县',2450,'513422',3),
+(2453,'盐源县',2450,'513423',3),
+(2454,'德昌县',2450,'513424',3),
+(2455,'会理县',2450,'513425',3),
+(2456,'会东县',2450,'513426',3),
+(2457,'宁南县',2450,'513427',3),
+(2458,'普格县',2450,'513428',3),
+(2459,'布拖县',2450,'513429',3),
+(2460,'金阳县',2450,'513430',3),
+(2461,'昭觉县',2450,'513431',3),
+(2462,'喜德县',2450,'513432',3),
+(2463,'冕宁县',2450,'513433',3),
+(2464,'越西县',2450,'513434',3),
+(2465,'甘洛县',2450,'513435',3),
+(2466,'美姑县',2450,'513436',3),
+(2467,'雷波县',2450,'513437',3),
+(2468,'贵州省',0,'520000',1),
+(2469,'贵阳市',2468,'520100',2),
+(2470,'南明区',2469,'520102',3),
+(2471,'云岩区',2469,'520103',3),
+(2472,'花溪区',2469,'520111',3),
+(2473,'乌当区',2469,'520112',3),
+(2474,'白云区',2469,'520113',3),
+(2475,'观山湖区',2469,'520115',3),
+(2476,'开阳县',2469,'520121',3),
+(2477,'息烽县',2469,'520122',3),
+(2478,'修文县',2469,'520123',3),
+(2479,'清镇市',2469,'520181',3),
+(2480,'六盘水市',2468,'520200',2),
+(2481,'钟山区',2480,'520201',3),
+(2482,'六枝特区',2480,'520203',3),
+(2483,'水城县',2480,'520221',3),
+(2484,'盘州市',2480,'520281',3),
+(2485,'遵义市',2468,'520300',2),
+(2486,'红花岗区',2485,'520302',3),
+(2487,'汇川区',2485,'520303',3),
+(2488,'播州区',2485,'520304',3),
+(2489,'桐梓县',2485,'520322',3),
+(2490,'绥阳县',2485,'520323',3),
+(2491,'正安县',2485,'520324',3),
+(2492,'道真仡佬族苗族自治县',2485,'520325',3),
+(2493,'务川仡佬族苗族自治县',2485,'520326',3),
+(2494,'凤冈县',2485,'520327',3),
+(2495,'湄潭县',2485,'520328',3),
+(2496,'余庆县',2485,'520329',3),
+(2497,'习水县',2485,'520330',3),
+(2498,'赤水市',2485,'520381',3),
+(2499,'仁怀市',2485,'520382',3),
+(2500,'安顺市',2468,'520400',2),
+(2501,'西秀区',2500,'520402',3),
+(2502,'平坝区',2500,'520403',3),
+(2503,'普定县',2500,'520422',3),
+(2504,'镇宁布依族苗族自治县',2500,'520423',3),
+(2505,'关岭布依族苗族自治县',2500,'520424',3),
+(2506,'紫云苗族布依族自治县',2500,'520425',3),
+(2507,'毕节市',2468,'520500',2),
+(2508,'七星关区',2507,'520502',3),
+(2509,'大方县',2507,'520521',3),
+(2510,'黔西县',2507,'520522',3),
+(2511,'金沙县',2507,'520523',3),
+(2512,'织金县',2507,'520524',3),
+(2513,'纳雍县',2507,'520525',3),
+(2514,'威宁彝族回族苗族自治县',2507,'520526',3),
+(2515,'赫章县',2507,'520527',3),
+(2516,'铜仁市',2468,'520600',2),
+(2517,'碧江区',2516,'520602',3),
+(2518,'万山区',2516,'520603',3),
+(2519,'江口县',2516,'520621',3),
+(2520,'玉屏侗族自治县',2516,'520622',3),
+(2521,'石阡县',2516,'520623',3),
+(2522,'思南县',2516,'520624',3),
+(2523,'印江土家族苗族自治县',2516,'520625',3),
+(2524,'德江县',2516,'520626',3),
+(2525,'沿河土家族自治县',2516,'520627',3),
+(2526,'松桃苗族自治县',2516,'520628',3),
+(2527,'黔西南布依族苗族自治州',2468,'522300',2),
+(2528,'兴义市',2527,'522301',3),
+(2529,'兴仁市',2527,'522302',3),
+(2530,'普安县',2527,'522323',3),
+(2531,'晴隆县',2527,'522324',3),
+(2532,'贞丰县',2527,'522325',3),
+(2533,'望谟县',2527,'522326',3),
+(2534,'册亨县',2527,'522327',3),
+(2535,'安龙县',2527,'522328',3),
+(2536,'黔东南苗族侗族自治州',2468,'522600',2),
+(2537,'凯里市',2536,'522601',3),
+(2538,'黄平县',2536,'522622',3),
+(2539,'施秉县',2536,'522623',3),
+(2540,'三穗县',2536,'522624',3),
+(2541,'镇远县',2536,'522625',3),
+(2542,'岑巩县',2536,'522626',3),
+(2543,'天柱县',2536,'522627',3),
+(2544,'锦屏县',2536,'522628',3),
+(2545,'剑河县',2536,'522629',3),
+(2546,'台江县',2536,'522630',3),
+(2547,'黎平县',2536,'522631',3),
+(2548,'榕江县',2536,'522632',3),
+(2549,'从江县',2536,'522633',3),
+(2550,'雷山县',2536,'522634',3),
+(2551,'麻江县',2536,'522635',3),
+(2552,'丹寨县',2536,'522636',3),
+(2553,'黔南布依族苗族自治州',2468,'522700',2),
+(2554,'都匀市',2553,'522701',3),
+(2555,'福泉市',2553,'522702',3),
+(2556,'荔波县',2553,'522722',3),
+(2557,'贵定县',2553,'522723',3),
+(2558,'瓮安县',2553,'522725',3),
+(2559,'独山县',2553,'522726',3),
+(2560,'平塘县',2553,'522727',3),
+(2561,'罗甸县',2553,'522728',3),
+(2562,'长顺县',2553,'522729',3),
+(2563,'龙里县',2553,'522730',3),
+(2564,'惠水县',2553,'522731',3),
+(2565,'三都水族自治县',2553,'522732',3),
+(2566,'云南省',0,'530000',1),
+(2567,'昆明市',2566,'530100',2),
+(2568,'五华区',2567,'530102',3),
+(2569,'盘龙区',2567,'530103',3),
+(2570,'官渡区',2567,'530111',3),
+(2571,'西山区',2567,'530112',3),
+(2572,'东川区',2567,'530113',3),
+(2573,'呈贡区',2567,'530114',3),
+(2574,'晋宁区',2567,'530115',3),
+(2575,'富民县',2567,'530124',3),
+(2576,'宜良县',2567,'530125',3),
+(2577,'石林彝族自治县',2567,'530126',3),
+(2578,'嵩明县',2567,'530127',3),
+(2579,'禄劝彝族苗族自治县',2567,'530128',3),
+(2580,'寻甸回族彝族自治县',2567,'530129',3),
+(2581,'安宁市',2567,'530181',3),
+(2582,'曲靖市',2566,'530300',2),
+(2583,'麒麟区',2582,'530302',3),
+(2584,'沾益区',2582,'530303',3),
+(2585,'马龙区',2582,'530304',3),
+(2586,'陆良县',2582,'530322',3),
+(2587,'师宗县',2582,'530323',3),
+(2588,'罗平县',2582,'530324',3),
+(2589,'富源县',2582,'530325',3),
+(2590,'会泽县',2582,'530326',3),
+(2591,'宣威市',2582,'530381',3),
+(2592,'玉溪市',2566,'530400',2),
+(2593,'红塔区',2592,'530402',3),
+(2594,'江川区',2592,'530403',3),
+(2595,'通海县',2592,'530423',3),
+(2596,'华宁县',2592,'530424',3),
+(2597,'易门县',2592,'530425',3),
+(2598,'峨山彝族自治县',2592,'530426',3),
+(2599,'新平彝族傣族自治县',2592,'530427',3),
+(2600,'元江哈尼族彝族傣族自治县',2592,'530428',3),
+(2601,'澄江市',2592,'530481',3),
+(2602,'保山市',2566,'530500',2),
+(2603,'隆阳区',2602,'530502',3),
+(2604,'施甸县',2602,'530521',3),
+(2605,'龙陵县',2602,'530523',3),
+(2606,'昌宁县',2602,'530524',3),
+(2607,'腾冲市',2602,'530581',3),
+(2608,'昭通市',2566,'530600',2),
+(2609,'昭阳区',2608,'530602',3),
+(2610,'鲁甸县',2608,'530621',3),
+(2611,'巧家县',2608,'530622',3),
+(2612,'盐津县',2608,'530623',3),
+(2613,'大关县',2608,'530624',3),
+(2614,'永善县',2608,'530625',3),
+(2615,'绥江县',2608,'530626',3),
+(2616,'镇雄县',2608,'530627',3),
+(2617,'彝良县',2608,'530628',3),
+(2618,'威信县',2608,'530629',3),
+(2619,'水富市',2608,'530681',3),
+(2620,'丽江市',2566,'530700',2),
+(2621,'古城区',2620,'530702',3),
+(2622,'玉龙纳西族自治县',2620,'530721',3),
+(2623,'永胜县',2620,'530722',3),
+(2624,'华坪县',2620,'530723',3),
+(2625,'宁蒗彝族自治县',2620,'530724',3),
+(2626,'普洱市',2566,'530800',2),
+(2627,'思茅区',2626,'530802',3),
+(2628,'宁洱哈尼族彝族自治县',2626,'530821',3),
+(2629,'墨江哈尼族自治县',2626,'530822',3),
+(2630,'景东彝族自治县',2626,'530823',3),
+(2631,'景谷傣族彝族自治县',2626,'530824',3),
+(2632,'镇沅彝族哈尼族拉祜族自治县',2626,'530825',3),
+(2633,'江城哈尼族彝族自治县',2626,'530826',3),
+(2634,'孟连傣族拉祜族佤族自治县',2626,'530827',3),
+(2635,'澜沧拉祜族自治县',2626,'530828',3),
+(2636,'西盟佤族自治县',2626,'530829',3),
+(2637,'临沧市',2566,'530900',2),
+(2638,'临翔区',2637,'530902',3),
+(2639,'凤庆县',2637,'530921',3),
+(2640,'云县',2637,'530922',3),
+(2641,'永德县',2637,'530923',3),
+(2642,'镇康县',2637,'530924',3),
+(2643,'双江拉祜族佤族布朗族傣族自治县',2637,'530925',3),
+(2644,'耿马傣族佤族自治县',2637,'530926',3),
+(2645,'沧源佤族自治县',2637,'530927',3),
+(2646,'楚雄彝族自治州',2566,'532300',2),
+(2647,'楚雄市',2646,'532301',3),
+(2648,'双柏县',2646,'532322',3),
+(2649,'牟定县',2646,'532323',3),
+(2650,'南华县',2646,'532324',3),
+(2651,'姚安县',2646,'532325',3),
+(2652,'大姚县',2646,'532326',3),
+(2653,'永仁县',2646,'532327',3),
+(2654,'元谋县',2646,'532328',3),
+(2655,'武定县',2646,'532329',3),
+(2656,'禄丰县',2646,'532331',3),
+(2657,'红河哈尼族彝族自治州',2566,'532500',2),
+(2658,'个旧市',2657,'532501',3),
+(2659,'开远市',2657,'532502',3),
+(2660,'蒙自市',2657,'532503',3),
+(2661,'弥勒市',2657,'532504',3),
+(2662,'屏边苗族自治县',2657,'532523',3),
+(2663,'建水县',2657,'532524',3),
+(2664,'石屏县',2657,'532525',3),
+(2665,'泸西县',2657,'532527',3),
+(2666,'元阳县',2657,'532528',3),
+(2667,'红河县',2657,'532529',3),
+(2668,'金平苗族瑶族傣族自治县',2657,'532530',3),
+(2669,'绿春县',2657,'532531',3),
+(2670,'河口瑶族自治县',2657,'532532',3),
+(2671,'文山壮族苗族自治州',2566,'532600',2),
+(2672,'文山市',2671,'532601',3),
+(2673,'砚山县',2671,'532622',3),
+(2674,'西畴县',2671,'532623',3),
+(2675,'麻栗坡县',2671,'532624',3),
+(2676,'马关县',2671,'532625',3),
+(2677,'丘北县',2671,'532626',3),
+(2678,'广南县',2671,'532627',3),
+(2679,'富宁县',2671,'532628',3),
+(2680,'西双版纳傣族自治州',2566,'532800',2),
+(2681,'景洪市',2680,'532801',3),
+(2682,'勐海县',2680,'532822',3),
+(2683,'勐腊县',2680,'532823',3),
+(2684,'大理白族自治州',2566,'532900',2),
+(2685,'大理市',2684,'532901',3),
+(2686,'漾濞彝族自治县',2684,'532922',3),
+(2687,'祥云县',2684,'532923',3),
+(2688,'宾川县',2684,'532924',3),
+(2689,'弥渡县',2684,'532925',3),
+(2690,'南涧彝族自治县',2684,'532926',3),
+(2691,'巍山彝族回族自治县',2684,'532927',3),
+(2692,'永平县',2684,'532928',3),
+(2693,'云龙县',2684,'532929',3),
+(2694,'洱源县',2684,'532930',3),
+(2695,'剑川县',2684,'532931',3),
+(2696,'鹤庆县',2684,'532932',3),
+(2697,'德宏傣族景颇族自治州',2566,'533100',2),
+(2698,'瑞丽市',2697,'533102',3),
+(2699,'芒市',2697,'533103',3),
+(2700,'梁河县',2697,'533122',3),
+(2701,'盈江县',2697,'533123',3),
+(2702,'陇川县',2697,'533124',3),
+(2703,'怒江傈僳族自治州',2566,'533300',2),
+(2704,'泸水市',2703,'533301',3),
+(2705,'福贡县',2703,'533323',3),
+(2706,'贡山独龙族怒族自治县',2703,'533324',3),
+(2707,'兰坪白族普米族自治县',2703,'533325',3),
+(2708,'迪庆藏族自治州',2566,'533400',2),
+(2709,'香格里拉市',2708,'533401',3),
+(2710,'德钦县',2708,'533422',3),
+(2711,'维西傈僳族自治县',2708,'533423',3),
+(2712,'西藏自治区',0,'540000',1),
+(2713,'拉萨市',2712,'540100',2),
+(2714,'城关区',2713,'540102',3),
+(2715,'堆龙德庆区',2713,'540103',3),
+(2716,'达孜区',2713,'540104',3),
+(2717,'林周县',2713,'540121',3),
+(2718,'当雄县',2713,'540122',3),
+(2719,'尼木县',2713,'540123',3),
+(2720,'曲水县',2713,'540124',3),
+(2721,'墨竹工卡县',2713,'540127',3),
+(2722,'日喀则市',2712,'540200',2),
+(2723,'桑珠孜区',2722,'540202',3),
+(2724,'南木林县',2722,'540221',3),
+(2725,'江孜县',2722,'540222',3),
+(2726,'定日县',2722,'540223',3),
+(2727,'萨迦县',2722,'540224',3),
+(2728,'拉孜县',2722,'540225',3),
+(2729,'昂仁县',2722,'540226',3),
+(2730,'谢通门县',2722,'540227',3),
+(2731,'白朗县',2722,'540228',3),
+(2732,'仁布县',2722,'540229',3),
+(2733,'康马县',2722,'540230',3),
+(2734,'定结县',2722,'540231',3),
+(2735,'仲巴县',2722,'540232',3),
+(2736,'亚东县',2722,'540233',3),
+(2737,'吉隆县',2722,'540234',3),
+(2738,'聂拉木县',2722,'540235',3),
+(2739,'萨嘎县',2722,'540236',3),
+(2740,'岗巴县',2722,'540237',3),
+(2741,'昌都市',2712,'540300',2),
+(2742,'卡若区',2741,'540302',3),
+(2743,'江达县',2741,'540321',3),
+(2744,'贡觉县',2741,'540322',3),
+(2745,'类乌齐县',2741,'540323',3),
+(2746,'丁青县',2741,'540324',3),
+(2747,'察雅县',2741,'540325',3),
+(2748,'八宿县',2741,'540326',3),
+(2749,'左贡县',2741,'540327',3),
+(2750,'芒康县',2741,'540328',3),
+(2751,'洛隆县',2741,'540329',3),
+(2752,'边坝县',2741,'540330',3),
+(2753,'林芝市',2712,'540400',2),
+(2754,'巴宜区',2753,'540402',3),
+(2755,'工布江达县',2753,'540421',3),
+(2756,'米林县',2753,'540422',3),
+(2757,'墨脱县',2753,'540423',3),
+(2758,'波密县',2753,'540424',3),
+(2759,'察隅县',2753,'540425',3),
+(2760,'朗县',2753,'540426',3),
+(2761,'山南市',2712,'540500',2),
+(2762,'乃东区',2761,'540502',3),
+(2763,'扎囊县',2761,'540521',3),
+(2764,'贡嘎县',2761,'540522',3),
+(2765,'桑日县',2761,'540523',3),
+(2766,'琼结县',2761,'540524',3),
+(2767,'曲松县',2761,'540525',3),
+(2768,'措美县',2761,'540526',3),
+(2769,'洛扎县',2761,'540527',3),
+(2770,'加查县',2761,'540528',3),
+(2771,'隆子县',2761,'540529',3),
+(2772,'错那县',2761,'540530',3),
+(2773,'浪卡子县',2761,'540531',3),
+(2774,'那曲市',2712,'540600',2),
+(2775,'色尼区',2774,'540602',3),
+(2776,'嘉黎县',2774,'540621',3),
+(2777,'比如县',2774,'540622',3),
+(2778,'聂荣县',2774,'540623',3),
+(2779,'安多县',2774,'540624',3),
+(2780,'申扎县',2774,'540625',3),
+(2781,'索县',2774,'540626',3),
+(2782,'班戈县',2774,'540627',3),
+(2783,'巴青县',2774,'540628',3),
+(2784,'尼玛县',2774,'540629',3),
+(2785,'双湖县',2774,'540630',3),
+(2786,'阿里地区',2712,'542500',2),
+(2787,'普兰县',2786,'542521',3),
+(2788,'札达县',2786,'542522',3),
+(2789,'噶尔县',2786,'542523',3),
+(2790,'日土县',2786,'542524',3),
+(2791,'革吉县',2786,'542525',3),
+(2792,'改则县',2786,'542526',3),
+(2793,'措勤县',2786,'542527',3),
+(2794,'陕西省',0,'610000',1),
+(2795,'西安市',2794,'610100',2),
+(2796,'新城区',2795,'610102',3),
+(2797,'碑林区',2795,'610103',3),
+(2798,'莲湖区',2795,'610104',3),
+(2799,'灞桥区',2795,'610111',3),
+(2800,'未央区',2795,'610112',3),
+(2801,'雁塔区',2795,'610113',3),
+(2802,'阎良区',2795,'610114',3),
+(2803,'临潼区',2795,'610115',3),
+(2804,'长安区',2795,'610116',3),
+(2805,'高陵区',2795,'610117',3),
+(2806,'鄠邑区',2795,'610118',3),
+(2807,'蓝田县',2795,'610122',3),
+(2808,'周至县',2795,'610124',3),
+(2809,'铜川市',2794,'610200',2),
+(2810,'王益区',2809,'610202',3),
+(2811,'印台区',2809,'610203',3),
+(2812,'耀州区',2809,'610204',3),
+(2813,'宜君县',2809,'610222',3),
+(2814,'宝鸡市',2794,'610300',2),
+(2815,'渭滨区',2814,'610302',3),
+(2816,'金台区',2814,'610303',3),
+(2817,'陈仓区',2814,'610304',3),
+(2818,'凤翔县',2814,'610322',3),
+(2819,'岐山县',2814,'610323',3),
+(2820,'扶风县',2814,'610324',3),
+(2821,'眉县',2814,'610326',3),
+(2822,'陇县',2814,'610327',3),
+(2823,'千阳县',2814,'610328',3),
+(2824,'麟游县',2814,'610329',3),
+(2825,'凤县',2814,'610330',3),
+(2826,'太白县',2814,'610331',3),
+(2827,'咸阳市',2794,'610400',2),
+(2828,'秦都区',2827,'610402',3),
+(2829,'杨陵区',2827,'610403',3),
+(2830,'渭城区',2827,'610404',3),
+(2831,'三原县',2827,'610422',3),
+(2832,'泾阳县',2827,'610423',3),
+(2833,'乾县',2827,'610424',3),
+(2834,'礼泉县',2827,'610425',3),
+(2835,'永寿县',2827,'610426',3),
+(2836,'长武县',2827,'610428',3),
+(2837,'旬邑县',2827,'610429',3),
+(2838,'淳化县',2827,'610430',3),
+(2839,'武功县',2827,'610431',3),
+(2840,'兴平市',2827,'610481',3),
+(2841,'彬州市',2827,'610482',3),
+(2842,'渭南市',2794,'610500',2),
+(2843,'临渭区',2842,'610502',3),
+(2844,'华州区',2842,'610503',3),
+(2845,'潼关县',2842,'610522',3),
+(2846,'大荔县',2842,'610523',3),
+(2847,'合阳县',2842,'610524',3),
+(2848,'澄城县',2842,'610525',3),
+(2849,'蒲城县',2842,'610526',3),
+(2850,'白水县',2842,'610527',3),
+(2851,'富平县',2842,'610528',3),
+(2852,'韩城市',2842,'610581',3),
+(2853,'华阴市',2842,'610582',3),
+(2854,'延安市',2794,'610600',2),
+(2855,'宝塔区',2854,'610602',3),
+(2856,'安塞区',2854,'610603',3),
+(2857,'延长县',2854,'610621',3),
+(2858,'延川县',2854,'610622',3),
+(2859,'志丹县',2854,'610625',3),
+(2860,'吴起县',2854,'610626',3),
+(2861,'甘泉县',2854,'610627',3),
+(2862,'富县',2854,'610628',3),
+(2863,'洛川县',2854,'610629',3),
+(2864,'宜川县',2854,'610630',3),
+(2865,'黄龙县',2854,'610631',3),
+(2866,'黄陵县',2854,'610632',3),
+(2867,'子长市',2854,'610681',3),
+(2868,'汉中市',2794,'610700',2),
+(2869,'汉台区',2868,'610702',3),
+(2870,'南郑区',2868,'610703',3),
+(2871,'城固县',2868,'610722',3),
+(2872,'洋县',2868,'610723',3),
+(2873,'西乡县',2868,'610724',3),
+(2874,'勉县',2868,'610725',3),
+(2875,'宁强县',2868,'610726',3),
+(2876,'略阳县',2868,'610727',3),
+(2877,'镇巴县',2868,'610728',3),
+(2878,'留坝县',2868,'610729',3),
+(2879,'佛坪县',2868,'610730',3),
+(2880,'榆林市',2794,'610800',2),
+(2881,'榆阳区',2880,'610802',3),
+(2882,'横山区',2880,'610803',3),
+(2883,'府谷县',2880,'610822',3),
+(2884,'靖边县',2880,'610824',3),
+(2885,'定边县',2880,'610825',3),
+(2886,'绥德县',2880,'610826',3),
+(2887,'米脂县',2880,'610827',3),
+(2888,'佳县',2880,'610828',3),
+(2889,'吴堡县',2880,'610829',3),
+(2890,'清涧县',2880,'610830',3),
+(2891,'子洲县',2880,'610831',3),
+(2892,'神木市',2880,'610881',3),
+(2893,'安康市',2794,'610900',2),
+(2894,'汉滨区',2893,'610902',3),
+(2895,'汉阴县',2893,'610921',3),
+(2896,'石泉县',2893,'610922',3),
+(2897,'宁陕县',2893,'610923',3),
+(2898,'紫阳县',2893,'610924',3),
+(2899,'岚皋县',2893,'610925',3),
+(2900,'平利县',2893,'610926',3),
+(2901,'镇坪县',2893,'610927',3),
+(2902,'旬阳县',2893,'610928',3),
+(2903,'白河县',2893,'610929',3),
+(2904,'商洛市',2794,'611000',2),
+(2905,'商州区',2904,'611002',3),
+(2906,'洛南县',2904,'611021',3),
+(2907,'丹凤县',2904,'611022',3),
+(2908,'商南县',2904,'611023',3),
+(2909,'山阳县',2904,'611024',3),
+(2910,'镇安县',2904,'611025',3),
+(2911,'柞水县',2904,'611026',3),
+(2912,'甘肃省',0,'620000',1),
+(2913,'兰州市',2912,'620100',2),
+(2914,'城关区',2913,'620102',3),
+(2915,'七里河区',2913,'620103',3),
+(2916,'西固区',2913,'620104',3),
+(2917,'安宁区',2913,'620105',3),
+(2918,'红古区',2913,'620111',3),
+(2919,'永登县',2913,'620121',3),
+(2920,'皋兰县',2913,'620122',3),
+(2921,'榆中县',2913,'620123',3),
+(2922,'嘉峪关市',2912,'620200',2),
+(2923,'金昌市',2912,'620300',2),
+(2924,'金川区',2923,'620302',3),
+(2925,'永昌县',2923,'620321',3),
+(2926,'白银市',2912,'620400',2),
+(2927,'白银区',2926,'620402',3),
+(2928,'平川区',2926,'620403',3),
+(2929,'靖远县',2926,'620421',3),
+(2930,'会宁县',2926,'620422',3),
+(2931,'景泰县',2926,'620423',3),
+(2932,'天水市',2912,'620500',2),
+(2933,'秦州区',2932,'620502',3),
+(2934,'麦积区',2932,'620503',3),
+(2935,'清水县',2932,'620521',3),
+(2936,'秦安县',2932,'620522',3),
+(2937,'甘谷县',2932,'620523',3),
+(2938,'武山县',2932,'620524',3),
+(2939,'张家川回族自治县',2932,'620525',3),
+(2940,'武威市',2912,'620600',2),
+(2941,'凉州区',2940,'620602',3),
+(2942,'民勤县',2940,'620621',3),
+(2943,'古浪县',2940,'620622',3),
+(2944,'天祝藏族自治县',2940,'620623',3),
+(2945,'张掖市',2912,'620700',2),
+(2946,'甘州区',2945,'620702',3),
+(2947,'肃南裕固族自治县',2945,'620721',3),
+(2948,'民乐县',2945,'620722',3),
+(2949,'临泽县',2945,'620723',3),
+(2950,'高台县',2945,'620724',3),
+(2951,'山丹县',2945,'620725',3),
+(2952,'平凉市',2912,'620800',2),
+(2953,'崆峒区',2952,'620802',3),
+(2954,'泾川县',2952,'620821',3),
+(2955,'灵台县',2952,'620822',3),
+(2956,'崇信县',2952,'620823',3),
+(2957,'庄浪县',2952,'620825',3),
+(2958,'静宁县',2952,'620826',3),
+(2959,'华亭市',2952,'620881',3),
+(2960,'酒泉市',2912,'620900',2),
+(2961,'肃州区',2960,'620902',3),
+(2962,'金塔县',2960,'620921',3),
+(2963,'瓜州县',2960,'620922',3),
+(2964,'肃北蒙古族自治县',2960,'620923',3),
+(2965,'阿克塞哈萨克族自治县',2960,'620924',3),
+(2966,'玉门市',2960,'620981',3),
+(2967,'敦煌市',2960,'620982',3),
+(2968,'庆阳市',2912,'621000',2),
+(2969,'西峰区',2968,'621002',3),
+(2970,'庆城县',2968,'621021',3),
+(2971,'环县',2968,'621022',3),
+(2972,'华池县',2968,'621023',3),
+(2973,'合水县',2968,'621024',3),
+(2974,'正宁县',2968,'621025',3),
+(2975,'宁县',2968,'621026',3),
+(2976,'镇原县',2968,'621027',3),
+(2977,'定西市',2912,'621100',2),
+(2978,'安定区',2977,'621102',3),
+(2979,'通渭县',2977,'621121',3),
+(2980,'陇西县',2977,'621122',3),
+(2981,'渭源县',2977,'621123',3),
+(2982,'临洮县',2977,'621124',3),
+(2983,'漳县',2977,'621125',3),
+(2984,'岷县',2977,'621126',3),
+(2985,'陇南市',2912,'621200',2),
+(2986,'武都区',2985,'621202',3),
+(2987,'成县',2985,'621221',3),
+(2988,'文县',2985,'621222',3),
+(2989,'宕昌县',2985,'621223',3),
+(2990,'康县',2985,'621224',3),
+(2991,'西和县',2985,'621225',3),
+(2992,'礼县',2985,'621226',3),
+(2993,'徽县',2985,'621227',3),
+(2994,'两当县',2985,'621228',3),
+(2995,'临夏回族自治州',2912,'622900',2),
+(2996,'临夏市',2995,'622901',3),
+(2997,'临夏县',2995,'622921',3),
+(2998,'康乐县',2995,'622922',3),
+(2999,'永靖县',2995,'622923',3),
+(3000,'广河县',2995,'622924',3),
+(3001,'和政县',2995,'622925',3),
+(3002,'东乡族自治县',2995,'622926',3),
+(3003,'积石山保安族东乡族撒拉族自治县',2995,'622927',3),
+(3004,'甘南藏族自治州',2912,'623000',2),
+(3005,'合作市',3004,'623001',3),
+(3006,'临潭县',3004,'623021',3),
+(3007,'卓尼县',3004,'623022',3),
+(3008,'舟曲县',3004,'623023',3),
+(3009,'迭部县',3004,'623024',3),
+(3010,'玛曲县',3004,'623025',3),
+(3011,'碌曲县',3004,'623026',3),
+(3012,'夏河县',3004,'623027',3),
+(3013,'青海省',0,'630000',1),
+(3014,'西宁市',3013,'630100',2),
+(3015,'城东区',3014,'630102',3),
+(3016,'城中区',3014,'630103',3),
+(3017,'城西区',3014,'630104',3),
+(3018,'城北区',3014,'630105',3),
+(3019,'湟中区',3014,'630106',3),
+(3020,'大通回族土族自治县',3014,'630121',3),
+(3021,'湟源县',3014,'630123',3),
+(3022,'海东市',3013,'630200',2),
+(3023,'乐都区',3022,'630202',3),
+(3024,'平安区',3022,'630203',3),
+(3025,'民和回族土族自治县',3022,'630222',3),
+(3026,'互助土族自治县',3022,'630223',3),
+(3027,'化隆回族自治县',3022,'630224',3),
+(3028,'循化撒拉族自治县',3022,'630225',3),
+(3029,'海北藏族自治州',3013,'632200',2),
+(3030,'门源回族自治县',3029,'632221',3),
+(3031,'祁连县',3029,'632222',3),
+(3032,'海晏县',3029,'632223',3),
+(3033,'刚察县',3029,'632224',3),
+(3034,'黄南藏族自治州',3013,'632300',2),
+(3035,'同仁县',3034,'632321',3),
+(3036,'尖扎县',3034,'632322',3),
+(3037,'泽库县',3034,'632323',3),
+(3038,'河南蒙古族自治县',3034,'632324',3),
+(3039,'海南藏族自治州',3013,'632500',2),
+(3040,'共和县',3039,'632521',3),
+(3041,'同德县',3039,'632522',3),
+(3042,'贵德县',3039,'632523',3),
+(3043,'兴海县',3039,'632524',3),
+(3044,'贵南县',3039,'632525',3),
+(3045,'果洛藏族自治州',3013,'632600',2),
+(3046,'玛沁县',3045,'632621',3),
+(3047,'班玛县',3045,'632622',3),
+(3048,'甘德县',3045,'632623',3),
+(3049,'达日县',3045,'632624',3),
+(3050,'久治县',3045,'632625',3),
+(3051,'玛多县',3045,'632626',3),
+(3052,'玉树藏族自治州',3013,'632700',2),
+(3053,'玉树市',3052,'632701',3),
+(3054,'杂多县',3052,'632722',3),
+(3055,'称多县',3052,'632723',3),
+(3056,'治多县',3052,'632724',3),
+(3057,'囊谦县',3052,'632725',3),
+(3058,'曲麻莱县',3052,'632726',3),
+(3059,'海西蒙古族藏族自治州',3013,'632800',2),
+(3060,'格尔木市',3059,'632801',3),
+(3061,'德令哈市',3059,'632802',3),
+(3062,'茫崖市',3059,'632803',3),
+(3063,'乌兰县',3059,'632821',3),
+(3064,'都兰县',3059,'632822',3),
+(3065,'天峻县',3059,'632823',3),
+(3066,'宁夏回族自治区',0,'640000',1),
+(3067,'银川市',3066,'640100',2),
+(3068,'兴庆区',3067,'640104',3),
+(3069,'西夏区',3067,'640105',3),
+(3070,'金凤区',3067,'640106',3),
+(3071,'永宁县',3067,'640121',3),
+(3072,'贺兰县',3067,'640122',3),
+(3073,'灵武市',3067,'640181',3),
+(3074,'石嘴山市',3066,'640200',2),
+(3075,'大武口区',3074,'640202',3),
+(3076,'惠农区',3074,'640205',3),
+(3077,'平罗县',3074,'640221',3),
+(3078,'吴忠市',3066,'640300',2),
+(3079,'利通区',3078,'640302',3),
+(3080,'红寺堡区',3078,'640303',3),
+(3081,'盐池县',3078,'640323',3),
+(3082,'同心县',3078,'640324',3),
+(3083,'青铜峡市',3078,'640381',3),
+(3084,'固原市',3066,'640400',2),
+(3085,'原州区',3084,'640402',3),
+(3086,'西吉县',3084,'640422',3),
+(3087,'隆德县',3084,'640423',3),
+(3088,'泾源县',3084,'640424',3),
+(3089,'彭阳县',3084,'640425',3),
+(3090,'中卫市',3066,'640500',2),
+(3091,'沙坡头区',3090,'640502',3),
+(3092,'中宁县',3090,'640521',3),
+(3093,'海原县',3090,'640522',3),
+(3094,'新疆维吾尔自治区',0,'650000',1),
+(3095,'乌鲁木齐市',3094,'650100',2),
+(3096,'天山区',3095,'650102',3),
+(3097,'沙依巴克区',3095,'650103',3),
+(3098,'新市区',3095,'650104',3),
+(3099,'水磨沟区',3095,'650105',3),
+(3100,'头屯河区',3095,'650106',3),
+(3101,'达坂城区',3095,'650107',3),
+(3102,'米东区',3095,'650109',3),
+(3103,'乌鲁木齐县',3095,'650121',3),
+(3104,'克拉玛依市',3094,'650200',2),
+(3105,'独山子区',3104,'650202',3),
+(3106,'克拉玛依区',3104,'650203',3),
+(3107,'白碱滩区',3104,'650204',3),
+(3108,'乌尔禾区',3104,'650205',3),
+(3109,'吐鲁番市',3094,'650400',2),
+(3110,'高昌区',3109,'650402',3),
+(3111,'鄯善县',3109,'650421',3),
+(3112,'托克逊县',3109,'650422',3),
+(3113,'哈密市',3094,'650500',2),
+(3114,'伊州区',3113,'650502',3),
+(3115,'巴里坤哈萨克自治县',3113,'650521',3),
+(3116,'伊吾县',3113,'650522',3),
+(3117,'昌吉回族自治州',3094,'652300',2),
+(3118,'昌吉市',3117,'652301',3),
+(3119,'阜康市',3117,'652302',3),
+(3120,'呼图壁县',3117,'652323',3),
+(3121,'玛纳斯县',3117,'652324',3),
+(3122,'奇台县',3117,'652325',3),
+(3123,'吉木萨尔县',3117,'652327',3),
+(3124,'木垒哈萨克自治县',3117,'652328',3),
+(3125,'博尔塔拉蒙古自治州',3094,'652700',2),
+(3126,'博乐市',3125,'652701',3),
+(3127,'阿拉山口市',3125,'652702',3),
+(3128,'精河县',3125,'652722',3),
+(3129,'温泉县',3125,'652723',3),
+(3130,'巴音郭楞蒙古自治州',3094,'652800',2),
+(3131,'库尔勒市',3130,'652801',3),
+(3132,'轮台县',3130,'652822',3),
+(3133,'尉犁县',3130,'652823',3),
+(3134,'若羌县',3130,'652824',3),
+(3135,'且末县',3130,'652825',3),
+(3136,'焉耆回族自治县',3130,'652826',3),
+(3137,'和静县',3130,'652827',3),
+(3138,'和硕县',3130,'652828',3),
+(3139,'博湖县',3130,'652829',3),
+(3140,'阿克苏地区',3094,'652900',2),
+(3141,'阿克苏市',3140,'652901',3),
+(3142,'库车市',3140,'652902',3),
+(3143,'温宿县',3140,'652922',3),
+(3144,'沙雅县',3140,'652924',3),
+(3145,'新和县',3140,'652925',3),
+(3146,'拜城县',3140,'652926',3),
+(3147,'乌什县',3140,'652927',3),
+(3148,'阿瓦提县',3140,'652928',3),
+(3149,'柯坪县',3140,'652929',3),
+(3150,'克孜勒苏柯尔克孜自治州',3094,'653000',2),
+(3151,'阿图什市',3150,'653001',3),
+(3152,'阿克陶县',3150,'653022',3),
+(3153,'阿合奇县',3150,'653023',3),
+(3154,'乌恰县',3150,'653024',3),
+(3155,'喀什地区',3094,'653100',2),
+(3156,'喀什市',3155,'653101',3),
+(3157,'疏附县',3155,'653121',3),
+(3158,'疏勒县',3155,'653122',3),
+(3159,'英吉沙县',3155,'653123',3),
+(3160,'泽普县',3155,'653124',3),
+(3161,'莎车县',3155,'653125',3),
+(3162,'叶城县',3155,'653126',3),
+(3163,'麦盖提县',3155,'653127',3),
+(3164,'岳普湖县',3155,'653128',3),
+(3165,'伽师县',3155,'653129',3),
+(3166,'巴楚县',3155,'653130',3),
+(3167,'塔什库尔干塔吉克自治县',3155,'653131',3),
+(3168,'和田地区',3094,'653200',2),
+(3169,'和田市',3168,'653201',3),
+(3170,'和田县',3168,'653221',3),
+(3171,'墨玉县',3168,'653222',3),
+(3172,'皮山县',3168,'653223',3),
+(3173,'洛浦县',3168,'653224',3),
+(3174,'策勒县',3168,'653225',3),
+(3175,'于田县',3168,'653226',3),
+(3176,'民丰县',3168,'653227',3),
+(3177,'伊犁哈萨克自治州',3094,'654000',2),
+(3178,'伊宁市',3177,'654002',3),
+(3179,'奎屯市',3177,'654003',3),
+(3180,'霍尔果斯市',3177,'654004',3),
+(3181,'伊宁县',3177,'654021',3),
+(3182,'察布查尔锡伯自治县',3177,'654022',3),
+(3183,'霍城县',3177,'654023',3),
+(3184,'巩留县',3177,'654024',3),
+(3185,'新源县',3177,'654025',3),
+(3186,'昭苏县',3177,'654026',3),
+(3187,'特克斯县',3177,'654027',3),
+(3188,'尼勒克县',3177,'654028',3),
+(3189,'塔城地区',3094,'654200',2),
+(3190,'塔城市',3189,'654201',3),
+(3191,'乌苏市',3189,'654202',3),
+(3192,'额敏县',3189,'654221',3),
+(3193,'沙湾县',3189,'654223',3),
+(3194,'托里县',3189,'654224',3),
+(3195,'裕民县',3189,'654225',3),
+(3196,'和布克赛尔蒙古自治县',3189,'654226',3),
+(3197,'阿勒泰地区',3094,'654300',2),
+(3198,'阿勒泰市',3197,'654301',3),
+(3199,'布尔津县',3197,'654321',3),
+(3200,'富蕴县',3197,'654322',3),
+(3201,'福海县',3197,'654323',3),
+(3202,'哈巴河县',3197,'654324',3),
+(3203,'青河县',3197,'654325',3),
+(3204,'吉木乃县',3197,'654326',3),
+(3205,'石河子市',3094,'659001',3),
+(3206,'阿拉尔市',3094,'659002',3),
+(3207,'图木舒克市',3094,'659003',3),
+(3208,'五家渠市',3094,'659004',3),
+(3209,'北屯市',3094,'659005',3),
+(3210,'铁门关市',3094,'659006',3),
+(3211,'双河市',3094,'659007',3),
+(3212,'可克达拉市',3094,'659008',3),
+(3213,'昆玉市',3094,'659009',3),
+(3214,'胡杨河市',3094,'659010',3),
+(3215,'台湾省',0,'710000',1),
+(3216,'台北市',3215,'710100',2),
+(3217,'中正区',3216,'710101',3),
+(3218,'大同区',3216,'710102',3),
+(3219,'中山区',3216,'710103',3),
+(3220,'松山区',3216,'710104',3),
+(3221,'大安区',3216,'710105',3),
+(3222,'万华区',3216,'710106',3),
+(3223,'信义区',3216,'710107',3),
+(3224,'士林区',3216,'710108',3),
+(3225,'北投区',3216,'710109',3),
+(3226,'内湖区',3216,'710110',3),
+(3227,'南港区',3216,'710111',3),
+(3228,'文山区',3216,'710112',3),
+(3229,'高雄市',3215,'710200',2),
+(3230,'新兴区',3229,'710201',3),
+(3231,'前金区',3229,'710202',3),
+(3232,'苓雅区',3229,'710203',3),
+(3233,'盐埕区',3229,'710204',3),
+(3234,'鼓山区',3229,'710205',3),
+(3235,'旗津区',3229,'710206',3),
+(3236,'前镇区',3229,'710207',3),
+(3237,'三民区',3229,'710208',3),
+(3238,'左营区',3229,'710209',3),
+(3239,'楠梓区',3229,'710210',3),
+(3240,'小港区',3229,'710211',3),
+(3241,'仁武区',3229,'710242',3),
+(3242,'大社区',3229,'710243',3),
+(3243,'冈山区',3229,'710244',3),
+(3244,'路竹区',3229,'710245',3),
+(3245,'阿莲区',3229,'710246',3),
+(3246,'田寮区',3229,'710247',3),
+(3247,'燕巢区',3229,'710248',3),
+(3248,'桥头区',3229,'710249',3),
+(3249,'梓官区',3229,'710250',3),
+(3250,'弥陀区',3229,'710251',3),
+(3251,'永安区',3229,'710252',3),
+(3252,'湖内区',3229,'710253',3),
+(3253,'凤山区',3229,'710254',3),
+(3254,'大寮区',3229,'710255',3),
+(3255,'林园区',3229,'710256',3),
+(3256,'鸟松区',3229,'710257',3),
+(3257,'大树区',3229,'710258',3),
+(3258,'旗山区',3229,'710259',3),
+(3259,'美浓区',3229,'710260',3),
+(3260,'六龟区',3229,'710261',3),
+(3261,'内门区',3229,'710262',3),
+(3262,'杉林区',3229,'710263',3),
+(3263,'甲仙区',3229,'710264',3),
+(3264,'桃源区',3229,'710265',3),
+(3265,'那玛夏区',3229,'710266',3),
+(3266,'茂林区',3229,'710267',3),
+(3267,'茄萣区',3229,'710268',3),
+(3268,'台南市',3215,'710300',2),
+(3269,'中西区',3268,'710301',3),
+(3270,'东区',3268,'710302',3),
+(3271,'南区',3268,'710303',3),
+(3272,'北区',3268,'710304',3),
+(3273,'安平区',3268,'710305',3),
+(3274,'安南区',3268,'710306',3),
+(3275,'永康区',3268,'710339',3),
+(3276,'归仁区',3268,'710340',3),
+(3277,'新化区',3268,'710341',3),
+(3278,'左镇区',3268,'710342',3),
+(3279,'玉井区',3268,'710343',3),
+(3280,'楠西区',3268,'710344',3),
+(3281,'南化区',3268,'710345',3),
+(3282,'仁德区',3268,'710346',3),
+(3283,'关庙区',3268,'710347',3),
+(3284,'龙崎区',3268,'710348',3),
+(3285,'官田区',3268,'710349',3),
+(3286,'麻豆区',3268,'710350',3),
+(3287,'佳里区',3268,'710351',3),
+(3288,'西港区',3268,'710352',3),
+(3289,'七股区',3268,'710353',3),
+(3290,'将军区',3268,'710354',3),
+(3291,'学甲区',3268,'710355',3),
+(3292,'北门区',3268,'710356',3),
+(3293,'新营区',3268,'710357',3),
+(3294,'后壁区',3268,'710358',3),
+(3295,'白河区',3268,'710359',3),
+(3296,'东山区',3268,'710360',3),
+(3297,'六甲区',3268,'710361',3),
+(3298,'下营区',3268,'710362',3),
+(3299,'柳营区',3268,'710363',3),
+(3300,'盐水区',3268,'710364',3),
+(3301,'善化区',3268,'710365',3),
+(3302,'大内区',3268,'710366',3),
+(3303,'山上区',3268,'710367',3),
+(3304,'新市区',3268,'710368',3),
+(3305,'安定区',3268,'710369',3),
+(3306,'台中市',3215,'710400',2),
+(3307,'中区',3306,'710401',3),
+(3308,'东区',3306,'710402',3),
+(3309,'南区',3306,'710403',3),
+(3310,'西区',3306,'710404',3),
+(3311,'北区',3306,'710405',3),
+(3312,'北屯区',3306,'710406',3),
+(3313,'西屯区',3306,'710407',3),
+(3314,'南屯区',3306,'710408',3),
+(3315,'太平区',3306,'710431',3),
+(3316,'大里区',3306,'710432',3),
+(3317,'雾峰区',3306,'710433',3),
+(3318,'乌日区',3306,'710434',3),
+(3319,'丰原区',3306,'710435',3),
+(3320,'后里区',3306,'710436',3),
+(3321,'石冈区',3306,'710437',3),
+(3322,'东势区',3306,'710438',3),
+(3323,'和平区',3306,'710439',3),
+(3324,'新社区',3306,'710440',3),
+(3325,'潭子区',3306,'710441',3),
+(3326,'大雅区',3306,'710442',3),
+(3327,'神冈区',3306,'710443',3),
+(3328,'大肚区',3306,'710444',3),
+(3329,'沙鹿区',3306,'710445',3),
+(3330,'龙井区',3306,'710446',3),
+(3331,'梧栖区',3306,'710447',3),
+(3332,'清水区',3306,'710448',3),
+(3333,'大甲区',3306,'710449',3),
+(3334,'外埔区',3306,'710450',3),
+(3335,'大安区',3306,'710451',3),
+(3336,'南投县',3215,'710600',2),
+(3337,'南投市',3336,'710614',3),
+(3338,'中寮乡',3336,'710615',3),
+(3339,'草屯镇',3336,'710616',3),
+(3340,'国姓乡',3336,'710617',3),
+(3341,'埔里镇',3336,'710618',3),
+(3342,'仁爱乡',3336,'710619',3),
+(3343,'名间乡',3336,'710620',3),
+(3344,'集集镇',3336,'710621',3),
+(3345,'水里乡',3336,'710622',3),
+(3346,'鱼池乡',3336,'710623',3),
+(3347,'信义乡',3336,'710624',3),
+(3348,'竹山镇',3336,'710625',3),
+(3349,'鹿谷乡',3336,'710626',3),
+(3350,'基隆市',3215,'710700',2),
+(3351,'仁爱区',3350,'710701',3),
+(3352,'信义区',3350,'710702',3),
+(3353,'中正区',3350,'710703',3),
+(3354,'中山区',3350,'710704',3),
+(3355,'安乐区',3350,'710705',3),
+(3356,'暖暖区',3350,'710706',3),
+(3357,'七堵区',3350,'710707',3),
+(3358,'新竹市',3215,'710800',2),
+(3359,'东区',3358,'710801',3),
+(3360,'北区',3358,'710802',3),
+(3361,'香山区',3358,'710803',3),
+(3362,'嘉义市',3215,'710900',2),
+(3363,'东区',3362,'710901',3),
+(3364,'西区',3362,'710902',3),
+(3365,'新北市',3215,'711100',2),
+(3366,'万里区',3365,'711130',3),
+(3367,'金山区',3365,'711131',3),
+(3368,'板桥区',3365,'711132',3),
+(3369,'汐止区',3365,'711133',3),
+(3370,'深坑区',3365,'711134',3),
+(3371,'石碇区',3365,'711135',3),
+(3372,'瑞芳区',3365,'711136',3),
+(3373,'平溪区',3365,'711137',3),
+(3374,'双溪区',3365,'711138',3),
+(3375,'贡寮区',3365,'711139',3),
+(3376,'新店区',3365,'711140',3),
+(3377,'坪林区',3365,'711141',3),
+(3378,'乌来区',3365,'711142',3),
+(3379,'永和区',3365,'711143',3),
+(3380,'中和区',3365,'711144',3),
+(3381,'土城区',3365,'711145',3),
+(3382,'三峡区',3365,'711146',3),
+(3383,'树林区',3365,'711147',3),
+(3384,'莺歌区',3365,'711148',3),
+(3385,'三重区',3365,'711149',3),
+(3386,'新庄区',3365,'711150',3),
+(3387,'泰山区',3365,'711151',3),
+(3388,'林口区',3365,'711152',3),
+(3389,'芦洲区',3365,'711153',3),
+(3390,'五股区',3365,'711154',3),
+(3391,'八里区',3365,'711155',3),
+(3392,'淡水区',3365,'711156',3),
+(3393,'三芝区',3365,'711157',3),
+(3394,'石门区',3365,'711158',3),
+(3395,'宜兰县',3215,'711200',2),
+(3396,'宜兰市',3395,'711214',3),
+(3397,'头城镇',3395,'711215',3),
+(3398,'礁溪乡',3395,'711216',3),
+(3399,'壮围乡',3395,'711217',3),
+(3400,'员山乡',3395,'711218',3),
+(3401,'罗东镇',3395,'711219',3),
+(3402,'三星乡',3395,'711220',3),
+(3403,'大同乡',3395,'711221',3),
+(3404,'五结乡',3395,'711222',3),
+(3405,'冬山乡',3395,'711223',3),
+(3406,'苏澳镇',3395,'711224',3),
+(3407,'南澳乡',3395,'711225',3),
+(3408,'新竹县',3215,'711300',2),
+(3409,'竹北市',3408,'711314',3),
+(3410,'湖口乡',3408,'711315',3),
+(3411,'新丰乡',3408,'711316',3),
+(3412,'新埔镇',3408,'711317',3),
+(3413,'关西镇',3408,'711318',3),
+(3414,'芎林乡',3408,'711319',3),
+(3415,'宝山乡',3408,'711320',3),
+(3416,'竹东镇',3408,'711321',3),
+(3417,'五峰乡',3408,'711322',3),
+(3418,'横山乡',3408,'711323',3),
+(3419,'尖石乡',3408,'711324',3),
+(3420,'北埔乡',3408,'711325',3),
+(3421,'峨眉乡',3408,'711326',3),
+(3422,'桃园市',3215,'711400',2),
+(3423,'中坜区',3422,'711414',3),
+(3424,'平镇区',3422,'711415',3),
+(3425,'龙潭区',3422,'711416',3),
+(3426,'杨梅区',3422,'711417',3),
+(3427,'新屋区',3422,'711418',3),
+(3428,'观音区',3422,'711419',3),
+(3429,'桃园区',3422,'711420',3),
+(3430,'龟山区',3422,'711421',3),
+(3431,'八德区',3422,'711422',3),
+(3432,'大溪区',3422,'711423',3),
+(3433,'复兴区',3422,'711424',3),
+(3434,'大园区',3422,'711425',3),
+(3435,'芦竹区',3422,'711426',3),
+(3436,'苗栗县',3215,'711500',2),
+(3437,'竹南镇',3436,'711519',3),
+(3438,'头份市',3436,'711520',3),
+(3439,'三湾乡',3436,'711521',3),
+(3440,'南庄乡',3436,'711522',3),
+(3441,'狮潭乡',3436,'711523',3),
+(3442,'后龙镇',3436,'711524',3),
+(3443,'通霄镇',3436,'711525',3),
+(3444,'苑里镇',3436,'711526',3),
+(3445,'苗栗市',3436,'711527',3),
+(3446,'造桥乡',3436,'711528',3),
+(3447,'头屋乡',3436,'711529',3),
+(3448,'公馆乡',3436,'711530',3),
+(3449,'大湖乡',3436,'711531',3),
+(3450,'泰安乡',3436,'711532',3),
+(3451,'铜锣乡',3436,'711533',3),
+(3452,'三义乡',3436,'711534',3),
+(3453,'西湖乡',3436,'711535',3),
+(3454,'卓兰镇',3436,'711536',3),
+(3455,'彰化县',3215,'711700',2),
+(3456,'彰化市',3455,'711727',3),
+(3457,'芬园乡',3455,'711728',3),
+(3458,'花坛乡',3455,'711729',3),
+(3459,'秀水乡',3455,'711730',3),
+(3460,'鹿港镇',3455,'711731',3),
+(3461,'福兴乡',3455,'711732',3),
+(3462,'线西乡',3455,'711733',3),
+(3463,'和美镇',3455,'711734',3),
+(3464,'伸港乡',3455,'711735',3),
+(3465,'员林市',3455,'711736',3),
+(3466,'社头乡',3455,'711737',3),
+(3467,'永靖乡',3455,'711738',3),
+(3468,'埔心乡',3455,'711739',3),
+(3469,'溪湖镇',3455,'711740',3),
+(3470,'大村乡',3455,'711741',3),
+(3471,'埔盐乡',3455,'711742',3),
+(3472,'田中镇',3455,'711743',3),
+(3473,'北斗镇',3455,'711744',3),
+(3474,'田尾乡',3455,'711745',3),
+(3475,'埤头乡',3455,'711746',3),
+(3476,'溪州乡',3455,'711747',3),
+(3477,'竹塘乡',3455,'711748',3),
+(3478,'二林镇',3455,'711749',3),
+(3479,'大城乡',3455,'711750',3),
+(3480,'芳苑乡',3455,'711751',3),
+(3481,'二水乡',3455,'711752',3),
+(3482,'嘉义县',3215,'711900',2),
+(3483,'番路乡',3482,'711919',3),
+(3484,'梅山乡',3482,'711920',3),
+(3485,'竹崎乡',3482,'711921',3),
+(3486,'阿里山乡',3482,'711922',3),
+(3487,'中埔乡',3482,'711923',3),
+(3488,'大埔乡',3482,'711924',3),
+(3489,'水上乡',3482,'711925',3),
+(3490,'鹿草乡',3482,'711926',3),
+(3491,'太保市',3482,'711927',3),
+(3492,'朴子市',3482,'711928',3),
+(3493,'东石乡',3482,'711929',3),
+(3494,'六脚乡',3482,'711930',3),
+(3495,'新港乡',3482,'711931',3),
+(3496,'民雄乡',3482,'711932',3),
+(3497,'大林镇',3482,'711933',3),
+(3498,'溪口乡',3482,'711934',3),
+(3499,'义竹乡',3482,'711935',3),
+(3500,'布袋镇',3482,'711936',3),
+(3501,'云林县',3215,'712100',2),
+(3502,'斗南镇',3501,'712121',3),
+(3503,'大埤乡',3501,'712122',3),
+(3504,'虎尾镇',3501,'712123',3),
+(3505,'土库镇',3501,'712124',3),
+(3506,'褒忠乡',3501,'712125',3),
+(3507,'东势乡',3501,'712126',3),
+(3508,'台西乡',3501,'712127',3),
+(3509,'仑背乡',3501,'712128',3),
+(3510,'麦寮乡',3501,'712129',3),
+(3511,'斗六市',3501,'712130',3),
+(3512,'林内乡',3501,'712131',3),
+(3513,'古坑乡',3501,'712132',3),
+(3514,'莿桐乡',3501,'712133',3),
+(3515,'西螺镇',3501,'712134',3),
+(3516,'二仑乡',3501,'712135',3),
+(3517,'北港镇',3501,'712136',3),
+(3518,'水林乡',3501,'712137',3),
+(3519,'口湖乡',3501,'712138',3),
+(3520,'四湖乡',3501,'712139',3),
+(3521,'元长乡',3501,'712140',3),
+(3522,'屏东县',3215,'712400',2),
+(3523,'屏东市',3522,'712434',3),
+(3524,'三地门乡',3522,'712435',3),
+(3525,'雾台乡',3522,'712436',3),
+(3526,'玛家乡',3522,'712437',3),
+(3527,'九如乡',3522,'712438',3),
+(3528,'里港乡',3522,'712439',3),
+(3529,'高树乡',3522,'712440',3),
+(3530,'盐埔乡',3522,'712441',3),
+(3531,'长治乡',3522,'712442',3),
+(3532,'麟洛乡',3522,'712443',3),
+(3533,'竹田乡',3522,'712444',3),
+(3534,'内埔乡',3522,'712445',3),
+(3535,'万丹乡',3522,'712446',3),
+(3536,'潮州镇',3522,'712447',3),
+(3537,'泰武乡',3522,'712448',3),
+(3538,'来义乡',3522,'712449',3),
+(3539,'万峦乡',3522,'712450',3),
+(3540,'崁顶乡',3522,'712451',3),
+(3541,'新埤乡',3522,'712452',3),
+(3542,'南州乡',3522,'712453',3),
+(3543,'林边乡',3522,'712454',3),
+(3544,'东港镇',3522,'712455',3),
+(3545,'琉球乡',3522,'712456',3),
+(3546,'佳冬乡',3522,'712457',3),
+(3547,'新园乡',3522,'712458',3),
+(3548,'枋寮乡',3522,'712459',3),
+(3549,'枋山乡',3522,'712460',3),
+(3550,'春日乡',3522,'712461',3),
+(3551,'狮子乡',3522,'712462',3),
+(3552,'车城乡',3522,'712463',3),
+(3553,'牡丹乡',3522,'712464',3),
+(3554,'恒春镇',3522,'712465',3),
+(3555,'满州乡',3522,'712466',3),
+(3556,'台东县',3215,'712500',2),
+(3557,'台东市',3556,'712517',3),
+(3558,'绿岛乡',3556,'712518',3),
+(3559,'兰屿乡',3556,'712519',3),
+(3560,'延平乡',3556,'712520',3),
+(3561,'卑南乡',3556,'712521',3),
+(3562,'鹿野乡',3556,'712522',3),
+(3563,'关山镇',3556,'712523',3),
+(3564,'海端乡',3556,'712524',3),
+(3565,'池上乡',3556,'712525',3),
+(3566,'东河乡',3556,'712526',3),
+(3567,'成功镇',3556,'712527',3),
+(3568,'长滨乡',3556,'712528',3),
+(3569,'金峰乡',3556,'712529',3),
+(3570,'大武乡',3556,'712530',3),
+(3571,'达仁乡',3556,'712531',3),
+(3572,'太麻里乡',3556,'712532',3),
+(3573,'花莲县',3215,'712600',2),
+(3574,'花莲市',3573,'712615',3),
+(3575,'新城乡',3573,'712616',3),
+(3576,'秀林乡',3573,'712618',3),
+(3577,'吉安乡',3573,'712619',3),
+(3578,'寿丰乡',3573,'712620',3),
+(3579,'凤林镇',3573,'712621',3),
+(3580,'光复乡',3573,'712622',3),
+(3581,'丰滨乡',3573,'712623',3),
+(3582,'瑞穗乡',3573,'712624',3),
+(3583,'万荣乡',3573,'712625',3),
+(3584,'玉里镇',3573,'712626',3),
+(3585,'卓溪乡',3573,'712627',3),
+(3586,'富里乡',3573,'712628',3),
+(3587,'澎湖县',3215,'712700',2),
+(3588,'马公市',3587,'712707',3),
+(3589,'西屿乡',3587,'712708',3),
+(3590,'望安乡',3587,'712709',3),
+(3591,'七美乡',3587,'712710',3),
+(3592,'白沙乡',3587,'712711',3),
+(3593,'湖西乡',3587,'712712',3),
+(3594,'香港特别行政区',0,'810000',1),
+(3595,'香港特别行政区',3594,'810100',2),
+(3596,'中西区',3595,'810101',3),
+(3597,'东区',3595,'810102',3),
+(3598,'九龙城区',3595,'810103',3),
+(3599,'观塘区',3595,'810104',3),
+(3600,'南区',3595,'810105',3),
+(3601,'深水埗区',3595,'810106',3),
+(3602,'湾仔区',3595,'810107',3),
+(3603,'黄大仙区',3595,'810108',3),
+(3604,'油尖旺区',3595,'810109',3),
+(3605,'离岛区',3595,'810110',3),
+(3606,'葵青区',3595,'810111',3),
+(3607,'北区',3595,'810112',3),
+(3608,'西贡区',3595,'810113',3),
+(3609,'沙田区',3595,'810114',3),
+(3610,'屯门区',3595,'810115',3),
+(3611,'大埔区',3595,'810116',3),
+(3612,'荃湾区',3595,'810117',3),
+(3613,'元朗区',3595,'810118',3),
+(3614,'澳门特别行政区',0,'820000',1),
+(3615,'澳门特别行政区',3614,'820100',2),
+(3616,'澳门半岛',3615,'820101',3),
+(3617,'凼仔',3615,'820102',3),
+(3618,'路凼城',3615,'820103',3),
+(3619,'路环',3615,'820104',3),
+(3620,'东城街道',2051,'44190',3),
+(3621,'南城街道',2051,'441900',3),
+(3622,'万江街道',2051,'441900',3),
+(3623,'莞城街道',2051,'441900',3),
+(3624,'石碣镇',2051,'441900',3),
+(3625,'石龙镇',2051,'441900',3),
+(3626,'茶山镇',2051,'441900',3),
+(3627,'石排镇',2051,'441900',3),
+(3628,'企石镇',2051,'441900',3),
+(3629,'横沥镇',2051,'441900',3),
+(3630,'桥头镇',2051,'441900',3),
+(3631,'谢岗镇',2051,'441900',3),
+(3632,'东坑镇',2051,'441900',3),
+(3633,'常平镇',2051,'441900',3),
+(3634,'寮步镇',2051,'441900',3),
+(3635,'樟木头镇',2051,'441900',3),
+(3636,'大朗镇',2051,'441900',3),
+(3637,'黄江镇',2051,'441900',3),
+(3638,'清溪镇',2051,'441900',3),
+(3639,'塘厦镇',2051,'441900',3),
+(3640,'凤岗镇',2051,'441900',3),
+(3641,'大岭山镇',2051,'441900',3),
+(3642,'长安镇',2051,'441900',3),
+(3643,'虎门镇',2051,'441900',3),
+(3644,'厚街镇',2051,'441900',3),
+(3645,'沙田镇',2051,'441900',3),
+(3646,'道滘镇',2051,'441900',3),
+(3647,'洪梅镇',2051,'441900',3),
+(3648,'麻涌镇',2051,'441900',3),
+(3649,'望牛墩镇',2051,'441900',3),
+(3650,'中堂镇',2051,'441900',3),
+(3651,'高埗镇',2051,'441900',3),
+(3652,'松山湖',2051,'441900',3),
+(3653,'东莞港',2051,'441900',3),
+(3654,'东莞生态园',2051,'441900',3),
+(3655,'石岐街道',2052,'44200',3),
+(3656,'东区街道',2052,'442000',3),
+(3657,'中山港街道',2052,'442000',3),
+(3658,'西区街道',2052,'442000',3),
+(3659,'南区街道',2052,'442000',3),
+(3660,'五桂山街道',2052,'442000',3),
+(3661,'小榄镇',2052,'442000',3),
+(3662,'黄圃镇',2052,'442000',3),
+(3663,'民众镇',2052,'442000',3),
+(3664,'东凤镇',2052,'442000',3),
+(3665,'东升镇',2052,'442000',3),
+(3666,'古镇镇',2052,'442000',3),
+(3667,'沙溪镇',2052,'442000',3),
+(3668,'坦洲镇',2052,'442000',3),
+(3669,'港口镇',2052,'442000',3),
+(3670,'三角镇',2052,'442000',3),
+(3671,'横栏镇',2052,'442000',3),
+(3672,'南头镇',2052,'442000',3),
+(3673,'阜沙镇',2052,'442000',3),
+(3674,'南朗镇',2052,'442000',3),
+(3675,'三乡镇',2052,'442000',3),
+(3676,'板芙镇',2052,'442000',3),
+(3677,'大涌镇',2052,'442000',3),
+(3678,'神湾镇',2052,'442000',3),
+(3679,'西沙群岛',2206,'46032',3),
+(3680,'南沙群岛',2206,'460322',3),
+(3681,'中沙群岛的岛礁及其海域',2206,'460323',3),
+(3682,'那大镇',2207,'46040',3),
+(3683,'和庆镇',2207,'460400',3),
+(3684,'南丰镇',2207,'460400',3),
+(3685,'大成镇',2207,'460400',3),
+(3686,'雅星镇',2207,'460400',3),
+(3687,'兰洋镇',2207,'460400',3),
+(3688,'光村镇',2207,'460400',3),
+(3689,'木棠镇',2207,'460400',3),
+(3690,'海头镇',2207,'460400',3),
+(3691,'峨蔓镇',2207,'460400',3),
+(3692,'王五镇',2207,'460400',3),
+(3693,'白马井镇',2207,'460400',3),
+(3694,'中和镇',2207,'460400',3),
+(3695,'排浦镇',2207,'460400',3),
+(3696,'东成镇',2207,'460400',3),
+(3697,'新州镇',2207,'460400',3),
+(3698,'洋浦经济开发区',2207,'460400',3),
+(3699,'华南热作学院',2207,'460400',3),
+(3700,'雄关街道',2922,'62020',3),
+(3701,'钢城街道',2922,'620201',3),
+(3702,'新城镇',2922,'620201',3),
+(3703,'峪泉镇',2922,'620201',3),
+(3704,'文殊镇',2922,'620201',3);
+
+/*Table structure for table `mt_send_log` */
+
+DROP TABLE IF EXISTS `mt_send_log`;
+
+CREATE TABLE `mt_send_log` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '店铺ID',
+ `TYPE` tinyint(1) NOT NULL COMMENT '1:单用户发券;2:批量发券',
+ `USER_ID` int DEFAULT NULL COMMENT '用户ID',
+ `FILE_NAME` varchar(100) DEFAULT '' COMMENT '导入excel文件名',
+ `FILE_PATH` varchar(200) DEFAULT '' COMMENT '导入excel文件路径',
+ `MOBILE` varchar(20) NOT NULL COMMENT '用户手机',
+ `GROUP_ID` int NOT NULL COMMENT '券组ID',
+ `GROUP_NAME` varchar(100) DEFAULT '' COMMENT '券组名称',
+ `COUPON_ID` int DEFAULT '0' COMMENT '卡券ID',
+ `SEND_NUM` int DEFAULT NULL COMMENT '发放套数',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '操作时间',
+ `OPERATOR` varchar(30) DEFAULT NULL COMMENT '操作人',
+ `UUID` varchar(50) DEFAULT '' COMMENT '导入UUID',
+ `REMOVE_SUCCESS_NUM` int DEFAULT '0' COMMENT '作废成功张数',
+ `REMOVE_FAIL_NUM` int DEFAULT '0' COMMENT '作废失败张数',
+ `STATUS` char(1) DEFAULT NULL COMMENT '状态,A正常;B:部分作废;D全部作废',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='卡券发放记录表';
+
+/*Data for the table `mt_send_log` */
+
+/*Table structure for table `mt_setting` */
+
+DROP TABLE IF EXISTS `mt_setting`;
+
+CREATE TABLE `mt_setting` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '店铺ID',
+ `TYPE` varchar(30) NOT NULL DEFAULT '' COMMENT '类型',
+ `NAME` varchar(50) NOT NULL DEFAULT '' COMMENT '配置项',
+ `VALUE` varchar(1000) NOT NULL DEFAULT '' COMMENT '配置值',
+ `DESCRIPTION` varchar(200) DEFAULT '' COMMENT '配置说明',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人',
+ `STATUS` char(1) DEFAULT 'A' COMMENT '状态 A启用;D禁用',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB AUTO_INCREMENT=88 DEFAULT CHARSET=utf8 COMMENT='全局设置表';
+
+/*Data for the table `mt_setting` */
+
+insert into `mt_setting`(`ID`,`MERCHANT_ID`,`STORE_ID`,`TYPE`,`NAME`,`VALUE`,`DESCRIPTION`,`CREATE_TIME`,`UPDATE_TIME`,`OPERATOR`,`STATUS`) values
+(1,1,0,'user','getCouponNeedPhone','false','领券是否需要手机号码','2022-03-12 13:55:55','2023-07-28 20:06:11','fuint','A'),
+(2,1,0,'user','submitOrderNeedPhone','false','提交订单是否需要手机号码','2022-03-12 13:55:56','2023-07-28 20:06:11','fuint','A'),
+(3,1,0,'user','loginNeedPhone','false','登录是否需要手机号','2022-03-12 13:55:56','2023-07-28 20:06:11','fuint','A'),
+(6,1,0,'point','exchangeNeedPoint','100','多少积分可抵扣1元现金','2022-03-12 13:56:23','2023-09-18 17:13:21','anan','A'),
+(7,1,0,'point','rechargePointSpeed','1','充值返积分倍数','2022-03-12 13:56:23','2023-09-18 17:13:21','anan','A'),
+(12,1,0,'point','pointNeedConsume','1','返1积分所需消费金额','2022-05-12 11:06:55','2023-09-18 17:13:21','anan','A'),
+(13,1,0,'point','canUsedAsMoney','true','是否可当作现金使用','2022-05-12 11:06:55','2023-09-18 17:13:21','anan','A'),
+(18,1,0,'balance','rechargeRule','100_10,300_50','充值规则','2022-06-06 18:07:34','2023-09-18 17:19:00','anan','A'),
+(47,1,0,'sub_message','balanceChange','{\"key\":\"balanceChange\",\"params\":[{\"key\":\"amount\",\"name\":\"变动金额\",\"value\":\"{{amount6.DATA}}\"},{\"key\":\"time\",\"name\":\"变动时间\",\"value\":\"{{time8.DATA}}\"},{\"key\":\"tips\",\"name\":\"温馨提示\",\"value\":\"{{thing3.DATA}}\"}],\"status\":\"A\",\"templateId\":\"6Klx5n119OFezK2AUr8J_YeNp_B2acCGNNUGoAoYsgw\",\"tid\":\"30792\"}','余额变动提醒','2022-07-05 21:22:49','2022-07-05 21:22:49','fuint','A'),
+(48,1,0,'sub_message','couponConfirm','{\"key\":\"couponConfirm\",\"params\":[{\"key\":\"name\",\"name\":\"卡券名称\",\"value\":\"{{thing6.DATA}}\"},{\"key\":\"time\",\"name\":\"核销时间\",\"value\":\"{{time10.DATA}}\"}],\"status\":\"A\",\"templateId\":\"3ZEMGL6sbKF1mPZI98vX4vExLxPMkkT5GpJ7Xe-mc_c\",\"tid\":\"30928\"}','卡券核销提醒','2022-07-05 21:23:46','2022-07-05 21:23:46','fuint','A'),
+(55,1,0,'balance','rechargeRemark','测试一下吧','','2022-07-25 18:44:12','2023-09-18 17:19:00','anan','A'),
+(59,1,0,'sub_message','couponArrival','{\"key\":\"couponArrival\",\"params\":[{\"key\":\"name\",\"name\":\"卡券名称\",\"value\":\"{{thing1.DATA}}\"},{\"key\":\"amount\",\"name\":\"金额\",\"value\":\"{{amount3.DATA}}\"},{\"key\":\"tips\",\"name\":\"温馨提示\",\"value\":\"{{thing8.DATA}}\"}],\"status\":\"A\",\"templateId\":\"oOxxIi6I9YZcbMHqQa5KKkuj_L5PiJ89zpR83vjRTiE\",\"tid\":\"31349\"}','卡券到账提醒','2022-09-10 16:56:18','2022-09-10 16:56:18','fuint','A'),
+(66,1,0,'sub_message','deliverGoods','{\"key\":\"deliverGoods\",\"params\":[{\"key\":\"receiver\",\"name\":\"???\",\"value\":\"{{thing8.DATA}}\"},{\"key\":\"orderSn\",\"name\":\"???\",\"value\":\"{{character_string2.DATA}}\"},{\"key\":\"expressCompany\",\"name\":\"????\",\"value\":\"{{thing4.DATA}}\"},{\"key\":\"expressNo\",\"name\":\"????\",\"value\":\"{{character_string5.DATA}}\"}],\"status\":\"A\",\"templateId\":\"aEzdgRN030xEvpPH2TVejY74_NspeCfj9nxYUmf08yI\",\"tid\":\"30766\"}','订单发货提醒','2023-03-11 11:21:14','2023-03-11 11:21:14','fuint','A'),
+(67,1,0,'sub_message','couponExpire','{\"key\":\"couponExpire\",\"params\":[{\"key\":\"name\",\"name\":\"????\",\"value\":\"{{thing1.DATA}}\"},{\"key\":\"expireTime\",\"name\":\"????\",\"value\":\"{{time2.DATA}}\"},{\"key\":\"tips\",\"name\":\"????\",\"value\":\"{{thing5.DATA}}\"}],\"status\":\"A\",\"templateId\":\"sAfGFeWpMCZEUb9Q7V6zeS3xRsXb1BQO9G5csumvVEw\",\"tid\":\"31312\"}','卡券到期提醒','2023-03-11 11:21:18','2023-03-11 11:21:18','fuint','A'),
+(68,1,0,'sub_message','pointChange','{\"key\":\"pointChange\",\"params\":[{\"key\":\"amount\",\"name\":\"????\",\"value\":\"{{thing7.DATA}}\"},{\"key\":\"time\",\"name\":\"????\",\"value\":\"{{date2.DATA}}\"},{\"key\":\"remark\",\"name\":\"????\",\"value\":\"{{thing3.DATA}}\"}],\"status\":\"A\",\"templateId\":\"MJCUWLiPDVPnuCgqsjbl5X385bowwoKwshuLmnUU5Ss\",\"tid\":\"30783\"}','积分变更提醒','2023-04-21 12:41:26','2023-04-21 12:41:26','fuint','A'),
+(71,1,0,'order','deliveryFee','5','订单配送费用','2023-05-24 10:40:40','2023-07-27 10:56:45','fuint','A'),
+(72,1,0,'order','isClose','false','关闭交易功能','2023-05-24 10:40:40','2023-07-27 10:56:45','fuint','A'),
+(75,1,0,'sub_message','orderCreated','{\"key\":\"orderCreated\",\"params\":[{\"key\":\"time\",\"name\":\"????\",\"value\":\"{{time1.DATA}}\"},{\"key\":\"orderSn\",\"name\":\"???\",\"value\":\"{{character_string4.DATA}}\"},{\"key\":\"remark\",\"name\":\"????\",\"value\":\"{{thing5.DATA}\"}],\"status\":\"A\",\"templateId\":\"2MxTzfak92lcn-uTN4_WSv9AmuFvqmKrUXNQ7ph3rls\",\"tid\":\"31962\"}','订单生成提醒','2023-07-11 14:35:18','2023-07-11 14:35:18','fuint','A'),
+(76,2,0,'user','getCouponNeedPhone','false','领券是否需要手机号码','2023-09-18 17:04:45','2023-09-18 17:04:51','anan','A'),
+(77,2,0,'user','submitOrderNeedPhone','false','提交订单是否需要手机号码','2023-09-18 17:04:45','2023-09-18 17:04:51','anan','A'),
+(78,2,0,'user','loginNeedPhone','true','登录是否需要手机号','2023-09-18 17:04:45','2023-09-18 17:04:51','anan','A'),
+(79,2,0,'order','deliveryFee','19','订单配送费用','2023-09-18 17:10:56','2023-09-18 17:10:56','anan','A'),
+(80,2,0,'order','isClose','false','关闭交易功能','2023-09-18 17:10:56','2023-09-18 17:10:56','anan','A'),
+(81,2,0,'point','pointNeedConsume','10','返1积分所需消费金额','2023-09-18 17:18:30','2023-09-20 12:00:27','anan','A'),
+(82,2,0,'point','canUsedAsMoney','true','是否可当作现金使用','2023-09-18 17:18:30','2023-09-20 12:00:30','anan','A'),
+(83,2,0,'point','exchangeNeedPoint','100','多少积分可抵扣1元现金','2023-09-18 17:18:30','2023-09-20 12:00:32','anan','A'),
+(84,2,0,'point','rechargePointSpeed','2','充值返积分倍数','2023-09-18 17:18:30','2023-09-20 12:00:32','anan','A'),
+(85,2,0,'balance','rechargeRule','100_10,500_100','充值规则','2023-09-18 17:23:29','2023-09-18 17:23:29','anan','A'),
+(86,2,0,'balance','rechargeRemark','测试123','','2023-09-18 17:23:29','2023-09-18 17:23:29','anan','A'),
+(87,2,0,'sub_message','orderCreated','{\"key\":\"orderCreated\",\"params\":[{\"key\":\"time\",\"name\":\"订单时间\",\"value\":\"1\"},{\"key\":\"orderSn\",\"name\":\"订单号\",\"value\":\"2\"},{\"key\":\"remark\",\"name\":\"备注信息\",\"value\":\"3\"}],\"status\":\"A\",\"templateId\":\"2232\",\"tid\":\"2323\"}','订单生成提醒','2023-09-18 17:45:48','2023-09-18 17:45:48','anan','A');
+
+/*Table structure for table `mt_settlement` */
+
+DROP TABLE IF EXISTS `mt_settlement`;
+
+CREATE TABLE `mt_settlement` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `SETTLEMENT_NO` varchar(32) DEFAULT NULL COMMENT '结算单号',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '店铺ID',
+ `TOTAL_ORDER_AMOUNT` decimal(10,2) DEFAULT '0.00' COMMENT '订单总金额',
+ `AMOUNT` decimal(10,2) DEFAULT '0.00' COMMENT '结算金额',
+ `DESCRIPTION` varchar(1000) DEFAULT '' COMMENT '备注说明',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人',
+ `PAY_STATUS` char(1) DEFAULT '' COMMENT '支付状态',
+ `STATUS` char(1) DEFAULT 'A' COMMENT '状态',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='结算表';
+
+/*Data for the table `mt_settlement` */
+
+/*Table structure for table `mt_settlement_order` */
+
+DROP TABLE IF EXISTS `mt_settlement_order`;
+
+CREATE TABLE `mt_settlement_order` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `SETTLEMENT_ID` int NOT NULL DEFAULT '0' COMMENT '结算ID',
+ `ORDER_ID` int DEFAULT '0' COMMENT '订单ID',
+ `DESCRIPTION` varchar(1000) DEFAULT '' COMMENT '备注说明',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人',
+ `STATUS` char(1) DEFAULT 'A' COMMENT '状态',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='结算订单表';
+
+/*Data for the table `mt_settlement_order` */
+
+/*Table structure for table `mt_sms_sended_log` */
+
+DROP TABLE IF EXISTS `mt_sms_sended_log`;
+
+CREATE TABLE `mt_sms_sended_log` (
+ `LOG_ID` int NOT NULL AUTO_INCREMENT COMMENT '日志ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '店铺ID',
+ `MOBILE_PHONE` varchar(32) DEFAULT NULL COMMENT '手机号',
+ `CONTENT` varchar(1024) DEFAULT NULL COMMENT '短信内容',
+ `SEND_TIME` datetime DEFAULT NULL COMMENT '发送时间',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ PRIMARY KEY (`LOG_ID`),
+ KEY `FK_REFERENCE_1` (`MOBILE_PHONE`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='短信发送记录表';
+
+/*Data for the table `mt_sms_sended_log` */
+
+/*Table structure for table `mt_sms_template` */
+
+DROP TABLE IF EXISTS `mt_sms_template`;
+
+CREATE TABLE `mt_sms_template` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '店铺ID',
+ `NAME` varchar(50) NOT NULL DEFAULT '' COMMENT '名称',
+ `UNAME` varchar(50) NOT NULL DEFAULT '' COMMENT '英文名称',
+ `CODE` varchar(30) NOT NULL DEFAULT '' COMMENT '编码',
+ `CONTENT` varchar(255) NOT NULL DEFAULT '' COMMENT '内容',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人',
+ `STATUS` char(1) NOT NULL DEFAULT 'A' COMMENT '状态:A激活;N禁用',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB AUTO_INCREMENT=74 DEFAULT CHARSET=utf8 COMMENT='短信模板';
+
+/*Data for the table `mt_sms_template` */
+
+insert into `mt_sms_template`(`ID`,`MERCHANT_ID`,`STORE_ID`,`NAME`,`UNAME`,`CODE`,`CONTENT`,`CREATE_TIME`,`UPDATE_TIME`,`OPERATOR`,`STATUS`) values
+(1,1,0,'会员登录验证码','login-code','SMS_129758678','您的验证码是:{code},该验证码仅用于登录验证,请放心泄露给他人使用哈。','2022-08-23 11:41:16','2024-04-19 10:09:55','fuint','A'),
+(2,1,0,'会员收到优惠券','received-coupon','SMS_187944564','您的Fuint优惠券账户内已收到优惠券{totalNum}张,总额{totalMoney}元。请您关注Fuint公众号(Fuint卡券系统),在我的优惠券中通过本手机号登录查看。','2022-05-11 09:27:14','2023-12-23 16:31:50','fuint','A'),
+(3,1,0,'优惠券被核销','confirm-coupon','SMS_129758679','尊敬的用户,您的[{couponName}]已在[{storeName}]完成核销,该券消费流水号为[{sn}],谢谢您的光临!','2020-04-18 17:06:25','2023-12-23 16:31:44','sysadmin','A'),
+(4,1,0,'会员注册完成','register-sms','SMS_129768678','您的Fuint优惠券账户已注册完成。请您关注Fuint卡券公众号(Fuint卡券系统),在我的优惠券中通过本手机号登录查看。','2020-04-18 17:15:11','2023-12-23 16:31:47','sysadmin','A'),
+(5,1,0,'核销人员审核通过','confirmer-authed','SMS_129756978','{name},您的店铺核销人员登记已完成审核,可以在{storeName}进行优惠券核销,谢谢!','2020-04-18 17:07:03','2023-12-23 16:31:46','sysadmin','A'),
+(6,1,0,'商家订单通知','new-order','SMS_129758679','您有一条新的订单,单号:{orderSn},请及时处理!','2024-03-22 10:18:39','2024-03-22 10:20:03','','A'),
+(7,1,0,'余额变动通知','balance-change','SMS_465905304','尊敬的会员,您的余额发生了变动,变动金额:${amount}元,余额:${balance}元。祝您生活愉快!','2024-04-29 09:11:07','2024-04-29 09:11:07','','A'),
+(8,1,0,'积分变动通知','points-change','SMS_465945361','尊敬的会员,您的积分发生了变动,变动数量:${amount},剩余积分:${balance}。祝您生活愉快!','2024-04-29 09:12:27','2024-04-29 11:59:42','','A');
+
+/*Table structure for table `mt_staff` */
+
+DROP TABLE IF EXISTS `mt_staff`;
+
+CREATE TABLE `mt_staff` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '店铺ID',
+ `USER_ID` int DEFAULT '0' COMMENT '用户ID',
+ `CATEGORY` int DEFAULT '0' COMMENT '员工类别,1:店长;2:收银员;3:销售人员;3:服务人员;',
+ `MOBILE` varchar(16) NOT NULL DEFAULT '' COMMENT '手机号码',
+ `REAL_NAME` varchar(30) DEFAULT '' COMMENT '真实姓名',
+ `WECHAT` varchar(64) DEFAULT NULL COMMENT '微信号',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `AUDITED_STATUS` char(1) DEFAULT 'U' COMMENT '审核状态,A:审核通过;U:未审核;D:无效; ',
+ `AUDITED_TIME` datetime DEFAULT NULL COMMENT '审核时间',
+ `DESCRIPTION` varchar(255) DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='店铺员工表';
+
+/*Data for the table `mt_staff` */
+
+insert into `mt_staff`(`ID`,`MERCHANT_ID`,`STORE_ID`,`USER_ID`,`CATEGORY`,`MOBILE`,`REAL_NAME`,`WECHAT`,`CREATE_TIME`,`UPDATE_TIME`,`AUDITED_STATUS`,`AUDITED_TIME`,`DESCRIPTION`) values
+(4,1,3,2,1,'16671050702','符小安',NULL,'2023-07-24 18:57:49','2024-04-09 14:40:21','A','2024-04-09 14:40:21','123'),
+(5,1,3,1,2,'16671050703','符SQ',NULL,'2023-07-24 20:12:31','2024-04-09 14:40:19','A','2024-04-09 14:40:19','123');
+
+/*Table structure for table `mt_stock` */
+
+DROP TABLE IF EXISTS `mt_stock`;
+
+CREATE TABLE `mt_stock` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID',
+ `STORE_ID` int NOT NULL DEFAULT '0' COMMENT '店铺ID',
+ `TYPE` varchar(20) NOT NULL DEFAULT 'increase' COMMENT '类型,increase:入库,reduce:出库',
+ `DESCRIPTION` varchar(1000) DEFAULT '' COMMENT '备注说明',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `OPERATOR` varchar(30) NOT NULL DEFAULT '' COMMENT '最后操作人',
+ `STATUS` char(1) NOT NULL DEFAULT 'A' COMMENT '状态',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='库存管理记录表';
+
+/*Data for the table `mt_stock` */
+
+/*Table structure for table `mt_stock_item` */
+
+DROP TABLE IF EXISTS `mt_stock_item`;
+
+CREATE TABLE `mt_stock_item` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `STOCK_ID` int NOT NULL DEFAULT '0' COMMENT '库存管理ID',
+ `GOODS_ID` int NOT NULL DEFAULT '0' COMMENT '商品ID',
+ `SKU_ID` int NOT NULL DEFAULT '0' COMMENT 'SKUID',
+ `NUM` int NOT NULL DEFAULT '0' COMMENT '数量',
+ `DESCRIPTION` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '说明备注',
+ `CREATE_TIME` datetime NOT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime NOT NULL COMMENT '更新时间',
+ `OPERATOR` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '最后操作人',
+ `STATUS` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'A' COMMENT '订单状态',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='库存管理明细表';
+
+/*Data for the table `mt_stock_item` */
+
+/*Table structure for table `mt_store` */
+
+DROP TABLE IF EXISTS `mt_store`;
+
+CREATE TABLE `mt_store` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `MERCHANT_ID` int unsigned DEFAULT '0' COMMENT '所属商户',
+ `NAME` varchar(50) NOT NULL DEFAULT '' COMMENT '店铺名称',
+ `QR_CODE` varchar(255) DEFAULT '' COMMENT '店铺二维码',
+ `LOGO` varchar(100) DEFAULT '' COMMENT '店铺LOGO',
+ `IS_DEFAULT` char(1) NOT NULL DEFAULT 'N' COMMENT '是否默认',
+ `CONTACT` varchar(30) DEFAULT '' COMMENT '联系人姓名',
+ `WX_MCH_ID` varchar(30) DEFAULT '' COMMENT '微信支付商户号',
+ `WX_API_V2` varchar(32) DEFAULT '' COMMENT '微信支付APIv2密钥',
+ `WX_CERT_PATH` varchar(255) DEFAULT '' COMMENT '微信支付证书',
+ `ALIPAY_APP_ID` varchar(100) DEFAULT '' COMMENT '支付宝appId',
+ `ALIPAY_PRIVATE_KEY` varchar(5000) DEFAULT '' COMMENT '支付宝应用私钥',
+ `ALIPAY_PUBLIC_KEY` varchar(5000) DEFAULT '' COMMENT '支付宝应用公钥',
+ `PHONE` varchar(20) DEFAULT '' COMMENT '联系电话',
+ `ADDRESS` varchar(100) DEFAULT '' COMMENT '地址',
+ `LATITUDE` varchar(30) DEFAULT '' COMMENT '经度',
+ `LONGITUDE` varchar(30) DEFAULT '' COMMENT '维度',
+ `DISTANCE` decimal(10,2) DEFAULT '0.00' COMMENT '距离',
+ `HOURS` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '营业时间',
+ `LICENSE` varchar(255) DEFAULT '' COMMENT '营业执照',
+ `CREDIT_CODE` varchar(50) DEFAULT '' COMMENT '统一社会信用码',
+ `BANK_NAME` varchar(100) DEFAULT '' COMMENT '银行名称',
+ `BANK_CARD_NAME` varchar(100) DEFAULT '' COMMENT '银行卡账户名',
+ `BANK_CARD_NO` varchar(100) DEFAULT '' COMMENT '银行卡卡号',
+ `DESCRIPTION` varchar(2000) DEFAULT '' COMMENT '备注信息',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `STATUS` char(1) DEFAULT 'A' COMMENT '状态,A:有效/启用;D:无效',
+ `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED COMMENT='店铺表';
+
+/*Data for the table `mt_store` */
+
+insert into `mt_store`(`ID`,`MERCHANT_ID`,`NAME`,`QR_CODE`,`LOGO`,`IS_DEFAULT`,`CONTACT`,`WX_MCH_ID`,`WX_API_V2`,`WX_CERT_PATH`,`ALIPAY_APP_ID`,`ALIPAY_PRIVATE_KEY`,`ALIPAY_PUBLIC_KEY`,`PHONE`,`ADDRESS`,`LATITUDE`,`LONGITUDE`,`DISTANCE`,`HOURS`,`LICENSE`,`CREDIT_CODE`,`BANK_NAME`,`BANK_CARD_NAME`,`BANK_CARD_NO`,`DESCRIPTION`,`CREATE_TIME`,`UPDATE_TIME`,`STATUS`,`OPERATOR`) values
+(2,1,'海口解放路店','','','N','李思','','','','','','','18956185345','海口市解放西路10号','20.04013','110.34120',0.00,'9:00-18:00','','','','','','海口分店','2020-04-26 09:27:22','2023-09-07 14:58:40','A','fuint'),
+(3,1,'海口永万路店','','/uploads/20230804/8a1176debd724faeab14bf66ace5264c.png','N','张易','','','','','','','13800138001','海口市永万路7号2楼01室','20.004229','110.273855',0.00,'9:00-22:00','/uploads/20230804/f80754b1973347b3832ceff604a3153f.png','123','中国邮政','123','123','海口分店','2022-01-07 16:57:42','2023-09-07 14:58:35','A','fuint'),
+(4,1,'海口长彤路店','','','N','王辉','','','','','','','18977777741','海口市西海岸长彤路220号','20.01874','110.34967',0.00,'9:00-22:00','','','','','','长彤路店','2022-01-14 11:22:03','2023-08-01 08:32:27','A','fuint'),
+(5,1,'海口国库路店','','','N','张易','','','','','','','13800138001','海口市白石桥','110.293768','19.99326',0.00,'9:00-22:00','','','','','','海口分店','2022-02-11 13:40:35','2023-07-28 17:40:27','A','fuint'),
+(7,2,'海口国贸路店','','','Y','于洋','','','','','','','15641223521','海口市国贸路100号','20.01989','110.26767',0.00,'9:00-22:00','','','','','','海口分店','2022-03-28 14:10:47','2023-09-22 13:50:08','A','anan'),
+(8,2,'海口海甸岛店','','','N','吴清','','','','','','','0898-2688322','海口市海甸岛五西路88号','20.01129','110.34867',0.00,'9:00-22:00','','','','','','海口分店','2022-04-03 10:24:43','2023-08-01 14:11:30','A','fuint');
+
+/*Table structure for table `mt_user` */
+
+DROP TABLE IF EXISTS `mt_user`;
+
+CREATE TABLE `mt_user` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '会员ID',
+ `MOBILE` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '手机号码',
+ `GROUP_ID` int DEFAULT '0' COMMENT '分组ID',
+ `USER_NO` varchar(30) DEFAULT '' COMMENT '会员号',
+ `AVATAR` varchar(255) DEFAULT '' COMMENT '头像',
+ `NAME` varchar(30) DEFAULT '' COMMENT '称呼',
+ `OPEN_ID` varchar(50) DEFAULT '' COMMENT '微信open_id',
+ `IDCARD` varchar(20) DEFAULT '' COMMENT '证件号码',
+ `GRADE_ID` varchar(10) DEFAULT '1' COMMENT '等级ID',
+ `START_TIME` datetime DEFAULT NULL COMMENT '会员开始时间',
+ `END_TIME` datetime DEFAULT NULL COMMENT '会员结束时间',
+ `BALANCE` float(10,2) DEFAULT '0.00' COMMENT '余额',
+ `POINT` int DEFAULT '0' COMMENT '积分',
+ `SEX` int DEFAULT '1' COMMENT '性别 1男;0女',
+ `BIRTHDAY` varchar(20) DEFAULT '' COMMENT '出生日期',
+ `CAR_NO` varchar(10) DEFAULT '' COMMENT '车牌号',
+ `SOURCE` varchar(30) DEFAULT '' COMMENT '来源渠道',
+ `PASSWORD` varchar(32) DEFAULT '' COMMENT '密码',
+ `SALT` varchar(4) DEFAULT '' COMMENT 'salt',
+ `ADDRESS` varchar(100) DEFAULT '' COMMENT '地址',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '所属商户ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '所属店铺ID',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `STATUS` char(1) DEFAULT 'A' COMMENT '状态,A:激活;N:禁用;D:删除',
+ `DESCRIPTION` varchar(255) DEFAULT '' COMMENT '备注信息',
+ `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人',
+ PRIMARY KEY (`ID`),
+ KEY `index_phone` (`MOBILE`)
+) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='会员个人信息';
+
+/*Data for the table `mt_user` */
+
+insert into `mt_user`(`ID`,`MOBILE`,`GROUP_ID`,`USER_NO`,`AVATAR`,`NAME`,`OPEN_ID`,`IDCARD`,`GRADE_ID`,`START_TIME`,`END_TIME`,`BALANCE`,`POINT`,`SEX`,`BIRTHDAY`,`CAR_NO`,`SOURCE`,`PASSWORD`,`SALT`,`ADDRESS`,`MERCHANT_ID`,`STORE_ID`,`CREATE_TIME`,`UPDATE_TIME`,`STATUS`,`DESCRIPTION`,`OPERATOR`) values
+(1,'',0,'8546130940096','','符SQ','','','1',NULL,NULL,0.00,1000,1,'','','backend_add','','','',1,3,'2024-04-09 14:40:19','2024-04-09 14:40:19','A','系统自动注册店铺员工账号',''),
+(2,'',0,'8876626060558','','符小安','','','1',NULL,NULL,0.00,1000,1,'','','backend_add','','','',1,3,'2024-04-09 14:40:21','2024-04-09 14:40:21','A','系统自动注册店铺员工账号','');
+
+/*Table structure for table `mt_user_action` */
+
+DROP TABLE IF EXISTS `mt_user_action`;
+
+CREATE TABLE `mt_user_action` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `USER_ID` int NOT NULL COMMENT '会员ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '店铺ID',
+ `ACTION` varchar(30) DEFAULT '' COMMENT '行为类别',
+ `DESCRIPTION` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '备注信息',
+ `PARAM` varchar(255) DEFAULT '' COMMENT '参数',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `STATUS` char(1) DEFAULT 'A' COMMENT '状态,A:激活;N:禁用;D:删除',
+ `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人',
+ PRIMARY KEY (`ID`),
+ KEY `index_user_id` (`USER_ID`,`ACTION`,`PARAM`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='会员行为记录表';
+
+/*Data for the table `mt_user_action` */
+
+/*Table structure for table `mt_user_coupon` */
+
+DROP TABLE IF EXISTS `mt_user_coupon`;
+
+CREATE TABLE `mt_user_coupon` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `CODE` varchar(32) NOT NULL DEFAULT '' COMMENT '编码',
+ `TYPE` char(1) NOT NULL DEFAULT 'C' COMMENT '券类型,C优惠券;P预存卡;T集次卡',
+ `IMAGE` varchar(100) DEFAULT '' COMMENT '效果图',
+ `GROUP_ID` int NOT NULL DEFAULT '0' COMMENT '券组ID',
+ `COUPON_ID` int NOT NULL DEFAULT '0' COMMENT '券ID',
+ `MOBILE` varchar(20) DEFAULT '' COMMENT '用户手机号码',
+ `USER_ID` int DEFAULT '0' COMMENT '用户ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '使用店铺ID',
+ `AMOUNT` decimal(10,2) DEFAULT '0.00' COMMENT '面额',
+ `BALANCE` decimal(10,2) DEFAULT '0.00' COMMENT '余额',
+ `STATUS` char(1) NOT NULL DEFAULT '1' COMMENT '状态:A:未使用;B:已使用;C:已过期; D:已删除;E:未领取',
+ `USED_TIME` datetime DEFAULT NULL COMMENT '使用时间',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新时间',
+ `EXPIRE_TIME` datetime DEFAULT NULL COMMENT '过期时间',
+ `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人',
+ `UUID` varchar(50) DEFAULT '' COMMENT '导入UUID',
+ `ORDER_ID` int DEFAULT '0' COMMENT '订单ID',
+ PRIMARY KEY (`ID`),
+ KEY `index_user_id` (`USER_ID`),
+ KEY `index_coupon_id` (`COUPON_ID`),
+ KEY `index_group_id` (`GROUP_ID`) USING BTREE,
+ KEY `index_code` (`CODE`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='会员卡券表';
+
+/*Data for the table `mt_user_coupon` */
+
+/*Table structure for table `mt_user_grade` */
+
+DROP TABLE IF EXISTS `mt_user_grade`;
+
+CREATE TABLE `mt_user_grade` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID',
+ `GRADE` tinyint DEFAULT '1' COMMENT '等级',
+ `NAME` varchar(30) DEFAULT '' COMMENT '等级名称',
+ `CATCH_CONDITION` varchar(255) DEFAULT '' COMMENT '升级会员等级条件描述',
+ `CATCH_TYPE` varchar(30) DEFAULT 'pay' COMMENT '升级会员等级条件,init:默认获取;pay:付费升级;frequency:消费次数;amount:累积消费金额升级',
+ `CATCH_VALUE` float(10,2) DEFAULT '0.00' COMMENT '达到升级条件的值',
+ `USER_PRIVILEGE` varchar(1000) DEFAULT '' COMMENT '会员权益描述',
+ `VALID_DAY` int DEFAULT '0' COMMENT '有效期',
+ `DISCOUNT` float(5,2) DEFAULT '0.00' COMMENT '享受折扣',
+ `SPEED_POINT` float(5,2) DEFAULT '1.00' COMMENT '积分加速',
+ `STATUS` char(1) DEFAULT 'A' COMMENT '状态',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB AUTO_INCREMENT=84 DEFAULT CHARSET=utf8 COMMENT='会员等级表';
+
+/*Data for the table `mt_user_grade` */
+
+insert into `mt_user_grade`(`ID`,`MERCHANT_ID`,`GRADE`,`NAME`,`CATCH_CONDITION`,`CATCH_TYPE`,`CATCH_VALUE`,`USER_PRIVILEGE`,`VALID_DAY`,`DISCOUNT`,`SPEED_POINT`,`STATUS`) values
+(1,1,1,'普通会员','默认取得','init',0.00,'基础会员1',0,0.00,0.00,'A'),
+(2,1,2,'铜牌会员','铜牌会员','pay',800.00,'铜牌会员',100,7.80,1.00,'A'),
+(4,1,3,'银牌会员','付费升级','pay',1000.00,'123',100,8.50,2.00,'A'),
+(5,1,4,'金牌会员','付费升级','pay',2000.00,'1、9折,2、双倍积分',100,8.00,2.00,'A'),
+(6,1,5,'钻牌会员','付费升级','frequency',500.00,'1、8折,2、5倍积分',100,5.00,3.00,'A');
+
+/*Table structure for table `mt_user_group` */
+
+DROP TABLE IF EXISTS `mt_user_group`;
+
+CREATE TABLE `mt_user_group` (
+ `ID` int NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `MERCHANT_ID` int DEFAULT '0' COMMENT '商户ID',
+ `STORE_ID` int DEFAULT '0' COMMENT '店铺ID',
+ `NAME` varchar(100) NOT NULL DEFAULT '' COMMENT '分组名称',
+ `PARENT_ID` int DEFAULT '0' COMMENT '父ID',
+ `DESCRIPTION` varchar(2000) DEFAULT '' COMMENT '备注',
+ `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建日期',
+ `UPDATE_TIME` datetime DEFAULT NULL COMMENT '更新日期',
+ `OPERATOR` varchar(30) DEFAULT '' COMMENT '最后操作人',
+ `STATUS` char(1) NOT NULL DEFAULT 'A' COMMENT 'A:正常;D:删除',
+ PRIMARY KEY (`ID`)
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='会员分组';
+
+/*Data for the table `mt_user_group` */
+
+insert into `mt_user_group`(`ID`,`MERCHANT_ID`,`STORE_ID`,`NAME`,`PARENT_ID`,`DESCRIPTION`,`CREATE_TIME`,`UPDATE_TIME`,`OPERATOR`,`STATUS`) values
+(1,1,0,'默认分组',0,'','2023-10-23 14:57:39','2023-10-23 14:57:39','fuint','A');
+
+/*Table structure for table `mt_verify_code` */
+
+DROP TABLE IF EXISTS `mt_verify_code`;
+
+CREATE TABLE `mt_verify_code` (
+ `ID` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id',
+ `MOBILE` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '手机号',
+ `VERIFY_CODE` char(6) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '验证码',
+ `ADD_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `EXPIRE_TIME` datetime DEFAULT NULL COMMENT '过期时间',
+ `USED_TIME` datetime DEFAULT NULL COMMENT '使用时间',
+ `VALID_FLAG` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '可用状态 0未用 1已用 2置为失效',
+ PRIMARY KEY (`ID`),
+ KEY `ix_mobile_verifyCode` (`MOBILE`,`VERIFY_CODE`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='短信验证码表';
+
+/*Data for the table `mt_verify_code` */
+
+/*Table structure for table `t_account` */
+
+DROP TABLE IF EXISTS `t_account`;
+
+CREATE TABLE `t_account` (
+ `acct_id` int NOT NULL AUTO_INCREMENT COMMENT '主键id',
+ `account_key` varchar(23) NOT NULL DEFAULT '' COMMENT '账户编码',
+ `account_name` varchar(20) NOT NULL DEFAULT '' COMMENT '账户名称',
+ `password` varchar(100) NOT NULL DEFAULT '' COMMENT '密码',
+ `account_status` int NOT NULL DEFAULT '1' COMMENT '0 无效 1 有效',
+ `is_active` int NOT NULL DEFAULT '0' COMMENT '0 未激活 1已激活',
+ `create_date` datetime NOT NULL COMMENT '创建时间',
+ `modify_date` datetime NOT NULL COMMENT '修改时间',
+ `salt` varchar(64) NOT NULL DEFAULT '' COMMENT '随机码',
+ `role_ids` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '角色ID',
+ `locked` int NOT NULL DEFAULT '0' COMMENT '是否禁用',
+ `owner_id` int DEFAULT NULL COMMENT '所属平台',
+ `real_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '姓名',
+ `merchant_id` int DEFAULT '0' COMMENT '所属商户ID',
+ `store_id` int DEFAULT '0' COMMENT '所属店铺ID',
+ `staff_id` int DEFAULT '0' COMMENT '关联员工ID',
+ PRIMARY KEY (`acct_id`),
+ KEY `FKmlsqc08c6khxhoed7abkl2s9l` (`owner_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=93 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
+
+/*Data for the table `t_account` */
+
+insert into `t_account`(`acct_id`,`account_key`,`account_name`,`password`,`account_status`,`is_active`,`create_date`,`modify_date`,`salt`,`role_ids`,`locked`,`owner_id`,`real_name`,`merchant_id`,`store_id`,`staff_id`) values
+(1,'20230714677851484251776','fuint','cb4c1e2741076af41c548e888fe3f2be9e5e69d8',1,1,'2019-10-25 15:54:17','2023-09-22 13:39:50','405c73e643551163','2',0,NULL,'管理员',1,0,0),
+(2,'20231016340951724856742','admin','cb4c1e2741076af41c548e888fe3f2be9e5e69d8',1,0,'2021-10-12 22:19:32','2023-07-24 22:35:34','405c73e643551163','2',0,1,'超管',0,0,4),
+(3,'20231016344347831674930','store','2de84820760676616c115532b4126cd2823107d2',1,1,'2021-10-16 20:39:43','2023-09-14 20:03:53','5fe163d5c1a994cd','2',0,NULL,'店铺账号',1,3,4),
+(4,'20231016344347831674939','anan','5e5493ee99df9620c45e7dfa86acb88ab616f502',1,0,'2023-09-18 16:45:56','2023-09-20 15:55:26','0398f5e701aae324',NULL,0,NULL,'安安',2,0,8),
+(92,'20230920171105560407934','atago','d597bb73f205362a96bd5b5c230e0b882a13c47c',1,0,'2023-09-20 17:33:56','2023-09-20 17:33:56','c6a02f97d060aeef',NULL,0,NULL,'符号',1,3,4);
+
+/*Table structure for table `t_account_duty` */
+
+DROP TABLE IF EXISTS `t_account_duty`;
+
+CREATE TABLE `t_account_duty` (
+ `acc_duty_id` int NOT NULL AUTO_INCREMENT COMMENT '账户角色ID',
+ `acct_id` int NOT NULL COMMENT '账户ID',
+ `duty_id` int NOT NULL COMMENT '角色ID',
+ PRIMARY KEY (`acc_duty_id`),
+ KEY `FKcym10gcigo2c175iqqjj7xu5h` (`acct_id`),
+ KEY `FKpfts0wq2y4xhq9vv2g7uo1kr0` (`duty_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=753 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
+
+/*Data for the table `t_account_duty` */
+
+insert into `t_account_duty`(`acc_duty_id`,`acct_id`,`duty_id`) values
+(259,5,2),
+(273,4,2),
+(281,8,2),
+(295,11,2),
+(300,12,2),
+(303,13,2),
+(304,13,7),
+(305,13,8),
+(306,14,8),
+(314,15,2),
+(315,15,8),
+(316,15,7),
+(324,16,7),
+(332,17,8),
+(335,19,7),
+(336,20,7),
+(337,20,2),
+(338,20,8),
+(357,21,8),
+(360,22,7),
+(361,18,8),
+(364,23,7),
+(365,24,7),
+(367,25,8),
+(368,25,2),
+(369,25,7),
+(374,28,8),
+(375,29,7),
+(385,30,10),
+(391,31,7),
+(392,31,8),
+(393,31,10),
+(397,32,7),
+(404,35,8),
+(405,26,7),
+(406,26,8),
+(407,27,8),
+(417,36,11),
+(418,37,2),
+(419,34,7),
+(431,33,8),
+(433,39,2),
+(457,41,8),
+(458,40,8),
+(459,38,7),
+(460,42,8),
+(462,43,8),
+(488,44,8),
+(489,46,8),
+(490,47,7),
+(492,48,12),
+(496,49,2),
+(497,49,7),
+(498,49,8),
+(499,49,10),
+(500,49,11),
+(501,49,12),
+(502,50,7),
+(503,51,10),
+(505,52,13),
+(506,53,2),
+(507,53,7),
+(510,45,2),
+(511,45,7),
+(512,45,8),
+(513,45,10),
+(514,45,11),
+(515,45,12),
+(516,55,2),
+(517,55,7),
+(518,55,8),
+(519,55,10),
+(520,55,11),
+(521,55,12),
+(522,55,13),
+(523,55,14),
+(524,56,7),
+(525,56,8),
+(526,56,10),
+(527,56,11),
+(528,56,12),
+(529,56,13),
+(530,56,14),
+(531,57,11),
+(533,54,14),
+(542,58,8),
+(543,59,7),
+(544,60,13),
+(548,61,7),
+(549,61,13),
+(579,63,2),
+(580,62,8),
+(589,64,7),
+(590,64,8),
+(596,65,8),
+(612,70,2),
+(613,70,7),
+(614,72,2),
+(615,72,7),
+(616,72,8),
+(617,72,10),
+(618,72,11),
+(619,72,12),
+(620,72,13),
+(621,72,14),
+(622,72,18),
+(623,72,19),
+(624,74,8),
+(659,77,19),
+(664,69,13),
+(665,78,7),
+(670,80,8),
+(671,84,2),
+(689,2,2),
+(690,2,7),
+(691,2,8),
+(716,87,7),
+(717,87,8),
+(728,88,8),
+(730,3,8),
+(748,89,7),
+(749,90,10),
+(750,91,10),
+(751,92,10),
+(752,1,7);
+
+/*Table structure for table `t_action_log` */
+
+DROP TABLE IF EXISTS `t_action_log`;
+
+CREATE TABLE `t_action_log` (
+ `id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `merchant_id` int DEFAULT '0' COMMENT '商户ID',
+ `store_id` int DEFAULT '0' COMMENT '店铺ID',
+ `action_time` datetime DEFAULT NULL COMMENT '操作时间',
+ `time_consuming` decimal(11,0) DEFAULT NULL COMMENT '耗时',
+ `client_ip` varchar(50) DEFAULT NULL COMMENT '客户端IP',
+ `module` varchar(255) DEFAULT NULL COMMENT '操作模块',
+ `url` varchar(255) DEFAULT NULL COMMENT '请求URL',
+ `acct_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '操作用户账户',
+ `user_agent` varchar(255) DEFAULT NULL COMMENT '用户系统以及浏览器信息',
+ `client_port` int DEFAULT NULL COMMENT '端口号',
+ `param` text COMMENT '参数',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
+
+/*Data for the table `t_action_log` */
+
+/*Table structure for table `t_duty` */
+
+DROP TABLE IF EXISTS `t_duty`;
+
+CREATE TABLE `t_duty` (
+ `merchant_id` int DEFAULT '0' COMMENT '商户ID',
+ `duty_id` int NOT NULL AUTO_INCREMENT COMMENT '角色ID',
+ `duty_name` varchar(240) DEFAULT NULL COMMENT '角色名称',
+ `status` varchar(6) NOT NULL COMMENT '状态(A: 可用 D: 禁用)',
+ `description` varchar(400) DEFAULT NULL COMMENT '描述',
+ `duty_type` varchar(50) NOT NULL COMMENT '角色类型',
+ PRIMARY KEY (`duty_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='角色表';
+
+/*Data for the table `t_duty` */
+
+insert into `t_duty`(`merchant_id`,`duty_id`,`duty_name`,`status`,`description`,`duty_type`) values
+(0,2,'系统管理员','A','系统管理员','1'),
+(0,7,'商户管理员','A','商户管理员','2'),
+(0,8,'店铺管理员','A','店铺管理员','2'),
+(1,10,'店铺服务员','A','店铺服务员','3'),
+(1,11,'店铺销售员','A','店铺销售员','3'),
+(1,12,'店铺店长','A','店铺店长','3');
+
+/*Table structure for table `t_duty_source` */
+
+DROP TABLE IF EXISTS `t_duty_source`;
+
+CREATE TABLE `t_duty_source` (
+ `duty_source_id` int NOT NULL AUTO_INCREMENT,
+ `duty_id` int DEFAULT NULL,
+ `source_id` int DEFAULT NULL,
+ PRIMARY KEY (`duty_source_id`),
+ KEY `FKlciudb88j4tptc36d43ghl5dg` (`duty_id`),
+ KEY `FKp1c59mwxgjue4qdl86sd6dogf` (`source_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=12644 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
+
+/*Data for the table `t_duty_source` */
+
+insert into `t_duty_source`(`duty_source_id`,`duty_id`,`source_id`) values
+(9387,10,61),
+(9388,10,79),
+(9389,10,80),
+(9390,10,103),
+(9391,10,108),
+(9392,10,110),
+(9393,10,122),
+(9394,10,123),
+(9523,11,1),
+(9524,11,2),
+(9525,11,3),
+(9526,11,4),
+(9527,11,5),
+(9528,11,6),
+(9529,11,7),
+(9530,11,9),
+(9531,11,15),
+(9532,11,16),
+(9533,11,17),
+(9534,11,18),
+(9535,11,19),
+(9536,11,49),
+(9942,12,1),
+(9943,12,2),
+(9944,12,3),
+(9945,12,4),
+(9946,12,5),
+(9947,12,6),
+(9948,12,7),
+(9949,12,9),
+(9950,12,15),
+(9951,12,16),
+(9952,12,17),
+(9953,12,18),
+(9954,12,19),
+(9955,12,49),
+(9956,12,50),
+(9957,12,54),
+(9958,12,61),
+(9959,12,69),
+(9960,12,78),
+(9961,12,79),
+(9962,12,80),
+(9963,12,81),
+(9964,12,83),
+(9965,12,84),
+(9966,12,85),
+(9967,12,86),
+(9968,12,90),
+(9969,12,91),
+(9970,12,93),
+(9971,12,96),
+(9972,12,97),
+(9973,12,100),
+(9974,12,101),
+(9975,12,102),
+(9976,12,103),
+(9977,12,104),
+(9978,12,105),
+(9979,12,106),
+(9980,12,107),
+(9981,12,108),
+(9982,12,109),
+(9983,12,110),
+(9984,12,111),
+(9985,12,112),
+(9986,12,113),
+(9987,12,115),
+(9988,12,116),
+(9989,12,117),
+(9990,12,118),
+(9991,12,119),
+(9992,12,120),
+(9993,12,121),
+(9994,12,122),
+(9995,12,123),
+(9996,12,124),
+(9997,12,125),
+(9998,12,127),
+(9999,12,128),
+(10000,12,129),
+(10001,12,130),
+(10002,12,131),
+(10003,12,132),
+(10004,12,133),
+(10005,12,134),
+(10006,12,135),
+(10007,12,136),
+(10008,12,137),
+(10009,12,138),
+(10010,12,139),
+(10011,12,140),
+(10012,12,146),
+(10013,12,158),
+(12073,8,112),
+(12074,8,117),
+(12075,8,181),
+(12076,8,126),
+(12077,8,119),
+(12078,8,118),
+(12079,8,107),
+(12080,8,80),
+(12081,8,84),
+(12082,8,113),
+(12083,8,86),
+(12084,8,91),
+(12085,8,61),
+(12086,8,125),
+(12087,8,183),
+(12088,8,146),
+(12089,8,79),
+(12090,8,85),
+(12091,8,105),
+(12092,8,109),
+(12093,8,54),
+(12094,8,69),
+(12095,8,131),
+(12096,8,135),
+(12097,8,178),
+(12098,8,179),
+(12099,8,50),
+(12100,8,124),
+(12101,8,132),
+(12102,8,110),
+(12103,8,96),
+(12104,8,129),
+(12105,8,111),
+(12106,8,78),
+(12107,8,116),
+(12108,8,104),
+(12109,8,97),
+(12110,8,90),
+(12111,8,130),
+(12112,8,180),
+(12460,2,112),
+(12461,2,181),
+(12462,2,177),
+(12463,2,140),
+(12464,2,117),
+(12465,2,160),
+(12466,2,119),
+(12467,2,158),
+(12468,2,102),
+(12469,2,93),
+(12470,2,154),
+(12471,2,189),
+(12472,2,188),
+(12473,2,126),
+(12474,2,84),
+(12475,2,161),
+(12476,2,5),
+(12477,2,155),
+(12478,2,182),
+(12479,2,49),
+(12480,2,113),
+(12481,2,86),
+(12482,2,80),
+(12483,2,83),
+(12484,2,159),
+(12485,2,91),
+(12486,2,138),
+(12487,2,101),
+(12488,2,118),
+(12489,2,106),
+(12490,2,107),
+(12491,2,120),
+(12492,2,125),
+(12493,2,61),
+(12494,2,185),
+(12495,2,186),
+(12496,2,153),
+(12497,2,16),
+(12498,2,139),
+(12499,2,79),
+(12500,2,100),
+(12501,2,121),
+(12502,2,109),
+(12503,2,85),
+(12504,2,146),
+(12505,2,115),
+(12506,2,183),
+(12507,2,105),
+(12508,2,131),
+(12509,2,135),
+(12510,2,136),
+(12511,2,165),
+(12512,2,178),
+(12513,2,50),
+(12514,2,54),
+(12515,2,69),
+(12516,2,103),
+(12517,2,187),
+(12518,2,179),
+(12519,2,127),
+(12520,2,192),
+(12521,2,132),
+(12522,2,133),
+(12523,2,108),
+(12524,2,124),
+(12525,2,128),
+(12526,2,110),
+(12527,2,96),
+(12528,2,78),
+(12529,2,122),
+(12530,2,123),
+(12531,2,129),
+(12532,2,111),
+(12533,2,134),
+(12534,2,90),
+(12535,2,104),
+(12536,2,97),
+(12537,2,116),
+(12538,2,130),
+(12539,2,1),
+(12540,2,180),
+(12541,2,137),
+(12542,2,184),
+(12543,2,18),
+(12544,2,19),
+(12545,2,17),
+(12546,2,15),
+(12547,2,9),
+(12548,2,7),
+(12549,2,6),
+(12550,2,4),
+(12551,2,3),
+(12552,2,2),
+(12553,7,140),
+(12554,7,126),
+(12555,7,102),
+(12556,7,160),
+(12557,7,93),
+(12558,7,154),
+(12559,7,158),
+(12560,7,112),
+(12561,7,181),
+(12562,7,188),
+(12563,7,119),
+(12564,7,117),
+(12565,7,5),
+(12566,7,159),
+(12567,7,107),
+(12568,7,120),
+(12569,7,106),
+(12570,7,155),
+(12571,7,118),
+(12572,7,49),
+(12573,7,101),
+(12574,7,86),
+(12575,7,113),
+(12576,7,91),
+(12577,7,80),
+(12578,7,83),
+(12579,7,161),
+(12580,7,138),
+(12581,7,182),
+(12582,7,84),
+(12583,7,125),
+(12584,7,61),
+(12585,7,185),
+(12586,7,186),
+(12587,7,153),
+(12588,7,105),
+(12589,7,109),
+(12590,7,139),
+(12591,7,146),
+(12592,7,121),
+(12593,7,16),
+(12594,7,79),
+(12595,7,183),
+(12596,7,85),
+(12597,7,115),
+(12598,7,100),
+(12599,7,135),
+(12600,7,136),
+(12601,7,103),
+(12602,7,69),
+(12603,7,54),
+(12604,7,50),
+(12605,7,178),
+(12606,7,127),
+(12607,7,165),
+(12608,7,179),
+(12609,7,187),
+(12610,7,131),
+(12611,7,192),
+(12612,7,132),
+(12613,7,133),
+(12614,7,108),
+(12615,7,124),
+(12616,7,128),
+(12617,7,78),
+(12618,7,122),
+(12619,7,123),
+(12620,7,110),
+(12621,7,111),
+(12622,7,96),
+(12623,7,129),
+(12624,7,134),
+(12625,7,97),
+(12626,7,130),
+(12627,7,104),
+(12628,7,116),
+(12629,7,90),
+(12630,7,1),
+(12631,7,180),
+(12632,7,137),
+(12633,7,184),
+(12634,7,18),
+(12635,7,19),
+(12636,7,17),
+(12637,7,15),
+(12638,7,9),
+(12639,7,7),
+(12640,7,6),
+(12641,7,4),
+(12642,7,3),
+(12643,7,2);
+
+/*Table structure for table `t_gen_code` */
+
+DROP TABLE IF EXISTS `t_gen_code`;
+
+CREATE TABLE `t_gen_code` (
+ `id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `service_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '服务名称',
+ `module_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '模块名称',
+ `table_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表名',
+ `table_prefix` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表前缀',
+ `pk_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '主键名',
+ `package_name` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '后端包名',
+ `backend_path` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '后端路径',
+ `front_path` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '前端路径',
+ `author` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '作者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'A' COMMENT '状态',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='代码生成表';
+
+/*Data for the table `t_gen_code` */
+
+insert into `t_gen_code`(`id`,`service_name`,`module_name`,`table_name`,`table_prefix`,`pk_name`,`package_name`,`backend_path`,`front_path`,`author`,`create_time`,`update_time`,`status`) values
+(1,'Banner','焦点图','banner','mt_','id','banner','C:/Code/fuintBackend',NULL,'FSQ','2024-04-09 15:18:06','2024-04-09 15:20:52','A');
+
+/*Table structure for table `t_platform` */
+
+DROP TABLE IF EXISTS `t_platform`;
+
+CREATE TABLE `t_platform` (
+ `owner_id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `name` varchar(20) NOT NULL COMMENT '平台名称',
+ `status` int NOT NULL COMMENT '状态 0 无效 1 有效',
+ `description` varchar(255) DEFAULT NULL COMMENT '描述',
+ `platform_type` int NOT NULL COMMENT '平台类型',
+ PRIMARY KEY (`owner_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
+
+/*Data for the table `t_platform` */
+
+insert into `t_platform`(`owner_id`,`name`,`status`,`description`,`platform_type`) values
+(1,'会员营销管理系统',1,'会员营销管理系统说明',1);
+
+/*Table structure for table `t_source` */
+
+DROP TABLE IF EXISTS `t_source`;
+
+CREATE TABLE `t_source` (
+ `merchant_id` int DEFAULT '1' COMMENT '商户ID',
+ `source_id` int NOT NULL AUTO_INCREMENT COMMENT '菜单Id',
+ `source_name` varchar(240) NOT NULL COMMENT '菜单名称',
+ `source_code` varchar(200) NOT NULL COMMENT '菜单对应url',
+ `path` varchar(255) DEFAULT '' COMMENT '路径',
+ `ename` varchar(100) DEFAULT '' COMMENT '字母名称',
+ `new_icon` varchar(30) DEFAULT '' COMMENT '新图标',
+ `status` varchar(6) NOT NULL COMMENT '状态(A:可用 D:禁用)',
+ `source_level` int NOT NULL COMMENT '菜单级别',
+ `source_style` varchar(40) NOT NULL COMMENT '样式',
+ `is_menu` int NOT NULL COMMENT '是否显示',
+ `description` varchar(400) DEFAULT NULL COMMENT '描述',
+ `parent_id` int DEFAULT NULL COMMENT '上级菜单ID',
+ `is_log` int DEFAULT NULL,
+ `icon` varchar(20) DEFAULT NULL COMMENT '菜单图标',
+ PRIMARY KEY (`source_id`),
+ KEY `index-name` (`source_name`,`parent_id`),
+ KEY `index-parent-id` (`parent_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=193 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='菜单表';
+
+/*Data for the table `t_source` */
+
+insert into `t_source`(`merchant_id`,`source_id`,`source_name`,`source_code`,`path`,`ename`,`new_icon`,`status`,`source_level`,`source_style`,`is_menu`,`description`,`parent_id`,`is_log`,`icon`) values
+(0,1,'后台管理员','system/account/index','system/account/index','SystemAccountIndex','select','A',2,'7',1,'管理员管理',15,1,NULL),
+(0,2,'新增用户','/user/add','system/account/add','SystemAccountAdd','select','A',3,'99',0,'',1,1,NULL),
+(0,3,'修改用户','/user/edit','system/account/edit','SystemAccountEdit','select','A',3,'99',0,'',1,1,NULL),
+(0,4,'删除用户','/user/delete','system/account/delete','SystemAccountDelete','select','A',3,'99',0,'',1,1,NULL),
+(0,5,'后台菜单','system/menu/index','system/menu/index','SystemMenuIndex','select','A',2,'1',1,NULL,15,1,NULL),
+(0,6,'新增菜单','system/menu/add','system/menu/add','SystemMenuAdd','select','A',3,'99',0,'',5,1,NULL),
+(0,7,'修改菜单','/source/edit','system/menu/edit','SystemMenuEdit','select','A',3,'99',0,'修改菜单',5,1,NULL),
+(0,9,'删除菜单','/source/delete','system/menu/delete','SystemMenuDelete','select','A',3,'99',0,'删除菜单',5,1,NULL),
+(0,15,'系统管理','system','system','System','system','A',1,'99',1,NULL,NULL,1,'cog'),
+(0,16,'后台角色','system/role/index','system/role/index','SystemRoleIndex','select','A',2,'2',1,NULL,15,1,NULL),
+(0,17,'新增角色','/duty/add','system/role/add','SystemRoleAdd','select','A',3,'99',0,'',16,1,NULL),
+(0,18,'修改角色','/source/edit','system/role/edit','SystemRoleEdit','select','A',3,'99',0,'',16,1,NULL),
+(0,19,'删除角色','/source/delete','system/role/delete','SystemRoleDelete','select','A',3,'99',0,'',16,1,NULL),
+(0,49,'后台日志','system/logs/index','system/logs/index','SystemLogsIndex','select','A',2,'1',1,'后台操作日志',15,1,NULL),
+(0,50,'卡券管理','######','coupon','Coupon','job','A',1,'3',1,'卡券管理',NULL,0,'ticket'),
+(0,54,'会员卡券','/backend/userCoupon/list','coupon/userCoupon/index','CouponUserCouponIndex','select','A',2,'3',1,'会员卡券明细列表',50,1,NULL),
+(0,61,'新增会员','member/add','member/add','MemberAdd','select','A',2,'10',0,'新增会员',79,1,NULL),
+(0,69,'员工管理','/backend/staff/queryList','staff/list','StaffList','select','A',2,'3',1,'店铺员工管理',84,0,NULL),
+(0,78,'发券记录','/backend/sendLog/index','coupon/sendLog/index','CouponSendLogIndex','select','A',2,'5',1,'发券记录',50,1,NULL),
+(0,79,'会员管理','######','member','Member','peoples','A',1,'2',1,'会员管理',NULL,0,'user'),
+(0,80,'会员列表','/backend/member/queryList','member/index','MemberIndex','select','A',2,'1',1,'会员列表',79,1,NULL),
+(0,81,'核销流水','/backend/confirmLog/confirmLogList','coupon/confirmLog/index','CouponConfirmLogIndex','select','A',2,'4',1,'核销记录列表',50,1,NULL),
+(0,83,'分组管理','/backend/couponGroup/index','coupon/group/index','CouponGroupIndex','select','A',2,'1',1,'分组管理',50,1,NULL),
+(0,84,'店铺管理','######','store','Store','shopping','A',1,'1',1,'店铺管理',NULL,0,'columns'),
+(0,85,'新增店铺','store/add','store/add','StoreAdd','select','A',3,'2',0,'新增店铺信息',86,1,NULL),
+(0,86,'店铺列表','/backend/store/queryList','store/list','StoreList','select','A',2,'1',1,'店铺列表',84,0,NULL),
+(0,90,'消息管理','######','message','Message','message','A',1,'6',1,'消息管理',NULL,0,'tablet'),
+(0,91,'已发短信','/backend/smsManager/index','smsManager/index','SmsManagerIndex','select','A',2,'1',1,'已发短信列表',90,0,NULL),
+(0,93,'短信模板','/backend/smsTemplate/index','smsTemplate/index','SmsTemplateIndex','select','A',2,'0',1,'短信模板',90,0,NULL),
+(0,96,'订单管理','######','order','Order','list','A',1,'5',1,'订单管理',NULL,0,'list'),
+(0,97,'转赠记录','/backend/give/index','coupon/give/index','CouponGiveIndex','select','A',2,'6',1,'转赠记录',50,1,NULL),
+(0,100,'卡券列表','/backend/coupon/index','coupon/coupon/index','CouponCouponIndex','select','A',2,'2',1,'卡券列表',50,1,NULL),
+(0,101,'内容管理','######','content','Content','edit','A',1,'1',1,'内容管理',NULL,1,'book'),
+(0,102,'轮播管理','content/banner/list','content/banner/list','ContentBannerList','select','A',2,'0',1,'首页广告',101,1,NULL),
+(0,103,'会员等级','/backend/userGrade/queryList','userGrade/index','UserGradeIndex','select','A',2,'3',1,'会员等级',79,1,NULL),
+(0,104,'积分管理','######','point','Point','log','A',1,'6',1,'积分管理',NULL,1,'file'),
+(0,105,'积分明细','/backend/point/index','point/list','PointList','select','A',2,'2',1,'积分明细',104,1,NULL),
+(0,106,'积分设置','/backend/point/setting','point/setting','PointSetting','select','A',2,'1',1,'积分设置',104,0,NULL),
+(0,107,'订单列表','/backend/order/list','order/index','OrderIndex','select','A',2,'1',1,'订单列表',96,1,NULL),
+(0,108,'开卡赠礼','/backend/openGift/list','openGift/index','OpenGiftIndex','select','A',2,'4',1,'开卡礼设置',79,1,NULL),
+(0,109,'售后订单','/backend/refund/index','refund/index','RefundIndex','select','A',2,'2',1,'售后订单',96,0,NULL),
+(0,110,'会员设置','/backend/member/setting','member/setting','MemberSetting','select','A',2,'5',1,'会员设置',79,0,NULL),
+(0,111,'商品管理','######','Goods','Goods','server','A',1,'5',1,'商品管理',NULL,0,'shopping-cart'),
+(0,112,'商品分类','/backend/goods/cate/list','goods/cate/index','GoodsCateIndex','select','A',2,'0',1,'商品分类',111,1,NULL),
+(0,113,'商品列表','/backend/goods/goods/list','goods/goods/index','GoodsGoodsIndex','select','A',2,'1',1,'商品列表',111,1,NULL),
+(0,115,'卡券核销','/backend/home/confirmCoupon','coupon/confirm/index','CouponConfirmIndex','select','A',2,'2',1,'卡券核销',50,1,NULL),
+(0,116,'充值管理','recharge','recharge','Recharge','money','A',1,'6',1,'余额',NULL,1,'money'),
+(0,117,'充值设置','/backend/balance/setting','balance/setting','BalanceSetting','select','A',2,'0',1,'充值设置',116,1,NULL),
+(0,118,'余额明细','balance/list','balance/list','BalanceList','select','A',2,'1',1,'充值明细',116,1,NULL),
+(0,119,'订阅消息','/backend/subMessage/index','subMessage/index','SubMessageIndex','select','A',2,'0',1,'小程序订阅消息',90,1,NULL),
+(0,120,'轮播图编辑','content/banner/edit','content/banner/edit','ContentBannerEdit','select','A',2,'1',0,NULL,101,1,NULL),
+(0,121,'新增轮播图','content:banner:add','content:banner:add','Content:banner:add','select','A',2,'2',0,NULL,101,1,NULL),
+(0,122,'新增会员等级','/backend/userGrade/add','userGrade/add','UserGradeAdd','select','A',2,'5',0,NULL,79,1,NULL),
+(0,123,'新增开卡赠礼','/backend/openGift/add','openGift/add','OpenGiftAdd','select','A',2,'5',0,NULL,79,1,NULL),
+(0,124,'收银台','cashier/index','cashier/index','CashierIndex','select','A',2,'4',1,NULL,125,1,NULL),
+(0,125,'收银管理','cashier','cashier','Cashier','tab','A',1,'10',0,NULL,NULL,1,NULL),
+(0,126,'核销订单','cashier/confirmOrder','cashier/confirmOrder','CashierConfirmOrder','select','A',2,'0',1,NULL,125,1,NULL),
+(0,127,'订单修改','/backend/order/edit','order/edit','OrderEdit','select','A',2,'3',0,NULL,96,1,NULL),
+(0,128,'订单删除','/backend/order/delete','order/delete','OrderDelete','select','A',2,'4',0,NULL,96,1,NULL),
+(0,129,'处理售后','/backend/refund/edit','refund/edit','RefundEdit','select','A',2,'5',0,NULL,96,1,NULL),
+(0,130,'订单详情','/backend/order/detail','order/detail','OrderDetail','select','A',2,'6',0,NULL,96,1,NULL),
+(0,131,'添加商品','goods/goods/add','goods/goods/add','GoodsGoodsAdd','select','A',2,'3',0,NULL,111,1,NULL),
+(0,132,'编辑商品','goods/goods/edit','goods/goods/edit','GoodsGoodsEdit','select','A',2,'4',0,NULL,111,1,NULL),
+(0,133,'编辑短信模板','smsTemplate/edit','smsTemplate/edit','SmsTemplateEdit','select','A',2,'4',0,NULL,90,1,NULL),
+(0,134,'编辑订阅消息','subMessage/edit','subMessage/edit','SubMessageEdit','select','A',2,'6',0,NULL,90,1,NULL),
+(0,135,'变更余额','balance/modify','balance/modify','BalanceModify','select','A',3,'3',0,NULL,117,1,NULL),
+(0,136,'变更积分','point/modify','point/modify','PointModify','select','A',2,'3',0,NULL,104,1,NULL),
+(0,137,'编辑卡券分组','coupon/group/edit','coupon/group/edit','CouponGroupEdit','select','A',3,'9',0,NULL,83,1,NULL),
+(0,138,'新增卡券','coupon/coupon/add','coupon/coupon/add','CouponCouponAdd','select','A',3,'1',0,NULL,100,1,NULL),
+(0,139,'编辑卡券','coupon/coupon/edit','coupon/coupon/edit','CouponCouponEdit','select','A',3,'2',0,NULL,100,1,NULL),
+(0,140,'作废会员卡券','coupon/userCoupon/delete','coupon/userCoupon/delete','CouponUserCouponDelete','select','A',3,'0',0,NULL,54,1,NULL),
+(0,146,'支付设置','store/paySetting','store/paySetting','StorePaySetting','select','A',3,'2',0,NULL,86,1,NULL),
+(0,153,'分佣提成','commission','commission','Commission','tree','A',1,'12',1,NULL,NULL,1,NULL),
+(0,154,'分佣规则','commission/rule/index','commission/rule/index','CommissionRuleIndex','select','A',2,'0',1,NULL,153,1,NULL),
+(0,155,'分佣记录','commission/log/index','commission/log/index','CommissionLogIndex','select','A',2,'1',1,NULL,153,1,NULL),
+(0,158,'订单发货','order/delivery','order/delivery','OrderDelivery','bug','A',3,'0',0,NULL,107,1,NULL),
+(0,159,'文章管理','content/article/index','content/article/index','ContentArticleIndex','select','A',2,'1',1,NULL,101,1,NULL),
+(0,160,'新增文章','content/article/add','content/article/add','ContentArticleAdd','select','A',2,'0',0,NULL,101,1,NULL),
+(0,161,'编辑文章','content/article/edit','content/article/edit','ContentArticleEdit','select','A',2,'1',0,NULL,101,1,NULL),
+(0,165,'交易设置','order/setting','order/setting','OrderSetting','select','A',2,'3',1,NULL,96,1,NULL),
+(0,177,'商户管理','merchant/index','merchant/index','MerchantIndex','select','A',2,'0',1,NULL,84,1,NULL),
+(0,178,'收银设置','setting/cashier','setting/cashier','SettingCashier','select','A',2,'3',1,NULL,125,1,NULL),
+(0,179,'库存管理','stock/index','stock/index','StockIndex','select','A',2,'3',1,NULL,111,1,NULL),
+(0,180,'数据统计','statistic','statistic','Statistic','chart','A',1,'8',1,NULL,NULL,1,NULL),
+(0,181,'数据看板','statistic/index','statistic/index','StatisticIndex','select','A',2,'0',1,NULL,180,1,NULL),
+(0,182,'会员分组','member/group/index','member/group/index','MemberGroupIndex','select','A',2,'1',1,NULL,79,1,NULL),
+(0,183,'会员充值','balance/distribute','balance/distribute','BalanceDistribute','select','A',2,'2',1,NULL,116,1,NULL),
+(0,184,'订单结算','settlement/index','settlement/index','SettlementIndex','select','A',2,'9',1,NULL,96,1,NULL),
+(0,185,'发起结算','settlement/doSubmit','settlement/doSubmit','SettlementDoSubmit','select','A',2,'10',0,NULL,96,1,NULL),
+(0,186,'结算确认','settlement/doConfirm','settlement/doConfirm','SettlementDoConfirm','select','A',2,'11',0,NULL,96,1,NULL),
+(0,187,'生成代码','system/genCode/index','system/genCode/index','SystemGenCodeIndex','select','A',2,'3',1,NULL,15,1,NULL),
+(0,188,'新增生成代码','system/genCode/add','system/genCode/add','SystemGenCodeAdd','select','A',3,'0',0,NULL,187,1,NULL),
+(0,189,'删除生成代码','system/genCode/delete','system/genCode/delete','SystemGenCodeDelete','select','A',3,'0',0,NULL,187,1,NULL),
+(0,190,'确定生成代码','system/genCode/gen','system/genCode/gen','SystemGenCodeGen','select','A',3,'3',0,NULL,187,1,NULL),
+(0,192,'结算记录','commission/cash/index','commission/cash/index','CommissionCashIndex','select','A',2,'3',1,NULL,153,1,NULL);
diff --git a/fuintBackend/db/说明.txt b/fuintBackend/db/说明.txt
new file mode 100644
index 0000000..b873873
--- /dev/null
+++ b/fuintBackend/db/说明.txt
@@ -0,0 +1,2 @@
+1、fuint-db.sql是全量的数据库;
+2、update_for_xxx是从上个版本升级到最新版本用的;
\ No newline at end of file
diff --git a/fuintBackend/fuint-application/pom.xml b/fuintBackend/fuint-application/pom.xml
new file mode 100644
index 0000000..b1a4241
--- /dev/null
+++ b/fuintBackend/fuint-application/pom.xml
@@ -0,0 +1,190 @@
+
+
+
+ fuint
+ com.fuint
+ 1.0.0
+
+ 4.0.0
+
+ fuint-application
+ 1.0.0
+ jar
+
+
+ 0.0.9
+
+
+
+
+ com.fuint
+ fuint-framework
+ 1.0.0
+
+
+ io.sentry
+ sentry-logback
+ 1.2.0
+
+
+ org.springframework.ws
+ spring-ws-core
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+ org.aspectj
+ aspectjweaver
+
+
+
+ commons-httpclient
+ commons-httpclient
+ 3.1
+
+
+
+ nl.bitwalker
+ UserAgentUtils
+ 1.2.4
+
+
+ commons-lang
+ commons-lang
+ 2.6
+
+
+ io.springfox
+ springfox-swagger2
+ 2.9.2
+
+
+ io.springfox
+ springfox-swagger-ui
+ 2.9.2
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ ${mybatis-plus.version}
+
+
+
+ com.baomidou
+ mybatis-plus
+ ${mybatis-plus.version}
+
+
+
+ com.github.pagehelper
+ pagehelper-spring-boot-starter
+ 1.2.5
+
+
+ org.mybatis
+ mybatis
+
+
+
+
+
+ org.mockito
+ mockito-core
+
+
+ com.github.axet
+ kaptcha
+ ${kaptcha.version}
+
+
+ junit
+ junit
+ test
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.javassist
+ javassist
+ 3.24.0-GA
+
+
+ com.aliyun.oss
+ aliyun-sdk-oss
+ 3.10.2
+
+
+
+ com.aliyun
+ aliyun-java-sdk-core
+ 4.4.6
+
+
+ com.alibaba
+ transmittable-thread-local
+ 2.2.0
+
+
+ com.github.javen205
+ IJPay-WxPay
+ 2.9.6
+
+
+ com.github.javen205
+ IJPay-AliPay
+ 2.9.6
+
+
+ org.apache.velocity
+ velocity-engine-core
+ 2.3
+
+
+
+ commons-io
+ commons-io
+ 2.13.0
+
+
+
+ org.apache.commons
+ commons-lang3
+ 3.12.0
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ 2.5.12
+
+
+
+ repackage
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.1
+
+ 1.8
+ 1.8
+
+
+
+
+
+
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/Constants.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/Constants.java
new file mode 100644
index 0000000..35c001e
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/Constants.java
@@ -0,0 +1,38 @@
+package com.fuint.common;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 常量定义
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public class Constants {
+
+ // 第几页,默认第1页
+ public static final int PAGE_NUMBER = 1;
+
+ // 每页记录数,默认20条
+ public static final int PAGE_SIZE = 20;
+
+ // 读取数据最多行数
+ public static final int MAX_ROWS = 2000;
+
+ // 读取数据全部行数
+ public static final int ALL_ROWS = 1000000;
+
+ /**
+ * 系统配置, 从setting表中读取
+ */
+ public static Map SYS_CONFIGS = new HashMap();
+
+ public static final int HTTP_RESPONSE_CODE_PARAM_ERROR = 202;
+ public static final int HTTP_RESPONSE_CODE_USER_NOT_EXIST = 402;
+ public static final int HTTP_RESPONSE_CODE_USER_LOGIN_ERROR = 403;
+ public static final int HTTP_RESPONSE_CODE_NOLOGIN = 1001;
+
+ public static final String SESSION_USER = "FUINT_USER";
+ public static final String SESSION_ADMIN_USER = "FUINT_ADMIN_USER";
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/aspect/LogAop.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/aspect/LogAop.java
new file mode 100644
index 0000000..72d879e
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/aspect/LogAop.java
@@ -0,0 +1,147 @@
+package com.fuint.common.aspect;
+
+import javassist.ClassClassPath;
+import javassist.ClassPool;
+import javassist.CtClass;
+import javassist.CtMethod;
+import javassist.Modifier;
+import javassist.bytecode.CodeAttribute;
+import javassist.bytecode.LocalVariableAttribute;
+import javassist.bytecode.MethodInfo;
+import org.apache.commons.lang.ArrayUtils;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+import org.springframework.stereotype.Component;
+
+/**
+ * 控制器日志
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Component // 声明组件
+@Aspect // 声明切面
+@ComponentScan //组件自动扫描
+@EnableAspectJAutoProxy // spring自动切换JDK动态代理和CGLIB
+public class LogAop {
+
+ /**
+ *自定义日志
+ */
+ private Logger logger = LoggerFactory.getLogger(LogAop.class);
+
+ /**
+ * 打印类method的名称以及参数
+ * @param point 切面
+ */
+ public void printMethodParams(JoinPoint point){
+ if (point == null) {
+ return;
+ }
+ try {
+ // 获取方法的参数值数组。方法名、类型以及地址等信息
+ String className = point.getTarget().getClass().getName();
+ String methodName = point.getSignature().getName();
+
+ // 重新定义日志
+ logger = LoggerFactory.getLogger(point.getTarget().getClass());
+ logger.info("-------------------------"+className+"------------------------------------");
+ logger.info("methodName = {}", methodName);
+
+ // 获取方法的参数值数组
+ Object[] methodArgs = point.getArgs();
+
+ // 获取方法参数名称
+ String[] paramNames = getFieldsName(className, methodName);
+
+ // 输出方法的参数名和参数值
+ printParams(paramNames, methodArgs);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * 使用获取方法参数名称
+ * @param class_name 类名
+ * @param method_name 方法名
+ * @throws Exception
+ */
+ private String[] getFieldsName(String class_name, String method_name) throws Exception {
+ Class> clazz = Class.forName(class_name);
+ String clazz_name = clazz.getName();
+ ClassPool pool = ClassPool.getDefault();
+ ClassClassPath classPath = new ClassClassPath(clazz);
+ pool.insertClassPath(classPath);
+ try {
+ CtClass ctClass = pool.get(clazz_name);
+ CtMethod ctMethod = ctClass.getDeclaredMethod(method_name);
+ MethodInfo methodInfo = ctMethod.getMethodInfo();
+ CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
+ LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);
+ if (attr == null) {
+ return null;
+ }
+ String[] paramsArgsName = new String[ctMethod.getParameterTypes().length];
+ int pos = Modifier.isStatic(ctMethod.getModifiers()) ? 0 : 1;
+ for (int i = 0; i < paramsArgsName.length; i++) {
+ paramsArgsName[i] = attr.variableName(i + pos);
+ }
+ return paramsArgsName;
+ } catch (Exception ex) {
+ return null;
+ }
+ }
+
+ /**
+ * 判断是否为基本类型
+ */
+ private boolean isPrimite(Class> clazz) {
+ if (clazz.isPrimitive() || clazz == String.class){
+ return true;
+ }else {
+ return false;
+ }
+ }
+
+ /**
+ * 打印方法参数值 基本类型直接打印,非基本类型需要重写toString方法
+ * @param paramsArgsName 方法参数名数组
+ * @param paramsArgsValue 方法参数值数组
+ */
+ private void printParams(String[] paramsArgsName, Object[] paramsArgsValue) {
+ if (ArrayUtils.isEmpty(paramsArgsName) || ArrayUtils.isEmpty(paramsArgsValue)) {
+ return;
+ }
+ StringBuffer buffer = new StringBuffer();
+ for (int i = 0; i < paramsArgsName.length; i++) {
+ // 参数名
+ String name = paramsArgsName[i];
+ // 参数值
+ Object value = paramsArgsValue[i];
+ buffer.append(name +" = ");
+ if (isPrimite(value.getClass())) {
+ buffer.append(value + " ,");
+ } else {
+ buffer.append(value.toString() + " ,");
+ }
+ }
+ logger.info("params : " + buffer.toString());
+ logger.info("-------------------------------------------------------------");
+ }
+
+ /**
+ * 在方法执行前进行切面
+ * 定义切面表达式
+ * @param point 切面
+ */
+ @Before("execution(public * com.fuint.module..*.*(..))")
+ public void before(JoinPoint point) {
+ this.printMethodParams(point);
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/aspect/RedisModelAspect.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/aspect/RedisModelAspect.java
new file mode 100644
index 0000000..3b26713
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/aspect/RedisModelAspect.java
@@ -0,0 +1,16 @@
+package com.fuint.common.aspect;
+
+import org.aspectj.lang.annotation.Aspect;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Component
+@Aspect
+public class RedisModelAspect {
+ public static final Logger logger = LoggerFactory.getLogger(RedisModelAspect.class);
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/aspect/TActionLogAop.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/aspect/TActionLogAop.java
new file mode 100644
index 0000000..fac8f3f
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/aspect/TActionLogAop.java
@@ -0,0 +1,233 @@
+package com.fuint.common.aspect;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.fuint.common.dto.AccountInfo;
+import com.fuint.common.service.AccountService;
+import com.fuint.common.service.ActionLogService;
+import com.fuint.common.util.CommonUtil;
+import com.fuint.common.util.TokenUtil;
+import com.fuint.framework.annoation.OperationServiceLog;
+import com.fuint.repository.model.TActionLog;
+import com.fuint.utils.StringUtil;
+import org.apache.commons.lang.StringUtils;
+import org.apache.ibatis.javassist.*;
+import org.apache.ibatis.javassist.bytecode.CodeAttribute;
+import org.apache.ibatis.javassist.bytecode.LocalVariableAttribute;
+import org.apache.ibatis.javassist.bytecode.MethodInfo;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.*;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+import javax.servlet.http.HttpServletRequest;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 后台操作日志
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Component
+@Aspect
+public class TActionLogAop {
+
+ private Logger logger = LoggerFactory.getLogger(TActionLogAop.class);
+
+ @Lazy
+ @Autowired
+ private ActionLogService tActionLogService;
+
+ @Lazy
+ @Autowired
+ private AccountService tAccountService;
+
+ private String userName = ""; // 用户名
+ private Integer merchantId = 0; // 商户ID
+ private Integer storeId = 0; // 店铺ID
+ private Long startTimeMillis = 0l; // 开始时间
+ private Long endTimeMillis = 0l; // 结束时间
+ private String clientIp = "";
+ private Integer clientPort = 0;
+ private String module = "";
+ private String url = "";
+ private String userAgent = "";
+ private String param = "";
+
+ // Service层切点
+ @Pointcut("@annotation(com.fuint.framework.annoation.OperationServiceLog)")
+ public void serviceAspect() {
+ // empty
+ }
+
+ /**
+ * service 方法前调用
+ *
+ * @param joinPoint
+ */
+ @Before("serviceAspect()")
+ public void doBeforeService(JoinPoint joinPoint) {
+ // 记录方法开始执行的时间
+ startTimeMillis = System.currentTimeMillis();
+
+ Map params = getJoinPointPramas(joinPoint);
+ String methodName = params.get("methodName");
+ String classPath = params.get("classPath");
+ Class> clazz = null;
+ CtMethod ctMethod = null;
+ LocalVariableAttribute attr = null;
+ int length = 0;
+ int pos = 0;
+
+ try {
+ //获取切入点参数
+ clazz = Class.forName(classPath);
+ String clazzName = clazz.getName();
+ ClassPool pool = ClassPool.getDefault();
+ ClassClassPath classClassPath = new ClassClassPath(clazz);
+ pool.insertClassPath(classClassPath);
+ CtClass ctClass = pool.get(clazzName);
+ ctMethod = ctClass.getDeclaredMethod(methodName);
+ MethodInfo methodInfo = ctMethod.getMethodInfo();
+ CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
+ attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);
+ length = ctMethod.getParameterTypes().length;
+ pos = Modifier.isStatic(ctMethod.getModifiers()) ? 0 : 1;
+ Object[] paramsArgsValues = joinPoint.getArgs();
+ String[] parmasArgsNames = new String[length];
+ Map parmasMap = new HashMap();
+ for (int i = 0; i < length; i++) {
+ parmasArgsNames[i] = attr.variableName(i + pos);
+ String paramsArgsName = attr.variableName(i + pos);
+ if (paramsArgsName.equalsIgnoreCase("request")
+ || paramsArgsName.equalsIgnoreCase("response")
+ || paramsArgsName.equalsIgnoreCase("session")
+ || paramsArgsName.equalsIgnoreCase("model")) {
+ continue;
+ }
+ Object paramsArgsValue = paramsArgsValues[i];
+ parmasMap.put(paramsArgsName, paramsArgsValue);
+ }
+ param = JSON.toJSONString(parmasMap);
+ } catch (ClassNotFoundException e) {
+ logger.info("AOP切入点获取参数异常", e);
+ } catch (NotFoundException e) {
+ logger.info("AOP切入点获取参数异常", e);
+ } catch (Exception e) {
+ logger.info("AOP切入点获取参数异常", e.getMessage());
+ }
+ }
+
+ /**
+ * 方法后调用
+ *
+ * @param operationServiceLog
+ */
+ @After("serviceAspect() && @annotation(operationServiceLog)")
+ public void doAfterInService(OperationServiceLog operationServiceLog) {
+ try {
+ endTimeMillis = System.currentTimeMillis(); // 记录方法执行完成的时间
+ clientIp = CommonUtil.getIPFromHttpRequest(getRequest());
+ userAgent = getRequest().getHeader("user-agent");
+ url = getRequest().getRequestURI();
+ clientPort = 0;
+ module = operationServiceLog.description();
+ if (module.length() > 255) {
+ module = module.substring(0, 255);
+ }
+ HttpServletRequest request = getRequest();
+ String token = request.getHeader("Access-Token");
+ if (StringUtils.isNotEmpty(token)) {
+ AccountInfo accountInfo = TokenUtil.getAccountInfoByToken(token);
+ if (accountInfo != null) {
+ userName = accountInfo.getAccountName();
+ merchantId = accountInfo.getMerchantId() == null ? 0 : accountInfo.getMerchantId();
+ storeId = accountInfo.getStoreId() == null ? 0 : accountInfo.getStoreId();
+ }
+ } else {
+ if (StringUtil.isNotEmpty(param) && param.length() > 10) {
+ JSONObject jsonObject = JSON.parseObject(param);
+ if (jsonObject != null) {
+ JSONObject tAccount = jsonObject.getJSONObject("tAccount");
+ if (tAccount != null) {
+ String accountName = tAccount.getString("username");
+ AccountInfo accountInfo = tAccountService.getAccountByName(accountName);
+ if (accountInfo != null) {
+ userName = accountInfo.getAccountName();
+ merchantId = accountInfo.getMerchantId();
+ storeId = accountInfo.getStoreId();
+ }
+ }
+ }
+ }
+ }
+ printOptLog();
+ } catch (Exception e) {
+ logger.error("保存后台日志出错啦:{}", e.getMessage());
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * 组装日志
+ */
+ private void printOptLog() {
+ if (userAgent.length() > 255) {
+ userAgent = userAgent.substring(0, 255);
+ }
+ if (url.length() > 255) {
+ url = url.substring(0, 255);
+ }
+ TActionLog hal = new TActionLog();
+ hal.setAcctName(userName);
+ hal.setModule(module);
+ hal.setActionTime(new Date());
+ hal.setClientIp(clientIp);
+ hal.setClientPort(clientPort);
+ hal.setUrl(url);
+ hal.setTimeConsuming(new BigDecimal(endTimeMillis - startTimeMillis));
+ hal.setUserAgent(userAgent);
+ hal.setMerchantId(merchantId);
+ hal.setStoreId(storeId);
+ if (param.length() > 10000) {
+ param = param.substring(0, 10000);
+ }
+ hal.setParam(param.equals("{}") ? "" : param);
+ if (StringUtils.isNotEmpty(module) && userName != null && StringUtils.isNotEmpty(userName)) {
+ tActionLogService.saveActionLog(hal);
+ }
+ }
+
+ protected HttpServletRequest getRequest(){
+ return ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();
+ }
+
+ /**
+ * 获取切入点参数信息
+ *
+ * @param joinPoint
+ * @return
+ */
+ public Map getJoinPointPramas(JoinPoint joinPoint) {
+ Map mapParams = new HashMap();
+ // 获取切入点所在的方法
+ MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+ Method smethod = signature.getMethod();
+ String classPath = joinPoint.getTarget().getClass().getName();
+ String methodName = joinPoint.getSignature().getName();
+ mapParams.put("module", module);
+ mapParams.put("classPath", classPath);
+ mapParams.put("methodName", methodName);
+ return mapParams;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/bean/AliPayBean.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/bean/AliPayBean.java
new file mode 100644
index 0000000..e0be9e8
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/bean/AliPayBean.java
@@ -0,0 +1,104 @@
+package com.fuint.common.bean;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.stereotype.Component;
+
+/**
+ * 支付宝支付Bean
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Component
+@PropertySource("file:${env.properties.path}/${env.profile}/application.properties")
+@ConfigurationProperties(prefix = "alipay")
+public class AliPayBean {
+
+ private String appId;
+ private String privateKey;
+ private String publicKey;
+ private String appCertPath;
+ private String aliPayCertPath;
+ private String aliPayRootCertPath;
+ private String serverUrl;
+ private String domain;
+
+ public String getAppId() {
+ return appId;
+ }
+
+ public void setAppId(String appId) {
+ this.appId = appId;
+ }
+
+ public String getPrivateKey() {
+ return privateKey;
+ }
+
+ public void setPrivateKey(String privateKey) {
+ this.privateKey = privateKey;
+ }
+
+ public String getPublicKey() {
+ return publicKey;
+ }
+
+ public void setPublicKey(String publicKey) {
+ this.publicKey = publicKey;
+ }
+
+ public String getAppCertPath() {
+ return appCertPath;
+ }
+
+ public void setAppCertPath(String appCertPath) {
+ this.appCertPath = appCertPath;
+ }
+
+ public String getAliPayCertPath() {
+ return aliPayCertPath;
+ }
+
+ public void setAliPayCertPath(String aliPayCertPath) {
+ this.aliPayCertPath = aliPayCertPath;
+ }
+
+ public String getAliPayRootCertPath() {
+ return aliPayRootCertPath;
+ }
+
+ public void setAliPayRootCertPath(String aliPayRootCertPath) {
+ this.aliPayRootCertPath = aliPayRootCertPath;
+ }
+
+ public String getServerUrl() {
+ return serverUrl;
+ }
+
+ public void setServerUrl(String serverUrl) {
+ this.serverUrl = serverUrl;
+ }
+
+ public String getDomain() {
+ return domain;
+ }
+
+ public void setDomain(String domain) {
+ this.domain = domain;
+ }
+
+ @Override
+ public String toString() {
+ return "AliPayBean{" +
+ "appId='" + appId + '\'' +
+ ", privateKey='" + privateKey + '\'' +
+ ", publicKey='" + publicKey + '\'' +
+ ", appCertPath='" + appCertPath + '\'' +
+ ", aliPayCertPath='" + aliPayCertPath + '\'' +
+ ", aliPayRootCertPath='" + aliPayRootCertPath + '\'' +
+ ", serverUrl='" + serverUrl + '\'' +
+ ", domain='" + domain + '\'' +
+ '}';
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/bean/H5SceneInfo.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/bean/H5SceneInfo.java
new file mode 100644
index 0000000..5d7061e
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/bean/H5SceneInfo.java
@@ -0,0 +1,83 @@
+package com.fuint.common.bean;
+
+import com.alibaba.fastjson.JSON;
+
+/**
+ * H5支付Bean
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public class H5SceneInfo {
+ private H5 h5_info;
+
+ public H5 getH5Info() {
+ return h5_info;
+ }
+
+ public void setH5Info(H5 h5_info) {
+ this.h5_info = h5_info;
+ }
+
+ @Override
+ public String toString() {
+ return JSON.toJSONString(this);
+ }
+
+ public static class H5 {
+ private String type;
+ private String app_name;
+ private String bundle_id;
+ private String package_name;
+ private String wap_url;
+ private String wap_name;
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getApp_name() {
+ return app_name;
+ }
+
+ public void setApp_name(String app_name) {
+ this.app_name = app_name;
+ }
+
+ public String getBundle_id() {
+ return bundle_id;
+ }
+
+ public void setBundle_id(String bundle_id) {
+ this.bundle_id = bundle_id;
+ }
+
+ public String getPackage_name() {
+ return package_name;
+ }
+
+ public void setPackage_name(String package_name) {
+ this.package_name = package_name;
+ }
+
+ public String getWap_url() {
+ return wap_url;
+ }
+
+ public void setWap_url(String wap_url) {
+ this.wap_url = wap_url;
+ }
+
+ public String getWap_name() {
+ return wap_name;
+ }
+
+ public void setWap_name(String wap_name) {
+ this.wap_name = wap_name;
+ }
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/bean/UnionPayBean.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/bean/UnionPayBean.java
new file mode 100644
index 0000000..d2d360b
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/bean/UnionPayBean.java
@@ -0,0 +1,64 @@
+package com.fuint.common.bean;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.stereotype.Component;
+
+/**
+ * 云闪付支付Bean
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Component
+@PropertySource("file:${env.properties.path}/${env.profile}/application.properties")
+@ConfigurationProperties(prefix = "union")
+public class UnionPayBean {
+
+ private String machId;
+ private String key;
+ private String serverUrl;
+ private String domain;
+
+ public String getMachId() {
+ return machId;
+ }
+
+ public void setMachId(String machId) {
+ this.machId = machId;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getServerUrl() {
+ return serverUrl;
+ }
+
+ public void setServerUrl(String serverUrl) {
+ this.serverUrl = serverUrl;
+ }
+
+ public String getDomain() {
+ return domain;
+ }
+
+ public void setDomain(String domain) {
+ this.domain = domain;
+ }
+
+ @Override
+ public String toString() {
+ return "UnionPayBean{" +
+ "machId='" + machId + '\'' +
+ ", key='" + key + '\'' +
+ ", serverUrl='" + serverUrl + '\'' +
+ ", domain='" + domain + '\'' +
+ '}';
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/bean/WxPayBean.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/bean/WxPayBean.java
new file mode 100644
index 0000000..6c85589
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/bean/WxPayBean.java
@@ -0,0 +1,78 @@
+package com.fuint.common.bean;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.stereotype.Component;
+
+/**
+ * 微信支付Bean
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Component
+@PropertySource("file:${env.properties.path}/${env.profile}/application.properties")
+@ConfigurationProperties(prefix = "wxpay")
+public class WxPayBean {
+
+ private String appId;
+ private String appSecret;
+ private String mchId;
+ private String apiV2;
+ private String certPath;
+ private String domain; // 填写完整的回调地址
+
+ public String getAppId() {
+ return appId;
+ }
+
+ public void setAppId(String appId) {
+ this.appId = appId;
+ }
+
+ public String getAppSecret() {
+ return appSecret;
+ }
+
+ public void setAppSecret(String appSecret) {
+ this.appSecret = appSecret;
+ }
+
+ public String getMchId() {
+ return mchId;
+ }
+
+ public void setMchId(String mchId) {
+ this.mchId = mchId;
+ }
+
+ public String getApiV2() {
+ return apiV2;
+ }
+
+ public void setApiV2(String apiV2) {
+ this.apiV2 = apiV2;
+ }
+
+ public String getCertPath() {
+ return certPath;
+ }
+
+ public void setCertPath(String certPath) {
+ this.certPath = certPath;
+ }
+
+ public String getDomain() {
+ return domain;
+ }
+
+ public void setDomain(String domain) {
+ this.domain = domain;
+ }
+
+ @Override
+ public String toString() {
+ return "WxPayBean [appId=" + appId + ", appSecret=" + appSecret + ", mchId=" + mchId + ", apiV2="
+ + apiV2 + ", certPath=" + certPath + ", domain=" + domain + "]";
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/bean/WxPayV3Bean.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/bean/WxPayV3Bean.java
new file mode 100644
index 0000000..1454f42
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/bean/WxPayV3Bean.java
@@ -0,0 +1,113 @@
+package com.fuint.common.bean;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.stereotype.Component;
+
+/**
+ * 微信V3支付Bean
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Component
+@PropertySource("file:${env.properties.path}/${env.profile}/application.properties")
+@ConfigurationProperties(prefix = "v3")
+public class WxPayV3Bean {
+
+ private String appId;
+ private String keyPath;
+ private String certPath;
+ private String certP12Path;
+ private String platformCertPath;
+ private String mchId;
+ private String apiKey;
+ private String apiKey3;
+ private String domain;
+
+ public String getAppId() {
+ return appId;
+ }
+
+ public void setAppId(String appId) {
+ this.appId = appId;
+ }
+
+ public String getKeyPath() {
+ return keyPath;
+ }
+
+ public void setKeyPath(String keyPath) {
+ this.keyPath = keyPath;
+ }
+
+ public String getCertPath() {
+ return certPath;
+ }
+
+ public void setCertPath(String certPath) {
+ this.certPath = certPath;
+ }
+
+ public String getCertP12Path() {
+ return certP12Path;
+ }
+
+ public void setCertP12Path(String certP12Path) {
+ this.certP12Path = certP12Path;
+ }
+
+ public String getPlatformCertPath() {
+ return platformCertPath;
+ }
+
+ public void setPlatformCertPath(String platformCertPath) {
+ this.platformCertPath = platformCertPath;
+ }
+
+ public String getMchId() {
+ return mchId;
+ }
+
+ public void setMchId(String mchId) {
+ this.mchId = mchId;
+ }
+
+ public String getApiKey() {
+ return apiKey;
+ }
+
+ public void setApiKey(String apiKey) {
+ this.apiKey = apiKey;
+ }
+
+ public String getApiKey3() {
+ return apiKey3;
+ }
+
+ public void setApiKey3(String apiKey3) {
+ this.apiKey3 = apiKey3;
+ }
+
+ public String getDomain() {
+ return domain;
+ }
+
+ public void setDomain(String domain) {
+ this.domain = domain;
+ }
+
+ @Override
+ public String toString() {
+ return "WxPayV3Bean{" +
+ "keyPath='" + keyPath + '\'' +
+ ", certPath='" + certPath + '\'' +
+ ", certP12Path='" + certP12Path + '\'' +
+ ", platformCertPath='" + platformCertPath + '\'' +
+ ", mchId='" + mchId + '\'' +
+ ", apiKey='" + apiKey + '\'' +
+ ", apiKey3='" + apiKey3 + '\'' +
+ ", domain='" + domain + '\'' +
+ '}';
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/config/CaptchaConfig.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/config/CaptchaConfig.java
new file mode 100644
index 0000000..9c30ef4
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/config/CaptchaConfig.java
@@ -0,0 +1,41 @@
+package com.fuint.common.config;
+
+import com.google.code.kaptcha.impl.DefaultKaptcha;
+import com.google.code.kaptcha.util.Config;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import java.io.InputStream;
+import java.util.Properties;
+
+/**
+ * 图形验证码组件配置
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Configuration
+public class CaptchaConfig {
+
+ private static final Logger logger = LoggerFactory.getLogger(CaptchaConfig.class);
+
+ /**
+ * 验证码
+ */
+ @Bean
+ public DefaultKaptcha defaultCaptcha() {
+ DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
+ Properties property = new Properties();
+ try {
+ InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("captcha-conf.properties");
+ property.load(inputStream);
+ Config config = new Config(property);
+ defaultKaptcha.setConfig(config);
+ } catch (Exception e) {
+ logger.error("Kaptcha properties load error {}", e);
+ throw new RuntimeException("Kaptcha properties load error");
+ }
+ return defaultKaptcha;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/config/Message.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/config/Message.java
new file mode 100644
index 0000000..f5cf2ad
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/config/Message.java
@@ -0,0 +1,22 @@
+package com.fuint.common.config;
+
+/**
+ * 消息定义
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public class Message {
+ public static final String PARAM_ERROR = "参数出错";
+ public static final String COUPON_NOT_EXIST = "该卡券不存在";
+ public static final String COUPON_IS_EXPIRE = "该卡券未生效";
+ public static final String USER_NOT_EXIST = "该用户不存在";
+ public static final String MAX_COUPON_LIMIT = "已经领取过了";
+ public static final String COUPON_TYPE_ERROR = "卡券类型有误";
+ public static final String POINT_LIMIT = "您的积分不足";
+ public static final String NEED_CODE = "需要领取码";
+ public static final String CODE_ERROR = "领取码错误";
+ public static final String CODE_ERROR_1 = "核销码错误";
+ public static final String GRADE_ERROR = "该卡券不适于您的会员等级";
+ public static final String HAS_COUPON = "您已领取过该卡券";
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/config/MybatisPlusConfig.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/config/MybatisPlusConfig.java
new file mode 100644
index 0000000..bb57e45
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/config/MybatisPlusConfig.java
@@ -0,0 +1,51 @@
+package com.fuint.common.config;
+
+import com.baomidou.mybatisplus.core.injector.ISqlInjector;
+import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
+import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * MybatisPlus配置
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Configuration
+@MapperScan({"com.fuint.repository.**.mapper"})
+public class MybatisPlusConfig {
+
+ /**
+ * 分页插件
+ * @return PaginationInterceptor
+ */
+ @Bean
+ @ConditionalOnMissingBean
+ public PaginationInterceptor paginationInterceptor() {
+ return new PaginationInterceptor();
+ }
+
+ /**
+ * 逻辑删除插件
+ *
+ * @return LogicSqlInjector
+ */
+ @Bean
+ @ConditionalOnMissingBean
+ public ISqlInjector sqlInjector() {
+ return new LogicSqlInjector();
+ }
+
+ /**
+ * 乐观锁插件
+ * @return
+ */
+ @Bean
+ public OptimisticLockerInterceptor optimisticLockerInterceptor() {
+ return new OptimisticLockerInterceptor();
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/config/RedisConfig.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/config/RedisConfig.java
new file mode 100644
index 0000000..97ab611
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/config/RedisConfig.java
@@ -0,0 +1,67 @@
+package com.fuint.common.config;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CachingConfigurerSupport;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.cache.interceptor.KeyGenerator;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+import org.springframework.session.data.redis.config.ConfigureRedisAction;
+import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
+
+/**
+ * 配置redis缓存
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Configuration
+@EnableCaching
+@EnableRedisHttpSession
+public class RedisConfig extends CachingConfigurerSupport {
+
+ @Autowired
+ private RedisConnectionFactory redisConnectionFactory;
+
+ @Bean
+ public KeyGenerator keyGenerator() {
+ return (target, method, params) -> {
+ StringBuilder sb = new StringBuilder();
+ sb.append(target.getClass().getName());
+ sb.append(method.getName());
+ for (Object obj : params) {
+ sb.append(obj.toString());
+ }
+ return sb.toString();
+ };
+ }
+
+ @Bean
+ public static ConfigureRedisAction configureRedisAction() {
+ return ConfigureRedisAction.NO_OP;
+ }
+
+ @Bean
+ Jackson2JsonRedisSerializer jackson2JsonRedisSerializer(ObjectMapper objectMapper) {
+ Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(
+ Object.class);
+ jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
+ return jackson2JsonRedisSerializer;
+ }
+
+ @Bean
+ RedisTemplate redisTemplate(Jackson2JsonRedisSerializer jackson2JsonRedisSerializer) {
+ RedisTemplate redisTemplate = new RedisTemplate<>();
+ redisTemplate.setConnectionFactory(redisConnectionFactory);
+ redisTemplate.setDefaultSerializer(jackson2JsonRedisSerializer);
+ StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
+ redisTemplate.setKeySerializer(stringRedisSerializer);
+ redisTemplate.setHashKeySerializer(stringRedisSerializer);
+ return redisTemplate;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/config/SecurityConfig.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/config/SecurityConfig.java
new file mode 100644
index 0000000..3a3356e
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/config/SecurityConfig.java
@@ -0,0 +1,100 @@
+package com.fuint.common.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.http.HttpMethod;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+
+/**
+ * 安全中心配置
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
+public class SecurityConfig extends WebSecurityConfigurerAdapter {
+
+ /**
+ * 解决 无法直接注入 AuthenticationManager
+ *
+ * @return
+ * @throws Exception
+ */
+ @Bean
+ @Override
+ public AuthenticationManager authenticationManagerBean() throws Exception {
+ return super.authenticationManagerBean();
+ }
+
+ /**
+ * anyRequest | 匹配所有请求路径
+ * access | SpringEl表达式结果为true时可以访问
+ * anonymous | 匿名可以访问
+ * denyAll | 用户不能访问
+ * fullyAuthenticated | 用户完全认证可以访问(非remember-me下自动登录)
+ * hasAnyAuthority | 如果有参数,参数表示权限,则其中任何一个权限可以访问
+ * hasAnyRole | 如果有参数,参数表示角色,则其中任何一个角色可以访问
+ * hasAuthority | 如果有参数,参数表示权限,则其权限可以访问
+ * hasIpAddress | 如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问
+ * hasRole | 如果有参数,参数表示角色,则其角色可以访问
+ * permitAll | 用户可以任意访问
+ * rememberMe | 允许通过remember-me登录的用户访问
+ * authenticated | 用户登录后可访问
+ */
+ @Override
+ protected void configure(HttpSecurity httpSecurity) throws Exception {
+ httpSecurity
+ // CSRF禁用,因为不使用session
+ .csrf().disable()
+ // 基于token,所以不需要session
+ .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
+ // 过滤请求
+ .authorizeRequests()
+ // 允许匿名访问
+ .antMatchers(
+ "/clientApi/**",
+ "/backendApi/**",
+ "/merchantApi/**"
+ ).anonymous()
+ .antMatchers(
+ HttpMethod.GET,
+ "/",
+ "/static/**",
+ "/*.html",
+ "/**/*.html",
+ "/**/*.css",
+ "/**/*.js",
+ "/profile/**"
+ ).permitAll()
+ .antMatchers("/swagger-ui.html").anonymous()
+ .antMatchers("/swagger-resources/**").anonymous()
+ .antMatchers("/webjars/**").anonymous()
+ .antMatchers("/*/api-docs").anonymous()
+ .antMatchers("/druid/**").anonymous()
+ // 除上面外的所有请求全部需要鉴权认证
+ .anyRequest().authenticated()
+ .and()
+ .headers().frameOptions().disable();
+ }
+
+ /**
+ * 强散列哈希加密实现
+ */
+ @Bean
+ public BCryptPasswordEncoder bCryptPasswordEncoder() {
+ return new BCryptPasswordEncoder();
+ }
+
+ /**
+ * 身份认证接口
+ */
+ @Override
+ protected void configure(AuthenticationManagerBuilder auth) {
+ // empty
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/config/SwaggerConfig.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/config/SwaggerConfig.java
new file mode 100644
index 0000000..32febeb
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/config/SwaggerConfig.java
@@ -0,0 +1,44 @@
+package com.fuint.common.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+/**
+ * Swagger接口文档
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig implements WebMvcConfigurer {
+
+ @Bean
+ public Docket createRestApi() {
+ return new Docket(DocumentationType.SWAGGER_2)
+ .apiInfo(apiInfo())
+ .enable(true)
+ .select()
+ .apis(RequestHandlerSelectors.basePackage("com.fuint.module"))
+ .build();
+ }
+
+ @Bean
+ public ApiInfo apiInfo() {
+ return new ApiInfoBuilder()
+ .title("fuint会员营销系统接口文档")
+ .description("fuint会员营销系统接口文档,“/clientApi”目录接口为会员端相关接口,“/backendApi”目录接口为后台管理端相关接口。")
+ .termsOfServiceUrl("https://www.fuint.cn/")
+ .contact(new Contact("海南延禾信息技术有限公司","https://www.fuint.cn/", "fushengqian@qq.com"))
+ .version("1.0")
+ .build();
+ }
+}
\ No newline at end of file
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/config/WebConfig.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/config/WebConfig.java
new file mode 100644
index 0000000..822884d
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/config/WebConfig.java
@@ -0,0 +1,100 @@
+package com.fuint.common.config;
+
+import com.fuint.common.web.AdminUserInterceptor;
+import com.fuint.common.web.CommandInterceptor;
+import com.fuint.common.web.ClientUserInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.CacheControl;
+import org.springframework.web.filter.CharacterEncodingFilter;
+import org.springframework.web.servlet.config.annotation.*;
+import org.springframework.web.servlet.resource.CssLinkResourceTransformer;
+import org.springframework.web.servlet.resource.VersionResourceResolver;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * web配置
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Configuration
+public class WebConfig extends WebMvcConfigurationSupport {
+
+ @Override
+ public void addResourceHandlers(ResourceHandlerRegistry registry) {
+ registry.addResourceHandler("/resources/**")
+ .addResourceLocations("/resources/", "classpath:/other-resources/")
+ .setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS))
+ .resourceChain(false)
+ .addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"))
+ .addTransformer(new CssLinkResourceTransformer());
+ registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
+
+ registry.addResourceHandler("/**").addResourceLocations(
+ "classpath:/static/");
+ registry.addResourceHandler("swagger-ui.html").addResourceLocations(
+ "classpath:/META-INF/resources/");
+ registry.addResourceHandler("/webjars/**").addResourceLocations(
+ "classpath:/META-INF/resources/webjars/");
+ super.addResourceHandlers(registry);
+ }
+
+ @Bean
+ public CommandInterceptor commandInterceptor() {
+ return new CommandInterceptor();
+ }
+
+ @Bean
+ public AdminUserInterceptor adminUserInterceptor() {
+ return new AdminUserInterceptor();
+ }
+
+ @Bean
+ public ClientUserInterceptor portalUserInterceptor() {
+ return new ClientUserInterceptor();
+ }
+
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+ // Command
+ registry.addInterceptor(commandInterceptor())
+ .addPathPatterns("/cmd/**");
+
+ // 后台拦截
+ registry.addInterceptor(adminUserInterceptor())
+ .addPathPatterns("/backendApi/**")
+ .excludePathPatterns("/clientApi/captcha/**")
+ .excludePathPatterns("/backendApi/captcha/**")
+ .excludePathPatterns("/backendApi/userCoupon/exportList")
+ .excludePathPatterns("/backendApi/login/**");
+
+ // 客户端拦截
+ registry.addInterceptor(portalUserInterceptor())
+ .addPathPatterns("/clientApi/**")
+ .excludePathPatterns("/clientApi/sign/**")
+ .excludePathPatterns("/clientApi/page/home")
+ .excludePathPatterns("/clientApi/captcha/**")
+ .excludePathPatterns("/clientApi/goodsApi/**")
+ .excludePathPatterns("/clientApi/coupon/list")
+ .excludePathPatterns("/clientApi/coupon/detail")
+ .excludePathPatterns("/clientApi/cart/**")
+ .excludePathPatterns("/clientApi/user/**")
+ .excludePathPatterns("/clientApi/settlement/submit")
+ .excludePathPatterns("/clientApi/pay/**")
+ .excludePathPatterns("/clientApi/order/todoCounts")
+ .excludePathPatterns("/clientApi/store/**")
+ .excludePathPatterns("/clientApi/article/**")
+ .excludePathPatterns("/clientApi/message/getOne")
+ .excludePathPatterns("/clientApi/message/wxPush")
+ .excludePathPatterns("/clientApi/sms/sendVerifyCode");
+ }
+
+ @Bean
+ public CharacterEncodingFilter characterEncodingFilter() {
+ CharacterEncodingFilter filter = new CharacterEncodingFilter();
+ filter.setEncoding("UTF-8");
+ filter.setForceEncoding(true);
+ return filter;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/domain/TreeNode.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/domain/TreeNode.java
new file mode 100644
index 0000000..04b9748
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/domain/TreeNode.java
@@ -0,0 +1,69 @@
+package com.fuint.common.domain;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 树状结构节点实体
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class TreeNode implements Serializable {
+
+ @ApiModelProperty("菜单ID")
+ private long id;
+
+ @ApiModelProperty("菜单名称")
+ private String name;
+
+ @ApiModelProperty("菜单名称(字母)")
+ private String ename;
+
+ @ApiModelProperty("节点是否打开")
+ private Boolean open;
+
+ @ApiModelProperty("是否菜单")
+ private int isMenu;
+
+ @ApiModelProperty("节点是否选中")
+ private Boolean checked;
+
+ @ApiModelProperty("url")
+ private String url;
+
+ @ApiModelProperty("路径")
+ private String path;
+
+ @ApiModelProperty("权限标识")
+ private String perms;
+
+ @ApiModelProperty("子菜单")
+ private List childrens = new ArrayList<>();
+
+ @ApiModelProperty("菜单级别")
+ private int level;
+
+ @ApiModelProperty("上级菜单")
+ private long pId;
+
+ @ApiModelProperty("图标")
+ private String icon;
+
+ @ApiModelProperty("新图标")
+ private String newIcon;
+
+ @ApiModelProperty("排序")
+ private Integer sort;
+
+ @ApiModelProperty("状态")
+ private String status;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/domain/TreeSelect.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/domain/TreeSelect.java
new file mode 100644
index 0000000..afdebfb
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/domain/TreeSelect.java
@@ -0,0 +1,61 @@
+package com.fuint.common.domain;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.stream.Collectors;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+/**
+ * TreeSelect树结构实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public class TreeSelect implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ // 节点ID
+ private Long id;
+
+ // 节点名称
+ private String label;
+
+ // 子节点
+ @JsonInclude(JsonInclude.Include.NON_EMPTY)
+ private List childrens;
+
+ public TreeSelect() {
+ // empty
+ }
+
+ public TreeSelect(TreeNode menu) {
+ this.id = menu.getId();
+ this.label = menu.getName();
+ this.childrens = menu.getChildrens().stream().map(TreeSelect::new).collect(Collectors.toList());
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public void setLabel(String label) {
+ this.label = label;
+ }
+
+ public List getChildrens() {
+ return childrens;
+ }
+
+ public void setChildrens(List childrens) {
+ this.childrens = childrens;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/AccountDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/AccountDto.java
new file mode 100644
index 0000000..10c7425
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/AccountDto.java
@@ -0,0 +1,68 @@
+package com.fuint.common.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.util.Date;
+
+/**
+ * 后台账户实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class AccountDto {
+
+ @ApiModelProperty("账户主键id")
+ private Integer id;
+
+ @ApiModelProperty("账户编码")
+ private String accountKey;
+
+ @ApiModelProperty("账户名称")
+ private String accountName;
+
+ @ApiModelProperty("密码")
+ private String password;
+
+ @ApiModelProperty("状态 : 0 无效 1 有效")
+ private int accountStatus;
+
+ @ApiModelProperty("激活状态 : 0 未激活 1已激活")
+ private int isActive;
+
+ @ApiModelProperty("创建时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date createDate;
+
+ @ApiModelProperty("修改时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date modifyDate;
+
+ @ApiModelProperty("随机码(公盐)")
+ private String salt;
+
+ @ApiModelProperty("是否被锁定")
+ private int locked;
+
+ @ApiModelProperty("真实姓名")
+ private String realName;
+
+ @ApiModelProperty("所属商户ID")
+ private Integer merchantId;
+
+ @ApiModelProperty("所属商户名称")
+ private String merchantName;
+
+ @ApiModelProperty("所属店铺ID")
+ private Integer storeId;
+
+ @ApiModelProperty("所属店铺名称")
+ private String storeName;
+
+ @ApiModelProperty("关联员工ID")
+ private Integer staffId;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/AccountInfo.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/AccountInfo.java
new file mode 100644
index 0000000..4b20ef1
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/AccountInfo.java
@@ -0,0 +1,74 @@
+package com.fuint.common.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 后台登录账号信息
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class AccountInfo implements Serializable {
+
+ @ApiModelProperty("账户主键id")
+ private Integer id;
+
+ @ApiModelProperty("账户编码")
+ private String accountKey;
+
+ @ApiModelProperty("账户名称")
+ private String accountName;
+
+ @ApiModelProperty("状态 : 0 无效 1 有效")
+ private int accountStatus;
+
+ @ApiModelProperty("激活状态 : 0 未激活 1已激活")
+ private String isActive;
+
+ @ApiModelProperty("创建时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date createDate;
+
+ @ApiModelProperty("修改时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date modifyDate;
+
+ @ApiModelProperty("随机码(公盐)")
+ private String salt;
+
+ @ApiModelProperty("所属角色ID")
+ private String roleIds;
+
+ @ApiModelProperty("是否被锁定")
+ private int locked;
+
+ @ApiModelProperty("从属对象")
+ private int ownerId;
+
+ @ApiModelProperty("真实姓名")
+ private String realName;
+
+ @ApiModelProperty("所属商户ID")
+ private Integer merchantId;
+
+ @ApiModelProperty("所属商户名称")
+ private String merchantName;
+
+ @ApiModelProperty("所属店铺ID")
+ private Integer storeId;
+
+ @ApiModelProperty("所属店铺名称")
+ private String storeName;
+
+ @ApiModelProperty("关联员工ID")
+ private Integer staffId;
+
+ @ApiModelProperty("登录的Token")
+ private String token;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/AddressDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/AddressDto.java
new file mode 100644
index 0000000..a977cf6
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/AddressDto.java
@@ -0,0 +1,56 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.io.Serializable;
+
+/**
+ * 会员地址信息
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class AddressDto implements Serializable {
+
+ @ApiModelProperty("账户主键ID")
+ private Integer id;
+
+ @ApiModelProperty("会员ID")
+ private Integer userId;
+
+ @ApiModelProperty("会员名称")
+ private String name;
+
+ @ApiModelProperty("会员手机号")
+ private String mobile;
+
+ @ApiModelProperty("省份ID")
+ private Integer provinceId;
+
+ @ApiModelProperty("省份名称")
+ private String provinceName;
+
+ @ApiModelProperty("城市ID")
+ private Integer cityId;
+
+ @ApiModelProperty("城市名称")
+ private String cityName;
+
+ @ApiModelProperty("区ID")
+ private Integer regionId;
+
+ @ApiModelProperty("区名称")
+ private String regionName;
+
+ @ApiModelProperty("详细地址")
+ private String detail;
+
+ @ApiModelProperty("是否默认地址")
+ private String isDefault;
+
+ @ApiModelProperty("状态")
+ private String status;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ArticleDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ArticleDto.java
new file mode 100644
index 0000000..aedb27b
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ArticleDto.java
@@ -0,0 +1,167 @@
+package com.fuint.common.dto;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 文章实体类
+ * Created by FSQ
+ */
+public class ArticleDto implements Serializable {
+
+ /**
+ * 自增ID
+ */
+ private Integer id;
+
+ /**
+ * 标题
+ */
+ private String title;
+
+ /**
+ * 简介
+ */
+ private String brief;
+
+ /**
+ * 所属商户
+ * */
+ private Integer merchantId;
+
+ /**
+ * 所属店铺
+ * */
+ private Integer storeId;
+
+ /**
+ * 链接地址
+ */
+ private String url;
+
+ /**
+ * 点击数
+ */
+ private Long click;
+
+ /**
+ * 图片地址
+ */
+ private String image;
+
+ /**
+ * 描述
+ */
+ private String description;
+
+ /**
+ * 创建时间
+ */
+ private Date createTime;
+
+ /**
+ * 更新时间
+ */
+ private Date updateTime;
+
+ /**
+ * 最后操作人
+ */
+ private String operator;
+
+ /**
+ * A:正常;D:删除
+ */
+ private String status;
+
+ /**
+ * 排序
+ * */
+ private Integer sort;
+
+ public Integer getId(){
+ return id;
+ }
+ public void setId(Integer id){
+ this.id=id;
+ }
+ public String getTitle(){
+ return title;
+ }
+ public void setTitle(String title){
+ this.title=title;
+ }
+ public String getBrief(){
+ return brief;
+ }
+ public void setBrief(String brief){
+ this.brief=brief;
+ }
+ public Integer getMerchantId(){
+ return merchantId;
+ }
+ public void setMerchantId(Integer merchantId){
+ this.merchantId=merchantId;
+ }
+ public Integer getStoreId(){
+ return storeId;
+ }
+ public void setStoreId(Integer storeId){
+ this.storeId=storeId;
+ }
+ public String getUrl(){
+ return url;
+ }
+ public void setUrl(String url){
+ this.url=url;
+ }
+ public Long getClick(){
+ return click;
+ }
+ public void setClick(Long click){
+ this.click=click;
+ }
+ public String getImage(){
+ return image;
+ }
+ public void setImage(String image){
+ this.image=image;
+ }
+ public String getDescription(){
+ return description;
+ }
+ public void setDescription(String description){
+ this.description=description;
+ }
+ public Date getCreateTime(){
+ return createTime;
+ }
+ public void setCreateTime(Date createTime){
+ this.createTime=createTime;
+ }
+ public Date getUpdateTime(){
+ return updateTime;
+ }
+ public void setUpdateTime(Date updateTime){
+ this.updateTime=updateTime;
+ }
+ public String getOperator(){
+ return operator;
+ }
+ public void setOperator(String operator){
+ this.operator=operator;
+ }
+ public String getStatus(){
+ return status;
+ }
+ public void setStatus(String status){
+ this.status=status;
+ }
+ public Integer getSort(){
+ return sort;
+ }
+ public void setSort(Integer sort){
+ this.sort=sort;
+ }
+}
+
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/AssetDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/AssetDto.java
new file mode 100644
index 0000000..73671ec
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/AssetDto.java
@@ -0,0 +1,25 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 个人资产实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class AssetDto {
+
+ @ApiModelProperty("次卡数量")
+ private Integer timer;
+
+ @ApiModelProperty("储值卡数量")
+ private Integer prestore;
+
+ @ApiModelProperty("优惠券数量")
+ private Integer coupon;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/BalanceDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/BalanceDto.java
new file mode 100644
index 0000000..c2ccc08
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/BalanceDto.java
@@ -0,0 +1,56 @@
+package com.fuint.common.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fuint.repository.model.MtUser;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 余额变动实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class BalanceDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("会员ID")
+ private Integer userId;
+
+ @ApiModelProperty("会员信息")
+ private MtUser userInfo;
+
+ @ApiModelProperty("订单号")
+ private String orderSn;
+
+ @ApiModelProperty("余额变化数量")
+ private BigDecimal amount;
+
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("创建时间")
+ private Date createTime;
+
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("更新时间")
+ private Date updateTime;
+
+ @ApiModelProperty("备注说明")
+ private String description;
+
+ @ApiModelProperty("状态,A正常;D删除")
+ private String status;
+
+ @ApiModelProperty("最后操作人")
+ private String operator;
+
+}
+
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/BannerDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/BannerDto.java
new file mode 100644
index 0000000..1012be1
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/BannerDto.java
@@ -0,0 +1,59 @@
+package com.fuint.common.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 焦点图实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class BannerDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("标题")
+ private String title;
+
+ @ApiModelProperty("所属商户ID")
+ private Integer merchantId;
+
+ @ApiModelProperty("所属店铺ID")
+ private Integer storeId;
+
+ @ApiModelProperty("链接地址")
+ private String url;
+
+ @ApiModelProperty("图片地址")
+ private String image;
+
+ @ApiModelProperty("描述信息")
+ private String description;
+
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("创建时间")
+ private Date createTime;
+
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("更新时间")
+ private Date updateTime;
+
+ @ApiModelProperty("最后操作人")
+ private String operator;
+
+ @ApiModelProperty("排序")
+ private Integer sort;
+
+ @ApiModelProperty("状态,A正常;D删除")
+ private String status;
+}
+
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/Body.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/Body.java
new file mode 100644
index 0000000..5cedd7f
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/Body.java
@@ -0,0 +1,33 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.io.Serializable;
+import java.util.Map;
+
+/**
+ * 消息体Body信息
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class Body implements Serializable {
+
+ @ApiModelProperty("入参信息")
+ private Map inParams;
+
+ @ApiModelProperty("出参信息")
+ private Map outParams;
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder("Body{");
+ sb.append("inParams=").append(inParams);
+ sb.append(", outParams=").append(outParams);
+ sb.append('}');
+ return sb.toString();
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/CommissionCashDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/CommissionCashDto.java
new file mode 100644
index 0000000..84a9ea1
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/CommissionCashDto.java
@@ -0,0 +1,67 @@
+package com.fuint.common.dto;
+
+import com.fuint.repository.model.MtStaff;
+import com.fuint.repository.model.MtStore;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 分销提成提现实体
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class CommissionCashDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("结算单号")
+ private String settleNo;
+
+ @ApiModelProperty("结算uuid")
+ private String uuid;
+
+ @ApiModelProperty("商户ID")
+ private Integer merchantId;
+
+ @ApiModelProperty("店铺ID")
+ private Integer storeId;
+
+ @ApiModelProperty("所属店铺信息")
+ private MtStore storeInfo;
+
+ @ApiModelProperty("会员ID")
+ private Integer userId;
+
+ @ApiModelProperty("用户信息")
+ private OrderUserDto userInfo;
+
+ @ApiModelProperty("员工ID")
+ private Integer staffId;
+
+ @ApiModelProperty("所属店铺信息")
+ private MtStaff staffInfo;
+
+ @ApiModelProperty("金额")
+ private BigDecimal amount;
+
+ @ApiModelProperty("备注")
+ private String description;
+
+ @ApiModelProperty("创建时间")
+ private Date createTime;
+
+ @ApiModelProperty("更新时间")
+ private Date updateTime;
+
+ @ApiModelProperty("最后操作人")
+ private String operator;
+
+ @ApiModelProperty("状态")
+ private String status;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/CommissionLogDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/CommissionLogDto.java
new file mode 100644
index 0000000..47974af
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/CommissionLogDto.java
@@ -0,0 +1,96 @@
+package com.fuint.common.dto;
+
+import com.fuint.repository.model.MtCommissionRule;
+import com.fuint.repository.model.MtOrder;
+import com.fuint.repository.model.MtStaff;
+import com.fuint.repository.model.MtStore;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 分销提成记录实体
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class CommissionLogDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("分佣类型")
+ private String type;
+
+ @ApiModelProperty("分佣对象")
+ private String target;
+
+ @ApiModelProperty("分佣类型名称")
+ private String typeName;
+
+ @ApiModelProperty("分佣等级")
+ private Integer level;
+
+ @ApiModelProperty("会员ID")
+ private Integer userId;
+
+ @ApiModelProperty("用户信息")
+ private OrderUserDto userInfo;
+
+ @ApiModelProperty("商户ID")
+ private Integer merchantId;
+
+ @ApiModelProperty("店铺ID")
+ private Integer storeId;
+
+ @ApiModelProperty("所属店铺信息")
+ private MtStore storeInfo;
+
+ @ApiModelProperty("员工ID")
+ private Integer staffId;
+
+ @ApiModelProperty("所属店铺信息")
+ private MtStaff staffInfo;
+
+ @ApiModelProperty("订单ID")
+ private Integer orderId;
+
+ @ApiModelProperty("订单信息")
+ private MtOrder orderInfo;
+
+ @ApiModelProperty("分佣金额")
+ private BigDecimal amount;
+
+ @ApiModelProperty("规则ID")
+ private Integer ruleId;
+
+ @ApiModelProperty("分佣规则信息")
+ private MtCommissionRule ruleInfo;
+
+ @ApiModelProperty("备注")
+ private String description;
+
+ @ApiModelProperty("提现记录ID")
+ private Integer cashId;
+
+ @ApiModelProperty("最后操作人")
+ private String isCash;
+
+ @ApiModelProperty("提现时间")
+ private Date cashTime;
+
+ @ApiModelProperty("创建时间")
+ private Date createTime;
+
+ @ApiModelProperty("更新时间")
+ private Date updateTime;
+
+ @ApiModelProperty("最后操作人")
+ private String operator;
+
+ @ApiModelProperty("状态")
+ private String status;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/CommissionRuleDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/CommissionRuleDto.java
new file mode 100644
index 0000000..542e9b0
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/CommissionRuleDto.java
@@ -0,0 +1,56 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 分销提成规则实体
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class CommissionRuleDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("规则名称")
+ private String name;
+
+ @ApiModelProperty("方案类型,goods:商品销售;coupon:卡券销售;recharge:会员充值")
+ private String type;
+
+ @ApiModelProperty("分佣对象,member:会员分销;staff:员工提成")
+ private String target;
+
+ @ApiModelProperty("商户ID")
+ private Integer merchantId;
+
+ @ApiModelProperty("店铺ID")
+ private Integer storeId;
+
+ @ApiModelProperty("适用店铺ID列表")
+ private List storeIdList;
+
+ @ApiModelProperty("具体项目列表")
+ private List detailList;
+
+ @ApiModelProperty("备注")
+ private String description;
+
+ @ApiModelProperty("创建时间")
+ private Date createTime;
+
+ @ApiModelProperty("更新时间")
+ private Date updateTime;
+
+ @ApiModelProperty("最后操作人")
+ private String operator;
+
+ @ApiModelProperty("状态")
+ private String status;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/CommissionRuleItemDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/CommissionRuleItemDto.java
new file mode 100644
index 0000000..7301938
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/CommissionRuleItemDto.java
@@ -0,0 +1,40 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 分销提成规则项目实体
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class CommissionRuleItemDto implements Serializable {
+
+ @ApiModelProperty("商品ID")
+ private Integer goodsId;
+
+ @ApiModelProperty("商品名称")
+ private String goodsName;
+
+ @ApiModelProperty("商品logo")
+ private String logo;
+
+ @ApiModelProperty("商品价格")
+ private BigDecimal price;
+
+ @ApiModelProperty("方案类型,goods:商品销售;coupon:卡券销售;recharge:会员充值")
+ private String type;
+
+ @ApiModelProperty("提成方式")
+ private String method;
+
+ @ApiModelProperty("散客值")
+ private BigDecimal visitorVal;
+
+ @ApiModelProperty("会员值")
+ private BigDecimal memberVal;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ConfirmLogDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ConfirmLogDto.java
new file mode 100644
index 0000000..793f99c
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ConfirmLogDto.java
@@ -0,0 +1,67 @@
+package com.fuint.common.dto;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fuint.repository.model.MtCoupon;
+import com.fuint.repository.model.MtStore;
+import com.fuint.repository.model.MtUser;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 核销卡券流水dto
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class ConfirmLogDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("核销编码")
+ private String code;
+
+ @ApiModelProperty("核销状态")
+ private String status;
+
+ @ApiModelProperty("会员卡券ID")
+ private Integer userCouponId;
+
+ @ApiModelProperty("卡券信息")
+ private MtCoupon couponInfo;
+
+ @ApiModelProperty("会员信息")
+ private MtUser userInfo;
+
+ @ApiModelProperty("核销店铺信息")
+ private MtStore storeInfo;
+
+ @JSONField(format="yyyy-MM-dd HH:mm:ss")
+ @ApiModelProperty("创建时间")
+ private Date createTime;
+
+ @JSONField(format="yyyy-MM-dd HH:mm:ss")
+ @ApiModelProperty("更新时间")
+ private Date updateTime;
+
+ @ApiModelProperty("核销金额")
+ private BigDecimal amount;
+
+ @ApiModelProperty("核销uuid")
+ private String uuid;
+
+ @ApiModelProperty("核销备注")
+ private String remark;
+
+ @ApiModelProperty("最后操作人")
+ private String operator;
+
+}
+
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/CouponCellDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/CouponCellDto.java
new file mode 100644
index 0000000..f12e1ac
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/CouponCellDto.java
@@ -0,0 +1,30 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.util.List;
+
+/**
+ * 卡券导入单元实体
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class CouponCellDto {
+
+ @ApiModelProperty("手机号")
+ private String mobile;
+
+ @ApiModelProperty("商户ID")
+ private Integer merchantId;
+
+ @ApiModelProperty("分组ID")
+ private List groupId;
+
+ @ApiModelProperty("发放数量")
+ private List num;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/CouponDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/CouponDto.java
new file mode 100644
index 0000000..3015731
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/CouponDto.java
@@ -0,0 +1,74 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 卡券实体
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class CouponDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("卡券名称")
+ private String name;
+
+ @ApiModelProperty("卡券类型")
+ private String type;
+
+ @ApiModelProperty("状态")
+ private String status;
+
+ @ApiModelProperty("获取规则")
+ private String inRule;
+
+ @ApiModelProperty("使用规则")
+ private String outRule;
+
+ @ApiModelProperty("图片")
+ private String image;
+
+ @ApiModelProperty("面额")
+ private BigDecimal amount;
+
+ @ApiModelProperty("领取需要积分数量")
+ private Integer point;
+
+ @ApiModelProperty("卖点")
+ private String sellingPoint;
+
+ @ApiModelProperty("已领取、预存数量")
+ private Integer gotNum;
+
+ @ApiModelProperty("剩余数量")
+ private Integer leftNum;
+
+ @ApiModelProperty("限制数量")
+ private Integer limitNum;
+
+ @ApiModelProperty("适用店铺")
+ private String storeNames;
+
+ @ApiModelProperty("是否领取")
+ private Boolean isReceive;
+
+ @ApiModelProperty("是否需要领取码")
+ private boolean needReceiveCode;
+
+ @ApiModelProperty("会员卡券ID")
+ private int userCouponId;
+
+ @ApiModelProperty("有效期")
+ private String effectiveDate;
+
+ @ApiModelProperty("卡券说明")
+ private String description;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/DateDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/DateDto.java
new file mode 100644
index 0000000..3221d16
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/DateDto.java
@@ -0,0 +1,22 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 日期实体
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class DateDto {
+
+ @ApiModelProperty("开始时间")
+ private String startDate;
+
+ @ApiModelProperty("结束时间")
+ private String endDate;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ExpressDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ExpressDto.java
new file mode 100644
index 0000000..081dddf
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ExpressDto.java
@@ -0,0 +1,26 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 订单物流信息dto
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class ExpressDto {
+
+ @ApiModelProperty("物流公司")
+ private String expressCompany;
+
+ @ApiModelProperty("物流单号")
+ private String expressNo;
+
+ @ApiModelProperty("发货时间")
+ private String expressTime;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GiveDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GiveDto.java
new file mode 100644
index 0000000..a720b4c
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GiveDto.java
@@ -0,0 +1,78 @@
+package com.fuint.common.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 卡券转赠实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class GiveDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("获赠者会员ID")
+ private Integer userId;
+
+ @ApiModelProperty("店铺ID")
+ private Integer storeId;
+
+ @ApiModelProperty("赠送者会员ID")
+ private Integer giveUserId;
+
+ @ApiModelProperty("获赠者手机号")
+ private String mobile;
+
+ @ApiModelProperty("转赠者手机号")
+ private String userMobile;
+
+ @ApiModelProperty("分组ID,逗号隔开")
+ private String groupIds;
+
+ @ApiModelProperty("分组名称,逗号隔开")
+ private String groupNames;
+
+ @ApiModelProperty("图片")
+ private String image;
+
+ @ApiModelProperty("券ID,逗号隔开")
+ private String couponIds;
+
+ @ApiModelProperty("券名称,逗号隔开")
+ private String couponNames;
+
+ @ApiModelProperty("数量")
+ private Integer num;
+
+ @ApiModelProperty("总金额")
+ private BigDecimal money;
+
+ @ApiModelProperty("备注")
+ private String note;
+
+ @ApiModelProperty("留言")
+ private String message;
+
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("赠送时间")
+ private String createTime;
+
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("更新时间")
+ private String updateTime;
+
+ @ApiModelProperty("状态,A正常;C取消 ")
+ private String status;
+
+}
+
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GiveItemDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GiveItemDto.java
new file mode 100644
index 0000000..7abf8fc
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GiveItemDto.java
@@ -0,0 +1,50 @@
+package com.fuint.common.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 转赠明细实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class GiveItemDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("赠予对象手机号")
+ private String mobile;
+
+ @ApiModelProperty("用户手机")
+ private String userMobile;
+
+ @ApiModelProperty("分组ID")
+ private Integer groupId;
+
+ @ApiModelProperty("分组名称")
+ private String groupName;
+
+ @ApiModelProperty("卡券ID")
+ private Integer couponId;
+
+ @ApiModelProperty("卡券名称")
+ private String couponName;
+
+ @ApiModelProperty("总金额")
+ private BigDecimal money;
+
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("赠送时间")
+ private Date createTime;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsCateDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsCateDto.java
new file mode 100644
index 0000000..614b03b
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsCateDto.java
@@ -0,0 +1,61 @@
+package com.fuint.common.dto;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 商品分类DTO
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class GoodsCateDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("所属商户ID")
+ private Integer merchantId;
+
+ @ApiModelProperty("所属商户名称")
+ private String merchantName;
+
+ @ApiModelProperty("所属店铺ID")
+ private Integer storeId;
+
+ @ApiModelProperty("所属店铺名称")
+ private String storeName;
+
+ @ApiModelProperty("分类名称")
+ private String name;
+
+ @ApiModelProperty("LOGO地址")
+ private String logo;
+
+ @ApiModelProperty("分类描述")
+ private String description;
+
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("创建时间")
+ private Date createTime;
+
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("更新时间")
+ private Date updateTime;
+
+ @ApiModelProperty("最后操作人")
+ private String operator;
+
+ @ApiModelProperty("排序")
+ private Integer sort;
+
+ @ApiModelProperty("A:正常;D:删除")
+ private String status;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsDetailDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsDetailDto.java
new file mode 100644
index 0000000..e502dcc
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsDetailDto.java
@@ -0,0 +1,95 @@
+package com.fuint.common.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 商品详情实体
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class GoodsDetailDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer goodsId;
+
+ @ApiModelProperty("商品名称")
+ private String name;
+
+ @ApiModelProperty("分类ID")
+ private Integer cateId;
+
+ @ApiModelProperty("商品条码")
+ private String goodsNo;
+
+ @ApiModelProperty("可否单规格")
+ private String isSingleSpec;
+
+ @ApiModelProperty("主图地址")
+ private String logo;
+
+ @ApiModelProperty("图片地址")
+ private List images;
+
+ @ApiModelProperty("商品价格")
+ private BigDecimal price;
+
+ @ApiModelProperty("划线价格")
+ private BigDecimal linePrice;
+
+ @ApiModelProperty("库存")
+ private Integer stock;
+
+ @ApiModelProperty("商品重量")
+ private BigDecimal weight;
+
+ @ApiModelProperty("初始销量")
+ private Integer initSale;
+
+ @ApiModelProperty("商品卖点")
+ private String salePoint;
+
+ @ApiModelProperty("可否使用积分抵扣")
+ private String canUsePoint;
+
+ @ApiModelProperty("会员是否有折扣")
+ private String isMemberDiscount;
+
+ @ApiModelProperty("排序")
+ private Integer sort;
+
+ @ApiModelProperty("商品描述")
+ private String description;
+
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("创建时间")
+ private Date createTime;
+
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("更新时间")
+ private Date updateTime;
+
+ @ApiModelProperty("最后操作人")
+ private String operator;
+
+ @ApiModelProperty("状态,A:正常;D:删除")
+ private String status;
+
+ @ApiModelProperty("sku列表")
+ private List skuList;
+
+ @ApiModelProperty("规格列表")
+ private List specList;
+
+}
+
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsDto.java
new file mode 100644
index 0000000..e17f1dd
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsDto.java
@@ -0,0 +1,123 @@
+package com.fuint.common.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fuint.repository.model.MtGoodsCate;
+import com.fuint.repository.model.MtGoodsSku;
+import com.fuint.repository.model.MtGoodsSpec;
+import com.fuint.repository.model.MtStore;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 商品DTO
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class GoodsDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("所属店铺ID")
+ private Integer storeId;
+
+ @ApiModelProperty("所属店铺信息")
+ private MtStore storeInfo;
+
+ @ApiModelProperty("商品名称")
+ private String name;
+
+ @ApiModelProperty("商品类型")
+ private String type;
+
+ @ApiModelProperty("分类ID")
+ private Integer cateId;
+
+ @ApiModelProperty("分类信息")
+ private MtGoodsCate cateInfo;
+
+ @ApiModelProperty("商品条码")
+ private String goodsNo;
+
+ @ApiModelProperty("可否单规格")
+ private String isSingleSpec;
+
+ @ApiModelProperty("主图地址")
+ private String logo;
+
+ @ApiModelProperty("图片地址")
+ private String images;
+
+ @ApiModelProperty("价格")
+ private BigDecimal price;
+
+ @ApiModelProperty("划线价格")
+ private BigDecimal linePrice;
+
+ @ApiModelProperty("库存")
+ private Integer stock;
+
+ @ApiModelProperty("数量")
+ private Integer num;
+
+ @ApiModelProperty("服务时长")
+ private Integer serviceTime;
+
+ @ApiModelProperty("卡券ID")
+ private String couponIds;
+
+ @ApiModelProperty("重量")
+ private BigDecimal weight;
+
+ @ApiModelProperty("初始销量")
+ private Integer initSale;
+
+ @ApiModelProperty("商品卖点")
+ private String salePoint;
+
+ @ApiModelProperty("可否使用积分抵扣")
+ private String canUsePoint;
+
+ @ApiModelProperty("会员是否有折扣")
+ private String isMemberDiscount;
+
+ @ApiModelProperty("排序")
+ private Integer sort;
+
+ @ApiModelProperty("商品描述")
+ private String description;
+
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("创建时间")
+ private Date createTime;
+
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("更新时间")
+ private Date updateTime;
+
+ @ApiModelProperty("最后操作人")
+ private String operator;
+
+ @ApiModelProperty("状态,A:正常;D:删除")
+ private String status;
+
+ @ApiModelProperty("skuId")
+ private Integer skuId;
+
+ @ApiModelProperty("sku列表")
+ private List skuList;
+
+ @ApiModelProperty("规格列表")
+ private List specList;
+
+}
+
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsSkuDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsSkuDto.java
new file mode 100644
index 0000000..a5367b6
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsSkuDto.java
@@ -0,0 +1,52 @@
+package com.fuint.common.dto;
+
+import com.fuint.repository.model.MtGoodsSpec;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.List;
+import java.math.BigDecimal;
+
+/**
+ * 商品sku实体
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class GoodsSkuDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("sku编码")
+ private String skuNo;
+
+ @ApiModelProperty("图片")
+ private String logo;
+
+ @ApiModelProperty("商品ID")
+ private Integer goodsId;
+
+ @ApiModelProperty("规格ID")
+ private String specIds;
+
+ @ApiModelProperty("规格列表")
+ private List specList;
+
+ @ApiModelProperty("库存")
+ private Integer stock;
+
+ @ApiModelProperty("价格")
+ private BigDecimal price;
+
+ @ApiModelProperty("划线价格")
+ private BigDecimal linePrice;
+
+ @ApiModelProperty("重量")
+ private BigDecimal weight;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecChildDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecChildDto.java
new file mode 100644
index 0000000..3598d6a
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecChildDto.java
@@ -0,0 +1,29 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * 商品规格子类实体
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class GoodsSpecChildDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("规格名称")
+ private String name;
+
+ @ApiModelProperty("是否选择")
+ private boolean checked;
+
+}
+
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecDto.java
new file mode 100644
index 0000000..a8a427b
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecDto.java
@@ -0,0 +1,30 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 商品规格实体
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class GoodsSpecDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer specId;
+
+ @ApiModelProperty("规格名称")
+ private String name;
+
+ @ApiModelProperty("规格值列表")
+ private List valueList;
+
+}
+
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecItemDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecItemDto.java
new file mode 100644
index 0000000..f3a4382
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecItemDto.java
@@ -0,0 +1,30 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 商品规格项实体
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class GoodsSpecItemDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("规格名称")
+ private String name;
+
+ @ApiModelProperty("规格子类")
+ private List child;
+
+}
+
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecValueDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecValueDto.java
new file mode 100644
index 0000000..e653275
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsSpecValueDto.java
@@ -0,0 +1,29 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * 商品规格值实体
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class GoodsSpecValueDto implements Serializable {
+
+ @ApiModelProperty("值ID")
+ private Integer specValueId;
+
+ @ApiModelProperty("规格名")
+ private String specName;
+
+ @ApiModelProperty("规格值")
+ private String specValue;
+
+}
+
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsTopDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsTopDto.java
new file mode 100644
index 0000000..218ec9b
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GoodsTopDto.java
@@ -0,0 +1,36 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 商品排行DTO
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class GoodsTopDto implements Serializable {
+
+ @ApiModelProperty("商品ID")
+ private Integer id;
+
+ @ApiModelProperty("商品名称")
+ private String name;
+
+ @ApiModelProperty("商品条码")
+ private String goodsNo;
+
+ @ApiModelProperty("销售金额")
+ private BigDecimal amount;
+
+ @ApiModelProperty("销售数量")
+ private Integer num;
+
+}
+
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GroupDataDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GroupDataDto.java
new file mode 100644
index 0000000..6f2f97a
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GroupDataDto.java
@@ -0,0 +1,33 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * 卡券分组数据DTO
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class GroupDataDto implements Serializable {
+
+ @ApiModelProperty("发放数量")
+ private Integer sendNum;
+
+ @ApiModelProperty("未发放数量")
+ private Integer unSendNum;
+
+ @ApiModelProperty("使用数量")
+ private Integer useNum;
+
+ @ApiModelProperty("过期数量")
+ private Integer expireNum;
+
+ @ApiModelProperty("取消数量")
+ private Integer cancelNum;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GroupDataListDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GroupDataListDto.java
new file mode 100644
index 0000000..5bffea9
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GroupDataListDto.java
@@ -0,0 +1,23 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 卡券分组数据DTO
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class GroupDataListDto {
+
+ @ApiModelProperty("键值")
+ private String key;
+
+ @ApiModelProperty("数据")
+ private GroupDataDto data;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GroupMemberDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GroupMemberDto.java
new file mode 100644
index 0000000..3c41cb2
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/GroupMemberDto.java
@@ -0,0 +1,30 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.io.Serializable;
+
+/**
+ * 分组会员DTO
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class GroupMemberDto implements Serializable {
+
+ @ApiModelProperty("会员ID")
+ private Integer id;
+
+ @ApiModelProperty("会员名称")
+ private String name;
+
+ @ApiModelProperty("会员号")
+ private String userNo;
+
+ @ApiModelProperty("会员名称")
+ private String mobile;
+}
+
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/HangUpDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/HangUpDto.java
new file mode 100644
index 0000000..03a9042
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/HangUpDto.java
@@ -0,0 +1,38 @@
+package com.fuint.common.dto;
+
+import com.fuint.repository.model.MtUser;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 收银挂单实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class HangUpDto {
+
+ @ApiModelProperty("挂单号")
+ private String hangNo;
+
+ @ApiModelProperty("是否空白")
+ private Boolean isEmpty;
+
+ @ApiModelProperty("会员信息")
+ private MtUser memberInfo;
+
+ @ApiModelProperty("件数")
+ private Integer num;
+
+ @ApiModelProperty("金额")
+ private BigDecimal amount;
+
+ @ApiModelProperty("时间")
+ private String dateTime;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/Head.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/Head.java
new file mode 100644
index 0000000..df03261
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/Head.java
@@ -0,0 +1,40 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.io.Serializable;
+
+/**
+ * 消息体头信息
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class Head implements Serializable {
+
+ @ApiModelProperty("服务编号,用于确定唯一的服务")
+ private String serviceId;
+
+ @ApiModelProperty("授权Token信息")
+ private String token;
+
+ @ApiModelProperty("服务执行返回码(000000:正常)")
+ private String returnCode;
+
+ @ApiModelProperty("服务执行返回信息")
+ private String returnDesc;
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder("Head{");
+ sb.append("serviceId='").append(serviceId).append('\'');
+ sb.append(", token='").append(token).append('\'');
+ sb.append(", returnCode='").append(returnCode).append('\'');
+ sb.append(", returnDesc='").append(returnDesc).append('\'');
+ sb.append('}');
+ return sb.toString();
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/MemberGroupDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/MemberGroupDto.java
new file mode 100644
index 0000000..9f627ee
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/MemberGroupDto.java
@@ -0,0 +1,50 @@
+package com.fuint.common.dto;
+
+import java.io.Serializable;
+import java.util.Date;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 会员分组实体
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class MemberGroupDto implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("分组ID")
+ private Integer id;
+
+ @ApiModelProperty("分组名称")
+ private String name;
+
+ @ApiModelProperty("所属商户ID")
+ private Integer merchantId;
+
+ @ApiModelProperty("默认店铺")
+ private Integer storeId;
+
+ @ApiModelProperty("父ID")
+ private Integer parentId;
+
+ @ApiModelProperty("创建时间")
+ private Date createTime;
+
+ @ApiModelProperty("更新时间")
+ private Date updateTime;
+
+ @ApiModelProperty("状态,A:激活;N:禁用;D:删除")
+ private String status;
+
+ @ApiModelProperty("备注信息")
+ private String description;
+
+ @ApiModelProperty("最后操作人")
+ private String operator;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/MemberTopDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/MemberTopDto.java
new file mode 100644
index 0000000..2361070
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/MemberTopDto.java
@@ -0,0 +1,36 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 会员排行DTO
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class MemberTopDto implements Serializable {
+
+ @ApiModelProperty("会员ID")
+ private Integer id;
+
+ @ApiModelProperty("会员名称")
+ private String name;
+
+ @ApiModelProperty("会员号")
+ private String userNo;
+
+ @ApiModelProperty("消费金额")
+ private BigDecimal amount;
+
+ @ApiModelProperty("购买数量")
+ private Integer num;
+
+}
+
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/MessageResDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/MessageResDto.java
new file mode 100644
index 0000000..b95aa1b
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/MessageResDto.java
@@ -0,0 +1,26 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 短信发送返回实体
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class MessageResDto {
+
+ @ApiModelProperty("发送ID")
+ private String[] sendIds;
+
+ @ApiModelProperty("发送结果")
+ private Boolean result;
+
+ @ApiModelProperty("短信ID")
+ private String[] smsId;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/MyCouponDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/MyCouponDto.java
new file mode 100644
index 0000000..777bbea
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/MyCouponDto.java
@@ -0,0 +1,77 @@
+package com.fuint.common.dto;
+
+import com.fuint.repository.model.MtStore;
+import com.fuint.repository.model.MtUser;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 我的卡券DTO
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class MyCouponDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("卡券名称")
+ private String name;
+
+ @ApiModelProperty("核销编码")
+ private String code;
+
+ @ApiModelProperty("卡券类型")
+ private String type;
+
+ @ApiModelProperty("状态")
+ private String status;
+
+ @ApiModelProperty("卡券ID")
+ private Integer couponId;
+
+ @ApiModelProperty("使用规则")
+ private String useRule;
+
+ @ApiModelProperty("图片")
+ private String image;
+
+ @ApiModelProperty("面额")
+ private BigDecimal amount;
+
+ @ApiModelProperty("余额")
+ private BigDecimal balance;
+
+ @ApiModelProperty("剩余")
+ private Integer num;
+
+ @ApiModelProperty("是否可用")
+ private boolean canUse;
+
+ @ApiModelProperty("有效期")
+ private String effectiveDate;
+
+ @ApiModelProperty("提示信息")
+ private String tips;
+
+ @ApiModelProperty("使用时间")
+ private Date usedTime;
+
+ @ApiModelProperty("领券时间")
+ private Date createTime;
+
+ @ApiModelProperty("会员信息")
+ private MtUser userInfo;
+
+ @ApiModelProperty("使用店铺")
+ private MtStore storeInfo;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/OpenGiftDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/OpenGiftDto.java
new file mode 100644
index 0000000..f35f1bb
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/OpenGiftDto.java
@@ -0,0 +1,53 @@
+package com.fuint.common.dto;
+
+import com.fuint.repository.model.MtCoupon;
+import com.fuint.repository.model.MtStore;
+import com.fuint.repository.model.MtUserGrade;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * 开卡赠礼实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class OpenGiftDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("店铺信息")
+ private MtStore storeInfo;
+
+ @ApiModelProperty("会员等级信息")
+ private MtUserGrade gradeInfo;
+
+ @ApiModelProperty("赠送积分")
+ private Integer point;
+
+ @ApiModelProperty("卡券信息")
+ private MtCoupon couponInfo;
+
+ @ApiModelProperty("卡券数量")
+ private Integer couponNum;
+
+ @ApiModelProperty("创建时间")
+ private String createTime;
+
+ @ApiModelProperty("更新时间")
+ private String updateTime;
+
+ @ApiModelProperty("状态")
+ private String status;
+
+ @ApiModelProperty("最后操作人")
+ private String operator;
+
+}
+
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/OpenWxCardDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/OpenWxCardDto.java
new file mode 100644
index 0000000..c0a865a
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/OpenWxCardDto.java
@@ -0,0 +1,35 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 开通微信会员卡实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class OpenWxCardDto {
+
+ @ApiModelProperty("会员编码")
+ private String code;
+
+ @ApiModelProperty("会员openId")
+ private String openId;
+
+ @ApiModelProperty("时间戳")
+ private String timestamp;
+
+ @ApiModelProperty("随机字符串")
+ private String nonceStr;
+
+ @ApiModelProperty("签名")
+ private String signature;
+
+ @ApiModelProperty("微信会员卡ID")
+ private String cardId;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/OrderDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/OrderDto.java
new file mode 100644
index 0000000..c187bad
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/OrderDto.java
@@ -0,0 +1,121 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 订单实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class OrderDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("订单类型")
+ private String type;
+
+ @ApiModelProperty("下单平台")
+ private String platform;
+
+ @ApiModelProperty("支付类型")
+ private String payType;
+
+ @ApiModelProperty("订单类型名称")
+ private String orderMode;
+
+ @ApiModelProperty("核销码")
+ private String verifyCode;
+
+ @ApiModelProperty("订单号")
+ private String orderSn;
+
+ @ApiModelProperty("卡券ID")
+ private Integer couponId;
+
+ @ApiModelProperty("购物车ID")
+ private String cartIds;
+
+ @ApiModelProperty("商品ID")
+ private Integer goodsId;
+
+ @ApiModelProperty("skuID")
+ private Integer skuId;
+
+ @ApiModelProperty("购买数量")
+ private Integer buyNum;
+
+ @ApiModelProperty("会员ID")
+ private Integer userId;
+
+ @ApiModelProperty("是否游客")
+ private String isVisitor;
+
+ @ApiModelProperty("店铺ID")
+ private Integer storeId;
+
+ @ApiModelProperty("商户ID")
+ private Integer merchantId;
+
+ @ApiModelProperty("员工ID")
+ private Integer staffId;
+
+ @ApiModelProperty("订单金额")
+ private BigDecimal amount;
+
+ @ApiModelProperty("支付金额")
+ private BigDecimal payAmount;
+
+ @ApiModelProperty("使用积分数量")
+ private Integer usePoint;
+
+ @ApiModelProperty("积分金额")
+ private BigDecimal pointAmount;
+
+ @ApiModelProperty("折扣金额")
+ private BigDecimal discount;
+
+ @ApiModelProperty("配送费用")
+ private BigDecimal deliveryFee;
+
+ @ApiModelProperty("物流信息")
+ private ExpressDto expressInfo;
+
+ @ApiModelProperty("订单参数")
+ private String param;
+
+ @ApiModelProperty("用户备注")
+ private String remark;
+
+ @ApiModelProperty("创建时间")
+ private Date createTime;
+
+ @ApiModelProperty("更新时间")
+ private Date updateTime;
+
+ @ApiModelProperty("支付时间")
+ private Date payTime;
+
+ @ApiModelProperty("订单状态")
+ private String status;
+
+ @ApiModelProperty("支付状态")
+ private String payStatus;
+
+ @ApiModelProperty(value="结算状态")
+ private String settleStatus;
+
+ @ApiModelProperty("最后操作人")
+ private String operator;
+
+}
+
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/OrderGoodsDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/OrderGoodsDto.java
new file mode 100644
index 0000000..e7f9e7b
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/OrderGoodsDto.java
@@ -0,0 +1,51 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 订单商品实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class OrderGoodsDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("商品ID")
+ private Integer goodsId;
+
+ @ApiModelProperty("订单类型")
+ private String type;
+
+ @ApiModelProperty("商品名称")
+ private String name;
+
+ @ApiModelProperty("价格")
+ private String price;
+
+ @ApiModelProperty("折扣")
+ private String discount;
+
+ @ApiModelProperty("购买数量")
+ private Integer num;
+
+ @ApiModelProperty("图片")
+ private String image;
+
+ @ApiModelProperty("skuId")
+ private Integer skuId;
+
+ @ApiModelProperty("规格列表")
+ private List specList;
+
+}
+
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/OrderUserDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/OrderUserDto.java
new file mode 100644
index 0000000..382ac80
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/OrderUserDto.java
@@ -0,0 +1,39 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.io.Serializable;
+
+/**
+ * 下单用户DTO
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class OrderUserDto implements Serializable {
+
+ @ApiModelProperty("会员ID")
+ private Integer id;
+
+ @ApiModelProperty("会员号")
+ private String no;
+
+ @ApiModelProperty("会员姓名")
+ private String name;
+
+ @ApiModelProperty("会员手机")
+ private String mobile;
+
+ @ApiModelProperty("证件类型")
+ private String cardType;
+
+ @ApiModelProperty("证件号")
+ private String cardNo;
+
+ @ApiModelProperty("地址")
+ private String address;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/Page.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/Page.java
new file mode 100644
index 0000000..a39bfe9
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/Page.java
@@ -0,0 +1,120 @@
+package com.fuint.common.dto;
+
+import java.io.Serializable;
+
+/**
+ * 消息体分页信息
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public class Page implements Serializable {
+
+ private static final Long DEFAULT_PAGE_NO = 1L;
+ private static final Long DEFAULT_PAGE_SIZE = 100L;
+
+ private Long pageNo;// 页号
+ private Long pageSize;// 每页行数
+ private Long totalRows;// 总行数
+ private Long totalPages;// 总页数
+ private Boolean firstPage;// 是否首页
+ private Boolean lastPage;// 是否尾页
+
+ public Page() {
+ }
+
+ public Page(Long pageNo, Long pageSize) {
+ setPageNo(pageNo);
+ setPageSize(pageSize);
+ }
+
+ public Long getPageNo() {
+ return pageNo;
+ }
+
+ public void setPageNo(Long pageNo) {
+ if (pageNo == null || pageNo < 1) {
+ pageNo = DEFAULT_PAGE_NO;
+ } else if (totalPages != null && pageNo > totalPages) {
+ pageNo = totalPages;
+ }
+ this.pageNo = pageNo;
+ }
+
+ public Long getPageSize() {
+ return pageSize;
+ }
+
+ public void setPageSize(Long pageSize) {
+ if (pageSize == null) {
+ this.pageSize = DEFAULT_PAGE_SIZE;
+ } else if (pageSize < 1L) {
+ this.pageSize = 1L;
+ } else {
+ this.pageSize = pageSize;
+ }
+ }
+
+ public Long getTotalRows() {
+ return totalRows;
+ }
+
+ public void setTotalRows(Long totalRows) {
+ //总行数
+ this.totalRows = totalRows;
+ //总页数
+ this.totalPages = totalRows / this.pageSize;
+ if (totalRows % this.pageSize > 0) {
+ this.totalPages++;
+ }
+ //首页
+ if (this.pageNo <= 1) {
+ firstPage = true;
+ } else {
+ firstPage = false;
+ }
+ //尾页
+ if (this.pageNo >= this.totalPages) {
+ lastPage = true;
+ } else {
+ lastPage = false;
+ }
+ }
+
+ public Long getTotalPages() {
+ return totalPages;
+ }
+
+ public void setTotalPages(Long totalPages) {
+ this.totalPages = totalPages;
+ }
+
+ public Boolean isFirstPage() {
+ return firstPage;
+ }
+
+ public void setFirstPage(Boolean firstPage) {
+ this.firstPage = firstPage;
+ }
+
+ public Boolean isLastPage() {
+ return lastPage;
+ }
+
+ public void setLastPage(Boolean lastPage) {
+ this.lastPage = lastPage;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder("Page{");
+ sb.append("pageNo=").append(pageNo);
+ sb.append(", pageSize=").append(pageSize);
+ sb.append(", totalRows=").append(totalRows);
+ sb.append(", totalPages=").append(totalPages);
+ sb.append(", firstPage=").append(firstPage);
+ sb.append(", lastPage=").append(lastPage);
+ sb.append('}');
+ return sb.toString();
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ParamDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ParamDto.java
new file mode 100644
index 0000000..7d6b53b
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ParamDto.java
@@ -0,0 +1,28 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * 请求参数实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class ParamDto implements Serializable {
+
+ @ApiModelProperty("参数键值")
+ private String key;
+
+ @ApiModelProperty("参数名称")
+ private String name;
+
+ @ApiModelProperty("参数值")
+ private String value;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/PointDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/PointDto.java
new file mode 100644
index 0000000..d990ed7
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/PointDto.java
@@ -0,0 +1,52 @@
+package com.fuint.common.dto;
+
+import com.fuint.repository.model.MtUser;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 积分记录实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class PointDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("会员ID")
+ private Integer userId;
+
+ @ApiModelProperty("会员信息")
+ private MtUser userInfo;
+
+ @ApiModelProperty("订单号")
+ private String orderSn;
+
+ @ApiModelProperty("积分变化数量")
+ private Integer amount;
+
+ @ApiModelProperty("创建时间")
+ private Date createTime;
+
+ @ApiModelProperty("更新时间")
+ private Date updateTime;
+
+ @ApiModelProperty("备注说明")
+ private String description;
+
+ @ApiModelProperty("最后操作人")
+ private String operator;
+
+ @ApiModelProperty("状态,A正常;D删除")
+ private String status;
+
+}
+
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/PreStoreRuleDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/PreStoreRuleDto.java
new file mode 100644
index 0000000..89dcac3
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/PreStoreRuleDto.java
@@ -0,0 +1,25 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * 预存规则实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class PreStoreRuleDto implements Serializable {
+
+ @ApiModelProperty("预存金额")
+ private String preStoreAmount;
+
+ @ApiModelProperty("目标金额")
+ private String targetAmount;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/RechargeRuleDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/RechargeRuleDto.java
new file mode 100644
index 0000000..fbb73f5
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/RechargeRuleDto.java
@@ -0,0 +1,25 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * 充值规则实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class RechargeRuleDto implements Serializable {
+
+ @ApiModelProperty("充值金额")
+ private String rechargeAmount;
+
+ @ApiModelProperty("赠送金额")
+ private String giveAmount;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/RefundDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/RefundDto.java
new file mode 100644
index 0000000..17a1277
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/RefundDto.java
@@ -0,0 +1,79 @@
+package com.fuint.common.dto;
+
+import com.fuint.repository.model.MtStore;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 售后实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class RefundDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("订单ID")
+ private Integer orderId;
+
+ @ApiModelProperty("商户ID")
+ private Integer merchantId;
+
+ @ApiModelProperty("店铺ID")
+ private Integer storeId;
+
+ @ApiModelProperty("退款金额")
+ private BigDecimal amount;
+
+ @ApiModelProperty("售后类型")
+ private String type;
+
+ @ApiModelProperty("会员ID")
+ private Integer userId;
+
+ @ApiModelProperty("用户备注")
+ private String remark;
+
+ @ApiModelProperty("拒绝原因")
+ private String rejectReason;
+
+ @ApiModelProperty("申请凭证图片")
+ private List imageList;
+
+ @ApiModelProperty("申请凭证图片")
+ private String images;
+
+ @ApiModelProperty("最后操作人")
+ private String operator;
+
+ @ApiModelProperty("订单详情")
+ private UserOrderDto orderInfo;
+
+ @ApiModelProperty("退货地址")
+ private AddressDto address;
+
+ @ApiModelProperty("店铺信息")
+ private MtStore storeInfo;
+
+ @ApiModelProperty("创建时间")
+ private String createTime;
+
+ @ApiModelProperty("更新时间")
+ private String updateTime;
+
+ @ApiModelProperty("状态")
+ private String status;
+
+ @ApiModelProperty("状态说明")
+ private String statusText;
+
+}
+
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/RegionDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/RegionDto.java
new file mode 100644
index 0000000..773c69b
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/RegionDto.java
@@ -0,0 +1,41 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 地区实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class RegionDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("名称")
+ private String name;
+
+ @ApiModelProperty("父ID")
+ private Integer pid;
+
+ @ApiModelProperty("编码")
+ private String code;
+
+ @ApiModelProperty("层级")
+ private String level;
+
+ @ApiModelProperty("城市")
+ private List city;
+
+ @ApiModelProperty("区域")
+ private List region;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ReqCouponDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ReqCouponDto.java
new file mode 100644
index 0000000..241012d
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ReqCouponDto.java
@@ -0,0 +1,119 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 卡券请求DTO
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class ReqCouponDto implements Serializable {
+
+ @ApiModelProperty("卡券ID")
+ private Integer id;
+
+ @ApiModelProperty("商户ID")
+ private Integer merchantId;
+
+ @ApiModelProperty("店铺ID")
+ private Integer storeId;
+
+ @ApiModelProperty("分组ID")
+ private Integer groupId;
+
+ @ApiModelProperty("类型")
+ private String type;
+
+ @ApiModelProperty("名称")
+ private String name;
+
+ @ApiModelProperty("是否允许转赠")
+ private Integer isGive;
+
+ @ApiModelProperty("获得卡券所消耗积分")
+ private Integer point;
+
+ @ApiModelProperty("获得计次卡卡所消耗积分")
+ private Integer timerPoint;
+
+ @ApiModelProperty("领取码")
+ private String receiveCode;
+
+ @ApiModelProperty("使用专项")
+ private String useFor;
+
+ @ApiModelProperty("过期类型")
+ private String expireType;
+
+ @ApiModelProperty("有效天数")
+ private Integer expireTime;
+
+ @ApiModelProperty("计次卡领取码")
+ private String timerReceiveCode;
+
+ @ApiModelProperty("有效期开始时间")
+ private String beginTime;
+
+ @ApiModelProperty("有效期结束时间")
+ private String endTime;
+
+ @ApiModelProperty("价值金额")
+ private BigDecimal amount;
+
+ @ApiModelProperty("发放方式")
+ private String sendWay;
+
+ @ApiModelProperty("适用商品")
+ private String applyGoods;
+
+ @ApiModelProperty("每次发放数量")
+ private Integer sendNum;
+
+ @ApiModelProperty("发行总数量")
+ private Integer total;
+
+ @ApiModelProperty("每人最多拥有数量")
+ private Integer limitNum;
+
+ @ApiModelProperty("例外时间")
+ private String exceptTime;
+
+ @ApiModelProperty("适用店铺ID,逗号分隔")
+ private String storeIds;
+
+ @ApiModelProperty("会员等级ID,逗号分隔")
+ private String gradeIds;
+
+ @ApiModelProperty("适用商品")
+ private String goodsIds;
+
+ @ApiModelProperty("后台备注")
+ private String remarks;
+
+ @ApiModelProperty("图片")
+ private String image;
+
+ @ApiModelProperty("备注")
+ private String description;
+
+ @ApiModelProperty("预存规则")
+ private String inRule;
+
+ @ApiModelProperty("核销规则")
+ private String outRule;
+
+ @ApiModelProperty("操作人")
+ private String operator;
+
+ @ApiModelProperty("状态")
+ private String status;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ReqCouponGroupDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ReqCouponGroupDto.java
new file mode 100644
index 0000000..ae045b1
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ReqCouponGroupDto.java
@@ -0,0 +1,46 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 卡券分组请求DTO
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class ReqCouponGroupDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("商户ID")
+ private Integer merchantId;
+
+ @ApiModelProperty("店铺ID")
+ private Integer storeId;
+
+ @ApiModelProperty("分组名称")
+ private String name;
+
+ @ApiModelProperty("价值金额")
+ private BigDecimal money;
+
+ @ApiModelProperty("发行数量")
+ private Integer total;
+
+ @ApiModelProperty("分组描述")
+ private String description;
+
+ @ApiModelProperty("操作人")
+ private String operator;
+
+ @ApiModelProperty("状态")
+ private String status;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ReqResult.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ReqResult.java
new file mode 100644
index 0000000..c083efa
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ReqResult.java
@@ -0,0 +1,31 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.io.Serializable;
+import java.util.Map;
+
+/**
+ * 请求返回结果
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class ReqResult implements Serializable {
+
+ @ApiModelProperty("返回代码")
+ private String code;
+
+ @ApiModelProperty("返回消息")
+ private String msg;
+
+ @ApiModelProperty("返回结果")
+ private boolean result;
+
+ @ApiModelProperty("返回数据")
+ private Map data;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ReqSendLogDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ReqSendLogDto.java
new file mode 100644
index 0000000..bc049f7
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ReqSendLogDto.java
@@ -0,0 +1,68 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 发放卡券记录请求DTO
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class ReqSendLogDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("商户ID")
+ private Integer merchantId;
+
+ @ApiModelProperty("店铺ID")
+ private Integer storeId;
+
+ @ApiModelProperty("类型,1:单用户发券;2:批量发券")
+ private Integer type;
+
+ @ApiModelProperty("会员ID")
+ private Integer userId;
+
+ @ApiModelProperty("导入文件名")
+ private String fileName;
+
+ @ApiModelProperty("导入文件路径")
+ private String filePath;
+
+ @ApiModelProperty("手机号")
+ private String mobile;
+
+ @ApiModelProperty("分组ID")
+ private Integer groupId;
+
+ @ApiModelProperty("卡券ID")
+ private Integer couponId;
+
+ @ApiModelProperty("分组名称")
+ private String groupName;
+
+ @ApiModelProperty("发放数量")
+ private Integer sendNum;
+
+ @ApiModelProperty("发放时间")
+ private Date createTime;
+
+ @ApiModelProperty("操作人")
+ private String operator;
+
+ @ApiModelProperty("状态")
+ private String status;
+
+ @ApiModelProperty("uuid")
+ private String uuid;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ResCartDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ResCartDto.java
new file mode 100644
index 0000000..6576a85
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ResCartDto.java
@@ -0,0 +1,45 @@
+package com.fuint.common.dto;
+
+import com.fuint.repository.model.MtGoods;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 购物车返回DTO
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class ResCartDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("会员ID")
+ private Integer userId;
+
+ @ApiModelProperty("商品ID")
+ private Integer goodsId;
+
+ @ApiModelProperty("skuId")
+ private Integer skuId;
+
+ @ApiModelProperty("数量")
+ private Integer num;
+
+ @ApiModelProperty("是否有效")
+ private Boolean isEffect;
+
+ @ApiModelProperty("商品规格")
+ private List specList;
+
+ @ApiModelProperty("商品数据")
+ private MtGoods goodsInfo;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ResCateDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ResCateDto.java
new file mode 100644
index 0000000..f9592e7
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ResCateDto.java
@@ -0,0 +1,33 @@
+package com.fuint.common.dto;
+
+import com.fuint.repository.model.MtGoods;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 商品分类返回DTO
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class ResCateDto implements Serializable {
+
+ @ApiModelProperty("分类ID")
+ private Integer cateId;
+
+ @ApiModelProperty("分类名称")
+ private String name;
+
+ @ApiModelProperty("logo")
+ private String logo;
+
+ @ApiModelProperty("商品列表")
+ private List goodsList;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/RoleDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/RoleDto.java
new file mode 100644
index 0000000..ed78834
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/RoleDto.java
@@ -0,0 +1,35 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 角色信息实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class RoleDto {
+
+ @ApiModelProperty("账户主键ID")
+ private Long id;
+
+ @ApiModelProperty("商户ID")
+ private Integer merchantId;
+
+ @ApiModelProperty("名称")
+ private String name;
+
+ @ApiModelProperty("角色类型")
+ private String type;
+
+ @ApiModelProperty("备注")
+ private String description;
+
+ @ApiModelProperty("状态 : A有效 D无效")
+ private String status;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/SettlementDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/SettlementDto.java
new file mode 100644
index 0000000..41724bc
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/SettlementDto.java
@@ -0,0 +1,60 @@
+package com.fuint.common.dto;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fuint.framework.pagination.PaginationResponse;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 结算实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class SettlementDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("结算单号")
+ private String settlementNo;
+
+ @ApiModelProperty("商户ID")
+ private Integer merchantId;
+
+ @ApiModelProperty("店铺ID")
+ private Integer storeId;
+
+ @ApiModelProperty("订单总金额")
+ private BigDecimal totalOrderAmount;
+
+ @ApiModelProperty("结算金额")
+ private BigDecimal amount;
+
+ @ApiModelProperty("结算订单")
+ private PaginationResponse orderList;
+
+ @ApiModelProperty("创建时间")
+ private Date createTime;
+
+ @ApiModelProperty("更新时间")
+ private Date updateTime;
+
+ @ApiModelProperty("备注说明")
+ private String description;
+
+ @ApiModelProperty("最后操作人")
+ private String operator;
+
+ @ApiModelProperty("支付状态,A待支付;B已支付")
+ private String payStatus;
+
+ @ApiModelProperty("状态,A正常;D删除")
+ private String status;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/SettlementOrderDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/SettlementOrderDto.java
new file mode 100644
index 0000000..5c3ffc9
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/SettlementOrderDto.java
@@ -0,0 +1,46 @@
+package com.fuint.common.dto;
+
+import java.io.Serializable;
+import java.util.Date;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 结算订单表
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class SettlementOrderDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("结算ID")
+ private Integer settlementId;
+
+ @ApiModelProperty("订单ID")
+ private Integer orderId;
+
+ @ApiModelProperty("订单信息")
+ private UserOrderDto orderInfo;
+
+ @ApiModelProperty("创建时间")
+ private Date createTime;
+
+ @ApiModelProperty("更新时间")
+ private Date updateTime;
+
+ @ApiModelProperty("备注说明")
+ private String description;
+
+ @ApiModelProperty("最后操作人")
+ private String operator;
+
+ @ApiModelProperty("状态,A正常;D删除")
+ private String status;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/SmsTemplateDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/SmsTemplateDto.java
new file mode 100644
index 0000000..c82671c
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/SmsTemplateDto.java
@@ -0,0 +1,47 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 短信模板实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class SmsTemplateDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("商户ID")
+ private Integer merchantId;
+
+ @ApiModelProperty("模板名称")
+ private String name;
+
+ @ApiModelProperty("模板英文名称")
+ private String uname;
+
+ @ApiModelProperty("模板编码")
+ private String code;
+
+ @ApiModelProperty("模板内容")
+ private String content;
+
+ @ApiModelProperty("创建时间")
+ private Date createTime;
+
+ @ApiModelProperty("更新时间")
+ private Date updateTime;
+
+ @ApiModelProperty("状态,1:正常;2:删除")
+ private String status;
+
+}
\ No newline at end of file
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/SourceDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/SourceDto.java
new file mode 100644
index 0000000..2ead9ce
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/SourceDto.java
@@ -0,0 +1,73 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 菜单信息实体
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class SourceDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private long id;
+
+ @ApiModelProperty("商户ID")
+ private Integer merchantId;
+
+ @ApiModelProperty("菜单名称")
+ private String name;
+
+ @ApiModelProperty("菜单名称(字母)")
+ private String ename;
+
+ @ApiModelProperty("节点是否打开")
+ private Boolean open;
+
+ @ApiModelProperty("是否菜单")
+ private int isMenu;
+
+ @ApiModelProperty("节点是否选中")
+ private Boolean checked;
+
+ @ApiModelProperty("url")
+ private String url;
+
+ @ApiModelProperty("路径")
+ private String path;
+
+ @ApiModelProperty("权限标识")
+ private String perms;
+
+ @ApiModelProperty("菜单级别")
+ private int level;
+
+ @ApiModelProperty("上级菜单")
+ private long parentId;
+
+ @ApiModelProperty("子菜单")
+ private List children;
+
+ @ApiModelProperty("图标")
+ private String icon;
+
+ @ApiModelProperty("新图标")
+ private String newIcon;
+
+ @ApiModelProperty("描述信息")
+ private String description;
+
+ @ApiModelProperty("排序")
+ private String sort;
+
+ @ApiModelProperty("状态")
+ private String status;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/StoreDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/StoreDto.java
new file mode 100644
index 0000000..39697c9
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/StoreDto.java
@@ -0,0 +1,109 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 店铺实体
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ * */
+@Getter
+@Setter
+public class StoreDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("商户ID")
+ private Integer merchantId;
+
+ @ApiModelProperty("商户号")
+ private String merchantNo;
+
+ @ApiModelProperty("商户名称")
+ private String merchantName;
+
+ @ApiModelProperty("店铺名称")
+ private String name;
+
+ @ApiModelProperty("店铺二维码")
+ private String qrCode;
+
+ @ApiModelProperty("店铺LOGO")
+ private String logo;
+
+ @ApiModelProperty("是否默认店铺")
+ private String isDefault;
+
+ @ApiModelProperty("联系人")
+ private String contact;
+
+ @ApiModelProperty("联系电话")
+ private String phone;
+
+ @ApiModelProperty("店铺地址")
+ private String address;
+
+ @ApiModelProperty("营业时间")
+ private String hours;
+
+ @ApiModelProperty("经度")
+ private String latitude;
+
+ @ApiModelProperty("纬度")
+ private String longitude;
+
+ @ApiModelProperty("备注信息")
+ private String description;
+
+ @ApiModelProperty("微信商户号")
+ private String wxMchId;
+
+ @ApiModelProperty("微信支付秘钥")
+ private String wxApiV2;
+
+ @ApiModelProperty("微信支付证书")
+ private String wxCertPath;
+
+ @ApiModelProperty("支付宝appId")
+ private String alipayAppId;
+
+ @ApiModelProperty("支付宝应用私钥")
+ private String alipayPrivateKey;
+
+ @ApiModelProperty("支付宝支付公钥")
+ private String alipayPublicKey;
+
+ @ApiModelProperty("营业执照")
+ private String license;
+
+ @ApiModelProperty("统一社会信用代码")
+ private String creditCode;
+
+ @ApiModelProperty("银行名称")
+ private String bankName;
+
+ @ApiModelProperty("银行卡账户名")
+ private String bankCardName;
+
+ @ApiModelProperty("银行卡卡号")
+ private String bankCardNo;
+
+ @ApiModelProperty("创建时间")
+ private Date createTime;
+
+ @ApiModelProperty("更新时间")
+ private Date updateTime;
+
+ @ApiModelProperty("状态,1:正常;2:删除")
+ private String status;
+
+ @ApiModelProperty("最后操作人")
+ private String operator;
+
+}
\ No newline at end of file
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/SubMessageDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/SubMessageDto.java
new file mode 100644
index 0000000..af15c9c
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/SubMessageDto.java
@@ -0,0 +1,40 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 小程序订阅消息dto
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class SubMessageDto implements Serializable {
+
+ @ApiModelProperty("键值")
+ private String key;
+
+ @ApiModelProperty("模板ID")
+ private String templateId;
+
+ @ApiModelProperty("TID")
+ private String tid;
+
+ @ApiModelProperty("标题")
+ private String title;
+
+ @ApiModelProperty("内容")
+ private String content;
+
+ @ApiModelProperty("状态")
+ private String status;
+
+ @ApiModelProperty("模板参数")
+ private List params;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/TokenDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/TokenDto.java
new file mode 100644
index 0000000..0a3b21a
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/TokenDto.java
@@ -0,0 +1,30 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * 登录Token实体
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class TokenDto implements Serializable {
+
+ @ApiModelProperty("token")
+ private String token;
+
+ @ApiModelProperty("创建时间")
+ private Long tokenCreatedTime;
+
+ @ApiModelProperty("失效时间")
+ private Long tokenExpiryTime;
+
+ @ApiModelProperty("是否登录")
+ private String isLogin;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/UserCouponDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/UserCouponDto.java
new file mode 100644
index 0000000..f4c2a95
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/UserCouponDto.java
@@ -0,0 +1,79 @@
+package com.fuint.common.dto;
+
+import com.fuint.repository.model.MtConfirmLog;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 我的卡券实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class UserCouponDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("卡券名称")
+ private String name;
+
+ @ApiModelProperty("卡券类型")
+ private String type;
+
+ @ApiModelProperty("状态")
+ private String status;
+
+ @ApiModelProperty("卡券ID")
+ private Integer couponId;
+
+ @ApiModelProperty("使用规则")
+ private String useRule;
+
+ @ApiModelProperty("核销编码")
+ private String code;
+
+ @ApiModelProperty("二维码")
+ private String qrCode;
+
+ @ApiModelProperty("图片")
+ private String image;
+
+ @ApiModelProperty("面额")
+ private BigDecimal amount;
+
+ @ApiModelProperty("是否允许转赠")
+ private Boolean isGive;
+
+ @ApiModelProperty("余额")
+ private BigDecimal balance;
+
+ @ApiModelProperty("核销次数")
+ private Integer confirmCount;
+
+ @ApiModelProperty("核销记录")
+ private List confirmLogs;
+
+ @ApiModelProperty("是否可用(过期、状态等)")
+ private boolean canUse;
+
+ @ApiModelProperty("有效期")
+ private String effectiveDate;
+
+ @ApiModelProperty("适用店铺")
+ private String storeNames;
+
+ @ApiModelProperty("提示信息")
+ private String tips;
+
+ @ApiModelProperty("描述信息")
+ private String description;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/UserDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/UserDto.java
new file mode 100644
index 0000000..77ae451
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/UserDto.java
@@ -0,0 +1,111 @@
+package com.fuint.common.dto;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 会员个人信息
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class UserDto implements Serializable {
+
+ @ApiModelProperty("会员ID")
+ private Integer id;
+
+ @ApiModelProperty("会员号")
+ private String userNo;
+
+ @ApiModelProperty("头像")
+ private String avatar;
+
+ @ApiModelProperty("称呼")
+ private String name;
+
+ @ApiModelProperty("是否设置密码")
+ private String hasPassword;
+
+ @ApiModelProperty("分组ID")
+ private Integer groupId;
+
+ @ApiModelProperty("分组信息")
+ private UserGroupDto groupInfo;
+
+ @ApiModelProperty("微信open_id")
+ private String openId;
+
+ @ApiModelProperty("手机号码")
+ private String mobile;
+
+ @ApiModelProperty("证件号码")
+ private String idcard;
+
+ @ApiModelProperty("等级ID")
+ private String gradeId;
+
+ @ApiModelProperty("等级名称")
+ private String gradeName;
+
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("会员开始时间")
+ private Date startTime;
+
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ @ApiModelProperty("会员结束时间")
+ private Date endTime;
+
+ @ApiModelProperty("余额")
+ private BigDecimal balance;
+
+ @ApiModelProperty("积分")
+ private Integer point;
+
+ @ApiModelProperty("性别 1男;0女")
+ private Integer sex;
+
+ @ApiModelProperty("出生日期")
+ private String birthday;
+
+ @ApiModelProperty("车牌号")
+ private String carNo;
+
+ @ApiModelProperty("来源渠道")
+ private String source;
+
+ @ApiModelProperty("地址")
+ private String address;
+
+ @ApiModelProperty("默认店铺ID")
+ private Integer storeId;
+
+ @ApiModelProperty("默认店铺名称")
+ private String storeName;
+
+ @ApiModelProperty("创建时间")
+ private Date createTime;
+
+ @ApiModelProperty("更新时间")
+ private Date updateTime;
+
+ @ApiModelProperty("最近登录时间")
+ private String lastLoginTime;
+
+ @ApiModelProperty("状态,A:激活;N:禁用;D:删除")
+ private String status;
+
+ @ApiModelProperty("备注信息")
+ private String description;
+
+ @ApiModelProperty("最后操作人")
+ private String operator;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/UserGroupDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/UserGroupDto.java
new file mode 100644
index 0000000..117f521
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/UserGroupDto.java
@@ -0,0 +1,56 @@
+package com.fuint.common.dto;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 会员分组
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class UserGroupDto implements Serializable {
+
+ @ApiModelProperty("分组ID")
+ private Integer id;
+
+ @ApiModelProperty("分组名称")
+ private String name;
+
+ @ApiModelProperty("所属商户ID")
+ private Integer merchantId;
+
+ @ApiModelProperty("默认店铺")
+ private Integer storeId;
+
+ @ApiModelProperty("父ID")
+ private Integer parentId;
+
+ @ApiModelProperty("子分组")
+ private List children;
+
+ @ApiModelProperty("会员数量")
+ private Long memberNum;
+
+ @ApiModelProperty("创建时间")
+ private Date createTime;
+
+ @ApiModelProperty("更新时间")
+ private Date updateTime;
+
+ @ApiModelProperty("状态,A:激活;N:禁用;D:删除")
+ private String status;
+
+ @ApiModelProperty("备注信息")
+ private String description;
+
+ @ApiModelProperty("最后操作人")
+ private String operator;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/UserInfo.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/UserInfo.java
new file mode 100644
index 0000000..521ef5f
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/UserInfo.java
@@ -0,0 +1,22 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 会员登录信息实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class UserInfo implements Serializable {
+
+ @ApiModelProperty("会员ID")
+ private Integer id;
+
+ @ApiModelProperty("登录Token")
+ private String token;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/UserOrderDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/UserOrderDto.java
new file mode 100644
index 0000000..63baadb
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/UserOrderDto.java
@@ -0,0 +1,132 @@
+package com.fuint.common.dto;
+
+import com.fuint.repository.model.MtRefund;
+import com.fuint.repository.model.MtStore;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 会员订单实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class UserOrderDto implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("商户ID")
+ private Integer merchantId;
+
+ @ApiModelProperty("订单号")
+ private String orderSn;
+
+ @ApiModelProperty("订单类型")
+ private String type;
+
+ @ApiModelProperty("订单类型名称")
+ private String typeName;
+
+ @ApiModelProperty("支付类型")
+ private String payType;
+
+ @ApiModelProperty("订单模式")
+ private String orderMode;
+
+ @ApiModelProperty("是否核销")
+ private Boolean isVerify;
+
+ @ApiModelProperty("卡券ID")
+ private Integer couponId;
+
+ @ApiModelProperty("会员ID")
+ private Integer userId;
+
+ @ApiModelProperty("是否游客")
+ private String isVisitor;
+
+ @ApiModelProperty("核销码")
+ private String verifyCode;
+
+ @ApiModelProperty("员工ID")
+ private Integer staffId;
+
+ @ApiModelProperty("总金额")
+ private BigDecimal amount;
+
+ @ApiModelProperty("支付金额")
+ private BigDecimal payAmount;
+
+ @ApiModelProperty("优惠金额")
+ private BigDecimal discount;
+
+ @ApiModelProperty("配送费用")
+ private BigDecimal deliveryFee;
+
+ @ApiModelProperty("使用积分")
+ private Integer usePoint;
+
+ @ApiModelProperty("积分金额")
+ private BigDecimal pointAmount;
+
+ @ApiModelProperty("订单参数")
+ private String param;
+
+ @ApiModelProperty("备注信息")
+ private String remark;
+
+ @ApiModelProperty("创建时间")
+ private String createTime;
+
+ @ApiModelProperty("更新时间")
+ private String updateTime;
+
+ @ApiModelProperty("支付时间")
+ private String payTime;
+
+ @ApiModelProperty("订单状态")
+ private String status;
+
+ @ApiModelProperty("支付状态")
+ private String payStatus;
+
+ @ApiModelProperty(value="结算状态")
+ private String settleStatus;
+
+ @ApiModelProperty("状态说明")
+ private String statusText;
+
+ @ApiModelProperty("最后操作人")
+ private String operator;
+
+ @ApiModelProperty("订单商品列表")
+ private List goods;
+
+ @ApiModelProperty("下单用户信息")
+ private OrderUserDto userInfo;
+
+ @ApiModelProperty("配送地址")
+ private AddressDto address;
+
+ @ApiModelProperty("物流信息")
+ private ExpressDto expressInfo;
+
+ @ApiModelProperty("所属店铺信息")
+ private MtStore storeInfo;
+
+ @ApiModelProperty("售后订单")
+ private MtRefund refundInfo;
+
+ @ApiModelProperty("使用卡券")
+ private UserCouponDto couponInfo;
+
+}
+
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/WxCardDto.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/WxCardDto.java
new file mode 100644
index 0000000..a25dbcc
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/WxCardDto.java
@@ -0,0 +1,77 @@
+package com.fuint.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 微信会员卡实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class WxCardDto {
+
+ @ApiModelProperty("会员卡类型")
+ private String cardType;
+
+ @ApiModelProperty("会员卡背景图")
+ private String backgroundUrl;
+
+ @ApiModelProperty("商户logo")
+ private String logoUrl;
+
+ @ApiModelProperty("商户名称")
+ private String brandName;
+
+ @ApiModelProperty("Code展示类型")
+ private String codeType;
+
+ @ApiModelProperty("卡券名,字数上限为9个汉字")
+ private String title;
+
+ @ApiModelProperty("会员卡颜色")
+ private String color;
+
+ @ApiModelProperty("卡券使用提醒,字数上限为16个汉字")
+ private String notice;
+
+ @ApiModelProperty("卡券使用说明,字数上限为1024个汉字")
+ private String description;
+
+ @ApiModelProperty("客服电话")
+ private String servicePhone;
+
+ @ApiModelProperty("跳转外链的入口名字")
+ private String customUrlName;
+
+ @ApiModelProperty("跳转外链的URL")
+ private String customUrl;
+
+ @ApiModelProperty("显示在入口右侧的提示语")
+ private String customUrlSubTitle;
+
+ @ApiModelProperty("卡券领取页面是否可分享")
+ private Boolean canShare;
+
+ @ApiModelProperty("会员卡特权说明,限制1024汉字")
+ private String prerogative;
+
+ @ApiModelProperty("显示积分")
+ private Boolean supplyBonus;
+
+ @ApiModelProperty("跳转外链查看积分详情")
+ private String bonusUrl;
+
+ @ApiModelProperty("积分规则")
+ private String bonusRules;
+
+ @ApiModelProperty("是否支持储值")
+ private Boolean supplyBalance;
+
+ @ApiModelProperty("跳转外链查看余额详情")
+ private String balanceUrl;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/AdminRoleEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/AdminRoleEnum.java
new file mode 100644
index 0000000..4351d59
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/AdminRoleEnum.java
@@ -0,0 +1,77 @@
+package com.fuint.common.enums;
+
+/**
+ * 后台角色枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum AdminRoleEnum {
+ ADMIN("1", "超级管理员","admin"),
+ COMMON("2", "普通管理员","common"),
+ USER("3", "用户角色","user");
+
+ private String key;
+ private String name;
+ private String value;
+
+ AdminRoleEnum(String key, String name, String value) {
+ this.key = key;
+ this.name = name;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ // 普通方法,通过key获取value
+ public static String getValue(String k) {
+ for (AdminRoleEnum c : AdminRoleEnum.values()) {
+ if (c.getKey().equals(k)) {
+ return c.getValue();
+ }
+ }
+ return null;
+ }
+
+ // 普通方法,通过key获取name
+ public static String getName(String k) {
+ for (AdminRoleEnum c : AdminRoleEnum.values()) {
+ if (c.getKey().equals(k)) {
+ return c.getName();
+ }
+ }
+ return null;
+ }
+
+ // 普通方法,通过Value获取key
+ public static String getKey(String v) {
+ for (AdminRoleEnum c : AdminRoleEnum.values()) {
+ if (c.getValue() == v) {
+ return c.getKey();
+ }
+ }
+ return null;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/ApplyGoodsEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/ApplyGoodsEnum.java
new file mode 100644
index 0000000..3878d1a
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/ApplyGoodsEnum.java
@@ -0,0 +1,57 @@
+package com.fuint.common.enums;
+
+/**
+ * 卡券适用商品
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum ApplyGoodsEnum {
+ ALL_GOODS("allGoods", "全场通用"),
+ PARK_GOODS("parkGoods", "指定商品");
+
+ private String key;
+
+ private String value;
+
+ ApplyGoodsEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ // 普通方法,通过key获取value
+ public static String getValue(String k) {
+ for (ApplyGoodsEnum c : ApplyGoodsEnum.values()) {
+ if (c.getKey().equals(k)) {
+ return c.getValue();
+ }
+ }
+ return null;
+ }
+
+ // 普通方法,通过Value获取key
+ public static String getKey(String v) {
+ for (ApplyGoodsEnum c : ApplyGoodsEnum.values()) {
+ if (c.getValue() == v) {
+ return c.getKey();
+ }
+ }
+ return null;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/BalanceSettingEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/BalanceSettingEnum.java
new file mode 100644
index 0000000..b8870ad
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/BalanceSettingEnum.java
@@ -0,0 +1,57 @@
+package com.fuint.common.enums;
+
+/**
+ * 充值配置项枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum BalanceSettingEnum {
+ RECHARGE_RULE("rechargeRule", "充值规则"),
+ RECHARGE_REMARK("rechargeRemark", "充值说明");
+
+ private String key;
+
+ private String value;
+
+ BalanceSettingEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ // 普通方法,通过key获取value
+ public static String getValue(String k) {
+ for (BalanceSettingEnum c : BalanceSettingEnum.values()) {
+ if (c.getKey().equals(k)) {
+ return c.getValue();
+ }
+ }
+ return null;
+ }
+
+ // 普通方法,通过Value获取key
+ public static String getKey(String v) {
+ for (BalanceSettingEnum c : BalanceSettingEnum.values()) {
+ if (c.getValue() == v) {
+ return c.getKey();
+ }
+ }
+ return null;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/CommissionCashStatusEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/CommissionCashStatusEnum.java
new file mode 100644
index 0000000..cc1cda6
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/CommissionCashStatusEnum.java
@@ -0,0 +1,39 @@
+package com.fuint.common.enums;
+
+/**
+ * 分佣结算状态
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum CommissionCashStatusEnum {
+ WAIT("A", "待确认"),
+ SETTLED("B", "已确认"),
+ CANCEL("C", "已打款"),
+ PAYED("D", "已作废");
+
+ private String key;
+
+ private String value;
+
+ CommissionCashStatusEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/CommissionStatusEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/CommissionStatusEnum.java
new file mode 100644
index 0000000..506655d
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/CommissionStatusEnum.java
@@ -0,0 +1,38 @@
+package com.fuint.common.enums;
+
+/**
+ * 分佣状态
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum CommissionStatusEnum {
+ NORMAL("A", "待结算"),
+ SETTLED("B", "已结算"),
+ CANCEL("C", "已作废");
+
+ private String key;
+
+ private String value;
+
+ CommissionStatusEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/CommissionTargetEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/CommissionTargetEnum.java
new file mode 100644
index 0000000..67335ec
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/CommissionTargetEnum.java
@@ -0,0 +1,37 @@
+package com.fuint.common.enums;
+
+/**
+ * 分佣对象枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum CommissionTargetEnum {
+ MEMBER("member", "会员分销"),
+ STAFF("staff", "员工提成");
+
+ private String key;
+
+ private String value;
+
+ CommissionTargetEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/CommissionTypeEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/CommissionTypeEnum.java
new file mode 100644
index 0000000..b5ab8c2
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/CommissionTypeEnum.java
@@ -0,0 +1,54 @@
+package com.fuint.common.enums;
+
+/**
+ * 分佣提成类型
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum CommissionTypeEnum {
+ GOOGS("goods", "商品订单"),
+ PAYMENT("payment", "付款订单"),
+ RECHARGE("recharge", "充值订单");
+
+ private String key;
+
+ private String value;
+
+ CommissionTypeEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ /**
+ * 根据key获取value
+ *
+ * @param key
+ * @return
+ */
+ public static String getName(String key) {
+ final CommissionTypeEnum[] values = CommissionTypeEnum.values();
+ for (CommissionTypeEnum value : values) {
+ if (key.equals(value.getKey())) {
+ return value.getValue();
+ }
+ }
+ return null;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/CouponContentEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/CouponContentEnum.java
new file mode 100644
index 0000000..0667a27
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/CouponContentEnum.java
@@ -0,0 +1,40 @@
+package com.fuint.common.enums;
+
+/**
+ * 卡券内容枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum CouponContentEnum {
+ ROOM("1", "房间"),
+ ROOM_BTEAKFAST("2", "房间+早餐"),
+ MEALS("3", "餐食"),
+ WASH("4", "洗衣"),
+ HEALTH("5", "康乐");
+
+ private String key;
+
+ private String value;
+
+ CouponContentEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/CouponExpireTypeEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/CouponExpireTypeEnum.java
new file mode 100644
index 0000000..df2e4e6
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/CouponExpireTypeEnum.java
@@ -0,0 +1,37 @@
+package com.fuint.common.enums;
+
+/**
+ * 卡券过期类型枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum CouponExpireTypeEnum {
+ FIX("fix", "固定期限"),
+ FLEX("flex", "领取后生效");
+
+ private String key;
+
+ private String value;
+
+ CouponExpireTypeEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/CouponTypeEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/CouponTypeEnum.java
new file mode 100644
index 0000000..f053d44
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/CouponTypeEnum.java
@@ -0,0 +1,38 @@
+package com.fuint.common.enums;
+
+/**
+ * 卡券类型枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum CouponTypeEnum {
+ COUPON("C", "优惠券"),
+ PRESTORE("P", "储值卡"),
+ TIMER("T", "计次卡");
+
+ private String key;
+
+ private String value;
+
+ CouponTypeEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/CouponUseForEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/CouponUseForEnum.java
new file mode 100644
index 0000000..6fafc6c
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/CouponUseForEnum.java
@@ -0,0 +1,57 @@
+package com.fuint.common.enums;
+
+/**
+ * 卡券使用专项枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum CouponUseForEnum {
+ MEMBER_GRADE("memberGrade", "升级会员等级专用"),
+ OFF_LINE_PAYMENT("offLinePayment", "到店收银买单专用");
+
+ private String key;
+
+ private String value;
+
+ CouponUseForEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ // 普通方法,通过key获取value
+ public static String getValue(String k) {
+ for (CouponUseForEnum c : CouponUseForEnum.values()) {
+ if (c.getKey().equals(k)) {
+ return c.getValue();
+ }
+ }
+ return null;
+ }
+
+ // 普通方法,通过Value获取key
+ public static String getKey(String v) {
+ for (CouponUseForEnum c : CouponUseForEnum.values()) {
+ if (c.getValue() == v) {
+ return c.getKey();
+ }
+ }
+ return null;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/GenderEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/GenderEnum.java
new file mode 100644
index 0000000..c72fd7c
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/GenderEnum.java
@@ -0,0 +1,39 @@
+package com.fuint.common.enums;
+
+/**
+ * 性别枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum GenderEnum {
+
+ FEMALE(0, "女"),
+ MAN(1, "男"),
+ UNKNOWN(2, "未知");
+
+ private Integer key;
+
+ private String value;
+
+ GenderEnum(Integer key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public Integer getKey() {
+ return key;
+ }
+
+ public void setKey(Integer key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/GoodsTypeEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/GoodsTypeEnum.java
new file mode 100644
index 0000000..d081d23
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/GoodsTypeEnum.java
@@ -0,0 +1,58 @@
+package com.fuint.common.enums;
+
+/**
+ * 商品类型
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum GoodsTypeEnum {
+ GOODS("goods", "实物商品"),
+ SERVICE("service", "服务项目"),
+ COUPON("coupon", "虚拟卡券");
+
+ private String key;
+
+ private String value;
+
+ GoodsTypeEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ // 普通方法,通过key获取value
+ public static String getValue(String k) {
+ for (GoodsTypeEnum c : GoodsTypeEnum.values()) {
+ if (c.getKey().equals(k)) {
+ return c.getValue();
+ }
+ }
+ return null;
+ }
+
+ // 普通方法,通过Value获取key
+ public static String getKey(String v) {
+ for (GoodsTypeEnum c : GoodsTypeEnum.values()) {
+ if (c.getValue() == v) {
+ return c.getKey();
+ }
+ }
+ return null;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/MemberSourceEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/MemberSourceEnum.java
new file mode 100644
index 0000000..4780ee4
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/MemberSourceEnum.java
@@ -0,0 +1,59 @@
+package com.fuint.common.enums;
+
+/**
+ * 会员来源渠道
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum MemberSourceEnum {
+ BACKEND_ADD("backend_add", "后台添加"),
+ REGISTER_BY_ACCOUNT("register_by_account", "H5注册"),
+ MOBILE_LOGIN("mobile_login", "手机号登录注册"),
+ WECHAT_LOGIN("wechat_login", "微信小程序");
+
+ private String key;
+
+ private String value;
+
+ MemberSourceEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ // 普通方法,通过key获取value
+ public static String getValue(String k) {
+ for (MemberSourceEnum c : MemberSourceEnum.values()) {
+ if (c.getKey().equals(k)) {
+ return c.getValue();
+ }
+ }
+ return null;
+ }
+
+ // 普通方法,通过Value获取key
+ public static String getKey(String v) {
+ for (MemberSourceEnum c : MemberSourceEnum.values()) {
+ if (c.getValue() == v) {
+ return c.getKey();
+ }
+ }
+ return null;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/MerchantTypeEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/MerchantTypeEnum.java
new file mode 100644
index 0000000..cbb8ef9
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/MerchantTypeEnum.java
@@ -0,0 +1,39 @@
+package com.fuint.common.enums;
+
+/**
+ * 商户类型枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum MerchantTypeEnum {
+ RESTAURANT("restaurant", "餐饮:餐厅、奶茶、酒店等"),
+ RETAIL("retail", "零售:超市、生鲜、卖场等"),
+ SERVICE("service", "服务:美容、足浴、汽车4s店等"),
+ OTHER("other", "其他");
+
+ private String key;
+
+ private String value;
+
+ MerchantTypeEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/MessageEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/MessageEnum.java
new file mode 100644
index 0000000..55454f5
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/MessageEnum.java
@@ -0,0 +1,35 @@
+package com.fuint.common.enums;
+
+/**
+ * 会员消息类型枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum MessageEnum {
+ POP_MSG("pop", "弹框消息"),
+ SUB_MSG("sub", "订阅消息"),
+ SMS_MSG("sms", "短信消息");
+
+ private String key;
+ private String value;
+
+ MessageEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/OrderModeEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/OrderModeEnum.java
new file mode 100644
index 0000000..03a8286
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/OrderModeEnum.java
@@ -0,0 +1,37 @@
+package com.fuint.common.enums;
+
+/**
+ * 订单模式
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum OrderModeEnum {
+ EXPRESS("express", "配送"),
+ ONESELF("oneself", "自取");
+
+ private String key;
+
+ private String value;
+
+ OrderModeEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/OrderSettingEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/OrderSettingEnum.java
new file mode 100644
index 0000000..3223fba
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/OrderSettingEnum.java
@@ -0,0 +1,57 @@
+package com.fuint.common.enums;
+
+/**
+ * 交易配置项枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum OrderSettingEnum {
+ DELIVERY_FEE("deliveryFee", "订单配送费用"),
+ IS_CLOSE("isClose", "关闭交易功能");
+
+ private String key;
+
+ private String value;
+
+ OrderSettingEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ // 普通方法,通过key获取value
+ public static String getValue(String k) {
+ for (OrderSettingEnum c : OrderSettingEnum.values()) {
+ if (c.getKey().equals(k)) {
+ return c.getValue();
+ }
+ }
+ return null;
+ }
+
+ // 普通方法,通过Value获取key
+ public static String getKey(String v) {
+ for (OrderSettingEnum c : OrderSettingEnum.values()) {
+ if (c.getValue() == v) {
+ return c.getKey();
+ }
+ }
+ return null;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/OrderStatusEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/OrderStatusEnum.java
new file mode 100644
index 0000000..0bf26d9
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/OrderStatusEnum.java
@@ -0,0 +1,43 @@
+package com.fuint.common.enums;
+
+/**
+ * 订单状态枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum OrderStatusEnum {
+ CREATED("A", "待支付"),
+ PAID("B", "已支付"),
+ CANCEL("C", "已取消"),
+ DELIVERY("D", "待发货"),
+ DELIVERED("E", "已发货"),
+ RECEIVED("F", "已收货"),
+ DELETED("G", "已删除"),
+ REFUND("H", "已退款");
+
+ private String key;
+
+ private String value;
+
+ OrderStatusEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/OrderTypeEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/OrderTypeEnum.java
new file mode 100644
index 0000000..cff5bcb
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/OrderTypeEnum.java
@@ -0,0 +1,56 @@
+package com.fuint.common.enums;
+
+/**
+ * 订单类型
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum OrderTypeEnum {
+ GOOGS("goods", "商品订单"),
+ PAYMENT("payment", "付款订单"),
+ RECHARGE("recharge", "充值订单"),
+ PRESTORE("prestore", "储值卡订单"),
+ MEMBER("member", "会员升级订单");
+
+ private String key;
+
+ private String value;
+
+ OrderTypeEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ /**
+ * 根据key获取value
+ *
+ * @param key
+ * @return
+ */
+ public static String getName(String key) {
+ final OrderTypeEnum[] values = OrderTypeEnum.values();
+ for (OrderTypeEnum value : values) {
+ if (key.equals(value.getKey())) {
+ return value.getValue();
+ }
+ }
+ return null;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/PayStatusEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/PayStatusEnum.java
new file mode 100644
index 0000000..76a32ca
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/PayStatusEnum.java
@@ -0,0 +1,37 @@
+package com.fuint.common.enums;
+
+/**
+ * 支付状态
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum PayStatusEnum {
+ WAIT("A", "待支付"),
+ SUCCESS("B", "已支付");
+
+ private String key;
+
+ private String value;
+
+ PayStatusEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/PayTypeEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/PayTypeEnum.java
new file mode 100644
index 0000000..5215143
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/PayTypeEnum.java
@@ -0,0 +1,40 @@
+package com.fuint.common.enums;
+
+/**
+ * 支付类型
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum PayTypeEnum {
+ CASH("CASH", "现金支付"),
+ JSAPI("JSAPI", "微信支付"),
+ MICROPAY("MICROPAY", "微信扫码支付"),
+ BALANCE("BALANCE", "余额支付"),
+ ALISCAN("ALISCAN", "支付宝扫码");
+
+ private String key;
+
+ private String value;
+
+ PayTypeEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/PlatformTypeEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/PlatformTypeEnum.java
new file mode 100644
index 0000000..0b61e10
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/PlatformTypeEnum.java
@@ -0,0 +1,55 @@
+package com.fuint.common.enums;
+
+/**
+ * 平台类型枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum PlatformTypeEnum {
+
+ /**
+ * PC
+ */
+ PC("PC", "PC端"),
+
+ /**
+ * H5
+ */
+ H5("H5", "H5端"),
+
+ /**
+ * 微信小程序
+ */
+ MP_WEIXIN("MP_WEIXIN", "微信小程序"),
+
+ /**
+ * App客户端
+ */
+ APP("APP", "App客户端");
+
+ private String code;
+
+ private String value;
+
+ PlatformTypeEnum(String code, String value) {
+ this.code = code;
+ this.value = value;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/PointSettingEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/PointSettingEnum.java
new file mode 100644
index 0000000..293aa2a
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/PointSettingEnum.java
@@ -0,0 +1,59 @@
+package com.fuint.common.enums;
+
+/**
+ * 积分配置项枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum PointSettingEnum {
+ POINT_NEED_CONSUME("pointNeedConsume", "返1积分所需消费金额"),
+ CAN_USE_AS_MONEY("canUsedAsMoney", "是否可当作现金使用"),
+ EXCHANGE_NEED_POINT("exchangeNeedPoint", "多少积分可抵扣1元现金"),
+ RECHARGE_POINT_SPEED("rechargePointSpeed", "充值返积分倍数");
+
+ private String key;
+
+ private String value;
+
+ PointSettingEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ // 普通方法,通过key获取value
+ public static String getValue(String k) {
+ for (PointSettingEnum c : PointSettingEnum.values()) {
+ if (c.getKey().equals(k)) {
+ return c.getValue();
+ }
+ }
+ return null;
+ }
+
+ // 普通方法,通过Value获取key
+ public static String getKey(String v) {
+ for (PointSettingEnum c : PointSettingEnum.values()) {
+ if (c.getValue() == v) {
+ return c.getKey();
+ }
+ }
+ return null;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/QrCodeEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/QrCodeEnum.java
new file mode 100644
index 0000000..2e3cf8d
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/QrCodeEnum.java
@@ -0,0 +1,76 @@
+package com.fuint.common.enums;
+
+/**
+ * 二维码枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum QrCodeEnum {
+ TABLE("table", "桌码二维码", "pages/category/index"),
+ STORE("store", "店铺二维码", "pages/index/index"),
+ COUPON("coupon", "卡券二维码", "pages/coupon/detail");
+
+ private String key;
+
+ private String value;
+
+ private String page;
+
+ QrCodeEnum(String key, String value, String page) {
+ this.key = key;
+ this.value = value;
+ this.page = page;
+ }
+
+ public String getKey() {
+ return key;
+ }
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ public String getPage() {
+ return page;
+ }
+ public void setPage(String page) {
+ this.page = page;
+ }
+
+ // 普通方法,通过key获取value
+ public static String getValue(String k) {
+ for (QrCodeEnum c : QrCodeEnum.values()) {
+ if (c.getKey().equals(k)) {
+ return c.getValue();
+ }
+ }
+ return null;
+ }
+
+ // 普通方法,通过Value获取key
+ public static String getKey(String v) {
+ for (QrCodeEnum c : QrCodeEnum.values()) {
+ if (c.getValue() == v) {
+ return c.getKey();
+ }
+ }
+ return null;
+ }
+
+ // 普通方法,通过key获取page
+ public static String getPage(String k) {
+ for (QrCodeEnum c : QrCodeEnum.values()) {
+ if (c.getKey().equals(k)) {
+ return c.getPage();
+ }
+ }
+ return null;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/RefundStatusEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/RefundStatusEnum.java
new file mode 100644
index 0000000..8160d51
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/RefundStatusEnum.java
@@ -0,0 +1,40 @@
+package com.fuint.common.enums;
+
+/**
+ * 售后订单状态枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum RefundStatusEnum {
+
+ CREATED("A", "待审核"),
+ APPROVED("B", "已同意"),
+ REJECT("C", "已拒绝"),
+ CANCEL("D", "已取消");
+
+ private String key;
+
+ private String value;
+
+ RefundStatusEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/RefundTypeEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/RefundTypeEnum.java
new file mode 100644
index 0000000..c56e149
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/RefundTypeEnum.java
@@ -0,0 +1,38 @@
+package com.fuint.common.enums;
+
+/**
+ * 售后类型枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum RefundTypeEnum {
+
+ RETURN("return", "退货退款"),
+ EXCHANGE("exchange", "换货");
+
+ private String key;
+
+ private String value;
+
+ RefundTypeEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/SendWayEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/SendWayEnum.java
new file mode 100644
index 0000000..19545b2
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/SendWayEnum.java
@@ -0,0 +1,58 @@
+package com.fuint.common.enums;
+
+/**
+ * 卡券发放方式
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum SendWayEnum {
+ BACKEND("backend", "后台发放"),
+ OFFLINE("offline", "线下发放"),
+ FRONT("front", "前台领取");
+
+ private String key;
+
+ private String value;
+
+ SendWayEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ // 普通方法,通过key获取value
+ public static String getValue(String k) {
+ for (SendWayEnum c : SendWayEnum.values()) {
+ if (c.getKey().equals(k)) {
+ return c.getValue();
+ }
+ }
+ return null;
+ }
+
+ // 普通方法,通过Value获取key
+ public static String getKey(String v) {
+ for (SendWayEnum c : SendWayEnum.values()) {
+ if (c.getValue() == v) {
+ return c.getKey();
+ }
+ }
+ return null;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/SettingTypeEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/SettingTypeEnum.java
new file mode 100644
index 0000000..be7aaf5
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/SettingTypeEnum.java
@@ -0,0 +1,60 @@
+package com.fuint.common.enums;
+
+/**
+ * 配置类型枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum SettingTypeEnum {
+ POINT("point", "积分配置"),
+ BALANCE("balance", "余额配置"),
+ USER("user", "会员配置"),
+ ORDER("order", "交易配置"),
+ SUB_MESSAGE("sub_message", "订阅消息");
+
+ private String key;
+
+ private String value;
+
+ SettingTypeEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ // 普通方法,通过key获取value
+ public static String getValue(String k) {
+ for (SettingTypeEnum c : SettingTypeEnum.values()) {
+ if (c.getKey().equals(k)) {
+ return c.getValue();
+ }
+ }
+ return null;
+ }
+
+ // 普通方法,通过Value获取key
+ public static String getKey(String v) {
+ for (SettingTypeEnum c : SettingTypeEnum.values()) {
+ if (c.getValue() == v) {
+ return c.getKey();
+ }
+ }
+ return null;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/SettleStatusEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/SettleStatusEnum.java
new file mode 100644
index 0000000..b31e5e3
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/SettleStatusEnum.java
@@ -0,0 +1,37 @@
+package com.fuint.common.enums;
+
+/**
+ * 订单结算状态
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum SettleStatusEnum {
+ WAIT("A", "待确认"),
+ COMPLETE("B", "已完成");
+
+ private String key;
+
+ private String value;
+
+ SettleStatusEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/StaffCategoryEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/StaffCategoryEnum.java
new file mode 100644
index 0000000..e170f3d
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/StaffCategoryEnum.java
@@ -0,0 +1,78 @@
+package com.fuint.common.enums;
+
+/**
+ * 员工类别枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum StaffCategoryEnum {
+ MANAGER("1", "店长","admin"),
+ CASHIER("2", "收银人员","cashier"),
+ SALE("3", "销售人员","sale"),
+ SERVICE("4", "服务人员","service");
+
+ private String key;
+ private String name;
+ private String value;
+
+ StaffCategoryEnum(String key, String name, String value) {
+ this.key = key;
+ this.name = name;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ // 普通方法,通过key获取value
+ public static String getValue(String k) {
+ for (StaffCategoryEnum c : StaffCategoryEnum.values()) {
+ if (c.getKey().equals(k)) {
+ return c.getValue();
+ }
+ }
+ return null;
+ }
+
+ // 普通方法,通过key获取name
+ public static String getName(String k) {
+ for (StaffCategoryEnum c : StaffCategoryEnum.values()) {
+ if (c.getKey().equals(k)) {
+ return c.getName();
+ }
+ }
+ return null;
+ }
+
+ // 普通方法,通过Value获取key
+ public static String getKey(String v) {
+ for (StaffCategoryEnum c : StaffCategoryEnum.values()) {
+ if (c.getValue() == v) {
+ return c.getKey();
+ }
+ }
+ return null;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/StatusEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/StatusEnum.java
new file mode 100644
index 0000000..de815d5
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/StatusEnum.java
@@ -0,0 +1,41 @@
+package com.fuint.common.enums;
+
+/**
+ * 通用状态枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum StatusEnum {
+
+ ENABLED("A", "启用"),
+ EXPIRED("C", "过期"),
+ DISABLE("D", "删除"),
+ FORBIDDEN("N", "禁用"),
+ UnAudited("U", "待审核");
+
+ private String key;
+
+ private String value;
+
+ StatusEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/UserActionEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/UserActionEnum.java
new file mode 100644
index 0000000..3790012
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/UserActionEnum.java
@@ -0,0 +1,64 @@
+package com.fuint.common.enums;
+
+/**
+ * 会员行为枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum UserActionEnum {
+ REGISTER("register", "注册会员"),
+ LOGIN("login", "登录系统"),
+ VIEW_GOODS("viewGoods", "浏览商品"),
+ SUBMIT_ORDER("submitOrder", "提交订单"),
+ CANCEL_ORDER("cancelOrder", "取消订单"),
+ GET_COUPON("getCoupon", "领取卡券"),
+ USE_COUPON("useCoupon", "使用卡券"),
+ RECHARGE_BALANCE("rechargeBalance", "余额充值"),
+ USE_BALANCE("useBalance", "使用余额");
+
+ private String key;
+
+ private String value;
+
+ UserActionEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ // 普通方法,通过key获取value
+ public static String getValue(String k) {
+ for (UserActionEnum c : UserActionEnum.values()) {
+ if (c.getKey().equals(k)) {
+ return c.getValue();
+ }
+ }
+ return null;
+ }
+
+ // 普通方法,通过Value获取key
+ public static String getKey(String v) {
+ for (UserActionEnum c : UserActionEnum.values()) {
+ if (c.getValue() == v) {
+ return c.getKey();
+ }
+ }
+ return null;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/UserCouponStatusEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/UserCouponStatusEnum.java
new file mode 100644
index 0000000..2fdaaf1
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/UserCouponStatusEnum.java
@@ -0,0 +1,60 @@
+package com.fuint.common.enums;
+
+/**
+ * 用户卡券状态
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum UserCouponStatusEnum {
+ UNUSED("A", "未使用"),
+ USED("B", "已使用"),
+ EXPIRE("C", "已过期"),
+ DISABLE("D", "不可用"),
+ UNSEND("E", "待领取");
+
+ private String key;
+
+ private String value;
+
+ UserCouponStatusEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ // 普通方法,通过key获取value
+ public static String getValue(String k) {
+ for (UserCouponStatusEnum c : UserCouponStatusEnum.values()) {
+ if (c.getKey().equals(k)) {
+ return c.getValue();
+ }
+ }
+ return null;
+ }
+
+ // 普通方法,通过Value获取key
+ public static String getKey(String v) {
+ for (UserCouponStatusEnum c : UserCouponStatusEnum.values()) {
+ if (c.getValue() == v) {
+ return c.getKey();
+ }
+ }
+ return null;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/UserGradeCatchTypeEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/UserGradeCatchTypeEnum.java
new file mode 100644
index 0000000..d0b9cb8
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/UserGradeCatchTypeEnum.java
@@ -0,0 +1,39 @@
+package com.fuint.common.enums;
+
+/**
+ * 升级会员等级条件枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum UserGradeCatchTypeEnum {
+ INIT("init", "默认获取"),
+ PAY("pay", "付费升级"),
+ FREQUENCY("frequency", "累计消费次数升级"),
+ AMOUNT("amount", "累积消费金额升级");
+
+ private String key;
+
+ private String value;
+
+ UserGradeCatchTypeEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/UserSettingEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/UserSettingEnum.java
new file mode 100644
index 0000000..5a8f3b9
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/UserSettingEnum.java
@@ -0,0 +1,61 @@
+package com.fuint.common.enums;
+
+/**
+ * 会员配置项枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum UserSettingEnum {
+ GET_COUPON_NEED_PHONE("getCouponNeedPhone", "领券是否需要手机号码"),
+ SUBMIT_ORDER_NEED_PHONE("submitOrderNeedPhone", "提交订单是否需要手机号码"),
+ LOGIN_NEED_PHONE("loginNeedPhone", "登录是否需要手机号"),
+ OPEN_WX_CARD("openWxCard", "开通微信会员卡"),
+ WX_MEMBER_CARD("wxMemberCard", "微信会员卡设置"),
+ WX_MEMBER_CARD_ID("wxMemberCardId", "微信会员卡ID");
+
+ private String key;
+
+ private String value;
+
+ UserSettingEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ // 普通方法,通过key获取value
+ public static String getValue(String k) {
+ for (UserSettingEnum c : UserSettingEnum.values()) {
+ if (c.getKey().equals(k)) {
+ return c.getValue();
+ }
+ }
+ return null;
+ }
+
+ // 普通方法,通过Value获取key
+ public static String getKey(String v) {
+ for (UserSettingEnum c : UserSettingEnum.values()) {
+ if (c.getValue() == v) {
+ return c.getKey();
+ }
+ }
+ return null;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/WxMessageEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/WxMessageEnum.java
new file mode 100644
index 0000000..498b5ad
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/WxMessageEnum.java
@@ -0,0 +1,62 @@
+package com.fuint.common.enums;
+
+/**
+ * 微信订阅消息枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum WxMessageEnum {
+ ORDER_CREATED("orderCreated", "订单生成提醒"),
+ DELIVER_GOODS("deliverGoods", "订单发货提醒"),
+ COUPON_EXPIRE("couponExpire", "卡券到期提醒"),
+ COUPON_ARRIVAL("couponArrival", "卡券到账提醒"),
+ BALANCE_CHANGE("balanceChange", "余额变动提醒"),
+ COUPON_CONFIRM("couponConfirm", "卡券核销提醒"),
+ POINT_CHANGE("pointChange", "积分变更提醒");
+
+ private String key;
+
+ private String value;
+
+ WxMessageEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ // 普通方法,通过key获取value
+ public static String getValue(String k) {
+ for (WxMessageEnum c : WxMessageEnum.values()) {
+ if (c.getKey().equals(k)) {
+ return c.getValue();
+ }
+ }
+ return null;
+ }
+
+ // 普通方法,通过Value获取key
+ public static String getKey(String v) {
+ for (WxMessageEnum c : WxMessageEnum.values()) {
+ if (c.getValue() == v) {
+ return c.getKey();
+ }
+ }
+ return null;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/YesOrNoEnum.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/YesOrNoEnum.java
new file mode 100644
index 0000000..0d4c355
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/enums/YesOrNoEnum.java
@@ -0,0 +1,39 @@
+package com.fuint.common.enums;
+
+/**
+ * 是或否枚举
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum YesOrNoEnum {
+ YES("Y", "是"),
+ NO("N", "否"),
+ TRUE("true", "真"),
+ FALSE("false", "假");
+
+ private String key;
+
+ private String value;
+
+ YesOrNoEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/http/HttpRESTDataClient.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/http/HttpRESTDataClient.java
new file mode 100644
index 0000000..5f17e54
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/http/HttpRESTDataClient.java
@@ -0,0 +1,100 @@
+package com.fuint.common.http;
+
+import com.fuint.utils.StringUtil;
+import okhttp3.*;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.protocol.HTTP;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import java.io.IOException;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.HttpClient;
+
+
+/**
+ * 调用REST接口并解析数据
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Component
+public class HttpRESTDataClient {
+
+ public static final Logger logger = LoggerFactory.getLogger(HttpRESTDataClient.class);
+
+ private static final OkHttpClient client = new OkHttpClient();
+
+ private static HttpClientBuilder httpClientBuilder;
+
+ static {
+ httpClientBuilder = HttpClientBuilder.create();
+ }
+
+ public static String requestGet(String url) throws IOException {
+ Request request = new Request.Builder()
+ .url(url)
+ .build();
+ Response response = client.newCall(request).execute();
+ if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
+
+ return response.body().string();
+ }
+
+ public static byte[] requestPost(String url, String postData) throws IOException {
+ String postBody = postData;
+ MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("application/json");
+ Request request = new Request.Builder()
+ .url(url)
+ .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, postBody))
+ .build();
+ Response response = client.newCall(request).execute();
+ if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
+
+ return response.body().bytes();
+ }
+
+ public static String requestPost(String url, String contentType, String postData) throws IOException {
+ MediaType mediaType = null;
+ if (StringUtil.isNotEmpty(contentType)) {
+ mediaType = MediaType.parse(contentType);
+ }
+ Request request = new Request.Builder()
+ .url(url)
+ .post(RequestBody.create(mediaType, postData))
+ .build();
+ Response response = client.newCall(request).execute();
+ if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
+
+ return response.body().string();
+ }
+
+ public static String requestPostBody(String url, String body) {
+ logger.debug("[HttpRESTDataClient] [requestPostBody] 入参 url={} body={}", url, body);
+
+ HttpPost httpPost = new HttpPost(url);
+ httpPost.addHeader(HTTP.CONTENT_TYPE, "application/json");
+ StringEntity entity = new StringEntity(body, "utf-8");
+ entity.setContentEncoding("UTF-8");
+ entity.setContentType("application/json");
+ httpPost.setEntity(entity);
+
+ try {
+ HttpClient client = httpClientBuilder.build();
+ HttpResponse response = client.execute(httpPost);
+ if (response.getStatusLine() != null && response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
+ String result = EntityUtils.toString(response.getEntity(), "utf-8");
+ return result;
+ }
+ return "";
+ }
+ catch (IOException ex) {
+ logger.error("[HttpRESTDataClient] [requestPostBody] 请求异常 ex={}", url, ex);
+ return "";
+ }
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/AddressDetailParam.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/AddressDetailParam.java
new file mode 100644
index 0000000..7b5b1ca
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/AddressDetailParam.java
@@ -0,0 +1,18 @@
+package com.fuint.common.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 收获地址详情请求参数
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class AddressDetailParam implements Serializable {
+
+ @ApiModelProperty(value="收获地址ID", name="addressId")
+ private String addressId;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/ArticleDetailParam.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/ArticleDetailParam.java
new file mode 100644
index 0000000..736883d
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/ArticleDetailParam.java
@@ -0,0 +1,18 @@
+package com.fuint.common.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 文章详情请求参数
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class ArticleDetailParam implements Serializable {
+
+ @ApiModelProperty(value="文章ID", name="articleId")
+ private String articleId;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/ArticleListParam.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/ArticleListParam.java
new file mode 100644
index 0000000..5b586f5
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/ArticleListParam.java
@@ -0,0 +1,21 @@
+package com.fuint.common.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 文章列表请求参数
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class ArticleListParam extends PageParam implements Serializable {
+
+ @ApiModelProperty(value="文章标题", name="title")
+ private String title;
+
+ @ApiModelProperty(value="商户号", name="merchantNo")
+ private String merchantNo;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/BalanceListParam.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/BalanceListParam.java
new file mode 100644
index 0000000..3c9c575
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/BalanceListParam.java
@@ -0,0 +1,18 @@
+package com.fuint.common.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 余额明细列表请求参数
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class BalanceListParam extends PageParam implements Serializable {
+
+ @ApiModelProperty(value="会员ID", name="userId")
+ private String userId;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/CartClearParam.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/CartClearParam.java
new file mode 100644
index 0000000..675f551
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/CartClearParam.java
@@ -0,0 +1,25 @@
+package com.fuint.common.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 删除购物车请求参数
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class CartClearParam extends PageParam implements Serializable {
+
+ @ApiModelProperty(value="购物车ID", name="cartId")
+ private List cartId;
+
+ @ApiModelProperty(value="挂单编码", name="hangNo")
+ private String hangNo;
+
+ @ApiModelProperty(value="下单会员ID", name="userId")
+ private Integer userId;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/CartListParam.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/CartListParam.java
new file mode 100644
index 0000000..c130ecd
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/CartListParam.java
@@ -0,0 +1,45 @@
+package com.fuint.common.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 购物车列表请求参数
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class CartListParam extends PageParam implements Serializable {
+
+ @ApiModelProperty(value="购物车ID", name="cartId")
+ private Integer cartId;
+
+ @ApiModelProperty(value="指定购物车ID,逗号分割", name="cartIds")
+ private String cartIds;
+
+ @ApiModelProperty(value="商品ID", name="goodsId")
+ private Integer goodsId;
+
+ @ApiModelProperty(value="卡券ID", name="couponId")
+ private Integer couponId;
+
+ @ApiModelProperty(value="商品SkuID", name="skuId")
+ private Integer skuId;
+
+ @ApiModelProperty(value="使用积分", name="point")
+ private String point;
+
+ @ApiModelProperty(value="购买数量", name="buyNum")
+ private Integer buyNum;
+
+ @ApiModelProperty(value="挂单编码", name="hangNo")
+ private String hangNo;
+
+ @ApiModelProperty(value="下单会员ID", name="userId")
+ private Integer userId;
+
+ @ApiModelProperty(value="订单模式", name="orderMode")
+ private String orderMode;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/CartSaveParam.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/CartSaveParam.java
new file mode 100644
index 0000000..27ded8e
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/CartSaveParam.java
@@ -0,0 +1,39 @@
+package com.fuint.common.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 保存购物车请求参数
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class CartSaveParam implements Serializable {
+
+ @ApiModelProperty(value="购物车ID", name="cartId")
+ private Integer cartId;
+
+ @ApiModelProperty(value="商品ID", name="goodsId")
+ private Integer goodsId;
+
+ @ApiModelProperty(value="商品SkuID", name="skuId")
+ private Integer skuId;
+
+ @ApiModelProperty(value="商品编码", name="skuNo")
+ private String skuNo;
+
+ @ApiModelProperty(value="购买数量", name="buyNum")
+ private Integer buyNum;
+
+ @ApiModelProperty(value="操作类型,+:增加,-:减少", name="action")
+ private String action;
+
+ @ApiModelProperty(value="挂单编码", name="hangNo")
+ private String hangNo;
+
+ @ApiModelProperty(value="下单会员ID", name="userId")
+ private Integer userId;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/CommissionRuleItemParam.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/CommissionRuleItemParam.java
new file mode 100644
index 0000000..82993d5
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/CommissionRuleItemParam.java
@@ -0,0 +1,31 @@
+package com.fuint.common.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 分销提成规则项目请求参数
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class CommissionRuleItemParam implements Serializable {
+
+ @ApiModelProperty("商品ID")
+ private Integer goodsId;
+
+ @ApiModelProperty("商品名称")
+ private String goodsName;
+
+ @ApiModelProperty("提成方式")
+ private String method;
+
+ @ApiModelProperty("散客值")
+ private BigDecimal visitorVal;
+
+ @ApiModelProperty("会员值")
+ private BigDecimal memberVal;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/CommissionRuleParam.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/CommissionRuleParam.java
new file mode 100644
index 0000000..f065937
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/CommissionRuleParam.java
@@ -0,0 +1,49 @@
+package com.fuint.common.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 分销提成规则请求参数
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class CommissionRuleParam implements Serializable {
+
+ @ApiModelProperty("自增ID")
+ private Integer id;
+
+ @ApiModelProperty("规则名称")
+ private String name;
+
+ @ApiModelProperty("分佣类型,member:会员分销;staff:员工提成")
+ private String type;
+
+ @ApiModelProperty("分佣对象")
+ private String target;
+
+ @ApiModelProperty("商户ID")
+ private Integer merchantId;
+
+ @ApiModelProperty("店铺ID")
+ private Integer storeId;
+
+ @ApiModelProperty("适用店铺ID列表")
+ private List storeIdList;
+
+ @ApiModelProperty("具体项目列表")
+ private List detailList;
+
+ @ApiModelProperty("备注")
+ private String description;
+
+ @ApiModelProperty("最后操作人")
+ private String operator;
+
+ @ApiModelProperty("状态")
+ private String status;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/ConfirmParam.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/ConfirmParam.java
new file mode 100644
index 0000000..7cfa40c
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/ConfirmParam.java
@@ -0,0 +1,24 @@
+package com.fuint.common.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 卡券核销请求参数
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class ConfirmParam implements Serializable {
+
+ @ApiModelProperty(value="核销码", name="code")
+ private String code;
+
+ @ApiModelProperty(value="核销金额", name="amount")
+ private String amount;
+
+ @ApiModelProperty(value="核销备注", name="remark")
+ private String remark;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/CouponInfoParam.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/CouponInfoParam.java
new file mode 100644
index 0000000..2833cb2
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/CouponInfoParam.java
@@ -0,0 +1,21 @@
+package com.fuint.common.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 卡券详情请求参数
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class CouponInfoParam implements Serializable {
+
+ @ApiModelProperty(value="卡券ID", name="couponId")
+ private Integer couponId;
+
+ @ApiModelProperty(value="会员卡券编码", name="userCouponCode")
+ private String userCouponCode;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/CouponListParam.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/CouponListParam.java
new file mode 100644
index 0000000..4097e59
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/CouponListParam.java
@@ -0,0 +1,36 @@
+package com.fuint.common.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 卡券列表请求参数
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class CouponListParam extends PageParam implements Serializable {
+
+ @ApiModelProperty(value="卡券类型", name="type")
+ private String type;
+
+ @ApiModelProperty(value="商户ID", name="merchantId")
+ private Integer merchantId;
+
+ @ApiModelProperty(value="领取所需积分", name="needPoint")
+ private Integer needPoint;
+
+ @ApiModelProperty(value="发放方式", name="sendWay")
+ private String sendWay;
+
+ @ApiModelProperty(value="排序类型", name="sortType")
+ private String sortType;
+
+ @ApiModelProperty(value="下单会员ID", name="userId")
+ private Integer userId;
+
+ @ApiModelProperty(value="状态", name="status")
+ private String status;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/CouponReceiveParam.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/CouponReceiveParam.java
new file mode 100644
index 0000000..442a34d
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/CouponReceiveParam.java
@@ -0,0 +1,27 @@
+package com.fuint.common.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 卡券领取请求参数
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class CouponReceiveParam implements Serializable {
+
+ @ApiModelProperty(value="卡券ID", name="couponId")
+ private Integer couponId;
+
+ @ApiModelProperty(value="领取数量", name="num")
+ private Integer num;
+
+ @ApiModelProperty(value="会员ID", name="userId")
+ private Integer userId;
+
+ @ApiModelProperty(value="领取码", name="receiveCode")
+ private String receiveCode;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/GiveListParam.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/GiveListParam.java
new file mode 100644
index 0000000..4249b28
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/GiveListParam.java
@@ -0,0 +1,21 @@
+package com.fuint.common.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 转增记录列表请求参数
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class GiveListParam extends PageParam implements Serializable {
+
+ @ApiModelProperty(value="转增对象手机号", name="mobile")
+ private String mobile;
+
+ @ApiModelProperty(value="类型,give = 转增,gived = 被转增", name="type")
+ private String type;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/GiveParam.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/GiveParam.java
new file mode 100644
index 0000000..e622a48
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/GiveParam.java
@@ -0,0 +1,36 @@
+package com.fuint.common.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 卡券转赠请求参数
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class GiveParam implements Serializable {
+
+ @ApiModelProperty(value="转增对象手机号", name="mobile")
+ private String mobile;
+
+ @ApiModelProperty(value="卡券ID,可逗号隔开", name="couponId")
+ private String couponId;
+
+ @ApiModelProperty(value="转赠备注", name="note")
+ private String note;
+
+ @ApiModelProperty(value="转赠留言", name="message")
+ private String message;
+
+ @ApiModelProperty(value="转赠人ID", name="userId")
+ private Integer userId;
+
+ @ApiModelProperty(value="商户ID", name="merchantId")
+ private Integer merchantId;
+
+ @ApiModelProperty(value="店铺ID", name="storeId")
+ private Integer storeId;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/GoodsInfoParam.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/GoodsInfoParam.java
new file mode 100644
index 0000000..b725ec8
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/GoodsInfoParam.java
@@ -0,0 +1,21 @@
+package com.fuint.common.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 商品详情请求参数
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class GoodsInfoParam implements Serializable {
+
+ @ApiModelProperty(value="商品ID", name="goodsId")
+ private String goodsId;
+
+ @ApiModelProperty(value="skuNo", name="skuNo")
+ private String skuNo;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/MemberInfoParam.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/MemberInfoParam.java
new file mode 100644
index 0000000..97ac58d
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/MemberInfoParam.java
@@ -0,0 +1,24 @@
+package com.fuint.common.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 会员查询请求参数
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class MemberInfoParam extends PageParam implements Serializable {
+
+ @ApiModelProperty(value="ID", name="id")
+ private String id;
+
+ @ApiModelProperty(value="手机号", name="mobile")
+ private String mobile;
+
+ @ApiModelProperty(value="会员号", name="userNo")
+ private String userNo;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/MemberListParam.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/MemberListParam.java
new file mode 100644
index 0000000..6d3ad4a
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/MemberListParam.java
@@ -0,0 +1,48 @@
+package com.fuint.common.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 会员列表请求参数
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class MemberListParam extends PageParam implements Serializable {
+
+ @ApiModelProperty(value="ID", name="id")
+ private String id;
+
+ @ApiModelProperty(value="手机号", name="mobile")
+ private String mobile;
+
+ @ApiModelProperty(value="会员名称", name="name")
+ private String name;
+
+ @ApiModelProperty(value="会员生日", name="birthday")
+ private String birthday;
+
+ @ApiModelProperty(value="会员号", name="userNo")
+ private String userNo;
+
+ @ApiModelProperty(value="会员等级", name="gradeId")
+ private String gradeId;
+
+ @ApiModelProperty(value="注册时间", name="regTime")
+ private String regTime;
+
+ @ApiModelProperty(value="活跃时间", name="activeTime")
+ private String activeTime;
+
+ @ApiModelProperty(value="会员有效期", name="memberTime")
+ private String memberTime;
+
+ @ApiModelProperty(value="数据类型,1)todayRegister:今日注册;2)todayActive:今日活跃", name="dataType")
+ private String dataType;
+
+ @ApiModelProperty(value="会员状态", name="status")
+ private String status;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/OrderDetailParam.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/OrderDetailParam.java
new file mode 100644
index 0000000..46a948f
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/OrderDetailParam.java
@@ -0,0 +1,18 @@
+package com.fuint.common.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 订单详情请求参数
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class OrderDetailParam implements Serializable {
+
+ @ApiModelProperty(value="订单ID", name="orderId")
+ private String orderId;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/OrderListParam.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/OrderListParam.java
new file mode 100644
index 0000000..d9429c9
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/OrderListParam.java
@@ -0,0 +1,69 @@
+package com.fuint.common.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 订单列表请求参数
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class OrderListParam extends PageParam implements Serializable {
+
+ @ApiModelProperty(value="ID", name="id")
+ private String id;
+
+ @ApiModelProperty(value="会员ID", name="userId")
+ private String userId;
+
+ @ApiModelProperty(value="商户ID", name="merchantId")
+ private Integer merchantId;
+
+ @ApiModelProperty(value="店铺ID", name="storeId")
+ private Integer storeId;
+
+ @ApiModelProperty(value="店铺ID,逗号分隔", name="storeIds")
+ private String storeIds;
+
+ @ApiModelProperty(value="订单状态", name="status")
+ private String status;
+
+ @ApiModelProperty(value="支付状态", name="payStatus")
+ private String payStatus;
+
+ @ApiModelProperty(value="结算状态", name="settleStatus")
+ private String settleStatus;
+
+ @ApiModelProperty(value="数据类型,1)toPay:待支付;2)paid:已支付;3)cancel:已取消", name="dataType")
+ private String dataType;
+
+ @ApiModelProperty(value="订单类型", name="type")
+ private String type;
+
+ @ApiModelProperty(value="订单号", name="orderSn")
+ private String orderSn;
+
+ @ApiModelProperty(value="会员手机号", name="mobile")
+ private String mobile;
+
+ @ApiModelProperty(value="订单模式,1)oneself:自取,2)express:配送", name="orderMode")
+ private String orderMode;
+
+ @ApiModelProperty(value="员工ID(销售人员)", name="staffId")
+ private String staffId;
+
+ @ApiModelProperty(value="卡券ID", name="couponId")
+ private String couponId;
+
+ @ApiModelProperty(value="时间类型", name="timeType")
+ private String timeType;
+
+ @ApiModelProperty(value="开始时间", name="startTime")
+ private String startTime;
+
+ @ApiModelProperty(value="结束时间", name="endTime")
+ private String endTime;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/PageParam.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/PageParam.java
new file mode 100644
index 0000000..47886dc
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/PageParam.java
@@ -0,0 +1,69 @@
+package com.fuint.common.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+
+/**
+ * 分页请求参数
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public class PageParam implements Serializable {
+ private static final long serialVersionUID = -1833130751169582924L;
+
+ @ApiModelProperty("当前页数")
+ private Integer page = 1;
+
+ @ApiModelProperty("分页大小")
+ private int pageSize = 20;
+
+ /**
+ * 排序字段
+ */
+ @ApiModelProperty(value="排序字段",name="orderBy")
+ private String orderBy;
+
+ /**
+ * 排序方式
+ */
+ @ApiModelProperty(value="排序方式",name="order")
+ private String order;
+
+ public PageParam() {
+ // empty
+ }
+
+ public Integer getPage() {
+ return this.page;
+ }
+
+ public Integer getPageSize() {
+ return this.pageSize;
+ }
+
+ public void setPage(int page) {
+ this.page = page;
+ }
+
+ public void setPageSize(int pageSize) {
+ this.pageSize = pageSize;
+ }
+
+ public String getOrderBy() {
+ return orderBy;
+ }
+
+ public void setOrderBy(String orderBy) {
+ this.orderBy = orderBy;
+ }
+
+ public String getOrder() {
+ return order;
+ }
+
+ public void setOrder(String order) {
+ this.order = order;
+ }
+}
+
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/RechargeParam.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/RechargeParam.java
new file mode 100644
index 0000000..552525a
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/RechargeParam.java
@@ -0,0 +1,21 @@
+package com.fuint.common.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 充值请求参数
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class RechargeParam implements Serializable {
+
+ @ApiModelProperty(value="充值金额", name="rechargeAmount")
+ private String rechargeAmount;
+
+ @ApiModelProperty(value="自定义充值金额", name="customAmount")
+ private String customAmount;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/SettlementParam.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/SettlementParam.java
new file mode 100644
index 0000000..018b957
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/param/SettlementParam.java
@@ -0,0 +1,75 @@
+package com.fuint.common.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 订单结算请求参数
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Data
+public class SettlementParam implements Serializable {
+
+ @ApiModelProperty(value="购物车Id,逗号分隔", name="cartIds")
+ private String cartIds;
+
+ @ApiModelProperty(value="购买对象,购买储值卡、升级会员等级必填", name="targetId")
+ private String targetId;
+
+ @ApiModelProperty(value="购买储值卡数量", name="selectNum")
+ private String selectNum;
+
+ @ApiModelProperty(value="结算备注", name="remark")
+ private String remark;
+
+ @ApiModelProperty(value="订单类型,payment:付款订单、goods:商品订单、recharge:充值订单、prestore:储值卡订单、member:会员升级订单", name="type")
+ private String type;
+
+ @ApiModelProperty(value="支付金额,付款类订单必填", name="payAmount")
+ private String payAmount;
+
+ @ApiModelProperty(value="使用积分数量", name="usePoint")
+ private Integer usePoint;
+
+ @ApiModelProperty(value="使用卡券ID", name="couponId")
+ private Integer couponId;
+
+ @ApiModelProperty(value="支付类型,CASH:现金支付,JSAPI:微信支付,MICROPAY:微信扫码支付,BALANCE:余额支付,ALISCAN:支付宝扫码", name="payType")
+ private String payType;
+
+ @ApiModelProperty(value="PC端扫码支付的二维码", name="authCode")
+ private String authCode;
+
+ @ApiModelProperty(value="会员ID(代客下单用到)", name="userId")
+ private Integer userId;
+
+ @ApiModelProperty(value="会员手机号", name="mobile")
+ private String mobile;
+
+ @ApiModelProperty(value="实付金额(收银台用到)", name="cashierPayAmount")
+ private String cashierPayAmount;
+
+ @ApiModelProperty(value="优惠金额(收银台用到)", name="cashierDiscountAmount")
+ private String cashierDiscountAmount;
+
+ @ApiModelProperty(value="商品ID", name="goodsId")
+ private Integer goodsId;
+
+ @ApiModelProperty(value="商品skuID", name="skuId")
+ private Integer skuId;
+
+ @ApiModelProperty(value="购买数量", name="buyNum")
+ private Integer buyNum;
+
+ @ApiModelProperty(value="订单模式,配送(express)或自提(oneself)", name="orderMode")
+ private String orderMode;
+
+ @ApiModelProperty(value="订单ID", name="orderId")
+ private Integer orderId;
+
+ @ApiModelProperty(value="是否微信客户端", name="isWechat")
+ private String isWechat;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/permission/PermissionService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/permission/PermissionService.java
new file mode 100644
index 0000000..15541fe
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/permission/PermissionService.java
@@ -0,0 +1,73 @@
+package com.fuint.common.permission;
+
+import com.fuint.common.dto.AccountInfo;
+import com.fuint.common.service.SourceService;
+import com.fuint.common.util.AuthUserUtil;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.repository.model.TSource;
+import com.fuint.utils.StringUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 权限控制业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Service("pms")
+public class PermissionService {
+
+ /**
+ * 所有权限标识
+ */
+ private static final String ALL_PERMISSION = "*:*:*";
+
+ /**
+ * 后台菜单接口
+ * */
+ @Resource
+ SourceService sourceService;
+
+ /**
+ * 验证用户是否具备某权限
+ *
+ * @param permission 权限字符串
+ * @return 用户是否具备某权限
+ */
+ public boolean hasPermission(String permission) throws BusinessCheckException {
+ if (StringUtil.isEmpty(permission)) {
+ return false;
+ }
+
+ AccountInfo accountInfo = AuthUserUtil.get();
+ if (accountInfo == null) {
+ return false;
+ }
+
+ Set allPermission = new HashSet<>();
+ List sources = sourceService.getMenuListByUserId(accountInfo.getMerchantId(), accountInfo.getId());
+ if (sources != null && sources.size() > 0) {
+ for (TSource tSource : sources) {
+ allPermission.add(tSource.getPath().replaceAll("/", ":"));
+ }
+ }
+
+ return hasPermissions(allPermission, permission);
+ }
+
+ /**
+ * 判断是否包含权限
+ *
+ * @param permissions 权限列表
+ * @param permission 权限字符串
+ * @return boolean
+ */
+ private boolean hasPermissions(Set permissions, String permission) {
+ return permissions.contains(ALL_PERMISSION) || permissions.contains(StringUtil.trim(permission));
+ }
+}
\ No newline at end of file
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/AccountService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/AccountService.java
new file mode 100644
index 0000000..bedfc09
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/AccountService.java
@@ -0,0 +1,122 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.common.dto.AccountDto;
+import com.fuint.common.dto.AccountInfo;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.module.backendApi.request.LoginRequest;
+import com.fuint.module.backendApi.response.LoginResponse;
+import com.fuint.repository.model.TAccount;
+import com.fuint.repository.model.TDuty;
+import java.util.List;
+
+/**
+ * 后台账号接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface AccountService extends IService {
+
+ /**
+ * 分页查询账号列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse getAccountListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 根据账号名称获取账号信息
+ *
+ * @param userName 账号名称
+ * @return
+ * */
+ AccountInfo getAccountByName(String userName);
+
+ /**
+ * 获取用户信息
+ *
+ * @param id 账号ID
+ * @return
+ */
+ TAccount getAccountInfoById(Integer id);
+
+ /**
+ * 创建账号信息
+ *
+ * @param accountInfo 账号信息
+ * @param duties 角色
+ * @return
+ * */
+ TAccount createAccountInfo(TAccount accountInfo, List duties) throws BusinessCheckException;
+
+ /**
+ * 获取账号角色ID
+ *
+ * @param accountId 账号ID
+ * @return
+ * */
+ List getRoleIdsByAccountId(Integer accountId);
+
+ /**
+ * 修改账户
+ *
+ * @param tAccount 账户实体
+ * @throws BusinessCheckException
+ * @return
+ */
+ void editAccount(TAccount tAccount, List duties) throws BusinessCheckException;
+
+ /**
+ * 根据账户名称获取账户所分配的角色ID集合
+ *
+ * @param accountId 账户
+ * @return 角色ID集合
+ */
+ List getDutyIdsByAccountId(long accountId);
+
+ /**
+ * 更新账户信息
+ *
+ * @param tAccount
+ * @return
+ */
+ void updateAccount(TAccount tAccount);
+
+ /**
+ * 删除后台账号
+ *
+ * @param accountId 账号ID
+ * @return
+ * */
+ void deleteAccount(Long accountId);
+
+ /**
+ * 密码加密
+ *
+ * @param tAccount 账号信息
+ * @return
+ * */
+ void entryptPassword(TAccount tAccount);
+
+ /**
+ * 获取加密密码
+ *
+ * @param password
+ * @param salt
+ * @return
+ * */
+ String getEntryptPassword(String password, String salt);
+
+ /**
+ * 登录后台系统
+ *
+ * @param loginRequest 登录参数
+ * @param userAgent 登录浏览器
+ * @return
+ * */
+ LoginResponse doLogin(LoginRequest loginRequest, String userAgent) throws BusinessCheckException;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/ActionLogService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/ActionLogService.java
new file mode 100644
index 0000000..fac3260
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/ActionLogService.java
@@ -0,0 +1,31 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.model.TActionLog;
+
+/**
+ * 后台日志服务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface ActionLogService extends IService {
+
+ /**
+ * 保存日志
+ *
+ * @param actionLog
+ * @return
+ */
+ void saveActionLog(TActionLog actionLog);
+
+ /**
+ * 获取分页查询数据
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse findLogsByPagination(PaginationRequest paginationRequest);
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/AddressService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/AddressService.java
new file mode 100644
index 0000000..224e111
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/AddressService.java
@@ -0,0 +1,42 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.repository.model.MtAddress;
+import com.fuint.framework.exception.BusinessCheckException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 收货地址业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface AddressService extends IService {
+
+ /**
+ * 保存收货地址
+ *
+ * @param mtAddress
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtAddress saveAddress(MtAddress mtAddress) throws BusinessCheckException;
+
+ /**
+ * 根据ID获取Banner信息
+ *
+ * @param id 地址ID
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtAddress detail(Integer id) throws BusinessCheckException;
+
+ /**
+ * 根据条件查询地址列表
+ *
+ * @param params 查询参数
+ * @return
+ * */
+ List queryListByParams(Map params) throws BusinessCheckException;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/AlipayService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/AlipayService.java
new file mode 100644
index 0000000..72cca79
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/AlipayService.java
@@ -0,0 +1,62 @@
+package com.fuint.common.service;
+
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.web.ResponseObject;
+import com.fuint.repository.model.MtOrder;
+import com.fuint.repository.model.MtUser;
+import java.math.BigDecimal;
+import java.util.Map;
+
+/**
+ * 支付宝相关业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface AlipayService {
+
+ /**
+ * 创建预支付订单
+ *
+ * @param userInfo 会员信息
+ * @param orderInfo 订单信息
+ * @param payAmount 支付金额
+ * @param authCode 付款码
+ * @param giveAmount 赠送金额
+ * @param ip 支付IP地址
+ * @param platform 支付平台
+ * @return
+ * */
+ ResponseObject createPrepayOrder(MtUser userInfo, MtOrder orderInfo, Integer payAmount, String authCode, Integer giveAmount, String ip, String platform) throws BusinessCheckException;
+
+ /**
+ * 支付回调
+ *
+ * @param params 请求参数
+ * @return
+ * */
+ Boolean checkCallBack(Map params) throws Exception;
+
+ /**
+ * 查询支付订单
+ *
+ * @param storeId 店铺ID
+ * @param tradeNo 交易单号
+ * @param orderSn 订单号
+ * @return
+ * */
+ Map queryPaidOrder(Integer storeId, String tradeNo, String orderSn) throws BusinessCheckException;
+
+ /**
+ * 发起售后退款
+ *
+ * @param storeId 店铺ID
+ * @param orderSn 订单号
+ * @param totalAmount 订单总金额
+ * @param refundAmount 售后金额
+ * @param platform 订单平台
+ * @return
+ * */
+ Boolean doRefund(Integer storeId, String orderSn, BigDecimal totalAmount, BigDecimal refundAmount, String platform) throws BusinessCheckException;
+
+}
\ No newline at end of file
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/ArticleService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/ArticleService.java
new file mode 100644
index 0000000..d0f8292
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/ArticleService.java
@@ -0,0 +1,67 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.common.dto.ArticleDto;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.model.MtArticle;
+import com.fuint.framework.exception.BusinessCheckException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 文章业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface ArticleService extends IService {
+
+ /**
+ * 分页查询文章列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse queryArticleListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 添加文章
+ *
+ * @param articleDto
+ * @throws BusinessCheckException
+ */
+ MtArticle addArticle(ArticleDto articleDto) throws BusinessCheckException;
+
+ /**
+ * 根据ID获取文章信息
+ *
+ * @param id 文章ID
+ * @throws BusinessCheckException
+ */
+ MtArticle queryArticleById(Integer id) throws BusinessCheckException;
+
+ /**
+ * 根据ID获取文章详情
+ *
+ * @param id 文章ID
+ * @throws BusinessCheckException
+ */
+ ArticleDto getArticleDetail(Integer id) throws BusinessCheckException;
+
+ /**
+ * 更新文章
+ * @param articleDto
+ * @throws BusinessCheckException
+ * */
+ MtArticle updateArticle(ArticleDto articleDto) throws BusinessCheckException;
+
+ /**
+ * 根据条件搜索文章
+ *
+ * @param params
+ * @return
+ * */
+ List queryArticleListByParams(Map params) throws BusinessCheckException;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/BalanceService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/BalanceService.java
new file mode 100644
index 0000000..0a5efdb
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/BalanceService.java
@@ -0,0 +1,56 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.common.dto.AccountInfo;
+import com.fuint.common.dto.BalanceDto;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.model.MtBalance;
+import java.util.List;
+
+/**
+ * 余额业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface BalanceService extends IService {
+
+ /**
+ * 分页查询余额列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse queryBalanceListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 添加余额记录
+ *
+ * @param reqDto
+ * @param updateBalance
+ * @throws BusinessCheckException
+ */
+ Boolean addBalance(MtBalance reqDto, Boolean updateBalance) throws BusinessCheckException;
+
+ /**
+ * 发放余额
+ *
+ * @param accountInfo
+ * @param object
+ * @param userIds
+ * @param amount
+ * @param remark
+ * @return
+ */
+ void distribute(AccountInfo accountInfo, String object, String userIds, String amount, String remark) throws BusinessCheckException;
+
+ /**
+ * 获取订单余额记录
+ *
+ * @param orderSn
+ * @return
+ * */
+ List getBalanceListByOrderSn(String orderSn) throws BusinessCheckException;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/BannerService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/BannerService.java
new file mode 100644
index 0000000..30d9607
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/BannerService.java
@@ -0,0 +1,72 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.model.MtBanner;
+import com.fuint.common.dto.BannerDto;
+import com.fuint.framework.exception.BusinessCheckException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 焦点图业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface BannerService extends IService {
+
+ /**
+ * 分页查询列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse queryBannerListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 添加Banner
+ *
+ * @param reqBannerDto
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtBanner addBanner(BannerDto reqBannerDto) throws BusinessCheckException;
+
+ /**
+ * 根据ID获取Banner信息
+ *
+ * @param id Banner ID
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtBanner queryBannerById(Integer id) throws BusinessCheckException;
+
+ /**
+ * 根据ID删除焦点图
+ *
+ * @param id ID
+ * @param operator 操作人
+ * @throws BusinessCheckException
+ * @return
+ */
+ void deleteBanner(Integer id, String operator) throws BusinessCheckException;
+
+ /**
+ * 更新焦点图
+ * @param bannerDto
+ * @throws BusinessCheckException
+ * @return
+ * */
+ MtBanner updateBanner(BannerDto bannerDto) throws BusinessCheckException;
+
+ /**
+ * 根据条件搜索焦点图
+ *
+ * @param params 查询参数
+ * @throws BusinessCheckException
+ * @return
+ * */
+ List queryBannerListByParams(Map params) throws BusinessCheckException;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/CaptchaService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/CaptchaService.java
new file mode 100644
index 0000000..b78d771
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/CaptchaService.java
@@ -0,0 +1,43 @@
+package com.fuint.common.service;
+
+import javax.servlet.http.HttpSession;
+import java.awt.image.BufferedImage;
+
+/**
+ * 图形验证码插件服务类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface CaptchaService {
+
+ /**
+ * 生成图形验证码,并保存至Session
+ * @param session Session
+ * @return BufferedImage
+ */
+ BufferedImage getCode(HttpSession session);
+
+ /**
+ * 图形验证码校验
+ * @param code 输入的验证码
+ * @param session Session
+ * @return Boolean
+ */
+ Boolean checkCode(String code, HttpSession session);
+
+ /**
+ * 生成图形验证码
+ * @return BufferedImage
+ */
+ BufferedImage getCodeByUuid(String uuid);
+
+ /**
+ * 图形验证码校验
+ * @param code 输入的验证码
+ * @param uuid uuid
+ * @return Boolean
+ */
+ Boolean checkCodeByUuid(String code, String uuid);
+
+}
\ No newline at end of file
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/CartService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/CartService.java
new file mode 100644
index 0000000..d4eca6f
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/CartService.java
@@ -0,0 +1,80 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.repository.model.MtCart;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 购物车业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface CartService extends IService {
+
+ /**
+ * 切换购物车给会员
+ *
+ * @param userId
+ * @param cartIds
+ * @return
+ * */
+ Boolean switchCartIds(Integer userId, String cartIds) throws BusinessCheckException;
+
+ /**
+ * 保存购物车
+ *
+ * @param reqDto
+ * @param action + or - or =
+ * @throws BusinessCheckException
+ * @return
+ */
+ Integer saveCart(MtCart reqDto, String action) throws BusinessCheckException;
+
+ /**
+ * 删除购物车
+ *
+ * @param cartIds 购物车ID
+ * @throws BusinessCheckException
+ * @return
+ */
+ void removeCart(String cartIds) throws BusinessCheckException;
+
+ /**
+ * 删除购物车
+ *
+ * @param hangNo 挂单序号
+ * @throws BusinessCheckException
+ * @return
+ */
+ void removeCartByHangNo(String hangNo) throws BusinessCheckException;
+
+ /**
+ * 清空会员购物车
+ *
+ * @param userId 会员ID
+ * @throws BusinessCheckException
+ * @return
+ */
+ void clearCart(Integer userId) throws BusinessCheckException;
+
+ /**
+ * 根据条件查找
+ *
+ * @param params 查询参数
+ * @return
+ * */
+ List queryCartListByParams(Map params) throws BusinessCheckException;
+
+ /**
+ * 挂单
+ *
+ * @param cartId 购物车ID
+ * @param hangNo 挂单序号
+ * @param isVisitor 是否游客
+ * @return
+ */
+ MtCart setHangNo(Integer cartId, String hangNo, String isVisitor) throws BusinessCheckException;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/CateService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/CateService.java
new file mode 100644
index 0000000..550601b
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/CateService.java
@@ -0,0 +1,70 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.common.dto.GoodsCateDto;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.model.MtGoodsCate;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 商品分类业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface CateService extends IService {
+
+ /**
+ * 分页查询列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse queryCateListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 添加商品分类
+ *
+ * @param reqDto 分类参数
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtGoodsCate addCate(MtGoodsCate reqDto) throws BusinessCheckException;
+
+ /**
+ * 根据ID获取商品分类信息
+ *
+ * @param id ID
+ * @throws BusinessCheckException
+ */
+ MtGoodsCate queryCateById(Integer id) throws BusinessCheckException;
+
+ /**
+ * 根据ID删除
+ *
+ * @param id 分类ID
+ * @param operator 操作人
+ * @throws BusinessCheckException
+ * @return
+ */
+ void deleteCate(Integer id, String operator) throws BusinessCheckException;
+
+ /**
+ * 更新分类
+ * @param reqDto 分类参数
+ * @throws BusinessCheckException
+ * @return
+ * */
+ MtGoodsCate updateCate(MtGoodsCate reqDto) throws BusinessCheckException;
+
+ /**
+ * 根据条件搜索分类
+ *
+ * @param params 查询参数
+ * @return
+ * */
+ List queryCateListByParams(Map params) throws BusinessCheckException;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/CommissionCashService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/CommissionCashService.java
new file mode 100644
index 0000000..17a1461
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/CommissionCashService.java
@@ -0,0 +1,74 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.common.dto.CommissionCashDto;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.module.backendApi.request.CommissionCashRequest;
+import com.fuint.module.backendApi.request.CommissionSettleConfirmRequest;
+import com.fuint.module.backendApi.request.CommissionSettleRequest;
+import com.fuint.repository.model.MtCommissionCash;
+
+/**
+ * 分销提成记录业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface CommissionCashService extends IService {
+
+ /**
+ * 分页查询列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse queryCommissionCashByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 计算订单分销提成
+ *
+ * @param commissionSettleRequest 结算参数
+ * @throws BusinessCheckException
+ * @return
+ */
+ String settleCommission(CommissionSettleRequest commissionSettleRequest) throws BusinessCheckException;
+
+ /**
+ * 根据ID获取记录信息
+ *
+ * @param id 记录ID
+ * @throws BusinessCheckException
+ * @return
+ */
+ CommissionCashDto queryCommissionCashById(Integer id) throws BusinessCheckException;
+
+ /**
+ * 更新分销提成记录
+ *
+ * @param commissionCashRequest 请求参数
+ * @throws BusinessCheckException
+ * @return
+ */
+ void updateCommissionCash(CommissionCashRequest commissionCashRequest) throws BusinessCheckException;
+
+ /**
+ * 结算确认
+ *
+ * @param requestParam 确认参数
+ * @throws BusinessCheckException
+ * @return
+ */
+ void confirmCommissionCash(CommissionSettleConfirmRequest requestParam) throws BusinessCheckException;
+
+ /**
+ * 取消结算
+ *
+ * @param requestParam 取消参数
+ * @throws BusinessCheckException
+ * @return
+ */
+ void cancelCommissionCash(CommissionSettleConfirmRequest requestParam) throws BusinessCheckException;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/CommissionLogService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/CommissionLogService.java
new file mode 100644
index 0000000..13529d9
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/CommissionLogService.java
@@ -0,0 +1,53 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.common.dto.CommissionLogDto;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.module.backendApi.request.CommissionLogRequest;
+import com.fuint.repository.model.MtCommissionLog;
+
+/**
+ * 分销提成记录业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface CommissionLogService extends IService {
+
+ /**
+ * 分页查询列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse queryCommissionLogByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 计算订单分销提成
+ *
+ * @param orderId 订单ID
+ * @throws BusinessCheckException
+ * @return
+ */
+ void calculateCommission(Integer orderId) throws BusinessCheckException;
+
+ /**
+ * 根据ID获取记录信息
+ *
+ * @param id 记录ID
+ * @throws BusinessCheckException
+ * @return
+ */
+ CommissionLogDto queryCommissionLogById(Integer id) throws BusinessCheckException;
+
+ /**
+ * 更新分销提成记录
+ *
+ * @param requestParam 请求参数
+ * @throws BusinessCheckException
+ * @return
+ */
+ void updateCommissionLog(CommissionLogRequest requestParam) throws BusinessCheckException;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/CommissionRuleService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/CommissionRuleService.java
new file mode 100644
index 0000000..1501518
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/CommissionRuleService.java
@@ -0,0 +1,53 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.common.dto.CommissionRuleDto;
+import com.fuint.common.param.CommissionRuleParam;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.repository.model.MtCommissionRule;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 分销提成规则业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface CommissionRuleService extends IService {
+
+ /**
+ * 分页查询列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse queryDataByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 添加分销提成规则
+ *
+ * @param commissionRule
+ * @throws BusinessCheckException
+ */
+ MtCommissionRule addCommissionRule(CommissionRuleParam commissionRule) throws BusinessCheckException;
+
+ /**
+ * 根据ID获取规则信息
+ *
+ * @param id
+ * @throws BusinessCheckException
+ */
+ CommissionRuleDto queryCommissionRuleById(Integer id) throws BusinessCheckException;
+
+ /**
+ * 更新数据
+ * @param commissionRule
+ * @throws BusinessCheckException
+ * */
+ MtCommissionRule updateCommissionRule(CommissionRuleParam commissionRule) throws BusinessCheckException;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/ConfirmLogService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/ConfirmLogService.java
new file mode 100644
index 0000000..91863c9
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/ConfirmLogService.java
@@ -0,0 +1,47 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.common.dto.ConfirmLogDto;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.model.MtConfirmLog;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 核销记录业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface ConfirmLogService extends IService {
+
+ /**
+ * 分页查询会员卡券核销列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse queryConfirmLogListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 获取卡券核销次数
+ * @param userCouponId
+ * @return
+ * */
+ Long getConfirmNum(Integer userCouponId) throws BusinessCheckException;
+
+ /**
+ * 获取卡券核销列表
+ * @param userCouponId
+ * @return
+ * */
+ List getConfirmList(Integer userCouponId) throws BusinessCheckException;
+
+ /**
+ * 获取核销总数
+ * */
+ Long getConfirmCount(Integer merchantId, Integer storeId, Date beginTime, Date endTime) throws BusinessCheckException;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/CouponGroupService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/CouponGroupService.java
new file mode 100644
index 0000000..becf8d1
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/CouponGroupService.java
@@ -0,0 +1,110 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.common.dto.GroupDataDto;
+import com.fuint.common.dto.ReqCouponGroupDto;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.model.MtCouponGroup;
+import org.springframework.web.multipart.MultipartFile;
+import javax.servlet.http.HttpServletRequest;
+import org.springframework.ui.Model;
+import java.math.BigDecimal;
+
+/**
+ * 卡券分组业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface CouponGroupService extends IService {
+
+ /**
+ * 分页查询分组列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse queryCouponGroupListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 添加卡券分组
+ *
+ * @param reqCouponGroupDto
+ * @throws BusinessCheckException
+ */
+ MtCouponGroup addCouponGroup(ReqCouponGroupDto reqCouponGroupDto) throws BusinessCheckException;
+
+ /**
+ * 修改卡券分组
+ *
+ * @param reqCouponGroupDto
+ * @throws BusinessCheckException
+ */
+ MtCouponGroup updateCouponGroup(ReqCouponGroupDto reqCouponGroupDto) throws BusinessCheckException;
+
+ /**
+ * 根据组ID获取分组信息
+ *
+ * @param id 分组ID
+ * @throws BusinessCheckException
+ */
+ MtCouponGroup queryCouponGroupById(Integer id) throws BusinessCheckException;
+
+ /**
+ * 根据分组ID 删除分组信息
+ *
+ * @param id 分组ID
+ * @param operator 操作人
+ * @throws BusinessCheckException
+ */
+ void deleteCouponGroup(Integer id, String operator) throws BusinessCheckException;
+
+ /**
+ * 根据分组ID 获取券种类数量
+ *
+ * @param id 分组ID
+ * @throws BusinessCheckException
+ */
+ Integer getCouponNum(Integer id) throws BusinessCheckException;
+
+ /**
+ * 根据分组ID 获取券总价值
+ *
+ * @param id 分组ID
+ * @throws BusinessCheckException
+ */
+ BigDecimal getCouponMoney(Integer id) throws BusinessCheckException;
+
+ /**
+ * 获取已发放套数
+ *
+ * @param id 分组ID
+ * @throws BusinessCheckException
+ * */
+ Integer getSendNum(Integer id) throws BusinessCheckException;
+
+ /**
+ * 导入发券列表
+ *
+ * @param file excel文件
+ * @param operator 操作者
+ * */
+ String importSendCoupon(MultipartFile file, String operator, String filePath) throws BusinessCheckException;
+
+ /**
+ * 保存文件
+ *
+ * @param file excel文件
+ * @param request 操作者
+ * */
+ String saveExcelFile(MultipartFile file, HttpServletRequest request) throws Exception;
+
+ /**
+ * 获取分组统计数据
+ *
+ * @param groupId 分组ID
+ * */
+ GroupDataDto getGroupData(Integer groupId, HttpServletRequest request, Model model) throws BusinessCheckException;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/CouponService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/CouponService.java
new file mode 100644
index 0000000..fdd13cf
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/CouponService.java
@@ -0,0 +1,169 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.common.dto.ReqCouponDto;
+import com.fuint.common.param.CouponListParam;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.framework.web.ResponseObject;
+import com.fuint.repository.model.MtCoupon;
+import com.fuint.repository.model.MtUserCoupon;
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.util.List;
+
+/**
+ * 卡券业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface CouponService extends IService {
+
+ /**
+ * 分页查询卡券列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse queryCouponListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 保存卡券
+ *
+ * @param reqCouponDto
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtCoupon saveCoupon(ReqCouponDto reqCouponDto) throws BusinessCheckException, ParseException;
+
+ /**
+ * 根据ID获取卡券信息
+ *
+ * @param id 卡券ID
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtCoupon queryCouponById(Integer id) throws BusinessCheckException;
+
+ /**
+ * 删除卡券信息
+ *
+ * @param id 卡券ID
+ * @param operator 操作人
+ * @throws BusinessCheckException
+ * @return
+ */
+ void deleteCoupon(Long id, String operator) throws BusinessCheckException;
+
+ /**
+ * 获取卡券列表
+ * @param couponListParam 查询参数
+ * @throws BusinessCheckException
+ * */
+ ResponseObject findCouponList(CouponListParam couponListParam) throws BusinessCheckException;
+
+ /**
+ * 发放卡券
+ *
+ * @param couponId 券ID
+ * @param userId 会员ID
+ * @param num 发放套数
+ * @param sendMessage 是否发送消息
+ * @param uuid 批次号
+ * @param operator 操作人
+ * @throws BusinessCheckException
+ * @return
+ */
+ void sendCoupon(Integer couponId, Integer userId, Integer num, Boolean sendMessage, String uuid, String operator) throws BusinessCheckException;
+
+ /**
+ * 发放卡券
+ *
+ * @param couponId 券ID
+ * @param userIds 会员ID
+ * @param num 发放套数
+ * @param uuid 批次号
+ * @param operator 操作人
+ * @throws BusinessCheckException
+ * @return
+ */
+ Boolean batchSendCoupon(Integer couponId, List userIds, Integer num, String uuid, String operator) throws BusinessCheckException;
+
+ /**
+ * 根据分组获取卡券列表
+ * @param groupId 查询参数
+ * @throws BusinessCheckException
+ * @return
+ * */
+ List queryCouponListByGroupId(Integer groupId) throws BusinessCheckException;
+
+ /**
+ * 核销卡券
+ * @param userCouponId 用户券ID
+ * @param userId 核销会员ID
+ * @param storeId 店铺ID
+ * @param orderId 订单ID
+ * @param amount 核销金额
+ * @param remark 核销备注
+ * @throws BusinessCheckException
+ * @return
+ * */
+ String useCoupon(Integer userCouponId, Integer userId, Integer storeId, Integer orderId, BigDecimal amount, String remark) throws BusinessCheckException;
+
+ /**
+ * 根据券ID删除个人卡券
+ *
+ * @param id 券ID
+ * @param operator 操作人
+ * @throws BusinessCheckException
+ * @return
+ */
+ void deleteUserCoupon(Integer id, String operator) throws BusinessCheckException;
+
+ /**
+ * 根据券ID 撤销个人卡券消费流水
+ *
+ * @param id 消费流水ID
+ * @param userCouponId 用户卡券ID
+ * @param operator 操作人
+ * @throws BusinessCheckException
+ * @return
+ */
+ void rollbackUserCoupon(Integer id, Integer userCouponId,String operator) throws BusinessCheckException;
+
+ /**
+ * 根据ID获取用户卡券信息
+ * @param userCouponId 查询参数
+ * @throws BusinessCheckException
+ * @return
+ * */
+ MtUserCoupon queryUserCouponById(Integer userCouponId) throws BusinessCheckException;
+
+ /**
+ * 根据批次撤销卡券
+ * @param id ID
+ * @param uuid 批次ID
+ * @param operator 操作人
+ * @throws BusinessCheckException
+ * @return
+ */
+ void removeUserCoupon(Long id, String uuid, String operator) throws BusinessCheckException;
+
+ /**
+ * 判断卡券码是否过期
+ * @param code 券码
+ * @return
+ * */
+ boolean codeExpired(String code);
+
+ /**
+ * 判断卡券是否有效
+ *
+ * @param coupon
+ * @param userCoupon
+ * @return
+ * */
+ boolean isCouponEffective(MtCoupon coupon, MtUserCoupon userCoupon);
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/DutyService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/DutyService.java
new file mode 100644
index 0000000..08837a8
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/DutyService.java
@@ -0,0 +1,121 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.module.backendApi.request.DutyStatusRequest;
+import com.fuint.repository.model.TDuty;
+import com.fuint.repository.model.TSource;
+import com.fuint.common.domain.TreeNode;
+import java.util.List;
+
+/**
+ * 角色服务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface DutyService extends IService {
+
+ /**
+ * 角色保存方法
+ *
+ * @param duty 角色信息
+ * @return
+ */
+ void saveDuty(TDuty duty, List sources) throws BusinessCheckException;
+
+ /**
+ * 获取有效的角色集合
+ *
+ * @param merchantId 商户ID
+ * @param accountId 账号ID
+ * @return
+ */
+ List getAvailableRoles(Integer merchantId, Integer accountId);
+
+ /**
+ * 根据ID获取角色实体
+ *
+ * @param roleId 角色ID
+ * @return
+ */
+ TDuty getRoleById(Long roleId);
+
+ /**
+ * 角色信息分页查询
+ *
+ * @param paginationRequest 分页查询请求对象
+ * @return 分页查询结果对象
+ */
+ PaginationResponse findDutiesByPagination(PaginationRequest paginationRequest);
+
+ /**
+ * 根据ID数组获取角色集合
+ *
+ * @param ids 角色ID
+ * @return
+ */
+ List findDatasByIds(String[] ids);
+
+ /**
+ * 删除方法
+ *
+ * @param merchantId 商户ID
+ * @param dutyId 角色ID
+ * @return
+ */
+ void deleteDuty(Integer merchantId, long dutyId) throws BusinessCheckException;
+
+ /**
+ * 更新状态
+ *
+ * @param merchantId
+ * @param dutyStatusRequest
+ * @return
+ */
+ void updateStatus(Integer merchantId, DutyStatusRequest dutyStatusRequest) throws BusinessCheckException;
+
+ /**
+ * 修改角色
+ *
+ * @param tduty 角色信息
+ * @param sources 菜单列表
+ * @return
+ */
+ void updateDuty(TDuty tduty, List sources) throws BusinessCheckException;
+
+ /**
+ * 根据角色名称合状态查询角色
+ *
+ * @param merchantId 商户ID
+ * @param name 角色名称
+ * @return
+ */
+ TDuty findByName(Integer merchantId, String name);
+
+ /**
+ * 根据角色名称获取已经分配的菜单ID集合
+ *
+ * @param dutyId 角色ID
+ * @return
+ */
+ List getSourceIdsByDutyId(Integer dutyId);
+
+ /**
+ * 获取角色的树形结构
+ *
+ * @param merchantId 商户ID
+ * @return
+ */
+ List getDutyTree(Integer merchantId);
+
+ /**
+ * 根据账户获取角色
+ *
+ * @param accountId 账号ID
+ * @return
+ */
+ List findDutiesByAccountId(Integer accountId);
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/GenCodeService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/GenCodeService.java
new file mode 100644
index 0000000..77a1c2a
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/GenCodeService.java
@@ -0,0 +1,58 @@
+package com.fuint.common.service;
+
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.model.TGenCode;
+
+/**
+ * 代码生成服务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface GenCodeService {
+
+ /**
+ * 分页查询列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse queryGenCodeListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 添加生成代码
+ *
+ * @param tGenCode 代码参数
+ * @throws BusinessCheckException
+ * @return
+ */
+ TGenCode addGenCode(TGenCode tGenCode) throws BusinessCheckException;
+
+ /**
+ * 根据ID获取信息
+ *
+ * @param id
+ * @throws BusinessCheckException
+ * @return
+ */
+ TGenCode queryGenCodeById(Integer id) throws BusinessCheckException;
+
+ /**
+ * 更新生成代码
+ * @param tGenCode
+ * @throws BusinessCheckException
+ * @return
+ * */
+ TGenCode updateGenCode(TGenCode tGenCode) throws BusinessCheckException;
+
+ /**
+ * 生成代码(自定义路径)
+ *
+ * @param tableName 表名称
+ * @return
+ */
+ void generatorCode(String tableName);
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/GiveService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/GiveService.java
new file mode 100644
index 0000000..05bf3dc
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/GiveService.java
@@ -0,0 +1,58 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.common.dto.GiveDto;
+import com.fuint.common.param.GiveParam;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.framework.web.ResponseObject;
+import com.fuint.repository.model.MtGive;
+import com.fuint.repository.model.MtGiveItem;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 转赠业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface GiveService extends IService {
+
+ /**
+ * 分页查询列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse queryGiveListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 转赠卡券
+ *
+ * @param giveParam
+ * @throws BusinessCheckException
+ * @return
+ */
+ ResponseObject addGive(GiveParam giveParam) throws BusinessCheckException;
+
+ /**
+ * 根据组ID获取信息
+ *
+ * @param id ID
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtGive queryGiveById(Long id) throws BusinessCheckException;
+
+ /**
+ * 根据条件搜索转赠详情
+ *
+ * @param params
+ * @throws BusinessCheckException
+ * @return
+ * */
+ List queryItemByParams(Map params);
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/GoodsService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/GoodsService.java
new file mode 100644
index 0000000..0723813
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/GoodsService.java
@@ -0,0 +1,143 @@
+package com.fuint.common.service;
+
+import com.fuint.common.dto.GoodsDto;
+import com.fuint.common.dto.GoodsSpecValueDto;
+import com.fuint.common.dto.GoodsTopDto;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.model.MtGoods;
+import com.fuint.repository.model.MtGoodsSku;
+import com.fuint.repository.model.MtGoodsSpec;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 商品业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface GoodsService {
+
+ /**
+ * 分页查询商品列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse queryGoodsListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 保存商品
+ *
+ * @param reqDto
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtGoods saveGoods(MtGoods reqDto) throws BusinessCheckException;
+
+ /**
+ * 根据ID获取商品信息
+ *
+ * @param id 商品ID
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtGoods queryGoodsById(Integer id) throws BusinessCheckException;
+
+ /**
+ * 根据编码获取商品信息
+ *
+ * @param merchantId
+ * @param goodsNo
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtGoods queryGoodsByGoodsNo(Integer merchantId, String goodsNo) throws BusinessCheckException;
+
+ /**
+ * 根据条码获取sku信息
+ *
+ * @param skuNo skuNo
+ * @throws BusinessCheckException
+ * @return
+ * */
+ MtGoodsSku getSkuInfoBySkuNo(String skuNo) throws BusinessCheckException;
+
+ /**
+ * 根据ID获取商品详情
+ *
+ * @param id
+ * @throws BusinessCheckException
+ * @return
+ */
+ GoodsDto getGoodsDetail(Integer id, boolean getDeleteSpec) throws InvocationTargetException, IllegalAccessException;
+
+ /**
+ * 根据ID删除
+ *
+ * @param id ID
+ * @param operator 操作人
+ * @throws BusinessCheckException
+ * @return
+ */
+ void deleteGoods(Integer id, String operator) throws BusinessCheckException;
+
+ /**
+ * 获取店铺的商品列表
+ *
+ * @param storeId
+ * @param keyword
+ * @param cateId
+ * @param page
+ * @param pageSize
+ * @return
+ * */
+ Map getStoreGoodsList(Integer storeId, String keyword, Integer cateId, Integer page, Integer pageSize) throws BusinessCheckException;
+
+ /**
+ * 根据skuId获取规格列表
+ *
+ * @param skuId
+ * @return
+ * */
+ List getSpecListBySkuId(Integer skuId) throws BusinessCheckException;
+
+ /**
+ * 获取规格详情
+ *
+ * @param specId
+ * @return
+ * */
+ MtGoodsSpec getSpecDetail(Integer specId);
+
+ /**
+ * 更新已售数量
+ *
+ * @param goodsId 商品ID
+ * @return
+ * */
+ Boolean updateInitSale(Integer goodsId);
+
+ /**
+ * 获取选择商品列表
+ *
+ * @param params 查询参数
+ * @return
+ */
+ PaginationResponse selectGoodsList(Map params) throws BusinessCheckException;
+
+ /**
+ * 获取商品销售排行榜
+ *
+ * @param merchantId 商户ID
+ * @param storeId 店铺ID
+ * @param startTime 开始时间
+ * @param endTime 结束时间
+ * @return
+ * */
+ List getGoodsSaleTopList(Integer merchantId, Integer storeId, Date startTime, Date endTime);
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/MemberGroupService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/MemberGroupService.java
new file mode 100644
index 0000000..6872adf
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/MemberGroupService.java
@@ -0,0 +1,59 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.common.dto.MemberGroupDto;
+import com.fuint.common.dto.UserGroupDto;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.model.MtUserGroup;
+
+/**
+ * 会员分组业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface MemberGroupService extends IService {
+
+ /**
+ * 分页查询分组列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse queryMemberGroupListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 新增会员分组
+ *
+ * @param memberGroupDto
+ * @throws BusinessCheckException
+ */
+ MtUserGroup addMemberGroup(MemberGroupDto memberGroupDto) throws BusinessCheckException;
+
+ /**
+ * 修改卡券分组
+ *
+ * @param memberGroupDto
+ * @throws BusinessCheckException
+ */
+ MtUserGroup updateMemberGroup(MemberGroupDto memberGroupDto) throws BusinessCheckException;
+
+ /**
+ * 根据组ID获取分组信息
+ *
+ * @param id 分组ID
+ * @throws BusinessCheckException
+ */
+ MtUserGroup queryMemberGroupById(Integer id) throws BusinessCheckException;
+
+ /**
+ * 根据分组ID删除分组信息
+ *
+ * @param id 分组ID
+ * @param operator 操作人
+ * @throws BusinessCheckException
+ */
+ void deleteMemberGroup(Integer id, String operator) throws BusinessCheckException;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/MemberService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/MemberService.java
new file mode 100644
index 0000000..6554330
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/MemberService.java
@@ -0,0 +1,258 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.alibaba.fastjson.JSONObject;
+import com.fuint.common.dto.GroupMemberDto;
+import com.fuint.common.dto.MemberTopDto;
+import com.fuint.common.dto.UserDto;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.model.MtUser;
+import com.fuint.repository.model.MtUserGrade;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 会员服务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface MemberService extends IService {
+
+ /**
+ * 更新活跃时间
+ *
+ * @param userId 会员ID
+ * @return
+ * */
+ Boolean updateActiveTime(Integer userId) throws BusinessCheckException;
+
+ /**
+ * 获取当前操作会员信息
+ *
+ * @param userId 会员ID
+ * @param accessToken
+ * @return
+ * */
+ MtUser getCurrentUserInfo(HttpServletRequest request, Integer userId, String accessToken) throws BusinessCheckException;
+
+ /**
+ * 分页查询会员列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse queryMemberListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 添加会员
+ *
+ * @param reqUserDto
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtUser addMember(MtUser reqUserDto) throws BusinessCheckException;
+
+ /**
+ * 编辑会员
+ *
+ * @param reqUserDto 会员信息
+ * @param modifyPassword 修改密码
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtUser updateMember(MtUser reqUserDto, boolean modifyPassword) throws BusinessCheckException;
+
+ /**
+ * 通过手机号添加会员
+ *
+ * @param merchantId 商户ID
+ * @param mobile 手机号
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtUser addMemberByMobile(Integer merchantId, String mobile) throws BusinessCheckException;
+
+ /**
+ * 根据会员ID获取会员信息
+ *
+ * @param id 会员ID
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtUser queryMemberById(Integer id) throws BusinessCheckException;
+
+ /**
+ * 根据会员名称获取会员信息
+ *
+ * @param merchantId 商户ID
+ * @param name 会员名称
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtUser queryMemberByName(Integer merchantId, String name) throws BusinessCheckException;
+
+ /**
+ * 根据会员ID获取会员信息
+ *
+ * @param merchantId 商户ID
+ * @param openId 微信openId
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtUser queryMemberByOpenId(Integer merchantId, String openId, JSONObject userInfo) throws BusinessCheckException;
+
+ /**
+ * 根据会员组ID获取会员组信息
+ *
+ * @param id 会员组ID
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtUserGrade queryMemberGradeByGradeId(Integer id) throws BusinessCheckException;
+
+ /**
+ * 根据会员手机获取会员信息
+ *
+ * @param merchantId 商户ID
+ * @param mobile 会员手机
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtUser queryMemberByMobile(Integer merchantId, String mobile) throws BusinessCheckException;
+
+ /**
+ * 根据会员号获取会员信息
+ *
+ * @param merchantId 商户ID
+ * @param userNo 会员号
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtUser queryMemberByUserNo(Integer merchantId, String userNo) throws BusinessCheckException;
+
+ /**
+ * 根据会员ID 删除店铺信息
+ *
+ * @param id 会员ID
+ * @param operator 操作人
+ * @throws BusinessCheckException
+ * @return
+ */
+ Integer deleteMember(Integer id, String operator) throws BusinessCheckException;
+
+ /**
+ * 根据条件搜索会员分组
+ *
+ * @param params 查询参数
+ * @throws BusinessCheckException
+ * @return
+ * */
+ List queryMemberGradeByParams(Map params) throws BusinessCheckException;
+
+ /**
+ * 获取会员数量
+ *
+ * @param merchantId 商户ID
+ * @param storeId 店铺ID
+ * @throws BusinessCheckException
+ * @return
+ * */
+ Long getUserCount(Integer merchantId, Integer storeId) throws BusinessCheckException;
+
+ /**
+ * 获取会员数量
+ *
+ * @param merchantId 商户ID
+ * @param storeId 店铺ID
+ * @param beginTime 开始时间
+ * @param endTime 结束时间
+ * @throws BusinessCheckException
+ * @return
+ * */
+ Long getUserCount(Integer merchantId, Integer storeId, Date beginTime, Date endTime) throws BusinessCheckException;
+
+ /**
+ * 获取活跃会员数量
+ * @param merchantId 商户ID
+ * @param storeId 店铺ID
+ * @param beginTime 开始时间
+ * @param endTime 结束时间
+ * @throws BusinessCheckException
+ * @return
+ * */
+ Long getActiveUserCount(Integer merchantId, Integer storeId, Date beginTime, Date endTime) throws BusinessCheckException;
+
+ /**
+ * 重置手机号
+ *
+ * @param mobile 手机号码
+ * @param userId 会员ID
+ * @throws BusinessCheckException
+ * @return
+ */
+ void resetMobile(String mobile, Integer userId) throws BusinessCheckException;
+
+ /**
+ * 获取会员消费排行榜
+ *
+ * @param merchantId 商户ID
+ * @param storeId 店铺ID
+ * @param startTime 开始时间
+ * @param endTime 结束时间
+ * @return
+ * */
+ List getMemberConsumeTopList(Integer merchantId, Integer storeId, Date startTime, Date endTime);
+
+ /**
+ * 查找会员列表
+ *
+ * @param merchantId 商户ID
+ * @param keyword 关键字
+ * @param groupIds 分组ID
+ * @param page 当前页码
+ * @param pageSize 每页数量
+ * @return
+ * */
+ List searchMembers(Integer merchantId, String keyword, String groupIds, Integer page, Integer pageSize);
+
+ /**
+ * 查找会员列表
+ *
+ * @param merchantId 商户ID
+ * @param keyword 关键字
+ * @return
+ * */
+ List searchMembers(Integer merchantId, String keyword);
+
+ /**
+ * 设定安全的密码
+ *
+ * @param password 密码(明文)
+ * @param salt 随机因子
+ * @return
+ */
+ String enCodePassword(String password, String salt);
+
+ /**
+ * 获取加密密码
+ *
+ * @param password 密码(密文)
+ * @param salt 随机因子
+ * @return
+ * */
+ String deCodePassword(String password, String salt);
+
+ /**
+ * 获取会员ID列表
+ *
+ * @param merchantId 商户ID
+ * @param storeId 店铺ID
+ * @return
+ * */
+ List getUserIdList(Integer merchantId, Integer storeId);
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/MerchantService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/MerchantService.java
new file mode 100644
index 0000000..ace3c58
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/MerchantService.java
@@ -0,0 +1,89 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.model.MtMerchant;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 商户业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface MerchantService extends IService {
+
+ /**
+ * 分页查询商户列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse queryMerchantListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 保存商户信息
+ *
+ * @param mtMerchant
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtMerchant saveMerchant(MtMerchant mtMerchant) throws BusinessCheckException;
+
+ /**
+ * 根据ID获取商户信息
+ *
+ * @param id 商户ID
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtMerchant queryMerchantById(Integer id) throws BusinessCheckException;
+
+ /**
+ * 根据名称获取商户信息
+ *
+ * @param name 商户名称
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtMerchant queryMerchantByName(String name) throws BusinessCheckException;
+
+ /**
+ * 根据商户号获取商户信息
+ *
+ * @param merchantNo 商户号
+ * @return
+ */
+ MtMerchant queryMerchantByNo(String merchantNo);
+
+ /**
+ * 根据商户号获取商户ID
+ *
+ * @param merchantNo 商户号
+ * @return
+ */
+ Integer getMerchantId(String merchantNo);
+
+ /**
+ * 更新商户状态
+ *
+ * @param id 商户ID
+ * @param operator 操作人
+ * @param status 状态
+ * @throws BusinessCheckException
+ * @return
+ */
+ void updateStatus(Integer id, String operator, String status) throws BusinessCheckException;
+
+ /**
+ * 根据条件查询商户
+ *
+ * @param params 查询参数
+ * @return
+ * */
+ List queryMerchantByParams(Map params) throws BusinessCheckException;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/MessageService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/MessageService.java
new file mode 100644
index 0000000..fb7ac5c
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/MessageService.java
@@ -0,0 +1,58 @@
+package com.fuint.common.service;
+
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.repository.model.MtMessage;
+import java.util.List;
+
+/**
+ * 消息业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface MessageService {
+
+ /**
+ * 添加消息
+ *
+ * @param reqMsgDto
+ * @throws BusinessCheckException
+ * @return
+ */
+ void addMessage(MtMessage reqMsgDto) throws BusinessCheckException;
+
+ /**
+ * 置为已读
+ *
+ * @param msgId
+ * @throws BusinessCheckException
+ * @return
+ */
+ void readMessage(Integer msgId) throws BusinessCheckException;
+
+ /**
+ * 置为发送
+ *
+ * @param msgId
+ * @throws BusinessCheckException
+ * @return
+ */
+ void sendMessage(Integer msgId, boolean isRead) throws BusinessCheckException;
+
+ /**
+ * 获取最新一条未读消息
+ *
+ * @param userId 会员ID
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtMessage getOne(Integer userId) throws BusinessCheckException;
+
+ /**
+ * 获取需要发送的消息
+ *
+ * @throws BusinessCheckException
+ * @return
+ * */
+ List getNeedSendList() throws BusinessCheckException;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/OpenGiftService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/OpenGiftService.java
new file mode 100644
index 0000000..56ee934
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/OpenGiftService.java
@@ -0,0 +1,73 @@
+package com.fuint.common.service;
+
+import com.fuint.common.dto.OpenGiftDto;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.web.ResponseObject;
+import com.fuint.repository.model.MtOpenGift;
+import java.util.Map;
+
+/**
+ * 开卡赠礼接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface OpenGiftService {
+
+ /**
+ * 获取用户的开卡赠礼
+ *
+ * @param paramMap 查询参数
+ * @throws BusinessCheckException
+ * @return
+ * */
+ ResponseObject getOpenGiftList(Map paramMap) throws BusinessCheckException;
+
+ /**
+ * 新增开卡赠礼
+ *
+ * @param reqDto
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtOpenGift addOpenGift(MtOpenGift reqDto) throws BusinessCheckException;
+
+ /**
+ * 根据ID获取开卡赠礼
+ *
+ * @param id ID
+ * @throws BusinessCheckException
+ * @return
+ */
+ OpenGiftDto getOpenGiftDetail(Integer id) throws BusinessCheckException;
+
+ /**
+ * 根据ID删除开卡赠礼
+ *
+ * @param id ID
+ * @param operator 操作人
+ * @throws BusinessCheckException
+ * @return
+ */
+ void deleteOpenGift(Integer id, String operator) throws BusinessCheckException;
+
+ /**
+ * 更新开卡赠礼
+ *
+ * @param reqDto
+ * @throws BusinessCheckException
+ * @return
+ * */
+ MtOpenGift updateOpenGift(MtOpenGift reqDto) throws BusinessCheckException;
+
+ /**
+ * 开卡赠礼
+ *
+ * @param userId 会员ID
+ * @param gradeId 会员等级
+ * @param isNewMember 是否新会员
+ * @throws BusinessCheckException
+ * @return
+ * */
+ Boolean openGift(Integer userId, Integer gradeId, boolean isNewMember) throws BusinessCheckException;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/OrderService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/OrderService.java
new file mode 100644
index 0000000..740613e
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/OrderService.java
@@ -0,0 +1,242 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.common.dto.UserOrderDto;
+import com.fuint.common.dto.OrderDto;
+import com.fuint.common.param.OrderListParam;
+import com.fuint.common.param.SettlementParam;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.model.MtCart;
+import com.fuint.repository.model.MtOrder;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 订单业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface OrderService extends IService {
+
+ /**
+ * 获取用户的订单
+ *
+ * @param orderListParam
+ * @throws BusinessCheckException
+ * @return
+ * */
+ PaginationResponse getUserOrderList(OrderListParam orderListParam) throws BusinessCheckException;
+
+ /**
+ * 创建订单
+ *
+ * @param orderDto
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtOrder saveOrder(OrderDto orderDto) throws BusinessCheckException;
+
+ /**
+ * 订单提交结算
+ *
+ * @param request 请求参数
+ * @param settlementParam 结算参数
+ * @throws BusinessCheckException
+ * @return
+ * */
+ Map doSettle(HttpServletRequest request, SettlementParam settlementParam) throws BusinessCheckException;
+
+ /**
+ * 获取订单详情
+ *
+ * @param id 订单ID
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtOrder getOrderInfo(Integer id) throws BusinessCheckException;
+
+ /**
+ * 根据ID获取订单
+ *
+ * @param id 订单ID
+ * @throws BusinessCheckException
+ * @return
+ */
+ UserOrderDto getOrderById(Integer id) throws BusinessCheckException;
+
+ /**
+ * 根据ID获取订单
+ *
+ * @param id
+ * @throws BusinessCheckException
+ * @return
+ */
+ UserOrderDto getMyOrderById(Integer id) throws BusinessCheckException;
+
+ /**
+ * 取消订单
+ *
+ * @param orderId 订单ID
+ * @param remark 取消备注
+ * @throws BusinessCheckException
+ * @return
+ * */
+ MtOrder cancelOrder(Integer orderId, String remark) throws BusinessCheckException;
+
+ /**
+ * 根据订单ID删除
+ *
+ * @param orderId 订单ID
+ * @param operator 操作人
+ * @throws BusinessCheckException
+ * @return
+ */
+ void deleteOrder(Integer orderId, String operator) throws BusinessCheckException;
+
+ /**
+ * 根据订单号获取订单
+ *
+ * @param orderSn
+ * @throws BusinessCheckException
+ * @return
+ */
+ UserOrderDto getOrderByOrderSn(String orderSn) throws BusinessCheckException;
+
+ /**
+ * 更新订单
+ *
+ * @param reqDto
+ * @throws BusinessCheckException
+ * @return
+ * */
+ MtOrder updateOrder(OrderDto reqDto) throws BusinessCheckException;
+
+ /**
+ * 更新订单
+ *
+ * @param mtOrder
+ * @throws BusinessCheckException
+ * @return
+ * */
+ MtOrder updateOrder(MtOrder mtOrder) throws BusinessCheckException;
+
+ /**
+ * 把订单置为已支付
+ *
+ * @param orderId
+ * @param payAmount
+ * @throws BusinessCheckException
+ * @return
+ * */
+ Boolean setOrderPayed(Integer orderId, BigDecimal payAmount) throws BusinessCheckException;
+
+ /**
+ * 根据条件搜索订单
+ *
+ * @param params 查询参数
+ * @throws BusinessCheckException
+ * @return
+ * */
+ List getOrderListByParams(Map params) throws BusinessCheckException;
+
+ /**
+ * 获取订单总数
+ *
+ * @param merchantId 商户ID
+ * @param storeId 店铺ID
+ * @throws BusinessCheckException
+ * @return
+ * */
+ BigDecimal getOrderCount(Integer merchantId, Integer storeId) throws BusinessCheckException;
+
+ /**
+ * 获取订单数量
+ *
+ * @param merchantId 商户ID
+ * @param storeId 店铺ID
+ * @param beginTime 开始时间
+ * @param endTime 结束时间
+ * @throws BusinessCheckException
+ * @return
+ * */
+ BigDecimal getOrderCount(Integer merchantId, Integer storeId, Date beginTime, Date endTime) throws BusinessCheckException;
+
+ /**
+ * 计算购物车
+ *
+ * @param merchantId 商户ID
+ * @param userId 会员ID
+ * @param cartList 购物车列表
+ * @param couponId 使用的卡券ID
+ * @param isUsePoint 是否使用积分抵扣
+ * @param platform 平台 h5
+ * @param orderMode 订单模式,自取或配送
+ * @throws BusinessCheckException
+ * @return
+ * */
+ Map calculateCartGoods(Integer merchantId, Integer userId, List cartList, Integer couponId, boolean isUsePoint, String platform, String orderMode) throws BusinessCheckException;
+
+ /**
+ * 获取支付金额
+ *
+ * @param merchantId 商户ID
+ * @param storeId 店铺ID
+ * @param beginTime 开始时间
+ * @param endTime 结束时间
+ * @throws BusinessCheckException
+ * @return
+ * */
+ BigDecimal getPayMoney(Integer merchantId, Integer storeId, Date beginTime, Date endTime) throws BusinessCheckException;
+
+ /**
+ * 获取支付人数
+ *
+ * @param merchantId 商户ID
+ * @param storeId 店铺ID
+ * @throws BusinessCheckException
+ * @return
+ * */
+ Integer getPayUserCount(Integer merchantId, Integer storeId) throws BusinessCheckException;
+
+ /**
+ * 获取支付金额
+ *
+ * @param merchantId 商户ID
+ * @param storeId 店铺ID
+ * @throws BusinessCheckException
+ * @return
+ * */
+ BigDecimal getPayMoney(Integer merchantId, Integer storeId) throws BusinessCheckException;
+
+ /**
+ * 获取会员支付金额
+ *
+ * @param userId 会员ID
+ * @throws BusinessCheckException
+ * @return
+ * */
+ BigDecimal getUserPayMoney(Integer userId) throws BusinessCheckException;
+
+ /**
+ * 获取会员订单数
+ *
+ * @param userId 会员ID
+ * @throws BusinessCheckException
+ * @return
+ * */
+ Integer getUserPayOrderCount(Integer userId) throws BusinessCheckException;
+
+ /**
+ * 获取等待分佣的订单列表
+ *
+ * @param dateTime 时间
+ * @throws BusinessCheckException
+ * @return
+ * */
+ List getTobeCommissionOrderList(String dateTime) throws BusinessCheckException;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/PaymentService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/PaymentService.java
new file mode 100644
index 0000000..2fc24f4
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/PaymentService.java
@@ -0,0 +1,50 @@
+package com.fuint.common.service;
+
+import com.fuint.common.dto.UserOrderDto;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.web.ResponseObject;
+import com.fuint.repository.model.MtOrder;
+import com.fuint.repository.model.MtUser;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+/**
+ * 支付相关业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface PaymentService {
+
+ /**
+ * 创建预支付订单
+ *
+ * @param userInfo 会员信息
+ * @param orderInfo 订单信息
+ * @param payAmount 支付金额
+ * @param authCode 付款码
+ * @param giveAmount 赠送金额
+ * @param ip 支付IP地址
+ * @param platform 支付平台
+ * @param isWechat 是否微信客户端
+ * @return
+ * */
+ ResponseObject createPrepayOrder(MtUser userInfo, MtOrder orderInfo, Integer payAmount, String authCode, Integer giveAmount, String ip, String platform, String isWechat) throws BusinessCheckException;
+
+ /**
+ * 支付回调
+ *
+ * @param orderInfo 订单信息
+ * @return
+ * */
+ Boolean paymentCallback(UserOrderDto orderInfo) throws BusinessCheckException;
+
+ /**
+ * 订单支付
+ *
+ * @param request 请求参数
+ * @return
+ * */
+ Map doPay(HttpServletRequest request) throws BusinessCheckException;
+
+}
\ No newline at end of file
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/PointService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/PointService.java
new file mode 100644
index 0000000..250a61c
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/PointService.java
@@ -0,0 +1,46 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.common.dto.PointDto;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.model.MtPoint;
+
+/**
+ * 积分业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface PointService extends IService {
+
+ /**
+ * 分页查询积分列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse queryPointListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 添加积分
+ *
+ * @param reqPointDto
+ * @throws BusinessCheckException
+ * @return
+ */
+ void addPoint(MtPoint reqPointDto) throws BusinessCheckException;
+
+ /**
+ * 转赠积分
+ *
+ * @param userId
+ * @param mobile
+ * @param amount
+ * @param remark
+ * @throws BusinessCheckException
+ * @return
+ */
+ boolean doGift(Integer userId, String mobile, Integer amount, String remark) throws BusinessCheckException;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/RefundService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/RefundService.java
new file mode 100644
index 0000000..6e45aaf
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/RefundService.java
@@ -0,0 +1,94 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.common.dto.AccountInfo;
+import com.fuint.common.dto.RefundDto;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.framework.web.ResponseObject;
+import com.fuint.repository.model.MtRefund;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 售后业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface RefundService extends IService {
+
+ /**
+ * 分页查询列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse getRefundListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 获取用户的售后订单
+ * @param paramMap 查询参数
+ * @throws BusinessCheckException
+ * */
+ ResponseObject getUserRefundList(Map paramMap) throws BusinessCheckException;
+
+ /**
+ * 创建售后订单
+ *
+ * @param reqDto
+ * @throws BusinessCheckException
+ */
+ MtRefund createRefund(RefundDto reqDto) throws BusinessCheckException;
+
+ /**
+ * 根据ID获取售后订单信息
+ *
+ * @param id ID
+ * @throws BusinessCheckException
+ */
+ RefundDto getRefundById(Integer id) throws BusinessCheckException;
+
+ /**
+ * 根据订单ID获取售后订单信息
+ *
+ * @param orderId
+ * @throws BusinessCheckException
+ */
+ MtRefund getRefundByOrderId(Integer orderId) throws BusinessCheckException;
+
+ /**
+ * 更新售后订单
+ * @param reqDto
+ * @throws BusinessCheckException
+ * */
+ MtRefund updateRefund(RefundDto reqDto) throws BusinessCheckException;
+
+ /**
+ * 同意售后订单
+ * @param reqDto
+ * @throws BusinessCheckException
+ * */
+ MtRefund agreeRefund(RefundDto reqDto) throws BusinessCheckException;
+
+ /**
+ * 发起退款
+ *
+ * @param orderId
+ * @param refundAmount
+ * @param remark
+ * @param accountInfo
+ * throws BusinessCheckException;
+ * */
+ Boolean doRefund(Integer orderId, String refundAmount, String remark, AccountInfo accountInfo) throws BusinessCheckException;
+
+ /**
+ * 获取售后订单总数
+ *
+ * @param beginTime
+ * @param endTime
+ * @return
+ * */
+ Long getRefundCount(Date beginTime, Date endTime) throws BusinessCheckException;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/SendLogService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/SendLogService.java
new file mode 100644
index 0000000..061ee36
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/SendLogService.java
@@ -0,0 +1,51 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.common.dto.ReqSendLogDto;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.model.MtSendLog;
+
+/**
+ * 发券记录业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface SendLogService extends IService {
+
+ /**
+ * 分页查询列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse querySendLogListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 添加记录
+ *
+ * @param reqSendLogDto
+ * @throws BusinessCheckException
+ */
+ MtSendLog addSendLog(ReqSendLogDto reqSendLogDto) throws BusinessCheckException;
+
+ /**
+ * 根据组ID获取发券记录
+ *
+ * @param id ID
+ * @throws BusinessCheckException
+ */
+ MtSendLog querySendLogById(Long id) throws BusinessCheckException;
+
+ /**
+ * 删除发券记录
+ *
+ * @param id ID
+ * @param operator 操作人
+ * @throws BusinessCheckException
+ * @return
+ */
+ void deleteSendLog(Long id, String operator) throws BusinessCheckException;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/SendSmsService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/SendSmsService.java
new file mode 100644
index 0000000..992c765
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/SendSmsService.java
@@ -0,0 +1,37 @@
+package com.fuint.common.service;
+
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.model.MtSmsSendedLog;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 发送短信接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface SendSmsService {
+
+ /**
+ * 发送短信方法
+ *
+ * @param merchantId 商户ID
+ * @param tUname 短信模板英文名称
+ * @param phones 手机号码集合
+ * @return Map> TRUE:推送成功的手机号码集合;
+ * FALSE:推送失败的手机号码集合
+ * @throws Exception
+ */
+ Map> sendSms(Integer merchantId, String tUname, List phones, Map contentParams) throws BusinessCheckException;
+
+ /**
+ * 分页已发短信列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse querySmsListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/SettingService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/SettingService.java
new file mode 100644
index 0000000..4d4a009
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/SettingService.java
@@ -0,0 +1,66 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.common.dto.ParamDto;
+import com.fuint.repository.model.MtSetting;
+import com.fuint.framework.exception.BusinessCheckException;
+import java.util.List;
+
+/**
+ * 配置业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface SettingService extends IService {
+
+ /**
+ * 删除配置
+ *
+ * @param merchantId 商户ID
+ * @param name 配置名称
+ * @throws BusinessCheckException
+ */
+ void removeSetting(Integer merchantId, String name) throws BusinessCheckException;
+
+ /**
+ * 保存配置
+ *
+ * @param mtSetting
+ * @throws BusinessCheckException
+ */
+ MtSetting saveSetting(MtSetting mtSetting) throws BusinessCheckException;
+
+ /**
+ * 获取配置列表
+ *
+ * @param type
+ * @throws BusinessCheckException
+ */
+ List getSettingList(Integer merchantId, String type) throws BusinessCheckException;
+
+ /**
+ * 根据配置名称获取配置信息
+ *
+ * @param merchantId 商户ID
+ * @param name 配置名称
+ * @throws BusinessCheckException
+ */
+ MtSetting querySettingByName(Integer merchantId, String name) throws BusinessCheckException;
+
+ /**
+ * 获取系统上传文件的根路径
+ *
+ * @return 本地配置或阿里云的oss域名
+ * */
+ String getUploadBasePath();
+
+ /**
+ * 获取支付方式列表
+ *
+ * @param platform 平台
+ * @return
+ * */
+ List getPayTypeList(String platform);
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/SettlementService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/SettlementService.java
new file mode 100644
index 0000000..a68925a
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/SettlementService.java
@@ -0,0 +1,54 @@
+package com.fuint.common.service;
+
+import com.fuint.common.dto.SettlementDto;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.module.backendApi.request.SettlementRequest;
+import com.fuint.repository.model.MtSettlement;
+
+/**
+ * 订单结算相关业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface SettlementService {
+
+ /**
+ * 分页查询结算列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse querySettlementListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 提交结算
+ *
+ * @param requestParam
+ * @throws BusinessCheckException
+ * @return
+ */
+ Boolean submitSettlement(SettlementRequest requestParam) throws BusinessCheckException;
+
+ /**
+ * 结算确认
+ *
+ * @param settlementId
+ * @param operator
+ * @throws BusinessCheckException
+ * @return
+ */
+ Boolean doConfirm(Integer settlementId, String operator) throws BusinessCheckException;
+
+ /**
+ * 获取结算详情
+ *
+ * @param settlementId
+ * @param page
+ * @param pageSize
+ * @return
+ * */
+ SettlementDto getSettlementInfo(Integer settlementId, Integer page, Integer pageSize) throws BusinessCheckException;
+}
\ No newline at end of file
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/SmsTemplateService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/SmsTemplateService.java
new file mode 100644
index 0000000..75000f6
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/SmsTemplateService.java
@@ -0,0 +1,58 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.common.dto.SmsTemplateDto;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.model.MtSmsTemplate;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 短信模板业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface SmsTemplateService extends IService {
+
+ /**
+ * 分页查询模板列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse querySmsTemplateListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 添加模板
+ *
+ * @param reqSmsTemplateDto
+ * @throws BusinessCheckException
+ */
+ MtSmsTemplate saveSmsTemplate(SmsTemplateDto reqSmsTemplateDto) throws BusinessCheckException;
+
+ /**
+ * 删除短信模板
+ * @param id
+ * @param operator
+ * @return
+ * */
+ void deleteTemplate(Integer id, String operator) throws BusinessCheckException;
+
+ /**
+ * 根据模板ID获取模板信息
+ *
+ * @param id ID
+ * @throws BusinessCheckException
+ */
+ MtSmsTemplate querySmsTemplateById(Integer id) throws BusinessCheckException;
+
+ /**
+ * 根据条件搜索模板
+ * */
+ List querySmsTemplateByParams(Map params) throws BusinessCheckException;
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/SourceService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/SourceService.java
new file mode 100644
index 0000000..38ab98a
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/SourceService.java
@@ -0,0 +1,97 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.common.domain.TreeSelect;
+import com.fuint.common.vo.RouterVo;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.common.domain.TreeNode;
+import com.fuint.repository.model.TSource;
+import java.util.List;
+
+/**
+ * 菜单管理业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface SourceService extends IService {
+
+ /**
+ * 获取有效的菜单集合
+ *
+ * @param merchantId 商户ID
+ * @return
+ */
+ List getAvailableSources(Integer merchantId);
+
+ /**
+ * 获取菜单的属性结构
+ *
+ * @param merchantId 商户ID
+ * @return
+ */
+ List getSourceTree(Integer merchantId);
+
+ /**
+ * 根据菜单ID集合查询菜单列表信息
+ *
+ * @param ids
+ * @return
+ */
+ List findDatasByIds(String[] ids);
+
+ /**
+ * 根据会员ID获取菜单
+ *
+ * @param merchantId 商户ID
+ * @param accountId 账号ID
+ * @throws BusinessCheckException
+ * @return
+ */
+ List getMenuListByUserId(Integer merchantId, Integer accountId) throws BusinessCheckException;
+
+ /**
+ * 构建前端路由所需要的菜单
+ *
+ * @param treeNodes 菜单列表
+ * @return 路由列表
+ */
+ List buildMenus(List treeNodes);
+
+ /**
+ * 构建前端所需要树结构
+ *
+ * @param menus 菜单列表
+ * @return 树结构列表
+ */
+ List buildMenuTree(List menus);
+
+ /**
+ * 构建前端所需要下拉树结构
+ *
+ * @param menus 菜单列表
+ * @return 下拉树结构列表
+ */
+ List buildMenuTreeSelect(List menus);
+
+ /**
+ * 添加菜单
+ *
+ * @param tSource
+ */
+ void addSource(TSource tSource);
+
+ /**
+ * 修改菜单
+ *
+ * @param source
+ * */
+ void editSource(TSource source);
+
+ /**
+ * 删除菜单
+ *
+ * @param source
+ * */
+ void deleteSource(TSource source);
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/StaffService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/StaffService.java
new file mode 100644
index 0000000..877134e
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/StaffService.java
@@ -0,0 +1,77 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.model.MtStaff;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 店铺员工业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface StaffService extends IService {
+
+ /**
+ * 员工查询列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse queryStaffListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 保存员工信息
+ *
+ * @param reqStaff
+ * @throws BusinessCheckException
+ */
+ MtStaff saveStaff(MtStaff reqStaff) throws BusinessCheckException;
+
+ /**
+ * 根据ID获取店铺信息
+ *
+ * @param id 员工id
+ * @throws BusinessCheckException
+ */
+ MtStaff queryStaffById(Integer id) throws BusinessCheckException;
+
+ /**
+ * 审核更改状态(禁用,审核通过)
+ *
+ * @param id
+ * @throws BusinessCheckException
+ * @return
+ */
+ Integer updateAuditedStatus(Integer id, String statusEnum) throws BusinessCheckException;
+
+ /**
+ * 根据条件搜索员工
+ *
+ * @param params 请求参数
+ * @return
+ * */
+ List queryStaffByParams(Map params) throws BusinessCheckException;
+
+ /**
+ * 根据手机号获取员工信息
+ *
+ * @param mobile 手机
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtStaff queryStaffByMobile(String mobile) throws BusinessCheckException;
+
+ /**
+ * 根据会员ID获取员工信息
+ *
+ * @param userId 会员ID
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtStaff queryStaffByUserId(Integer userId) throws BusinessCheckException;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/StockService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/StockService.java
new file mode 100644
index 0000000..d28afa9
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/StockService.java
@@ -0,0 +1,65 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.framework.web.ResponseObject;
+import com.fuint.repository.model.MtStock;
+import com.fuint.repository.model.MtStockItem;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 库存业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface StockService extends IService {
+
+ /**
+ * 分页查询列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse queryStockListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 新增库存管理记录
+ *
+ * @param mtStock
+ * @param goodsList
+ * @throws BusinessCheckException
+ */
+ ResponseObject addStock(MtStock mtStock, List goodsList) throws BusinessCheckException;
+
+ /**
+ * 删除库存管理记录
+ *
+ * @param id
+ * @param operator
+ * @return
+ * */
+ void delete(Integer id, String operator) throws BusinessCheckException;
+
+ /**
+ * 根据ID获取信息
+ *
+ * @param id ID
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtStock queryStockById(Long id) throws BusinessCheckException;
+
+ /**
+ * 根据条件搜索详情
+ *
+ * @param params
+ * @throws BusinessCheckException
+ * @return
+ * */
+ List queryItemByParams(Map params) throws BusinessCheckException;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/StoreService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/StoreService.java
new file mode 100644
index 0000000..cbc2aea
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/StoreService.java
@@ -0,0 +1,107 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.common.dto.StoreDto;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.model.MtStore;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 店铺业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface StoreService extends IService {
+
+ /**
+ * 分页查询店铺列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse queryStoreListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 保存店铺信息
+ *
+ * @param reqStoreDto
+ * @throws BusinessCheckException
+ */
+ MtStore saveStore(StoreDto reqStoreDto) throws BusinessCheckException;
+
+ /**
+ * 获取系统默认店铺
+ *
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtStore getDefaultStore(String merchantNo) throws BusinessCheckException;
+
+ /**
+ * 根据店铺ID获取店铺信息
+ *
+ * @param id 店铺ID
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtStore queryStoreById(Integer id) throws BusinessCheckException;
+
+ /**
+ * 根据店铺名称获取店铺信息
+ *
+ * @param storeName 店铺名称
+ * @throws BusinessCheckException
+ */
+ StoreDto queryStoreByName(String storeName) throws BusinessCheckException;
+
+ /**
+ * 根据店铺ID查询店铺信息
+ *
+ * @param id 店铺ID
+ * @return
+ * @throws BusinessCheckException
+ */
+ StoreDto queryStoreDtoById(Integer id) throws BusinessCheckException;
+
+ /**
+ * 更新店铺状态
+ *
+ * @param id 店铺ID
+ * @param operator 操作人
+ * @param status 状态
+ * @throws BusinessCheckException
+ */
+ void updateStatus(Integer id, String operator, String status) throws BusinessCheckException;
+
+ /**
+ * 根据条件查询店铺列表
+ *
+ * @param params 查询参数
+ * @return
+ * */
+ List queryStoresByParams(Map params) throws BusinessCheckException;
+
+ /**
+ * 根据距离远近查找店铺
+ *
+ * @param merchantNo 商户号
+ * @param keyword 关键字
+ * @param latitude 维度
+ * @param longitude 经度
+ * @return
+ * */
+ List queryByDistance(String merchantNo, String keyword, String latitude, String longitude) throws BusinessCheckException;
+
+ /**
+ * 获取店铺名称
+ *
+ * @param storeIds 店铺ID
+ * @return
+ * */
+ String getStoreNames(String storeIds);
+
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/UserActionService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/UserActionService.java
new file mode 100644
index 0000000..59d023a
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/UserActionService.java
@@ -0,0 +1,49 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.model.MtUserAction;
+
+/**
+ * 会员行为业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface UserActionService extends IService {
+
+ /**
+ * 分页查询列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse queryUserActionListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 新增会员行为
+ *
+ * @param mtUserAction
+ * @throws BusinessCheckException
+ */
+ boolean addUserAction(MtUserAction mtUserAction) throws BusinessCheckException;
+
+ /**
+ * 根据ID获取会员行为详情
+ *
+ * @param id ID
+ * @throws BusinessCheckException
+ */
+ MtUserAction getUserActionDetail(Integer id) throws BusinessCheckException;
+
+ /**
+ * 根据ID删除会员行为
+ *
+ * @param id ID
+ * @param operator 操作人
+ * @throws BusinessCheckException
+ */
+ void deleteUserAction(Integer id, String operator) throws BusinessCheckException;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/UserCouponService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/UserCouponService.java
new file mode 100644
index 0000000..7330c03
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/UserCouponService.java
@@ -0,0 +1,107 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.common.dto.CouponDto;
+import com.fuint.common.param.CouponReceiveParam;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.framework.web.ResponseObject;
+import com.fuint.repository.model.MtUserCoupon;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 会员卡券业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface UserCouponService extends IService {
+
+ /**
+ * 分页查询列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse queryUserCouponListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 领取卡券
+ *
+ * @param couponReceiveParam
+ * @return
+ * */
+ boolean receiveCoupon(CouponReceiveParam couponReceiveParam) throws BusinessCheckException;
+
+ /**
+ * 预存卡券
+ *
+ * @param paramMap
+ * @return
+ * */
+ boolean preStore(Map paramMap) throws BusinessCheckException;
+
+ /**
+ * 获取会员卡券列表
+ * @param userId
+ * @param status
+ * @return
+ * */
+ List getUserCouponList(Integer userId, List status) throws BusinessCheckException;
+
+ /**
+ * 获取用户的卡券
+ * @param paramMap 查询参数
+ * @throws BusinessCheckException
+ * */
+ ResponseObject getUserCouponList(Map paramMap) throws BusinessCheckException;
+
+ /**
+ * 获取会员可支付用的卡券
+ *
+ * @param userId 会员ID
+ * @param storeId 使用门店
+ * @param useFor 用途
+ * @return
+ * */
+ List getPayAbleCouponList(Integer userId, Integer storeId, String useFor) throws BusinessCheckException;
+
+ /**
+ * 获取会员卡券详情
+ * @param userId
+ * @param couponId
+ * */
+ List getUserCouponDetail(Integer userId, Integer couponId) throws BusinessCheckException;
+
+ /**
+ * 获取会员卡券详情
+ *
+ * @param userCouponId
+ * @return
+ * */
+ MtUserCoupon getUserCouponDetail(Integer userCouponId) throws BusinessCheckException;
+
+ /**
+ * 根据过期时间查询会员卡券
+ *
+ * @param userId
+ * @param status
+ * @param startTime
+ * @param endTime
+ * @return
+ * */
+ List getUserCouponListByExpireTime(Integer userId, String status, String startTime, String endTime) throws BusinessCheckException;
+
+ /**
+ * 给会员发送卡券(会员购买)
+ *
+ * @param orderId 订单ID
+ * @param couponId 卡券ID
+ * @param userId 会员ID
+ * @param mobile 会员手机号
+ * @return
+ * */
+ boolean buyCouponItem(Integer orderId, Integer couponId, Integer userId, String mobile) throws BusinessCheckException;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/UserGradeService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/UserGradeService.java
new file mode 100644
index 0000000..bd73892
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/UserGradeService.java
@@ -0,0 +1,84 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.model.MtUser;
+import com.fuint.repository.model.MtUserGrade;
+import java.util.List;
+
+/**
+ * 会员等级业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface UserGradeService extends IService {
+
+ /**
+ * 分页查询会员等级列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ PaginationResponse queryUserGradeListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+ /**
+ * 添加会员等级
+ *
+ * @param reqDto
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtUserGrade addUserGrade(MtUserGrade reqDto) throws BusinessCheckException;
+
+ /**
+ * 修改会员等级
+ *
+ * @param reqDto
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtUserGrade updateUserGrade(MtUserGrade reqDto) throws BusinessCheckException;
+
+ /**
+ * 根据ID获取会员等级信息
+ *
+ * @param merchantId
+ * @param gradeId ID
+ * @param userId
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtUserGrade queryUserGradeById(Integer merchantId, Integer gradeId, Integer userId) throws BusinessCheckException;
+
+ /**
+ * 根据ID删除会员等级
+ *
+ * @param id ID
+ * @param operator 操作人
+ * @throws BusinessCheckException
+ * @return
+ */
+ Integer deleteUserGrade(Integer id, String operator) throws BusinessCheckException;
+
+ /**
+ * 获取默认的会员等级
+ *
+ * @param merchantId
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtUserGrade getInitUserGrade(Integer merchantId) throws BusinessCheckException;
+
+ /**
+ * 获取付费会员等级列表
+ *
+ * @param merchantId
+ * @param userInfo
+ * @throws BusinessCheckException
+ * @return
+ * */
+ List getPayUserGradeList(Integer merchantId, MtUser userInfo) throws BusinessCheckException;
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/VerifyCodeService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/VerifyCodeService.java
new file mode 100644
index 0000000..5b01867
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/VerifyCodeService.java
@@ -0,0 +1,45 @@
+package com.fuint.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.repository.model.MtVerifyCode;
+
+/**
+ * 图形验证码接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface VerifyCodeService extends IService {
+
+ /**
+ * 新增验证码
+ *
+ * @param mobile 手机号
+ * @param verifyCode 验证码
+ * @param expireSecond 间隔秒数
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtVerifyCode addVerifyCode(String mobile, String verifyCode, Integer expireSecond) throws BusinessCheckException;
+
+ /**
+ * 根据手机号,验证码,查询时间
+ *
+ * @param mobile 电话号码
+ * @param verifyCode 验证码
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtVerifyCode checkVerifyCode(String mobile, String verifyCode) throws BusinessCheckException;
+
+ /**
+ * 更改验证码状态
+ *
+ * @param id 验证码ID
+ * @param validFlag 是否验证
+ * @throws BusinessCheckException
+ * @return
+ */
+ MtVerifyCode updateValidFlag(Long id, String validFlag) throws BusinessCheckException;
+}
\ No newline at end of file
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/WeixinService.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/WeixinService.java
new file mode 100644
index 0000000..6ec3dab
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/WeixinService.java
@@ -0,0 +1,178 @@
+package com.fuint.common.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.web.ResponseObject;
+import com.fuint.repository.model.MtOrder;
+import com.fuint.repository.model.MtUser;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.util.Map;
+import java.util.Date;
+
+/**
+ * 微信相关业务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface WeixinService {
+
+ /**
+ * 获取微信登录token
+ *
+ * @param merchantId 商户ID
+ * @param isMinApp 是否小程序
+ * @param useCache 是否从缓存中读取
+ * @return
+ * */
+ String getAccessToken(Integer merchantId, boolean isMinApp, boolean useCache) throws BusinessCheckException;
+
+ /**
+ * 提交预支付订单
+ *
+ * @param userInfo 会员信息
+ * @param orderInfo 订单信息
+ * @param payAmount 支付金额
+ * @param authCode 支付二维码
+ * @param giveAmount 赠送金额
+ * @param ip 支付发起IP
+ * @param platform 支付平台
+ * @param isWechat 是否微信客户端
+ * @return
+ * */
+ ResponseObject createPrepayOrder(MtUser userInfo, MtOrder orderInfo, Integer payAmount, String authCode, Integer giveAmount, String ip, String platform, String isWechat) throws BusinessCheckException;
+
+ /**
+ * 处理返回的xml数据
+ *
+ * @param request 请求体
+ * @return
+ * */
+ Map processResXml(HttpServletRequest request);
+
+ /**
+ * 处理返回的xml数据
+ *
+ * @param response 返回相应
+ * @param flag 标签
+ * @return
+ * */
+ void processRespXml(HttpServletResponse response, boolean flag);
+
+ /**
+ * 获取微信个人信息
+ *
+ * @param merchantId 商户ID
+ * @param code 登录编码
+ * @return
+ * */
+ JSONObject getWxProfile(Integer merchantId, String code) throws BusinessCheckException;
+
+ /**
+ * 获取微信openId
+ *
+ * @param merchantId 商户ID
+ * @param code 登录编码
+ * @return
+ * */
+ JSONObject getWxOpenId(Integer merchantId, String code) throws BusinessCheckException;
+
+ /**
+ * 获取会员微信绑定的手机号
+ *
+ * @param encryptedData 加密的编码(前端返回)
+ * @param sessionKey
+ * @param iv
+ * @return
+ * */
+ String getPhoneNumber(String encryptedData, String sessionKey, String iv);
+
+ /**
+ * 发送订阅消息
+ *
+ * @param merchantId 商户ID
+ * @param userId 会员ID
+ * @param toUserOpenId 会员openID
+ * @param key 消息编码
+ * @param page 跳转页面
+ * @param params 发送参数
+ * @param sendTime 发送时间
+ * @return
+ * */
+ Boolean sendSubscribeMessage(Integer merchantId, Integer userId, String toUserOpenId, String key, String page, Map params, Date sendTime) throws BusinessCheckException;
+
+ /**
+ * 发送订阅消息
+ *
+ * @param merchantId 商户ID
+ * @param reqDataJsonStr 发送参数
+ * @return
+ * */
+ Boolean doSendSubscribeMessage(Integer merchantId, String reqDataJsonStr);
+
+ /**
+ * 查询支付订单
+ *
+ * @param storeId 店铺ID
+ * @param transactionId 交易单号
+ * @param orderSn 订单号
+ * @return
+ * */
+ Map queryPaidOrder(Integer storeId, String transactionId, String orderSn);
+
+ /**
+ * 发起售后
+ *
+ * @param storeId 店铺ID
+ * @param orderSn 订单号
+ * @param totalAmount 订单总金额
+ * @param refundAmount 售后金额
+ * @param platform 平台
+ * @return
+ * */
+ Boolean doRefund(Integer storeId, String orderSn, BigDecimal totalAmount, BigDecimal refundAmount, String platform) throws BusinessCheckException;
+
+ /**
+ * 生成二维码
+ *
+ * @param merchantId 商户ID
+ * @param type 类型
+ * @param id 数据ID
+ * @param page 页面
+ * @param width 宽度
+ * @return
+ * */
+ String createQrCode(Integer merchantId, String type, Integer id, String page, Integer width) throws BusinessCheckException;
+
+ /**
+ * 开通微信卡券
+ *
+ * @param merchantId 商户ID
+ * @param wxCardId 微信会员卡ID
+ * @return
+ * */
+ String createWxCard(Integer merchantId, String wxCardId) throws BusinessCheckException;
+
+ /**
+ * 创建微信卡券领取的二维码
+ *
+ * @param merchantId 商户ID
+ * @param cardId 微信卡券ID
+ * @param code 会员卡编码
+ * @return
+ * */
+ String createCardQrCode(Integer merchantId, String cardId, String code);
+
+ /**
+ * 是否已领取卡券
+ *
+ * @param merchantId 商户ID
+ * @param cardId 微信卡券ID
+ * @param openId openId
+ * @return
+ * */
+ Boolean isOpenCard(Integer merchantId, String cardId, String openId);
+
+}
\ No newline at end of file
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/impl/AccountServiceImpl.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/impl/AccountServiceImpl.java
new file mode 100644
index 0000000..ff82f0d
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/impl/AccountServiceImpl.java
@@ -0,0 +1,411 @@
+package com.fuint.common.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fuint.common.dto.AccountDto;
+import com.fuint.common.dto.AccountInfo;
+import com.fuint.common.enums.StatusEnum;
+import com.fuint.common.service.AccountService;
+import com.fuint.common.service.CaptchaService;
+import com.fuint.common.service.StaffService;
+import com.fuint.common.service.StoreService;
+import com.fuint.common.util.TokenUtil;
+import com.fuint.framework.annoation.OperationServiceLog;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.exception.BusinessRuntimeException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.module.backendApi.request.LoginRequest;
+import com.fuint.module.backendApi.response.LoginResponse;
+import com.fuint.repository.mapper.*;
+import com.fuint.repository.model.*;
+import com.fuint.utils.Digests;
+import com.fuint.utils.Encodes;
+import com.fuint.utils.StringUtil;
+import com.github.pagehelper.Page;
+import com.github.pagehelper.PageHelper;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.util.*;
+
+/**
+ * 后台账号接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Service
+@AllArgsConstructor
+public class AccountServiceImpl extends ServiceImpl implements AccountService {
+
+ private TAccountMapper tAccountMapper;
+
+ private TDutyMapper tDutyMapper;
+
+ private TAccountDutyMapper tAccountDutyMapper;
+
+ private MtMerchantMapper mtMerchantMapper;
+
+ private MtStoreMapper mtStoreMapper;
+
+ /**
+ * 员工接口
+ */
+ private StaffService staffService;
+
+ /**
+ * 店铺服务接口
+ * */
+ private StoreService storeService;
+
+ /**
+ * 验证码服务接口
+ * */
+ private CaptchaService captchaService;
+
+ /**
+ * 分页查询账号列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ @Override
+ public PaginationResponse getAccountListByPagination(PaginationRequest paginationRequest) {
+ Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize());
+ LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery();
+ lambdaQueryWrapper.ne(TAccount::getAccountStatus, -1); // 1:启用;0:禁用;-1:删除
+
+ String name = paginationRequest.getSearchParams().get("name") == null ? "" : paginationRequest.getSearchParams().get("name").toString();
+ if (StringUtils.isNotEmpty(name)) {
+ lambdaQueryWrapper.like(TAccount::getAccountName, name);
+ }
+ String realName = paginationRequest.getSearchParams().get("realName") == null ? "" : paginationRequest.getSearchParams().get("realName").toString();
+ if (StringUtils.isNotEmpty(realName)) {
+ lambdaQueryWrapper.like(TAccount::getRealName, realName);
+ }
+ String status = paginationRequest.getSearchParams().get("status") == null ? "" : paginationRequest.getSearchParams().get("status").toString();
+ if (StringUtils.isNotEmpty(status)) {
+ lambdaQueryWrapper.eq(TAccount::getAccountStatus, status);
+ }
+ String merchantId = paginationRequest.getSearchParams().get("merchantId") == null ? "" : paginationRequest.getSearchParams().get("merchantId").toString();
+ if (StringUtils.isNotEmpty(merchantId)) {
+ lambdaQueryWrapper.eq(TAccount::getMerchantId, merchantId);
+ }
+ String storeId = paginationRequest.getSearchParams().get("storeId") == null ? "" : paginationRequest.getSearchParams().get("storeId").toString();
+ if (StringUtils.isNotEmpty(storeId)) {
+ lambdaQueryWrapper.eq(TAccount::getStoreId, storeId);
+ }
+
+ lambdaQueryWrapper.orderByDesc(TAccount::getAcctId);
+ List accountList = tAccountMapper.selectList(lambdaQueryWrapper);
+ List dataList = new ArrayList<>();
+
+ for (TAccount tAccount : accountList) {
+ AccountDto accountDto = new AccountDto();
+ BeanUtils.copyProperties(tAccount, accountDto);
+ accountDto.setId(tAccount.getAcctId());
+ MtMerchant mtMerchant = mtMerchantMapper.selectById(tAccount.getMerchantId());
+ if (mtMerchant != null) {
+ accountDto.setMerchantName(mtMerchant.getName());
+ }
+ MtStore mtStore = mtStoreMapper.selectById(tAccount.getStoreId());
+ if (mtStore != null) {
+ accountDto.setStoreName(mtStore.getName());
+ }
+ accountDto.setSalt(null);
+ accountDto.setPassword(null);
+ dataList.add(accountDto);
+ }
+
+ PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize());
+ PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal());
+ PaginationResponse paginationResponse = new PaginationResponse(pageImpl, AccountDto.class);
+ paginationResponse.setTotalPages(pageHelper.getPages());
+ paginationResponse.setTotalElements(pageHelper.getTotal());
+ paginationResponse.setContent(dataList);
+
+ return paginationResponse;
+ }
+
+ /**
+ * 根据账号名称获取账号信息
+ *
+ * @param userName 账号名称
+ * @return
+ * */
+ @Override
+ public AccountInfo getAccountByName(String userName) {
+ Map param = new HashMap();
+ param.put("account_name", userName);
+ param.put("account_status", 1);
+ List accountList = tAccountMapper.selectByMap(param);
+ if (accountList != null && accountList.size() > 0) {
+ AccountInfo accountInfo = new AccountInfo();
+ TAccount account = accountList.get(0);
+ accountInfo.setId(account.getAcctId());
+ accountInfo.setAccountName(account.getAccountName());
+ accountInfo.setRealName(account.getRealName());
+ accountInfo.setRoleIds(account.getRoleIds());
+ accountInfo.setStaffId(account.getStaffId());
+ accountInfo.setStoreId(account.getStoreId());
+ accountInfo.setMerchantId(account.getMerchantId());
+ if (account.getMerchantId() != null && account.getMerchantId() > 0) {
+ MtMerchant mtMerchant = mtMerchantMapper.selectById(account.getMerchantId());
+ if (mtMerchant != null) {
+ accountInfo.setMerchantName(mtMerchant.getName());
+ }
+ }
+ if (account.getStoreId() != null && account.getStoreId() > 0) {
+ MtStore mtStore = mtStoreMapper.selectById(account.getStoreId());
+ if (mtStore != null) {
+ accountInfo.setStoreName(mtStore.getName());
+ }
+ }
+ return accountInfo;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * 根据ID获取账号信息
+ *
+ * @param userId 账号ID
+ * @return
+ * */
+ @Override
+ public TAccount getAccountInfoById(Integer userId) {
+ TAccount tAccount = tAccountMapper.selectById(userId);
+ return tAccount;
+ }
+
+ /**
+ * 新增后台账户
+ *
+ * @param tAccount
+ * @return
+ * */
+ @Override
+ @OperationServiceLog(description = "新增后台账户")
+ public TAccount createAccountInfo(TAccount tAccount, List duties) throws BusinessCheckException {
+ TAccount account = new TAccount();
+ account.setAccountKey(tAccount.getAccountKey());
+ account.setAccountName(tAccount.getAccountName().toLowerCase());
+ account.setAccountStatus(1);
+ account.setRealName(tAccount.getRealName());
+ account.setRoleIds(tAccount.getRoleIds());
+ account.setStaffId(tAccount.getStaffId());
+ Integer storeId = tAccount.getStoreId() == null ? 0 : tAccount.getStoreId();
+ if (tAccount.getMerchantId() == null || tAccount.getMerchantId() <= 0) {
+ MtStore mtStore = storeService.queryStoreById(storeId);
+ if (mtStore != null) {
+ tAccount.setMerchantId(mtStore.getMerchantId());
+ }
+ }
+ account.setMerchantId(tAccount.getMerchantId());
+ account.setStoreId(tAccount.getStoreId());
+ account.setCreateDate(new Date());
+ account.setModifyDate(new Date());
+ account.setStoreId(tAccount.getStoreId());
+ account.setStaffId(tAccount.getStaffId());
+ account.setPassword(tAccount.getPassword());
+ this.entryptPassword(account);
+ int id = tAccountMapper.insert(account);
+
+ if (id > 0 && duties != null && duties.size() > 0) {
+ for (TDuty tDuty : duties) {
+ TAccountDuty tAccountDuty = new TAccountDuty();
+ tAccountDuty.setDutyId(tDuty.getDutyId());
+ tAccountDuty.setAcctId(account.getAcctId());
+ tAccountDutyMapper.insert(tAccountDuty);
+ }
+ }
+
+ if (id > 0 ) {
+ return this.getAccountInfoById(id);
+ } else {
+ throw new BusinessRuntimeException("创建账号错误");
+ }
+ }
+
+ /**
+ * 获取账号角色ID
+ *
+ * @param accountId
+ * @return
+ * */
+ @Override
+ public List getRoleIdsByAccountId(Integer accountId) {
+ List roleIds = tDutyMapper.getRoleIdsByAccountId(accountId);
+ return roleIds;
+ }
+
+ /**
+ * 修改账户
+ *
+ * @param tAccount 账户实体
+ * @throws BusinessCheckException
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ @OperationServiceLog(description = "修改后台账户")
+ public void editAccount(TAccount tAccount, List duties) throws BusinessCheckException {
+ TAccount oldAccount = tAccountMapper.selectById(tAccount.getAcctId());
+ if (oldAccount == null) {
+ throw new BusinessCheckException("账户不存在.");
+ }
+ tAccount.setModifyDate(new Date());
+ if (duties != null && duties.size() > 0) {
+ if (tAccount.getAcctId() != null && tAccount.getAcctId() > 0) {
+ tAccountDutyMapper.deleteDutiesByAccountId(tAccount.getAcctId());
+ for (TDuty tDuty : duties) {
+ TAccountDuty tAccountDuty = new TAccountDuty();
+ tAccountDuty.setDutyId(tDuty.getDutyId());
+ tAccountDuty.setAcctId(tAccount.getAcctId());
+ tAccountDutyMapper.insert(tAccountDuty);
+ }
+ }
+ }
+ if (tAccount.getStaffId() != null && tAccount.getStaffId() > 0) {
+ MtStaff mtStaff = staffService.queryStaffById(tAccount.getStaffId());
+ if (mtStaff == null) {
+ tAccount.setStaffId(0);
+ }
+ }
+ tAccountMapper.updateById(tAccount);
+ }
+
+ /**
+ * 根据账户名称获取账户所分配的角色ID集合
+ *
+ * @param accountId 账户
+ * @return 角色ID集合
+ */
+ @Override
+ public List getDutyIdsByAccountId(long accountId) {
+ return tAccountDutyMapper.getDutyIdsByAccountId(accountId);
+ }
+
+ /**
+ * 更新账户
+ *
+ * @param tAccount
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ @OperationServiceLog(description = "修改后台账户")
+ public void updateAccount(TAccount tAccount) {
+ tAccountMapper.updateById(tAccount);
+ }
+
+ /**
+ * 删除账号
+ *
+ * @param accountId 账号ID
+ * @return
+ * */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ @OperationServiceLog(description = "删除后台账户")
+ public void deleteAccount(Long accountId) {
+ TAccount tAccount = tAccountMapper.selectById(accountId);
+ tAccount.setAccountStatus(-1);
+ tAccount.setModifyDate(new Date());
+ tAccountMapper.updateById(tAccount);
+ }
+
+ /**
+ * 设定安全的密码
+ *
+ * @param tAccount 账号信息
+ * @return
+ */
+ @Override
+ public void entryptPassword(TAccount tAccount) {
+ byte[] salt = Digests.generateSalt(8);
+ tAccount.setSalt(Encodes.encodeHex(salt));
+ byte[] hashPassword = Digests.sha1(tAccount.getPassword().getBytes(), salt, 1024);
+ tAccount.setPassword(Encodes.encodeHex(hashPassword));
+ }
+
+ /**
+ * 获取加密密码
+ *
+ * @param password
+ * @param salt
+ * @return
+ * */
+ @Override
+ public String getEntryptPassword(String password, String salt) {
+ byte[] salt1 = Encodes.decodeHex(salt);
+ byte[] hashPassword = Digests.sha1(password.getBytes(), salt1, 1024);
+ return Encodes.encodeHex(hashPassword);
+ }
+
+ /**
+ * 登录后台系统
+ *
+ * @param loginRequest 登录参数
+ * @param userAgent 登录浏览器
+ * @return
+ * */
+ @Override
+ @OperationServiceLog(description = "登录后台系统")
+ public LoginResponse doLogin(LoginRequest loginRequest, String userAgent) throws BusinessCheckException {
+ String accountName = loginRequest.getUsername();
+ String password = loginRequest.getPassword();
+ String captchaCode = loginRequest.getCaptchaCode();
+ String uuid = loginRequest.getUuid();
+
+ Boolean captchaVerify = captchaService.checkCodeByUuid(captchaCode, uuid);
+ if (!captchaVerify) {
+ throw new BusinessCheckException("图形验证码有误");
+ }
+
+ if (StringUtil.isEmpty(accountName)|| StringUtil.isEmpty(password) || StringUtil.isEmpty(captchaCode)) {
+ throw new BusinessCheckException("登录参数有误");
+ } else {
+ AccountInfo accountInfo = getAccountByName(loginRequest.getUsername());
+ if (accountInfo == null) {
+ throw new BusinessCheckException("登录账号或密码有误");
+ }
+
+ TAccount tAccount = getAccountInfoById(accountInfo.getId());
+ String myPassword = tAccount.getPassword();
+ String inputPassword = getEntryptPassword(password, tAccount.getSalt());
+ if (!myPassword.equals(inputPassword) || !tAccount.getAccountStatus().toString().equals("1")) {
+ throw new BusinessCheckException("登录账号或密码有误");
+ }
+
+ // 商户已禁用
+ if (tAccount.getMerchantId() != null && tAccount.getMerchantId() > 0) {
+ MtMerchant mtMerchant = mtMerchantMapper.selectById(tAccount.getMerchantId());
+ if (mtMerchant != null && !mtMerchant.getStatus().equals(StatusEnum.ENABLED.getKey())) {
+ throw new BusinessCheckException("您的商户已被禁用,请联系平台方");
+ }
+ }
+
+ // 店铺已禁用
+ if (tAccount.getStoreId() != null && tAccount.getStoreId() > 0) {
+ MtStore mtStore = mtStoreMapper.selectById(tAccount.getStoreId());
+ if (mtStore != null && !mtStore.getStatus().equals(StatusEnum.ENABLED.getKey())) {
+ throw new BusinessCheckException("您的店铺已被禁用,请联系平台方");
+ }
+ }
+
+ String token = TokenUtil.generateToken(userAgent, accountInfo);
+ LoginResponse response = new LoginResponse();
+ response.setLogin(true);
+ response.setToken(token);
+ response.setTokenCreatedTime(new Date());
+
+ return response;
+ }
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/impl/ActionLogServiceImpl.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/impl/ActionLogServiceImpl.java
new file mode 100644
index 0000000..f90762d
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/impl/ActionLogServiceImpl.java
@@ -0,0 +1,80 @@
+package com.fuint.common.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fuint.common.service.ActionLogService;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.mapper.TActionLogMapper;
+import com.fuint.repository.model.TActionLog;
+import com.github.pagehelper.Page;
+import com.github.pagehelper.PageHelper;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.stereotype.Service;
+import java.util.List;
+
+/**
+ * 日志服务实现类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Service
+@AllArgsConstructor
+public class ActionLogServiceImpl extends ServiceImpl implements ActionLogService {
+
+ private TActionLogMapper tActionLogMapper;
+
+ public void saveActionLog(TActionLog actionLog) {
+ tActionLogMapper.insert(actionLog);
+ }
+
+ public PaginationResponse findLogsByPagination(PaginationRequest paginationRequest) {
+ Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize());
+ LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery();
+ String merchantId = paginationRequest.getSearchParams().get("merchantId") == null ? "" : paginationRequest.getSearchParams().get("merchantId").toString();
+ if (StringUtils.isNotBlank(merchantId)) {
+ lambdaQueryWrapper.eq(TActionLog::getMerchantId, merchantId);
+ }
+ String storeId = paginationRequest.getSearchParams().get("storeId") == null ? "" : paginationRequest.getSearchParams().get("storeId").toString();
+ if (StringUtils.isNotBlank(merchantId)) {
+ lambdaQueryWrapper.eq(TActionLog::getStoreId, storeId);
+ }
+ String module = paginationRequest.getSearchParams().get("module") == null ? "" : paginationRequest.getSearchParams().get("module").toString();
+ if (StringUtils.isNotBlank(module)) {
+ lambdaQueryWrapper.like(TActionLog::getModule, module);
+ }
+ String name = paginationRequest.getSearchParams().get("name") == null ? "" : paginationRequest.getSearchParams().get("name").toString();
+ if (StringUtils.isNotBlank(name)) {
+ lambdaQueryWrapper.eq(TActionLog::getAcctName, name);
+ }
+ String startTime = paginationRequest.getSearchParams().get("startTime") == null ? "" : paginationRequest.getSearchParams().get("startTime").toString();
+ if (StringUtils.isNotBlank(startTime)) {
+ lambdaQueryWrapper.gt(TActionLog::getActionTime, startTime);
+ }
+ String endTime = paginationRequest.getSearchParams().get("endTime") == null ? "" : paginationRequest.getSearchParams().get("endTime").toString();
+ if (StringUtils.isNotBlank(endTime)) {
+ lambdaQueryWrapper.lt(TActionLog::getActionTime, endTime);
+ }
+ String ip = paginationRequest.getSearchParams().get("ip") == null ? "" : paginationRequest.getSearchParams().get("ip").toString();
+ if (StringUtils.isNotBlank(ip)) {
+ lambdaQueryWrapper.eq(TActionLog::getClientIp, ip);
+ }
+
+ lambdaQueryWrapper.orderByDesc(TActionLog::getId);
+ List dataList = tActionLogMapper.selectList(lambdaQueryWrapper);
+
+ PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize());
+ PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal());
+ PaginationResponse paginationResponse = new PaginationResponse(pageImpl, TActionLog.class);
+ paginationResponse.setTotalPages(pageHelper.getPages());
+ paginationResponse.setTotalElements(pageHelper.getTotal());
+ paginationResponse.setContent(dataList);
+
+ return paginationResponse;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/impl/AddressServiceImpl.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/impl/AddressServiceImpl.java
new file mode 100644
index 0000000..b2e07a8
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/impl/AddressServiceImpl.java
@@ -0,0 +1,121 @@
+package com.fuint.common.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fuint.common.service.AddressService;
+import com.fuint.repository.model.MtAddress;
+import com.fuint.repository.mapper.MtAddressMapper;
+import com.fuint.common.enums.YesOrNoEnum;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.common.enums.StatusEnum;
+import com.fuint.utils.StringUtil;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.util.List;
+import java.util.Date;
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * 收货地址业务实现类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Service
+@AllArgsConstructor
+public class AddressServiceImpl extends ServiceImpl implements AddressService {
+
+ private MtAddressMapper mtAddressMapper;
+
+ /**
+ * 保存收货地址
+ *
+ * @param mtAddress
+ * @throws BusinessCheckException
+ * @return
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public MtAddress saveAddress(MtAddress mtAddress) {
+ if (mtAddress.getId() > 0) {
+ MtAddress address = mtAddressMapper.selectById(mtAddress.getId());
+ if (StringUtil.isNotEmpty(mtAddress.getName())) {
+ address.setName(mtAddress.getName());
+ }
+ if (StringUtil.isNotEmpty(mtAddress.getMobile())) {
+ address.setMobile(mtAddress.getMobile());
+ }
+ if (StringUtil.isNotEmpty(mtAddress.getDetail())) {
+ address.setDetail(mtAddress.getDetail());
+ }
+ if (StringUtil.isNotEmpty(mtAddress.getIsDefault())) {
+ if (mtAddress.getIsDefault().equals(YesOrNoEnum.YES.getKey())) {
+ mtAddressMapper.setDefault(mtAddress.getUserId(), mtAddress.getId());
+ }
+ address.setIsDefault(mtAddress.getIsDefault());
+ }
+ if (StringUtil.isNotEmpty(mtAddress.getStatus())) {
+ address.setStatus(mtAddress.getStatus());
+ }
+ if (mtAddress.getProvinceId() > 0) {
+ address.setProvinceId(mtAddress.getProvinceId());
+ }
+ if (mtAddress.getCityId() > 0) {
+ address.setCityId(mtAddress.getCityId());
+ }
+ if (mtAddress.getRegionId() > 0) {
+ address.setRegionId(mtAddress.getRegionId());
+ }
+
+ mtAddressMapper.updateById(address);
+ } else {
+ mtAddress.setCreateTime(new Date());
+ mtAddress.setUpdateTime(new Date());
+ mtAddress.setIsDefault(YesOrNoEnum.YES.getKey());
+
+ this.save(mtAddress);
+ mtAddressMapper.setDefault(mtAddress.getUserId(), mtAddress.getId());
+ }
+
+ return mtAddress;
+ }
+
+ /**
+ * 根据ID获取收货地址
+ *
+ * @param id 地址ID
+ * @throws BusinessCheckException
+ * @return
+ */
+ @Override
+ public MtAddress detail(Integer id) {
+ return mtAddressMapper.selectById(id);
+ }
+
+ /**
+ * 根据条件查询地址列表
+ *
+ * @param params 查询参数
+ * @return
+ * */
+ @Override
+ public List queryListByParams(Map params) {
+ Map param = new HashMap<>();
+
+ String status = params.get("status") == null ? StatusEnum.ENABLED.getKey(): params.get("status").toString();
+ param.put("status", status);
+
+ if (params.get("userId") != null) {
+ param.put("user_id", params.get("userId").toString());
+ }
+
+ if (params.get("isDefault") != null) {
+ param.put("is_default", YesOrNoEnum.YES.getKey());
+ }
+
+ List result = mtAddressMapper.selectByMap(param);
+
+ return result;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/impl/AlipayServiceImpl.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/impl/AlipayServiceImpl.java
new file mode 100644
index 0000000..59d65c5
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/impl/AlipayServiceImpl.java
@@ -0,0 +1,259 @@
+package com.fuint.common.service.impl;
+
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.domain.AlipayTradePayModel;
+import com.alipay.api.domain.AlipayTradeQueryModel;
+import com.alipay.api.domain.AlipayTradeRefundModel;
+import com.alipay.api.internal.util.AlipaySignature;
+import com.alipay.api.response.AlipayTradePayResponse;
+import com.alipay.api.response.AlipayTradeQueryResponse;
+import com.alipay.api.response.AlipayTradeRefundResponse;
+import com.fuint.common.bean.AliPayBean;
+import com.fuint.common.dto.OrderDto;
+import com.fuint.common.dto.UserOrderDto;
+import com.fuint.common.enums.*;
+import com.fuint.common.service.*;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.web.ResponseObject;
+import com.fuint.repository.model.*;
+import com.fuint.utils.StringUtil;
+import com.ijpay.alipay.AliPayApi;
+import com.ijpay.alipay.AliPayApiConfig;
+import com.ijpay.alipay.AliPayApiConfigKit;
+import lombok.AllArgsConstructor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * 支付宝相关接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Service
+@AllArgsConstructor
+public class AlipayServiceImpl implements AlipayService {
+
+ private static final Logger logger = LoggerFactory.getLogger(AlipayServiceImpl.class);
+
+ private AliPayBean aliPayBean;
+
+ /**
+ * 订单服务接口
+ * */
+ private OrderService orderService;
+
+ /**
+ * 店铺服务接口
+ * */
+ private StoreService storeService;
+
+ /**
+ * 创建预支付订单
+ *
+ * @param userInfo 会员信息
+ * @param orderInfo 订单信息
+ * @param payAmount 支付金额
+ * @param authCode 付款码
+ * @param giveAmount 赠送金额
+ * @param ip 支付IP地址
+ * @param platform 支付平台
+ * @return
+ * */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public ResponseObject createPrepayOrder(MtUser userInfo, MtOrder orderInfo, Integer payAmount, String authCode, Integer giveAmount, String ip, String platform) throws BusinessCheckException {
+ logger.info("AlipayService createPrepayOrder inParams userInfo={} payAmount={} giveAmount={} goodsInfo={}", userInfo, payAmount, giveAmount, orderInfo);
+
+ String goodsInfo = orderInfo.getOrderSn();
+ if (orderInfo.getType().equals(OrderTypeEnum.PRESTORE.getKey())) {
+ goodsInfo = OrderTypeEnum.PRESTORE.getValue();
+ }
+
+ // 更新支付金额
+ BigDecimal payAmount1 = new BigDecimal(payAmount).divide(new BigDecimal("100"));
+ OrderDto reqDto = new OrderDto();
+ reqDto.setId(orderInfo.getId());
+ reqDto.setPayAmount(payAmount1);
+ reqDto.setPayType(orderInfo.getPayType());
+ orderService.updateOrder(reqDto);
+
+ getApiConfig(orderInfo.getStoreId());
+ String notifyUrl = aliPayBean.getDomain();
+ AlipayTradePayModel model = new AlipayTradePayModel();
+ model.setAuthCode(authCode);
+ model.setSubject(goodsInfo);
+ model.setTotalAmount(payAmount1.toString());
+ model.setOutTradeNo(orderInfo.getOrderSn());
+ model.setStoreId(orderInfo.getStoreId().toString());
+ model.setScene("bar_code");
+
+ String code = "";
+ try {
+ AlipayTradePayResponse response = AliPayApi.tradePayToResponse(model, notifyUrl);
+ code = response.getCode();
+ String msg = response.getMsg();
+ logger.info("AlipayService createPrepayOrder return code: {}, msg ", code, msg);
+ if (!code.equals("10000") || !msg.equalsIgnoreCase("Success")) {
+ if (code.equals("10003")) {
+ // 需要会员输入支付密码,等待10秒后查询订单
+ try {
+ Thread.sleep(10000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ Map payResult = queryPaidOrder(orderInfo.getStoreId(), response.getTradeNo(), orderInfo.getOrderSn());
+ if (payResult == null) {
+ throw new BusinessCheckException("支付宝支付失败");
+ }
+ } else {
+ throw new BusinessCheckException("支付宝支付出错:" + msg);
+ }
+ }
+ } catch (Exception e) {
+ logger.error("AlipayService createPrepayOrder exception {}", e.getMessage());
+ throw new BusinessCheckException("支付宝支付出错,请检查配置项");
+ }
+
+ Map respData = new HashMap<>();
+ respData.put("result", code);
+
+ ResponseObject responseObject = new ResponseObject(200, "支付宝支付接口返回成功", respData);
+ logger.info("AlipayService createPrepayOrder outParams {}", responseObject.toString());
+
+ return responseObject;
+ }
+
+ /**
+ * 支付回调
+ *
+ * @param params 请求参数
+ * @return
+ * */
+ @Override
+ public Boolean checkCallBack(Map params) throws Exception {
+ String orderSn = params.get("out_trade_no") != null ? params.get("out_trade_no") : "";
+ Integer storeId = 0;
+ UserOrderDto orderDto = orderService.getOrderByOrderSn(orderSn);
+ if (orderDto != null && orderDto.getStoreInfo() != null) {
+ storeId = orderDto.getStoreInfo().getId();
+ }
+ getApiConfig(storeId);
+ return AlipaySignature.rsaCheckV1(params, aliPayBean.getPublicKey(), "UTF-8", "RSA2");
+ }
+
+ /**
+ * 获取支付配置
+ *
+ * @param storeId 店铺ID
+ * @return
+ * */
+ public AliPayApiConfig getApiConfig(Integer storeId) throws BusinessCheckException {
+ AliPayApiConfig aliPayApiConfig;
+ String appId = aliPayBean.getAppId();
+ String privateKey = aliPayBean.getPrivateKey();
+ String publicKey = aliPayBean.getPublicKey();
+
+ // 优先读取店铺的支付账号
+ MtStore mtStore = storeService.queryStoreById(storeId);
+ if (mtStore != null && StringUtil.isNotEmpty(mtStore.getAlipayAppId()) && StringUtil.isNotEmpty(mtStore.getAlipayPrivateKey()) && StringUtil.isNotEmpty(mtStore.getAlipayPublicKey())) {
+ appId = mtStore.getAlipayAppId();
+ privateKey = mtStore.getAlipayPrivateKey();
+ publicKey = mtStore.getAlipayPublicKey();
+ }
+
+ aliPayApiConfig = AliPayApiConfig.builder()
+ .setAppId(appId)
+ .setAliPayPublicKey(publicKey)
+ .setCharset("UTF-8")
+ .setPrivateKey(privateKey)
+ .setServiceUrl(aliPayBean.getServerUrl())
+ .setSignType("RSA2")
+ .build();
+
+ AliPayApiConfigKit.setThreadLocalAppId(appId);
+ AliPayApiConfigKit.setThreadLocalAliPayApiConfig(aliPayApiConfig);
+
+ return aliPayApiConfig;
+ }
+
+ /**
+ * 查询支付订单
+ *
+ * @param storeId 店铺ID
+ * @param tradeNo 交易单号
+ * @param orderSn 订单号
+ * @return
+ * */
+ @Override
+ public Map queryPaidOrder(Integer storeId, String tradeNo, String orderSn) throws BusinessCheckException {
+ try {
+ AlipayTradeQueryModel model = new AlipayTradeQueryModel();
+ if (StringUtil.isNotEmpty(orderSn)) {
+ model.setOutTradeNo(orderSn);
+ }
+ if (StringUtil.isNotEmpty(tradeNo)) {
+ model.setTradeNo(tradeNo);
+ }
+ getApiConfig(storeId);
+ AlipayTradeQueryResponse response = AliPayApi.tradeQueryToResponse(model);
+ if (response != null) {
+ // TradeStatus:TRADE_SUCCESS(交易支付成功,可进行退款)或 TRADE_FINISHED(交易结束,不可退款)
+ if (response.getTradeStatus() != null && response.getTradeStatus().equals("TRADE_SUCCESS")) {
+ Map result = new HashMap<>();
+ result.put("tradeNo", response.getTradeNo());
+ result.put("status", response.getTradeStatus());
+ result.put("payAmount", response.getBuyerPayAmount());
+ return result;
+ }
+ }
+ } catch (AlipayApiException e) {
+ logger.info("AlipayService queryPaidOrder response", e.getMessage());
+ }
+
+ return null;
+ }
+
+ /**
+ * 发起售后退款
+ *
+ * @param storeId 店铺ID
+ * @param orderSn 订单号
+ * @param totalAmount 订单总金额
+ * @param refundAmount 售后金额
+ * @param platform 订单平台
+ * @return
+ * */
+ public Boolean doRefund(Integer storeId, String orderSn, BigDecimal totalAmount, BigDecimal refundAmount, String platform) throws BusinessCheckException {
+ try {
+ logger.info("AlipayService.doRefund orderSn = {}, totalFee = {}, refundFee = {}", orderSn, totalAmount, refundAmount);
+ if (StringUtil.isEmpty(orderSn)) {
+ throw new BusinessCheckException("退款订单号不能为空...");
+ }
+ if (refundAmount.compareTo(totalAmount) > 0) {
+ throw new BusinessCheckException("退款金额不能大于总金额...");
+ }
+ getApiConfig(storeId);
+ AlipayTradeRefundModel model = new AlipayTradeRefundModel();
+ model.setOutTradeNo(orderSn);
+ model.setRefundAmount(refundAmount.toString());
+ model.setRefundReason("申请退款");
+ AlipayTradeRefundResponse refundResponse = AliPayApi.tradeRefundToResponse(model);
+ String code = refundResponse.getCode();
+ String msg = refundResponse.getMsg();
+ String subMsg = refundResponse.getSubMsg() == null ? msg : refundResponse.getSubMsg();
+ logger.info("AlipayService refundResult response Body = {}", refundResponse.getBody());
+ if (!code.equals("10000") || !msg.equalsIgnoreCase("Success")) {
+ throw new BusinessCheckException("支付宝退款失败," + subMsg);
+ }
+ } catch (AlipayApiException e) {
+ logger.error("AlipayService.doRefund error = {}", e.getMessage());
+ e.printStackTrace();
+ }
+ return true;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/impl/ArticleServiceImpl.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/impl/ArticleServiceImpl.java
new file mode 100644
index 0000000..83f23ec
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/impl/ArticleServiceImpl.java
@@ -0,0 +1,277 @@
+package com.fuint.common.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fuint.common.dto.ArticleDto;
+import com.fuint.common.service.ArticleService;
+import com.fuint.common.service.MerchantService;
+import com.fuint.common.service.StoreService;
+import com.fuint.framework.annoation.OperationServiceLog;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.mapper.MtArticleMapper;
+import com.fuint.repository.model.MtArticle;
+import com.fuint.common.service.SettingService;
+import com.fuint.common.enums.StatusEnum;
+import com.fuint.repository.model.MtStore;
+import com.github.pagehelper.PageHelper;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import com.github.pagehelper.Page;
+import org.springframework.beans.BeanUtils;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.util.*;
+
+/**
+ * 文章服务接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Service
+@AllArgsConstructor
+public class ArticleServiceImpl extends ServiceImpl implements ArticleService {
+
+ private MtArticleMapper mtArticleMapper;
+
+ /**
+ * 系统设置服务接口
+ * */
+ private SettingService settingService;
+
+ /**
+ * 商户服务接口
+ * */
+ private MerchantService merchantService;
+
+ /**
+ * 店铺接口
+ */
+ private StoreService storeService;
+
+ /**
+ * 分页查询文章列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ @Override
+ public PaginationResponse queryArticleListByPagination(PaginationRequest paginationRequest) {
+ Page pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize());
+ LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery();
+ lambdaQueryWrapper.ne(MtArticle::getStatus, StatusEnum.DISABLE.getKey());
+
+ String title = paginationRequest.getSearchParams().get("title") == null ? "" : paginationRequest.getSearchParams().get("title").toString();
+ if (StringUtils.isNotBlank(title)) {
+ lambdaQueryWrapper.like(MtArticle::getTitle, title);
+ }
+ String status = paginationRequest.getSearchParams().get("status") == null ? "" : paginationRequest.getSearchParams().get("status").toString();
+ if (StringUtils.isNotBlank(status)) {
+ lambdaQueryWrapper.eq(MtArticle::getStatus, status);
+ }
+ String merchantId = paginationRequest.getSearchParams().get("merchantId") == null ? "" : paginationRequest.getSearchParams().get("merchantId").toString();
+ if (StringUtils.isNotBlank(merchantId)) {
+ lambdaQueryWrapper.eq(MtArticle::getMerchantId, merchantId);
+ }
+ String merchantNo = paginationRequest.getSearchParams().get("merchantNo") == null ? "" : paginationRequest.getSearchParams().get("merchantNo").toString();
+ Integer mchId = merchantService.getMerchantId(merchantNo);
+ if (mchId > 0) {
+ lambdaQueryWrapper.eq(MtArticle::getMerchantId, mchId);
+ }
+ String storeId = paginationRequest.getSearchParams().get("storeId") == null ? "" : paginationRequest.getSearchParams().get("storeId").toString();
+ if (StringUtils.isNotBlank(storeId)) {
+ lambdaQueryWrapper.and(wq -> wq
+ .eq(MtArticle::getStoreId, 0)
+ .or()
+ .eq(MtArticle::getStoreId, storeId));
+ }
+ lambdaQueryWrapper.orderByAsc(MtArticle::getSort);
+ List articleList = mtArticleMapper.selectList(lambdaQueryWrapper);
+ List dataList = new ArrayList<>();
+
+ String basePath = settingService.getUploadBasePath();
+ for (MtArticle mtArticle : articleList) {
+ ArticleDto articleDto = new ArticleDto();
+ BeanUtils.copyProperties(mtArticle, articleDto);
+ articleDto.setImage(basePath + mtArticle.getImage());
+ dataList.add(articleDto);
+ }
+
+ PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize());
+ PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal());
+ PaginationResponse paginationResponse = new PaginationResponse(pageImpl, ArticleDto.class);
+ paginationResponse.setTotalPages(pageHelper.getPages());
+ paginationResponse.setTotalElements(pageHelper.getTotal());
+ paginationResponse.setContent(dataList);
+
+ return paginationResponse;
+ }
+
+ /**
+ * 添加文章
+ *
+ * @param articleDto 文章参数
+ * @return
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ @OperationServiceLog(description = "新增文章")
+ public MtArticle addArticle(ArticleDto articleDto) throws BusinessCheckException {
+ MtArticle mtArticle = new MtArticle();
+ mtArticle.setTitle(articleDto.getTitle());
+ mtArticle.setBrief(articleDto.getBrief());
+ Integer storeId = articleDto.getStoreId() == null ? 0 : articleDto.getStoreId();
+ if (articleDto.getMerchantId() == null || articleDto.getMerchantId() <= 0) {
+ MtStore mtStore = storeService.queryStoreById(storeId);
+ if (mtStore != null) {
+ articleDto.setMerchantId(mtStore.getMerchantId());
+ }
+ }
+ mtArticle.setMerchantId(articleDto.getMerchantId());
+ mtArticle.setStoreId(storeId);
+ mtArticle.setUrl(articleDto.getUrl());
+ mtArticle.setClick(0l);
+ mtArticle.setStatus(StatusEnum.ENABLED.getKey());
+ mtArticle.setImage(articleDto.getImage());
+ mtArticle.setDescription(articleDto.getDescription());
+ mtArticle.setOperator(articleDto.getOperator());
+ mtArticle.setUpdateTime(new Date());
+ mtArticle.setCreateTime(new Date());
+ mtArticle.setSort(articleDto.getSort());
+ mtArticle.setMerchantId(articleDto.getMerchantId());
+ Integer id = mtArticleMapper.insert(mtArticle);
+ if (id > 0) {
+ return mtArticle;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * 根据ID获取文章
+ *
+ * @param articleId 文章ID
+ * @return
+ */
+ @Override
+ public MtArticle queryArticleById(Integer articleId) {
+ return mtArticleMapper.selectById(articleId);
+ }
+
+ /**
+ * 根据ID获取文章详情
+ *
+ * @param articleId 文章ID
+ * @return
+ */
+ @Override
+ public ArticleDto getArticleDetail(Integer articleId) {
+ MtArticle mtArticle = mtArticleMapper.selectById(articleId);
+ ArticleDto articleDto = new ArticleDto();
+ BeanUtils.copyProperties(mtArticle, articleDto);
+ String baseImage = settingService.getUploadBasePath();
+ articleDto.setImage(baseImage + mtArticle.getImage());
+ return articleDto;
+ }
+
+ /**
+ * 编辑文章
+ *
+ * @param articleDto 文章参数
+ * @throws BusinessCheckException
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ @OperationServiceLog(description = "编辑文章")
+ public MtArticle updateArticle(ArticleDto articleDto) throws BusinessCheckException {
+ MtArticle mtArticle = queryArticleById(articleDto.getId());
+ if (mtArticle == null) {
+ throw new BusinessCheckException("该文章状态异常");
+ }
+ mtArticle.setId(articleDto.getId());
+ if (articleDto.getImage() != null) {
+ mtArticle.setImage(articleDto.getImage());
+ }
+ if (articleDto.getTitle() != null) {
+ mtArticle.setTitle(articleDto.getTitle());
+ }
+ if (articleDto.getBrief() != null) {
+ mtArticle.setBrief(articleDto.getBrief());
+ }
+ if (articleDto.getClick() != null) {
+ mtArticle.setClick(articleDto.getClick());
+ }
+ if (articleDto.getMerchantId() != null) {
+ mtArticle.setMerchantId(articleDto.getMerchantId());
+ }
+ if (articleDto.getStoreId() != null) {
+ mtArticle.setStoreId(articleDto.getStoreId());
+ }
+ if (articleDto.getDescription() != null) {
+ mtArticle.setDescription(articleDto.getDescription());
+ }
+ if (articleDto.getOperator() != null) {
+ mtArticle.setOperator(articleDto.getOperator());
+ }
+ if (articleDto.getStatus() != null) {
+ mtArticle.setStatus(articleDto.getStatus());
+ }
+ if (articleDto.getUrl() != null) {
+ mtArticle.setUrl(articleDto.getUrl());
+ }
+ if (articleDto.getSort() != null) {
+ mtArticle.setSort(articleDto.getSort());
+ }
+ mtArticle.setUpdateTime(new Date());
+ mtArticleMapper.updateById(mtArticle);
+ return mtArticle;
+ }
+
+ /**
+ * 根据条件搜索文章
+ *
+ * @param params 搜索条件
+ * @return
+ * */
+ @Override
+ public List queryArticleListByParams(Map params) {
+ String status = params.get("status") == null ? StatusEnum.ENABLED.getKey(): params.get("status").toString();
+ String storeId = params.get("storeId") == null ? "" : params.get("storeId").toString();
+ String title = params.get("title") == null ? "" : params.get("title").toString();
+ String merchantId = params.get("merchantId") == null ? "" : params.get("merchantId").toString();
+
+ LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery();
+ if (StringUtils.isNotBlank(merchantId)) {
+ lambdaQueryWrapper.like(MtArticle::getMerchantId, merchantId);
+ }
+ if (StringUtils.isNotBlank(title)) {
+ lambdaQueryWrapper.like(MtArticle::getTitle, title);
+ }
+ if (StringUtils.isNotBlank(status)) {
+ lambdaQueryWrapper.eq(MtArticle::getStatus, status);
+ }
+ if (StringUtils.isNotBlank(storeId)) {
+ lambdaQueryWrapper.and(wq -> wq
+ .eq(MtArticle::getStoreId, 0)
+ .or()
+ .eq(MtArticle::getStoreId, storeId));
+ }
+
+ lambdaQueryWrapper.orderByAsc(MtArticle::getSort);
+ List dataList = mtArticleMapper.selectList(lambdaQueryWrapper);
+ String baseImage = settingService.getUploadBasePath();
+
+ if (dataList.size() > 0) {
+ for (MtArticle article : dataList) {
+ article.setImage(baseImage + article.getImage());
+ }
+ }
+
+ return dataList;
+ }
+}
diff --git a/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/impl/BalanceServiceImpl.java b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/impl/BalanceServiceImpl.java
new file mode 100644
index 0000000..fa1f54f
--- /dev/null
+++ b/fuintBackend/fuint-application/src/main/java/com/fuint/common/service/impl/BalanceServiceImpl.java
@@ -0,0 +1,293 @@
+package com.fuint.common.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fuint.common.dto.AccountInfo;
+import com.fuint.common.dto.BalanceDto;
+import com.fuint.common.enums.StatusEnum;
+import com.fuint.common.enums.WxMessageEnum;
+import com.fuint.common.service.BalanceService;
+import com.fuint.common.service.MemberService;
+import com.fuint.common.service.SendSmsService;
+import com.fuint.common.service.WeixinService;
+import com.fuint.common.util.CommonUtil;
+import com.fuint.common.util.DateUtil;
+import com.fuint.common.util.PhoneFormatCheckUtils;
+import com.fuint.framework.annoation.OperationServiceLog;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.mapper.MtBalanceMapper;
+import com.fuint.repository.mapper.MtUserMapper;
+import com.fuint.repository.model.MtBalance;
+import com.fuint.repository.model.MtBanner;
+import com.fuint.repository.model.MtUser;
+import com.fuint.utils.StringUtil;
+import com.github.pagehelper.Page;
+import com.github.pagehelper.PageHelper;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * 余额管理业务实现类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Service
+@AllArgsConstructor
+public class BalanceServiceImpl extends ServiceImpl implements BalanceService {
+
+ private static final Logger logger = LoggerFactory.getLogger(BalanceServiceImpl.class);
+
+ private MtBalanceMapper mtBalanceMapper;
+
+ private MtUserMapper mtUserMapper;
+
+ /**
+ * 微信相关服务接口
+ * */
+ private WeixinService weixinService;
+
+ /**
+ * 会员服务接口
+ * */
+ private MemberService memberService;
+
+ /**
+ * 短信发送服务接口
+ * */
+ private SendSmsService sendSmsService;
+
+ /**
+ * 分页查询余额列表
+ *
+ * @param paginationRequest
+ * @return
+ */
+ @Override
+ public PaginationResponse queryBalanceListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException {
+ LambdaQueryWrapper