250716提交

This commit is contained in:
yangxing 2025-07-16 17:52:53 +08:00
commit f8289486d7
1110 changed files with 776511 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
/admin/dist
/admin/package-lock.json
/netcore/src/JT.ShangHui.Web.Entry/wwwroot/uploadfile
/admin/*.lock
/jt_shanghui表结构信息.chw

262
README.md Normal file
View File

@ -0,0 +1,262 @@
### 巨天商会系统
- 使用EFCORE+Furion+NET7
- 依赖redis、rabbitmq
### 数据库
- sql server
- 数据库地址:123.60.2.99
- 数据库端口号:4331
### 服务器
- 系统: windows server
- IP:123.60.2.99
- 远程桌面端口:58339
### 域名
- 接口平台: <https://izzt.jt-sky.com>
- 管理后台(vue静态文件):<https://zzt.jt-sky.com>
### 目录结构
├── admin 管理后台
│   ├── config 插件配置文件
│   ├── docker docker配置参考文件
│   │   └── nginx
│   │   └── vhost
│   ├── public 静态资源
│   │   └── loading
│   │   └── option2
│   ├── src 源码
│   │   ├── api api接口
│   │   │   └── modular
│   │   │   ├── main 业务接口
│   │   │   └── system 系统接口
│   │   ├── assets 静态资源
│   │   │   ├── icons
│   │   │   └── template
│   │   ├── components 自定义组件
│   │   │   ├── ArticleListContent
│   │   │   ├── AvatarList
│   │   │   ├── Charts
│   │   │   ├── CountDown
│   │   │   ├── DepartmentSelect
│   │   │   ├── DescriptionList
│   │   │   ├── Editor
│   │   │   ├── Ellipsis
│   │   │   ├── Exception
│   │   │   ├── FooterToolbar
│   │   │   ├── GlobalFooter
│   │   │   ├── GlobalHeader
│   │   │   ├── IconSelector
│   │   │   ├── Menu
│   │   │   ├── MultiTab
│   │   │   ├── NProgress
│   │   │   ├── NoticeIcon
│   │   │   ├── NumberInfo
│   │   │   ├── PageHeader
│   │   │   ├── PageLoading
│   │   │   ├── Result
│   │   │   ├── Search
│   │   │   ├── SettingDrawer
│   │   │   ├── StandardFormRow
│   │   │   ├── Table
│   │   │   ├── TagSelect
│   │   │   ├── TextArea
│   │   │   ├── Tree
│   │   │   ├── Trend
│   │   │   ├── UserSelect
│   │   │   ├── _util
│   │   │   ├── tools
│   │   │   ├── verifition
│   │   │   │   ├── Verify
│   │   │   │   └── utils
│   │   │   └── xnComponents
│   │   ├── config 默认样式和路由配置
│   │   ├── core 插件
│   │   │   ├── directives
│   │   │   └── lazy_lib
│   │   ├── layouts 布局配置
│   │   ├── mock 模拟数据
│   │   │   └── services
│   │   ├── router 路由配置
│   │   ├── store 状态管理
│   │   │   └── modules
│   │   ├── utils 工具类
│   │   │   └── helper
│   │   └── views 页面
│   │   ├── components 组件
│   │   ├── main 业务模块
│   │   │   ├── banner 轮播图管理
│   │   │   ├── business 入会申请
│   │   │   ├── demand 需求管理
│   │   │   ├── huodong 活动管理
│   │   │   ├── industry 行业管理
│   │   │   ├── info 资讯发布
│   │   │   ├── navbar 导航管理
│   │   │   ├── notice 公告发布
│   │   │   ├── party 党建发布
│   │   │   ├── platform 平台配置
│   │   │   ├── product 商品管理
│   │   │   ├── reguser 注册用户,未使用
│   │   │   ├── supply 供货管理
│   │   │   ├── vip VIP管理
│   │   │   │   └── auth VIP权限管理
│   │   │   └── wx 小程序管理
│   │   ├── system 系统模块
│   │   │   ├── account 账户管理
│   │   │   │   ├── center 个人中心
│   │   │   │   │   └── page
│   │   │   │   └── settings 个人配置
│   │   │   │   └── securityItem
│   │   │   ├── app 应用管理
│   │   │   ├── config 配置管理
│   │   │   ├── dashboard 仪表盘
│   │   │   ├── dict 字典管理
│   │   │   │   └── dictdata 字典数据
│   │   │   ├── email 邮件管理
│   │   │   ├── exception 异常页
│   │   │   ├── file 文件管理
│   │   │   ├── index 首页
│   │   │   ├── log 日志管理
│   │   │   │   ├── exlog 异常日志
│   │   │   │   ├── oplog 操作日志
│   │   │   │   ├── thirdlog 第三方日志
│   │   │   │   └── vislog 访问日志
│   │   │   ├── machine 机器管理
│   │   │   ├── menu 菜单管理
│   │   │   ├── notice 通知管理
│   │   │   ├── noticeReceived 通知接收管理
│   │   │   ├── org 组织管理
│   │   │   ├── pos 职位管理
│   │   │   ├── role 角色管理
│   │   │   └── user 用户管理
│   │   └── userLoginReg 用户注册登录
│   └── tests 测试单元
│   └── unit
└── netcore .NET7项目
└── src 源代码
├── JT.ShangHui.Application 业务模块
│   ├── Filter 拦截器
│   ├── JobService 定时任务
│   ├── Mapper DTO映射
│   └── Service 服务接口
│   ├── BaseCommon 基础服务
│   │   ├── Http http请求封装接口
│   │   ├── QrCode 二维码封装接口
│   │   ├── SMS 短信封装接口
│   │   └── Upload 文件上传接口
│   ├── Business 业务服务
│   │   ├── Banner 轮播图管理
│   │   ├── Campaign 活动管理
│   │   ├── Demand 需求管理
│   │   ├── Industry 行业管理
│   │   ├── Information 资讯管理
│   │   ├── NavBar 导航管理
│   │   ├── Notice 公告管理
│   │   ├── PSet 平台设置
│   │   ├── PartyBuilder 党建管理
│   │   ├── Product 商品管理
│   │   ├── Retailer 分销商管理,未使用
│   │   ├── Supply 供货管理
│   │   ├── VIP VIP管理
│   │   └── WX 小程序管理
│   ├── System 系统接口服务
│   │   ├── App 应用管理
│   │   ├── Auth 登录相关管理
│   │   ├── Base 通用方法
│   │   ├── Cache 缓存管理
│   │   ├── Captcha 验证码管理
│   │   │   ├── ClickWord
│   │   │   └── General
│   │   ├── Config 配置管理
│   │   ├── Dict 字典管理
│   │   ├── Emp 员工管理
│   │   ├── Enum 枚举管理
│   │   ├── File 文件管理
│   │   ├── Forms 表单管理
│   │   ├── Hubs 聊天管理
│   │   ├── Log 日志管理
│   │   ├── Menu 菜单管理
│   │   ├── Message 消息管理
│   │   ├── Monitor 监控管理
│   │   ├── Notice 通知管理
│   │   ├── OnlineUser 在线用户管理
│   │   ├── Org 组织管理
│   │   ├── Pos 职位管理
│   │   ├── Role 角色管理
│   │   ├── StepBody 步骤管理
│   │   ├── System 系统管理
│   │   ├── Timer 定时任务管理
│   │   └── User 用户管理
│   ├── Test 测试单元
│   └── ThirdApp 小程序端接口
│   ├── Info 资讯管理
│   ├── Product 商品管理
│   ├── Search 搜索管理
│   ├── User 会员管理
│   └── WxOpen 小程序接口
├── JT.ShangHui.Core 框架核心,引用Nuget包
│   ├── Filter 拦截器
│   └── Util 辅助类
├── JT.ShangHui.Database.Migrations 数据库迁移
│   └── Migrations 迁移文件
├── JT.ShangHui.Domain 领域模型
│   ├── Entity 数据库实体
│   │   ├── Business 业务层实体
│   │   ├── SeedData 种子数据
│   │   └── System 系统层实体
│   │   └── WorkflowEntity
│   ├── ErrCode 错误码
│   └── Options 选项配置
├── JT.ShangHui.Domain.Shared 常用枚举和常量定义
│   ├── Const 常量定义
│   └── Enum 枚举定义
├── JT.ShangHui.EntityFramework.Core EntityFrameworkCore管理
│   ├── DbContexts 数据库配置
│   ├── Extensions 数据库扩展
│   └── Repository 仓储
├── JT.ShangHui.EventBus 事件总线
│   └── Service 订阅者
│   ├── Logger 日志订阅
│   ├── Search 搜索订阅
│   └── User 用户订阅
├── JT.ShangHui.HealthCheck 健康检查
│   └── Extensions 扩展
├── JT.ShangHui.Web.Entry web层
│   ├── Controllers 控制器
│   ├── Handlers 中间件
│   ├── Views 视图
│   │   ├── Auth 公众号授权相关
│   │   ├── Home 首页
│   │   └── Shared 共享页面
│   └── wwwroot 静态资源
│   ├── css
│   ├── image
│   │   └── navbar
│   ├── js
│   └── lib
│   ├── bootstrap
│   │   └── dist
│   │   ├── css
│   │   └── js
│   ├── jquery
│   │   └── dist
│   └── layui
│   ├── css
│   │   └── modules
│   │   ├── laydate
│   │   │   └── default
│   │   └── layer
│   │   └── default
│   ├── font
│   ├── images
│   │   └── face
│   └── lay
│   └── modules
└── JT.ShangHui.WeiXin 微信小程序
└── Service 微信小程序服务
└── MP 微信小程序服务

3
admin/.browserslistrc Normal file
View File

@ -0,0 +1,3 @@
> 1%
last 2 versions
not ie <= 10

39
admin/.editorconfig Normal file
View File

@ -0,0 +1,39 @@
[*]
charset=utf-8
end_of_line=lf
insert_final_newline=false
indent_style=space
indent_size=2
[{*.ng,*.sht,*.html,*.shtm,*.shtml,*.htm}]
indent_style=space
indent_size=2
[{*.jhm,*.xslt,*.xul,*.rng,*.xsl,*.xsd,*.ant,*.tld,*.fxml,*.jrxml,*.xml,*.jnlp,*.wsdl}]
indent_style=space
indent_size=2
[{.babelrc,.stylelintrc,jest.config,.eslintrc,.prettierrc,*.json,*.jsb3,*.jsb2,*.bowerrc}]
indent_style=space
indent_size=2
[*.svg]
indent_style=space
indent_size=2
[*.js.map]
indent_style=space
indent_size=2
[*.less]
indent_style=space
indent_size=2
[*.vue]
indent_style=space
indent_size=2
[{.analysis_options,*.yml,*.yaml}]
indent_style=space
indent_size=2

4
admin/.env Normal file
View File

@ -0,0 +1,4 @@
NODE_ENV=production
VUE_APP_PREVIEW=false
VUE_APP_API_BASE_URL=https://izzt.jt-sky.com
VUE_APP_SOCKET_BASE_URL=ws://izzt.jt-sky.com

4
admin/.env.development Normal file
View File

@ -0,0 +1,4 @@
NODE_ENV=development
VUE_APP_PREVIEW=true
VUE_APP_API_BASE_URL=https://localhost:44373
VUE_APP_SOCKET_BASE_URL=ws://localhost:44373

4
admin/.env.preview Normal file
View File

@ -0,0 +1,4 @@
NODE_ENV=production
VUE_APP_PREVIEW=false
VUE_APP_API_BASE_URL=http://izzt.jt-sky.com
VUE_APP_SOCKET_BASE_URL=ws://izzt.jt-sky.com

77
admin/.eslintrc.js Normal file
View File

@ -0,0 +1,77 @@
module.exports = {
root: true,
env: {
node: true
},
'extends': [
'plugin:vue/strongly-recommended',
'@vue/standard'
],
rules: {
'no-console': 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'generator-star-spacing': 'off',
'no-mixed-operators': 0,
'vue/max-attributes-per-line': [
2,
{
'singleline': 5,
'multiline': {
'max': 1,
'allowFirstLine': false
}
}
],
'vue/attribute-hyphenation': 0,
'vue/html-self-closing': 0,
'vue/component-name-in-template-casing': 0,
'vue/html-closing-bracket-spacing': 0,
'vue/singleline-html-element-content-newline': 0,
'vue/no-unused-components': 0,
'vue/multiline-html-element-content-newline': 0,
'vue/no-use-v-if-with-v-for': 0,
'vue/html-closing-bracket-newline': 0,
'vue/no-parsing-error': 0,
'no-tabs': 0,
'quotes': [
2,
'single',
{
'avoidEscape': true,
'allowTemplateLiterals': true
}
],
'semi': [
2,
'never',
{
'beforeStatementContinuationChars': 'never'
}
],
'no-delete-var': 2,
'prefer-const': [
2,
{
'ignoreReadBeforeAssign': false
}
],
'template-curly-spacing': 'off',
'indent': 'off',
"space-before-function-paren": 0,
'no-multi-spaces': 2, //不能用多余的空格
},
parserOptions: {
parser: 'babel-eslint'
},
overrides: [
{
files: [
'**/__tests__/*.{j,t}s?(x)',
'**/tests/unit/**/*.spec.{j,t}s?(x)'
],
env: {
jest: true
}
}
]
}

2
admin/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
node_modules/
.idea/

5
admin/.prettierrc Normal file
View File

@ -0,0 +1,5 @@
{
"printWidth": 120,
"semi": false,
"singleQuote": true
}

7
admin/.travis.yml Normal file
View File

@ -0,0 +1,7 @@
language: node_js
node_js:
- 10.15.0
cache: yarn
script:
- yarn
- yarn run lint --no-fix && yarn run build

