diff --git a/message-center-ui/.editorconfig b/message-center-ui/.editorconfig
new file mode 100644
index 0000000..7034f9b
--- /dev/null
+++ b/message-center-ui/.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/message-center-ui/.env.development b/message-center-ui/.env.development
new file mode 100644
index 0000000..ab3b607
--- /dev/null
+++ b/message-center-ui/.env.development
@@ -0,0 +1,11 @@
+# just a flag
+ENV = 'development'
+
+# base api
+VUE_APP_BASE_API = '/api'
+
+## 配置测试和本地开发时的 接口地址
+##VUE_APP_URL = "http://26077a35f5.wicp.vip"
+VUE_APP_URL = "http://26077a35f5.wicp.vip"
+##VUE_APP_URL = "http://127.0.0.1:8111"
+##VUE_APP_URL = "http://1mn7264414.qicp.vip"
diff --git a/message-center-ui/.env.production b/message-center-ui/.env.production
new file mode 100644
index 0000000..61b8a1d
--- /dev/null
+++ b/message-center-ui/.env.production
@@ -0,0 +1,9 @@
+# just a flag
+ENV = 'production'
+
+# base api
+VUE_APP_BASE_API = '/api'
+
+## 配置 正式接口地址
+VUE_APP_URL = "http://218.11.12.154:8111"
+
diff --git a/message-center-ui/.env.staging b/message-center-ui/.env.staging
new file mode 100644
index 0000000..6195736
--- /dev/null
+++ b/message-center-ui/.env.staging
@@ -0,0 +1,7 @@
+NODE_ENV = production
+
+# 测试环境配置
+ENV = 'staging'
+
+# 若依管理系统/测试环境
+VUE_APP_BASE_API = '/stage-api'
diff --git a/message-center-ui/.eslintignore b/message-center-ui/.eslintignore
new file mode 100644
index 0000000..89be6f6
--- /dev/null
+++ b/message-center-ui/.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/message-center-ui/.eslintrc.js b/message-center-ui/.eslintrc.js
new file mode 100644
index 0000000..82bbdee
--- /dev/null
+++ b/message-center-ui/.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/message-center-ui/.gitignore b/message-center-ui/.gitignore
new file mode 100644
index 0000000..78a752d
--- /dev/null
+++ b/message-center-ui/.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/message-center-ui/README.md b/message-center-ui/README.md
new file mode 100644
index 0000000..d8314b4
--- /dev/null
+++ b/message-center-ui/README.md
@@ -0,0 +1,31 @@
+## 开发
+
+```bash
+
+# 进入项目目录
+cd admin-ui
+
+# 安装依赖
+npm install
+
+# 使用taobao的服务器,解决下载速度慢的问题
+npm install --registry=https://registry.npm.taobao.org
+
+# 启动服务
+npm run dev
+```
+
+浏览器访问 http://localhost:80
+- 看运行提示:
+ - Local: http://localhost:1024/
+ - Network: http://192.168.0.117:1024/
+
+## 发布
+
+```bash
+# 构建测试环境
+npm run build:stage
+
+# 构建生产环境
+npm run build:prod
+```
\ No newline at end of file
diff --git a/message-center-ui/babel.config.js b/message-center-ui/babel.config.js
new file mode 100644
index 0000000..b99f001
--- /dev/null
+++ b/message-center-ui/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/message-center-ui/bin/build.bat b/message-center-ui/bin/build.bat
new file mode 100644
index 0000000..dda590d
--- /dev/null
+++ b/message-center-ui/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/message-center-ui/bin/package.bat b/message-center-ui/bin/package.bat
new file mode 100644
index 0000000..8281749
--- /dev/null
+++ b/message-center-ui/bin/package.bat
@@ -0,0 +1,12 @@
+@echo off
+echo.
+echo [Ϣ] װWeḅnode_modulesļ
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+npm install --registry=https://registry.npm.taobao.org
+
+pause
\ No newline at end of file
diff --git a/message-center-ui/bin/run-web.bat b/message-center-ui/bin/run-web.bat
new file mode 100644
index 0000000..d30deae
--- /dev/null
+++ b/message-center-ui/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/message-center-ui/build/index.js b/message-center-ui/build/index.js
new file mode 100644
index 0000000..0c57de2
--- /dev/null
+++ b/message-center-ui/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/message-center-ui/package.json b/message-center-ui/package.json
new file mode 100644
index 0000000..498ed73
--- /dev/null
+++ b/message-center-ui/package.json
@@ -0,0 +1,90 @@
+{
+ "name": "projectName",
+ "version": "1.0.0",
+ "description": "项目中文名",
+ "author": "作者",
+ "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/liuzp315/jbase-springboot.git"
+ },
+ "dependencies": {
+ "@riophae/vue-treeselect": "0.4.0",
+ "axios": "0.21.0",
+ "babel-polyfill": "^6.26.0",
+ "clipboard": "2.0.6",
+ "core-js": "^3.19.1",
+ "echarts": "4.9.0",
+ "element-ui": "2.15.6",
+ "file-saver": "2.0.4",
+ "fuse.js": "6.4.3",
+ "highlight.js": "9.18.5",
+ "js-beautify": "1.13.0",
+ "js-cookie": "2.2.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-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",
+ "chalk": "4.1.0",
+ "connect": "3.6.6",
+ "eslint": "7.15.0",
+ "eslint-plugin-vue": "7.2.0",
+ "lint-staged": "10.5.3",
+ "normalize.css": "^8.0.1",
+ "runjs": "4.4.2",
+ "sass": "1.32.0",
+ "sass-loader": "10.1.0",
+ "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/message-center-ui/public/favicon.ico b/message-center-ui/public/favicon.ico
new file mode 100644
index 0000000..365c24b
Binary files /dev/null and b/message-center-ui/public/favicon.ico differ
diff --git a/message-center-ui/public/html/ie.html b/message-center-ui/public/html/ie.html
new file mode 100644
index 0000000..052ffcd
--- /dev/null
+++ b/message-center-ui/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/message-center-ui/public/index.html b/message-center-ui/public/index.html
new file mode 100644
index 0000000..925455c
--- /dev/null
+++ b/message-center-ui/public/index.html
@@ -0,0 +1,208 @@
+
+
+
+
+
+
+
+
+ <%= webpackConfig.name %>
+
+
+
+
+
+
+
diff --git a/message-center-ui/public/robots.txt b/message-center-ui/public/robots.txt
new file mode 100644
index 0000000..77470cb
--- /dev/null
+++ b/message-center-ui/public/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Disallow: /
\ No newline at end of file
diff --git a/message-center-ui/src/App.vue b/message-center-ui/src/App.vue
new file mode 100644
index 0000000..ce1c0a6
--- /dev/null
+++ b/message-center-ui/src/App.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/message-center-ui/src/api/Common/Upload.js b/message-center-ui/src/api/Common/Upload.js
new file mode 100644
index 0000000..ac8a80c
--- /dev/null
+++ b/message-center-ui/src/api/Common/Upload.js
@@ -0,0 +1,10 @@
+import request from '@/utils/request'
+// 上传图片
+export function imageUpload(data){
+ return request({
+ url: '/jlcyry/file/upload',
+ method: 'post',
+ data,
+ headers:{'Content-Type':'multipart/form-data'}
+ })
+}
diff --git a/message-center-ui/src/api/Common/areaPicker.js b/message-center-ui/src/api/Common/areaPicker.js
new file mode 100644
index 0000000..f43d0a3
--- /dev/null
+++ b/message-center-ui/src/api/Common/areaPicker.js
@@ -0,0 +1,25 @@
+import request from '@/utils/request'
+
+//区域获取省
+export function getProvince(data) {
+ return request({
+ url: '/system/region/getProvince',
+ method: 'get'
+ })
+}
+//根据省sid获取该省的所有市
+export function getCity(data) {
+ return request({
+ url: '/system/region/getCity',
+ method: 'get',
+ params: data
+ })
+}
+//根据市sid获取该市的所有县区
+export function getCounty(data) {
+ return request({
+ url: '/system/region/getCounty',
+ method: 'get',
+ params: data
+ })
+}
diff --git a/message-center-ui/src/api/User/login.js b/message-center-ui/src/api/User/login.js
new file mode 100644
index 0000000..ef4554b
--- /dev/null
+++ b/message-center-ui/src/api/User/login.js
@@ -0,0 +1,36 @@
+import request from '@/utils/request'
+import qs from 'qs'
+
+class user {
+ login(data) { // 登录
+ return request({
+ url: '/system/user/login',
+ method: 'post',
+ data
+ })
+ }
+ logout(data) { // 退出
+ return request({
+ url: '/portal/v1/sysuser/signOut',
+ method: 'post',
+ data: qs.stringify(data)
+ })
+ }
+ updatePassword(data) { // 退出修改密码
+ return request({
+ url: '/portal/v1/sysuser/updatePassword',
+ method: 'post',
+ data: qs.stringify(data)
+ })
+ }
+ reGetPwd(data){
+ return request({
+ url: `/system/user/reGetPwd/${data.userName}/${data.userPhone}`,
+ method: 'post',
+ data: qs.stringify(data)
+ })
+ }
+
+}
+
+export default new user()
\ No newline at end of file
diff --git a/message-center-ui/src/api/anruimessagecenter/message.js b/message-center-ui/src/api/anruimessagecenter/message.js
new file mode 100644
index 0000000..8cfa5d4
--- /dev/null
+++ b/message-center-ui/src/api/anruimessagecenter/message.js
@@ -0,0 +1,41 @@
+import request from '@/utils/request'
+
+export default {
+
+ list: function() {
+ return request({
+ url: '/message/list'
+ })
+ },
+ listPage: function(params) {
+ return request({
+ url: '/message/listPage',
+ method: 'post',
+ data: params
+ })
+ },
+ listAll: function(params) {
+ return request({
+ url: '/message/listAll',
+ method: 'post',
+ data: params
+ })
+ },
+ delete: function(id) {
+ return request({
+ url: '/message/del/' + id
+ })
+ },
+ fetch: function(id) {
+ return request({
+ url: '/message/fetch/' + id
+ })
+ },
+ save: function(params) {
+ return request({
+ url: '/message/save',
+ method: 'post',
+ data: params
+ })
+ }
+}
diff --git a/message-center-ui/src/api/anruimessagecenter/messagefile.js b/message-center-ui/src/api/anruimessagecenter/messagefile.js
new file mode 100644
index 0000000..c374624
--- /dev/null
+++ b/message-center-ui/src/api/anruimessagecenter/messagefile.js
@@ -0,0 +1,41 @@
+import request from '@/utils/request'
+
+export default {
+
+ list: function() {
+ return request({
+ url: '/messagefile/list'
+ })
+ },
+ listPage: function(params) {
+ return request({
+ url: '/messagefile/listPage',
+ method: 'post',
+ data: params
+ })
+ },
+ listAll: function(params) {
+ return request({
+ url: '/messagefile/listAll',
+ method: 'post',
+ data: params
+ })
+ },
+ delete: function(id) {
+ return request({
+ url: '/messagefile/del/' + id
+ })
+ },
+ fetch: function(id) {
+ return request({
+ url: '/messagefile/fetch/' + id
+ })
+ },
+ save: function(params) {
+ return request({
+ url: '/messagefile/save',
+ method: 'post',
+ data: params
+ })
+ }
+}
diff --git a/message-center-ui/src/api/anruimessagecenter/messageforwardlist.js b/message-center-ui/src/api/anruimessagecenter/messageforwardlist.js
new file mode 100644
index 0000000..ec969d7
--- /dev/null
+++ b/message-center-ui/src/api/anruimessagecenter/messageforwardlist.js
@@ -0,0 +1,41 @@
+import request from '@/utils/request'
+
+export default {
+
+ list: function() {
+ return request({
+ url: '/messageforwardlist/list'
+ })
+ },
+ listPage: function(params) {
+ return request({
+ url: '/messageforwardlist/listPage',
+ method: 'post',
+ data: params
+ })
+ },
+ listAll: function(params) {
+ return request({
+ url: '/messageforwardlist/listAll',
+ method: 'post',
+ data: params
+ })
+ },
+ delete: function(id) {
+ return request({
+ url: '/messageforwardlist/del/' + id
+ })
+ },
+ fetch: function(id) {
+ return request({
+ url: '/messageforwardlist/fetch/' + id
+ })
+ },
+ save: function(params) {
+ return request({
+ url: '/messageforwardlist/save',
+ method: 'post',
+ data: params
+ })
+ }
+}
diff --git a/message-center-ui/src/api/anruimessagecenter/messagelist.js b/message-center-ui/src/api/anruimessagecenter/messagelist.js
new file mode 100644
index 0000000..2829f9b
--- /dev/null
+++ b/message-center-ui/src/api/anruimessagecenter/messagelist.js
@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+export default {
+ verifyList:function(data){ // 获取未读消息列表
+ return request({
+ url: '/message/v1/messagelist/noreadListPage',
+ method: 'post',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+ },
+ readVerifyList:function(data){ // 获取已读消息列表
+ return request({
+ url: '/message/v1/messagelist/readListPage',
+ method: 'post',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+ },
+ ChangeRead:function(data){ // 未读消息列表批量设为已读
+ return request({
+ url: '/message/v1/messagelist/changeRead?sids='+data,
+ method: 'get',
+ data: data,
+ })
+ },
+ noChangeRead:function(data){ // 已读消息列表批量设为未读
+ return request({
+ url: '/message/v1/messagelist/noChangeRead?sids='+data,
+ method: 'get',
+ data: data,
+ })
+ },
+ delete:function(data){ // 已读消息列表批量设为未读
+ return request({
+ url: '/message/v1/messagelist/deleteBySids?sids='+data,
+ method: 'get',
+ data: data,
+ })
+ },
+ changeAll:function(){ // 未读消息列表全部设为已读
+ return request({
+ url: '/message/v1/messagelist/allChangeRead/',
+ method: 'get',
+ })
+ },
+ OrgINfo:function(data){ // 获取消息详情
+ return request({
+ url: '/message/v1/messagelist/fetchByMsgSid/'+data.sid,
+ method: 'get',
+ params: data,
+ })
+ },
+}
diff --git a/message-center-ui/src/api/anruimessagecenter/messageremindrule.js b/message-center-ui/src/api/anruimessagecenter/messageremindrule.js
new file mode 100644
index 0000000..014cd87
--- /dev/null
+++ b/message-center-ui/src/api/anruimessagecenter/messageremindrule.js
@@ -0,0 +1,41 @@
+import request from '@/utils/request'
+
+export default {
+
+ list: function() {
+ return request({
+ url: '/messageremindrule/list'
+ })
+ },
+ listPage: function(params) {
+ return request({
+ url: '/messageremindrule/listPage',
+ method: 'post',
+ data: params
+ })
+ },
+ listAll: function(params) {
+ return request({
+ url: '/messageremindrule/listAll',
+ method: 'post',
+ data: params
+ })
+ },
+ delete: function(id) {
+ return request({
+ url: '/messageremindrule/del/' + id
+ })
+ },
+ fetch: function(id) {
+ return request({
+ url: '/messageremindrule/fetch/' + id
+ })
+ },
+ save: function(params) {
+ return request({
+ url: '/messageremindrule/save',
+ method: 'post',
+ data: params
+ })
+ }
+}
diff --git a/message-center-ui/src/api/anruimessagecenter/messagereply.js b/message-center-ui/src/api/anruimessagecenter/messagereply.js
new file mode 100644
index 0000000..b310a21
--- /dev/null
+++ b/message-center-ui/src/api/anruimessagecenter/messagereply.js
@@ -0,0 +1,41 @@
+import request from '@/utils/request'
+
+export default {
+
+ list: function() {
+ return request({
+ url: '/messagereply/list'
+ })
+ },
+ listPage: function(params) {
+ return request({
+ url: '/messagereply/listPage',
+ method: 'post',
+ data: params
+ })
+ },
+ listAll: function(params) {
+ return request({
+ url: '/messagereply/listAll',
+ method: 'post',
+ data: params
+ })
+ },
+ delete: function(id) {
+ return request({
+ url: '/messagereply/del/' + id
+ })
+ },
+ fetch: function(id) {
+ return request({
+ url: '/messagereply/fetch/' + id
+ })
+ },
+ save: function(params) {
+ return request({
+ url: '/messagereply/save',
+ method: 'post',
+ data: params
+ })
+ }
+}
diff --git a/message-center-ui/src/api/login.js b/message-center-ui/src/api/login.js
new file mode 100644
index 0000000..fde73cc
--- /dev/null
+++ b/message-center-ui/src/api/login.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 登录方法
+export function login(username, password, code, uuid) {
+ const data = {
+ username,
+ password,
+ code,
+ uuid
+ }
+ return request({
+ url: '/login',
+ method: 'post',
+ data: data
+ })
+}
+// 获取用户详细信息
+export function getInfo() {
+ return request({
+ url: '/getInfo',
+ method: 'get'
+ })
+}
+// 退出方法
+export function logout() {
+ return request({
+ url: '/logout',
+ method: 'post'
+ })
+}
+// 获取验证码
+export function getCodeImg() {
+ return request({
+ url: '/captchaImage',
+ method: 'get'
+ })
+}
+// 获取路由
+export const getRouters = () => {
+ return request({
+ url: '/getRouters',
+ method: 'get'
+ })
+}
diff --git a/message-center-ui/src/api/system/Role/role.js b/message-center-ui/src/api/system/Role/role.js
new file mode 100644
index 0000000..7b63738
--- /dev/null
+++ b/message-center-ui/src/api/system/Role/role.js
@@ -0,0 +1,34 @@
+import request from '@/utils/request'
+import qs from 'qs'
+let tokens = window.sessionStorage.getItem('token');
+//
+export function rolemenus(data) {
+ return request({
+ url: '/system/v1/rolemenus/'+data.roleSid,
+ method: 'get',
+ params: data
+ })
+}
+
+// 获取左侧菜单
+export function getrolemenus(data) {
+ return request({
+ url: '/portal/v1/sysmenu/sourcemenutree',
+ method: 'POST',
+ async: false,
+// data: {userSid: data.userSid, sourceSid: '000011'},
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens}
+ })
+}
+
+// 获取角色的主页菜单
+export function sourcesofrole(data) {
+ return request({
+ url: '/system/v1/rolemenus/sourcesofrole',
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+}
diff --git a/message-center-ui/src/api/system/Role/roleManage.js b/message-center-ui/src/api/system/Role/roleManage.js
new file mode 100644
index 0000000..e3de51c
--- /dev/null
+++ b/message-center-ui/src/api/system/Role/roleManage.js
@@ -0,0 +1,69 @@
+import request from '@/utils/request'
+import qs from 'qs'
+
+// 获取角色 不分页列表
+export function roleList(data) {
+ return request({
+ url: '/system/v1/roles/list/',
+ method: 'post',
+ data: qs.stringify(data)
+ })
+}
+
+
+//获取角色 分页列表
+export function rolePageList(data) {
+ return request({
+ url: '/system/v1/roles/pagelist',
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+}
+
+//保存 角色信息
+export function saveRoleInfo(data) {
+ return request({
+ url: '/system/v1/roles',
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+}
+
+//根据sid 获取单个角色 信息
+export function getRoleInfo(data) {
+ return request({
+ url: '/system/v1/roles/' + data.sid,
+ method: 'GET',
+ data: qs.stringify(data)
+ })
+}
+
+//根据sid 修改单个角色 信息
+export function putRoleInfo(data) {
+ return request({
+ url: '/system/v1/roles/' + data.sid,
+ method: 'PUT',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+}
+
+//根据sid 删除单个角色 信息
+export function delRole(data) {
+ return request({
+ url: '/system/v1/roles/' + data.sid,
+ method: 'DELETE',
+ data: qs.stringify(data)
+ })
+}
+
+//根据sid 设置单个角色 的状态
+export function setRoleEnable(data) {
+ return request({
+ url: `/system/v1/roles/setIsEnable/${data.sid}/${data.isEnable}`,
+ method: 'POST',
+ data: qs.stringify(data)
+ })
+}
diff --git a/message-center-ui/src/api/system/dataDict/dataDict.js b/message-center-ui/src/api/system/dataDict/dataDict.js
new file mode 100644
index 0000000..15df050
--- /dev/null
+++ b/message-center-ui/src/api/system/dataDict/dataDict.js
@@ -0,0 +1,32 @@
+import request from '@/utils/request'
+import qs from 'qs'
+//获取单位级别
+export function getDwJb(data) {
+ return request({
+ url: '/system/dictCommon/getDwJb',
+ method: 'GET',
+ })
+}
+// 获取机构单位类别
+export function getDwType(data) {
+ return request({
+ url: '/system/dictCommon/getDwType',
+ method: 'get',
+ params: data
+ })
+}
+//获取机构人员类别
+export function getRylb(data) {
+ return request({
+ url: '/system/dictCommon/getRylb',
+ method: 'get'
+ })
+}
+
+// 根据Type值获取数据对象
+export function getDicts(typeCode) {
+ return request({
+ url: '/system/dictCommon/dicts/'+typeCode,
+ method: 'get'
+ })
+}
diff --git a/message-center-ui/src/api/system/departments/departments.js b/message-center-ui/src/api/system/departments/departments.js
new file mode 100644
index 0000000..0271273
--- /dev/null
+++ b/message-center-ui/src/api/system/departments/departments.js
@@ -0,0 +1,97 @@
+import request from '@/utils/request'
+import qs from 'qs';
+
+//let tokens = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTm8iOiI2IiwiaXNzIjoiV0JLIiwiZXhwIjoxNjMwMDI3MDA3fQ.9bEgBzFW2g1CUT7s5VXxhNCa10cyU_WTCFeqpQje0iY'
+let tokens = window.sessionStorage.getItem('token');
+//获取菜单 分页列表
+export function pageList(data) {
+ return request({
+ url: '/portal/v1/sysorganization/listPage',
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 查询左侧部门列表
+export function orgList(data){
+ return request({
+ url: '/portal/v1/sysorganization/list',
+ method: 'get',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 编辑部门信息
+export function postOrgtree(data){
+ return request({
+ url: '/portal/v1/sysorganization/update/' +data.sid,
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 获取 机构分页列表
+export function putOrgtree(data) {
+ return request({
+ url: '/portal/v1/sysorganization/update/' +data.sid,
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens}
+ })
+}
+// 新增部门信息
+export function addOrgTree(data){
+ return request({
+ url: '/portal/v1/sysorganization/save',
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 树 节点名称 删除
+export function delOrgtree(data) {
+ return request({
+ url: `/portal/v1/sysorganization/delBySid/`+data.sid,
+ method: 'get',
+ data: qs.stringify(data),
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 查询主管人员分管人员
+export function getStaff(data) {
+ return request({
+ url: '/portal/v1/sysstafforg/staffinfoList',
+ method: 'post',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+
+
+
+
+
+
+
+
+// 查看二维码
+export function getQrCode(data) {
+ return request({
+ url: `/system/v1/departments/getQrCode/`+data.sid,
+ method: 'POST',
+ data: qs.stringify(data)
+ })
+}
diff --git a/message-center-ui/src/api/system/dictType/dictCommon.js b/message-center-ui/src/api/system/dictType/dictCommon.js
new file mode 100644
index 0000000..10029f5
--- /dev/null
+++ b/message-center-ui/src/api/system/dictType/dictCommon.js
@@ -0,0 +1,58 @@
+import request from '@/utils/request'
+import qs from 'qs'
+let tokens = window.sessionStorage.getItem('token');
+
+//获取字典子集 分页列表
+export function dictCommonList(data) {
+ return request({
+ url: '/portal/v1/dictcommons/pageList',
+ method: 'post',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+}
+
+//保存 字典子级
+export function savedictCommon(data) {
+ return request({
+ url: '/portal/v1/dictcommons/save',
+ method: 'POST',
+ data: data ,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+
+//根据sid 获取单个菜单 信息
+export function getRoleInfo(data) {
+ return request({
+ url: '/system/v1/menus/' + data.sid,
+ method: 'GET',
+ data: qs.stringify(data)
+ })
+}
+
+//根据sid 修改 数据字典
+export function putdictCommon(data) {
+ return request({
+ url: '/portal/v1/dictcommons/update/' + data.sid,
+ method: 'POST',
+ data: data ,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+
+//根据sid 删除菜单 信息
+export function deldictCommon(data) {
+ return request({
+ url: '/portal/v1/dictcommons/delete/' + data.sid,
+ method: 'DELETE',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
diff --git a/message-center-ui/src/api/system/dictType/index.js b/message-center-ui/src/api/system/dictType/index.js
new file mode 100644
index 0000000..669fa9e
--- /dev/null
+++ b/message-center-ui/src/api/system/dictType/index.js
@@ -0,0 +1,68 @@
+import request from '@/utils/request'
+import qs from 'qs'
+//let tokens = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTm8iOiI2IiwiaXNzIjoiV0JLIiwiZXhwIjoxNjMwMDI3MDA3fQ.9bEgBzFW2g1CUT7s5VXxhNCa10cyU_WTCFeqpQje0iY'
+let tokens = window.sessionStorage.getItem('token');
+
+//获取菜单 分页列表
+export function pageList(data) {
+ return request({
+ url: '/portal/v1/dicttypes/pageList',
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+//根据sid 修改
+export function putDictType(data) {
+ return request({
+ url: '/portal/v1/dicttypes/update/' + data.sid,
+ method: 'POST',
+ data: qs.stringify(data)
+ })
+}
+////获取菜单 分页列表
+//export function dictTypeList(data) {
+//return request({
+// url: '/system/dicttype/pageList',
+// method: 'post',
+// data: data,
+// headers: {'Content-Type': 'application/json'}
+//})
+//}
+
+//保存 角色信息
+export function saveDictType(data) {
+ return request({
+ url: '/portal/v1/dicttypes/save',
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+
+//根据sid 获取单个菜单 信息
+export function getRoleInfo(data) {
+ return request({
+ url: '/system/v1/menus/' + data.sid,
+ method: 'GET',
+ data: qs.stringify(data)
+ })
+}
+
+
+
+//根据sid 删除菜单 信息
+export function delDictType(data) {
+ return request({
+ url: '/portal/v1/dicttypes/delete/' + data.sid,
+ method: 'DELETE',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
diff --git a/message-center-ui/src/api/system/functional/functional.js b/message-center-ui/src/api/system/functional/functional.js
new file mode 100644
index 0000000..ed3b066
--- /dev/null
+++ b/message-center-ui/src/api/system/functional/functional.js
@@ -0,0 +1,84 @@
+import request from '@/utils/request'
+import qs from 'qs'
+//let tokens = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTm8iOiI2IiwiaXNzIjoiV0JLIiwiZXhwIjoxNjMwMDI3MDA3fQ.9bEgBzFW2g1CUT7s5VXxhNCa10cyU_WTCFeqpQje0iY'
+let tokens = window.sessionStorage.getItem('token');
+//获取菜单 分页列表
+export function pageList(data) {
+ return request({
+ url: '/portal/v1/sysfunction/listAllVoForSource',
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+
+//新增
+export function savePost(data) {
+ return request({
+ url: '/portal/v1/sysfunction/save',
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+
+//模块名称
+export function sourceList(data) {
+ return request({
+ url: '/portal/v1/syssource/listAll',
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 删除
+export function delOrgroles(data) {
+ return request({
+ url: '/portal/v1/sysfunction/delBySids/'+ data.sid,
+ method: 'get',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+
+// 修改
+export function getSingleData(data){
+ return request({
+ url: '/portal/v1/sysfunction/fetchBySid/'+data.id,
+ method: 'get',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+export function putOrgroles(data){
+ return request({
+ url: '/portal/v1/sysfunction/update/' +data.sid,
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+
+// 功能是否可用状态
+export function IsEnable(data){
+ return request({
+ url: '/portal/v1/sysfunction/updateIsEnable/' +data.sid,
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
\ No newline at end of file
diff --git a/message-center-ui/src/api/system/log/index.js b/message-center-ui/src/api/system/log/index.js
new file mode 100644
index 0000000..a4dfd39
--- /dev/null
+++ b/message-center-ui/src/api/system/log/index.js
@@ -0,0 +1,16 @@
+import request from '@/utils/request'
+import qs from 'qs'
+//let tokens = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTm8iOiI2IiwiaXNzIjoiV0JLIiwiZXhwIjoxNjMwMDI3MDA3fQ.9bEgBzFW2g1CUT7s5VXxhNCa10cyU_WTCFeqpQje0iY'
+let tokens = window.sessionStorage.getItem('token');
+//获取菜单 分页列表
+export function logPageList(data) {
+ return request({
+ url: '/portal/v1/systemlog/listPage',
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+
diff --git a/message-center-ui/src/api/system/menu/index.js b/message-center-ui/src/api/system/menu/index.js
new file mode 100644
index 0000000..08a617c
--- /dev/null
+++ b/message-center-ui/src/api/system/menu/index.js
@@ -0,0 +1,115 @@
+import request from '@/utils/request'
+import qs from 'qs'
+//let tokens = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTm8iOiI2IiwiaXNzIjoiV0JLIiwiZXhwIjoxNjMwMDI3MDA3fQ.9bEgBzFW2g1CUT7s5VXxhNCa10cyU_WTCFeqpQje0iY'
+
+let tokens = window.sessionStorage.getItem('token');
+//获取菜单 分页列表
+export function pageList(data) {
+ return request({
+ url: '/portal/v1/sysmenu/listAllVoForSource',
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 新增保存 菜单信息
+export function saveMenusInfo(data) {
+ return request({
+ url: '/portal/v1/sysmenu/save',
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+}
+// 修改保存 菜单信息
+export function putMenusInfo(data) {
+ return request({
+ url: '/portal/v1/sysmenu/update/'+ data.sid,
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+}
+//根据sid 删除单个 资源信息
+export function delMenus(data) {
+ return request({
+ url: '/portal/v1/sysmenu/delBySids/' + data.sid,
+ method: 'get',
+ data: qs.stringify(data),
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+
+// 修改状态
+export function IsEnable(data) {
+ return request({
+ url: '/portal/v1/sysmenu/updateIsEnable/' + data.sid,
+ method: 'POST',
+ data: qs.stringify(data),
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+// 获取菜单 不分页列表
+export function roleList(data) {
+ return request({
+ url: '/system/v1/menus/list',
+ method: 'post',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+}
+
+//获取菜单 分页列表
+export function menusPageList(data) {
+ return request({
+ url: '/system/v1/menus/pagelist',
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+}
+
+//获取菜单 树形分页列表
+export function menusTreelist(data) {
+ return request({
+ url: '/system/v1/menus/treelist',
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+}
+
+
+
+//根据sid 获取单个菜单 信息
+export function getRoleInfo(data) {
+ return request({
+ url: '/system/v1/menus/' + data.sid,
+ method: 'GET',
+ data: qs.stringify(data)
+ })
+}
+
+
+
+
diff --git a/message-center-ui/src/api/system/organization/organization.js b/message-center-ui/src/api/system/organization/organization.js
new file mode 100644
index 0000000..1cf938e
--- /dev/null
+++ b/message-center-ui/src/api/system/organization/organization.js
@@ -0,0 +1,36 @@
+import request from '@/utils/request'
+import qs from 'qs'
+let tokens = window.sessionStorage.getItem('token');
+class user{
+ verifyList(data){ // 获取列表
+ return request({
+ url: '/system/organization/verifyList',
+ method: 'post',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+ }
+ orgRegisterDetails(data){ // 单位注册信息详情
+ return request({
+ url: '/system/organization/organizationRegisterDetails/'+data.organizationSid,
+ method: 'get',
+ params: data
+ })
+ }
+ verify(data){ // 审核
+ return request({
+ url: '/system/organization/verify',
+ method: 'post',
+ data: qs.stringify(data)
+ })
+ }
+ // 删除机构信息
+ del(data) {
+ return request({
+ url: '/system/organization/delete/'+data.sid,
+ method: 'DELETE',
+ data
+ })
+ }
+}
+export default new user()
diff --git a/message-center-ui/src/api/system/postManage/index.js b/message-center-ui/src/api/system/postManage/index.js
new file mode 100644
index 0000000..5d110f5
--- /dev/null
+++ b/message-center-ui/src/api/system/postManage/index.js
@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+import qs from 'qs'
+//let tokens = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTm8iOiI2IiwiaXNzIjoiV0JLIiwiZXhwIjoxNjMwMTE1MjUwfQ.gtn_mVsbwH6ztl835rWmIY4DxeNmRe_TOt-Q0TdldIE'
+let tokens = window.sessionStorage.getItem('token');
+//获取菜单 分页列表
+export function pageList(data) {
+ return request({
+ url: '/portal/v1/syspost/listPage',
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+
+// 查询部门列表
+export function orgList(data){
+ return request({
+ url: '/portal/v1/sysorganization/list',
+ method: 'get',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 新增
+export function savePost(data){
+ return request({
+ url: '/portal/v1/syspost/save',
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 修改
+export function putOrgroles(data){
+ return request({
+ url: '/portal/v1/syspost/update/' +data.sid,
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+
+// 删除
+export function delOrgroles(data){
+ return request({
+ url: '/portal/v1/syspost/delBySids/' + data.sids,
+ method: 'get',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
\ No newline at end of file
diff --git a/message-center-ui/src/api/system/roleAdminister/index.js b/message-center-ui/src/api/system/roleAdminister/index.js
new file mode 100644
index 0000000..da00965
--- /dev/null
+++ b/message-center-ui/src/api/system/roleAdminister/index.js
@@ -0,0 +1,139 @@
+import request from '@/utils/request'
+import qs from 'qs'
+//let tokens = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTm8iOiI2IiwiaXNzIjoiV0JLIiwiZXhwIjoxNjI5OTQxNjI1fQ.aOFOz0h7c8YQs-ti2GLpqeWu4AE9mifx_043hLJQf8g'
+let tokens = window.sessionStorage.getItem('token');
+// 业务角色 列表
+export function roleOrgList(data){
+ return request({
+ url: '/portal/v1/sysrole/listPage',
+ method: 'post',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+
+// 设置是否可用:isEnable:1可用,0不可用
+export function setRoleEnable(data) {
+ return request({
+ url: `/system/v1/orgroles/setIsEnable/${data.sid}/${data.isEnable}`,
+ method: 'POST',
+ data: qs.stringify(data)
+ })
+}
+
+/**
+ * <新增 保存角色>
+ * @orgSid 机构SID
+ * @remarks 备注
+ * @roleName 角色名称
+ * */
+export function saveOrgroles(data) {
+ return request({
+ url: '/portal/v1/sysrole/save',
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+/**
+ * <根据SID 修改角色>
+ * @sid 角色SID
+ * @orgSid 机构SID
+ * @remarks 备注
+ * @roleName 角色名称
+ * */
+export function putOrgroles(data) {
+ return request({
+ url: `/portal/v1/sysrole/update/${data.sid}`,
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+
+/**
+ * <根据SID 删除角色>
+ * @sid 角色SID
+ * */
+export function delOrgroles(data) {
+ return request({
+ url: `/portal/v1/sysrole/delBySids/${data.sid}`,
+ method: 'get',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 菜单授权
+export function roleMenuTree(data) {
+ return request({
+ url: `/portal/v1/sysmenu/listAllByRoleSid`,
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 菜单授权保存
+export function saveorgrolemenus(data) {
+ return request({
+ url: `/portal/v1/sysmenurole/updateRoleAndMenu`,
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 资源授权
+export function sourceMenuTree(data) {
+ return request({
+ url: `/portal/v1/syssource/listAllByRoleSid`,
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 资源授权保存
+export function saveSource(data) {
+ return request({
+ url: `/portal/v1/syssourcerole/updateRoleAndSource`,
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 功能授权
+export function funMenuTree(data) {
+ return request({
+ url: `/portal/v1/sysfunction/listAllByRoleSid`,
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 功能授权保存
+export function savefunMenu(data) {
+ return request({
+ url: `/portal/v1/sysrolefunction/updateRoleAndFunction`,
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
\ No newline at end of file
diff --git a/message-center-ui/src/api/system/roleAdminister/rolemenus.js b/message-center-ui/src/api/system/roleAdminister/rolemenus.js
new file mode 100644
index 0000000..b3342eb
--- /dev/null
+++ b/message-center-ui/src/api/system/roleAdminister/rolemenus.js
@@ -0,0 +1,31 @@
+import request from '@/utils/request'
+import qs from 'qs'
+
+/**
+ * < 业务角色授权时菜单列表(拥有的菜单选中)>
+ * @orgTypeKeys 单位性质(类别
+ * @roleSid 业务角色sid
+ * @userType 用户类型只能为1或2
+ * */
+export function roleMenuTree(data){
+ return request({
+ url: '/system/v1/orgrolemenus/menutree',
+ method: 'post',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+}
+
+/**
+ * < 保存角色授权的菜单项 >
+ * @roleMenus[] 角色权限列表 {menuSid 菜单sid} {orgSid 单位sid} {roleSid 角色sid}
+ * @roleSid 业务角色sid
+ * */
+export function saveorgrolemenus(data){
+ return request({
+ url: '/system/v1/orgrolemenus',
+ method: 'post',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+}
diff --git a/message-center-ui/src/api/system/roleMenus/index.js b/message-center-ui/src/api/system/roleMenus/index.js
new file mode 100644
index 0000000..9d4e877
--- /dev/null
+++ b/message-center-ui/src/api/system/roleMenus/index.js
@@ -0,0 +1,21 @@
+import request from '@/utils/request'
+import qs from 'qs'
+
+//角色授权时菜单列表(拥有的菜单选中)
+export function getrolemenus(data) {
+ return request({
+ url: `/system/v1/rolemenus/${data.roleSid}`,
+ method: 'GET',
+ params: data
+ })
+}
+
+//保存 角色授权时菜单列表
+export function saverolemenus(data) {
+ return request({
+ url: `/system/v1/rolemenus`,
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+}
diff --git a/message-center-ui/src/api/system/sources/index.js b/message-center-ui/src/api/system/sources/index.js
new file mode 100644
index 0000000..f94cac0
--- /dev/null
+++ b/message-center-ui/src/api/system/sources/index.js
@@ -0,0 +1,111 @@
+import request from '@/utils/request'
+import qs from 'qs'
+//let tokens = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTm8iOiI2IiwiaXNzIjoiV0JLIiwiZXhwIjoxNjMwMDI3MDA3fQ.9bEgBzFW2g1CUT7s5VXxhNCa10cyU_WTCFeqpQje0iY'
+let tokens = window.sessionStorage.getItem('token');
+//获取菜单 分页列表
+export function pageList(data) {
+ return request({
+ url: '/portal/v1/syssource/listPage',
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+//保存 资源信息
+export function saveSourcesInfo(data) {
+ return request({
+ url: '/portal/v1/syssource/save',
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 修改 保存 资源信息
+export function putSourcesInfo(data) {
+ return request({
+ url: '/portal/v1/syssource/update/' + data.sid,
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+//根据sid 删除单个 资源信息
+export function delSources(data) {
+ return request({
+ url: '/portal/v1/syssource/delBySids/' + data.sid,
+ method: 'get',
+ data: qs.stringify(data),
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 获取获取资源类别
+export function getZzylb(data) {
+return request({
+ url: '/portal/v1/syssource/listAll',
+ method: 'post',
+ headers: {'Content-Type': 'application/json'}
+})
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+// 获取资源 不分页列表
+export function sourcesList(data) {
+ return request({
+ url: '/system/v1/sources/list',
+ method: 'post',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+}
+
+// 获取资源列表 不分页下拉
+export function getsourceList(data) {
+ return request({
+ url: '/system/v1/sources/sourceList',
+ method: 'post'
+ })
+}
+
+
+////获取资源 分页列表
+//export function sourcesPageList(data) {
+//return request({
+// url: '/system/v1/sources/pagelist',
+// method: 'POST',
+// data: data,
+// headers: {'Content-Type': 'application/json'}
+//})
+//}
+
+
+
+//根据sid 获取单个 资源信息
+export function getSourcesInfo(data) {
+ return request({
+ url: '/system/v1/sources/' + data.sid,
+ method: 'GET',
+ data: qs.stringify(data)
+ })
+}
+
diff --git a/message-center-ui/src/api/system/user/Auser.js b/message-center-ui/src/api/system/user/Auser.js
new file mode 100644
index 0000000..b2318a8
--- /dev/null
+++ b/message-center-ui/src/api/system/user/Auser.js
@@ -0,0 +1,84 @@
+import request from '@/utils/request'
+import qs from 'qs'
+
+export function verifyList(data){ // 用户列表
+ return request({
+ url: '/system/user/verifyList',
+ method: 'post',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+}
+// admin用户列表
+export function userListByAdmin(data){
+ return request({
+ url: '/system/user/userListByAdmin',
+ method: 'post',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+}
+
+// 设置角色
+export function psotUserRole(data){
+ return request({
+ url: '/system/v1/userrole',
+ method: 'post',
+ data: qs.stringify(data)
+ })
+}
+
+// 用户初始化密码
+export function initPwd(data){
+ return request({
+ url: 'system/user/initPwd/'+data.sid,
+ method: 'POST',
+ data: qs.stringify(data)
+ })
+}
+
+// 用户删除接口
+export function delUser(data){
+ return request({
+ url: '/system/user/delete/'+data.sid,
+ method: 'DELETE',
+ params: data
+ })
+}
+
+// 初始化设置角色
+export function initUserRole(data){
+ return request({
+ url: '/system/v1/userroles/initUserRole/'+ data.userSid,
+ method: 'get',
+ params: data
+ })
+}
+
+// 保存角色
+export function saveUserRole(data){
+ return request({
+ url: '/system/v1/userroles',
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+}
+
+// 用户信息
+export function getUserINfo(data){
+ return request({
+ url: '/system/user/userRegisterDetails',
+ method: 'get',
+ params: data
+ })
+}
+
+// 单位信息
+export function getOrgINfo(data){
+ return request({
+ url: '/system/organization/organizationRegisterDetails/'+ data.organizationSid,
+ method: 'get',
+ params: data
+ })
+}
diff --git a/message-center-ui/src/api/system/user/login.js b/message-center-ui/src/api/system/user/login.js
new file mode 100644
index 0000000..250edd2
--- /dev/null
+++ b/message-center-ui/src/api/system/user/login.js
@@ -0,0 +1,43 @@
+import request from '@/utils/request'
+import qs from 'qs'
+
+
+//获取菜单 分页列表
+export function login1(data) {
+ return request({
+ url: '/portal/v1/sysuser/login',
+ method: 'POST',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+// 'token':tokens
+ }
+ })
+}
+
+
+
+
+
+class user {
+ login(data) { // 登录
+ return request({
+ url: '/portal/v1/sysuser/login',
+ method: 'post',
+ data
+ })
+ }
+ logout() { // 退出
+ return request({
+ url: '/vue-admin-template/user/logout',
+ method: 'post'
+ })
+ }
+ updatePassword(data) { // 退出修改密码
+ return request({
+ url: '/system/user/updatePassword',
+ method: 'post',
+ data: qs.stringify(data)
+ })
+ }
+}
+
diff --git a/message-center-ui/src/api/system/user/user.js b/message-center-ui/src/api/system/user/user.js
new file mode 100644
index 0000000..6ff564f
--- /dev/null
+++ b/message-center-ui/src/api/system/user/user.js
@@ -0,0 +1,43 @@
+import request from '@/utils/request'
+import qs from 'qs'
+class user{
+ verifyList(data){ // 请求审核列表
+ return request({
+ url: '/system/user/verifyList',
+ method: 'post',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+ }
+ userRegisterDetails(data){ // 获取审核内容
+ console.log(data)
+ return request({
+ url: '/system/user/userRegisterDetails',
+ method: 'get',
+ params: data
+ })
+ }
+ verify(data){ // 审核通过不通过
+ return request({
+ url: '/system/user/verify',
+ method: 'post',
+ data: qs.stringify(data)
+ })
+ }
+ userDelete(data){ // 删除
+ return request({
+ url: '/system/user/delete/{sid}',
+ method: 'delete',
+ data: qs.stringify(data)
+ })
+ }
+ userNameDelete(data){ // 删除个人注册审核
+ return request({
+ url: '/system/staffApply/deleteByUserName',
+ method: 'delete',
+ data: qs.stringify(data)
+ })
+ }
+
+}
+export default new user()
diff --git a/message-center-ui/src/api/system/userAdminister/client.js b/message-center-ui/src/api/system/userAdminister/client.js
new file mode 100644
index 0000000..ffb3861
--- /dev/null
+++ b/message-center-ui/src/api/system/userAdminister/client.js
@@ -0,0 +1,32 @@
+import request from '@/utils/request'
+import qs from 'qs'
+
+// 委托人分页列表
+export function clientList(data){
+ return request({
+ url: '/jlcyry/v1/clientalterrecords/pagerList',
+ method: 'post',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+}
+
+// 变更选择委托人列表
+export function setclientList(data){
+ return request({
+ url: '/jlcyry/v1/clientalterrecords/staffClientList',
+ method: 'post',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+}
+
+// 变更为被委托人
+export function doClientAlter(data){
+ return request({
+ url: '/jlcyry/v1/clientalterrecords/doClientAlter',
+ method: 'post',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+}
diff --git a/message-center-ui/src/api/system/userAdminister/index.js b/message-center-ui/src/api/system/userAdminister/index.js
new file mode 100644
index 0000000..08d3d50
--- /dev/null
+++ b/message-center-ui/src/api/system/userAdminister/index.js
@@ -0,0 +1,69 @@
+import request from '@/utils/request'
+import qs from 'qs'
+let tokens = window.sessionStorage.getItem('token');
+// 单位用户列表
+export function orgUserList(data){
+ return request({
+ url: '/system/user/userListByOrg',
+ method: 'post',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+}
+
+
+// 设置角色
+export function psotUserRole(data){
+ return request({
+ url: '/system/v1/userrole',
+ method: 'post',
+ data: qs.stringify(data)
+ })
+}
+
+/**
+ * 获取角色列表
+ * orgSid 用户SID
+ * roleName 角色名称
+ * */
+export function orgrolesList(data){
+ return request({
+ url: '/system/v1/orgroles/list',
+ method: 'post',
+ headers: {'Content-Type': 'application/json'},
+ data
+ })
+}
+/**
+ * 保存 设置角色 /system/v1/orguserroles
+ * */
+ export function saveOrgRole(data){
+ return request({
+ url: '/system/v1/orguserroles',
+ method: 'post',
+ headers: {'Content-Type': 'application/json'},
+ data
+ })
+ }
+
+/**
+ * 部门机构列表 /system/v1/departments/departmentOrgList/{organizationSid}
+ * */
+ export function getOrgList(organizationSid){
+ return request({
+ url: '/system/v1/departments/departmentOrgList/' + organizationSid,
+ method: 'get'
+ })
+ }
+/**
+ * 保存 设置部门 /system/v1/orguserroles
+ * */
+ export function saveDepartment(data){
+ return request({
+ url: '/system/v1/departmentStaffs/setUpDepartment',
+ method: 'post',
+ headers: {'Content-Type': 'application/json'},
+ data
+ })
+ }
+
diff --git a/message-center-ui/src/api/system/userManage/index.js b/message-center-ui/src/api/system/userManage/index.js
new file mode 100644
index 0000000..320c4b2
--- /dev/null
+++ b/message-center-ui/src/api/system/userManage/index.js
@@ -0,0 +1,138 @@
+import request from '@/utils/request'
+import qs from 'qs'
+// 用户列表
+//let tokens = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTm8iOiI2IiwiaXNzIjoiV0JLIiwiZXhwIjoxNjI5OTQxNjI1fQ.aOFOz0h7c8YQs-ti2GLpqeWu4AE9mifx_043hLJQf8g'
+let tokens = window.sessionStorage.getItem('token');
+export function userList(data){
+ return request({
+ url: '/portal/v1/sysuser/listPage',
+ method: 'post',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 新增
+export function userAdd(data){
+ return request({
+ url: '/portal/v1/sysuser/save',
+ method: 'post',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 更新
+export function userUpdata(data){
+ return request({
+ url: '/portal/v1/sysuser/update/' +data.sid,
+ method: 'post',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+
+// 删除
+export function delUser(data){
+ return request({
+ url: '/portal/v1/sysuser/delBySid/' +data.sid,
+ method: 'get',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 初始化密码
+export function initPwd(data){
+ return request({
+ url: '/portal/v1/sysuser/initPwd/' +data.sid,
+ method: 'post',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 根据sid查询一条信息
+export function userSingle(data){
+ return request({
+ url: '/portal/v1/sysuser/fetchBySid/' +data.sid,
+ method: 'get',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 单条用户的角色列表
+export function setRole(data){
+ return request({
+ url: '/portal/v1/sysrole/listAllByUserSid/' +data.sid,
+ method: 'post',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 角色列表
+export function saveOrgRole(data){
+ return request({
+ url: '/portal/v1/sysuserrole/update',
+ method: 'post',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 查询角色列表
+export function roleList(data){
+ return request({
+ url: '/portal/v1/sysrole/listAll',
+ method: 'post',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 查询部门列表
+export function orgList(data){
+ return request({
+ url: '/portal/v1/sysorganization/list',
+ method: 'get',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+// 查询岗位列表
+export function postList(data){
+ return request({
+ url: '/portal/v1/syspost/fetchByOrgSid/'+data.sid,
+ method: 'get',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
+
+// 获取验证码
+export function getCode(data){
+ return request({
+ url: '/portal/v1/sysuser/sendMessageCode/'+data.phone,
+ method: 'get',
+ data: data,
+ headers: {'Content-Type': 'application/json',
+ 'token':tokens
+ }
+ })
+}
diff --git a/message-center-ui/src/api/user.js b/message-center-ui/src/api/user.js
new file mode 100644
index 0000000..4e137c4
--- /dev/null
+++ b/message-center-ui/src/api/user.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+import qs from 'qs'
+//登录
+export function login(data) {
+ return request({
+ url: '/portal/v1/sysuser/login',
+ method: 'post',
+ data: data,
+ headers: {'Content-Type': 'application/json'}
+ })
+}
+// 用户注册
+export function registUser(data) {
+ return request({
+ url: '/system/user/save',
+ method: 'post',
+ data,
+ headers:{'Content-Type':'application/x-www-form-urlencoded;'}
+ })
+}
+// 获取手机验证码
+export function getVerificationCode(data) {
+ return request({
+ url: '/system/user/getVerificationCode',
+ method: 'get',
+ params: data
+ })
+}
+
+// 获取登录验证码
+export function imgCode() {
+ return request({
+ url: '/system/api/defaultBlendCode?temm=' + new Date().getTime(),
+ method: 'get'
+ })
+}
+
+// 获取用信息
+export function getInfo(token) {
+ return request({
+ url: '/system/user/loginDetails',
+ method: 'post',
+ })
+}
diff --git a/message-center-ui/src/assets/401_images/401.gif b/message-center-ui/src/assets/401_images/401.gif
new file mode 100644
index 0000000..cd6e0d9
Binary files /dev/null and b/message-center-ui/src/assets/401_images/401.gif differ
diff --git a/message-center-ui/src/assets/404_images/404.png b/message-center-ui/src/assets/404_images/404.png
new file mode 100644
index 0000000..3d8e230
Binary files /dev/null and b/message-center-ui/src/assets/404_images/404.png differ
diff --git a/message-center-ui/src/assets/404_images/404_cloud.png b/message-center-ui/src/assets/404_images/404_cloud.png
new file mode 100644
index 0000000..c6281d0
Binary files /dev/null and b/message-center-ui/src/assets/404_images/404_cloud.png differ
diff --git a/message-center-ui/src/assets/icons/index.js b/message-center-ui/src/assets/icons/index.js
new file mode 100644
index 0000000..2c6b309
--- /dev/null
+++ b/message-center-ui/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/message-center-ui/src/assets/icons/svg/404.svg b/message-center-ui/src/assets/icons/svg/404.svg
new file mode 100644
index 0000000..6df5019
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/404.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/bug.svg b/message-center-ui/src/assets/icons/svg/bug.svg
new file mode 100644
index 0000000..05a150d
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/bug.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/build.svg b/message-center-ui/src/assets/icons/svg/build.svg
new file mode 100644
index 0000000..97c4688
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/build.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/button.svg b/message-center-ui/src/assets/icons/svg/button.svg
new file mode 100644
index 0000000..904fddc
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/button.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/cascader.svg b/message-center-ui/src/assets/icons/svg/cascader.svg
new file mode 100644
index 0000000..e256024
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/cascader.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/chart.svg b/message-center-ui/src/assets/icons/svg/chart.svg
new file mode 100644
index 0000000..27728fb
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/chart.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/checkbox.svg b/message-center-ui/src/assets/icons/svg/checkbox.svg
new file mode 100644
index 0000000..013fd3a
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/checkbox.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/clipboard.svg b/message-center-ui/src/assets/icons/svg/clipboard.svg
new file mode 100644
index 0000000..90923ff
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/clipboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/code.svg b/message-center-ui/src/assets/icons/svg/code.svg
new file mode 100644
index 0000000..ed4d23c
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/code.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/color.svg b/message-center-ui/src/assets/icons/svg/color.svg
new file mode 100644
index 0000000..44a81aa
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/color.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/component.svg b/message-center-ui/src/assets/icons/svg/component.svg
new file mode 100644
index 0000000..207ada3
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/component.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/dashboard.svg b/message-center-ui/src/assets/icons/svg/dashboard.svg
new file mode 100644
index 0000000..5317d37
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/dashboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/date-range.svg b/message-center-ui/src/assets/icons/svg/date-range.svg
new file mode 100644
index 0000000..fda571e
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/date-range.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/date.svg b/message-center-ui/src/assets/icons/svg/date.svg
new file mode 100644
index 0000000..52dc73e
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/date.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/dict.svg b/message-center-ui/src/assets/icons/svg/dict.svg
new file mode 100644
index 0000000..4849377
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/dict.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/documentation.svg b/message-center-ui/src/assets/icons/svg/documentation.svg
new file mode 100644
index 0000000..7043122
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/documentation.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/download.svg b/message-center-ui/src/assets/icons/svg/download.svg
new file mode 100644
index 0000000..c896951
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/download.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/drag.svg b/message-center-ui/src/assets/icons/svg/drag.svg
new file mode 100644
index 0000000..4185d3c
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/drag.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/druid.svg b/message-center-ui/src/assets/icons/svg/druid.svg
new file mode 100644
index 0000000..a2b4b4e
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/druid.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/edit.svg b/message-center-ui/src/assets/icons/svg/edit.svg
new file mode 100644
index 0000000..d26101f
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/edit.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/education.svg b/message-center-ui/src/assets/icons/svg/education.svg
new file mode 100644
index 0000000..7bfb01d
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/education.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/email.svg b/message-center-ui/src/assets/icons/svg/email.svg
new file mode 100644
index 0000000..74d25e2
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/email.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/example.svg b/message-center-ui/src/assets/icons/svg/example.svg
new file mode 100644
index 0000000..46f42b5
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/example.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/excel.svg b/message-center-ui/src/assets/icons/svg/excel.svg
new file mode 100644
index 0000000..74d97b8
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/excel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/exit-fullscreen.svg b/message-center-ui/src/assets/icons/svg/exit-fullscreen.svg
new file mode 100644
index 0000000..485c128
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/exit-fullscreen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/eye-open.svg b/message-center-ui/src/assets/icons/svg/eye-open.svg
new file mode 100644
index 0000000..88dcc98
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/eye-open.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/eye.svg b/message-center-ui/src/assets/icons/svg/eye.svg
new file mode 100644
index 0000000..16ed2d8
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/eye.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/form.svg b/message-center-ui/src/assets/icons/svg/form.svg
new file mode 100644
index 0000000..dcbaa18
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/form.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/fullscreen.svg b/message-center-ui/src/assets/icons/svg/fullscreen.svg
new file mode 100644
index 0000000..0e86b6f
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/fullscreen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/github.svg b/message-center-ui/src/assets/icons/svg/github.svg
new file mode 100644
index 0000000..db0a0d4
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/github.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/guide.svg b/message-center-ui/src/assets/icons/svg/guide.svg
new file mode 100644
index 0000000..b271001
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/guide.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/icon.svg b/message-center-ui/src/assets/icons/svg/icon.svg
new file mode 100644
index 0000000..82be8ee
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/input.svg b/message-center-ui/src/assets/icons/svg/input.svg
new file mode 100644
index 0000000..ab91381
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/input.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/international.svg b/message-center-ui/src/assets/icons/svg/international.svg
new file mode 100644
index 0000000..e9b56ee
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/international.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/job.svg b/message-center-ui/src/assets/icons/svg/job.svg
new file mode 100644
index 0000000..2a93a25
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/job.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/language.svg b/message-center-ui/src/assets/icons/svg/language.svg
new file mode 100644
index 0000000..0082b57
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/language.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/link.svg b/message-center-ui/src/assets/icons/svg/link.svg
new file mode 100644
index 0000000..48197ba
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/link.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/list.svg b/message-center-ui/src/assets/icons/svg/list.svg
new file mode 100644
index 0000000..20259ed
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/list.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/lock.svg b/message-center-ui/src/assets/icons/svg/lock.svg
new file mode 100644
index 0000000..74fee54
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/lock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/log.svg b/message-center-ui/src/assets/icons/svg/log.svg
new file mode 100644
index 0000000..d879d33
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/log.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/logininfor.svg b/message-center-ui/src/assets/icons/svg/logininfor.svg
new file mode 100644
index 0000000..267f844
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/logininfor.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/message.svg b/message-center-ui/src/assets/icons/svg/message.svg
new file mode 100644
index 0000000..14ca817
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/message.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/money.svg b/message-center-ui/src/assets/icons/svg/money.svg
new file mode 100644
index 0000000..c1580de
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/money.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/monitor.svg b/message-center-ui/src/assets/icons/svg/monitor.svg
new file mode 100644
index 0000000..bc308cb
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/monitor.svg
@@ -0,0 +1,2 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/nested.svg b/message-center-ui/src/assets/icons/svg/nested.svg
new file mode 100644
index 0000000..06713a8
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/nested.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/number.svg b/message-center-ui/src/assets/icons/svg/number.svg
new file mode 100644
index 0000000..ad5ce9a
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/number.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/online.svg b/message-center-ui/src/assets/icons/svg/online.svg
new file mode 100644
index 0000000..330a202
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/online.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/password.svg b/message-center-ui/src/assets/icons/svg/password.svg
new file mode 100644
index 0000000..e291d85
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/password.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/pdf.svg b/message-center-ui/src/assets/icons/svg/pdf.svg
new file mode 100644
index 0000000..957aa0c
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/pdf.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/people.svg b/message-center-ui/src/assets/icons/svg/people.svg
new file mode 100644
index 0000000..2bd54ae
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/people.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/peoples.svg b/message-center-ui/src/assets/icons/svg/peoples.svg
new file mode 100644
index 0000000..aab852e
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/peoples.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/phone.svg b/message-center-ui/src/assets/icons/svg/phone.svg
new file mode 100644
index 0000000..ab8e8c4
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/phone.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/post.svg b/message-center-ui/src/assets/icons/svg/post.svg
new file mode 100644
index 0000000..2922c61
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/post.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/qq.svg b/message-center-ui/src/assets/icons/svg/qq.svg
new file mode 100644
index 0000000..ee13d4e
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/qq.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/question.svg b/message-center-ui/src/assets/icons/svg/question.svg
new file mode 100644
index 0000000..cf75bd4
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/question.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/radio.svg b/message-center-ui/src/assets/icons/svg/radio.svg
new file mode 100644
index 0000000..0cde345
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/radio.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/rate.svg b/message-center-ui/src/assets/icons/svg/rate.svg
new file mode 100644
index 0000000..aa3b14d
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/rate.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/redis.svg b/message-center-ui/src/assets/icons/svg/redis.svg
new file mode 100644
index 0000000..2f1d62d
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/redis.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/row.svg b/message-center-ui/src/assets/icons/svg/row.svg
new file mode 100644
index 0000000..0780992
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/row.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/search.svg b/message-center-ui/src/assets/icons/svg/search.svg
new file mode 100644
index 0000000..84233dd
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/search.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/select.svg b/message-center-ui/src/assets/icons/svg/select.svg
new file mode 100644
index 0000000..d628382
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/select.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/server.svg b/message-center-ui/src/assets/icons/svg/server.svg
new file mode 100644
index 0000000..ca37b00
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/server.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/shopping.svg b/message-center-ui/src/assets/icons/svg/shopping.svg
new file mode 100644
index 0000000..87513e7
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/shopping.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/size.svg b/message-center-ui/src/assets/icons/svg/size.svg
new file mode 100644
index 0000000..ddb25b8
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/size.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/skill.svg b/message-center-ui/src/assets/icons/svg/skill.svg
new file mode 100644
index 0000000..a3b7312
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/skill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/slider.svg b/message-center-ui/src/assets/icons/svg/slider.svg
new file mode 100644
index 0000000..fbe4f39
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/slider.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/star.svg b/message-center-ui/src/assets/icons/svg/star.svg
new file mode 100644
index 0000000..6cf86e6
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/star.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/swagger.svg b/message-center-ui/src/assets/icons/svg/swagger.svg
new file mode 100644
index 0000000..05d4e7b
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/swagger.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/switch.svg b/message-center-ui/src/assets/icons/svg/switch.svg
new file mode 100644
index 0000000..0ba61e3
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/switch.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/system.svg b/message-center-ui/src/assets/icons/svg/system.svg
new file mode 100644
index 0000000..dba28cf
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/system.svg
@@ -0,0 +1,2 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/tab.svg b/message-center-ui/src/assets/icons/svg/tab.svg
new file mode 100644
index 0000000..b4b48e4
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/tab.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/table.svg b/message-center-ui/src/assets/icons/svg/table.svg
new file mode 100644
index 0000000..0e3dc9d
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/table.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/textarea.svg b/message-center-ui/src/assets/icons/svg/textarea.svg
new file mode 100644
index 0000000..2709f29
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/textarea.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/theme.svg b/message-center-ui/src/assets/icons/svg/theme.svg
new file mode 100644
index 0000000..5982a2f
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/theme.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/time-range.svg b/message-center-ui/src/assets/icons/svg/time-range.svg
new file mode 100644
index 0000000..13c1202
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/time-range.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/time.svg b/message-center-ui/src/assets/icons/svg/time.svg
new file mode 100644
index 0000000..b376e32
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/time.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/tool.svg b/message-center-ui/src/assets/icons/svg/tool.svg
new file mode 100644
index 0000000..c813067
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/tool.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/tree-table.svg b/message-center-ui/src/assets/icons/svg/tree-table.svg
new file mode 100644
index 0000000..8aafdb8
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/tree-table.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/tree.svg b/message-center-ui/src/assets/icons/svg/tree.svg
new file mode 100644
index 0000000..dd4b7dd
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/tree.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/upload.svg b/message-center-ui/src/assets/icons/svg/upload.svg
new file mode 100644
index 0000000..bae49c0
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/upload.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/user.svg b/message-center-ui/src/assets/icons/svg/user.svg
new file mode 100644
index 0000000..0ba0716
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/user.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/validCode.svg b/message-center-ui/src/assets/icons/svg/validCode.svg
new file mode 100644
index 0000000..cfb1021
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/validCode.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/wechat.svg b/message-center-ui/src/assets/icons/svg/wechat.svg
new file mode 100644
index 0000000..c586e55
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/wechat.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svg/zip.svg b/message-center-ui/src/assets/icons/svg/zip.svg
new file mode 100644
index 0000000..f806fc4
--- /dev/null
+++ b/message-center-ui/src/assets/icons/svg/zip.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/icons/svgo.yml b/message-center-ui/src/assets/icons/svgo.yml
new file mode 100644
index 0000000..d11906a
--- /dev/null
+++ b/message-center-ui/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/message-center-ui/src/assets/images/arrow.png b/message-center-ui/src/assets/images/arrow.png
new file mode 100644
index 0000000..9e4c33b
Binary files /dev/null and b/message-center-ui/src/assets/images/arrow.png differ
diff --git a/message-center-ui/src/assets/images/bdrysh.png b/message-center-ui/src/assets/images/bdrysh.png
new file mode 100644
index 0000000..c0acee9
Binary files /dev/null and b/message-center-ui/src/assets/images/bdrysh.png differ
diff --git a/message-center-ui/src/assets/images/btn.png b/message-center-ui/src/assets/images/btn.png
new file mode 100644
index 0000000..4aaf9f0
Binary files /dev/null and b/message-center-ui/src/assets/images/btn.png differ
diff --git a/message-center-ui/src/assets/images/cdgl.png b/message-center-ui/src/assets/images/cdgl.png
new file mode 100644
index 0000000..d3e20f9
Binary files /dev/null and b/message-center-ui/src/assets/images/cdgl.png differ
diff --git a/message-center-ui/src/assets/images/cxjl.png b/message-center-ui/src/assets/images/cxjl.png
new file mode 100644
index 0000000..9928500
Binary files /dev/null and b/message-center-ui/src/assets/images/cxjl.png differ
diff --git a/message-center-ui/src/assets/images/czsc.png b/message-center-ui/src/assets/images/czsc.png
new file mode 100644
index 0000000..00a8f4f
Binary files /dev/null and b/message-center-ui/src/assets/images/czsc.png differ
diff --git a/message-center-ui/src/assets/images/dark.svg b/message-center-ui/src/assets/images/dark.svg
new file mode 100644
index 0000000..f646bd7
--- /dev/null
+++ b/message-center-ui/src/assets/images/dark.svg
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/images/dwrysh.png b/message-center-ui/src/assets/images/dwrysh.png
new file mode 100644
index 0000000..f9804b7
Binary files /dev/null and b/message-center-ui/src/assets/images/dwrysh.png differ
diff --git a/message-center-ui/src/assets/images/dwxxgl.png b/message-center-ui/src/assets/images/dwxxgl.png
new file mode 100644
index 0000000..c1d9769
Binary files /dev/null and b/message-center-ui/src/assets/images/dwxxgl.png differ
diff --git a/message-center-ui/src/assets/images/dy.png b/message-center-ui/src/assets/images/dy.png
new file mode 100644
index 0000000..de8157e
Binary files /dev/null and b/message-center-ui/src/assets/images/dy.png differ
diff --git a/message-center-ui/src/assets/images/head.png b/message-center-ui/src/assets/images/head.png
new file mode 100644
index 0000000..abd7101
Binary files /dev/null and b/message-center-ui/src/assets/images/head.png differ
diff --git a/message-center-ui/src/assets/images/info.png b/message-center-ui/src/assets/images/info.png
new file mode 100644
index 0000000..b681da3
Binary files /dev/null and b/message-center-ui/src/assets/images/info.png differ
diff --git a/message-center-ui/src/assets/images/jcxx.png b/message-center-ui/src/assets/images/jcxx.png
new file mode 100644
index 0000000..d9c4067
Binary files /dev/null and b/message-center-ui/src/assets/images/jcxx.png differ
diff --git a/message-center-ui/src/assets/images/jggl.png b/message-center-ui/src/assets/images/jggl.png
new file mode 100644
index 0000000..ab4c742
Binary files /dev/null and b/message-center-ui/src/assets/images/jggl.png differ
diff --git a/message-center-ui/src/assets/images/jlsc.png b/message-center-ui/src/assets/images/jlsc.png
new file mode 100644
index 0000000..6061b81
Binary files /dev/null and b/message-center-ui/src/assets/images/jlsc.png differ
diff --git a/message-center-ui/src/assets/images/jsgl.png b/message-center-ui/src/assets/images/jsgl.png
new file mode 100644
index 0000000..2da71f4
Binary files /dev/null and b/message-center-ui/src/assets/images/jsgl.png differ
diff --git a/message-center-ui/src/assets/images/jsxd.png b/message-center-ui/src/assets/images/jsxd.png
new file mode 100644
index 0000000..e5b3ed0
Binary files /dev/null and b/message-center-ui/src/assets/images/jsxd.png differ
diff --git a/message-center-ui/src/assets/images/light.svg b/message-center-ui/src/assets/images/light.svg
new file mode 100644
index 0000000..ab7cc08
--- /dev/null
+++ b/message-center-ui/src/assets/images/light.svg
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/message-center-ui/src/assets/images/login-background.jpg b/message-center-ui/src/assets/images/login-background.jpg
new file mode 100644
index 0000000..e15c3be
Binary files /dev/null and b/message-center-ui/src/assets/images/login-background.jpg differ
diff --git a/message-center-ui/src/assets/images/lzrysh.png b/message-center-ui/src/assets/images/lzrysh.png
new file mode 100644
index 0000000..03125a1
Binary files /dev/null and b/message-center-ui/src/assets/images/lzrysh.png differ
diff --git a/message-center-ui/src/assets/images/place.png b/message-center-ui/src/assets/images/place.png
new file mode 100644
index 0000000..5e36be9
Binary files /dev/null and b/message-center-ui/src/assets/images/place.png differ
diff --git a/message-center-ui/src/assets/images/profile.jpg b/message-center-ui/src/assets/images/profile.jpg
new file mode 100644
index 0000000..cf737a0
Binary files /dev/null and b/message-center-ui/src/assets/images/profile.jpg differ
diff --git a/message-center-ui/src/assets/images/qjsh.png b/message-center-ui/src/assets/images/qjsh.png
new file mode 100644
index 0000000..85c2ce8
Binary files /dev/null and b/message-center-ui/src/assets/images/qjsh.png differ
diff --git a/message-center-ui/src/assets/images/ryda.png b/message-center-ui/src/assets/images/ryda.png
new file mode 100644
index 0000000..4cddf39
Binary files /dev/null and b/message-center-ui/src/assets/images/ryda.png differ
diff --git a/message-center-ui/src/assets/images/rzgl.png b/message-center-ui/src/assets/images/rzgl.png
new file mode 100644
index 0000000..068ae3b
Binary files /dev/null and b/message-center-ui/src/assets/images/rzgl.png differ
diff --git a/message-center-ui/src/assets/images/select.png b/message-center-ui/src/assets/images/select.png
new file mode 100644
index 0000000..0a70ffa
Binary files /dev/null and b/message-center-ui/src/assets/images/select.png differ
diff --git a/message-center-ui/src/assets/images/sjcc.png b/message-center-ui/src/assets/images/sjcc.png
new file mode 100644
index 0000000..6f01ae0
Binary files /dev/null and b/message-center-ui/src/assets/images/sjcc.png differ
diff --git a/message-center-ui/src/assets/images/sjzd.png b/message-center-ui/src/assets/images/sjzd.png
new file mode 100644
index 0000000..06af6b9
Binary files /dev/null and b/message-center-ui/src/assets/images/sjzd.png differ
diff --git a/message-center-ui/src/assets/images/tjfx.png b/message-center-ui/src/assets/images/tjfx.png
new file mode 100644
index 0000000..e097e3d
Binary files /dev/null and b/message-center-ui/src/assets/images/tjfx.png differ
diff --git a/message-center-ui/src/assets/images/tjfx2.png b/message-center-ui/src/assets/images/tjfx2.png
new file mode 100644
index 0000000..681993c
Binary files /dev/null and b/message-center-ui/src/assets/images/tjfx2.png differ
diff --git a/message-center-ui/src/assets/images/wenjian.png b/message-center-ui/src/assets/images/wenjian.png
new file mode 100644
index 0000000..163e441
Binary files /dev/null and b/message-center-ui/src/assets/images/wenjian.png differ
diff --git a/message-center-ui/src/assets/images/xgmm.png b/message-center-ui/src/assets/images/xgmm.png
new file mode 100644
index 0000000..46b8d5c
Binary files /dev/null and b/message-center-ui/src/assets/images/xgmm.png differ
diff --git a/message-center-ui/src/assets/images/xtbg.png b/message-center-ui/src/assets/images/xtbg.png
new file mode 100644
index 0000000..8ac2bfc
Binary files /dev/null and b/message-center-ui/src/assets/images/xtbg.png differ
diff --git a/message-center-ui/src/assets/images/xtgl.png b/message-center-ui/src/assets/images/xtgl.png
new file mode 100644
index 0000000..2eeed54
Binary files /dev/null and b/message-center-ui/src/assets/images/xtgl.png differ
diff --git a/message-center-ui/src/assets/images/xxzx.png b/message-center-ui/src/assets/images/xxzx.png
new file mode 100644
index 0000000..0e3c150
Binary files /dev/null and b/message-center-ui/src/assets/images/xxzx.png differ
diff --git a/message-center-ui/src/assets/images/zwsm.png b/message-center-ui/src/assets/images/zwsm.png
new file mode 100644
index 0000000..9489169
Binary files /dev/null and b/message-center-ui/src/assets/images/zwsm.png differ
diff --git a/message-center-ui/src/assets/logo/logo.png b/message-center-ui/src/assets/logo/logo.png
new file mode 100644
index 0000000..362a00f
Binary files /dev/null and b/message-center-ui/src/assets/logo/logo.png differ
diff --git a/message-center-ui/src/assets/styles/btn.scss b/message-center-ui/src/assets/styles/btn.scss
new file mode 100644
index 0000000..e6ba1a8
--- /dev/null
+++ b/message-center-ui/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/message-center-ui/src/assets/styles/element-ui.scss b/message-center-ui/src/assets/styles/element-ui.scss
new file mode 100644
index 0000000..363092a
--- /dev/null
+++ b/message-center-ui/src/assets/styles/element-ui.scss
@@ -0,0 +1,92 @@
+// 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;
+}
\ No newline at end of file
diff --git a/message-center-ui/src/assets/styles/element-variables.scss b/message-center-ui/src/assets/styles/element-variables.scss
new file mode 100644
index 0000000..8b7a48e
--- /dev/null
+++ b/message-center-ui/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: #1890ff;
+$--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/message-center-ui/src/assets/styles/index.scss b/message-center-ui/src/assets/styles/index.scss
new file mode 100644
index 0000000..96095ef
--- /dev/null
+++ b/message-center-ui/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/message-center-ui/src/assets/styles/mixin.scss b/message-center-ui/src/assets/styles/mixin.scss
new file mode 100644
index 0000000..06fa061
--- /dev/null
+++ b/message-center-ui/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/message-center-ui/src/assets/styles/ruoyi.scss b/message-center-ui/src/assets/styles/ruoyi.scss
new file mode 100644
index 0000000..8fe1961
--- /dev/null
+++ b/message-center-ui/src/assets/styles/ruoyi.scss
@@ -0,0 +1,273 @@
+ /**
+ * 通用css样式布局处理
+ * Copyright (c) 2019 ruoyi
+ */
+
+ /** 基础通用 **/
+.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;
+}
+.ml0 {
+ margin-left: 10px;
+}
+.mt20 {
+ margin-top: 20px;
+}
+.mr20 {
+ margin-right: 20px;
+}
+.mb20 {
+ margin-bottom: 20px;
+}
+.m20 {
+ 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;
+}
+
+.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
+}
+
+/** 表格布局 **/
+.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: #409EFF;
+ 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: #1c84c6;
+}
+
+.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;
+}
diff --git a/message-center-ui/src/assets/styles/sidebar.scss b/message-center-ui/src/assets/styles/sidebar.scss
new file mode 100644
index 0000000..d2a7453
--- /dev/null
+++ b/message-center-ui/src/assets/styles/sidebar.scss
@@ -0,0 +1,223 @@
+#app {
+
+ .main-container {
+ min-height: 100%;
+ transition: margin-left .28s;
+ margin-left: $base-sidebar-width;
+ position: relative;
+ }
+
+ .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);
+
+ // 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;
+ }
+
+ // 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;
+
+ &: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/message-center-ui/src/assets/styles/transition.scss b/message-center-ui/src/assets/styles/transition.scss
new file mode 100644
index 0000000..4cb27cc
--- /dev/null
+++ b/message-center-ui/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/message-center-ui/src/assets/styles/variables.scss b/message-center-ui/src/assets/styles/variables.scss
new file mode 100644
index 0000000..34484d4
--- /dev/null
+++ b/message-center-ui/src/assets/styles/variables.scss
@@ -0,0 +1,54 @@
+// 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-menu-color:hsla(0,0%,100%,.65);
+$base-menu-color-active:#fff;
+$base-menu-background:#001529;
+$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:#000c17;
+$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/message-center-ui/src/components/AreaPicker/index.vue b/message-center-ui/src/components/AreaPicker/index.vue
new file mode 100644
index 0000000..105c647
--- /dev/null
+++ b/message-center-ui/src/components/AreaPicker/index.vue
@@ -0,0 +1,151 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/Breadcrumb/index.vue b/message-center-ui/src/components/Breadcrumb/index.vue
new file mode 100644
index 0000000..29f9a04
--- /dev/null
+++ b/message-center-ui/src/components/Breadcrumb/index.vue
@@ -0,0 +1,78 @@
+
+
+
+
+ {{ item.meta.title }}
+ {{ item.meta.title }}
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/Crontab/day.vue b/message-center-ui/src/components/Crontab/day.vue
new file mode 100644
index 0000000..bf9f566
--- /dev/null
+++ b/message-center-ui/src/components/Crontab/day.vue
@@ -0,0 +1,179 @@
+
+
+
+
+ 日,允许的通配符[, - * / L M]
+
+
+
+
+
+ 不指定
+
+
+
+
+
+ 周期从
+ -
+ 日
+
+
+
+
+
+ 从
+ 号开始,每
+ 日执行一次
+
+
+
+
+
+ 每月
+ 号最近的那个工作日
+
+
+
+
+
+ 本月最后一天
+
+
+
+
+
+ 指定
+
+ {{item}}
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/Crontab/hour.vue b/message-center-ui/src/components/Crontab/hour.vue
new file mode 100644
index 0000000..50833fc
--- /dev/null
+++ b/message-center-ui/src/components/Crontab/hour.vue
@@ -0,0 +1,122 @@
+
+
+
+
+ 小时,允许的通配符[, - * /]
+
+
+
+
+
+ 周期从
+ -
+ 小时
+
+
+
+
+
+ 从
+ 小时开始,每
+ 小时执行一次
+
+
+
+
+
+ 指定
+
+ {{item-1}}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/message-center-ui/src/components/Crontab/index.vue b/message-center-ui/src/components/Crontab/index.vue
new file mode 100644
index 0000000..27b4ab3
--- /dev/null
+++ b/message-center-ui/src/components/Crontab/index.vue
@@ -0,0 +1,425 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 确定
+ 重置
+ 取消
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/Crontab/min.vue b/message-center-ui/src/components/Crontab/min.vue
new file mode 100644
index 0000000..bd12ab5
--- /dev/null
+++ b/message-center-ui/src/components/Crontab/min.vue
@@ -0,0 +1,120 @@
+
+
+
+
+ 分钟,允许的通配符[, - * /]
+
+
+
+
+
+ 周期从
+ -
+ 分钟
+
+
+
+
+
+ 从
+ 分钟开始,每
+ 分钟执行一次
+
+
+
+
+
+ 指定
+
+ {{item-1}}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/message-center-ui/src/components/Crontab/month.vue b/message-center-ui/src/components/Crontab/month.vue
new file mode 100644
index 0000000..619d1e7
--- /dev/null
+++ b/message-center-ui/src/components/Crontab/month.vue
@@ -0,0 +1,128 @@
+
+
+
+
+ 月,允许的通配符[, - * /]
+
+
+
+
+
+ 周期从
+ -
+ 月
+
+
+
+
+
+ 从
+ 月开始,每
+ 月月执行一次
+
+
+
+
+
+ 指定
+
+ {{item}}
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/Crontab/result.vue b/message-center-ui/src/components/Crontab/result.vue
new file mode 100644
index 0000000..07b963b
--- /dev/null
+++ b/message-center-ui/src/components/Crontab/result.vue
@@ -0,0 +1,566 @@
+
+
+
+
+
diff --git a/message-center-ui/src/components/Crontab/second.vue b/message-center-ui/src/components/Crontab/second.vue
new file mode 100644
index 0000000..0fdf338
--- /dev/null
+++ b/message-center-ui/src/components/Crontab/second.vue
@@ -0,0 +1,133 @@
+
+
+
+
+ 秒,允许的通配符[, - * /]
+
+
+
+
+
+ 周期从
+ -
+ 秒
+
+
+
+
+
+ 从
+ 秒开始,每
+ 秒执行一次
+
+
+
+
+
+ 指定
+
+ {{item-1}}
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/Crontab/week.vue b/message-center-ui/src/components/Crontab/week.vue
new file mode 100644
index 0000000..5ad949d
--- /dev/null
+++ b/message-center-ui/src/components/Crontab/week.vue
@@ -0,0 +1,167 @@
+
+
+
+
+ 周,允许的通配符[, - * / L #]
+
+
+
+
+
+ 不指定
+
+
+
+
+
+ 周期从星期
+ -
+
+
+
+
+
+
+ 第
+ 周的星期
+
+
+
+
+
+
+ 本月最后一个星期
+
+
+
+
+
+
+ 指定
+
+ {{item}}
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/Crontab/year.vue b/message-center-ui/src/components/Crontab/year.vue
new file mode 100644
index 0000000..800dfa5
--- /dev/null
+++ b/message-center-ui/src/components/Crontab/year.vue
@@ -0,0 +1,144 @@
+
+
+
+
+ 不填,允许的通配符[, - * /]
+
+
+
+
+
+ 每年
+
+
+
+
+
+ 周期从
+ -
+
+
+
+
+
+
+ 从
+ 年开始,每
+ 年执行一次
+
+
+
+
+
+
+ 指定
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/DictData/index.js b/message-center-ui/src/components/DictData/index.js
new file mode 100644
index 0000000..c2a0359
--- /dev/null
+++ b/message-center-ui/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/message-center-ui/src/components/DictTag/index.vue b/message-center-ui/src/components/DictTag/index.vue
new file mode 100644
index 0000000..4c196c4
--- /dev/null
+++ b/message-center-ui/src/components/DictTag/index.vue
@@ -0,0 +1,52 @@
+
+
+
+
+ {{ item.label }}
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/message-center-ui/src/components/E-image/index.vue b/message-center-ui/src/components/E-image/index.vue
new file mode 100644
index 0000000..9401ce4
--- /dev/null
+++ b/message-center-ui/src/components/E-image/index.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/Editor/index.vue b/message-center-ui/src/components/Editor/index.vue
new file mode 100644
index 0000000..332c134
--- /dev/null
+++ b/message-center-ui/src/components/Editor/index.vue
@@ -0,0 +1,279 @@
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/ErrorLog/index.vue b/message-center-ui/src/components/ErrorLog/index.vue
new file mode 100644
index 0000000..6119c03
--- /dev/null
+++ b/message-center-ui/src/components/ErrorLog/index.vue
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+ Error Log
+ Clear All
+
+
+
+
+
+ Msg:
+
+ {{ row.err.message }}
+
+
+
+
+ Info:
+
+ {{ row.vm.$vnode.tag }} error in {{ row.info }}
+
+
+
+
+ Url:
+
+ {{ row.url }}
+
+
+
+
+
+
+ {{ scope.row.err.stack }}
+
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/FileUpload/index.vue b/message-center-ui/src/components/FileUpload/index.vue
new file mode 100644
index 0000000..227ff97
--- /dev/null
+++ b/message-center-ui/src/components/FileUpload/index.vue
@@ -0,0 +1,198 @@
+
+
+
+
+ 选取文件
+
+
+ 请上传
+ 大小不超过 {{ fileSize }}MB
+ 格式为 {{ fileType.join("/") }}
+ 的文件
+
+
+
+
+
+
+
+ {{ getFileName(file.name) }}
+
+
+ 删除
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/message-center-ui/src/components/Hamburger/index.vue b/message-center-ui/src/components/Hamburger/index.vue
new file mode 100644
index 0000000..368b002
--- /dev/null
+++ b/message-center-ui/src/components/Hamburger/index.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/HeaderSearch/index.vue b/message-center-ui/src/components/HeaderSearch/index.vue
new file mode 100644
index 0000000..c44eff5
--- /dev/null
+++ b/message-center-ui/src/components/HeaderSearch/index.vue
@@ -0,0 +1,190 @@
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/IconSelect/index.vue b/message-center-ui/src/components/IconSelect/index.vue
new file mode 100644
index 0000000..b0ec9fa
--- /dev/null
+++ b/message-center-ui/src/components/IconSelect/index.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/IconSelect/requireIcons.js b/message-center-ui/src/components/IconSelect/requireIcons.js
new file mode 100644
index 0000000..99e5c54
--- /dev/null
+++ b/message-center-ui/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/message-center-ui/src/components/ImageUpload/index.vue b/message-center-ui/src/components/ImageUpload/index.vue
new file mode 100644
index 0000000..8a8b1ec
--- /dev/null
+++ b/message-center-ui/src/components/ImageUpload/index.vue
@@ -0,0 +1,212 @@
+
+
+
+
+
+
+
+
+ 请上传
+ 大小不超过 {{ fileSize }}MB
+ 格式为 {{ fileType.join("/") }}
+ 的文件
+
+
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/Pagging/index.vue b/message-center-ui/src/components/Pagging/index.vue
new file mode 100644
index 0000000..1da1820
--- /dev/null
+++ b/message-center-ui/src/components/Pagging/index.vue
@@ -0,0 +1,45 @@
+
+
+ 批量删除
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/PanThumb/index.vue b/message-center-ui/src/components/PanThumb/index.vue
new file mode 100644
index 0000000..1bcf417
--- /dev/null
+++ b/message-center-ui/src/components/PanThumb/index.vue
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/ParentView/index.vue b/message-center-ui/src/components/ParentView/index.vue
new file mode 100644
index 0000000..7bf6148
--- /dev/null
+++ b/message-center-ui/src/components/ParentView/index.vue
@@ -0,0 +1,3 @@
+
+
+
diff --git a/message-center-ui/src/components/RightPanel/index.vue b/message-center-ui/src/components/RightPanel/index.vue
new file mode 100644
index 0000000..fbf27eb
--- /dev/null
+++ b/message-center-ui/src/components/RightPanel/index.vue
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/RightToolbar/index.vue b/message-center-ui/src/components/RightToolbar/index.vue
new file mode 100644
index 0000000..e3e1286
--- /dev/null
+++ b/message-center-ui/src/components/RightToolbar/index.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/RuoYi/Doc/index.vue b/message-center-ui/src/components/RuoYi/Doc/index.vue
new file mode 100644
index 0000000..a6187f3
--- /dev/null
+++ b/message-center-ui/src/components/RuoYi/Doc/index.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/message-center-ui/src/components/RuoYi/Git/index.vue b/message-center-ui/src/components/RuoYi/Git/index.vue
new file mode 100644
index 0000000..1d09a77
--- /dev/null
+++ b/message-center-ui/src/components/RuoYi/Git/index.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/message-center-ui/src/components/Screenfull/index.vue b/message-center-ui/src/components/Screenfull/index.vue
new file mode 100644
index 0000000..4735604
--- /dev/null
+++ b/message-center-ui/src/components/Screenfull/index.vue
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/SizeSelect/index.vue b/message-center-ui/src/components/SizeSelect/index.vue
new file mode 100644
index 0000000..e88065b
--- /dev/null
+++ b/message-center-ui/src/components/SizeSelect/index.vue
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+ {{
+ item.label }}
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/SvgIcon/index.vue b/message-center-ui/src/components/SvgIcon/index.vue
new file mode 100644
index 0000000..b07ded2
--- /dev/null
+++ b/message-center-ui/src/components/SvgIcon/index.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/ThemePicker/index.vue b/message-center-ui/src/components/ThemePicker/index.vue
new file mode 100644
index 0000000..3879c5a
--- /dev/null
+++ b/message-center-ui/src/components/ThemePicker/index.vue
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/TopNav/index.vue b/message-center-ui/src/components/TopNav/index.vue
new file mode 100644
index 0000000..1b7c4d9
--- /dev/null
+++ b/message-center-ui/src/components/TopNav/index.vue
@@ -0,0 +1,195 @@
+
+
+
+
+ {{ item.meta.title }}
+
+
+
+
+ 更多菜单
+
+
+ {{ item.meta.title }}
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/amap/amap.vue b/message-center-ui/src/components/amap/amap.vue
new file mode 100644
index 0000000..c7d643c
--- /dev/null
+++ b/message-center-ui/src/components/amap/amap.vue
@@ -0,0 +1,224 @@
+
+
+
+
+
+ 当前坐标: {{ lng }}, {{ lat }}
+ 地址: {{ address }}
+ 确定
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/iFrame/index.vue b/message-center-ui/src/components/iFrame/index.vue
new file mode 100644
index 0000000..426857f
--- /dev/null
+++ b/message-center-ui/src/components/iFrame/index.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/imgCodeRole/index.vue b/message-center-ui/src/components/imgCodeRole/index.vue
new file mode 100644
index 0000000..f17b0a9
--- /dev/null
+++ b/message-center-ui/src/components/imgCodeRole/index.vue
@@ -0,0 +1,147 @@
+
+
+
+
+
+
+
+ 请在上图依次点击:
+ {{wordList[0]}}
+ {{wordList[1]}}
+ {{wordList[2]}}
+ 换一换
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/pagination/index.vue b/message-center-ui/src/components/pagination/index.vue
new file mode 100644
index 0000000..6458cc1
--- /dev/null
+++ b/message-center-ui/src/components/pagination/index.vue
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/passwordSafe/index.vue b/message-center-ui/src/components/passwordSafe/index.vue
new file mode 100644
index 0000000..847af1b
--- /dev/null
+++ b/message-center-ui/src/components/passwordSafe/index.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/tab-search/index.vue b/message-center-ui/src/components/tab-search/index.vue
new file mode 100644
index 0000000..95351ef
--- /dev/null
+++ b/message-center-ui/src/components/tab-search/index.vue
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/uploadFile/index.vue b/message-center-ui/src/components/uploadFile/index.vue
new file mode 100644
index 0000000..c5619ad
--- /dev/null
+++ b/message-center-ui/src/components/uploadFile/index.vue
@@ -0,0 +1,118 @@
+
+
+
+
+
+ {{tip}}
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/uploadFileimg/index.vue b/message-center-ui/src/components/uploadFileimg/index.vue
new file mode 100644
index 0000000..25c53d7
--- /dev/null
+++ b/message-center-ui/src/components/uploadFileimg/index.vue
@@ -0,0 +1,104 @@
+
+
+
+
+ {{tip}}
+
+
+
+
+
+
diff --git a/message-center-ui/src/components/viewerjs/index.vue b/message-center-ui/src/components/viewerjs/index.vue
new file mode 100644
index 0000000..3d6f841
--- /dev/null
+++ b/message-center-ui/src/components/viewerjs/index.vue
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/demodata/menus-data-demo.js b/message-center-ui/src/demodata/menus-data-demo.js
new file mode 100644
index 0000000..cb3588c
--- /dev/null
+++ b/message-center-ui/src/demodata/menus-data-demo.js
@@ -0,0 +1,247 @@
+export const gencodeMenus = {
+ "msg": "操作成功",
+ "code": 200,
+ "data": [{
+ "name": "System",
+ "path": "/system",
+ "hidden": false,
+ "redirect": "noRedirect",
+ "component": "Layout",
+ "alwaysShow": true,
+ "meta": {
+ "title": "系统管理",
+ "icon": "system",
+ "noCache": false
+ },
+ "children": [{
+ "name": "User",
+ "path": "user",
+ "hidden": false,
+ "component": "system/user/index",
+ "meta": {
+ "title": "用户管理",
+ "icon": "user",
+ "noCache": false
+ }
+ }, {
+ "name": "Role",
+ "path": "role",
+ "hidden": false,
+ "component": "system/role/index",
+ "meta": {
+ "title": "角色管理",
+ "icon": "peoples",
+ "noCache": false
+ }
+ }, {
+ "name": "Menu",
+ "path": "menu",
+ "hidden": false,
+ "component": "system/menu/index",
+ "meta": {
+ "title": "菜单管理",
+ "icon": "tree-table",
+ "noCache": false
+ }
+ }, {
+ "name": "Dept",
+ "path": "dept",
+ "hidden": false,
+ "component": "system/dept/index",
+ "meta": {
+ "title": "部门管理",
+ "icon": "tree",
+ "noCache": false
+ }
+ }, {
+ "name": "Post",
+ "path": "post",
+ "hidden": false,
+ "component": "system/post/index",
+ "meta": {
+ "title": "岗位管理",
+ "icon": "post",
+ "noCache": false
+ }
+ }, {
+ "name": "Dict",
+ "path": "dict",
+ "hidden": false,
+ "component": "system/dict/index",
+ "meta": {
+ "title": "字典管理",
+ "icon": "dict",
+ "noCache": false
+ }
+ }, {
+ "name": "Config",
+ "path": "config",
+ "hidden": false,
+ "component": "system/config/index",
+ "meta": {
+ "title": "参数设置",
+ "icon": "edit",
+ "noCache": false
+ }
+ }, {
+ "name": "Notice",
+ "path": "notice",
+ "hidden": false,
+ "component": "system/notice/index",
+ "meta": {
+ "title": "通知公告",
+ "icon": "message",
+ "noCache": false
+ }
+ }, {
+ "name": "Log",
+ "path": "log",
+ "hidden": false,
+ "redirect": "noRedirect",
+ "component": "ParentView",
+ "alwaysShow": true,
+ "meta": {
+ "title": "日志管理",
+ "icon": "log",
+ "noCache": false
+ },
+ "children": [{
+ "name": "Operlog",
+ "path": "operlog",
+ "hidden": false,
+ "component": "monitor/operlog/index",
+ "meta": {
+ "title": "操作日志",
+ "icon": "form",
+ "noCache": false
+ }
+ }, {
+ "name": "Logininfor",
+ "path": "logininfor",
+ "hidden": false,
+ "component": "monitor/logininfor/index",
+ "meta": {
+ "title": "登录日志",
+ "icon": "logininfor",
+ "noCache": false
+ }
+ }]
+ }]
+ }, {
+ "name": "Monitor",
+ "path": "/monitor",
+ "hidden": false,
+ "redirect": "noRedirect",
+ "component": "Layout",
+ "alwaysShow": true,
+ "meta": {
+ "title": "系统监控",
+ "icon": "monitor",
+ "noCache": false
+ },
+ "children": [{
+ "name": "Online",
+ "path": "online",
+ "hidden": false,
+ "component": "monitor/online/index",
+ "meta": {
+ "title": "在线用户",
+ "icon": "online",
+ "noCache": false
+ }
+ }, {
+ "name": "Job",
+ "path": "job",
+ "hidden": false,
+ "component": "monitor/job/index",
+ "meta": {
+ "title": "定时任务",
+ "icon": "job",
+ "noCache": false
+ }
+ }, {
+ "name": "Druid",
+ "path": "druid",
+ "hidden": false,
+ "component": "monitor/druid/index",
+ "meta": {
+ "title": "数据监控",
+ "icon": "druid",
+ "noCache": false
+ }
+ }, {
+ "name": "Server",
+ "path": "server",
+ "hidden": false,
+ "component": "monitor/server/index",
+ "meta": {
+ "title": "服务监控",
+ "icon": "server",
+ "noCache": false
+ }
+ }, {
+ "name": "Cache",
+ "path": "cache",
+ "hidden": false,
+ "component": "monitor/cache/index",
+ "meta": {
+ "title": "缓存监控",
+ "icon": "redis",
+ "noCache": false
+ }
+ }]
+ }, {
+ "name": "Tool",
+ "path": "/tool",
+ "hidden": false,
+ "redirect": "noRedirect",
+ "component": "Layout",
+ "alwaysShow": true,
+ "meta": {
+ "title": "系统工具",
+ "icon": "tool",
+ "noCache": false
+ },
+ "children": [{
+ "name": "Build",
+ "path": "build",
+ "hidden": false,
+ "component": "tool/build/index",
+ "meta": {
+ "title": "表单构建",
+ "icon": "build",
+ "noCache": false
+ }
+ }, {
+ "name": "Gen",
+ "path": "gen",
+ "hidden": false,
+ "component": "tool/gen/index",
+ "meta": {
+ "title": "代码生成",
+ "icon": "code",
+ "noCache": false
+ }
+ }, {
+ "name": "Swagger",
+ "path": "swagger",
+ "hidden": false,
+ "component": "tool/swagger/index",
+ "meta": {
+ "title": "系统接口",
+ "icon": "swagger",
+ "noCache": false
+ }
+ }]
+ }, {
+ "name": "Http://ruoyi.vip",
+ "path": "http://ruoyi.vip",
+ "hidden": false,
+ "component": "Layout",
+ "meta": {
+ "title": "若依官网",
+ "icon": "guide",
+ "noCache": false
+ }
+ }]
+}
diff --git a/message-center-ui/src/demodata/menus-data.js b/message-center-ui/src/demodata/menus-data.js
new file mode 100644
index 0000000..69c4450
--- /dev/null
+++ b/message-center-ui/src/demodata/menus-data.js
@@ -0,0 +1,85 @@
+export const gencodeMenus = {
+ "msg": "操作成功",
+ "code": 200,
+ "data": [{
+ "name": "AnruiMessageCenter",
+ "path": "/anruimessagecenter",
+ "hidden": false,
+ "redirect": "noRedirect",
+ "component": "Layout",
+ "alwaysShow": true,
+ "meta": {
+ "title": "消息中心",
+ "icon": "system",
+ "noCache": false
+ },
+ "children": [
+ {
+ "name": "AnruiMessageCenterMessageIndex",
+ "path": "message",
+ "hidden": false,
+ "component": "anruimessagecenter/message/index",
+ "meta": {
+ "title": "消息体",
+ "icon": "dict",
+ "noCache": false
+ }
+ },
+ {
+ "name": "AnruiMessageCenterMessageFileIndex",
+ "path": "messagefile",
+ "hidden": false,
+ "component": "anruimessagecenter/messagefile/index",
+ "meta": {
+ "title": "消息附件",
+ "icon": "dict",
+ "noCache": false
+ }
+ },
+ {
+ "name": "AnruiMessageCenterMessageForwardlistIndex",
+ "path": "messageforwardlist",
+ "hidden": false,
+ "component": "anruimessagecenter/messageforwardlist/index",
+ "meta": {
+ "title": "消息转发记录",
+ "icon": "dict",
+ "noCache": false
+ }
+ },
+ {
+ "name": "AnruiMessageCenterMessageListIndex",
+ "path": "messagelist",
+ "hidden": false,
+ "component": "anruimessagecenter/messagelist/index",
+ "meta": {
+ "title": "消息列表",
+ "icon": "dict",
+ "noCache": false
+ }
+ },
+ {
+ "name": "AnruiMessageCenterMessageRemindruleIndex",
+ "path": "messageremindrule",
+ "hidden": false,
+ "component": "anruimessagecenter/messageremindrule/index",
+ "meta": {
+ "title": "提醒规则",
+ "icon": "dict",
+ "noCache": false
+ }
+ },
+ {
+ "name": "AnruiMessageCenterMessageReplyIndex",
+ "path": "messagereply",
+ "hidden": false,
+ "component": "anruimessagecenter/messagereply/index",
+ "meta": {
+ "title": "消息回复",
+ "icon": "dict",
+ "noCache": false
+ }
+ }
+ ]
+ }]
+}
diff --git a/message-center-ui/src/directive/dialog/drag.js b/message-center-ui/src/directive/dialog/drag.js
new file mode 100644
index 0000000..2e82346
--- /dev/null
+++ b/message-center-ui/src/directive/dialog/drag.js
@@ -0,0 +1,64 @@
+/**
+* v-dialogDrag 弹窗拖拽
+* Copyright (c) 2019 ruoyi
+*/
+
+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;
+ };
+ }
+ }
+};
\ No newline at end of file
diff --git a/message-center-ui/src/directive/dialog/dragHeight.js b/message-center-ui/src/directive/dialog/dragHeight.js
new file mode 100644
index 0000000..d1590f8
--- /dev/null
+++ b/message-center-ui/src/directive/dialog/dragHeight.js
@@ -0,0 +1,34 @@
+/**
+* v-dialogDragWidth 可拖动弹窗高度(右下角)
+* Copyright (c) 2019 ruoyi
+*/
+
+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);
+ }
+}
\ No newline at end of file
diff --git a/message-center-ui/src/directive/dialog/dragWidth.js b/message-center-ui/src/directive/dialog/dragWidth.js
new file mode 100644
index 0000000..d5cda3a
--- /dev/null
+++ b/message-center-ui/src/directive/dialog/dragWidth.js
@@ -0,0 +1,30 @@
+/**
+* v-dialogDragWidth 可拖动弹窗宽度(右侧边)
+* Copyright (c) 2019 ruoyi
+*/
+
+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);
+ }
+}
\ No newline at end of file
diff --git a/message-center-ui/src/directive/index.js b/message-center-ui/src/directive/index.js
new file mode 100644
index 0000000..5801640
--- /dev/null
+++ b/message-center-ui/src/directive/index.js
@@ -0,0 +1,21 @@
+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'
+
+const install = function(Vue) {
+ Vue.directive('hasRole', hasRole)
+ Vue.directive('hasPermi', hasPermi)
+ 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/message-center-ui/src/directive/permission/hasPermi.js b/message-center-ui/src/directive/permission/hasPermi.js
new file mode 100644
index 0000000..719536c
--- /dev/null
+++ b/message-center-ui/src/directive/permission/hasPermi.js
@@ -0,0 +1,28 @@
+ /**
+ * v-hasPermi 操作权限处理
+ * Copyright (c) 2019 ruoyi
+ */
+
+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/message-center-ui/src/directive/permission/hasRole.js b/message-center-ui/src/directive/permission/hasRole.js
new file mode 100644
index 0000000..eec4a5b
--- /dev/null
+++ b/message-center-ui/src/directive/permission/hasRole.js
@@ -0,0 +1,28 @@
+ /**
+ * v-hasRole 角色权限处理
+ * Copyright (c) 2019 ruoyi
+ */
+
+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/message-center-ui/src/directive/permission/index.js b/message-center-ui/src/directive/permission/index.js
new file mode 100644
index 0000000..e3d76d3
--- /dev/null
+++ b/message-center-ui/src/directive/permission/index.js
@@ -0,0 +1,15 @@
+import hasRole from './hasRole'
+import hasPermi from './hasPermi'
+
+const install = function(Vue) {
+ Vue.directive('hasRole', hasRole)
+ Vue.directive('hasPermi', hasPermi)
+}
+
+if (window.Vue) {
+ window['hasRole'] = hasRole
+ window['hasPermi'] = hasPermi
+ Vue.use(install); // eslint-disable-line
+}
+
+export default install
diff --git a/message-center-ui/src/icons/index.js b/message-center-ui/src/icons/index.js
new file mode 100644
index 0000000..2c6b309
--- /dev/null
+++ b/message-center-ui/src/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/message-center-ui/src/icons/svg/dashboard.svg b/message-center-ui/src/icons/svg/dashboard.svg
new file mode 100644
index 0000000..5317d37
--- /dev/null
+++ b/message-center-ui/src/icons/svg/dashboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/icons/svg/example.svg b/message-center-ui/src/icons/svg/example.svg
new file mode 100644
index 0000000..46f42b5
--- /dev/null
+++ b/message-center-ui/src/icons/svg/example.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/icons/svg/eye-open.svg b/message-center-ui/src/icons/svg/eye-open.svg
new file mode 100644
index 0000000..88dcc98
--- /dev/null
+++ b/message-center-ui/src/icons/svg/eye-open.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/icons/svg/eye.svg b/message-center-ui/src/icons/svg/eye.svg
new file mode 100644
index 0000000..16ed2d8
--- /dev/null
+++ b/message-center-ui/src/icons/svg/eye.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/icons/svg/form.svg b/message-center-ui/src/icons/svg/form.svg
new file mode 100644
index 0000000..dcbaa18
--- /dev/null
+++ b/message-center-ui/src/icons/svg/form.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/icons/svg/link.svg b/message-center-ui/src/icons/svg/link.svg
new file mode 100644
index 0000000..48197ba
--- /dev/null
+++ b/message-center-ui/src/icons/svg/link.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/icons/svg/nested.svg b/message-center-ui/src/icons/svg/nested.svg
new file mode 100644
index 0000000..06713a8
--- /dev/null
+++ b/message-center-ui/src/icons/svg/nested.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/icons/svg/password.svg b/message-center-ui/src/icons/svg/password.svg
new file mode 100644
index 0000000..e291d85
--- /dev/null
+++ b/message-center-ui/src/icons/svg/password.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/icons/svg/table.svg b/message-center-ui/src/icons/svg/table.svg
new file mode 100644
index 0000000..0e3dc9d
--- /dev/null
+++ b/message-center-ui/src/icons/svg/table.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/icons/svg/tree.svg b/message-center-ui/src/icons/svg/tree.svg
new file mode 100644
index 0000000..dd4b7dd
--- /dev/null
+++ b/message-center-ui/src/icons/svg/tree.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/icons/svg/user.svg b/message-center-ui/src/icons/svg/user.svg
new file mode 100644
index 0000000..0ba0716
--- /dev/null
+++ b/message-center-ui/src/icons/svg/user.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/message-center-ui/src/icons/svgo.yml b/message-center-ui/src/icons/svgo.yml
new file mode 100644
index 0000000..d11906a
--- /dev/null
+++ b/message-center-ui/src/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/message-center-ui/src/layout/components/AppMain.vue b/message-center-ui/src/layout/components/AppMain.vue
new file mode 100644
index 0000000..a8f3718
--- /dev/null
+++ b/message-center-ui/src/layout/components/AppMain.vue
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/layout/components/InnerLink/index.vue b/message-center-ui/src/layout/components/InnerLink/index.vue
new file mode 100644
index 0000000..a45d1a4
--- /dev/null
+++ b/message-center-ui/src/layout/components/InnerLink/index.vue
@@ -0,0 +1,27 @@
+
diff --git a/message-center-ui/src/layout/components/Navbar.vue b/message-center-ui/src/layout/components/Navbar.vue
new file mode 100644
index 0000000..142f6ef
--- /dev/null
+++ b/message-center-ui/src/layout/components/Navbar.vue
@@ -0,0 +1,151 @@
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/layout/components/Settings/index.vue b/message-center-ui/src/layout/components/Settings/index.vue
new file mode 100644
index 0000000..cd00c54
--- /dev/null
+++ b/message-center-ui/src/layout/components/Settings/index.vue
@@ -0,0 +1,268 @@
+
+
+
+
+
+
主题风格设置
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 主题颜色
+
+
+
+
+
+
+
系统布局配置
+
+
+ 开启 TopNav
+
+
+
+
+ 开启 Tags-Views
+
+
+
+
+ 固定 Header
+
+
+
+
+ 显示 Logo
+
+
+
+
+ 动态标题
+
+
+
+
+
+
保存配置
+
重置配置
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/layout/components/Sidebar/FixiOSBug.js b/message-center-ui/src/layout/components/Sidebar/FixiOSBug.js
new file mode 100644
index 0000000..bc14856
--- /dev/null
+++ b/message-center-ui/src/layout/components/Sidebar/FixiOSBug.js
@@ -0,0 +1,26 @@
+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
+ // https://github.com/PanJiaChen/vue-element-admin/issues/1135
+ 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/message-center-ui/src/layout/components/Sidebar/Item.vue b/message-center-ui/src/layout/components/Sidebar/Item.vue
new file mode 100644
index 0000000..aa1f5da
--- /dev/null
+++ b/message-center-ui/src/layout/components/Sidebar/Item.vue
@@ -0,0 +1,41 @@
+
+
+
diff --git a/message-center-ui/src/layout/components/Sidebar/Link.vue b/message-center-ui/src/layout/components/Sidebar/Link.vue
new file mode 100644
index 0000000..530b3d5
--- /dev/null
+++ b/message-center-ui/src/layout/components/Sidebar/Link.vue
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/layout/components/Sidebar/Logo.vue b/message-center-ui/src/layout/components/Sidebar/Logo.vue
new file mode 100644
index 0000000..8d23357
--- /dev/null
+++ b/message-center-ui/src/layout/components/Sidebar/Logo.vue
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/layout/components/Sidebar/SidebarItem.vue b/message-center-ui/src/layout/components/Sidebar/SidebarItem.vue
new file mode 100644
index 0000000..a61367a
--- /dev/null
+++ b/message-center-ui/src/layout/components/Sidebar/SidebarItem.vue
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/layout/components/Sidebar/index.vue b/message-center-ui/src/layout/components/Sidebar/index.vue
new file mode 100644
index 0000000..d6b96d5
--- /dev/null
+++ b/message-center-ui/src/layout/components/Sidebar/index.vue
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+ 消息列表
+
+
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/layout/components/TagsView/ScrollPane.vue b/message-center-ui/src/layout/components/TagsView/ScrollPane.vue
new file mode 100644
index 0000000..e8d682b
--- /dev/null
+++ b/message-center-ui/src/layout/components/TagsView/ScrollPane.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/message-center-ui/src/layout/components/TagsView/index.vue b/message-center-ui/src/layout/components/TagsView/index.vue
new file mode 100644
index 0000000..1b096ef
--- /dev/null
+++ b/message-center-ui/src/layout/components/TagsView/index.vue
@@ -0,0 +1,343 @@
+
+
+
+
+ {{ tag.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/layout/components/index.js b/message-center-ui/src/layout/components/index.js
new file mode 100644
index 0000000..686faf6
--- /dev/null
+++ b/message-center-ui/src/layout/components/index.js
@@ -0,0 +1,4 @@
+export { default as Navbar } from './Navbar'
+export { default as Sidebar } from './Sidebar'
+export { default as AppMain } from './AppMain'
+export { default as TagsView } from './TagsView/index.vue'
diff --git a/message-center-ui/src/layout/index.vue b/message-center-ui/src/layout/index.vue
new file mode 100644
index 0000000..7b0a5cc
--- /dev/null
+++ b/message-center-ui/src/layout/index.vue
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/layout/mixin/ResizeHandler.js b/message-center-ui/src/layout/mixin/ResizeHandler.js
new file mode 100644
index 0000000..e8d0df8
--- /dev/null
+++ b/message-center-ui/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/message-center-ui/src/main.js b/message-center-ui/src/main.js
new file mode 100644
index 0000000..3002452
--- /dev/null
+++ b/message-center-ui/src/main.js
@@ -0,0 +1,58 @@
+import 'babel-polyfill'
+import Vue from 'vue'
+import 'normalize.css/normalize.css' // A modern alternative to CSS resets
+
+import ElementUI from 'element-ui'
+import 'element-ui/lib/theme-chalk/index.css'
+Vue.use(ElementUI)
+
+import '@/styles/index.scss' // global css
+
+import App from './App'
+import store from './store'
+import router from './router'
+
+import '@/icons' // icon
+//import '@/permission' //权限控制
+
+Vue.prototype.$userInfo = null // 用户信息
+Vue.prototype.msgSuccess = function (msg) {
+ alert(msg);
+}
+
+// 全局自定义组件
+import Pagination from '@/components/pagination/index.vue'
+Vue.component("Pagination", Pagination)
+import tabsearch from '@/components/tab-search/index.vue'
+Vue.component("tab-search", tabsearch)
+import eimage from "@/components/E-image/index.vue"
+Vue.component("eimage", eimage);
+
+import Print from '@/utils/print' // 引入附件的js文件
+Vue.use(Print) // 注册
+
+import { setStorage, getStorage } from "./utils/auth.js"
+let token = null;
+token = GetQueryString("token")
+
+//if (token) {
+//setStorage(token)
+//let href = window.location.href;
+//href = href.split(`token=${token}`)[0];
+//window.location.href = href.slice(0, href.length - 1);
+//}
+
+function GetQueryString(name){
+ var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
+ var r = window.location.search.substr(1).match(reg);
+ if(r!=null)return unescape(r[2]); return null;
+}
+
+Vue.config.productionTip = false
+
+new Vue({
+ el: '#app',
+ router,
+ store,
+ render: h => h(App)
+})
diff --git a/message-center-ui/src/permission.js b/message-center-ui/src/permission.js
new file mode 100644
index 0000000..1f34d71
--- /dev/null
+++ b/message-center-ui/src/permission.js
@@ -0,0 +1,45 @@
+import router from './router'
+import store from './store'
+// import { Message } from 'element-ui'
+// import Vue from 'vue'
+import NProgress from 'nprogress' // progress bar
+import 'nprogress/nprogress.css' // progress bar style
+import getPageTitle from '@/utils/get-page-title'
+NProgress.configure({ showSpinner: false }) // NProgress Configuration
+
+import { getStorage } from '@/utils/auth' // get token from cookie
+import { getRoleRouter } from '@/router/modules/components.js'
+
+const whiteList = ['/login', '/registUser', '/registOrg'] // no redirect whitelist
+router.beforeEach(async(to, from, next) => {
+ // start progress bar
+ NProgress.start()
+
+ // set page title
+ document.title = getPageTitle(to.meta.title)
+
+ // determine whether the user has logged in
+//const hasToken = getStorage()
+const hasToken = window.sessionStorage.getItem('token')
+ if (hasToken) {
+ const userInfo = store.getters.userInfo
+ if (userInfo) {
+ next()
+ NProgress.done()
+ } else {
+ await store.dispatch('user/getInfo')
+ let userRoles = await getRoleRouter(store.getters.userInfo.userSid)
+ router.options.routes = userRoles
+ router.addRoutes(userRoles) // 动态添加可访问路由表
+ console.log(to)
+ next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 ,set the replace:
+ }
+ } else {
+ window.location.href = process.env.VUE_APP_URL
+ }
+})
+
+router.afterEach(() => {
+ // finish progress bar
+ NProgress.done()
+})
diff --git a/message-center-ui/src/router/index.js b/message-center-ui/src/router/index.js
new file mode 100644
index 0000000..cfe2674
--- /dev/null
+++ b/message-center-ui/src/router/index.js
@@ -0,0 +1,62 @@
+import Vue from 'vue'
+import Router from 'vue-router'
+
+Vue.use(Router)
+
+/* Layout */
+import Layout from '@/layout'
+/* 所有角色可以访问/没有权限要求的基页 */
+
+export const constantRoutes = [
+ {
+ path: '/',
+ redirect: 'index'
+ },
+ {
+ path: '/index',
+ component: Layout,
+ redirect: '/index',
+ children: [{
+ path: '/index',
+ component: () =>
+ import('@/views/index.vue'),
+ name: 'index',
+ meta: {
+ title: '主页',
+ noCache: true,
+ affix: true
+ }
+ }]
+ },{
+ path: '/messagelist',
+ component: Layout,
+ redirect: '/messagelist',
+ children: [{
+ path: '/messagelist',
+ component: () =>
+ import('@/views/anruimessagecenter/messagelist/index.vue'),
+ name: 'messagelist',
+ meta: {
+ title: '消息列表'
+ }
+ }]
+}
+]
+
+// import componentsRouter from '@/router/modules/components'
+
+const createRouter = () => new Router({
+ // mode: 'history', // require service support
+ scrollBehavior: () => ({ y: 0 }),
+ routes: constantRoutes
+})
+
+const router = createRouter()
+
+// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465
+export function resetRouter() {
+ const newRouter = createRouter()
+ router.matcher = newRouter.matcher // reset router
+}
+
+export default router
diff --git a/message-center-ui/src/settings.js b/message-center-ui/src/settings.js
new file mode 100644
index 0000000..5c1101e
--- /dev/null
+++ b/message-center-ui/src/settings.js
@@ -0,0 +1,47 @@
+module.exports = {
+
+ title: '消息中心',
+
+ /**
+ * 侧边栏主题 深色主题theme-dark,浅色主题theme-light
+ */
+ sideTheme: 'theme-dark',
+
+ /**
+ * 是否系统布局配置
+ */
+ showSettings: false,
+
+ /**
+ * 是否显示顶部导航
+ */
+ topNav: false,
+
+ /**
+ * 是否显示 tagsView
+ */
+ tagsView: false,
+
+ /**
+ * 是否固定头部
+ */
+ 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: 'production'
+}
diff --git a/message-center-ui/src/store/getters.js b/message-center-ui/src/store/getters.js
new file mode 100644
index 0000000..33a426a
--- /dev/null
+++ b/message-center-ui/src/store/getters.js
@@ -0,0 +1,17 @@
+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,
+ userInfo: state => state.user.userInfo,
+ menus: state => state.user.menus,
+ introduction: state => state.user.introduction,
+ roles: state => state.user.roles,
+ permission_routes: state => state.permission.routes,
+ errorLogs: state => state.errorLog.logs
+}
+export default getters
diff --git a/message-center-ui/src/store/index.js b/message-center-ui/src/store/index.js
new file mode 100644
index 0000000..0fd8395
--- /dev/null
+++ b/message-center-ui/src/store/index.js
@@ -0,0 +1,25 @@
+import Vue from 'vue'
+import Vuex from 'vuex'
+import getters from './getters'
+
+Vue.use(Vuex)
+
+// https://webpack.js.org/guides/dependency-management/#requirecontext
+const modulesFiles = require.context('./modules', true, /\.js$/)
+
+// you do not need `import app from './modules/app'`
+// it will auto require all vuex module from modules file
+const modules = modulesFiles.keys().reduce((modules, modulePath) => {
+ // set './app.js' => 'app'
+ const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
+ const value = modulesFiles(modulePath)
+ modules[moduleName] = value.default
+ return modules
+}, {})
+
+const store = new Vuex.Store({
+ modules,
+ getters
+})
+
+export default store
diff --git a/message-center-ui/src/store/modules/app.js b/message-center-ui/src/store/modules/app.js
new file mode 100644
index 0000000..45d89bb
--- /dev/null
+++ b/message-center-ui/src/store/modules/app.js
@@ -0,0 +1,56 @@
+import Cookies from 'js-cookie'
+
+const state = {
+ sidebar: {
+ opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,
+ withoutAnimation: false
+ },
+ device: 'desktop',
+ size: Cookies.get('size') || 'medium'
+}
+
+const mutations = {
+ TOGGLE_SIDEBAR: state => {
+ 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)
+ }
+}
+
+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)
+ }
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
diff --git a/message-center-ui/src/store/modules/errorLog.js b/message-center-ui/src/store/modules/errorLog.js
new file mode 100644
index 0000000..6b01f95
--- /dev/null
+++ b/message-center-ui/src/store/modules/errorLog.js
@@ -0,0 +1,28 @@
+const state = {
+ logs: []
+}
+
+const mutations = {
+ ADD_ERROR_LOG: (state, log) => {
+ state.logs.push(log)
+ },
+ CLEAR_ERROR_LOG: (state) => {
+ state.logs.splice(0)
+ }
+}
+
+const actions = {
+ addErrorLog({ commit }, log) {
+ commit('ADD_ERROR_LOG', log)
+ },
+ clearErrorLog({ commit }) {
+ commit('CLEAR_ERROR_LOG')
+ }
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
diff --git a/message-center-ui/src/store/modules/permission.js b/message-center-ui/src/store/modules/permission.js
new file mode 100644
index 0000000..aeb5ee5
--- /dev/null
+++ b/message-center-ui/src/store/modules/permission.js
@@ -0,0 +1,69 @@
+import { asyncRoutes, constantRoutes } from '@/router'
+
+/**
+ * Use meta.role to determine if the current user has permission
+ * @param roles
+ * @param route
+ */
+function hasPermission(roles, route) {
+ if (route.meta && route.meta.roles) {
+ return roles.some(role => route.meta.roles.includes(role))
+ } else {
+ return true
+ }
+}
+
+/**
+ * Filter asynchronous routing tables by recursion
+ * @param routes asyncRoutes
+ * @param roles
+ */
+export function filterAsyncRoutes(routes, roles) {
+ const res = []
+
+ routes.forEach(route => {
+ const tmp = { ...route }
+ if (hasPermission(roles, tmp)) {
+ if (tmp.children) {
+ tmp.children = filterAsyncRoutes(tmp.children, roles)
+ }
+ res.push(tmp)
+ }
+ })
+
+ return res
+}
+
+const state = {
+ routes: [],
+ addRoutes: []
+}
+
+const mutations = {
+ SET_ROUTES: (state, routes) => {
+ state.addRoutes = routes
+ state.routes = constantRoutes.concat(routes)
+ }
+}
+
+const actions = {
+ generateRoutes({ commit }, roles) {
+ return new Promise(resolve => {
+ let accessedRoutes
+ if (roles.includes('admin')) {
+ accessedRoutes = asyncRoutes || []
+ } else {
+ accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
+ }
+ commit('SET_ROUTES', accessedRoutes)
+ resolve(accessedRoutes)
+ })
+ }
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
diff --git a/message-center-ui/src/store/modules/settings.js b/message-center-ui/src/store/modules/settings.js
new file mode 100644
index 0000000..110533f
--- /dev/null
+++ b/message-center-ui/src/store/modules/settings.js
@@ -0,0 +1,35 @@
+import variables from '@/styles/element-variables.scss'
+import defaultSettings from '@/settings'
+
+const { showSettings, tagsView, fixedHeader, sidebarLogo } = defaultSettings
+
+const state = {
+ theme: variables.theme,
+ showSettings: showSettings,
+ tagsView: tagsView,
+ fixedHeader: fixedHeader,
+ sidebarLogo: sidebarLogo
+}
+
+const mutations = {
+ CHANGE_SETTING: (state, { key, value }) => {
+ // eslint-disable-next-line no-prototype-builtins
+ if (state.hasOwnProperty(key)) {
+ state[key] = value
+ }
+ }
+}
+
+const actions = {
+ changeSetting({ commit }, data) {
+ commit('CHANGE_SETTING', data)
+ }
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
+
diff --git a/message-center-ui/src/store/modules/tagsView.js b/message-center-ui/src/store/modules/tagsView.js
new file mode 100644
index 0000000..57e7242
--- /dev/null
+++ b/message-center-ui/src/store/modules/tagsView.js
@@ -0,0 +1,160 @@
+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.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 {
+ // if index = -1, there is no cached tags
+ 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
+ }
+ }
+ }
+}
+
+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)
+ }
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
diff --git a/message-center-ui/src/store/modules/user.js b/message-center-ui/src/store/modules/user.js
new file mode 100644
index 0000000..d49545a
--- /dev/null
+++ b/message-center-ui/src/store/modules/user.js
@@ -0,0 +1,150 @@
+import { login, logout, getInfo } from '@/api/user'
+import { getStorage, setStorage, removeStorage } from '@/utils/auth'
+
+import router, { resetRouter } from '@/router'
+
+const state = {
+ token: getStorage(),
+ userInfo: '',
+ menus: '',
+}
+
+const mutations = {
+ SET_TOKEN: (state, token) => {
+ state.token = token
+ },
+ SET_UESRINFO: (state, userInfo) => {
+ state.userInfo = userInfo
+ },
+ SET_MENUS: (state, menus) => {
+ state.menus = menus
+ }
+}
+
+const actions = {
+ // user login
+ login({ commit }, userInfo) {
+ return new Promise((resolve, reject) => {
+ login(userInfo).then(response => {
+ const { data } = response
+ commit('SET_TOKEN', data.token)
+ setStorage(data.token)
+ let user = {
+ roleSid: data.roleSid,
+ name: data.name,
+ userName: data.userName,
+ departmentName: data.departmentName,
+ isAdmin: data.isAdmin,
+ staffSid: data.staffSid,
+ userSid: data.sid,
+ orgSid: data.organizationSid,
+ Orgname: data.organizationName,
+ dwjb: data.dwjb
+ }
+ commit('SET_UESRINFO', user)
+ window.sessionStorage.setItem('userSid', user.userSid);
+ window.sessionStorage.setItem('Orgname', user.Orgname);
+ window.sessionStorage.setItem('departmentName', user.departmentName);
+ window.sessionStorage.setItem('name', user.name);
+ resolve(data)
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ },
+
+ // get user info
+ getInfo({ commit, state }) {
+ return new Promise((resolve, reject) => {
+ getInfo().then(response => {
+ const { data } = response
+ if (!data) {
+ removeStorage()
+ reject('Verification failed, please Login again.')
+ }
+ let user = {
+ roleSid: data.roleSid,
+ name: data.name,
+ userName: data.userName,
+ orgRoleName: data.orgRoleName,
+ isAdmin: data.isAdmin,
+ staffSid: data.staffSid,
+ userSid: data.sid,
+ orgSid: data.organizationSid,
+ Orgname: data.organizationName,
+ dwjb: data.dwjb
+ }
+ commit('SET_UESRINFO', user)
+ resolve(data)
+ }).catch(error => {
+ removeStorage()
+ router.push({path: '/'})
+ // reject(error)
+ })
+ })
+ },
+
+ getMenus({ commit, state }) {
+ return new Promise((resolve, reject) => {
+ getInfo().then(response => {
+ const { data } = response
+ commit('SET_UESRINFO', user)
+ resolve(data)
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ },
+
+ // user logout
+ logout({ commit, state, dispatch }) {
+ return new Promise((resolve, reject) => {
+ logout(state.token).then(() => {
+ commit('SET_TOKEN', '')
+ commit('SET_UESRINFO', '')
+ removeStorage()
+ resetRouter()
+ resolve()
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ },
+
+ // remove token
+ // resetToken({ commit }) {
+ // return new Promise(resolve => {
+ // commit('SET_TOKEN', '')
+ // commit('SET_ROLES', [])
+ // removeToken()
+ // resolve()
+ // })
+ // },
+
+ // dynamically modify permissions
+ // async changeRoles({ commit, dispatch }, role) {
+ // const token = role + '-token'
+
+ // commit('SET_TOKEN', token)
+ // setToken(token)
+
+ // const { roles } = await dispatch('getInfo')
+
+ // resetRouter()
+
+ // // generate accessible routes map based on roles
+ // const accessRoutes = await dispatch('permission/generateRoutes', roles, { root: true })
+ // // dynamically add accessible routes
+ // router.addRoutes(accessRoutes)
+
+ // // reset visited views and cached views
+ // dispatch('tagsView/delAllViews', null, { root: true })
+ // }
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
diff --git a/message-center-ui/src/styles/e-table.scss b/message-center-ui/src/styles/e-table.scss
new file mode 100644
index 0000000..95b9f9c
--- /dev/null
+++ b/message-center-ui/src/styles/e-table.scss
@@ -0,0 +1,30 @@
+.e-table {
+ width: 100%;
+ padding: 0 30px;
+ tr:first-child th{
+ background-color: #c1f4cd;
+ }
+ tr {
+ td {
+ border: 1px solid #e6e9f0;
+ border-right: 0px;
+ border-bottom: 0px;
+ padding: 10px 20px;
+ }
+ td:last-child {
+ border-right: 1px solid #e6e9f0;
+ }
+ }
+ tr:last-child {
+ td {
+ border-bottom: 1px solid #e6e9f0;
+ }
+ }
+
+ td:nth-child(2n-1) {
+ text-align: right;
+ }
+ td:nth-child(2n) {
+ text-align: left;
+ }
+ }
diff --git a/message-center-ui/src/styles/element-table.scss b/message-center-ui/src/styles/element-table.scss
new file mode 100644
index 0000000..727938c
--- /dev/null
+++ b/message-center-ui/src/styles/element-table.scss
@@ -0,0 +1,19 @@
+.el-table {
+ .el-table__header{
+ tr th{
+ background: #edf1f7;
+ color: #333333;
+ }
+ }
+}
+
+.table-describe{
+ border: 1px solid #dfe4ed;
+ border-bottom: 0px solid #dfe4ed;
+ h4{
+ float: left;
+ margin: 0;
+ line-height: 34px;
+ padding:0 15px;
+ }
+}
diff --git a/message-center-ui/src/styles/element-tabs.scss b/message-center-ui/src/styles/element-tabs.scss
new file mode 100644
index 0000000..26321fb
--- /dev/null
+++ b/message-center-ui/src/styles/element-tabs.scss
@@ -0,0 +1,25 @@
+.el-tabs--card{
+ .el-tabs__header{
+ .el-tabs__nav-scroll{
+ padding-left: 3px;
+ padding-bottom: 10px;
+ border-bottom: 1px solid #018ad2;
+ .el-tabs__nav {
+ border: none;
+ }
+ .el-tabs__item {
+ border: 1px solid #dfe4ed;
+ margin-right: 12px;
+ margin-left: 2px;
+ }
+ .el-tabs__item:first-child {
+ border-left: 1px solid #dfe4ed;
+ }
+ .el-tabs__item.is-active{
+ border-bottom-color: #018ad2;
+ background-color: #018ad2;
+ color: #fff;
+ }
+ }
+ }
+}
diff --git a/message-center-ui/src/styles/element-ui.scss b/message-center-ui/src/styles/element-ui.scss
new file mode 100644
index 0000000..50c4dc3
--- /dev/null
+++ b/message-center-ui/src/styles/element-ui.scss
@@ -0,0 +1,62 @@
+.el-image .el-image__inner--center{
+ top: 0;
+ left: 0;
+ transform: none;
+}
+
+.tablerow-click{
+ color: #007FFF;
+ cursor: pointer;
+}
+// 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;
+}
+
+
+// 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
+ }
+}
+
+// to fix el-date-picker css style
+.el-range-separator {
+ box-sizing: content-box;
+}
+
+
+
diff --git a/message-center-ui/src/styles/element-variables.scss b/message-center-ui/src/styles/element-variables.scss
new file mode 100644
index 0000000..3f304ba
--- /dev/null
+++ b/message-center-ui/src/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: #018ad2;
+$--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/message-center-ui/src/styles/index.scss b/message-center-ui/src/styles/index.scss
new file mode 100644
index 0000000..62ef8a3
--- /dev/null
+++ b/message-center-ui/src/styles/index.scss
@@ -0,0 +1,102 @@
+@import './variables.scss';
+@import './mixin.scss';
+@import './transition.scss';
+@import './element-ui.scss';
+@import './sidebar.scss';
+@import './table.scss';
+@import './e-table.scss';
+@import './element-table.scss';
+@import './element-tabs.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;
+}
+
+a:focus,
+a:active {
+ outline: none;
+}
+
+a,
+a:focus,
+a:hover {
+ cursor: pointer;
+ color: inherit;
+ text-decoration: none;
+}
+
+div:focus {
+ outline: none;
+}
+
+.clearfix {
+ &:after {
+ visibility: hidden;
+ display: block;
+ font-size: 0;
+ content: " ";
+ clear: both;
+ height: 0;
+ }
+}
+.bg-primary{
+ background-color: $color-primary !important;
+}
+// main-container global css
+.container{
+ min-height: 100%;
+ height: 100%;
+ background-color: #FFFFFF;
+ box-sizing: border-box;
+ padding: 10px 0;
+}
+
+.fl{
+ float: left;
+}
+.fr{
+ float: right;
+}
+.text-center{
+ text-align: center;
+}
+.color-red{
+ color: red !important;
+}
+
+.pd-b10{
+ padding-bottom: 10px;
+}
+
+.pd-y40{
+ padding: 40px 0;
+}
+.pd-y20{
+ padding: 20px 0;
+}
+
+.fs20{
+ font-size: 20px;
+}
diff --git a/message-center-ui/src/styles/mixin.scss b/message-center-ui/src/styles/mixin.scss
new file mode 100644
index 0000000..36b74bb
--- /dev/null
+++ b/message-center-ui/src/styles/mixin.scss
@@ -0,0 +1,28 @@
+@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%;
+}
diff --git a/message-center-ui/src/styles/sidebar.scss b/message-center-ui/src/styles/sidebar.scss
new file mode 100644
index 0000000..cde93c5
--- /dev/null
+++ b/message-center-ui/src/styles/sidebar.scss
@@ -0,0 +1,261 @@
+#app {
+ background-color: #f7f9fc;
+
+ .main-container {
+ height: 100vh;
+ transition: margin-left .28s;
+ padding-left: $sideBarWidth;
+ padding-top: 60px;
+ position: relative;
+ overflow: hidden;
+ }
+ .TagsView{
+ height: 40px;
+ }
+ .home-box{
+ position: fixed;
+ top: 60px;
+ left: 0;
+ background-color: $menuBg;
+ border: 1px solid $menuHover;
+ line-height: 40px;
+ width: 210px;
+ z-index: 1000;
+ a{
+ display: inline-block;
+ line-height: 40px;
+ box-sizing: border-box;
+ width: 50%;
+ text-align: center;
+ font-size: 16px;
+ font-weight: 500;
+ color: #FFFFFF;
+ }
+ a:last-child{
+ border:0;
+ background-color: $menuHover;
+ }
+ }
+ .sidebar-container {
+ transition: width 0.28s;
+ width: $sideBarWidth !important;
+ background-color: $menuBg;
+ height: calc(100% - 60px) ;
+ position: absolute;
+ font-size: 0px;
+ top: 60px;
+ bottom: 0;
+ left: 0;
+ z-index: 8;
+ overflow: hidden;
+ padding-top: 40px;
+
+ // 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;
+ }
+
+ .sub-el-icon {
+ margin-right: 12px;
+ margin-left: -2px;
+ }
+
+ .el-menu {
+ border: none;
+ height: 100%;
+ width: 100% !important;
+ }
+
+ // menu hover
+ .submenu-title-noDropdown,
+ .el-submenu__title {
+ &:hover {
+ background-color: $menuHover !important;
+ }
+ }
+ .el-submenu__title i{
+ color: #FFFFFF;
+ }
+ .is-active>.el-submenu__title {
+ color: $subMenuActiveText !important;
+ }
+
+ & .nest-menu .el-submenu>.el-submenu__title,
+ & .el-submenu .el-menu-item {
+ min-width: $sideBarWidth !important;
+ background-color: $subMenuBg !important;
+
+ &:hover {
+ background-color: $subMenuHover !important;
+ }
+ }
+ & .el-menu-item.is-active {
+ background-color: $subMenuHover !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;
+ // }
+
+ // .sub-el-icon {
+ // margin-left: 19px;
+ // }
+ // }
+ // }
+
+ // .el-submenu {
+ // overflow: hidden;
+
+ // &>.el-submenu__title {
+ // padding: 0 !important;
+
+ // .svg-icon {
+ // margin-left: 20px;
+ // }
+
+ // .sub-el-icon {
+ // margin-left: 19px;
+ // }
+
+ // .el-submenu__icon-arrow {
+ // display: none;
+ // }
+ // }
+ // }
+
+ // .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: $sideBarWidth !important;
+ }
+
+ // mobile responsive
+ .mobile {
+ .main-container {
+ margin-left: 0px;
+ }
+
+ .sidebar-container {
+ transition: transform .28s;
+ width: $sideBarWidth !important;
+ }
+
+ &.hideSidebar {
+ .sidebar-container {
+ pointer-events: none;
+ transition-duration: 0.3s;
+ transform: translate3d(-$sideBarWidth, 0, 0);
+ }
+ }
+ }
+
+ .withoutAnimation {
+
+ .main-container,
+ .sidebar-container {
+ transition: none;
+ }
+ }
+}
+
+// when menu collapsed
+.el-menu--vertical {
+ &>.el-menu {
+ .svg-icon {
+ margin-right: 16px;
+ }
+ .sub-el-icon {
+ margin-right: 12px;
+ margin-left: -2px;
+ }
+ }
+
+ .nest-menu .el-submenu>.el-submenu__title,
+ .el-menu-item {
+ &:hover {
+ // you can use $subMenuHover
+ background-color: $menuHover !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/message-center-ui/src/styles/table.scss b/message-center-ui/src/styles/table.scss
new file mode 100644
index 0000000..08e9142
--- /dev/null
+++ b/message-center-ui/src/styles/table.scss
@@ -0,0 +1,48 @@
+.container{
+ /* 头 */
+ .el-table thead{
+ color: $text-color;
+ }
+ .el-table .cell{
+ a{
+ display: block;
+ color: $table-a-color;
+ }
+ .el-button--text{
+ color: $table-a-color;
+ }
+ }
+ .el-table td, .el-table th{
+ padding: 8px 0;
+ }
+ .el-table.is-group th{
+ background-color: $table-bg-color;
+ }
+ .el-table--enable-row-hover .el-table__body tr:hover>td {
+ background-color: $table-bg-color !important;
+ }
+ .el-table--border td, .el-table--border th, .el-table__body-wrapper .el-table--border.is-scrolling-left~.el-table__fixed {
+ border-right: 1px solid $table-border-color;
+ }
+ .el-table td, .el-table th.is-leaf{
+ border-bottom: 1px solid $table-border-color;
+ }
+ .table-fixed {
+ .el-table__fixed-right {
+ height: 100% !important; //设置高优先,以覆盖内联样式
+ }
+ }
+}
+
+.children-box {
+ padding: 10px;
+ .table-header {
+ padding: 0 20px 5px 20px;
+ border-bottom: 2px solid $border-color;
+ .el-page-header {
+ line-height: 40px;
+ font-weight: 500;
+
+ }
+ }
+}
diff --git a/message-center-ui/src/styles/transition.scss b/message-center-ui/src/styles/transition.scss
new file mode 100644
index 0000000..4cb27cc
--- /dev/null
+++ b/message-center-ui/src/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/message-center-ui/src/styles/variables.scss b/message-center-ui/src/styles/variables.scss
new file mode 100644
index 0000000..9ff78c5
--- /dev/null
+++ b/message-center-ui/src/styles/variables.scss
@@ -0,0 +1,52 @@
+// 行为色
+$color-primary: #018ad2;
+$color-success: #4cd964;
+$color-warning: #f0ad4e;
+$color-error: #dd524d;
+// header
+$header-bg:#0294d7;
+// sidebar
+$menuText: rgba($color: #FFFFFF, $alpha: 0.9);
+$menuActiveText:#ffffff;
+$subMenuActiveText:#ffffff; //https://github.com/ElemeFE/element/issues/12951
+
+$menuBg:#0294d7;
+$menuHover:#087dba;
+
+$subMenuBg:#0294d7;
+$subMenuHover:#087dba;
+
+$sideBarWidth: 210px;
+
+/* 表格的相关样式 */
+$search-bg:#edf1f7; // 表格搜索景色
+$table-bg-color:#edf1f7; // 表格背景
+$table-border-color:#e0e3eb; // 表格边框色
+// 文字
+$table-a-color:#018ad2;
+/* 表格的相关样式 */
+
+/* 边框颜色 */
+$border-color:#018ad2;
+/* 文字基本颜色 */
+$text-color:#333;//基本色
+$text-color-inverse:#fff;//反色
+$text-color-grey:#999;//辅助灰色,如加载更多的提示信息
+$text-color-placeholder: #808080;
+$text-color-disable:#c0c0c0;
+$text-red: #d00000;
+
+$a-color:#018ad2;
+
+// the :export directive is the magic sauce for webpack
+// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
+:export {
+ menuText: $menuText;
+ menuActiveText: $menuActiveText;
+ subMenuActiveText: $subMenuActiveText;
+ menuBg: $menuBg;
+ menuHover: $menuHover;
+ subMenuBg: $subMenuBg;
+ subMenuHover: $subMenuHover;
+ sideBarWidth: $sideBarWidth;
+}
diff --git a/message-center-ui/src/utils/auth.js b/message-center-ui/src/utils/auth.js
new file mode 100644
index 0000000..ce3d01f
--- /dev/null
+++ b/message-center-ui/src/utils/auth.js
@@ -0,0 +1,28 @@
+import Cookies from 'js-cookie'
+
+const TokenKey = 'token'
+const sessionKey = 'token'
+
+export function getToken() {
+ return Cookies.get(TokenKey)
+}
+
+export function setToken(token) {
+ return Cookies.set(TokenKey, token,{ expires: 7, path: '/' })
+}
+
+export function removeToken() {
+ return Cookies.remove(TokenKey)
+}
+
+export function getStorage() {
+ return sessionStorage.getItem('token')
+}
+
+export function setStorage(session) {
+ return sessionStorage.setItem('token', session)
+}
+
+export function removeStorage() {
+ return sessionStorage.removeItem('token')
+}
diff --git a/message-center-ui/src/utils/errorCode.js b/message-center-ui/src/utils/errorCode.js
new file mode 100644
index 0000000..d2111ee
--- /dev/null
+++ b/message-center-ui/src/utils/errorCode.js
@@ -0,0 +1,6 @@
+export default {
+ '401': '认证失败,无法访问系统资源',
+ '403': '当前操作没有权限',
+ '404': '访问资源不存在',
+ 'default': '系统未知错误,请反馈给管理员'
+}
diff --git a/message-center-ui/src/utils/generator/config.js b/message-center-ui/src/utils/generator/config.js
new file mode 100644
index 0000000..7abf227
--- /dev/null
+++ b/message-center-ui/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/message-center-ui/src/utils/generator/css.js b/message-center-ui/src/utils/generator/css.js
new file mode 100644
index 0000000..c1c62e6
--- /dev/null
+++ b/message-center-ui/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/message-center-ui/src/utils/generator/drawingDefalut.js b/message-center-ui/src/utils/generator/drawingDefalut.js
new file mode 100644
index 0000000..09f133c
--- /dev/null
+++ b/message-center-ui/src/utils/generator/drawingDefalut.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/message-center-ui/src/utils/generator/html.js b/message-center-ui/src/utils/generator/html.js
new file mode 100644
index 0000000..ebf628d
--- /dev/null
+++ b/message-center-ui/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/message-center-ui/src/utils/generator/icon.json b/message-center-ui/src/utils/generator/icon.json
new file mode 100644
index 0000000..2d9999a
--- /dev/null
+++ b/message-center-ui/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/message-center-ui/src/utils/generator/js.js b/message-center-ui/src/utils/generator/js.js
new file mode 100644
index 0000000..c6c06a9
--- /dev/null
+++ b/message-center-ui/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)
+ },`,
+ handelConfirm: `handelConfirm() {
+ 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/message-center-ui/src/utils/generator/render.js b/message-center-ui/src/utils/generator/render.js
new file mode 100644
index 0000000..e8640f0
--- /dev/null
+++ b/message-center-ui/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/message-center-ui/src/utils/get-page-title.js b/message-center-ui/src/utils/get-page-title.js
new file mode 100644
index 0000000..a6de99d
--- /dev/null
+++ b/message-center-ui/src/utils/get-page-title.js
@@ -0,0 +1,10 @@
+import defaultSettings from '@/settings'
+
+const title = defaultSettings.title || 'Vue Admin Template'
+
+export default function getPageTitle(pageTitle) {
+ if (pageTitle) {
+ return `${pageTitle} - ${title}`
+ }
+ return `${title}`
+}
diff --git a/message-center-ui/src/utils/index.js b/message-center-ui/src/utils/index.js
new file mode 100644
index 0000000..4830c04
--- /dev/null
+++ b/message-center-ui/src/utils/index.js
@@ -0,0 +1,117 @@
+/**
+ * Created by PanJiaChen on 16/11/18.
+ */
+
+/**
+ * Parse the time to string
+ * @param {(Object|string|number)} time
+ * @param {string} cFormat
+ * @returns {string | null}
+ */
+export function parseTime(time, cFormat) {
+ if (arguments.length === 0 || !time) {
+ return null
+ }
+ const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
+ let date
+ if (typeof time === 'object') {
+ date = time
+ } else {
+ if ((typeof time === 'string')) {
+ if ((/^[0-9]+$/.test(time))) {
+ // support "1548221490638"
+ time = parseInt(time)
+ } else {
+ // support safari
+ // https://stackoverflow.com/questions/4310953/invalid-date-in-safari
+ time = time.replace(new RegExp(/-/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(/{([ymdhisa])+}/g, (result, key) => {
+ const value = formatObj[key]
+ // Note: getDay() returns 0 on Sunday
+ if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] }
+ return value.toString().padStart(2, '0')
+ })
+ return time_str
+}
+
+/**
+ * @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 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
+}
diff --git a/message-center-ui/src/utils/jsencrypt.js b/message-center-ui/src/utils/jsencrypt.js
new file mode 100644
index 0000000..78d9523
--- /dev/null
+++ b/message-center-ui/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/message-center-ui/src/utils/permission.js b/message-center-ui/src/utils/permission.js
new file mode 100644
index 0000000..1730e33
--- /dev/null
+++ b/message-center-ui/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/message-center-ui/src/utils/print.js b/message-center-ui/src/utils/print.js
new file mode 100644
index 0000000..799a333
--- /dev/null
+++ b/message-center-ui/src/utils/print.js
@@ -0,0 +1,123 @@
+// 打印类属性、方法定义
+/* eslint-disable */
+const Print =function(dom, options) {
+ if (!(this instanceof Print)) return new Print(dom, options);
+
+ this.options = this.extend({
+ 'noPrint': '.no-print'
+ }, options);
+
+ if ((typeof dom) === "string") {
+ this.dom = document.querySelector(dom);
+ } else {
+ this.dom = dom;
+ }
+
+ this.init();
+};
+Print.prototype = {
+ init: function () {
+ var content = this.getStyle() + this.getHtml();
+ this.writeIframe(content);
+ },
+ extend: function (obj, obj2) {
+ for (var k in obj2) {
+ obj[k] = obj2[k];
+ }
+ return obj;
+ },
+
+ getStyle: function () {
+ var str = "",
+ styles = document.querySelectorAll('style,link');
+ for (var i = 0; i < styles.length; i++) {
+ str += styles[i].outerHTML;
+ }
+ str += "";
+
+ return str;
+ },
+
+ getHtml: function () {
+ var inputs = document.querySelectorAll('input');
+ var textareas = document.querySelectorAll('textarea');
+ var selects = document.querySelectorAll('select');
+
+ for (var k in inputs) {
+ if (inputs[k].type == "checkbox" || inputs[k].type == "radio") {
+ if (inputs[k].checked == true) {
+ inputs[k].setAttribute('checked', "checked")
+ } else {
+ inputs[k].removeAttribute('checked')
+ }
+ } else if (inputs[k].type == "text") {
+ inputs[k].setAttribute('value', inputs[k].value)
+ }
+ }
+
+ for (var k2 in textareas) {
+ if (textareas[k2].type == 'textarea') {
+ textareas[k2].innerHTML = textareas[k2].value
+ }
+ }
+
+ for (var k3 in selects) {
+ if (selects[k3].type == 'select-one') {
+ var child = selects[k3].children;
+ for (var i in child) {
+ if (child[i].tagName == 'OPTION') {
+ if (child[i].selected == true) {
+ child[i].setAttribute('selected', "selected")
+ } else {
+ child[i].removeAttribute('selected')
+ }
+ }
+ }
+ }
+ }
+
+ return this.dom.outerHTML;
+ },
+
+ writeIframe: function (content) {
+ var w, doc, iframe = document.createElement('iframe'),
+ f = document.body.appendChild(iframe);
+ iframe.id = "myIframe";
+ iframe.style = "position:absolute;width:0;height:0;top:-10px;left:-10px;";
+
+ w = f.contentWindow || f.contentDocument;
+ doc = f.contentDocument || f.contentWindow.document;
+ doc.open();
+ doc.write(content);
+ doc.close();
+ this.toPrint(w);
+
+ setTimeout(function () {
+ document.body.removeChild(iframe)
+ }, 100)
+ },
+
+ toPrint: function (frameWindow) {
+ try {
+ setTimeout(function () {
+ frameWindow.focus();
+ try {
+ if (!frameWindow.document.execCommand('print', false, null)) {
+ frameWindow.print();
+ }
+ } catch (e) {
+ frameWindow.print();
+ }
+ frameWindow.close();
+ }, 10);
+ } catch (err) {
+ console.log('err', err);
+ }
+ }
+};
+const MyPlugin = {}
+MyPlugin.install = function (Vue, options) {
+ // 4. 添加实例方法
+ Vue.prototype.$print = Print
+}
+export default MyPlugin
\ No newline at end of file
diff --git a/message-center-ui/src/utils/request.js b/message-center-ui/src/utils/request.js
new file mode 100644
index 0000000..7df9605
--- /dev/null
+++ b/message-center-ui/src/utils/request.js
@@ -0,0 +1,61 @@
+import axios from 'axios'
+import { MessageBox, Message } from 'element-ui'
+import store from '@/store'
+import {getToken, getStorage, setStorage} from '@/utils/auth'
+
+// create an axios instance
+const service = axios.create({
+ baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
+ headers:{'Content-Type':'application/x-www-form-urlencoded;'}
+})
+
+// request interceptor
+service.interceptors.request.use(
+ config => {
+ config.params = {
+ ...config.params,
+ _t: Date.parse(new Date()) / 1000
+ }
+ //setStorage('eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTm8iOiIwZDhkODExOS1kNDc2LTQ3Y2UtODljMi0wNzVjZDgwOWRkYTYiLCJpc3MiOiJXQksiLCJleHAiOjE2MzcxOTY5Mzd9.Y2DCgGIx_tiDAplY0oZDkZWfdh3m_WovjtmXQA-dUVs');
+ if (getStorage()) {
+ config.headers['token'] = getStorage()
+ }
+ return config
+ },
+ error => {
+ return Promise.reject(error)
+ }
+)
+// response interceptor
+service.interceptors.response.use(
+
+ response => {
+ const res = response.data
+
+ // if the custom code is not 20000, it is judged as an error.
+ if (res.code != 200) {
+ if (res.msg == "请重新登录") {
+ // window.location.href = 'http://39.104.100.138:8082/'
+ } else {
+ Message({
+ message: res.msg || 'Error',
+ type: 'error',
+ duration: 5 * 1000
+ })
+ }
+ return Promise.reject(new Error(res.message || 'Error'))
+ } else {
+ return res
+ }
+ },
+ error => {
+ Message({
+ message: error.message,
+ type: 'error',
+ duration: 5 * 1000
+ })
+ return Promise.reject(error)
+ }
+)
+
+export default service
diff --git a/message-center-ui/src/utils/roles.js b/message-center-ui/src/utils/roles.js
new file mode 100644
index 0000000..07a6557
--- /dev/null
+++ b/message-center-ui/src/utils/roles.js
@@ -0,0 +1,98 @@
+/**
+ * 表单校验规则
+ * 不符合规则时,返回错误文案
+ * 符合规则时,返回false
+ */
+
+var rules = {}
+
+// 是否必填
+rules.required = function (value) {
+ return (!!value || value === 0) ? false : "请输入内容"
+};
+
+// 最大字符长度
+rules.maxLength = function (value, size) {
+ var size = size || 256;
+ return String(value).length <= size ? false : ("最大不超过" + size + "个字符")
+}
+
+// 只允许字母和数字
+rules.onlyAlphabetic = function (value) {
+ var reg = /^[0-9a-zA-Z]+$/;
+ return reg.test(value) ? false : "只能输入字母和数字"
+}
+
+// 只允许字母数字和下划线
+rules.onlyAlphabeticUnderline = function (value) {
+ var reg = /^[0-9a-zA-Z_]+$/;
+ return reg.test(value) ? false : "只能输入字母、数字或下划线"
+}
+
+// 只允许数字
+rules.onlyNumber = function (value) {
+ var reg = /^[0-9]+$/;
+ return reg.test(value) ? false : "只能输入数字"
+}
+
+// 只允许字母
+rules.onlyLetter = function (value) {
+ var reg = /^[a-zA-Z]+$/;
+ return reg.test(value) ? false : "只能输入字母"
+}
+
+// 特殊字符
+rules.noSpecial = function (value) {
+ var regEn = /[`~!@#$%^&*()_+<>?:"{},.\/;'[\]]/im,
+ regCn = /[·!#¥(——):;“”‘、,|《。》?、【】[\]]/im;
+ return regEn.test(value) || regCn.test(value) ? false : "不能输入特殊字符"
+}
+
+// 邮箱
+rules.email = function (value) {
+ var reg = /^[a-zA-Z0-9_-]+@([a-zA-Z0-9]+\.)+(com|cn|net|org)$/;
+ return reg.test(value) ? false : "邮箱格式错误"
+}
+
+// 手机号(以1开头的11位数字)
+rules.phone = function (value) {
+ var reg = /^[1][3,4,5,7,8][0-9]{9}$/;
+ return reg.test(value) ? false : "手机格式错误"
+}
+
+// 只允许汉字
+rules.chinese = function (value) {
+ var reg = /^[\u4e00-\u9fa5]+$/;
+ return reg.test(value) ? false : "只能输入汉字"
+}
+
+// 密码格式校验
+rules.password = function (value) {
+ if (String(value).length < 6) {
+ return "密码长度不小于6位"
+ }
+ if (String(value).length > 18) {
+ return "密码长度不超过18位"
+ }
+ var level = 0;
+ if (value.search(/[a-z]/) > -1) {
+ level++; //密码中包含小写字母
+ }
+ if (value.search(/[A-Z]/) > -1) {
+ level++; //密码中包含大写字母
+ }
+ if (value.search(/[0-9]/) > -1) {
+ level++; //密码中包含数组
+ }
+ if (value.search(/[`~!@#$%^&*()_+<>?:"{},.\/;'[\]]/im) > -1) {
+ level++; //密码中包含特殊符号
+ }
+ if(level<2){
+ return "密码至少包含大写字母、小写字母、数字、标点符号中的两种"
+ }else{
+ return level; // 当前密码强度为level(2/3/4)
+ }
+}
+
+
+export default rules;
\ No newline at end of file
diff --git a/message-center-ui/src/utils/ruoyi.js b/message-center-ui/src/utils/ruoyi.js
new file mode 100644
index 0000000..5669a43
--- /dev/null
+++ b/message-center-ui/src/utils/ruoyi.js
@@ -0,0 +1,190 @@
+/**
+ * 通用js方法封装处理
+ * Copyright (c) 2019 ruoyi
+ */
+
+const baseURL = process.env.VUE_APP_BASE_API
+
+// 日期格式化
+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 selectDictLabel(datas, value) {
+ var actions = [];
+ Object.keys(datas).some((key) => {
+ if (datas[key].value == ('' + value)) {
+ actions.push(datas[key].label);
+ return true;
+ }
+ })
+ return actions.join('');
+}
+
+// 回显数据字典(字符串数组)
+export function selectDictLabels(datas, value, separator) {
+ var actions = [];
+ var currentSeparator = undefined === separator ? "," : separator;
+ var temp = value.split(currentSeparator);
+ Object.keys(value.split(currentSeparator)).some((val) => {
+ Object.keys(datas).some((key) => {
+ if (datas[key].dictValue == ('' + temp[val])) {
+ actions.push(datas[key].dictLabel + currentSeparator);
+ }
+ })
+ })
+ return actions.join('').substring(0, actions.join('').length - 1);
+}
+
+// 通用下载方法
+export function download(fileName) {
+ window.location.href = baseURL + "/common/download?fileName=" + encodeURI(fileName) + "&delete=" + true;
+}
+
+// 字符串格式化(%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 praseStrEmpty(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;
+}
diff --git a/message-center-ui/src/utils/scroll-to.js b/message-center-ui/src/utils/scroll-to.js
new file mode 100644
index 0000000..c5d8e04
--- /dev/null
+++ b/message-center-ui/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/message-center-ui/src/utils/validate.js b/message-center-ui/src/utils/validate.js
new file mode 100644
index 0000000..8d962ad
--- /dev/null
+++ b/message-center-ui/src/utils/validate.js
@@ -0,0 +1,20 @@
+/**
+ * Created by PanJiaChen on 16/11/18.
+ */
+
+/**
+ * @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
+}
diff --git a/message-center-ui/src/utils/zipdownload.js b/message-center-ui/src/utils/zipdownload.js
new file mode 100644
index 0000000..52afcc6
--- /dev/null
+++ b/message-center-ui/src/utils/zipdownload.js
@@ -0,0 +1,42 @@
+import axios from 'axios'
+import { getToken } from '@/utils/auth'
+
+const mimeMap = {
+ xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+ zip: 'application/zip'
+}
+
+const baseUrl = process.env.VUE_APP_BASE_API
+export function downLoadZip(str, filename) {
+ var url = baseUrl + str
+ axios({
+ method: 'get',
+ url: url,
+ responseType: 'blob',
+ headers: { 'Authorization': 'Bearer ' + getToken() }
+ }).then(res => {
+ resolveBlob(res, mimeMap.zip)
+ })
+}
+/**
+ * 解析blob响应内容并下载
+ * @param {*} res blob响应内容
+ * @param {String} mimeType MIME类型
+ */
+export function resolveBlob(res, mimeType) {
+ const aLink = document.createElement('a')
+ var blob = new Blob([res.data], { type: mimeType })
+ // //从response的headers中获取filename, 后端response.setHeader("Content-disposition", "attachment; filename=xxxx.docx") 设置的文件名;
+ var patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*')
+ var contentDisposition = decodeURI(res.headers['content-disposition'])
+ var result = patt.exec(contentDisposition)
+ var fileName = result[1]
+ fileName = fileName.replace(/\"/g, '')
+ aLink.style.display = 'none'
+ aLink.href = URL.createObjectURL(blob)
+ aLink.setAttribute('download', fileName) // 设置下载文件名称
+ document.body.appendChild(aLink)
+ aLink.click()
+ URL.revokeObjectURL(aLink.href);//清除引用
+ document.body.removeChild(aLink);
+}
diff --git a/message-center-ui/src/views/anruimessagecenter/message/editdialog.vue b/message-center-ui/src/views/anruimessagecenter/message/editdialog.vue
new file mode 100644
index 0000000..d7ae604
--- /dev/null
+++ b/message-center-ui/src/views/anruimessagecenter/message/editdialog.vue
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/anruimessagecenter/message/index.vue b/message-center-ui/src/views/anruimessagecenter/message/index.vue
new file mode 100644
index 0000000..0ed47c1
--- /dev/null
+++ b/message-center-ui/src/views/anruimessagecenter/message/index.vue
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+ 新增
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/anruimessagecenter/message/infodrawer.vue b/message-center-ui/src/views/anruimessagecenter/message/infodrawer.vue
new file mode 100644
index 0000000..c6e1f66
--- /dev/null
+++ b/message-center-ui/src/views/anruimessagecenter/message/infodrawer.vue
@@ -0,0 +1,59 @@
+
+
+
+
+ {{ formobj.msgTypeKey }}
+ {{ formobj.msgType }}
+ {{ formobj.msgTitle }}
+ {{ formobj.msgContent }}
+ {{ formobj.msgSource }}
+ {{ formobj.senderSid }}
+ {{ formobj.senderName }}
+ {{ formobj.senderDeptSid }}
+ {{ formobj.senderDeptName }}
+ {{ formobj.businessSid }}
+ {{ formobj.moduleSid }}
+ {{ formobj.moduleAction }}
+ {{ formobj.args_json }}
+ {{ formobj.h5_url }}
+ {{ formobj.xcx_url }}
+ {{ formobj.msgTargetUri }}
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/anruimessagecenter/message/tablepagging.vue b/message-center-ui/src/views/anruimessagecenter/message/tablepagging.vue
new file mode 100644
index 0000000..3750d00
--- /dev/null
+++ b/message-center-ui/src/views/anruimessagecenter/message/tablepagging.vue
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+ 删除
+ 详情
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/anruimessagecenter/messagefile/editdialog.vue b/message-center-ui/src/views/anruimessagecenter/messagefile/editdialog.vue
new file mode 100644
index 0000000..66f63eb
--- /dev/null
+++ b/message-center-ui/src/views/anruimessagecenter/messagefile/editdialog.vue
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/anruimessagecenter/messagefile/index.vue b/message-center-ui/src/views/anruimessagecenter/messagefile/index.vue
new file mode 100644
index 0000000..fc48e01
--- /dev/null
+++ b/message-center-ui/src/views/anruimessagecenter/messagefile/index.vue
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+ 新增
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/anruimessagecenter/messagefile/infodrawer.vue b/message-center-ui/src/views/anruimessagecenter/messagefile/infodrawer.vue
new file mode 100644
index 0000000..2e28e18
--- /dev/null
+++ b/message-center-ui/src/views/anruimessagecenter/messagefile/infodrawer.vue
@@ -0,0 +1,39 @@
+
+
+
+
+ {{ formobj.msgSid }}
+ {{ formobj.fileName }}
+ {{ formobj.fileType }}
+ {{ formobj.filePath }}
+ {{ formobj.attachType }}
+ {{ formobj.fileSize }}
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/anruimessagecenter/messagefile/tablepagging.vue b/message-center-ui/src/views/anruimessagecenter/messagefile/tablepagging.vue
new file mode 100644
index 0000000..f1936bb
--- /dev/null
+++ b/message-center-ui/src/views/anruimessagecenter/messagefile/tablepagging.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+ 删除
+ 详情
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/anruimessagecenter/messageforwardlist/editdialog.vue b/message-center-ui/src/views/anruimessagecenter/messageforwardlist/editdialog.vue
new file mode 100644
index 0000000..4d770b3
--- /dev/null
+++ b/message-center-ui/src/views/anruimessagecenter/messageforwardlist/editdialog.vue
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/anruimessagecenter/messageforwardlist/index.vue b/message-center-ui/src/views/anruimessagecenter/messageforwardlist/index.vue
new file mode 100644
index 0000000..4027581
--- /dev/null
+++ b/message-center-ui/src/views/anruimessagecenter/messageforwardlist/index.vue
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+ 新增
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/anruimessagecenter/messageforwardlist/infodrawer.vue b/message-center-ui/src/views/anruimessagecenter/messageforwardlist/infodrawer.vue
new file mode 100644
index 0000000..683625f
--- /dev/null
+++ b/message-center-ui/src/views/anruimessagecenter/messageforwardlist/infodrawer.vue
@@ -0,0 +1,35 @@
+
+
+
+
+ {{ formobj.msgSid }}
+ {{ formobj.forwardTime }}
+ {{ formobj.forwardPerson }}
+ {{ formobj.forwordMsgSid }}
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/anruimessagecenter/messageforwardlist/tablepagging.vue b/message-center-ui/src/views/anruimessagecenter/messageforwardlist/tablepagging.vue
new file mode 100644
index 0000000..3e373b0
--- /dev/null
+++ b/message-center-ui/src/views/anruimessagecenter/messageforwardlist/tablepagging.vue
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+ 删除
+ 详情
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/anruimessagecenter/messagelist/editdialog.vue b/message-center-ui/src/views/anruimessagecenter/messagelist/editdialog.vue
new file mode 100644
index 0000000..057b7e0
--- /dev/null
+++ b/message-center-ui/src/views/anruimessagecenter/messagelist/editdialog.vue
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/anruimessagecenter/messagelist/index.vue b/message-center-ui/src/views/anruimessagecenter/messagelist/index.vue
new file mode 100644
index 0000000..708b9ff
--- /dev/null
+++ b/message-center-ui/src/views/anruimessagecenter/messagelist/index.vue
@@ -0,0 +1,426 @@
+
+
+
+
+
+ 删除
+ 转发
+ 全部标记为已读
+ 标记为已读
+
+
+ {{ noReadbtnName }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 至
+
+
+
+
+
+
+
+
+
+
+
+ 删除
+ 转发
+ 标记为未读
+
+
+ {{ btnName }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 至
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/anruimessagecenter/messagelist/infodrawer.vue b/message-center-ui/src/views/anruimessagecenter/messagelist/infodrawer.vue
new file mode 100644
index 0000000..204c98f
--- /dev/null
+++ b/message-center-ui/src/views/anruimessagecenter/messagelist/infodrawer.vue
@@ -0,0 +1,112 @@
+
+
+
+
消息详情
+
+ 办理
+ 回复
+ 转发
+ 删除
+ 标记为未读
+ 标记为已读
+ 关闭
+
+
+
+
+
+
+ {{ orgInfo.msgTitle }}
+
+
+ 发送人:{{ orgInfo.senderName }}
+
+
+ 时间:{{ orgInfo.createTime }}
+
+
+ 消息类型:{{ orgInfo.msgType}}
+
+
+ 消息来源:{{ orgInfo.msgSource }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/anruimessagecenter/messagelist/tablepagging.vue b/message-center-ui/src/views/anruimessagecenter/messagelist/tablepagging.vue
new file mode 100644
index 0000000..ffdfee2
--- /dev/null
+++ b/message-center-ui/src/views/anruimessagecenter/messagelist/tablepagging.vue
@@ -0,0 +1,107 @@
+
+
+
+
{{ this.page.params.type==0?'未读消息列表':'已读消息列表' }}
+
+
+
+
+
+
+
+
+ {{scope.row.msgTitle}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/anruimessagecenter/messageremindrule/editdialog.vue b/message-center-ui/src/views/anruimessagecenter/messageremindrule/editdialog.vue
new file mode 100644
index 0000000..f29246e
--- /dev/null
+++ b/message-center-ui/src/views/anruimessagecenter/messageremindrule/editdialog.vue
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/anruimessagecenter/messageremindrule/index.vue b/message-center-ui/src/views/anruimessagecenter/messageremindrule/index.vue
new file mode 100644
index 0000000..314586b
--- /dev/null
+++ b/message-center-ui/src/views/anruimessagecenter/messageremindrule/index.vue
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+ 新增
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/anruimessagecenter/messageremindrule/infodrawer.vue b/message-center-ui/src/views/anruimessagecenter/messageremindrule/infodrawer.vue
new file mode 100644
index 0000000..6facf6f
--- /dev/null
+++ b/message-center-ui/src/views/anruimessagecenter/messageremindrule/infodrawer.vue
@@ -0,0 +1,33 @@
+
+
+
+
+ {{ formobj.ruleCode }}
+ {{ formobj.rules }}
+ {{ formobj.remindWay }}
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/anruimessagecenter/messageremindrule/tablepagging.vue b/message-center-ui/src/views/anruimessagecenter/messageremindrule/tablepagging.vue
new file mode 100644
index 0000000..54ca7c6
--- /dev/null
+++ b/message-center-ui/src/views/anruimessagecenter/messageremindrule/tablepagging.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+ 编辑
+ 删除
+ 详情
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/anruimessagecenter/messagereply/editdialog.vue b/message-center-ui/src/views/anruimessagecenter/messagereply/editdialog.vue
new file mode 100644
index 0000000..634d704
--- /dev/null
+++ b/message-center-ui/src/views/anruimessagecenter/messagereply/editdialog.vue
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/anruimessagecenter/messagereply/index.vue b/message-center-ui/src/views/anruimessagecenter/messagereply/index.vue
new file mode 100644
index 0000000..23362e5
--- /dev/null
+++ b/message-center-ui/src/views/anruimessagecenter/messagereply/index.vue
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+ 新增
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/anruimessagecenter/messagereply/infodrawer.vue b/message-center-ui/src/views/anruimessagecenter/messagereply/infodrawer.vue
new file mode 100644
index 0000000..69713f0
--- /dev/null
+++ b/message-center-ui/src/views/anruimessagecenter/messagereply/infodrawer.vue
@@ -0,0 +1,35 @@
+
+
+
+
+ {{ formobj.msgSid }}
+ {{ formobj.replyConent }}
+ {{ formobj.replyPersonName }}
+ {{ formobj.replyUserSid }}
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/anruimessagecenter/messagereply/tablepagging.vue b/message-center-ui/src/views/anruimessagecenter/messagereply/tablepagging.vue
new file mode 100644
index 0000000..d3d1397
--- /dev/null
+++ b/message-center-ui/src/views/anruimessagecenter/messagereply/tablepagging.vue
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+ 删除
+ 详情
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/components/icons/element-icons.js b/message-center-ui/src/views/components/icons/element-icons.js
new file mode 100644
index 0000000..9ea4d63
--- /dev/null
+++ b/message-center-ui/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/message-center-ui/src/views/components/icons/index.vue b/message-center-ui/src/views/components/icons/index.vue
new file mode 100644
index 0000000..d3c9a71
--- /dev/null
+++ b/message-center-ui/src/views/components/icons/index.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+ {{ generateIconCode(item) }}
+
+
+
+ {{ item }}
+
+
+
+
+
+
+
+
+ {{ generateElementIconCode(item) }}
+
+
+
+ {{ item }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/components/icons/svg-icons.js b/message-center-ui/src/views/components/icons/svg-icons.js
new file mode 100644
index 0000000..724cd8e
--- /dev/null
+++ b/message-center-ui/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/message-center-ui/src/views/dashboard/BarChart.vue b/message-center-ui/src/views/dashboard/BarChart.vue
new file mode 100644
index 0000000..be0af34
--- /dev/null
+++ b/message-center-ui/src/views/dashboard/BarChart.vue
@@ -0,0 +1,102 @@
+
+
+
+
+
diff --git a/message-center-ui/src/views/dashboard/LineChart.vue b/message-center-ui/src/views/dashboard/LineChart.vue
new file mode 100644
index 0000000..e654168
--- /dev/null
+++ b/message-center-ui/src/views/dashboard/LineChart.vue
@@ -0,0 +1,135 @@
+
+
+
+
+
diff --git a/message-center-ui/src/views/dashboard/PanelGroup.vue b/message-center-ui/src/views/dashboard/PanelGroup.vue
new file mode 100644
index 0000000..1a1081f
--- /dev/null
+++ b/message-center-ui/src/views/dashboard/PanelGroup.vue
@@ -0,0 +1,181 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/dashboard/PieChart.vue b/message-center-ui/src/views/dashboard/PieChart.vue
new file mode 100644
index 0000000..4d2ef32
--- /dev/null
+++ b/message-center-ui/src/views/dashboard/PieChart.vue
@@ -0,0 +1,79 @@
+
+
+
+
+
diff --git a/message-center-ui/src/views/dashboard/RaddarChart.vue b/message-center-ui/src/views/dashboard/RaddarChart.vue
new file mode 100644
index 0000000..6823af3
--- /dev/null
+++ b/message-center-ui/src/views/dashboard/RaddarChart.vue
@@ -0,0 +1,116 @@
+
+
+
+
+
diff --git a/message-center-ui/src/views/dashboard/mixins/resize.js b/message-center-ui/src/views/dashboard/mixins/resize.js
new file mode 100644
index 0000000..b1e76e9
--- /dev/null
+++ b/message-center-ui/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/message-center-ui/src/views/error/401.vue b/message-center-ui/src/views/error/401.vue
new file mode 100644
index 0000000..448b6ec
--- /dev/null
+++ b/message-center-ui/src/views/error/401.vue
@@ -0,0 +1,88 @@
+
+
+
+ 返回
+
+
+
+
+ 401错误!
+
+ 您没有访问权限!
+ 对不起,您没有访问权限,请不要进行非法操作!您可以返回主页面
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/error/404.vue b/message-center-ui/src/views/error/404.vue
new file mode 100644
index 0000000..73fccfd
--- /dev/null
+++ b/message-center-ui/src/views/error/404.vue
@@ -0,0 +1,233 @@
+
+
+
+
+
+
+ 404错误!
+
+
+ {{ message }}
+
+
+ 对不起,您正在寻找的页面不存在。尝试检查URL的错误,然后按浏览器上的刷新按钮或尝试在我们的应用程序中找到其他内容。
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/index.vue b/message-center-ui/src/views/index.vue
new file mode 100644
index 0000000..5f16e05
--- /dev/null
+++ b/message-center-ui/src/views/index.vue
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/login.vue b/message-center-ui/src/views/login.vue
new file mode 100644
index 0000000..e41341a
--- /dev/null
+++ b/message-center-ui/src/views/login.vue
@@ -0,0 +1,181 @@
+
+
+
+ 后台管理系统
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 记住密码
+
+
+ 登 录
+ 登 录 中...
+
+
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/profile/index.vue b/message-center-ui/src/views/profile/index.vue
new file mode 100644
index 0000000..0285e85
--- /dev/null
+++ b/message-center-ui/src/views/profile/index.vue
@@ -0,0 +1,112 @@
+
+
+
+
+
+ 个人信息
+
+
+
+
+
+ 基本资料
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/profile/resetPwd.vue b/message-center-ui/src/views/profile/resetPwd.vue
new file mode 100644
index 0000000..fa0e248
--- /dev/null
+++ b/message-center-ui/src/views/profile/resetPwd.vue
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+ 保存
+ 关闭
+
+
+
+
+
diff --git a/message-center-ui/src/views/profile/userAvatar.vue b/message-center-ui/src/views/profile/userAvatar.vue
new file mode 100644
index 0000000..044bf5f
--- /dev/null
+++ b/message-center-ui/src/views/profile/userAvatar.vue
@@ -0,0 +1,153 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 选择
+
+
+
+
+
+
+
+
+ 提 交
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/profile/userInfo.vue b/message-center-ui/src/views/profile/userInfo.vue
new file mode 100644
index 0000000..fdcfdf3
--- /dev/null
+++ b/message-center-ui/src/views/profile/userInfo.vue
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 男
+ 女
+
+
+
+
+
+ 保存
+ 关闭
+
+
+
+
+
+
+
diff --git a/message-center-ui/src/views/redirect.vue b/message-center-ui/src/views/redirect.vue
new file mode 100644
index 0000000..db4c1d6
--- /dev/null
+++ b/message-center-ui/src/views/redirect.vue
@@ -0,0 +1,12 @@
+
diff --git a/message-center-ui/vue.config.js b/message-center-ui/vue.config.js
new file mode 100644
index 0000000..2da01a2
--- /dev/null
+++ b/message-center-ui/vue.config.js
@@ -0,0 +1,138 @@
+'use strict'
+const path = require('path')
+const defaultSettings = require('./src/settings.js')
+
+function resolve(dir) {
+ return path.join(__dirname, dir)
+}
+
+const name = defaultSettings.title || '安瑞集团信息化平台' // page title
+
+// 如果端口设置为80,
+// 使用管理员权限执行命令行。
+// 例如,Mac:sudo npm run
+// 可以通过以下方法更改端口:
+// port=9528 npm run dev或npm run dev--port=9528
+const port = process.env.port || process.env.npm_config_port || 9531 // dev port
+
+// 所有配置项说明都可以在中找到https://cli.vuejs.org/config/
+module.exports = {
+ /**
+ *如果计划在子路径下部署站点,则需要设置publicPath,
+ *例如GitHub页面。如果您计划将站点部署到https://foo.github.io/bar/,
+ *然后publicPath应设置为“/bar/”。
+ *在大多数情况下,请使用“/”!!!
+ *详细信息:https://cli.vuejs.org/config/#publicpath
+ */
+ publicPath: process.env.NODE_ENV === 'production' ? '/message/' : '/',
+ outputDir: 'message-ui',
+ assetsDir: 'static',
+ lintOnSave: process.env.NODE_ENV === 'development',
+ productionSourceMap: false,
+ devServer: {
+ hot: true, // 自动保存
+ host: '0.0.0.0',
+ port: port,
+ open: true,
+ overlay: {
+ warnings: false,
+ errors: true
+ },
+ proxy: {
+ '/api': { // 匹配所有以 '/api'开头的请求路径
+ // target: 'http://39.104.100.138:8111', // 代理目标的基础路径
+ // target: 'http://1mn7264414.qicp.vip', // 代理目标的基础路径
+ // target: 'http://4424790b0u.qicp.vip/',
+ //target: 'http://9hmihp.natappfree.cc',
+ target:' http://120.46.131.15:8111',
+ // target: process.env.VUE_APP_URL, // 代理目标的基础路径
+ changeOrigin: true, // 支持跨域
+ pathRewrite: { // 重写路径: 去掉路径中开头的'/api'
+ '^/api': ''
+ }
+ }
+ },
+ disableHostCheck: true
+ },
+ configureWebpack: {
+ // 在webpack的name字段中提供应用程序的标题,以便
+ // 它可以在索引.html插入正确的标题。
+ name: name,
+ resolve: {
+ alias: {
+ '@': resolve('src'),
+ '@C': resolve('src/components')
+ }
+ }
+ },
+ chainWebpack(config) {
+ // 它可以提高第一屏的速度,建议打开预加载
+ config.plugin('preload').tap(() => [{
+ rel: 'preload',
+ // 忽略 runtime.js
+ // https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/cli-service/lib/config/app.js#L171
+ fileBlacklist: [/\.map$/, /hot-update\.js$/, /runtime\..*\.js$/],
+ include: 'initial'
+ }])
+
+ // 当有很多页面时,会导致太多无意义的请求
+ config.plugins.delete('prefetch')
+
+ // set svg-sprite-loader 设置 svg精灵加载程序
+ config.module
+ .rule('svg')
+ .exclude.add(resolve('src/icons'))
+ .end()
+ config.module
+ .rule('icons')
+ .test(/\.svg$/)
+ .include.add(resolve('src/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
+ }
+ }
+ })
+ // https:// webpack.js.org/configuration/optimization/#optimizationruntimechunk
+ config.optimization.runtimeChunk('single')
+ }
+ )
+ }
+}