250716提交

This commit is contained in:
yangxing 2025-07-16 17:27:54 +08:00
commit 80aaf83e46
1404 changed files with 551178 additions and 0 deletions

7
.gitignore vendored Normal file
View File

@ -0,0 +1,7 @@
/admin/dist
/admin/package-lock.json
/doc/~$名称释义.xlsx
/doc/~$瘦之美大数据服务平台功能需求明细230619.xlsx
/netcore/src/JT.Shop.Web.Entry/wwwroot/uploadfile
/netcore/src/JT.Shop.Web.Entry/App_Data
/.tgitconfig

429
README.md Normal file
View File

@ -0,0 +1,429 @@
### 门店管理系统
- 使用EFCORE+Furion+NET7
- 依赖redis
### 数据库
- mysql
- 数据库地址123.249.79.37
- 数据库端口号3306
### 服务器
- IP:123.249.79.37
-宝塔地址:<https://123.249.79.37:28351/8698ed07>
### 数据结构更新
1. 更改 CodeFirst 结构 [更改模型文档](https://learn.microsoft.com/zh-cn/ef/core/modeling/)
2. 在程序包管理器控制台默认项目中选择“src\JT.Shop.Database.Migrations”
```
//添加迁移架构代码
Add-Migration 新版本号 -Context DefaultDbContext
//以下应用适合生产环境的迁移方法
//方法一:生成一个从指定 from 迁移到指定 to 迁移的 SQL 脚本。警告:潜在的数据丢失方案。
Script-Migration 上个版本号 新版本号
//方法二:幂等 SQL 脚本。此类脚本将在内部检查已经应用哪些迁移(通过迁移历史记录表),并且只应用缺少的迁移。
Script-Migration -Idempotent
```
### 目录结构
├── admin 总部管理后台
│   ├── config 插件配置文件
│   ├── dist 发布目录
│   │   ├── css
│   │   ├── img
│   │   ├── js
│   │   └── loading
│   │   └── option2
│   ├── 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 业务模块
│   │   │   ├── business 门店和总部选择模块
│   │   │   ├── device 设备管理
│   │   │   │   ├── product 出货管理
│   │   │   │   └── type 设备类型管理
│   │   │   ├── measureresult 测量结果
│   │   │   ├── order 订单管理
│   │   │   ├── reguser 用户管理
│   │   │   ├── sbody 部位管理
│   │   │   │   └── type 部位类型管理
│   │   │   ├── shop 门店管理
│   │   │   │   ├── org 门店组织结构管理
│   │   │   │   ├── pos 门店职位管理
│   │   │   │   └── role 门店角色管理
│   │   │   └── wx 公众号管理
│   │   ├── mch 门店管理
│   │   │   ├── account 门店账号管理
│   │   │   │   └── pos 门店职位管理
│   │   │   ├── body 门店部位管理
│   │   │   ├── member 门店会员管理
│   │   │   ├── product 门店产品管理
│   │   │   │   ├── pay 购买记录
│   │   │   │   └── result 使用记录
│   │   │   └── serve 门店服务管理
│   │   │   └── result 服务记录
│   │   ├── 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
├── doc 文档
├── mch 门店端管理平台
│   ├── config 默认样式和路由配置
│   ├── dist 发布目录
│   │   ├── css
│   │   ├── img
│   │   ├── js
│   │   └── loading
│   │   └── option2
│   ├── docker docker配置参考文件
│   │   └── nginx
│   │   └── vhost
│   ├── public 静态资源
│   │   └── loading
│   │   └── option2
│   ├── src 源码
│   │   ├── 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 业务模块
│   │   │   ├── business 门店和总部选择模块
│   │   │   ├── device 设备管理
│   │   │   │   ├── product 出货管理
│   │   │   │   └── type 设备类型管理
│   │   │   ├── measureresult 测量结果管理
│   │   │   ├── order 订单管理
│   │   │   ├── reguser 用户管理
│   │   │   ├── shop 门店管理
│   │   │   │   ├── org 门店组织结构管理
│   │   │   │   ├── pos 门店职位管理
│   │   │   │   └── role 门店角色管理
│   │   │   └── wx 公众号管理
│   │   ├── mch 门店管理
│   │   │   ├── account 门店账号管理
│   │   │   │   └── pos 门店职位管理
│   │   │   ├── body 门店部位管理
│   │   │   ├── member 门店会员管理
│   │   │   ├── product 门店产品管理
│   │   │   │   ├── pay 购买记录
│   │   │   │   └── result 使用记录
│   │   │   ├── serve 门店服务管理
│   │   │   │   └── result 服务记录
│   │   │   └── set 门店设置
│   │   ├── 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.Shop.Application 业务模块
│   ├── JobService 定时任务
│   ├── Mapper DTO映射
│   └── Service 服务接口
│   ├── BaseCommon 基础服务
│   │   ├── Http http请求封装接口
│   │   ├── QrCode 二维码封装接口
│   │   ├── SMS 短信封装接口
│   │   └── Upload 文件上传接口
│   ├── Business 总部业务服务
│   │   ├── BodyType 身体部份管理
│   │   ├── Clerk 店员管理
│   │   ├── Device 设备管理
│   │   │   └── Type 设备类型管理
│   │   ├── Member 会员管理
│   │   ├── Org 组织管理
│   │   ├── OutProduct 出货管理
│   │   ├── Pos 职位管理
│   │   ├── Product 产品管理
│   │   ├── Retailer 分销管理,未使用
│   │   ├── Role 角色管理
│   │   ├── Serve 服务管理
│   │   ├── Shop 门店管理
│   │   └── WX 公众号管理
│   ├── Mch 门店业务服务
│   │   ├── Account 门店账号管理
│   │   ├── Body 门店部位管理
│   │   ├── Clerk 门店店员管理
│   │   ├── Conf 门店配置管理
│   │   ├── Device 门店设备管理
│   │   ├── Member 门店会员管理
│   │   ├── Product 门店产品管理
│   │   └── Serve 门店服务管理
│   ├── ShopApi 门店H5接口
│   │   ├── Device 门店设备管理
│   │   ├── MP 门店公众号管理
│   │   ├── Member 门店会员管理
│   │   ├── Notice 门店通知管理
│   │   ├── Report 门店报表管理
│   │   ├── Shop 门店管理
│   │   └── User 门店用户管理
│   ├── System 系统接口服务
│   │   ├── App 应用管理
│   │   ├── Auth 登录相关管理
│   │   ├── Base 通用方法
│   │   ├── Cache 缓存管理
│   │   ├── Captcha 验证码管理
│   │   │   ├── ClickWord
│   │   │   └── General
│   │   ├── Config 配置管理
│   │   ├── Dict 字典管理
│   │   ├── Emp 员工管理
│   │   ├── Enum 枚举管理
│   │   ├── File 文件管理
│   │   ├── Forms 表单管理
│   │   ├── Hubs 聊天管理
│   │   ├── Logger 日志管理
│   │   ├── Menu 菜单管理
│   │   ├── Message 消息管理
│   │   ├── Monitor 监控管理
│   │   ├── Notice 通知管理
│   │   ├── OnlineUser 在线用户管理
│   │   ├── Org 组织管理
│   │   ├── Pos 职位管理
│   │   ├── Role 角色管理
│   │   ├── StepBody 步骤管理
│   │   ├── System 系统管理
│   │   ├── Timer 定时任务管理
│   │   └── User 用户管理
│   ├── Test 测试单元
│   └── UserApi 门店用户H5接口
│   ├── Level 标准等级管理
│   ├── Result 测量结果管理
│   └── User 账户管理
├── JT.Shop.Core 框架核心,引用Nuget包
│   ├── Filter 拦截器
│   └── Util 辅助类
├── JT.Shop.Database.Migrations 数据库迁移
│   ├── Migrations 迁移文件
│   └── sql sql脚本
├── JT.Shop.Domain 领域模型
│   ├── Entity 数据库实体
│   │   ├── Business 业务层实体
│   │   ├── Client 用户层实体
│   │   ├── SeedData 种子数据
│   │   ├── Shop 门店层实体
│   │   └── System 系统层实体
│   │   └── WorkflowEntity
│   ├── ErrCode 错误码
│   ├── Options 选项配置
│   └── Properties 配置文件
├── JT.Shop.Domain.Shared 常用枚举和常量定义
│   ├── Const 常量定义
│   ├── Enum 枚举定义
│   └── Properties 配置文件
├── JT.Shop.EntityFramework.Core EntityFrameworkCore管理
│   ├── DbContexts 数据库配置
│   ├── Extensions 数据库扩展
│   └── Repository 仓储
├── JT.Shop.EventBus 事件总线
│   └── Service 订阅者
│   ├── Logger 日志订阅
│   └── Report 统计订阅
├── JT.Shop.HealthCheck 健康检查,未使用
│   └── Extensions
├── JT.Shop.Web.Entry web层
│   ├── App_Data 缓存文件
│   │   └── SenparcTraceLog
│   ├── Controllers 控制器
│   ├── Handlers 中间件
│   ├── Properties 发布配置
│   │   └── PublishProfiles
│   ├── Views 视图
│   │   ├── Auth 公众号授权相关
│   │   ├── Home 首页
│   │   ├── Qr 二维码入口相关
│   │   └── Shared 共享页面
│   └── wwwroot 静态资源
│   ├── css
│   ├── image
│   ├── js
│   ├── tpl
│   ├── uploadfile
│   │   └── images
│   │   ├── 20240309
│   │   ├── 20240417
│   │   └── share
│   │   └── 202404
│   └── vant
└── JT.Shop.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

5
admin/.env Normal file
View File

@ -0,0 +1,5 @@
NODE_ENV=production
VUE_APP_PREVIEW=false
VUE_APP_API_BASE_URL=http://imd.pcxbc.com
VUE_APP_SOCKET_BASE_URL=ws://imd.pcxbc.com
VUE_APP_MCH_URL=http://mch.pcxbc.com

5
admin/.env.development Normal file
View File

@ -0,0 +1,5 @@
NODE_ENV=development
VUE_APP_PREVIEW=true
VUE_APP_API_BASE_URL=https://localhost:7218
VUE_APP_SOCKET_BASE_URL=ws://localhost:7218
VUE_APP_MCH_URL=http://localhost:82

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://imd.pcxbc.com
VUE_APP_SOCKET_BASE_URL=ws://imd.pcxbc.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

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://test.pcxbc.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://test.pcxbc.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/**/*"]
}