7
admin/Dockerfile Normal file
View File

@ -0,0 +1,7 @@
FROM nginx
COPY ./dist /usr/share/nginx/html
# 更新配置
COPY ./docker/nginx/vhost/default.conf /etc/nginx/conf.d
# 暴露端口
EXPOSE 80

21
admin/LICENSE Normal file
View File

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

28
admin/babel.config.js Normal file
View File

@ -0,0 +1,28 @@
const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV)
const plugins = []
if (IS_PROD) {
plugins.push('transform-remove-console')
}
// lazy load ant-design-vue
// if your use import on Demand, Use this code
plugins.push(['import', {
'libraryName': 'ant-design-vue',
'libraryDirectory': 'es',
'style': true // `style: true` 会加载 less 文件
}])
module.exports = {
presets: [
[
'@babel/preset-env',
{
'useBuiltIns': 'entry',
'corejs': 3
}
],
'@vue/cli-plugin-babel/preset'
],
plugins
}

7
admin/build.sh Normal file
View File

@ -0,0 +1,7 @@
#! /bin/bash
## author:liuzl
cp ./docker/nginx/vhost/hccz.conf /var/jenkins_home/nginx/conf
#docker stop hccz
#docker rm hccz
docker build -t hccz:v1 .
docker run -d -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime -p 8085:80 --restart=unless-stopped --net=mynet --name=hccz hccz:v1

View File

@ -0,0 +1,46 @@
const ThemeColorReplacer = require('webpack-theme-color-replacer')
const generate = require('@ant-design/colors/lib/generate').default
const getAntdSerials = (color) => {
// 淡化即less的tint
const lightens = new Array(9).fill().map((t, i) => {
return ThemeColorReplacer.varyColor.lighten(color, i / 10)
})
const colorPalettes = generate(color)
const rgb = ThemeColorReplacer.varyColor.toNum3(color.replace('#', '')).join(',')
return lightens.concat(colorPalettes).concat(rgb)
}
const themePluginOption = {
fileName: 'css/theme-colors-[contenthash:8].css',
matchColors: getAntdSerials('#FA541C'), // 主色系列
// 改变样式选择器,解决样式覆盖问题
changeSelector (selector) {
switch (selector) {
case '.ant-calendar-today .ant-calendar-date':
return ':not(.ant-calendar-selected-date):not(.ant-calendar-selected-day)' + selector
case '.ant-btn:focus,.ant-btn:hover':
return '.ant-btn:focus:not(.ant-btn-primary):not(.ant-btn-danger),.ant-btn:hover:not(.ant-btn-primary):not(.ant-btn-danger)'
case '.ant-btn.active,.ant-btn:active':
return '.ant-btn.active:not(.ant-btn-primary):not(.ant-btn-danger),.ant-btn:active:not(.ant-btn-primary):not(.ant-btn-danger)'
case '.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon':
case '.ant-steps-item-process .ant-steps-item-icon>.ant-steps-icon':
return ':not(.ant-steps-item-process)' + selector
case '.ant-menu-horizontal>.ant-menu-item-active,.ant-menu-horizontal>.ant-menu-item-open,.ant-menu-horizontal>.ant-menu-item-selected,.ant-menu-horizontal>.ant-menu-item:hover,.ant-menu-horizontal>.ant-menu-submenu-active,.ant-menu-horizontal>.ant-menu-submenu-open,.ant-menu-horizontal>.ant-menu-submenu-selected,.ant-menu-horizontal>.ant-menu-submenu:hover':
case '.ant-menu-horizontal > .ant-menu-item-active,.ant-menu-horizontal > .ant-menu-item-open,.ant-menu-horizontal > .ant-menu-item-selected,.ant-menu-horizontal > .ant-menu-item:hover,.ant-menu-horizontal > .ant-menu-submenu-active,.ant-menu-horizontal > .ant-menu-submenu-open,.ant-menu-horizontal > .ant-menu-submenu-selected,.ant-menu-horizontal > .ant-menu-submenu:hover':
return '.ant-menu-horizontal > .ant-menu-item-active,.ant-menu-horizontal > .ant-menu-item-open,.ant-menu-horizontal > .ant-menu-item-selected,.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item:hover,.ant-menu-horizontal > .ant-menu-submenu-active,.ant-menu-horizontal > .ant-menu-submenu-open,.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu-selected,.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu:hover'
case '.ant-menu-horizontal > .ant-menu-item-selected > a':
case '.ant-menu-horizontal>.ant-menu-item-selected>a':
return '.ant-menu-horizontal:not(ant-menu-light):not(.ant-menu-dark) > .ant-menu-item-selected > a'
case '.ant-menu-horizontal > .ant-menu-item > a:hover':
case '.ant-menu-horizontal>.ant-menu-item>a:hover':
return '.ant-menu-horizontal:not(ant-menu-light):not(.ant-menu-dark) > .ant-menu-item > a:hover'
default :
return selector
}
}
}
const createThemeColorReplacerPlugin = () => new ThemeColorReplacer(themePluginOption)
module.exports = createThemeColorReplacerPlugin

18
admin/deploy.config.js Normal file
View File

@ -0,0 +1,18 @@
module.exports = {
projectName: 'jutian_admin',
readyTimeout: 20000,
cluster: [],
prod: {
name: '正式环境',
script: 'npm run build',
host: '123.60.2.99',
port: 22,
username: 'liuzhaoliang',
password: 'liuzhaoliang',
distPath: 'dist',
webDir: '/zzt.jt-sky.com',
bakDir: '',
isRemoveRemoteFile: false,
isRemoveLocalFile: false
}
}

View File

@ -0,0 +1,16 @@
version: '3.4'
services:
nginx:
build:
context: ../
dockerfile: ./docker/nginx/Dockerfile
image: admin_net_web:1.2
ports:
- 81:80
restart: "always"
volumes:
- node_modules:/build/node_modules:rw
# network_mode: host #宿主网络与宿主机共享网络安全性不佳本地开发使用不支持windows仅支持Linux
volumes:
node_modules:

View File

@ -0,0 +1,6 @@
1、安装URL重写模块,https://www.iis.net/downloads/microsoft/url-rewrite
2、安装ARR模块,https://www.iis.net/downloads/microsoft/application-request-routing
3、打开ARR启动代理
4、点击URL重写
5、增加服务器变量HTTP_X_ORIGINAL_HOST
6、把web.config内容修改为自己的接口地址然后放到主目录下

View File

@ -0,0 +1,6 @@
FROM nginx
EXPOSE 80
EXPOSE 443
COPY ./dist /usr/share/nginx/html
# 更新配置
COPY ./docker/nginx/vhost/default.conf /etc/nginx/conf.d

View File

@ -0,0 +1,21 @@
user nginx;
worker_processes 1;
pid /var/run/nginx.pid;
error_log /var/log/nginx/nginx.error.log warn;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /dev/null;
#access_log /var/log/nginx/nginx.access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}

View File

@ -0,0 +1,5 @@
### 说明
把此目录下的文件放到dist下的主目录中
nginx.conf 适用于直接发布到主机nginx中

View File

@ -0,0 +1,37 @@
# 此配置针对docker中的nginx
server {
listen 80;
server_name hccz.pcxbc.com;
root /usr/share/nginx/html;
index index.php index.html index.htm;
access_log /dev/null;
error_log /var/log/nginx/default.error.log warn;
# redirect server error pages to the static page /50x.html
#
#error_page 500 502 503 504 /50x.html;
location / {
root /usr/share/nginx/html;
add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
try_files $uri $uri/ /index.html;
}
location /api {
#如果服务器要获取客户端真实IP可以用下三句设置主机头和客户端真实地址
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# rewrite ^/api/(.*)$ /$1 break; #重写
proxy_pass http://hcczapi; #ybdevicev2是docker中的服务名称,这里不能直接放域名要么是docker名称要么是ip+端口的形式
}
location /hubs/ {
proxy_pass http://hcczapi;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
#proxy_read_timeout 600s;#设置websocket超时时间
}
}

View File

@ -0,0 +1,22 @@
# 此配置针对本地nginx
server {
listen 80;
server_name hccz.pcxbc.com;
index index.php index.html index.htm;
access_log /dev/null;
error_log /www/wwwlogs/hccz.error.log warn;
# redirect server error pages to the static page /50x.html
#
#error_page 500 502 503 504 /50x.html;
location / {
#如果服务器要获取客户端真实IP可以用下三句设置主机头和客户端真实地址
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# rewrite ^/api/(.*)$ /$1 break; #重写
proxy_pass http://localhost:8085;
}
}

View File

@ -0,0 +1,45 @@
server {
listen 80;
server_name huafei-dev.pcxbc.com;
root /opt/jenkens/nginx/html/hc/hf/development/web;
index index.php index.html index.htm;
access_log /dev/null;
error_log /www/wwwlogs/huafei-dev.error.log warn;
# redirect server error pages to the static page /50x.html
#
#error_page 500 502 503 504 /50x.html;
location / {
root /opt/jenkens/nginx/html/hc/hf/development/web;
add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
try_files $uri $uri/ /index.html;
}
location /api/ {
#如果服务器要获取客户端真实IP可以用下三句设置主机头和客户端真实地址
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# rewrite ^/api/(.*)$ /$1 break; #重写
proxy_pass http://192.168.1.147:9001; #ybdevicev2是docker中的服务名称,这里不能直接放域名要么是docker名称要么是ip+端口的形式
}
location /bapi/ {
#如果服务器要获取客户端真实IP可以用下三句设置主机头和客户端真实地址
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# rewrite ^/api/(.*)$ /$1 break; #重写
proxy_pass http://192.168.1.147:9001; #ybdevicev2是docker中的服务名称,这里不能直接放域名要么是docker名称要么是ip+端口的形式
}
location /hubs/ {
proxy_pass http://192.168.1.147:9001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
#proxy_read_timeout 600s;#设置websocket超时时间
}
}

28
admin/docker/web.config Normal file
View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="api" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
<match url="*api/*" />
<action type="Rewrite" url="https://izzt.jt-sky.com/api/{R:2}" />
<serverVariables>
<set name="HTTP_X_ORIGINAL_HOST" value="{HTTP_HOST}" />
</serverVariables>
</rule>
<rule name="hubs" patternSyntax="Wildcard" stopProcessing="true">
<match url="*hubs/*" />
<action type="Rewrite" url="https://izzt.jt-sky.com/hubs/{R:2}" />
</rule>
<rule name="index" enabled="true" stopProcessing="true">
<match url="^((?!(api)).)*$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="/" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>

23
admin/jest.config.js Normal file
View File

@ -0,0 +1,23 @@
module.exports = {
moduleFileExtensions: [
'js',
'jsx',
'json',
'vue'
],
transform: {
'^.+\\.vue$': 'vue-jest',
'.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub',
'^.+\\.jsx?$': 'babel-jest'
},
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/src/$1'
},
snapshotSerializers: [
'jest-serializer-vue'
],
testMatch: [
'**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
],
testURL: 'http://localhost/'
}

11
admin/jsconfig.json Normal file
View File

@ -0,0 +1,11 @@
{
"compilerOptions": {
"target": "es6",
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
}
},
"exclude": ["node_modules", "dist"],
"include": ["src/**/*"]
}

102
admin/package.json Normal file
View File

@ -0,0 +1,102 @@
{
"name": "vue-antd-pro",
"version": "3.0.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"deploy": "deploy-cli-service d --mode prod",
"test:unit": "vue-cli-service test:unit",
"build:preview": "vue-cli-service build --mode preview",
"postinstall": "opencollective-postinstall"
},
"dependencies": {
"-": "^0.0.1",
"@antv/data-set": "^0.11.8",
"@antv/g2": "^4.2.2",
"@jiaminghi/data-view": "^2.10.0",
"@microsoft/signalr": "^5.0.5",
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^1.0.2",
"ant-design-vue": "1.7.4",
"axios": "^0.19.0",
"babel-polyfill": "^6.26.0",
"clipboard": "^2.0.6",
"compression-webpack-plugin": "5.0.1",
"core-js": "^3.1.2",
"crypto-js": "^4.0.0",
"default-passive-events": "^1.0.10",
"deploy-cli-service": "^1.4.0",
"enquire.js": "^2.1.6",
"font-awesome": "^4.7.0",
"jquery": "^3.5.1",
"jsbarcode": "^3.11.3",
"k-form-design": "^3.7.3",
"leaflet": "^1.7.1",
"leaflet.pm": "^2.2.0",
"linq": "^3.2.3",
"lodash.clonedeep": "^4.5.0",
"lodash.get": "^4.4.2",
"lodash.pick": "^4.4.0",
"md5": "^2.2.1",
"mockjs2": "1.0.8",
"moment": "^2.24.0",
"nprogress": "^0.2.0",
"print-js": "^1.0.63",
"qrcodejs2": "^0.0.2",
"raphael": "^2.3.0",
"screenfull": "^5.1.0",
"vue": "^2.6.10",
"vue-clipboard2": "^0.2.1",
"vue-codemirror-lite": "^1.0.4",
"vue-cropper": "0.4.9",
"vue-json-viewer": "2",
"vue-ls": "^3.2.1",
"vue-quill-editor": "^3.0.6",
"vue-router": "^3.1.2",
"vue-svg-component-runtime": "^1.0.1",
"vue2-leaflet": "^2.7.0",
"vuedraggable": "^2.23.2",
"vuex": "^3.1.1",
"wangeditor": "^3.1.1"
},
"devDependencies": {
"@ant-design/colors": "^3.2.1",
"@vue/cli-plugin-babel": "^4.0.4",
"@vue/cli-plugin-eslint": "^4.0.4",
"@vue/cli-plugin-router": "^4.0.4",
"@vue/cli-plugin-unit-jest": "^4.0.4",
"@vue/cli-plugin-vuex": "^4.0.4",
"@vue/cli-service": "^4.0.4",
"@vue/eslint-config-prettier": "^5.0.0",
"@vue/eslint-config-standard": "^4.0.0",
"@vue/test-utils": "^1.0.0-beta.29",
"babel-eslint": "^10.0.1",
"babel-plugin-import": "^1.13.0",
"babel-plugin-transform-remove-console": "^6.9.4",
"eslint": "^6.8.0",
"eslint-plugin-html": "^5.0.0",
"eslint-plugin-prettier": "^3.1.0",
"eslint-plugin-vue": "^5.2.3",
"less": "^3.0.4",
"less-loader": "^5.0.0",
"opencollective": "^1.0.3",
"opencollective-postinstall": "^2.0.2",
"prettier": "^1.18.2",
"vue-svg-icon-loader": "^2.1.1",
"vue-template-compiler": "^2.6.10",
"webpack-theme-color-replacer": "1.3.18"
},
"collective": {
"type": "opencollective",
"url": "https://opencollective.com/ant-design-pro-vue"
},
"main": ".eslintrc.js",
"directories": {
"test": "tests"
},
"keywords": [],
"author": "",
"license": "ISC",
"description": ""
}

5
admin/postcss.config.js Normal file
View File

@ -0,0 +1,5 @@
module.exports = {
plugins: {
autoprefixer: {}
}
}

BIN
admin/public/avatar2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

BIN
admin/public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

40
admin/public/index.html Normal file
View File

@ -0,0 +1,40 @@
<!DOCTYPE html>
<html lang="zh-cmn-Hans">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta http-equiv="Access-Control-Allow-Origin" content="*">
<meta name="renderer" content="webkit">
<meta name="referrer" content="no-referrer" />
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="format-detection" content="telephone=no">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>管理平台</title>
<style>.first-loading-wrp{display:flex;justify-content:center;align-items:center;flex-direction:column;min-height:420px;height:100%}.first-loading-wrp>h1{font-size:128px}.first-loading-wrp .loading-wrp{padding:98px;display:flex;justify-content:center;align-items:center}.dot{animation:antRotate 1.2s infinite linear;transform:rotate(45deg);position:relative;display:inline-block;font-size:32px;width:32px;height:32px;box-sizing:border-box}.dot i{width:14px;height:14px;position:absolute;display:block;background-color:#1890ff;border-radius:100%;transform:scale(.75);transform-origin:50% 50%;opacity:.3;animation:antSpinMove 1s infinite linear alternate}.dot i:nth-child(1){top:0;left:0}.dot i:nth-child(2){top:0;right:0;-webkit-animation-delay:.4s;animation-delay:.4s}.dot i:nth-child(3){right:0;bottom:0;-webkit-animation-delay:.8s;animation-delay:.8s}.dot i:nth-child(4){bottom:0;left:0;-webkit-animation-delay:1.2s;animation-delay:1.2s}@keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}@-webkit-keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}@keyframes antSpinMove{to{opacity:1}}@-webkit-keyframes antSpinMove{to{opacity:1}}</style>
<!-- require cdn assets css -->
<% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.css) { %>
<link rel="stylesheet" href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" />
<% } %>
</head>
<body>
<noscript>
<strong>We're sorry but vue-antd-pro doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app">
<div class="first-loading-wrp">
<!-- <h1>YB.PayDevice</h1> -->
<div class="loading-wrp">
<span class="dot dot-spin"><i></i><i></i><i></i><i></i></span>
</div>
<div style="display: flex; justify-content: center; align-items: center;"></div>
</div>
</div>
<!-- require cdn assets js -->
<% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %>
<script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
<% } %>
<!-- built files will be auto injected -->
</body>
</html>

View File

@ -0,0 +1 @@
#preloadingAnimation{position:fixed;left:0;top:0;height:100%;width:100%;background:#ffffff;user-select:none;z-index: 9999;overflow: hidden}.lds-roller{display:inline-block;position:relative;left:50%;top:50%;transform:translate(-50%,-50%);width:64px;height:64px;}.lds-roller div{animation:lds-roller 1.2s cubic-bezier(0.5,0,0.5,1) infinite;transform-origin:32px 32px;}.lds-roller div:after{content:" ";display:block;position:absolute;width:6px;height:6px;border-radius:50%;background:#13c2c2;margin:-3px 0 0 -3px;}.lds-roller div:nth-child(1){animation-delay:-0.036s;}.lds-roller div:nth-child(1):after{top:50px;left:50px;}.lds-roller div:nth-child(2){animation-delay:-0.072s;}.lds-roller div:nth-child(2):after{top:54px;left:45px;}.lds-roller div:nth-child(3){animation-delay:-0.108s;}.lds-roller div:nth-child(3):after{top:57px;left:39px;}.lds-roller div:nth-child(4){animation-delay:-0.144s;}.lds-roller div:nth-child(4):after{top:58px;left:32px;}.lds-roller div:nth-child(5){animation-delay:-0.18s;}.lds-roller div:nth-child(5):after{top:57px;left:25px;}.lds-roller div:nth-child(6){animation-delay:-0.216s;}.lds-roller div:nth-child(6):after{top:54px;left:19px;}.lds-roller div:nth-child(7){animation-delay:-0.252s;}.lds-roller div:nth-child(7):after{top:50px;left:14px;}.lds-roller div:nth-child(8){animation-delay:-0.288s;}.lds-roller div:nth-child(8):after{top:45px;left:10px;}#preloadingAnimation .load-tips{color: #13c2c2;font-size:2rem;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);margin-top:80px;text-align:center;width:400px;height:64px;} @keyframes lds-roller{0%{transform:rotate(0deg);} 100%{transform:rotate(360deg);}}

View File

@ -0,0 +1 @@
<div id="preloadingAnimation"><div class=lds-roller><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div><div class=load-tips>Loading</div></div>

View File

@ -0,0 +1,5 @@
<div class="preloading-animate">
<div class="preloading-wrapper">
<svg class="preloading-balls" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid"><circle cx="67.802" cy="59.907" r="6" fill="#51CACC"><animate attributeName="cx" values="75;57.72542485937369" keyTimes="0;1" dur="1s" repeatCount="indefinite"/><animate attributeName="cy" values="50;73.77641290737884" keyTimes="0;1" dur="1s" repeatCount="indefinite"/><animate attributeName="fill" values="#51CACC;#9DF871" keyTimes="0;1" dur="1s" repeatCount="indefinite"/></circle><circle cx="46.079" cy="69.992" r="6" fill="#9DF871"><animate attributeName="cx" values="57.72542485937369;29.774575140626318" keyTimes="0;1" dur="1s" repeatCount="indefinite"/><animate attributeName="cy" values="73.77641290737884;64.69463130731182" keyTimes="0;1" dur="1s" repeatCount="indefinite"/><animate attributeName="fill" values="#9DF871;#E0FF77" keyTimes="0;1" dur="1s" repeatCount="indefinite"/></circle><circle cx="29.775" cy="52.449" r="6" fill="#E0FF77"><animate attributeName="cx" values="29.774575140626318;29.774575140626315" keyTimes="0;1" dur="1s" repeatCount="indefinite"/><animate attributeName="cy" values="64.69463130731182;35.30536869268818" keyTimes="0;1" dur="1s" repeatCount="indefinite"/><animate attributeName="fill" values="#E0FF77;#DE9DD6" keyTimes="0;1" dur="1s" repeatCount="indefinite"/></circle><circle cx="41.421" cy="31.521" r="6" fill="#DE9DD6"><animate attributeName="cx" values="29.774575140626315;57.72542485937368" keyTimes="0;1" dur="1s" repeatCount="indefinite"/><animate attributeName="cy" values="35.30536869268818;26.22358709262116" keyTimes="0;1" dur="1s" repeatCount="indefinite"/><animate attributeName="fill" values="#DE9DD6;#FF708E" keyTimes="0;1" dur="1s" repeatCount="indefinite"/></circle><circle cx="64.923" cy="36.13" r="6" fill="#FF708E"><animate attributeName="cx" values="57.72542485937368;75" keyTimes="0;1" dur="1s" repeatCount="indefinite"/><animate attributeName="cy" values="26.22358709262116;49.99999999999999" keyTimes="0;1" dur="1s" repeatCount="indefinite"/><animate attributeName="fill" values="#FF708E;#51CACC" keyTimes="0;1" dur="1s" repeatCount="indefinite"/></circle></svg>
</div>
</div>

View File