98
admin/package.json Normal file
View File

@ -0,0 +1,98 @@
{
"name": "vue-antd-pro",
"version": "3.0.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"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",
"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",
"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: 4.2 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,74 @@
import { axios } from '@/utils/request'
// 获取列表
export function List(parameter) {
return axios({
url: '/business/clerk/list',
method: 'post',
data: parameter
})
}
// 修改状态
export function SetStatus(parameter) {
return axios({
url: '/business/clerk/setstatus',
method: 'post',
data: parameter
})
}
// 添加
export function AddSubmit(parameter) {
return axios({
url: '/business/clerk/add',
method: 'post',
data: parameter
})
}
// 编辑
export function EditSubmit(parameter) {
return axios({
url: '/business/clerk/edit',
method: 'post',
data: parameter
})
}
// 获取使用列表
export function ResultList(parameter) {
return axios({
url: '/business/clerk/resultlist',
method: 'post',
data: parameter
})
}
// 职位列表
export function PosList(parameter) {
return axios({
url: '/business/clerk/poslist',
method: 'post',
data: parameter
})
}
// 职位列表
export function PosAllList(parameter) {
return axios({
url: '/business/clerk/allposlist',
method: 'post',
data: parameter
})
}
// 职位提交
export function PosSubmit(parameter) {
return axios({
url: '/business/clerk/possubmit',
method: 'post',
data: parameter
})
}
// 密码重置
export function ShopUserPwdZZ(parameter) {
return axios({
url: 'mch/account/ShopUserPwd',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,74 @@
// 身体部位管理
import { axios } from '@/utils/request'
// 获取身体部位列表
export function List(parameter) {
return axios({
url: '/business/body/list',
method: 'post',
data: parameter
})
}
// 修改身体部位状态
export function SetStatus(parameter) {
return axios({
url: '/business/body/setstatus',
method: 'post',
data: parameter
})
}
// 修改身体部位信息
export function Submit(parameter) {
return axios({
url: '/business/body/submit',
method: 'post',
data: parameter
})
}
// 获取身体部位类型列表
export function TypeList(parameter) {
return axios({
url: '/business/body/type/list',
method: 'post',
data: parameter
})
}
// 身体部位类型信息修改
export function SubmitType(parameter) {
return axios({
url: '/business/body/type/submit',
method: 'post',
data: parameter
})
}
// 身体部位类型状态修改
export function SetTypeStatus(parameter) {
return axios({
url: '/business/body/type/setstatus',
method: 'post',
data: parameter
})
}
// 获取身体部位类型列表
export function TypeAll(parameter) {
return axios({
url: '/business/body/type/all',
method: 'get',
param: parameter
})
}
// (总部配置的部位配置)获取身体部位列表
export function BodyList(parameter) {
return axios({
url: '/business/body/businessbodylist',
method: 'post',
data: parameter
})
}
// (总部配置的部位配置)身体部位提交
export function BodySubmit(parameter) {
return axios({
url: '/business/body/businessbodysubmit',
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,121 @@
import { axios } from '@/utils/request'
// 获取设备列表
export function List(parameter) {
return axios({
url: '/business/device/list',
method: 'post',
data: parameter
})
}
// 修改设备状态
export function SetStatus(parameter) {
return axios({
url: '/business/device/setstatus',
method: 'post',
data: parameter
})
}
// 修改设备信息
export function Submit(parameter) {
return axios({
url: '/business/device/submit',
method: 'post',
data: parameter
})
}
// 获取设备类型列表
export function TypeList(parameter) {
return axios({
url: '/business/device/type/list',
method: 'post',
data: parameter
})
}
// 设备类型信息修改
export function SubmitType(parameter) {
return axios({
url: '/business/device/type/submit',
method: 'post',
data: parameter
})
}
// 获取设备出货列表
export function ProductList(parameter) {
return axios({
url: '/business/outproduct/list',
method: 'post',
data: parameter
})
}
// 设备出货修改
export function SubmitProduct(parameter) {
return axios({
url: '/business/outproduct/edit',
method: 'post',
data: parameter
})
}
// 设备出货添加
export function AddProduct(parameter) {
return axios({
url: '/business/outproduct/add',
method: 'post',
data: parameter
})
}
// 设备出货导出
export function ExportProduct(parameter) {
return axios({
url: '/business/outproduct/export',
method: 'post',
data: parameter
})
}
// 设备出货分配
export function AllocProduct(parameter) {
return axios({
url: '/business/outproduct/alloc',
method: 'post',
data: parameter
})
}
// 设备出货回收
export function RecycleProduct(parameter) {
return axios({
url: '/business/outproduct/recycle',
method: 'post',
data: parameter
})
}
// 设备分配
export function AllocDevice(parameter) {
return axios({
url: '/business/device/alloc',
method: 'post',
data: parameter
})
}
// 设备分配总部
export function AllocBusinessDevice(parameter) {
return axios({
url: '/business/device/alloctobusiness',
method: 'post',
data: parameter
})
}
// 设备回收
export function RecycleDevice(parameter) {
return axios({
url: '/business/device/recycle',
method: 'post',
data: parameter
})
}
// 设备分配记录
export function DeviceAllocList(parameter) {
return axios({
url: '/business/device/alloclist',
method: 'post',
data: parameter
})
}

View File

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

View File

@ -0,0 +1,41 @@
import { axios } from '@/utils/request'
// 获取订单列表
export function List(parameter) {
return axios({
url: '/business/order/list',
method: 'post',
data: parameter
})
}
// 修改订单状态
export function SetStatus(parameter) {
return axios({
url: '/business/order/setstatus',
method: 'post',
data: parameter
})
}
// 修改订单信息
export function Submit(parameter) {
return axios({
url: '/business/order/submit',
method: 'post',
data: parameter
})
}
// 更新订单信息
export function Update(parameter) {
return axios({
url: '/business/order/update',
method: 'post',
data: parameter
})
}
// 当前账户订单配置详情
export function Detail(parameter) {
return axios({
url: '/business/order/detail',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,84 @@
import { axios } from '@/utils/request'
/**
* 获取机构树
*
* @author yubaoshan
* @date 2020/4/26 12:08
*/
export function getOrgTree(parameter) {
return axios({
url: '/business/org/tree',
method: 'post',
data: parameter
})
}
/**
* 获取机构列表
*
* @author yubaoshan
* @date 2020/5/11 12:59
*/
export function getOrgList(parameter) {
return axios({
url: '/business/org/list',
method: 'post',
data: parameter
})
}
/**
* 获取机构列表
*
* @author yubaoshan
* @date 2020/5/11 16:17
*/
export function getOrgPage(parameter) {
return axios({
url: '/business/org/page',
method: 'post',
data: parameter
})
}
/**
* 新增机构
*
* @author yubaoshan
* @date 2020/5/11 13:56
*/
export function sysOrgAdd(parameter) {
return axios({
url: '/business/org/add',
method: 'post',
data: parameter
})
}
/**
* 编辑机构
*
* @author yubaoshan
* @date 2020/5/11 13:56
*/
export function sysOrgEdit(parameter) {
return axios({
url: '/business/org/edit',
method: 'post',
data: parameter
})
}
/**
* 删除机构
*
* @author yubaoshan
* @date 2020/5/11 12:59
*/
export function sysOrgDelete(parameter) {
return axios({
url: '/business/org/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: '/business/pos/page',
method: 'post',
data: parameter
})
}
/**
* 系统职位列表
*
* @author yubaoshan
* @date 2020/6/21 23:50
*/
export function sysPosList(parameter) {
return axios({
url: '/business/pos/list',
method: 'post',
data: parameter
})
}
/**
* 添加系统职位
*
* @author yubaoshan
* @date 2020/5/25 01:31
*/
export function sysPosAdd(parameter) {
return axios({
url: '/business/pos/add',
method: 'post',
data: parameter
})
}
/**
* 编辑系统职位
*
* @author yubaoshan
* @date 2020/5/25 01:31
*/
export function sysPosEdit(parameter) {
return axios({
url: '/business/pos/edit',
method: 'post',
data: parameter
})
}
/**
* 删除系统职位
*
* @author yubaoshan
* @date 2020/5/25 01:31
*/
export function sysPosDelete(parameter) {
return axios({
url: '/business/pos/delete',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,68 @@
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
})
}
// 提交
export function Submit(parameter) {
return axios({
url: '/business/product/submit',
method: 'post',
data: parameter
})
}
// 获取购买列表
export function PayList(parameter) {
return axios({
url: '/business/product/paylist',
method: 'post',
data: parameter
})
}
// 获取使用列表
export function ResultList(parameter) {
return axios({
url: '/business/product/resultlist',
method: 'post',
data: parameter
})
}
// 总部产品配置列表 获取列表
export function ZBList(parameter) {
return axios({
url: '/business/product/BusinessShopProduct',
method: 'post',
data: parameter
})
}
// 总部产品配置列表 提交
export function ZBSubmit(parameter) {
return axios({
url: '/business/product/BusinessShopProductSubmit',
method: 'post',
data: parameter
})
}
// 总部产品配置列表 修改状态
export function ZBSetStatus(parameter) {
return axios({
url: '/business/product/BusinessShopProductSetStatus',
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,9 @@
import { axios } from '@/utils/request'
// 测量记录列表
export function List (parameter) {
return axios({
url: '/result/list',
method: 'post',
data: parameter
})
}

View File

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

View File

@ -0,0 +1,57 @@
import { axios } from '@/utils/request'
// 获取列表
export function List(parameter) {
return axios({
url: '/business/serve/list',
method: 'post',
data: parameter
})
}
// 修改状态
export function SetStatus(parameter) {
return axios({
url: '/business/serve/setstatus',
method: 'post',
data: parameter
})
}
// 提交
export function Submit(parameter) {
return axios({
url: '/business/serve/submit',
method: 'post',
data: parameter
})
}
// 获取使用列表
export function ResultList(parameter) {
return axios({
url: '/business/serve/resultlist',
method: 'post',
data: parameter
})
}
// 总部配置-服务配置获取使用列表
export function ZBList(parameter) {
return axios({
url: '/business/serve/BusinessServiceList',
method: 'post',
data: parameter
})
}
// 总部配置-服务配置 修改状态
export function ZBSetStatus(parameter) {
return axios({
url: '/business/serve/BusinessZBFWSetStatus',
method: 'post',
data: parameter
})
}
// 总部配置-服务配置提交
export function ZBSubmit(parameter) {
return axios({
url: '/business/serve/BusinessServiceSubmit',
method: 'post',
data: parameter
})
}

View File

@ -0,0 +1,33 @@
import { axios } from '@/utils/request'
// 获取门店列表
export function getShopPage(parameter) {
return axios({
url: '/business/shop/page',
method: 'post',
data: parameter
})
}
// 添加门店
export function AddShop(parameter) {
return axios({
url: '/business/shop/add',
method: 'post',
data: parameter
})
}
// 编辑门店
export function EditShop(parameter) {
return axios({
url: '/business/shop/edit',
method: 'post',
data: parameter
})
}
// 同步总部配置
export function BusinessZBPZ(parameter) {
return axios({
url: '/business/shop/BusinessZBPZ',
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,17 @@
import { axios } from '@/utils/request'
// 图片上传
export function uploadimg(parameter) {
return axios({
url: '/common/uploadimg',
method: 'post',
data: parameter
})
}
// excel上次
export function uploadexcel(parameter) {
return axios({
url: '/common/uploadexcel',
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,262 @@
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/4/26 12:08
*/
export function getUserList(parameter) {
return axios({
url: '/sysUser/list',
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
})
}
/**
* 授权角色
*
* @author yubaoshan
* @date 2020/5/26 23:59
*/
export function sysUserGrantRole(parameter) {
return axios({
url: '/sysUser/grantRole',
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 AllsysUserList(parameter) {
return axios({
url: '/sysUser/alluserList',
method: 'get',
params: 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: 12 KiB

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

@ -0,0 +1,161 @@
<?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="300px" height="300px" viewBox="0 0 300 300" enable-background="new 0 0 300 300" xml:space="preserve"> <image id="image0" width="300" height="300" x="0" y="0"
href="data:image/png;base64,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
NjoyNCswMDowMA9stOEAAAAASUVORK5CYII=" />
</svg>

After

Width:  |  Height:  |  Size: 12 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

BIN
admin/src/assets/tpl.xlsx Normal file

Binary file not shown.

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