@ -0,0 +1 @@
.preloading-animate{background:#ffffff;width:100%;height:100%;position:fixed;left:0;top:0;z-index:299;}.preloading-animate .preloading-wrapper{position:absolute;width:5rem;height:5rem;left:50%;top:50%;transform:translate(-50%,-50%);}.preloading-animate .preloading-wrapper .preloading-balls{font-size:5rem;}

View File

@ -0,0 +1 @@
<svg class="preloading-balls" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid"><circle cx="67.802" cy="59.907" r="6" fill="#51CACC"><animate attributeName="cx" values="75;57.72542485937369" keyTimes="0;1" dur="1s" repeatCount="indefinite"/><animate attributeName="cy" values="50;73.77641290737884" keyTimes="0;1" dur="1s" repeatCount="indefinite"/><animate attributeName="fill" values="#51CACC;#9DF871" keyTimes="0;1" dur="1s" repeatCount="indefinite"/></circle><circle cx="46.079" cy="69.992" r="6" fill="#9DF871"><animate attributeName="cx" values="57.72542485937369;29.774575140626318" keyTimes="0;1" dur="1s" repeatCount="indefinite"/><animate attributeName="cy" values="73.77641290737884;64.69463130731182" keyTimes="0;1" dur="1s" repeatCount="indefinite"/><animate attributeName="fill" values="#9DF871;#E0FF77" keyTimes="0;1" dur="1s" repeatCount="indefinite"/></circle><circle cx="29.775" cy="52.449" r="6" fill="#E0FF77"><animate attributeName="cx" values="29.774575140626318;29.774575140626315" keyTimes="0;1" dur="1s" repeatCount="indefinite"/><animate attributeName="cy" values="64.69463130731182;35.30536869268818" keyTimes="0;1" dur="1s" repeatCount="indefinite"/><animate attributeName="fill" values="#E0FF77;#DE9DD6" keyTimes="0;1" dur="1s" repeatCount="indefinite"/></circle><circle cx="41.421" cy="31.521" r="6" fill="#DE9DD6"><animate attributeName="cx" values="29.774575140626315;57.72542485937368" keyTimes="0;1" dur="1s" repeatCount="indefinite"/><animate attributeName="cy" values="35.30536869268818;26.22358709262116" keyTimes="0;1" dur="1s" repeatCount="indefinite"/><animate attributeName="fill" values="#DE9DD6;#FF708E" keyTimes="0;1" dur="1s" repeatCount="indefinite"/></circle><circle cx="64.923" cy="36.13" r="6" fill="#FF708E"><animate attributeName="cx" values="57.72542485937368;75" keyTimes="0;1" dur="1s" repeatCount="indefinite"/><animate attributeName="cy" values="26.22358709262116;49.99999999999999" keyTimes="0;1" dur="1s" repeatCount="indefinite"/><animate attributeName="fill" values="#FF708E;#51CACC" keyTimes="0;1" dur="1s" repeatCount="indefinite"/></circle></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

47
admin/src/App.vue Normal file
View File

@ -0,0 +1,47 @@
<template>
<a-config-provider :locale="locale">
<div id="app" class="app app1">
<router-view class="scrollbar"/>
</div>
</a-config-provider>
</template>
<script>
import zhCN from 'ant-design-vue/lib/locale-provider/zh_CN'
import { AppDeviceEnquire } from '@/utils/mixin'
export default {
mixins: [AppDeviceEnquire],
data () {
return {
locale: zhCN
}
},
mounted () {
}
}
</script>
<style>
.app {
overflow: auto;
border : none;
}
.scrollbar {
margin: 0 auto;
}
.app1::-webkit-scrollbar {
/*滚动条整体样式*/
width : 8px; /*高宽分别对应横竖滚动条的尺寸*/
}
.app1::-webkit-scrollbar-thumb {
/*滚动条里面小方块*/
border-radius: 6px;
background : #aaa;
}
.app1::-webkit-scrollbar-track {
/*滚动条里面轨道*/
border-radius: 8px;
background : #FFFFFF;
}
</style>

View File

@ -0,0 +1,33 @@
import { axios } from '@/utils/request'
// 获取列表
export function List(parameter) {
return axios({
url: '/business/banner/list',
method: 'post',
data: parameter
})
}
// 修改状态
export function SetStatus(parameter) {
return axios({
url: '/business/banner/setstatus',
method: 'post',
data: parameter
})
}
// 提交
export function Submit(parameter) {
return axios({
url: '/business/banner/submit',
method: 'post',
data: parameter
})
}
// 删除
export function Delete(parameter) {
return axios({
url: '/business/banner/Delete',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,26 @@
// 客户管理接口定义
import { axios } from '@/utils/request'
// 分销商列表
export function BusinessList(parameter) {
return axios({
url: '/business/account/list',
method: 'post',
data: parameter
})
}
// 所有分销商列表
export function BusinessAllList(parameter) {
return axios({
url: '/business/account/alllist',
method: 'post',
data: parameter
})
}
// 分销商提交
export function BusinessSubmit(parameter) {
return axios({
url: '/business/account/submit',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,17 @@
import { axios } from '@/utils/request'
// 获取列表
export function List(parameter) {
return axios({
url: '/business/demand/list',
method: 'post',
data: parameter
})
}
// 修改状态
export function SetStatus(parameter) {
return axios({
url: '/business/demand/setstatus',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,33 @@
import { axios } from '@/utils/request'
// 获取列表
export function List(parameter) {
return axios({
url: '/business/Campaign/list',
method: 'post',
data: parameter
})
}
// 修改状态
export function SetStatus(parameter) {
return axios({
url: '/business/Campaign/setstatus',
method: 'post',
data: parameter
})
}
// 提交
export function Submit(parameter) {
return axios({
url: '/business/Campaign/submit',
method: 'post',
data: parameter
})
}
// 删除
export function Delete(parameter) {
return axios({
url: '/business/Campaign/setstatus',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,33 @@
import { axios } from '@/utils/request'
// 获取列表
export function List(parameter) {
return axios({
url: '/business/industry/list',
method: 'post',
data: parameter
})
}
// 获取列表
export function AllList(parameter) {
return axios({
url: '/business/industry/alllist',
method: 'post',
data: parameter
})
}
// 删除
export function Delete(parameter) {
return axios({
url: '/business/industry/delete',
method: 'post',
data: parameter
})
}
// 提交
export function Submit(parameter) {
return axios({
url: '/business/industry/submit',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,41 @@
import { axios } from '@/utils/request'
// 获取资讯列表
export function List(parameter) {
return axios({
url: '/business/info/list',
method: 'post',
data: parameter
})
}
//获取公益信息列表
export function GYList(parameter) {
return axios({
url: '/business/info/gylist',
method: 'post',
data: parameter
})
}
// 修改状态
export function SetStatus(parameter) {
return axios({
url: '/business/info/setstatus',
method: 'post',
data: parameter
})
}
// 提交
export function Submit(parameter) {
return axios({
url: '/business/info/submit',
method: 'post',
data: parameter
})
}
// 提交
export function GYSubmit(parameter) {
return axios({
url: '/business/info/gysubmit',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,25 @@
import { axios } from '@/utils/request'
// 获取列表
export function List(parameter) {
return axios({
url: '/business/navbar/list',
method: 'post',
data: parameter
})
}
// 修改状态
export function SetStatus(parameter) {
return axios({
url: '/business/navbar/setstatus',
method: 'post',
data: parameter
})
}
// 提交
export function Submit(parameter) {
return axios({
url: '/business/navbar/submit',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,33 @@
import { axios } from '@/utils/request'
// 获取列表
export function List(parameter) {
return axios({
url: '/business/notice/list',
method: 'post',
data: parameter
})
}
// 修改状态
export function SetStatus(parameter) {
return axios({
url: '/business/notice/setstatus',
method: 'post',
data: parameter
})
}
// 提交
export function Submit(parameter) {
return axios({
url: '/business/notice/submit',
method: 'post',
data: parameter
})
}
// 删除
export function Delete(parameter) {
return axios({
url: '/business/notice/delete',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,33 @@
import { axios } from '@/utils/request'
// 获取列表
export function List(parameter) {
return axios({
url: '/business/party/list',
method: 'post',
data: parameter
})
}
// 修改状态
export function SetStatus(parameter) {
return axios({
url: '/business/party/setstatus',
method: 'post',
data: parameter
})
}
// 提交
export function Submit(parameter) {
return axios({
url: '/business/party/submit',
method: 'post',
data: parameter
})
}
// 删除
export function Delete(parameter) {
return axios({
url: '/business/party/delete',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,17 @@
import { axios } from '@/utils/request'
// 平台配置详情
export function Detail(parameter) {
return axios({
url: '/platform/detail',
method: 'post',
data: parameter
})
}
// 平台配置信息提交
export function Submit(parameter) {
return axios({
url: '/platform/submit',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,17 @@
import { axios } from '@/utils/request'
// 获取列表
export function List(parameter) {
return axios({
url: '/business/product/list',
method: 'post',
data: parameter
})
}
// 修改状态
export function SetStatus(parameter) {
return axios({
url: '/business/product/setstatus',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,17 @@
import { axios } from '@/utils/request'
// 查询注册用户列表
export function RegUserList (parameter) {
return axios({
url: '/reguser/list',
method: 'post',
data: parameter
})
}
// 修改昵称
export function ModifyName (parameter) {
return axios({
url: '/reguser/editname',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,17 @@
import { axios } from '@/utils/request'
// 获取列表
export function List(parameter) {
return axios({
url: '/business/supply/list',
method: 'post',
data: parameter
})
}
// 修改状态
export function SetStatus(parameter) {
return axios({
url: '/business/supply/setstatus',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,26 @@
import { axios } from '@/utils/request'
/**
* 查询所有枚举类型
*
* @author liuzl
*/
export function GetClientData (parameter) {
return axios({
url: '/sysenumdata/getclientdata',
method: 'get',
param: parameter
})
}
/**
* 查询配置信息
*
* @author liuzl
*/
export function GetConfigInfo (parameter) {
return axios({
url: '/system/getconfiginfo',
method: 'post',
param: parameter
})
}

View File

@ -0,0 +1,18 @@
import { axios } from '@/utils/request'
// 图片上传
export function UploadImg(parameter) {
return axios({
url: '/common/uploadimg',
method: 'post',
data: parameter
})
}
// 视频上传
export function UploadImgVideo(parameter) {
return axios({
url: '/common/uploadvideo',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,57 @@
import { axios } from '@/utils/request'
// vip列表
export function List(parameter) {
return axios({
url: '/business/vip/list',
method: 'post',
data: parameter
})
}
// vip所有列表
export function AllList(parameter) {
return axios({
url: '/business/vip/alllist',
method: 'post',
data: parameter
})
}
// vip提交
export function Submit(parameter) {
return axios({
url: '/business/vip/submit',
method: 'post',
data: parameter
})
}
// vip权限列表
export function AuthList(parameter) {
return axios({
url: '/business/vip/auth/list',
method: 'post',
data: parameter
})
}
// vip权限提交
export function AuthSubmit(parameter) {
return axios({
url: '/business/vip/auth/submit',
method: 'post',
data: parameter
})
}
// vip权限状态变更
export function AuthStatus(parameter) {
return axios({
url: '/business/vip/auth/status',
method: 'post',
data: parameter
})
}
// vip关联权限列表
export function VipAuthList(parameter) {
return axios({
url: '/business/vip/authlist',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,25 @@
import { axios } from '@/utils/request'
// 获取小程序列表
export function List(parameter) {
return axios({
url: '/business/wx/list',
method: 'post',
data: parameter
})
}
// 获取所有小程序列表
export function AllList(parameter) {
return axios({
url: '/business/wx/alllist',
method: 'post',
data: parameter
})
}
// 小程序信息提交
export function Submit(parameter) {
return axios({
url: '/business/wx/submit',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,106 @@
/**
* 系统应用
*
* @author yubaoshan
* @date 2020年4月23日12:10:57
*/
import { axios } from '@/utils/request'
/**
* 系统应用列表
*
* @author yubaoshan
* @date 2020年7月9日15:05:01
*/
export function getAppPage (parameter) {
return axios({
url: '/sysApp/page',
method: 'get',
params: parameter
})
}
/**
* 系统应用列表
*
* @author yubaoshan
* @date 2020年7月9日15:05:01
*/
export function getAppList (parameter) {
return axios({
url: '/sysApp/list',
method: 'get',
params: parameter
})
}
/**
* 新增系统应用
*
* @author yubaoshan
* @date 2020年7月9日15:05:01
*/
export function sysAppAdd (parameter) {
return axios({
url: '/sysApp/add',
method: 'post',
data: parameter
})
}
/**
* 编辑系统应用
*
* @author yubaoshan
* @param parameter
* @returns {*}
*/
export function sysAppEdit (parameter) {
return axios({
url: '/sysApp/edit',
method: 'post',
data: parameter
})
}
/**
* 删除系统应用
*
* @author yubaoshan
* @date 2020年7月9日15:05:01
*/
export function sysAppDelete (parameter) {
return axios({
url: '/sysApp/delete',
method: 'post',
data: parameter
})
}
/**
* 设为默认应用
*
* @author yubaoshan
* @date 2020年7月9日15:05:01
*/
export function sysAppSetAsDefault (parameter) {
return axios({
url: '/sysApp/setAsDefault',
method: 'post',
data: parameter
})
}
/**
* 修改应用状态
*
* @author zuohuaijun
* @date 2021年1月1日
*/
export function sysAppChangeStatus (parameter) {
return axios({
url: '/sysApp/changeStatus',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,85 @@
import { axios } from '@/utils/request'
/**
* 分页查询配置列表
*
* @author yubaoshan
* @date 2020/5/25 01:57
*/
export function sysConfigPage (parameter) {
return axios({
url: '/sysConfig/page',
method: 'get',
params: parameter
})
}
/**
* 添加系统参数配置
*
* @author yubaoshan
* @date 2020/5/25 01:57
*/
export function sysConfigAdd (parameter) {
return axios({
url: '/sysConfig/add',
method: 'post',
data: parameter
})
}
/**
* 编辑系统参数配置
*
* @author yubaoshan
* @date 2020/5/25 01:57
*/
export function sysConfigEdit (parameter) {
return axios({
url: '/sysConfig/edit',
method: 'post',
data: parameter
})
}
/**
* 删除系统参数配置
*
* @author yubaoshan
* @date 2020/5/25 01:57
*/
export function sysConfigDelete (parameter) {
return axios({
url: '/sysConfig/delete',
method: 'post',
data: parameter
})
}
/**
* 获取字典类型下所有字典举例返回格式为[{code:"M",value:"男"},{code:"F",value:"女"}]
*
* @author yubaoshan
* @date 2020/5/25 02:06
*/
export function sysDictTypeDropDown (parameter) {
return axios({
url: '/sysDictType/dropDown',
method: 'get',
params: parameter
})
}
/**
* 获取系统的所有任务列表
*
* @author yubaoshan
* @date 2020/7/8 20:46
*/
export function sysTimersGetActionClasses (parameter) {
return axios({
url: '/sysTimers/getActionClasses',
method: 'get',
params: parameter
})
}

View File

@ -0,0 +1,73 @@
import {
axios
} from '@/utils/request'
/**
* 查询系统字典值
*
* @author yubaoshan
* @date 2020/5/17 02:24
*/
export function sysDictDataPage(parameter) {
return axios({
url: '/sysDictData/page',
method: 'get',
params: parameter
})
}
/**
* 添加系统字典值
*
* @author yubaoshan
* @date 2020/5/17 02:24
*/
export function sysDictDataAdd(parameter) {
return axios({
url: '/sysDictData/add',
method: 'post',
data: parameter
})
}
/**
* 编辑系统字典值
*
* @author yubaoshan
* @date 2020/5/17 02:25
*/
export function sysDictDataEdit(parameter) {
return axios({
url: '/sysDictData/edit',
method: 'post',
data: parameter
})
}
/**
* 删除系统字典值
*
* @author yubaoshan
* @date 2020/5/17 02:25
*/
export function sysDictDataDelete(parameter) {
return axios({
url: '/sysDictData/delete',
method: 'post',
data: parameter
})
}
/**
* 修改系统字典状态
*
* @author xusn
* @date 2021-04-30 11:00:16
*/
export function sysDictDataChangeStatus(parameter) {
return axios({
url: '/sysDictData/changeStatus',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,101 @@
import {
axios
} from '@/utils/request'
/**
* 分页查询系统字典类型
*
* @author yubaoshan
* @date 2020/5/17 01:46
*/
export function sysDictTypePage(parameter) {
return axios({
url: '/sysDictType/page',
method: 'get',
params: parameter
})
}
/**
* 添加系统字典类型
*
* @author yubaoshan
* @date 2020/5/17 01:46
*/
export function sysDictTypeAdd(parameter) {
return axios({
url: '/sysDictType/add',
method: 'post',
data: parameter
})
}
/**
* 编辑系统字典类型
*
* @author yubaoshan
* @date 2020/5/17 01:50
*/
export function sysDictTypeEdit(parameter) {
return axios({
url: '/sysDictType/edit',
method: 'post',
data: parameter
})
}
/**
* 删除系统字典类型
*
* @author yubaoshan
* @date 2020/5/17 01:50
*/
export function sysDictTypeDelete(parameter) {
return axios({
url: '/sysDictType/delete',
method: 'post',
data: parameter
})
}
/**
* 获取字典类型下所有字典举例返回格式为[{code:"M",value:"男"},{code:"F",value:"女"}]
*
* @author yubaoshan
* @date 2020/6/10 00:10
*/
export function sysDictTypeDropDown(parameter) {
return axios({
url: '/sysDictType/dropDown',
method: 'get',
params: parameter
})
}
/**
* 获取所有字典启动时加入缓存使用
*
* @author yubaoshan
* @date 2020/6/10 00:10
*/
export function sysDictTypeTree(parameter) {
return axios({
url: '/sysDictType/tree',
method: 'get',
params: parameter
})
}
/**
* 修改系统字典状态
*
* @author xusn
* @date 2021-04-30 11:00:16
*/
export function sysDictTypeChangeStatus(parameter) {
return axios({
url: '/sysDictType/changeStatus',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,29 @@
import { axios } from '@/utils/request'
/**
* 发送邮件
*
* @author yubaoshan
* @date 2020/7/3 23:22
*/
export function emailSendEmail (parameter) {
return axios({
url: '/email/sendEmail',
method: 'post',
data: parameter
})
}
/**
* 发送html邮件
*
* @author yubaoshan
* @date 2020/7/3 23:23
*/
export function emailSendEmailHtml (parameter) {
return axios({
url: '/email/sendEmailHtml',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,29 @@
import { axios } from '@/utils/request'
/**
* 根据枚举名称获取枚举数据返回格式为[{code:"M",value:"男"},{code:"F",value:"女"}]
*
* @author taoran
* @date 2021-04-16 21:13/sysEnumData/list/{enumName}
*/
export function sysEnumDataList (parameter) {
return axios({
url: '/sysEnumData/list',
method: 'get',
params: parameter
})
}
/**
* 根据实体名和字段名获取枚举数据
*
* @author taoran
* @date 2021-04-16 21:13
*/
export function sysEnumDataListByField (parameter) {
return axios({
url: '/sysEnumData/listByFiled',
method: 'get',
params: parameter
})
}

View File

@ -0,0 +1,115 @@
import { axios } from '@/utils/request'
/**
* 分页查询文件信息表
*
* @author yubaoshan
* @date 2020/6/30 00:20
*/
export function sysFileInfoPage (parameter) {
return axios({
url: '/sysFileInfo/page',
method: 'get',
params: parameter
})
}
/**
* 获取全部文件信息表
*
* @author yubaoshan
* @date 2020/6/30 00:20
*/
export function sysFileInfoList (parameter) {
return axios({
url: '/sysFileInfo/list',
method: 'get',
params: parameter
})
}
/**
* 上传文件
*
* @author yubaoshan
* @date 2020/6/30 00:20
*/
export function sysFileInfoUpload (parameter) {
return axios({
url: '/sysFileInfo/upload',
method: 'post',
data: parameter
})
}
/**
* 下载文件
*
* @author yubaoshan
* @date 2020/6/30 00:20
*/
export function sysFileInfoDownload (parameter) {
return axios({
url: '/sysFileInfo/download',
method: 'get',
params: parameter,
responseType: 'blob'
})
}
/**
* 查看图片
*
* @author yubaoshan
* @date 2020/6/30 00:20
*/
export function sysFileInfoPreview (parameter) {
return axios({
url: '/sysFileInfo/preview',
method: 'get',
params: parameter,
responseType: 'arraybuffer'
})
}
/**
* 查看详情文件信息表
*
* @author yubaoshan
* @date 2020/6/30 00:20
*/
export function sysFileInfoDetail (parameter) {
return axios({
url: '/sysFileInfo/detail',
method: 'get',
params: parameter
})
}
/**
* 删除文件信息表
*
* @author yubaoshan
* @date 2020/6/30 00:20
*/
export function sysFileInfoDelete (parameter) {
return axios({
url: '/sysFileInfo/delete',
method: 'post',
data: parameter
})
}
/**
* 上传头像
*
* @author zuohuaijun
* @date 2021/4/23 00:20
*/
export function sysFileInfoUploadAvatar (parameter) {
return axios({
url: '/sysFileInfo/uploadAvatar',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,118 @@
/*
* @Author: your name
* @Date: 2021-04-17 17:45:37
* @LastEditTime: 2021-04-17 18:03:59
* @LastEditors: your name
* @Description: In User Settings Edit
* @FilePath: \frontend\src\api\modular\system\logManage.js
*/
import { axios } from '@/utils/request'
/**
* 查询访问日志
*
* @author yubaoshan
* @date 2020/5/19 11:57
*/
export function sysVisLogPage(parameter) {
return axios({
url: '/sysVisLog/page',
method: 'get',
params: parameter
})
}
/**
* 查询操作日志
*
* @author yubaoshan
* @date 2020/5/19 11:57
*/
export function sysOpLogPage(parameter) {
return axios({
url: '/sysOpLog/page',
method: 'get',
params: parameter
})
}
/**
* 查询异常日志
*
* @author yubaoshan
* @date 2020/5/19 11:57
*/
export function sysExLogPage(parameter) {
return axios({
url: '/sysExLog/page',
method: 'get',
params: parameter
})
}
/**
* 查询第三方日志
*
* @author liuzl
* @date 2020/5/19 11:57
*/
export function ThirdLogPage(parameter) {
return axios({
url: '/thirdlog/list',
method: 'post',
data: parameter
})
}
/**
* 清空访问日志
*
* @author yubaoshan
* @date 2020/6/23 23:09
*/
export function sysVisLogDelete(parameter) {
return axios({
url: '/sysVisLog/delete',
method: 'post',
data: parameter
})
}
/**
* 清空登录日志
*
* @author yubaoshan
* @date 2020/6/23 23:09
*/
export function sysOpLogDelete(parameter) {
return axios({
url: '/sysOpLog/delete',
method: 'post',
data: parameter
})
}
/**
* 清空异常日志
*
* @author yubaoshan
* @date 2020/6/23 23:09
*/
export function sysExLogDelete(parameter) {
return axios({
url: '/sysExLog/delete',
method: 'post',
data: parameter
})
}
/**
* 清空第三方日志
*
* @author liuzl
* @date 2020/6/23 23:09
*/
export function ThirdLogDelete(parameter) {
return axios({
url: '/third/clear',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,145 @@
/**
* 系统应用
*
* @author yubaoshan
* @date 2020/5/26 19:06
*/
import { axios } from '@/utils/request'
/**
* 登录
*
* @author yubaoshan
* @date 2020/5/26 19:06
*/
export function login (parameter) {
return axios({
url: '/login',
method: 'post',
data: parameter
})
}
/**
* 登出
*
* @author yubaoshan
* @date 2020/5/26 19:07
*/
export function logout (parameter) {
return axios({
url: '/logout',
method: 'get',
params: parameter
})
}
/**
* 获取登录用户信息
*
* @author yubaoshan
* @date 2020/5/26 19:08
*/
export function getLoginUser (parameter) {
return axios({
url: '/getLoginUser',
method: 'get',
params: parameter
})
}
/**
* 获取租户开关
*
* @author yubaoshan
* @date 2020/9/5 1:24
*/
export function getTenantOpen (parameter) {
return axios({
url: '/getTenantOpen',
method: 'get',
params: parameter
})
}
/**
* 获取短信验证码
*
* @author yubaoshan
* @date 2020/5/26 19:29
*/
export function getSmsCaptcha (parameter) {
return axios({
url: '/api/wxopen/sendcode',
method: 'get',
params: parameter
})
}
/**
* 扫码登录
*
* @author liuzl
* @date 2020/5/26 19:29
*/
export function WXLogin (parameter) {
return axios({
url: '/business/wxlogin',
method: 'post',
data: parameter
})
}
/**
* 获取微信扫码登录地址
*
* @author liuzl
* @date 2020/5/26 19:29
*/
export function WXLoginUrl (parameter) {
return axios({
url: '/business/getwxloginurl',
method: 'post',
data: parameter
})
}
/**
* 获取验证码开关
*
* @author Jax
* @date 2021/1/22 00:00
*/
export function getCaptchaOpen (parameter) {
return axios({
url: '/getCaptchaOpen',
method: 'get',
params: parameter
})
}
/**
* 获取验证图片 以及token
*
* @author Jax
* @date 2021/1/22 00:00
*/
export function reqGet(data) {
return axios({
url: '/captcha/get',
method: 'post',
data
})
}
/**
* 滑动或者点选验证
*
* @author Jax
* @date 2021/1/22 00:00
*/
export function reqCheck(data) {
return axios({
url: '/captcha/check',
method: 'post',
data
})
}

View File

@ -0,0 +1,32 @@
import {
axios
} from '@/utils/request'
/**
*
* 系统属性监控
*
*/
export function sysMachineUse(parameter) {
return axios({
url: '/sysMachine/use',
method: 'get',
params: parameter
})
}
export function sysMachineBase(parameter) {
return axios({
url: '/sysMachine/base',
method: 'get',
params: parameter
})
}
export function sysMachineNetwork(parameter) {
return axios({
url: '/sysMachine/network',
method: 'get',
params: parameter
})
}

View File

@ -0,0 +1,114 @@
import { axios } from '@/utils/request'
/**
* 获取菜单列表
*
* @author yubaoshan
* @param parameter
* @returns {*}
*/
export function getMenuList (parameter) {
return axios({
url: '/sysMenu/list',
method: 'get',
params: parameter
})
}
/**
* 获取系统菜单树用于新增编辑时选择上级节点
*
* @author yubaoshan
* @date 2020/4/23 12:22
*/
export function getMenuTree (parameter) {
return axios({
url: '/sysMenu/tree',
method: 'get',
params: parameter
})
}
/**
* 增加菜单
*
* @author yubaoshan
* @date 2020/4/24 23:23
*/
export function sysMenuAdd (parameter) {
return axios({
url: '/sysMenu/add',
method: 'post',
data: parameter
})
}
/**
* 增加菜单
*
* @author yubaoshan
* @date 2020/4/24 23:23
*/
export function sysMenuDelete (parameter) {
return axios({
url: '/sysMenu/delete',
method: 'post',
data: parameter
})
}
/**
* 查看菜单详情
*
* @author yubaoshan
* @date 2020/4/25 01:11
*/
export function sysMenuDetail (parameter) {
return axios({
url: '/sysMenu/detail',
method: 'post',
data: parameter
})
}
/**
* 编辑系统菜单
*
* @author yubaoshan
* @date 2020/4/25 01:11
*/
export function sysMenuEdit (parameter) {
return axios({
url: '/sysMenu/edit',
method: 'post',
data: parameter
})
}
/**
* 获取系统菜单树用于给角色授权时选择
*
* @author yubaoshan
* @date 2020/6/2 17:30
*/
export function SysMenuTreeForGrant (parameter) {
return axios({
url: '/sysMenu/treeForGrant',
method: 'get',
params: parameter
})
}
/**
* 根据系统切换菜单
*
* @author yubaoshan
* @date 2020/6/28 15:25
*/
export function sysMenuChange (parameter) {
return axios({
url: '/sysMenu/change',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,85 @@
import { axios } from '@/utils/request'
/**
* 查询系统通知公告
*
* @author yubaoshan
* @date 2020/6/30 01:56
*/
export function sysNoticePage (parameter) {
return axios({
url: '/sysNotice/page',
method: 'get',
params: parameter
})
}
/**
* 添加系统通知公告
*
* @author yubaoshan
* @date 2020/6/30 01:56
*/
export function sysNoticeAdd (parameter) {
return axios({
url: '/sysNotice/add',
method: 'post',
data: parameter
})
}
/**
* 编辑系统通知公告
*
* @author yubaoshan
* @date 2020/6/30 01:56
*/
export function sysNoticeEdit (parameter) {
return axios({
url: '/sysNotice/edit',
method: 'post',
data: parameter
})
}
/**
* 删除系统通知公告
*
* @author yubaoshan
* @date 2020/6/30 01:56
*/
export function sysNoticeDelete (parameter) {
return axios({
url: '/sysNotice/delete',
method: 'post',
data: parameter
})
}
/**
* 通知公告详情
*
* @author yubaoshan
* @date 2020/6/30 01:56
*/
export function sysNoticeDetail (parameter) {
return axios({
url: '/sysNotice/detail',
method: 'get',
params: parameter
})
}
/**
* 修改状态
*
* @author yubaoshan
* @date 2020/7/30 02:23
*/
export function sysNoticeChangeStatus (parameter) {
return axios({
url: '/sysNotice/changeStatus',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,24 @@
import { axios } from '@/utils/request'
/**
* 查询我收到的系统通知公告
*
* @author yubaoshan
* @date 2020/7/3 03:02
*/
export function sysNoticeReceived (parameter) {
return axios({
url: '/sysNotice/received',
method: 'get',
params: parameter
})
}
export function unReadNotice (parameter) {
return axios({
url: '/sysNotice/unread',
method: 'get',
params: parameter
})
}

View File

@ -0,0 +1,85 @@
import { axios } from '@/utils/request'
/**
* 获取机构树
*
* @author yubaoshan
* @date 2020/4/26 12:08
*/
export function getOrgTree (parameter) {
return axios({
url: '/sysOrg/tree',
method: 'get',
params: parameter
})
}
/**
* 获取机构列表
*
* @author yubaoshan
* @date 2020/5/11 12:59
*/
export function getOrgList (parameter) {
return axios({
url: '/sysOrg/list',
method: 'get',
params: parameter
})
}
/**
* 获取机构列表
*
* @author yubaoshan
* @date 2020/5/11 16:17
*/
export function getOrgPage (parameter) {
return axios({
url: '/sysOrg/page',
method: 'get',
params: parameter
})
}
/**
* 新增机构
*
* @author yubaoshan
* @date 2020/5/11 13:56
*/
export function sysOrgAdd (parameter) {
return axios({
url: '/sysOrg/add',
method: 'post',
data: parameter
})
}
/**
* 编辑机构
*
* @author yubaoshan
* @date 2020/5/11 13:56
*/
export function sysOrgEdit (parameter) {
return axios({
url: '/sysOrg/edit',
method: 'post',
data: parameter
})
}
/**
* 删除机构
*
* @author yubaoshan
* @date 2020/5/11 12:59
*/
export function sysOrgDelete (parameter) {
return axios({
url: '/sysOrg/delete',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,71 @@
import { axios } from '@/utils/request'
/**
* 查询系统职位
*
* @author yubaoshan
* @date 2020/5/25 01:31
*/
export function sysPosPage (parameter) {
return axios({
url: '/sysPos/page',
method: 'get',
params: parameter
})
}
/**
* 系统职位列表
*
* @author yubaoshan
* @date 2020/6/21 23:50
*/
export function sysPosList (parameter) {
return axios({
url: '/sysPos/list',
method: 'get',
params: parameter
})
}
/**
* 添加系统职位
*
* @author yubaoshan
* @date 2020/5/25 01:31
*/
export function sysPosAdd (parameter) {
return axios({
url: '/sysPos/add',
method: 'post',
data: parameter
})
}
/**
* 编辑系统职位
*
* @author yubaoshan
* @date 2020/5/25 01:31
*/
export function sysPosEdit (parameter) {
return axios({
url: '/sysPos/edit',
method: 'post',
data: parameter
})
}
/**
* 删除系统职位
*
* @author yubaoshan
* @date 2020/5/25 01:31
*/
export function sysPosDelete (parameter) {
return axios({
url: '/sysPos/delete',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,141 @@
import { axios } from '@/utils/request'
/**
* 获取角色列表
*
* @author yubaoshan
* @date 2020/5/6 11:44
*/
export function getRolePage (parameter) {
return axios({
url: '/sysRole/page',
method: 'get',
params: parameter
})
}
/**
* 增加角色
*
* @author yubaoshan
* @date 2020/5/6 11:44
*/
export function sysRoleAdd (parameter) {
return axios({
url: '/sysRole/add',
method: 'post',
data: parameter
})
}
/**
* 编辑角色
*
* @author yubaoshan
* @date 2020/5/6 11:44
*/
export function sysRoleEdit (parameter) {
return axios({
url: '/sysRole/edit',
method: 'post',
data: parameter
})
}
/**
* 删除角色
*
* @author yubaoshan
* @date 2020/5/6 17:51
*/
export function sysRoleDelete (parameter) {
return axios({
url: '/sysRole/delete',
method: 'post',
data: parameter
})
}
/**
* 删除角色
*
* @author yubaoshan
* @date 2020/5/7 11:28
*/
export function sysRoleDeteil (parameter) {
return axios({
url: '/sysRole/detail',
method: 'get',
params: parameter
})
}
/**
* 获取授权角色列表
*
* @author yubaoshan
* @date 2020/5/26 23:59
*/
export function sysRoleDropDown (parameter) {
return axios({
url: '/sysRole/dropDown',
method: 'get',
params: parameter
})
}
/**
* 拥有菜单
*
* @author yubaoshan
* @date 2020/6/02 19:02
*/
export function sysRoleOwnMenu (parameter) {
return axios({
url: '/sysRole/ownMenu',
method: 'get',
params: parameter
})
}
/**
* 授权菜单
*
* @author yubaoshan
* @date 2020/6/2 21:10
*/
export function sysRoleGrantMenu (parameter) {
return axios({
url: '/sysRole/grantMenu',
method: 'post',
data: parameter
})
}
/**
* 拥有数据
*
* @author yubaoshan
* @date 2020/6/02 21:40
*/
export function sysRoleOwnData (parameter) {
return axios({
url: '/sysRole/ownData',
method: 'get',
params: parameter
})
}
/**
* 授权数据
*
* @author yubaoshan
* @date 2020/6/2 21:50
*/
export function sysRoleGrantData (parameter) {
return axios({
url: '/sysRole/grantData',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,118 @@
/**
* 租户
*/
import {
axios
} from '@/utils/request'
/**
* 租户列表
*
*/
export function sysTenantPage(parameter) {
return axios({
url: '/sysTenant/page',
method: 'get',
params: parameter
})
}
/**
* 新增租户
*
*/
export function sysTenantAdd(parameter) {
return axios({
url: '/sysTenant/add',
method: 'post',
data: parameter
})
}
/**
* 删除租户
*
*/
export function sysTenantDelete(parameter) {
return axios({
url: '/sysTenant/delete',
method: 'post',
data: parameter
})
}
/**
* 编辑租户
*
*/
export function sysTenantEdit(parameter) {
return axios({
url: '/sysTenant/edit',
method: 'post',
data: parameter
})
}
/**
* 拥有菜单
*
* @author zuohuaijun
* @date 2021/04/22 10:30
*/
export function sysTenantOwnMenu (parameter) {
return axios({
url: '/sysTenant/ownMenu',
method: 'get',
params: parameter
})
}
/**
* 授权菜单
*
* @author zuohuaijun
* @date 2021/04/22 10:30
*/
export function sysTenantGrantMenu (parameter) {
return axios({
url: '/sysTenant/grantMenu',
method: 'post',
data: parameter
})
}
/**
* 重置密码
*
* @author zuohuaijun
* @date 2021/04/22 11:00
*/
export function sysTenantResetPwd (parameter) {
return axios({
url: '/sysTenant/resetPwd',
method: 'post',
data: parameter
})
}
/**
* 订单初始化
*
*/
export function OrderInit (parameter) {
return axios({
url: '/order/insertdefaultorder',
method: 'get',
params: parameter
})
}
/**
* 标准初始化
*
*/
export function StandInit (parameter) {
return axios({
url: '/order/insertdefaultstand',
method: 'get',
params: parameter
})
}

View File

@ -0,0 +1,286 @@
import { axios } from '@/utils/request'
/**
* 获取用户列表
*
* @author yubaoshan
* @date 2020/4/26 12:08
*/
export function getUserPage(parameter) {
return axios({
url: '/sysUser/page',
method: 'get',
params: parameter
})
}
/**
* 增加用户
*
* @author yubaoshan
* @date 2020/5/5 02:08
*/
export function sysUserAdd(parameter) {
return axios({
url: '/sysUser/add',
method: 'post',
data: parameter
})
}
/**
* 编辑用户
*
* @author yubaoshan
* @date 2020/5/5 02:08
*/
export function sysUserEdit(parameter) {
return axios({
url: '/sysUser/edit',
method: 'post',
data: parameter
})
}
/**
* 获取用户详情
*
* @author yubaoshan
* @date 2020/5/5 19:55
*/
export function sysUserDetail(parameter) {
return axios({
url: '/sysUser/detail',
method: 'get',
params: parameter
})
}
/**
* 删除用户
*
* @author yubaoshan
* @date 2020/5/7 19:31
*/
export function sysUserDelete(parameter) {
return axios({
url: '/sysUser/delete',
method: 'post',
data: parameter
})
}
/**
* 拥有角色
*
* @author yubaoshan
* @date 2020/6/3 11:58
*/
export function sysUserOwnRole(parameter) {
return axios({
url: '/sysUser/ownRole',
method: 'get',
params: parameter
})
}
// 用户拥有的VIP信息
export function sysUserOwnVIP(parameter) {
return axios({
url: '/sysUser/ownVIP',
method: 'post',
data: parameter
})
}
// 用户拥有的企业信息
export function sysUserOwnCom(parameter) {
return axios({
url: '/sysUser/owncom',
method: 'post',
data: parameter
})
}
// 用户拥有的企业信息提交
export function sysUserSubmitCom(parameter) {
return axios({
url: '/sysUser/submitCom',
method: 'post',
data: parameter
})
}
/**
* 授权角色
*
* @author yubaoshan
* @date 2020/5/26 23:59
*/
export function sysUserGrantRole(parameter) {
return axios({
url: '/sysUser/grantRole',
method: 'post',
data: parameter
})
}
// 授权VIP
export function sysUserGrantVIP(parameter) {
return axios({
url: '/sysUser/grantvip',
method: 'post',
data: parameter
})
}
/**
* 拥有数据
*
* @author yubaoshan
* @date 2020/6/2 23:14
*/
export function sysUserOwnData(parameter) {
return axios({
url: '/sysUser/ownData',
method: 'get',
params: parameter
})
}
/**
* 授权数据
*
* @author yubaoshan
* @date 2020/6/2 23:15
*/
export function sysUserGrantData(parameter) {
return axios({
url: '/sysUser/grantData',
method: 'post',
data: parameter
})
}
/**
* 修改状态
*
* @author yubaoshan
* @date 2020/6/23 21:36
*/
export function sysUserChangeStatus(parameter) {
return axios({
url: '/sysUser/changeStatus',
method: 'post',
data: parameter
})
}
/**
* 重置密码
*
* @author yubaoshan
* @date 2020/6/23 22:04
*/
export function sysUserResetPwd(parameter) {
return axios({
url: '/sysUser/resetPwd',
method: 'post',
data: parameter
})
}
/**
* 修改密码
*
* @author yubaoshan
* @date 2020/6/25 00:25
*/
export function sysUserUpdatePwd(parameter) {
return axios({
url: '/sysUser/updatePwd',
method: 'post',
data: parameter
})
}
/**
* 用户选择器
*
* @author yubaoshan
* @date 2020/6/25 00:25
*/
export function sysUserSelector(parameter) {
return axios({
url: '/sysUser/selector',
method: 'get',
params: parameter
})
}
/**
* 修改头像
*
* @author yubaoshan
* @date 2020/9/20 2:21
*/
export function sysUserUpdateAvatar(parameter) {
return axios({
url: '/sysUser/updateAvatar',
method: 'post',
data: parameter
})
}
/**
* 更新基本信息
*
* @author yubaoshan
* @date 2020/9/20 03:12
*/
export function sysUserUpdateInfo(parameter) {
return axios({
url: '/sysUser/updateInfo',
method: 'post',
data: parameter
})
}
/**
* 导出用户信息
*
* @author zuohuaijun
* @date 2021/4/20 01:00
*/
export function sysUserExport(parameter) {
return axios({
url: '/sysUser/export',
method: 'get',
data: parameter,
responseType: 'blob'
})
}
/**
* 导入用户信息
*
* @author zuohuaijun
* @date 2021/4/20 01:00
*/
export function sysUserImport(parameter) {
return axios({
url: '/sysUser/import',
method: 'post',
data: parameter
})
}
// 获取用户入会申请列表
export function getUserSupplyForList(parameter) {
return axios({
url: '/sysUser/supplyforlist',
method: 'post',
data: parameter
})
}
// 入会状态修改
export function SupplyForStatus(parameter) {
return axios({
url: '/sysUser/supplyforstatus',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1551058675966" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7872" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M85.333333 512h85.333334a340.736 340.736 0 0 1 99.712-241.621333 337.493333 337.493333 0 0 1 108.458666-72.96 346.453333 346.453333 0 0 1 261.546667-1.749334A106.154667 106.154667 0 0 0 746.666667 298.666667C805.802667 298.666667 853.333333 251.136 853.333333 192S805.802667 85.333333 746.666667 85.333333c-29.397333 0-55.978667 11.776-75.221334 30.933334-103.722667-41.514667-222.848-40.874667-325.76 2.517333a423.594667 423.594667 0 0 0-135.68 91.264 423.253333 423.253333 0 0 0-91.306666 135.637333A426.88 426.88 0 0 0 85.333333 512z m741.248 133.205333c-17.109333 40.618667-41.685333 77.141333-72.96 108.416s-67.797333 55.850667-108.458666 72.96a346.453333 346.453333 0 0 1-261.546667 1.749334A106.154667 106.154667 0 0 0 277.333333 725.333333C218.197333 725.333333 170.666667 772.864 170.666667 832S218.197333 938.666667 277.333333 938.666667c29.397333 0 55.978667-11.776 75.221334-30.933334A425.173333 425.173333 0 0 0 512 938.666667a425.941333 425.941333 0 0 0 393.258667-260.352A426.325333 426.325333 0 0 0 938.666667 512h-85.333334a341.034667 341.034667 0 0 1-26.752 133.205333z" p-id="7873"></path><path d="M512 318.378667c-106.752 0-193.621333 86.869333-193.621333 193.621333S405.248 705.621333 512 705.621333s193.621333-86.869333 193.621333-193.621333S618.752 318.378667 512 318.378667z m0 301.909333c-59.690667 0-108.288-48.597333-108.288-108.288S452.309333 403.712 512 403.712s108.288 48.597333 108.288 108.288-48.597333 108.288-108.288 108.288z" p-id="7874"></path></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
admin/src/assets/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

569
admin/src/assets/logo.svg Normal file
View File

@ -0,0 +1,569 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="2518px" height="2552px" viewBox="0 0 2518 2552" enable-background="new 0 0 2518 2552" xml:space="preserve"> <image id="image0" width="2518" height="2552" x="0" y="0"
href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAACdYAAAn4CAMAAABJTpMMAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAV1BMVEX////3sDH3sDH3sDHk
JyjkJygxWpsxWpvkJygxWpv3sDHkJygxWptTaqVufbGUm8OgpcutsdHR0uW5vNhgc6v////09Pl7
h7eIkL3p6fPd3uxBYqDFx96PvGBXAAAACnRSTlMAQIAgIEAgQICAaHjDwwAAAAFiS0dEAIgFHUgA
AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfnCB4CCi5intvcAAB8AUlEQVR42u392Xoj2xGl
W2bmqTqnskrsmWADvv9zlrba3USDIDF9utsa41Y3kozh/n/AsoX/8T//FwAAh/c//8f/+v8CAHB4
/0vWAQBMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6
AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCC
rAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAA
I8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkH
ADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQ
dQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBg
BFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsA
AEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiy
DgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCM
IOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0A
wAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHW
AQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIAR
ZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMA
GEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6
AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCC
rAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAA
I8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkH
ADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQ
dQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBg
BFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsA
AEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiy
DgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCM
IOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0A
wAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHW
AQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIAR
ZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMA
GEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6
AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCC
rAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAA
I8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkH
ADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQ
dQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBg
BFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsA
AEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiy
DgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCM
IOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0A
wAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHW
AQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIAR
ZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMA
GEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6
AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCC
rAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAA
I8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkH
ADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQ
dQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBg
BFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsA
AEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiy
DgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCM
IOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0A
wAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHW
AQCMIOsAAEaQdQAAI8g6AIARZB0AwAiyDgBgBFkHADCCrAMAGEHWAQCMIOsAAEaQdQAAI8g6AIAR
ZB0AwAiyDgBgBFkHADCCrAMAGOF//Y//638CAHB4/9f/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
SGm3mqzbh4/2qwXokHUNso6UdqvJul24b79ZgBJZ1yDrSGm3mqzbg5f2iwVokXUNso6UdqvJuh14
ti4By5J1DbKOlHarybo+6xKwMFnXIOtIabearOt7bL9WgB5Z1yDrSGm3mqyre2i/VYAiWdcg60hp
t5qsazu3XypAk6xrkHWktFtN1rXZgoWlyboGWUdKu9VkXZsr62Bpsq5B1pHSbjVZ12ZhApYm6xpk
HSntVpN1be6sg6XJugZZR0q71WRd2XP7nQJUyboGWUdKu9VkXZmNCVibrGuQdaS0W03WldmYgLXJ
ugZZR0q71WRdmY0JWJusa5B1pLRbTdaVvbXfKUCVrGuQdaS0W03WlbVfKUCXrGuQdaS0W03Wdd22
XylAl6xrkHWktFtN1nW9tl8pQJesa5B1pLRbTdZ1WYSFxcm6BllHSrvVZF3XR/uVAnTJugZZR0q7
1WRdl/tNYHGyrkHWkdJuNVnX1X6jAGWyrkHWkdJuNVnX1X6jAGWyrkHWkdJuNVlX5X4TWJ2sa5B1
pLRbTdZVyTpYnaxrkHWktFtN1lXdtd8oQJmsa5B1pLRbTdZVubYOVifrGmQdKe1Wk3VVT+03ClAm
6xpkHSntVpN1Va6tg9XJugZZR0q71WRdlayD1cm6BllHSrvVZF3Vqf1GAcpkXYOsI6XdarKuqv1C
AdpkXYOsI6XdarKuqv1CAdpkXYOsI6XdarKu6ab9QgHaZF2DrCOl3WqyrsmPTMDyZF2DrCOl3Wqy
rknWwfJkXYOsI6XdarKuSdbB8mRdg6wjpd1qsq7ppf1CAdpkXYOsI6XdarKuyU/CwvJkXYOsI6Xd
arKuSdbB8mRdg6wjpd1qsq5J1sHyZF2DrCOl3WqyrknWwfJkXYOsI6XdarKuSdbB8mRdg6wjpd1q
sq5J1sHyZF2DrCOl3WqyrknWwfJkXYOsI6XdarKuSdbB8mRdg6wjpd1qsq5J1sHyZF2DrCOl3Wqy
rknWwfJkXYOsI6XdarKuSdbB8mRdg6wjpd1qsq5J1sHyZF2DrCOl3WqyrknWwfJkXYOsI6XdarKu
SdbB8mRdg6wjpd1qsq5J1sHyZF2DrCOl3WqyrknWwfJkXYOsI6XdarKuSdbB8mRdg6wjpd1qsq5J
1sHyZF2DrCOl3WqyrknWwfJkXYOsI6XdarKu6a79QgHaZF2DrCOl3Wqyrum2/UIB2mRdg6wjpd1q
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
abearANgMbKOlHaryToAFiPrSGm3mqwDYDGyjpR2q8k6ABYj60hpt5qsA2Axso6UdqvJOgAWI+tI
abearANgMbKOlHaryToAFiPrSGm3mqwDYDGyjpR2q8k6ABYj60hpt5qsA2Axso6UdqvJOgAWI+tI
abearANgMbKOlHaryToAFiPrSGm3mqwDYDGyjpR2q8k6ABYj60hpt5qsA2Axso6UdqvJOgAWI+tI
abearANgMbKOlHaryToAFiPrSGm3mqwDYDGyjpR2q8k6ABYj60hpt5qsA2Axso6UdqvJOgAWI+tI
abearANgMbKOlHaryToAFiPrSGm3mqwDYDGyjpR2q8k6ABYj60hpt5qsA2Axso6UdqvJOgAWI+tI
abearANgMbKOlHaryToAFiPrSGm3mqwDYDGyjpR2q8k6ABYj60hpt5qsA2Axso6UdqvJOgAWI+tI
abearANgMbKOlHaryToAFiPrSGm3mqwDYDGyjpR2q8k6ABYj60hpt5qsA2Axso6UdqvJOgAWI+tI
abearANgMbKOlHaryToAFiPrSGm3mqwDYDGyjpR2q8k6ABYj60hpt5qsA2Axso6UdqvJOgAWI+tI
abearANgMbKOlHaryToAFiPrSGm3mqwDYDGyjpR2q8k6ABYj60hpt5qsA2Axso6UdqvJOgAWI+tI
abearANgMbKOlHaryToAFiPrSGm3mqwDYDGyjpR2q8k6ABYj60hpt5qsA2Axso6UdqvJOgAWI+tI
abearANgMbKOlHaryToAFiPrSGm3mqwDYDGyjpR2q8k6ABYj60hpt5qsA2Axso6UdqvJOgAWI+tI
abearANgMbKOlHaryToAFiPrSGm3mqwDYDGyjpR2q8k6ABYj60hpt5qsA2Axso6UdqvJOgAWI+tI
abearANgMbKOlHaryToAFiPrSGm3mqwDYDGyjpR2q8k6ABYj60hpt5qsA2Axso6UdqvJOgAWI+tI
abearANgMbKOlHaryToAFiPrSGm3mqwDYDGyjpR2q8k6ABYj60hpt5qsA2Axso6UdqvJOgAWI+tI
abearANgMbKOlHaryToAFiPrSGm3mqwDYDGyjpR2q8k6ABYj60hpt5qsA2Axso6UdqvJOgAWI+tI
abearANgMbKOlHaryToAFiPrSGm3mqwDYDGyjpR2q8k6ABYj60hpt5qsA2Axso6UdqvJOgAWI+tI
abearANgMbKOlHaryToAFiPrSGm3mqwDYDGyjpR2q8k6ABYj60hpt5qsA2Axso6UdqvJOgAWI+tI
abearANgMbKOlHaryToAFiPrSGm3mqwDYDGyjpR2q8k6ABbzv///irjCHNbg1MoAAAAldEVYdGRh
dGU6Y3JlYXRlADIwMjMtMDgtMzBUMDI6MTA6NDErMDA6MDDsMOJ2AAAAJXRFWHRkYXRlOm1vZGlm
eQAyMDIzLTA4LTMwVDAyOjEwOjQxKzAwOjAwnW1aygAAACh0RVh0ZGF0ZTp0aW1lc3RhbXAAMjAy
My0wOC0zMFQwMjoxMDo0NCswMDowMJhAVLIAAAAASUVORK5CYII=" />
</svg>

After

Width:  |  Height:  |  Size: 43 KiB

BIN
admin/src/assets/notice.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1 @@
code
1 code

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -0,0 +1,89 @@
<template>
<div class="antd-pro-components-article-list-content-index-listContent">
<div class="description">
<slot>
{{ description }}
</slot>
</div>
<div class="extra">
<a-avatar :src="avatar" size="small" />
<a :href="href">{{ owner }}</a> 发布在 <a :href="href">{{ href }}</a>
<em>{{ updateAt | moment }}</em>
</div>
</div>
</template>
<script>
export default {
name: 'ArticleListContent',
props: {
prefixCls: {
type: String,
default: 'antd-pro-components-article-list-content-index-listContent'
},
description: {
type: String,
default: ''
},
owner: {
type: String,
required: true
},
avatar: {
type: String,
required: true
},
href: {
type: String,
required: true
},
updateAt: {
type: String,
required: true
}
}
}
</script>
<style lang="less" scoped>
@import '../index.less';
.antd-pro-components-article-list-content-index-listContent {
.description {
max-width: 720px;
line-height: 22px;
}
.extra {
margin-top: 16px;
color: @text-color-secondary;
line-height: 22px;
& /deep/ .ant-avatar {
position: relative;
top: 1px;
width: 20px;
height: 20px;
margin-right: 8px;
vertical-align: top;
}
& > em {
margin-left: 16px;
color: @disabled-color;
font-style: normal;
}
}
}
@media screen and (max-width: @screen-xs) {
.antd-pro-components-article-list-content-index-listContent {
.extra {
& > em {
display: block;
margin-top: 8px;
margin-left: 0;
}
}
}
}
</style>

View File

@ -0,0 +1,3 @@
import ArticleListContent from './ArticleListContent'
export default ArticleListContent

View File

@ -0,0 +1,46 @@
<template>
<tooltip v-if="tips !== ''">
<template slot="title">{{ tips }}</template>
<avatar :size="avatarSize" :src="src" />
</tooltip>
<avatar v-else :size="avatarSize" :src="src" />
</template>
<script>
import Avatar from 'ant-design-vue/es/avatar'
import Tooltip from 'ant-design-vue/es/tooltip'
export default {
name: 'AvatarItem',
components: {
Avatar,
Tooltip
},
props: {
tips: {
type: String,
default: '',
required: false
},
src: {
type: String,
default: ''
}
},
data () {
return {
size: this.$parent.size
}
},
computed: {
avatarSize () {
return this.size !== 'mini' && this.size || 20
}
},
watch: {
'$parent.size' (val) {
this.size = val
}
}
}
</script>

View File

@ -0,0 +1,99 @@
<!--
<template>
<div :class="[prefixCls]">
<ul>
<slot></slot>
<template v-for="item in filterEmpty($slots.default).slice(0, 3)"></template>
<template v-if="maxLength > 0 && filterEmpty($slots.default).length > maxLength">
<avatar-item :size="size">
<avatar :size="size !== 'mini' && size || 20" :style="excessItemsStyle">{{ `+${maxLength}` }}</avatar>
</avatar-item>
</template>
</ul>
</div>
</template>
-->
<script>
import Avatar from 'ant-design-vue/es/avatar'
import AvatarItem from './Item'
import { filterEmpty } from '@/components/_util/util'
export default {
AvatarItem,
name: 'AvatarList',
components: {
Avatar,
AvatarItem
},
props: {
prefixCls: {
type: String,
default: 'ant-pro-avatar-list'
},
/**
* 头像大小 类型: largesmall mini, default
* 默认值: default
*/
size: {
type: [String, Number],
default: 'default'
},
/**
* 要显示的最大项目
*/
maxLength: {
type: Number,
default: 0
},
/**
* 多余的项目风格
*/
excessItemsStyle: {
type: Object,
default: () => {
return {
color: '#f56a00',
backgroundColor: '#fde3cf'
}
}
}
},
data () {
return {}
},
methods: {
getItems (items) {
const classString = {
[`${this.prefixCls}-item`]: true,
[`${this.size}`]: true
}
if (this.maxLength > 0) {
items = items.slice(0, this.maxLength)
items.push((<Avatar size={ this.size } style={ this.excessItemsStyle }>{`+${this.maxLength}`}</Avatar>))
}
const itemList = items.map((item) => (
<li class={ classString }>{ item }</li>
))
return itemList
}
},
render () {
const { prefixCls, size } = this.$props
const classString = {
[`${prefixCls}`]: true,
[`${size}`]: true
}
const items = filterEmpty(this.$slots.default)
const itemsDom = items && items.length ? <ul class={`${prefixCls}-items`}>{ this.getItems(items) }</ul> : null
return (
<div class={ classString }>
{ itemsDom }
</div>
)
}
}
</script>

View File

@ -0,0 +1,4 @@
import AvatarList from './List'
import './index.less'
export default AvatarList

View File

@ -0,0 +1,60 @@
@import "../index";
@avatar-list-prefix-cls: ~"@{ant-pro-prefix}-avatar-list";
@avatar-list-item-prefix-cls: ~"@{ant-pro-prefix}-avatar-list-item";
.@{avatar-list-prefix-cls} {
display: inline-block;
ul {
list-style: none;
display: inline-block;
padding: 0;
margin: 0 0 0 8px;
font-size: 0;
}
}
.@{avatar-list-item-prefix-cls} {
display: inline-block;
font-size: @font-size-base;
margin-left: -8px;
width: @avatar-size-base;
height: @avatar-size-base;
:global {
.ant-avatar {
border: 1px solid #fff;
cursor: pointer;
}
}
&.large {
width: @avatar-size-lg;
height: @avatar-size-lg;
}
&.small {
width: @avatar-size-sm;
height: @avatar-size-sm;
}
&.mini {
width: 20px;
height: 20px;
:global {
.ant-avatar {
width: 20px;
height: 20px;
line-height: 20px;
.ant-avatar-string {
font-size: 12px;
line-height: 18px;
}
}
}
}
}

View File

@ -0,0 +1,64 @@
# AvatarList 用户头像列表
一组用户头像,常用在项目/团队成员列表。可通过设置 `size` 属性来指定头像大小。
引用方式:
```javascript
import AvatarList from '@/components/AvatarList'
const AvatarListItem = AvatarList.AvatarItem
export default {
components: {
AvatarList,
AvatarListItem
}
}
```
## 代码演示 [demo](https://pro.loacg.com/test/home)
```html
<avatar-list size="mini">
<avatar-list-item tips="Jake" src="https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png" />
<avatar-list-item tips="Andy" src="https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png" />
<avatar-list-item tips="Niko" src="https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png" />
</avatar-list>
```
```html
<avatar-list :max-length="3">
<avatar-list-item tips="Jake" src="https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png" />
<avatar-list-item tips="Andy" src="https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png" />
<avatar-list-item tips="Niko" src="https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png" />
<avatar-list-item tips="Niko" src="https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png" />
<avatar-list-item tips="Niko" src="https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png" />
<avatar-list-item tips="Niko" src="https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png" />
<avatar-list-item tips="Niko" src="https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png" />
</avatar-list>
```
## API
### AvatarList
| 参数 | 说明 | 类型 | 默认值 |
| ---------------- | -------- | ---------------------------------- | --------- |
| size | 头像大小 | `large`、`small` 、`mini`, `default` | `default` |
| maxLength | 要显示的最大项目 | number | - |
| excessItemsStyle | 多余的项目风格 | CSSProperties | - |
### AvatarList.Item
| 参数 | 说明 | 类型 | 默认值 |
| ---- | ------ | --------- | --- |
| tips | 头像展示文案 | string | - |
| src | 头像图片连接 | string | - |

View File

@ -0,0 +1,62 @@
<template>
<div :style="{ padding: '0 0 32px 32px' }">
<h4 :style="{ marginBottom: '20px' }">{{ title }}</h4>
<v-chart
height="254"
:data="data"
:forceFit="true"
:padding="['auto', 'auto', '40', '50']">
<v-tooltip/>
<v-axis :show="true"/>
<v-bar position="x*y"/>
</v-chart>
</div>
</template>
<script>
export default {
name: 'Bar',
props: {
title: {
type: String,
default: ''
},
data: {
type: Array,
default: () => {
return []
}
},
scale: {
type: Array,
default: () => {
return [{
dataKey: 'x',
min: 2
}, {
dataKey: 'y',
title: '时间',
min: 1,
max: 22
}]
}
},
tooltip: {
type: Array,
default: () => {
return [
'x*y',
(x, y) => ({
name: x,
value: y
})
]
}
}
},
data () {
return {
}
}
}
</script>

View File

@ -0,0 +1,124 @@
<template>
<a-card :loading="loading" :body-style="{ padding: '20px 24px 8px' }" :bordered="false">
<div class="chart-card-header">
<div class="meta">
<span class="chart-card-title">
<slot name="title">
{{ title }}
</slot>
</span>
<span class="chart-card-action">
<slot name="action"></slot>
</span>
</div>
<div class="total">
<slot name="total">
<span>{{ typeof total === 'function' && total() || total }}</span>
</slot>
</div>
</div>
<div class="chart-card-content" v-if="content">
<div class="content-fix">
<slot></slot>
</div>
</div>
<div class="chart-card-footer">
<div class="field">
<slot name="footer"></slot>
</div>
</div>
</a-card>
</template>
<script>
export default {
name: 'ChartCard',
props: {
title: {
type: String,
default: ''
},
total: {
type: [Function, Number, String],
required: false,
default: null
},
loading: {
type: Boolean,
default: false
},
content: {
type: Boolean,
default: true
}
}
}
</script>
<style lang="less" scoped>
.chart-card-header {
position: relative;
overflow: hidden;
width: 100%;
.meta {
position: relative;
overflow: hidden;
width: 100%;
color: rgba(0, 0, 0, .45);
font-size: 14px;
line-height: 22px;
}
}
.chart-card-action {
cursor: pointer;
position: absolute;
top: 0;
right: 0;
}
.chart-card-footer {
border-top: 1px solid #e8e8e8;
padding-top: 9px;
margin-top: 8px;
> * {
position: relative;
}
.field {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
margin: 0;
}
}
.chart-card-content {
margin-bottom: 12px;
position: relative;
height: 46px;
width: 100%;
.content-fix {
position: absolute;
left: 0;
bottom: 0;
width: 100%;
}
}
.total {
overflow: hidden;
text-overflow: ellipsis;
word-break: break-all;
white-space: nowrap;
color: #000;
margin-top: 4px;
margin-bottom: 0;
font-size: 30px;
line-height: 38px;
height: 38px;
}
</style>

View File

@ -0,0 +1,67 @@
<template>
<div>
<v-chart
:forceFit="true"
:height="height"
:width="width"
:data="data"
:scale="scale"
:padding="0">
<v-tooltip />
<v-interval
:shape="['liquid-fill-gauge']"
position="transfer*value"
color=""
:v-style="{
lineWidth: 10,
opacity: 0.75
}"
:tooltip="[
'transfer*value',
(transfer, value) => {
return {
name: transfer,
value,
};
},
]"
></v-interval>
<v-guide
v-for="(row, index) in data"
:key="index"
type="text"
:top="true"
:position="{
gender: row.transfer,
value: 45
}"
:content="row.value + '%'"
:v-style="{
fontSize: 100,
textAlign: 'center',
opacity: 0.75,
}"
/>
</v-chart>
</div>
</template>
<script>
export default {
name: 'Liquid',
props: {
height: {
type: Number,
default: 0
},
width: {
type: Number,
default: 0
}
}
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,75 @@
<template>
<div class="chart-mini-progress">
<div class="target" :style="{ left: target + '%'}">
<span :style="{ backgroundColor: color }" />
<span :style="{ backgroundColor: color }"/>
</div>
<div class="progress-wrapper">
<div class="progress" :style="{ backgroundColor: color, width: percentage + '%', height: height }"></div>
</div>
</div>
</template>
<script>
export default {
name: 'MiniProgress',
props: {
target: {
type: Number,
default: 0
},
height: {
type: String,
default: '10px'
},
color: {
type: String,
default: '#13C2C2'
},
percentage: {
type: Number,
default: 0
}
}
}
</script>
<style lang="less" scoped>
.chart-mini-progress {
padding: 5px 0;
position: relative;
width: 100%;
.target {
position: absolute;
top: 0;
bottom: 0;
span {
border-radius: 100px;
position: absolute;
top: 0;
left: 0;
height: 4px;
width: 2px;
&:last-child {
top: auto;
bottom: 0;
}
}
}
.progress-wrapper {
background-color: #f5f5f5;
position: relative;
.progress {
transition: all .4s cubic-bezier(.08,.82,.17,1) 0s;
border-radius: 1px 0 0 1px;
background-color: #1890ff;
width: 0;
height: 100%;
}
}
}
</style>

View File

@ -0,0 +1,40 @@
<template>
<div :class="prefixCls">
<div class="chart-wrapper" :style="{ height: 46 }">
<v-chart :force-fit="true" :height="100" :data="dataSource" :scale="scale" :padding="[36, 0, 18, 0]">
<v-tooltip />
<v-smooth-line position="x*y" :size="2" />
<v-smooth-area position="x*y" />
</v-chart>
</div>
</div>
</template>
<script>
export default {
name: 'MiniSmoothArea',
props: {
prefixCls: {
type: String,
default: 'ant-pro-smooth-area'
},
scale: {
type: [Object, Array],
required: true
},
dataSource: {
type: Array,
required: true
}
},
data () {
return {
height: 100
}
}
}
</script>
<style lang="less" scoped>
@import "smooth.area.less";
</style>

View File

@ -0,0 +1,68 @@
<template>
<v-chart :forceFit="true" height="400" :data="data" :padding="[20, 20, 95, 20]" :scale="scale">
<v-tooltip></v-tooltip>
<v-axis :dataKey="axis1Opts.dataKey" :line="axis1Opts.line" :tickLine="axis1Opts.tickLine" :grid="axis1Opts.grid" />
<v-axis :dataKey="axis2Opts.dataKey" :line="axis2Opts.line" :tickLine="axis2Opts.tickLine" :grid="axis2Opts.grid" />
<v-legend dataKey="user" marker="circle" :offset="30" />
<v-coord type="polar" radius="0.8" />
<v-line position="item*score" color="user" :size="2" />
<v-point position="item*score" color="user" :size="4" shape="circle" />
</v-chart>
</template>
<script>
const axis1Opts = {
dataKey: 'item',
line: null,
tickLine: null,
grid: {
lineStyle: {
lineDash: null
},
hideFirstLine: false
}
}
const axis2Opts = {
dataKey: 'score',
line: null,
tickLine: null,
grid: {
type: 'polygon',
lineStyle: {
lineDash: null
}
}
}
const scale = [
{
dataKey: 'score',
min: 0,
max: 80
}, {
dataKey: 'user',
alias: '类型'
}
]
export default {
name: 'Radar',
props: {
data: {
type: Array,
default: null
}
},
data () {
return {
axis1Opts,
axis2Opts,
scale
}
}
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,77 @@
<template>
<div class="rank">
<h4 class="title">{{ title }}</h4>
<ul class="list">
<li :key="index" v-for="(item, index) in list">
<span :class="index < 3 ? 'active' : null">{{ index + 1 }}</span>
<span>{{ item.name }}</span>
<span>{{ item.total }}</span>
</li>
</ul>
</div>
</template>
<script>
export default {
name: 'RankList',
// ['title', 'list']
props: {
title: {
type: String,
default: ''
},
list: {
type: Array,
default: null
}
}
}
</script>
<style lang="less" scoped>
.rank {
padding: 0 32px 32px 72px;
.list {
margin: 25px 0 0;
padding: 0;
list-style: none;
li {
margin-top: 16px;
span {
color: rgba(0, 0, 0, .65);
font-size: 14px;
line-height: 22px;
&:first-child {
background-color: #f5f5f5;
border-radius: 20px;
display: inline-block;
font-size: 12px;
font-weight: 600;
margin-right: 24px;
height: 20px;
line-height: 20px;
width: 20px;
text-align: center;
}
&.active {
background-color: #314659;
color: #fff;
}
&:last-child {
float: right;
}
}
}
}
}
.mobile .rank {
padding: 0 32px 32px 32px;
}
</style>

View File

@ -0,0 +1,64 @@
<template>
<div :style="{ padding: '0 0 32px 32px' }">
<h4 :style="{ marginBottom: '20px' }">{{ title }}</h4>
<v-chart
height="254"
:data="data"
:scale="scale"
:forceFit="true"
:padding="['auto', 'auto', '40', '50']">
<v-tooltip />
<v-axis />
<v-bar position="x*y"/>
</v-chart>
</div>
</template>
<script>
const tooltip = [
'x*y',
(x, y) => ({
name: x,
value: y
})
]
const scale = [{
dataKey: 'x',
title: '日期(天)',
alias: '日期(天)',
min: 2
}, {
dataKey: 'y',
title: '流量(Gb)',
alias: '流量(Gb)',
min: 1
}]
export default {
name: 'Bar',
props: {
title: {
type: String,
default: ''
}
},
data () {
return {
data: [],
scale,
tooltip
}
},
created () {
this.getMonthBar()
},
methods: {
getMonthBar () {
this.$http.get('/analysis/month-bar')
.then(res => {
this.data = res.result
})
}
}
}
</script>

View File

@ -0,0 +1,82 @@
<template>
<div class="chart-trend">
{{ term }}
<span>{{ rate }}%</span>
<span :class="['trend-icon', trend]"><a-icon :type="'caret-' + trend"/></span>
</div>
</template>
<script>
export default {
name: 'Trend',
props: {
term: {
type: String,
default: '',
required: true
},
percentage: {
type: Number,
default: null
},
type: {
type: Boolean,
default: null
},
target: {
type: Number,
default: 0
},
value: {
type: Number,
default: 0
},
fixed: {
type: Number,
default: 2
}
},
data () {
return {
trend: this.type && 'up' || 'down',
rate: this.percentage
}
},
created () {
const type = this.type === null ? this.value >= this.target : this.type
this.trend = type ? 'up' : 'down'
this.rate = (this.percentage === null ? Math.abs(this.value - this.target) * 100 / this.target : this.percentage).toFixed(this.fixed)
}
}
</script>
<style lang="less" scoped>
.chart-trend {
display: inline-block;
font-size: 14px;
line-height: 22px;
.trend-icon {
font-size: 12px;
&.up, &.down {
margin-left: 4px;
position: relative;
top: 1px;
i {
font-size: 12px;
transform: scale(.83);
}
}
&.up {
color: #f5222d;
}
&.down {
color: #52c41a;
top: -1px;
}
}
}
</style>

View File

@ -0,0 +1,13 @@
.antv-chart-mini {
position: relative;
width: 100%;
.chart-wrapper {
position: absolute;
bottom: -28px;
width: 100%;
/* margin: 0 -5px;
overflow: hidden;*/
}
}

View File

@ -0,0 +1,14 @@
@import "../index";
@smoothArea-prefix-cls: ~"@{ant-pro-prefix}-smooth-area";
.@{smoothArea-prefix-cls} {
position: relative;
width: 100%;
.chart-wrapper {
position: absolute;
bottom: -28px;
width: 100%;
}
}

View File

@ -0,0 +1,102 @@
<template>
<span>
{{ lastTime | format }}
</span>
</template>
<script>
function fixedZero (val) {
return val * 1 < 10 ? `0${val}` : val
}
export default {
name: 'CountDown',
props: {
format: {
type: Function,
default: undefined
},
target: {
type: [Date, Number],
required: true
},
onEnd: {
type: Function,
default: () => ({})
}
},
data () {
return {
dateTime: '0',
originTargetTime: 0,
lastTime: 0,
timer: 0,
interval: 1000
}
},
filters: {
format (time) {
const hours = 60 * 60 * 1000
const minutes = 60 * 1000
const h = Math.floor(time / hours)
const m = Math.floor((time - h * hours) / minutes)
const s = Math.floor((time - h * hours - m * minutes) / 1000)
return `${fixedZero(h)}:${fixedZero(m)}:${fixedZero(s)}`
}
},
created () {
this.initTime()
this.tick()
},
methods: {
initTime () {
let lastTime = 0
let targetTime = 0
this.originTargetTime = this.target
try {
if (Object.prototype.toString.call(this.target) === '[object Date]') {
targetTime = this.target
} else {
targetTime = new Date(this.target).getTime()
}
} catch (e) {
throw new Error('invalid target prop')
}
lastTime = targetTime - new Date().getTime()
this.lastTime = lastTime < 0 ? 0 : lastTime
},
tick () {
const { onEnd } = this
this.timer = setTimeout(() => {
if (this.lastTime < this.interval) {
clearTimeout(this.timer)
this.lastTime = 0
if (typeof onEnd === 'function') {
onEnd()
}
} else {
this.lastTime -= this.interval
this.tick()
}
}, this.interval)
}
},
beforeUpdate () {
if (this.originTargetTime !== this.target) {
this.initTime()
}
},
beforeDestroy () {
clearTimeout(this.timer)
}
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,3 @@
import CountDown from './CountDown'
export default CountDown

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