初始化jeepay-ui项目

This commit is contained in:
dingzhiwei 2021-06-09 19:53:07 +08:00
parent 2db7299808
commit f50c881079
272 changed files with 19875 additions and 2 deletions

55
.gitignore vendored Normal file
View File

@ -0,0 +1,55 @@
# [ java 字节码 ]
*.class
# [ 日志文件 ]
*.log
# [ 打包压缩文件 ]
*.jar
*.war
*.zip
*.tar.gz
*.rar
# [ java 虚拟机异常日志 see http://www.java.com/en/download/help/error_hotspot.xml ]
hs_err_pid*
# [ 操作系统缓存和备份 ]
tmp/
*.tmp
*.bak
*.swp
*~.nib
# [ eclipse ]
.metadata
bin/
.settings
.classpath
.project
# [ IDEA ]
.idea/
*.iml
# [ MAVEN ]
target/
# [Jrebel]
rebel.xml
# ################################################ 前端 ###################
# [npm包管理依赖]
node_modules/
# [dist目录]
dist/
# [HBuilderX 编译目录 ]
unpackage/
# [vscode IDE]
.vscode/
# [package-lock.json 无需提交 ]
package-lock.json

165
LICENSE Normal file
View File

@ -0,0 +1,165 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.

154
README.md
View File

@ -1,2 +1,152 @@
# jeepay-ui
jeepay对应的前端UI项目
<p align="center">
<a href="https://www.jeepay.vip"><img src="https://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/jeepay_logo.svg"></a>
</p>
<p align="center">
<strong>适合互联网企业使用的开源支付系统</strong>
</p>
<p align="center">
👉 <a href="https://www.jeepay.vip">https://www.jeepay.vip</a> 👈
</p>
<p align="center">
<a target="_blank" href="https://spring.io/projects/spring-boot">
<img src="https://img.shields.io/badge/spring%20boot-2.4.5-yellowgreen" />
</a>
<a target="_blank" href="https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html">
<img src="https://img.shields.io/badge/JDK-8+-green.svg" />
</a>
<a target="_blank" href="http://www.gnu.org/licenses/lgpl.html">
<img src="https://img.shields.io/badge/license-LGPL--3.0-blue" />
</a>
<a href='https://gitee.com/jeequan/jeepay/stargazers' target="_blank">
<img src='https://gitee.com/jeequan/jeepay/badge/star.svg?theme=gvp' alt='star'></img>
</a>
<a target="_blank" href='https://github.com/jeequan/jeepay'>
<img src="https://img.shields.io/github/stars/jeequan/jeepay.svg?style=social" alt="github star"/>
</a>
</p>
<br/>
<p align="center">
<a href="https://jq.qq.com/?_wv=1027&k=94WnXmdL">
<img src="https://img.shields.io/badge/qq%E7%BE%A4%E2%91%A0-635647058-critical"/>
</a>
</p>
-------------------------------------------------------------------------------
## 📚 项目介绍
Jeepay是一套适合互联网企业使用的开源支付系统支持多渠道服务商和普通商户模式。已对接`微信支付``支付宝``云闪付`官方接口,支持聚合码支付。
Jeepay使用`Spring Boot`和`Ant Design Vue`开发,集成`Spring Security`实现权限管理功能是一套非常实用的web开发框架。
### 🎁 名称的由来
Jeepay = Jee + pay是由原XxPay支付系统作者带领团队开发“Jee”是公司计全科技名称的表示pay表示支付。中文名称为计全支付释为计出万全、支付安全让支付更加方便安全。
### 🍟 项目体验
- Jeepay支付流程体验[https://www.jeequan.com/demo/jeepay_cashier.html](https://www.jeequan.com/demo/jeepay_cashier.html "Jeepay支付体验")
- Jeepay运营平台和商户系统演体验[https://www.jeequan.com/doc/detail_84.html](https://www.jeequan.com/doc/detail_84.html "Jeepay支付系统体验")
- Jeepay项目文档[https://www.jeepay.vip](https://www.jeepay.vip "Jeepay项目文档")
### 🍎 项目特点
* 支持多渠道对接,支付网关自动路由
* 已对接`微信`服务商和普通商户接口,支持`V2`和`V3`接口
* 已对接`支付宝`服务商和普通商户接口支持RSA和RSA2签名
* 已对接`云闪付`服务商接口,可选择多家支付机构
* 提供http形式接口提供各语言的`sdk`实现,方便对接
* 接口请求和响应数据采用签名机制,保证交易安全可靠
* 系统安全,支持`分布式`部署,`高并发`
* 管理端包括`运营平台`和`商户系统`
* 管理平台操作界面简洁、易用
* 支付平台到商户系统的订单通知使用MQ实现保证了高可用消息可达
* 支付渠道的接口参数配置界面自动化生成
* 使用`spring security`实现权限管理
* 前后端分离架构,方便二次开发
* 由原`XxPay`团队开发,有着多年支付系统开发经验
## 🥞 系统架构
> Jeepay计全支付系统架构图
![Jeepay系统架构图](https://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/jeepay_framework.png "Jeepay系统架构图")
> 核心技术栈
| 软件名称 | 描述 | 版本
|---|---|---
|Jdk | Java环境 | 1.8
|Spring Boot | 开发框架 | 2.4.5
|Redis | 分布式缓存 | 3.2.8 或 高版本
|MySQL | 数据库 | 5.7.X
|ActiveMQ | 消息中间件 | 5.15.8 或 高版本
|[Ant Design Vue](https://www.antdv.com/docs/vue/introduce-cn/) | Ant Design的Vue实现前端开发使用 | 2.1.2
|[MyBatis-Plus](https://mp.baomidou.com/) | MyBatis增强工具 | 3.4.2
|[WxJava](https://gitee.com/binary/weixin-java-tools) | 微新开发Java SDK | 4.0.0
|[Hutool](https://www.hutool.cn/) | Java工具类库 | 5.6.6
> 项目结构
```lua
jeepay -- https://gitee.com/jeequan/jeepay
jeepay-ui
├── jeepay-ui-manager -- 运营平台前端vue代码
├── jeepay-ui-merchant -- 商户系统前端vue代码
└── jeepay-ui-cashier -- 支付收银台vue代码
```
> 开发部署
- 系统开发:[https://www.jeepay.vip/#/develop/dev_serv](https://www.jeepay.vip/#/develop/dev_serv)
- 通道对接:[https://www.jeepay.vip/#/develop/dev_channel](https://www.jeepay.vip/#/develop/dev_channel)
- 线上部署:[https://www.jeepay.vip/#/develop/deploy](https://www.jeepay.vip/#/develop/deploy)
- 接口文档:[https://www.jeepay.vip/#/interface/payment_api](https://www.jeepay.vip/#/interface/payment_api)
## 🍿 功能模块
> Jeepay运营平台功能
![Jeepay运营平台功能](https://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/jeepay_mgr.png "Jeepay运营平台功能")
> Jeepay商户系统功能
![Jeepay商户系统功能](https://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/jeepay_mch.png "Jeepay商户系统功能")
## 🍯 系统截图
`以下截图是从实际已完成功能界面截取,截图时间为2021-05-29 02:05`
![Jeepay演示界面](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/yanshi/001.png "Jeepay演示界面")
![Jeepay演示界面](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/yanshi/002.png "Jeepay演示界面")
![Jeepay演示界面](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/yanshi/005.png "Jeepay演示界面")
![Jeepay演示界面](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/yanshi/006.png "Jeepay演示界面")
![Jeepay演示界面](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/yanshi/009.png "Jeepay演示界面")
![Jeepay演示界面](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/yanshi/010.png "Jeepay演示界面")
![Jeepay演示界面](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/yanshi/011.png "Jeepay演示界面")
![Jeepay演示界面](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/yanshi/012.png "Jeepay演示界面")
![Jeepay演示界面](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/yanshi/013.png "Jeepay演示界面")
![Jeepay演示界面](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/yanshi/014.png "Jeepay演示界面")
![Jeepay演示界面](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/yanshi/015.png "Jeepay演示界面")
![Jeepay演示界面](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/yanshi/022.png "Jeepay演示界面")
## 🥪 关于我们
***
微信扫描下面二维码,关注官方公众号:计全科技,获取更多精彩内容。
![计全科技公众号](http://jeequan.oss-cn-beijing.aliyuncs.com/jeepay/img/jee-qrcode.jpg "计全科技公众号")

3
jeepay-ui-cashier/.env Normal file
View File

@ -0,0 +1,3 @@
NODE_ENV=production
VUE_APP_BASE_URL=/
VUE_APP_API_BASE_URL=

View File

@ -0,0 +1,3 @@
NODE_ENV=development
VUE_APP_BASE_URL=/
VUE_APP_API_BASE_URL=http://192.168.0.199:8030

23
jeepay-ui-cashier/.gitignore vendored Normal file
View File

@ -0,0 +1,23 @@
.DS_Store
node_modules
/dist
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

View File

@ -0,0 +1,21 @@
/*
* @Author: your name
* @Date: 2020-12-14 16:32:48
* @LastEditors: 王会峰
* @LastEditTime: 2020-12-24 16:02:58
* @FilePath: \pay\.postcssrc.js
* @SendWord: 永无BUG vite
*/
// https://github.com/michael-ciniawsky/postcss-load-config
module.exports = {
"plugins": {
"postcss-import": {},
"postcss-url": {},
// to edit target browsers: use "browserslist" field in package.json
"autoprefixer": {},
"postcss-px2rem": {
"remUnit": 75
}
}
}

View File

@ -0,0 +1,24 @@
# jeepay-ui-cashier
## Project setup
```
npm install
```
### Compiles and hot-reloads for development
```
npm run serve
```
### Compiles and minifies for production
```
npm run build
```
### Lints and fixes files
```
npm run lint
```
### Customize configuration
See [Configuration Reference](https://cli.vuejs.org/config/).

View File

@ -0,0 +1,5 @@
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
]
}

View File

@ -0,0 +1,49 @@
{
"name": "jeepay-ui-cashier",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
"dependencies": {
"amfe-flexible": "^2.2.1",
"axios": "^0.19.0",
"core-js": "^3.6.5",
"lib-flexible": "^0.3.2",
"postcss-px2rem": "^0.3.0",
"px2rem-loader": "^0.1.9",
"vue": "^2.6.11",
"vue-router": "^3.2.0"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.5.0",
"@vue/cli-plugin-eslint": "~4.5.0",
"@vue/cli-plugin-router": "^4.5.13",
"@vue/cli-service": "~4.5.0",
"babel-eslint": "^10.1.0",
"eslint": "^6.7.2",
"eslint-plugin-vue": "^6.2.2",
"vue-template-compiler": "^2.6.11"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/essential",
"eslint:recommended"
],
"parserOptions": {
"parser": "babel-eslint"
},
"rules": {}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -0,0 +1,17 @@
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>Jeepay-收银台</title>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>

View File

@ -0,0 +1,28 @@
<template>
<div id="app">
<router-view/>
</div>
</template>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
}
#nav {
padding: 30px;
}
#nav a {
font-weight: bold;
color: #2c3e50;
}
#nav a.router-link-exact-active {
color: #42b983;
}
</style>

View File

@ -0,0 +1,58 @@
import request from '@/http/request'
import wayCode from "@/utils/wayCode";
import channelUserIdUtil from "@/utils/channelUserId";
import config from '@/config'
/** 获取url **/
export function getRedirectUrl () {
return request.request({
url: '/api/cashier/redirectUrl',
method: 'POST',
data: { wayCode: wayCode.getPayWay().wayCode, token: config.cacheToken }
})
}
/** 获取url **/
export function getChannelUserId (redirectData) {
return request.request({
url: '/api/cashier/channelUserId',
method: 'POST',
data: Object.assign({ wayCode: wayCode.getPayWay().wayCode, token: config.cacheToken }, redirectData)
})
}
/** 调起支付接口, 获取支付数据包 **/
export function getPayPackage (amount) {
return request.request({
url: '/api/cashier/pay',
method: 'POST',
data: {
wayCode: wayCode.getPayWay().wayCode,
token: config.cacheToken,
amount: amount,
channelUserId: channelUserIdUtil.getChannelUserId()
}
})
}
/** 调起支付接口, 获取订单信息 **/
export function getPayOrderInfo () {
return request.request({
url: '/api/cashier/payOrderInfo',
method: 'POST',
data: {
token: config.cacheToken
}
})
}
/** 取消订单 **/
export function cancelPay () {
return request.request({
url: '/api/cashier/cancelPay',
method: 'POST',
data: {
token: config.cacheToken
}
})
}

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="29" height="40" viewBox="0 0 29 40"><defs><style>.a{fill:#1a1311;}</style></defs><path class="a" d="M2406.045,4386.261h-7.672l-6.828,14.395-6.828-14.395h-7.672l9.439,19.9H2379.3v5.3h8.516v3.515H2379.3v5.3h8.516v5.984h7.451v-5.984h8.516v-5.3h-8.516v-3.515h8.516v-5.3h-7.181Z" transform="translate(-2377.045 -4386.261)"/></svg>

After

Width:  |  Height:  |  Size: 372 B

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="1621938740892" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2364" width="64" height="64" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css"></style></defs><path d="M512 981.333333C252.8 981.333333 42.666667 771.2 42.666667 512S252.8 42.666667 512 42.666667s469.333333 210.133333 469.333333 469.333333-210.133333 469.333333-469.333333 469.333333z m44.245333-469.333333l159.914667-159.914667a31.274667 31.274667 0 1 0-44.245333-44.245333L512 467.754667 352.085333 307.84a31.274667 31.274667 0 1 0-44.245333 44.245333L467.754667 512l-159.914667 159.914667a31.274667 31.274667 0 1 0 44.245333 44.245333L512 556.245333l159.914667 159.914667a31.274667 31.274667 0 1 0 44.245333-44.245333L556.245333 512z" fill="#FF4B33" p-id="2365"></path></svg>

After

Width:  |  Height:  |  Size: 950 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="42" height="42" viewBox="0 0 42 42"><defs><style>.a{fill:url(#a);}.b{fill:#e7ffe6;}.c{clip-path:url(#b);}.d{clip-path:url(#d);}</style><linearGradient id="a" x1="1" x2="0" y2="1" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="#10d832"/><stop offset="1" stop-color="#00ac34"/></linearGradient><clipPath id="b"><rect class="a" width="42" height="42" rx="8" transform="translate(60 783)"/></clipPath><clipPath id="d"><rect class="b" width="37.233" height="33.096"/></clipPath></defs><g class="c" transform="translate(-60 -783)"><rect class="a" width="42" height="42" rx="8" transform="translate(60 783)"/><g transform="matrix(0.966, -0.259, 0.259, 0.966, -5641.551, -2527.47)"><g transform="translate(4642 4685)"><g class="d" transform="translate(0 0)"><path class="b" d="M4655.413,4706.173a1.167,1.167,0,0,1-.558.13,1.219,1.219,0,0,1-1.08-.65l-.088-.17-3.4-7.459a.642.642,0,0,1,.564-.867.688.688,0,0,1,.387.129l4.008,2.863a2.085,2.085,0,0,0,1.033.3,1.677,1.677,0,0,0,.646-.13l18.795-8.408a19.851,19.851,0,0,0-15.215-6.592c-10.259,0-18.621,6.98-18.621,15.6a14.731,14.731,0,0,0,6.421,11.789,1.289,1.289,0,0,1,.515,1,1.194,1.194,0,0,1-.087.389c-.3,1.168-.82,3.079-.82,3.163a1.55,1.55,0,0,0-.088.478.59.59,0,0,0,.6.607.49.49,0,0,0,.346-.129l4.05-2.385a2.052,2.052,0,0,1,.991-.3,2.3,2.3,0,0,1,.557.088,21.579,21.579,0,0,0,6.082.867c10.256,0,18.621-6.98,18.621-15.6a13.763,13.763,0,0,0-2.112-7.24l-21.417,12.439Zm0,0" transform="translate(-4641.886 -4685.302)"/></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

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="1621586617012" class="icon" viewBox="0 0 1146 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6384" xmlns:xlink="http://www.w3.org/1999/xlink" width="17.90625" height="16"><defs><style type="text/css"></style></defs><path d="M0 788.389381a507.469027 108.743363 0 1 0 1014.938053 0 507.469027 108.743363 0 1 0-1014.938053 0Z" fill="#F3F3F8" p-id="6385"></path><path d="M321.880354 246.303717h367.915044l174.714337 220.749026s-174.895575 180.151504-352.328496 179.607788-357.584425-181.238938-357.584425-181.238938z" fill="#FBFBFD" p-id="6386"></path><path d="M797.451327 815.575221H217.486726a63.433628 63.433628 0 0 1-63.433629-63.433628V471.221239h166.558584l14.680354 29.360708A81.738761 81.738761 0 0 0 416.849558 579.964602h199.362831a63.614867 63.614867 0 0 0 63.433629-60.533806L711.72531 471.221239h149.159646v280.920354A63.433628 63.433628 0 0 1 797.451327 815.575221z" fill="#FBFBFD" p-id="6387"></path><path d="M797.451327 806.513274a54.371681 54.371681 0 0 0 54.371682-54.371681v-271.858407h-135.385487L688.707965 522.330619a72.495575 72.495575 0 0 1-72.495576 66.69593H416.849558a90.619469 90.619469 0 0 1-90.61947-86.088496l-11.236814-22.654867H163.115044v271.858407a54.371681 54.371681 0 0 0 54.371682 54.371681h579.964601m0 18.123894H217.486726a72.495575 72.495575 0 0 1-72.495576-72.495575v-289.982301h181.238938l18.123894 36.247788a72.495575 72.495575 0 0 0 72.495576 72.495575h199.362831a54.371681 54.371681 0 0 0 54.371682-54.371682l36.247787-54.371681h163.115045v289.982301a72.495575 72.495575 0 0 1-72.495576 72.495575z" fill="#E2E2EE" p-id="6388"></path><path d="M863.059823 467.958938L684.539469 253.734513H330.398584L151.87823 467.958938l-13.774159-11.599292L322.061593 235.610619h370.814867l183.957522 220.749027z" fill="#E2E2EE" p-id="6389"></path></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -0,0 +1,24 @@
/*
* 全局定义信息
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/5/8 07:18
*/
const errorPageRouteName = 'Error' //错误页面名称定义
const passGuardRouteList = [errorPageRouteName] // 不进入路由守卫的name
/** 定义支付方式 **/
const payWay = {
WXPAY : {wayCode: "WX_JSAPI", routeName: "CashierWxpay"},
ALIPAY : {wayCode: "ALI_JSAPI", routeName: "CashierAlipay"}
}
export default {
errorPageRouteName: errorPageRouteName,
passGuardRouteList: passGuardRouteList,
urlTokenName: "jeepayToken", //URL传递的token名称
payWay: payWay,
cacheToken: ""
}

View File

@ -0,0 +1,15 @@
// 基准大小
const baseSize = 32
// 设置 rem 函数
function setRem () {
// 当前页面宽度相对于 750 宽的缩放比例,可根据自己需要修改。
const scale = document.documentElement.clientWidth / 750
// 设置页面根节点字体大小
document.documentElement.style.fontSize = (baseSize * Math.min(scale, 2)) + 'px'
}
// 初始化
setRem()
// 改变窗口大小时重新设置 rem
window.onresize = function () {
setRem()
}

View File

@ -0,0 +1,81 @@
/**
* Http请求包装对象
* 参考 iview https://gitee.com/icarusion/iview-admin/blob/master/src/libs/axios.js
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/5/8 07:18
*/
import axios from 'axios'
class HttpRequest {
constructor (baseUrl = process.env.VUE_APP_API_BASE_URL) {
this.baseUrl = baseUrl
this.queue = {} // 发送队列, 格式为: {请求url: true}, 可以做一些验证之类
}
// 基础配置信息
baseConfig () {
const headers = {}
return {
baseURL: this.baseUrl,
headers: headers
}
}
destroy (url) {
delete this.queue[url]
}
interceptors (instance, url, showErrorMsg, showLoading) {
// 请求拦截
instance.interceptors.request.use(config => {
// 添加全局的loading...
if (!Object.keys(this.queue).length && showLoading) {
//console.log("")
}
this.queue[url] = true
return config
}, error => {
return Promise.reject(error)
})
// 响应拦截
instance.interceptors.response.use(res => {
this.destroy(url, showLoading)
const resData = res.data // 接口实际返回数据 格式为:{code: '', msg: '', data: ''} res.data 是axios封装对象的返回数据
if (resData.code !== 0) { // 相应结果不为0 说明异常
if (showErrorMsg) {
//
}
return Promise.reject(resData)
} else {
return resData.data
}
}, error => {
this.destroy(url, showLoading)
let errorInfo = error.response && error.response.data && error.response.data.data
if (!errorInfo) {
errorInfo = error.response.data
}
if (showErrorMsg) {
//Vue.prototype.$message.error(JSON.stringify(errorInfo)) // 显示异常信息
}
return Promise.reject(errorInfo)
})
}
// interceptorsFlag 是否进行自定义拦截器处理,默认为: true
// showErrorMsg 发送请求出现异常是否全局提示错误信息
// showLoading 发送请求前后显示全局loading
request (options, interceptorsFlag = true, showErrorMsg = true, showLoading = false) {
const instance = axios.create()
options = Object.assign(this.baseConfig(), options)
if (interceptorsFlag) { // 注入 req, respo 拦截器
this.interceptors(instance, options.url, showErrorMsg, showLoading)
}
return instance(options)
}
}
export default HttpRequest

View File

@ -0,0 +1,4 @@
import HttpRequest from '@/http/HttpRequest'
const request = new HttpRequest()
export default request

View File

@ -0,0 +1,57 @@
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import wayCode from './utils/wayCode';
import config from './config'
import 'amfe-flexible'
Vue.config.productionTip = false
/**
* 路由守卫
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/5/8 07:18
*/
router.beforeEach((to, from, next) => {
console.log("进入路由守卫",from, to)
// from: 当前导航正要离开的路由
// to: 即将要进入的目标路由对象
// 如果在免登录页面则直接放行
if (config.errorPageRouteName.includes(to.name)) {
// 在免登录名单,直接进入
next()
return false
}
//获取不到参数
let token = to.params[config.urlTokenName];
// let token = 'test'; // 不提交
if(token){ //放置token信息
config.cacheToken = token;
}
if(!config.cacheToken) {
next({ name: config.errorPageRouteName, params: { errInfo: "token参数有误" } })
return false;
}
//获取不到支付类型, 需要跳转到错误页面
if( ! wayCode.getPayWay() ) {
next({ name: config.errorPageRouteName, params: { errInfo: "不支持的支付方式!" } })
return false;
}
next()
})
Vue.prototype.$config = config;
new Vue({
router,
render: h => h(App)
}).$mount('#app')

View File

@ -0,0 +1,42 @@
/**
* 路由配置信息
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/5/8 07:18
*/
import Vue from 'vue'
import VueRouter from 'vue-router'
// hack router push callback
// [解决 vue-router跳转相同路径报错 ]
const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push (location, onResolve, onReject) {
if (onResolve || onReject) return originalPush.call(this, location, onResolve, onReject)
return originalPush.call(this, location).catch(err => err)
}
Vue.use(VueRouter)
const routes = [
{path: '/hub/:jeepayToken', name: 'Hub', component: () => import('../views/Hub.vue')}, //自动分发器
{path: '/error', name: 'Error', component: () => import('../views/Error.vue')},
{path: '/oauth2Callback/:jeepayToken', name: 'Oauth2Callback', component: () => import('../views/Oauth2Callback.vue')}, //oauth回调地址
{path: '/cashier', name: 'Cashier', component: () => import('../views/Cashier.vue'), //收银台(该地址无意义)
children: [
{ path: '/cashier/wxpay', name: 'CashierWxpay', component: () => import('../views/payway/Wxpay.vue') },
{ path: '/cashier/alipay', name: 'CashierAlipay', component: () => import('../views/payway/Alipay.vue') },
{ path: '/cashier/ysfpay', name: 'CashierYsfpay', component: () => import('../views/payway/Ysfpay.vue') }
]
}
]
const router = new VueRouter({
mode: 'hash', //history 需要nginx适配 hash是#的格式。
base: "",
routes
})
export default router

View File

@ -0,0 +1,19 @@
/**
* 获取渠道用户 工具类
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/5/8 07:18
*/
const getChannelUserId = function () {
return localStorage.getItem("channelUserId")
}
const setChannelUserId = function (channelUserId) {
localStorage.setItem("channelUserId", channelUserId)
}
export default {
getChannelUserId: getChannelUserId,
setChannelUserId: setChannelUserId
}

View File

@ -0,0 +1,36 @@
/**
* 获取支付方式工具类
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/5/8 07:18
*/
import config from '@/config'
const getToPageRouteName = function () {
const payWay = getPayWay();
return payWay? payWay.routeName : null
}
const getPayWay = function () {
const userAgent = navigator.userAgent;
if(userAgent.indexOf("MicroMessenger") >= 0){
return config.payWay.WXPAY;
}
if(userAgent.indexOf("AlipayClient") >= 0){
return config.payWay.ALIPAY;
}
return null;
}
export default { getToPageRouteName: getToPageRouteName,
getPayWay: getPayWay
}

View File

@ -0,0 +1,15 @@
<template>
<router-view></router-view>
</template>
<script>
export default {
components: {
},
mounted() {
console.log("进入cashier页面");
}
}
</script>

View File

@ -0,0 +1,38 @@
<template>
<div class="center">
<img src="../assets/icon/error.svg" alt="">
<p>支付失败请重新扫码进入</p>
<p>错误: {{msg}}</p>
</div>
</template>
<script>
//
// channelUserId,
export default {
data () {
return {
msg: "请重新扫码进入!",
}
},
components: {
},
mounted() {
this.msg = this.$route.params.errInfo
}
}
</script>
<style lang="css" scoped>
.center {
margin-top:30%;
display: flex;
align-items: center;
flex-direction: column;
}
p {
font-size: 36px;
margin-top: 50px;
}
</style>

View File

@ -0,0 +1,61 @@
<template>
<div class="jump">
<!-- <p style="24px">
正在跳转到支付页面请稍候~
</p> -->
<img src="@/assets/images/loading.gif" alt="" />
</div>
</template>
<script>
import {getRedirectUrl} from '@/api/api';
import config from "@/config";
//
// channelUserId,
export default {
components: {
},
mounted() {
console.log("正在跳转", this.$router.params)
// eslint-disable-next-line no-constant-condition
// if( true ){
// this.$router.push({name: "CashierAlipay"})
// return;
// }
//TODO userId
// if(channelUserId.getChannelUserId()){//
//
// //
// this.$router.push({name: wayCodeUtils.getPayWay().routeName})
// return ;
//
// }
const that = this;
//
getRedirectUrl().then(res => {
location.href = res;
}).catch(res => {
that.$router.push({name: config.errorPageRouteName, params: {errInfo: res.msg}})
});
}
}
</script>
<style lang="css" scoped>
.jump {
height:100vh;
width: 100vw;
display:flex;
justify-content: center;
align-items: center;
}
</style>

View File

@ -0,0 +1,56 @@
<template>
<div>
<!-- <p style="font-size:16px;">获取用户ID信息</p> -->
<p style="font-size:16px;">正在跳转...</p>
</div>
</template>
<script>
import {getChannelUserId} from '@/api/api'
import wayCodeUtils from '@/utils/wayCode'
import channelUserIdUtil from '@/utils/channelUserId'
import config from "@/config";
export default {
components: {
},
mounted() {
const allQuery = Object.assign({}, this.searchToObject(), this.$route.query)
const that = this;
getChannelUserId(allQuery).then(res => {
//channelUserId
channelUserIdUtil.setChannelUserId(res);
this.$router.push({name: wayCodeUtils.getPayWay().routeName})
}).catch(res => {
that.$router.push({name: config.errorPageRouteName, params: {errInfo: res.msg}})
});
},
methods: {
searchToObject: function() {
if(!window.location.search){
return {};
}
var pairs = window.location.search.substring(1).split("&"),
result = {},
pair,
i;
for ( i in pairs ) {
if ( pairs[i] === "" ) continue;
pair = pairs[i].split("=");
result[ decodeURIComponent( pair[0] ) ] = decodeURIComponent( pair[1] );
}
return result;
}
}
}
</script>

View File

@ -0,0 +1,133 @@
<!--
* @Author: your name
* @Date: 2020-12-23 09:04:09
* @LastEditors: 王会峰
* @LastEditTime: 2021-01-13 11:04:20
* @FilePath: \pay\src\components\dialog\dialog.vue
* @SendWord: 永无BUG vite
-->
<template>
<div class="dialog">
<div class="dialog-box">
<div class="dialog-remark">添加备注</div>
<div class="dialog-input">
<input
type="text"
placeholder="最多输入10个字"
maxlength="10"
v-model="remarkC2"
/>
</div>
<div class="dialog-bnt">
<div class="dialog-bnt-l" @click="myDialogStateFn(false)">取消</div>
<div class="dialog-bnt-r" @click="myDialogStateFn(true)">确认</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "MyDialog",
data() {
return {
// remark: "",
remarkC: "",
remarkC2: "",
};
},
props: {
remark: {
type: String,
default: () => "",
},
},
/* mounted() {
this.remarkC = this.remark
}, */
created() {
this.remarkC = this.remark;
this.remarkC2 = this.remark;
},
methods: {
myDialogStateFn(remarkSate) {
let remark = this.remarkC2;
let remarkC = this.remarkC;
this.$emit("myDialogStateFn", remarkSate ? remark + "" : remarkC + "");
!remarkSate && (this.remarkC2 = remarkC);
remarkSate && (this.remarkC = remark);
},
},
};
</script>
<style lang="css" scoped>
.dialog {
z-index: 999;
top: 0;
left: 0;
position: fixed;
display: flex;
justify-content: center;
align-items: center;
width: 100vw;
height: 100vh;
background: rgba(0, 0, 0, 0.6);
}
.dialog-box {
width: 600px;
height: 359px;
background: #ffffff;
border-radius: 15px;
padding: 50px 0;
}
.dialog-remark {
width: 100%;
height: 46px;
font-size: 33px;
font-family: PingFang SC, PingFang SC-Bold;
font-weight: 700;
text-align: center;
color: #000000;
}
.dialog-input {
margin: 50px auto;
width: 510px;
height: 60px;
border-bottom: 1px solid #cccccc;
}
.dialog-input input {
margin-bottom: 5px;
width: 100%;
height: 46px;
font-size: 33px;
font-family: PingFang SC, PingFang SC-Regular;
font-weight: 400;
text-align: left;
border: none;
outline: none;
}
.dialog-bnt {
display: flex;
justify-content: space-between;
width: 100%;
border-top: 1px solid #e5e5e5;
}
.dialog-bnt div {
width: 50%;
height: 100px;
font-size: 30px;
font-family: PingFang SC, PingFang SC-Medium;
font-weight: 500;
text-align: center;
line-height: 100px;
}
.dialog-bnt-l {
color: #b2b2b2;
border-right: 1px solid #e5e5e5;
}
.dialog-bnt-r {
/* border-left: 1px solid #e5e5e5; */
color: #587cca;
}
</style>

View File

@ -0,0 +1,39 @@
/*
* @Author: your name
* @Date: 2020-12-23 09:05:40
* @LastEditors: 王会峰
* @LastEditTime: 2020-12-23 09:12:16
* @FilePath: \pay\src\components\dialog\index.js
* @SendWord: 永无BUG vite
*/
import Vue from 'vue'
import Dialog from './dialog.vue'
const dialog = Vue.extend(Dialog)
Dialog.install = function(options, type) {
if (options === undefined || options === null) {
options = {
content: ''
}
} else if (typeof options === 'string' || typeof options === 'number') {
options = {
content: options
}
if (type != undefined && options != null) {
options.type = type;
}
}
let instance = new dialog({
data: options
}).$mount()
// document.querySelector('#app')
document.body.appendChild(instance.$el)
Vue.nextTick(() => {
instance.visible = true
})
}
export default Dialog

View File

@ -0,0 +1,374 @@
<!--
* @Author: your name
* @Date: 2020-12-23 10:46:37
* @LastEditors: 王会峰
* @LastEditTime: 2020-12-30 11:02:25
* @FilePath: \pay\src\components\keyboard\keyboard.vue
* @SendWord: 永无BUG vite
-->
<template>
<div class="keyboard">
<div class="keyboard-top">
<div class="triangle-topleft-k"></div>
<div class="keyboard-tite">@小新支付</div>
<div class="triangle-topleft-k" @click="concealSateFn">
<div
class="triangle-topleft"
:style="
concealSate ? '' : 'transform:rotate(-135deg);margin-top: 12px;'
"
></div>
</div>
</div>
<div
class="keyboard-main"
v-show="concealSate"
style="transition: all 1s ease"
>
<div
v-for="(item, index) in numberList"
:key="index"
class="keyborad-key"
>
<!-- @click="onKeyboard(it, $event)" -->
<div
ref="number"
class="number"
v-for="(it, ind) in item"
:key="ind"
@touchstart.prevent="goTouchstart(it, $event)"
@touchend.prevent="goTouchend(it, $event)"
>
{{ it != "del" ? it : "" }}
<template class="" v-if="it == 'del'">
<!-- <div class="jiao"></div>
<div class="juxing"></div> -->
<img src="../../assets/icon/del.png" alt="" />
</template>
</div>
</div>
<div class="keyborad-key">
<div
class="number"
@touchstart.prevent="goTouchstart('dot', $event)"
@touchend.prevent="goTouchend('dot', $event)"
>
<div class="dot"></div>
</div>
<div
class="number zero"
@touchstart.prevent="goTouchstart('zero', $event)"
@touchend.prevent="goTouchend('zero', $event)"
>
0
</div>
</div>
</div>
<div
:class="paymentClassFn"
:style="'background:' + typeColor + ';'"
@click="payment"
>
<div>付款</div>
</div>
</div>
</template>
<script>
export default {
name: "Keyboard",
data() {
return {
timeOutEvent: 0, //
tiemIntervalEvent: 0,
concealSateC: true,
numberList: [
[1, 2, 3, "del"],
[4, 5, 6],
[7, 8, 9],
],
};
},
computed: {
paymentClassFn() {
// `this` vm
let className1 = this.concealSate ? "payment" : "paymentConceal";
let className2 = this.money != -1 && this.money != "" ? "" : "opacityS";
return className1 + " " + className2;
},
},
props: {
typeColor: {
type: String,
default: "#07c160",
},
money: {
type: String | Number,
default: -1,
},
concealSate: {
type: Boolean,
default: true,
},
},
mounted() {
this.concealSateC = this.concealSate;
},
methods: {
f() {},
payment() {
this.$emit("payment");
},
concealSateFn() {
// this.concealSateC = !this.concealSateC;
this.$emit("conceal");
},
onKeyboard(item, $event) {
/* setTimeout(() => {
$event.style.background = "#fafafa";
}, 100); */
// animation: heartBeat 0.2s;
if (item == "del") {
this.$emit("delTheAmount", item);
return;
}
let obj = {
zero: 0,
dot: ".",
};
if (typeof item != "number") {
item = obj[item];
}
this.$emit("enterTheAmount", item);
},
goTouchstart(it, $event) {
if (
$event.srcElement.localName == "img" ||
$event.srcElement.className == "dot"
) {
$event = $event.target.parentNode;
} else {
$event = $event.target;
}
$event.style.background = "rgba(197, 197, 197, 0.7)";
let _this = this;
clearTimeout(_this.timeOutEvent);
_this.timeOutEvent = setTimeout(function () {
_this.timeOutEvent = 0;
if (it == "del") {
clearInterval(_this.tiemIntervalEvent);
_this.delLong(it);
return;
}
// ...
}, 600);
},
//600
goTouchend(it, $event) {
console.log("goTouchend");
if (
$event.srcElement.localName == "img" ||
$event.srcElement.className == "dot"
) {
$event = $event.target.parentNode;
} else {
$event = $event.target;
}
$event.style.background = "#fafafa";
let _this = this;
clearTimeout(_this.timeOutEvent);
clearInterval(_this.tiemIntervalEvent);
if (_this.timeOutEvent !== 0) {
//
this.onKeyboard(it, $event);
}
},
// 退
delLong(item) {
//
this.tiemIntervalEvent = setInterval(() => {
this.$emit("delTheAmount", item);
}, 200);
},
},
};
</script>
<style lang="css" scoped>
@keyframes switchColor {
0% {
background-color: #fff;
}
50% {
background-color: #bbbbbb;
}
100% {
background-color: #fff;
}
}
@font-face {
font-family: "wxFirstFont";
src: url("../../assets/wx-zt/WeChatSansSS-Bold.ttf"); /* IE9 */
}
img {
margin: 0;
padding: 0;
}
.keyboard {
position: relative;
background-color: #ffffff;
}
.keyboard-top {
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
height: 60px;
background: #fafafa;
border: 1px solid #e1e2e6;
border-bottom: 0px solid #e1e2e6;
}
.keyboard-tite {
/* margin-right: -40px; */
font-size: 22px;
font-family: wxFirstFont SC, PingFang SC, PingFang SC-Medium;
font-weight: 500;
text-align: center;
color: #bbbdbf;
letter-spacing: 1px;
}
.triangle-topleft-k {
width: 200px;
/* height: 100%; */
display: flex;
justify-content: flex-end;
}
.triangle-topleft {
margin-top: -15px;
margin-right: 30px;
transform: rotate(45deg);
width: 0;
height: 0;
border-bottom: 18px solid #b2b2b2;
border-left: 18px solid transparent;
}
.keyboard-main {
width: 100%;
}
.keyborad-key {
display: flex;
flex-flow: wrap;
}
/* .del {
display: flex;
flex-flow: nowrap;
} */
.jiao {
margin-top: 4px;
margin-right: -16px;
width: 28px;
height: 28px;
transform: rotate(-45deg);
border-top: 3px solid #2c2c2c;
border-left: 3px solid #2c2c2c;
border-radius: 4px;
}
.juxing {
width: 40px;
height: 37px;
border: 3px solid #2c2c2c;
border-left: none;
border-radius: 4px;
}
.keyboard-main .number {
/* flex-grow: 1; */
display: flex;
justify-content: center;
align-items: center;
/* width: 187px; */
width: 25%;
height: 100px;
background: #fafafa;
border: 1px solid #e1e2e6;
border-bottom: none;
border-left: none;
font-size: 56px;
font-family: PingFang SC, PingFang SC-Medium;
font-weight: 500;
text-align: center;
line-height: 100px;
color: #242526;
letter-spacing: 2px;
}
.number img {
height: 37px;
width: 51px;
}
/* .number:active {
background-color: rgba(197, 197, 197, 0.527);
} */
.dot {
width: 6px;
height: 6px;
border-radius: 3px;
background-color: #242526 !important;
}
.keyboard-main .zero {
/* flex-grow: 2; */
width: 50%;
/* width: 374px; */
}
.payment {
flex-grow: 1;
position: absolute;
display: flex;
align-items: center;
bottom: 0;
right: 0;
width: calc(100vw / 4);
height: 300px;
background: #07c160;
transition: all 0.3s ease;
}
.paymentConceal {
flex-grow: 1;
position: absolute;
display: flex;
align-items: center;
right: 30px;
top: -180px;
/* width: 189px; */
width: calc(100vw / 4);
height: 150px;
background: #07c160;
border-radius: 10px;
transition: all 0.3s ease;
}
.payment div {
width: 100%;
font-size: 36px;
font-family: PingFang SC, PingFang SC-Medium;
font-weight: 500;
text-align: center;
color: #ffffff;
letter-spacing: 1px;
}
.paymentConceal div {
width: 100%;
font-size: 36px;
font-family: PingFang SC, PingFang SC-Medium;
font-weight: 500;
text-align: center;
color: #ffffff;
letter-spacing: 1px;
}
.opacityS {
opacity: 0.6;
}
</style>

View File

@ -0,0 +1,149 @@
<template>
<div>
<header class="header">
<div class="header-text">付款给 {{ payOrderInfo.mchName }}</div>
<div class="header-img">
<img :src="avatar ? avatar : icon_member_default" alt="" />
</div>
</header>
<div class="plus-input">
<!-- 字符 货币的符号-->
<div class="S">
<img src="../../assets/icon/S.svg" alt="" />
</div>
<!-- 手写输入框 -->
<div class="input-c">
<div class="input-c-div-1">{{ payOrderInfo.amount/100 }}</div>
</div>
<!-- 手写输入框的提示文字 -->
<div v-show="!amount" class="placeholder">请输入金额</div>
</div>
<ul class="plus-ul" >
<!-- 支付板块 -->
<li style="border-radius:10px;">
<!-- 支付金额板块 -->
<div class="img-div">
<img :src="wxImg" alt="" />
<div class="div-text">
支付宝支付
</div>
</div>
</li>
</ul>
<div class="bnt-pay">
<div
class="bnt-pay-text"
style="background-color:#1678ff"
@click="pay"
>
付款
</div>
</div>
</div>
</template>
<script>
import { getPayPackage, getPayOrderInfo } from '@/api/api'
import config from "@/config";
export default {
data: function (){
return {
merchantName: 'jeepay', //
avatar: require("../../assets/images/zfb.jpeg"), //
amount: 1, //
resData : {},
wxImg: require("../../assets/images/zfb.jpeg"), //
payOrderInfo: {}, //
}
},
mounted() {
this.setPayOrderInfo(true); // &
},
methods: {
setPayOrderInfo(isAutoPay){
const that = this
getPayOrderInfo().then(res => {
that.payOrderInfo = res
if(isAutoPay){
that.pay()
}
}).catch(res => {
that.$router.push({name: config.errorPageRouteName, params: {errInfo: res.msg}})
});
},
pay: function (){
let that = this;
getPayPackage(this.amount).then(res => {
//
if(res.code != '0') {
return alert(res.msg);
}
if(res.data.orderState != 1 ) { //
return alert(res.data.errMsg);
}
if (!window.AlipayJSBridge) {
document.addEventListener('AlipayJSBridgeReady', function(){
that.doAlipay(res.data.alipayTradeNo);
}, false);
}else{
that.doAlipay(res.data.alipayTradeNo);
}
}).catch(res => {
that.$router.push({name: config.errorPageRouteName, params: {errInfo: res.msg}})
});
},
doAlipay(alipayTradeNo){
const that = this
// eslint-disable-next-line no-undef
AlipayJSBridge.call("tradePay", {
tradeNO: alipayTradeNo
}, function (data) {
if ("9000" == data.resultCode) {
// alert('');
// //
if(that.payOrderInfo.returnUrl){
location.href = that.payOrderInfo.returnUrl;
}else{
alert('支付成功!');
window.AlipayJSBridge.call('closeWebview')
}
//8000;
// 6004 ;
}else if("8000" == data.resultCode || "6004" == data.resultCode){ //
alert(JSON.stringify(data));
window.AlipayJSBridge.call('closeWebview')
}else{ ///
alert('用户已取消!');
window.AlipayJSBridge.call('closeWebview')
}
});
},
}
}
</script>
<style lang="css" scoped>
@import './pay.css';
</style>

View File

@ -0,0 +1,203 @@
<template>
<div>
<header class="header">
<div class="header-text">付款给{{ payOrderInfo.mchName }}</div>
<div class="header-img">
<img :src="avatar ? avatar : icon_member_default" alt="" />
</div>
</header>
<div class="plus-input">
<!-- 字符 货币的符号-->
<div class="S">
<img src="../../assets/icon/S.svg" alt="" />
</div>
<!-- 输入框光标 -->
<!-- <div class="ttt">
<div
class="input-c-div"
style="background: #07c160"
></div>
</div> -->
<!-- 手写输入框 -->
<div class="input-c">
<div class="input-c-div-1">{{ payOrderInfo.amount/100 }}</div>
<!-- 数字金额后边的光标 -->
<!-- <div class="input-c-div" style="background:#07c160"></div> -->
</div>
<!-- 手写输入框的提示文字 -->
<div v-show="!amount" class="placeholder">请输入金额</div>
</div>
<ul class="plus-ul" >
<!-- 支付板块 -->
<li
style="border-radius:10px;"
>
<!-- 支付金额板块 -->
<div class="img-div">
<img :src="wxImg" alt="" />
<div class="div-text">
微信支付
</div>
</div>
</li>
</ul>
<!-- 备注板块 目前不需要添加备注隐藏-->
<!-- <div class="remark-k" :class="payType != 'wx' ? 'margin-top-30' : ''">
<div class="remark">
<div class="remark-hui" v-show="remark">{{ remark }}</div>
<div @click="myDialogStateFn">{{ remark ? "修改" : "添加备注" }}</div>
</div>
</div> -->
<!-- dialog 对话框 目前不需要添加备注隐藏-->
<!-- <MyDialog
v-show="myDialogState"
@myDialogStateFn="myDialogStateFn"
:remark="remark"
>
</MyDialog> -->
<!-- 键盘板块 目前不需要键盘 隐藏 -->
<!-- <div class="keyboard-plus" v-if="isAllowModifyAmount">
<Keyboard
@delTheAmount="delTheAmount"
@conceal="conceal"
@enterTheAmount="enterTheAmount"
@payment="payment"
:money="money"
:concealSate="concealSate"
:typeColor="typeColor[payType]"
></Keyboard>
</div> -->
<!-- jeepay中付款的点击事件 payment 修改为 pay -->
<!-- jeepay中付款页面是唯一的颜色不在需要v-bind去掉即可 -->
<!-- <div class="bnt-pay" v-if="!isAllowModifyAmount"> -->
<div class="bnt-pay">
<div
class="bnt-pay-text"
style="background-color:#07c160"
@click="pay"
>
付款
</div>
</div>
</div>
</template>
<script>
// import MyDialog from "./../dialog/dialog"; //
// import Keyboard from "./../keyboard/keyboard"; //
import {getPayPackage, getPayOrderInfo }from '@/api/api'
import config from "@/config";
export default {
//
// components: { MyDialog, Keyboard },
data: function (){
return {
merchantName: 'jeepay', //
avatar: require("../../assets/icon/wx.svg"), //
amount: 1, //
resData : {},
wxImg: require("../../assets/icon/wx.svg"), //
payOrderInfo: {}, //
}
},
mounted() {
this.setPayOrderInfo(true); // &
},
methods: {
setPayOrderInfo(isAutoPay){
const that = this
getPayOrderInfo().then(res => {
that.payOrderInfo = res
if(isAutoPay){
that.pay()
}
}).catch(res => {
that.$router.push({name: config.errorPageRouteName, params: {errInfo: res.msg}})
});
},
//
pay: function (){
//
let that = this;
getPayPackage(this.amount).then(res => {
if(res.code != '0') {
return alert(res.msg);
}
if(res.data.orderState != 1 ) { //
return alert(res.data.errMsg);
}
that.resData = res.data;
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', that.onBridgeReady, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', that.onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', that.onBridgeReady);
}
}else{
that.onBridgeReady();
}
}).catch(res => {
that.$router.push({name: config.errorPageRouteName, params: {errInfo: res.msg}})
});
},
/* 唤醒微信支付*/
onBridgeReady() {
let that = this;
// eslint-disable-next-line no-undef
WeixinJSBridge.invoke(
'getBrandWCPayRequest', JSON.parse(that.resData.payInfo),
function(res) {
if (res.err_msg == "get_brand_wcpay_request:ok") {
// 使,
//res.err_msgok
// //
if(that.payOrderInfo.returnUrl){
location.href = that.payOrderInfo.returnUrl;
}else{
alert('支付成功!');
window.WeixinJSBridge.call('closeWindow')
}
}
if (res.err_msg == "get_brand_wcpay_request:cancel") {
alert("支付取消");
window.WeixinJSBridge.call('closeWindow')
}
if (res.err_msg == "get_brand_wcpay_request:fail") {
alert('支付失败:' + JSON.stringify(res))
window.WeixinJSBridge.call('closeWindow')
}
if (res.err_msg == "total_fee") {
alert('缺少参数')
window.WeixinJSBridge.call('closeWindow')
}
}
);
},
}
}
</script>
<style lang="css" scoped>
@import './pay.css';
</style>

View File

@ -0,0 +1,108 @@
<template>
<div>
<header class="header">
<div class="header-text">付款给{{ merchantName }}</div>
<div class="header-img">
<img :src="avatar ? avatar : icon_member_default" alt="" />
</div>
</header>
<div class="plus-input">
<!-- 字符 货币的符号-->
<div class="S">
<img src="../../assets/icon/S.svg" alt="" />
</div>
<!-- 手写输入框 -->
<div class="input-c">
<div class="input-c-div-1">{{ amount }}</div>
</div>
<!-- 手写输入框的提示文字 -->
<div v-show="!amount" class="placeholder">请输入金额</div>
</div>
<ul class="plus-ul" >
<!-- 支付板块 -->
<li style="border-radius:10px;">
<!-- 支付金额板块 -->
<div class="img-div">
<img :src="wxImg" alt="" />
<div class="div-text">
云闪付支付
</div>
</div>
</li>
</ul>
<div class="bnt-pay">
<!-- <div
class="bnt-pay-text"
style="background-color:#ff534d"
@click="pay"
>
付款
</div> -->
</div>
</div>
</template>
<script>
import {getPayPackage}from '@/api/api'
import config from "@/config";
export default {
data: function (){
return {
merchantName: 'jeepay', //
avatar: require("../../assets/images/ysf.jpg"), //
amount: 1, //
resData : {},
wxImg: require("../../assets/images/ysf.jpg") //
}
},
mounted() {
// this.pay(); //
},
methods: {
pay: function (){
let that = this;
getPayPackage(this.amount).then(res => {
console.log(res)
if (!window.AlipayJSBridge) {
document.addEventListener('AlipayJSBridgeReady', function(){
that.doAlipay(res.alipayTradeNo);
}, false);
}else{
that.doAlipay(res.alipayTradeNo);
}
}).catch(res => {
that.$router.push({name: config.errorPageRouteName, params: {errInfo: res.msg}})
});
},
doAlipay(alipayTradeNo){
// eslint-disable-next-line no-undef
AlipayJSBridge.call("tradePay", {
tradeNO: alipayTradeNo
}, function (data) {
if ("9000" == data.resultCode) {
alert('支付成功!');
}else{ //
}
});
},
}
}
</script>
<style lang="css" scoped>
@import './pay.css';
</style>

View File

@ -0,0 +1,323 @@
@font-face {
font-family: "wxFirstFont";
src: url("../../assets/wx-zt/WeChatSansSS-Bold.ttf"); /* IE9 */
}
@keyframes blink {
0% {
opacity: 0;
}
50% {
opacity: 1;
}
100% {
opacity: 0;
}
}
* {
box-sizing: border-box;
}
body {
background-color: #ededed;
}
.header {
box-sizing: border-box;
display: flex;
width: 100%;
height: 88px;
padding: 50px;
justify-content: space-between;
align-items: center;
}
.margin-top-30 {
margin-top: 30px;
}
.header-text {
width: calc(100% - 120px);
height: 50px;
line-height: 50px;
text-align: left;
height: 50px;
font-size: 36px;
font-family: PingFang SC, PingFang SC-Medium;
font-weight: 500;
color: #323232;
letter-spacing: 1px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.header-img {
flex-shrink: 0;
width: 80px;
height: 80px;
border-radius: 40px;
/* background-color: #ff7b7b; */
overflow: hidden;
}
.header-img img {
width: 100%;
height: 100%;
}
.plus-input {
padding-top: 60px;
display: flex;
flex-shrink: 0;
justify-content: safe;
margin: 0 auto;
border-bottom: 1px solid #cccccc;
width: calc(100vw - 140px);
min-width: 160px;
height: 180px;
}
.plus-input .S {
position: relative;
width: 30px;
height: 40px;
margin: 15px 15px 15px 0;
}
.plus-input .S img {
position: absolute;
top: 15px;
left: 0;
width: 100%;
height: 100%;
/* margin-top: 10px; */
}
.plus-input input {
height: 98px;
width: 90%;
font-size: 70px;
font-family: wxFirstFont SC, PingFang SC, PingFang SC-Medium;
font-weight: 800;
text-align: left;
color: #000000;
letter-spacing: 2px;
border: none;
outline: none;
/* background-color: #ededed; */
background-color: rgba(220, 20, 60, 0);
}
.ttt {
display: flex;
align-items: center;
height: 98px;
width: 4px;
font-size: 70px;
font-family: wxFirstFont SC, PingFang SC, PingFang SC-Medium;
font-weight: 800;
text-align: center;
color: #000000;
letter-spacing: 2px;
border: none;
outline: none;
background-color: #ededed00;
}
.input-c {
display: flex;
align-items: center;
height: 98px;
width: 40px;
font-size: 70px;
font-family: wxFirstFont SC, PingFang SC, PingFang SC-Medium;
font-weight: 800;
text-align: center;
color: #000000;
letter-spacing: 2px;
border: none;
outline: none;
background-color: #ededed00;
/* background-color: rgb(255, 7, 57); */
}
.input-c-div-1 {
flex-shrink: 0;
width: 36px;
padding-left: 2px;
text-align: center;
/* width: auto; */
}
.input-c-div {
position: relative;
flex-shrink: 0;
margin-left: 5px;
margin-right: 5px;
width: auto;
height: 66px;
/* background: #07c160; */
animation: blink 1s linear infinite;
border: 1px solid #07c160;
}
.placeholder {
color: #6b6b6b;
font-weight: 400;
text-align: left;
padding-top: 4px;
font-size: 60px;
}
.plus-input input::-webkit-input-placeholder {
/* placeholder颜色 */
color: #6b6b6b;
font-weight: 400;
/* placeholder字体大小 */
/* font-size: 12px; */
/* placeholder位置 */
text-align: left;
}
.plus-ul {
margin-top: 20px;
margin-bottom: 0;
padding: 30px;
width: 100%;
}
.plus-ul li {
position: relative;
background: #fafafa;
padding: 41px 30px;
display: flex;
justify-content: space-between;
}
.plus-li {
margin-bottom: 20px;
border-radius: 15px;
}
.border-radius-top {
border-radius: 15px 15px 0 0;
}
.border-radius-bottom {
border-radius: 0 0 15px 15px;
}
.xian {
position: absolute;
bottom: 0px;
right: 0;
width: calc(100% - 103px);
height: 1px;
background: #ebebeb;
}
.img-div {
display: flex;
flex-flow: row;
}
.img-div img {
width: 42px;
height: 42px;
margin-right: 30px;
}
.img-div .div-text {
height: 42px;
font-size: 30px;
font-family: PingFang SC, PingFang SC-Medium;
font-weight: 500;
text-align: left;
color: #323232;
letter-spacing: 1px;
}
.div-go {
display: flex;
flex-flow: row;
align-items: center;
}
.div-go img {
width: 30px;
height: 30px;
}
.div-go-div {
margin-right: 10px;
font-size: 27px;
font-family: PingFang SC, PingFang SC-Medium;
font-weight: 500;
text-align: right;
color: #808080;
letter-spacing: 1px;
}
.pitch-on {
display: flex;
flex-flow: row;
}
.pitch-on-ok {
display: flex;
justify-content: center;
align-items: center;
border-radius: 21px;
width: 42px;
height: 42px;
background: #11c930;
}
.pitch-on-ok img {
width: 22px;
height: 16px;
}
.pitch-on-on {
border-radius: 21px;
width: 42px;
height: 42px;
background: rgba(17, 201, 48, 0);
border: 1px solid #bfbfbf;
}
.remark-k {
margin-top: 30px;
width: 100%;
display: flex;
justify-content: center;
font-size: 25px;
font-family: PingFang SC, PingFang SC-Medium;
font-weight: 500;
text-align: left;
color: #587cca;
letter-spacing: 1px;
}
.remark {
display: flex;
flex-flow: row;
}
.remark-hui {
width: auto;
height: 36px;
font-size: 25px;
font-family: PingFang SC, PingFang SC-Medium;
font-weight: 500;
text-align: left;
color: #808080;
letter-spacing: 1px;
margin-right: 30px;
}
.remark-hu {
font-size: 25px;
font-family: PingFang SC, PingFang SC-Medium;
font-weight: 500;
text-align: left;
color: #808080;
letter-spacing: 1px;
margin-right: 30px;
}
.keyboard-plus {
width: 100%;
position: fixed;
left: 0;
bottom: 0;
}
.bnt-pay {
position: fixed;
display: flex;
justify-content: center;
align-items: center;
bottom: 100px;
width: 100vw;
z-index: 1;
}
.bnt-pay-text {
width: 300px;
color: #fff;
height: 100px;
border-radius: 16px;
background-color: darkgreen;
text-align: center;
line-height: 100px;
font-size: 40px;
}

View File

@ -0,0 +1,20 @@
// vue.config.js
const vueConfig = {
publicPath: process.env.VUE_APP_BASE_URL, // 前端资源访问根目录, 可配置到cdn目录下。 建议使用命令行环境变量进行替换。
devServer: {
disableHostCheck: true //不检查域名是否正确
},
css: {
loaderOptions: {
postcss: {
plugins: [
require('postcss-px2rem')({ remUnit: 75 }), // 换算的基数
]
}
}
}
}
module.exports = vueConfig

View File

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

4
jeepay-ui-manager/.env Normal file
View File

@ -0,0 +1,4 @@
NODE_ENV=production
VUE_APP_PREVIEW=false
VUE_APP_BASE_URL=/
VUE_APP_API_BASE_URL=

View File

@ -0,0 +1,4 @@
NODE_ENV=development
VUE_APP_PREVIEW=true
VUE_APP_BASE_URL=/
VUE_APP_API_BASE_URL=http://localhost:9217

View File

@ -0,0 +1,100 @@
/**
默认eslint规则
代码末尾不能加分号 ;强迫症的我受不了
代码中不能存在多行空行这个我更也忍不了大哭
tab键不能使用必须换成两个空格超级不习惯
代码中不能存在声明了但未使用的变量这个我觉得可以有
* **/
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
}
],
/**
* 分号配置项
* 第一个参数
" off"或0 - 关闭规则
" warn"或1 - 将该规则作为警告打开不影响退出代码
" error"或2 - 将规则作为错误打开退出代码将为1
*
*第二个参数
always默认在语句末尾需要分号
never不允许加分号
*
* 第三个参数
"beforeStatementContinuationChars": "any"默认如果下一行语句以 [(/+ - 开头忽略语句末尾的分号或缺失分号
"beforeStatementContinuationChars": "always" 如果下一行语句以 [(/+ - 开头在语句末尾需要添加分号
"beforeStatementContinuationChars": "never" 如果该语句不会因为ASI而带来风险那么即使它的下一行语句以 [(/+ - 开头也不允许在语句末尾添加分号
* **/
'semi': [
2,
'never',
{
'beforeStatementContinuationChars': 'never'
}
],
'no-delete-var': 2,
'prefer-const': [
2,
{
'ignoreReadBeforeAssign': false
}
],
'template-curly-spacing': 'off',
'indent': 'off'
},
parserOptions: {
parser: 'babel-eslint'
},
overrides: [
{
files: [
'**/__tests__/*.{j,t}s?(x)',
'**/tests/unit/**/*.spec.{j,t}s?(x)'
],
env: {
jest: true
}
}
]
}

View File

@ -0,0 +1,37 @@
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: [
'@vue/cli-plugin-babel/preset',
[
'@babel/preset-env',
{
'useBuiltIns': 'entry',
'corejs': 3
}
]
],
'plugins': [
[
'import',
{
'libraryName': 'ant-design-vue',
'libraryDirectory': 'es',
'style': 'css'
}
]
]
}

View File

@ -0,0 +1,69 @@
{
"name": "jeepay-ui-manager",
"version": "1.0.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"test:unit": "vue-cli-service test:unit",
"lint": "vue-cli-service lint",
"build:preview": "vue-cli-service build --mode preview",
"lint:nofix": "vue-cli-service lint --no-fix"
},
"dependencies": {
"@ant-design-vue/pro-layout": "^1.0.7",
"@antv/data-set": "^0.10.2",
"@antv/g2plot": "^2.3.21",
"@antv/util": "^2.0.13",
"ant-design-vue": "^1.7.2",
"axios": "^0.19.0",
"core-js": "^3.1.2",
"enquire.js": "^2.1.6",
"js-base64": "^2.5.2",
"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",
"store": "^2.0.12",
"viser-vue": "^2.4.6",
"vue": "^2.6.10",
"vue-clipboard2": "^0.2.1",
"vue-cropper": "0.4.9",
"vue-i18n": "^8.17.4",
"vue-quill-editor": "^3.0.6",
"vue-router": "^3.1.2",
"vue-svg-component-runtime": "^1.0.1",
"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-standard": "^4.0.0",
"@vue/test-utils": "^1.0.0-beta.29",
"babel-eslint": "^10.0.1",
"babel-plugin-import": "^1.12.2",
"babel-plugin-transform-remove-console": "^6.9.4",
"eslint": "^5.16.0",
"eslint-plugin-html": "^5.0.0",
"eslint-plugin-vue": "^5.2.3",
"git-revision-webpack-plugin": "^3.0.6",
"less": "^3.0.4",
"less-loader": "^5.0.0",
"opencollective": "^1.0.3",
"opencollective-postinstall": "^2.0.2",
"style-resources-loader": "^1.4.1",
"vue-cli-plugin-style-resources-loader": "^0.1.5",
"vue-svg-icon-loader": "^2.1.1",
"vue-template-compiler": "^2.6.10",
"webpack-theme-color-replacer": "^1.3.12"
}
}

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="198" height="44" viewBox="0 0 198 44"><defs><clipPath id="a"><rect width="141" height="36" fill="#262626"/></clipPath><clipPath id="b"><rect width="48" height="44" transform="translate(0.013 -0.162)" fill="#1a53ff"/></clipPath></defs><g transform="translate(-3298 -941)"><g transform="translate(2668.271 -1127)"><g transform="translate(686.73 2076)" clip-path="url(#a)"><path d="M942.424,2095.354A5.627,5.627,0,0,0,936.7,2091H924.375l-.505,3.6h12.076a3.074,3.074,0,0,1,2.434,1.072,2.282,2.282,0,0,1-1.758,3.728h-8a7.611,7.611,0,0,0-7.3,6.4l-.393,2.8a5.432,5.432,0,0,0,5.5,6.4h5.6a8.888,8.888,0,0,0,4.583-1.322l-.185,1.322h3.6l1.124-8,1.067-7.6.281-2h0A5.815,5.815,0,0,0,942.424,2095.354ZM938.115,2103l-.225,1.6-.337,2.4a5.24,5.24,0,0,1-5.016,4.4h-5.6a2.379,2.379,0,0,1-2.406-2.8l.393-2.8a3.334,3.334,0,0,1,3.192-2.8h8a6,6,0,0,0,2.051-.368Z" transform="translate(-827.264 -2085)" fill="#262626"/><path d="M811,2091h-7.2a7.611,7.611,0,0,0-7.3,6.4l-.534,3.8-.505,3.6-.534,3.8a5.432,5.432,0,0,0,5.5,6.4h7.2a7.611,7.611,0,0,0,7.3-6.4l.028-.2h-3.6l-.028.2a3.333,3.333,0,0,1-3.192,2.8h-7.2a2.379,2.379,0,0,1-2.406-2.8l.534-3.8H815.46l.505-3.6.534-3.8A5.432,5.432,0,0,0,811,2091Zm-11.428,10.2.534-3.8a3.333,3.333,0,0,1,3.192-2.8h7.2a2.379,2.379,0,0,1,2.406,2.8l-.534,3.8Z" transform="translate(-751.638 -2085)" fill="#262626"/><path d="M749,2091h-7.2a7.611,7.611,0,0,0-7.3,6.4l-.534,3.8-.505,3.6-.534,3.8a5.432,5.432,0,0,0,5.5,6.4h7.2a7.611,7.611,0,0,0,7.3-6.4l.028-.2h-3.6l-.028.2a3.333,3.333,0,0,1-3.192,2.8h-7.2a2.379,2.379,0,0,1-2.406-2.8l.534-3.8H753.46l.505-3.6.534-3.8A5.432,5.432,0,0,0,749,2091Zm-11.428,10.2.534-3.8a3.333,3.333,0,0,1,3.192-2.8h7.2a2.379,2.379,0,0,1,2.406,2.8l-.534,3.8Z" transform="translate(-714.425 -2085)" fill="#262626"/><path d="M702.938,2076h-8l-.562,4h4l-1.911,13.6-.73,5.2a3.811,3.811,0,0,1-3.648,3.2h-4.8l-.562,4h4.8a8.564,8.564,0,0,0,8.208-7.2l2.641-18.8h0Z" transform="translate(-686.73 -2076)" fill="#262626"/><path d="M1001.279,2091l-.506,3.6-.73,5.2-1.067,7.6-.169,1.2a3.334,3.334,0,0,1-3.192,2.8h-7.2a2.379,2.379,0,0,1-2.405-2.8l1.236-8.8.73-5.2.506-3.6h-3.6l-2.472,17.6a5.432,5.432,0,0,0,5.5,6.4h7.2a6.958,6.958,0,0,0,2.89-.652l-.092.652a2.854,2.854,0,0,1-2.736,2.4H982.379l-.506,3.6h12.793a7.136,7.136,0,0,0,6.84-6l.9-6.4.169-1.2,2.3-16.4Z" transform="translate(-863.877 -2085)" fill="#262626"/><path d="M872.537,2091h-7.2a6.958,6.958,0,0,0-2.89.652l.091-.652h-3.6l-.9,6.4-1.574,11.2L854.73,2121h3.6l.934-6.652a5.789,5.789,0,0,0,2.707.652h7.2a7.611,7.611,0,0,0,7.3-6.4l1.574-11.2A5.432,5.432,0,0,0,872.537,2091Zm.326,17.6a3.333,3.333,0,0,1-3.192,2.8h-7.2a2.379,2.379,0,0,1-2.406-2.8l1.574-11.2a3.334,3.334,0,0,1,3.192-2.8h7.2a2.379,2.379,0,0,1,2.406,2.8Z" transform="translate(-787.565 -2085)" fill="#262626"/></g></g><g transform="translate(267.246 -836.852)"><g transform="translate(3030.741 1778.014)" clip-path="url(#b)"><path d="M3045.511,1838h0l-6.29,5.493a3.121,3.121,0,0,0,2.066,5.471h11.29a1.094,1.094,0,0,0,.833-1.808Z" transform="translate(-3034.172 -1805.125)" fill="#1a53ff" opacity="0.5"/><path d="M3034.916,1783.662l-4.332,30.7a6.588,6.588,0,0,0,6.541,7.494h2.454a1.1,1.1,0,0,0,1.089-.943l1.148-8.134a2.2,2.2,0,0,1,2.177-1.886h7.184a2.2,2.2,0,0,0,2.179-1.886l1.014-7.189a2.2,2.2,0,0,1,2.18-1.887h6.562a2.2,2.2,0,0,1,2.18,2.5l-1.194,8.465-1.371,9.717a1.1,1.1,0,0,0,1.087,1.246h4a6.6,6.6,0,0,0,6.541-5.662l4.332-30.7a6.586,6.586,0,0,0-6.54-7.492h-30.694A6.6,6.6,0,0,0,3034.916,1783.662Zm29.588,10.782h-6.559a2.2,2.2,0,0,1-2.182-2.5l.928-6.574a2.2,2.2,0,0,1,2.182-1.889h6.557a2.2,2.2,0,0,1,2.183,2.5l-.928,6.574A2.2,2.2,0,0,1,3064.5,1794.445Z" transform="translate(-3030.743 -1778.014)" fill="#1a53ff"/></g></g></g></svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -0,0 +1,36 @@
<!DOCTYPE html>
<html lang="zh-cmn-Hans">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>imgs/favicon.ico">
<title>运营平台 - Jeepay计全支付</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">
<% { %>
<img type="text/javascript" src="<%= BASE_URL %>imgs/logo.svg">
<% } %>
<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 type="text/javascript" src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
<% } %>
<!-- built files will be auto injected -->
</body>
</html>

View File

@ -0,0 +1,31 @@
<template>
<a-config-provider :locale="locale">
<div id="app">
<router-view/>
<loading v-show="globalLoading"></loading>
</div>
</a-config-provider>
</template>
<script>
import zhCN from 'ant-design-vue/lib/locale-provider/zh_CN'
import Loading from './components/GlobalLoad/GlobalLoad' // Loading
import { mapState } from 'vuex' // vuexmapStateloading
export default {
data () {
return {
locale: zhCN
}
},
components: {
Loading // loading
},
computed: {
// loading
...mapState([
'globalLoading'
])
}
}
</script>

View File

@ -0,0 +1,35 @@
import request from '@/http/request'
import { Base64 } from 'js-base64'
// 登录认证接口
export function login ({ username, password, vercode, vercodeToken }) {
const data = {
ia: Base64.encode(username), // 账号
ip: Base64.encode(password), // 密码
vc: Base64.encode(vercode), // 验证码值
vt: Base64.encode(vercodeToken) // 验证码token
}
return request.request({
url: '/api/anon/auth/validate',
method: 'post',
data: data
}, true, false, false)
}
// 获取图形验证码信息接口
export function vercode () {
return request.request({ url: '/api/anon/auth/vercode', method: 'get' }, true, true, true)
}
// 获取当前用户信息
export function getInfo () {
return request.request({
url: '/api/current/user',
method: 'get'
})
}
// 退出接口
export function logout () {
return new Promise(resolve => { resolve() })
}

View File

@ -0,0 +1,275 @@
import request from '@/http/request'
/*
* 全系列 restful api格式, 定义通用req对象
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/5/8 07:18
*/
export const req = {
// 通用列表查询接口
list: (url, params) => {
return request.request({ url: url, method: 'GET', params: params }, true, true, false)
},
// 通用新增接口
add: (url, data) => {
return request.request({ url: url, method: 'POST', data: data }, true, true, false)
},
// 通用查询单条数据接口
getById: (url, bizId) => {
return request.request({ url: url + '/' + bizId, method: 'GET' }, true, true, false)
},
// 通用修改接口
updateById: (url, bizId, data) => {
return request.request({ url: url + '/' + bizId, method: 'PUT', data: data }, true, true, false)
},
// 通用删除接口
delById: (url, bizId) => {
return request.request({ url: url + '/' + bizId, method: 'DELETE' }, true, true, false)
}
}
// 全系列 restful api格式 (全局loading方式)
export const reqLoad = {
// 通用列表查询接口
list: (url, params) => {
return request.request({ url: url, method: 'GET', params: params }, true, true, true)
},
// 通用新增接口
add: (url, data) => {
return request.request({ url: url, method: 'POST', data: data }, true, true, true)
},
// 通用查询单条数据接口
getById: (url, bizId) => {
return request.request({ url: url + '/' + bizId, method: 'GET' }, true, true, true)
},
// 通用修改接口
updateById: (url, bizId, data) => {
return request.request({ url: url + '/' + bizId, method: 'PUT', data: data }, true, true, true)
},
// 通用删除接口
delById: (url, bizId) => {
return request.request({ url: url + '/' + bizId, method: 'DELETE' }, true, true, true)
}
}
/** 角色管理页面 **/
export const API_URL_ENT_LIST = '/api/sysEnts'
export const API_URL_ROLE_LIST = '/api/sysRoles'
export const API_URL_ROLE_ENT_RELA_LIST = '/api/sysRoleEntRelas'
export const API_URL_SYS_USER_LIST = '/api/sysUsers'
export const API_URL_USER_ROLE_RELA_LIST = '/api/sysUserRoleRelas'
/** 服务商、商户管理 **/
export const API_URL_ISV_LIST = '/api/isvInfo'
export const API_URL_MCH_LIST = '/api/mchInfo'
/** 支付订单管理 **/
export const API_URL_PAY_ORDER_LIST = '/api/payOrder'
/** 退款订单管理 **/
export const API_URL_REFUND_ORDER_LIST = '/api/refundOrder'
/** 商户通知管理 **/
export const API_URL_MCH_NOTIFY_LIST = '/api/mchNotify'
/** 系统日志 **/
export const API_URL_SYS_LOG = 'api/sysLog'
/** 系统配置 **/
export const API_URL_SYS_CONFIG = 'api/sysConfigs'
/** 首页统计 **/
export const API_URL_MAIN_STATISTIC = 'api/mainChart'
/** 支付接口定义页面 **/
export const API_URL_IFDEFINES_LIST = '/api/payIfDefines'
export const API_URL_PAYWAYS_LIST = '/api/payWays'
/** 服务商、商户支付参数配置 **/
export const API_URL_ISV_PAYCONFIGS_LIST = '/api/isv/payConfigs'
export const API_URL_MCH_PAYCONFIGS_LIST = '/api/mch/payConfigs'
/** 商户支付通道配置 **/
export const API_URL_MCH_PAYPASSAGE_LIST = '/api/mch/payPassages'
/** 上传图片/文件地址 **/
export const upload = {
avatar: request.baseUrl + '/api/ossFiles/avatar',
ifBG: request.baseUrl + '/api/ossFiles/ifBG',
cert: request.baseUrl + '/api/ossFiles/cert'
}
const api = {
user: '/user',
role_list: '/role',
service: '/service',
permission: '/permission',
permissionNoPager: '/permission/no-pager',
orgTree: '/org/tree'
}
export default api
/** 获取权限树状结构图 **/
export function getEntTree (system) {
return request.request({ url: '/api/sysEnts/showTree?system=' + system, method: 'GET' })
}
/** 更新用户角色信息 */
export function uSysUserRoleRela (sysUserId, roleIdList) {
return request.request({
url: 'api/sysUserRoleRelas/relas/' + sysUserId,
method: 'POST',
data: { roleIdListStr: JSON.stringify(roleIdList) }
})
}
export function getRoleList (parameter) {
return request({
url: '/api/sysRoles',
method: 'get',
params: parameter
})
}
export function getServiceList (parameter) {
return request({
url: api.service,
method: 'get',
params: parameter
})
}
export function getPermissions (parameter) {
return request({
url: api.permissionNoPager,
method: 'get',
params: parameter
})
}
export function getOrgTree (parameter) {
return request({
url: api.orgTree,
method: 'get',
params: parameter
})
}
// id == 0 add post
// id != 0 update put
export function saveService (parameter) {
return request({
url: api.service,
method: parameter.id === 0 ? 'post' : 'put',
data: parameter
})
}
export function saveSub (sub) {
return request({
url: '/sub',
method: sub.id === 0 ? 'post' : 'put',
data: sub
})
}
export function getIsvPayConfigUnique (infoId, ifCode) {
return request.request({
url: '/api/isv/payConfigs/' + infoId + '/' + ifCode,
method: 'get'
})
}
export function getMcgPayConfigUnique (infoId, ifCode) {
return request.request({
url: '/api/mch/payConfigs/' + infoId + '/' + ifCode,
method: 'get'
})
}
export function getAvailablePayInterfaceList (mchNo, wayCode) {
return request.request({
url: '/api/mch/payPassages/availablePayInterface/' + mchNo + '/' + wayCode,
method: 'GET'
})
}
export function getPayAmountWeek () {
return request.request({
url: API_URL_MAIN_STATISTIC + '/payAmountWeek',
method: 'GET'
})
}
export function getNumCount () {
return request.request({
url: API_URL_MAIN_STATISTIC + '/numCount',
method: 'GET'
})
}
export function getPayCount (parameter) {
return request.request({
url: API_URL_MAIN_STATISTIC + '/payCount',
method: 'GET',
params: parameter
})
}
export function getPayType (parameter) {
return request.request({
url: API_URL_MAIN_STATISTIC + '/payTypeCount',
method: 'GET',
params: parameter
})
}
export function getMainUserInfo (parameter) {
return request.request({
url: API_URL_MAIN_STATISTIC + '/' + parameter,
method: 'GET'
})
}
export function updateUserPass (parameter) {
return request.request({
url: '/api/current/modifyPwd',
method: 'put',
data: parameter
})
}
export function updateUserInfo (parameter) {
return request.request({
url: '/api/current/user',
method: 'put',
data: parameter
})
}
export function getUserInfo () {
return request.request({
url: '/api/current/user',
method: 'get'
})
}
export function getConfigs (parameter) {
return request.request({
url: API_URL_SYS_CONFIG + '/' + parameter,
method: 'GET'
})
}
export function getEntBySystem (entId, system) {
return request.request({
url: '/api/sysEnts/bySystem',
method: 'GET',
params: { entId: entId, system: system }
})
}

View File

@ -0,0 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 32 32">
<defs>
<clipPath id="clip-path">
<rect id="矩形_2548" data-name="矩形 2548" width="32" height="32" transform="translate(6848 11598)" fill="#fff" stroke="#707070" stroke-width="1"/>
</clipPath>
<clipPath id="clip-path-2">
<rect id="矩形_2547" data-name="矩形 2547" width="32" height="29.211" transform="translate(0 0)" fill="#1953ff"/>
</clipPath>
</defs>
<g id="logo-jeepay" transform="translate(-6848 -11598)" clip-path="url(#clip-path)">
<g id="组_1000" data-name="组 1000" transform="translate(3462.959 9987.395)">
<g id="组_999" data-name="组 999" transform="translate(3385.041 1612)" clip-path="url(#clip-path-2)">
<path id="路径_4157" data-name="路径 4157" d="M3398.508,1679.5h0l-4.173,3.659a2.08,2.08,0,0,0,1.371,3.644h7.49a.729.729,0,0,0,.553-1.2Z" transform="translate(-3390.837 -1657.592)" fill="#1953ff" opacity="0.5"/>
<path id="路径_4158" data-name="路径 4158" d="M3387.958,1615.772l-2.874,20.448a4.382,4.382,0,0,0,4.339,4.991h1.628a.73.73,0,0,0,.723-.628l.762-5.418a1.459,1.459,0,0,1,1.445-1.256h4.765a1.46,1.46,0,0,0,1.446-1.256l.673-4.789a1.461,1.461,0,0,1,1.446-1.257h4.353a1.461,1.461,0,0,1,1.446,1.664l-.792,5.639-.91,6.473a.729.729,0,0,0,.722.83h2.655a4.382,4.382,0,0,0,4.339-3.772l2.874-20.448a4.381,4.381,0,0,0-4.338-4.991H3392.3A4.382,4.382,0,0,0,3387.958,1615.772Zm19.628,7.182h-4.351a1.462,1.462,0,0,1-1.447-1.665l.615-4.379a1.462,1.462,0,0,1,1.448-1.258h4.351a1.462,1.462,0,0,1,1.448,1.665l-.615,4.379A1.462,1.462,0,0,1,3407.586,1622.954Z" transform="translate(-3385.041 -1612)" fill="#1953ff"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="198" height="44" viewBox="0 0 198 44"><defs><clipPath id="a"><rect width="141" height="36" fill="#262626"/></clipPath><clipPath id="b"><rect width="48" height="44" transform="translate(0.013 -0.162)" fill="#1a53ff"/></clipPath></defs><g transform="translate(-3298 -941)"><g transform="translate(2668.271 -1127)"><g transform="translate(686.73 2076)" clip-path="url(#a)"><path d="M942.424,2095.354A5.627,5.627,0,0,0,936.7,2091H924.375l-.505,3.6h12.076a3.074,3.074,0,0,1,2.434,1.072,2.282,2.282,0,0,1-1.758,3.728h-8a7.611,7.611,0,0,0-7.3,6.4l-.393,2.8a5.432,5.432,0,0,0,5.5,6.4h5.6a8.888,8.888,0,0,0,4.583-1.322l-.185,1.322h3.6l1.124-8,1.067-7.6.281-2h0A5.815,5.815,0,0,0,942.424,2095.354ZM938.115,2103l-.225,1.6-.337,2.4a5.24,5.24,0,0,1-5.016,4.4h-5.6a2.379,2.379,0,0,1-2.406-2.8l.393-2.8a3.334,3.334,0,0,1,3.192-2.8h8a6,6,0,0,0,2.051-.368Z" transform="translate(-827.264 -2085)" fill="#262626"/><path d="M811,2091h-7.2a7.611,7.611,0,0,0-7.3,6.4l-.534,3.8-.505,3.6-.534,3.8a5.432,5.432,0,0,0,5.5,6.4h7.2a7.611,7.611,0,0,0,7.3-6.4l.028-.2h-3.6l-.028.2a3.333,3.333,0,0,1-3.192,2.8h-7.2a2.379,2.379,0,0,1-2.406-2.8l.534-3.8H815.46l.505-3.6.534-3.8A5.432,5.432,0,0,0,811,2091Zm-11.428,10.2.534-3.8a3.333,3.333,0,0,1,3.192-2.8h7.2a2.379,2.379,0,0,1,2.406,2.8l-.534,3.8Z" transform="translate(-751.638 -2085)" fill="#262626"/><path d="M749,2091h-7.2a7.611,7.611,0,0,0-7.3,6.4l-.534,3.8-.505,3.6-.534,3.8a5.432,5.432,0,0,0,5.5,6.4h7.2a7.611,7.611,0,0,0,7.3-6.4l.028-.2h-3.6l-.028.2a3.333,3.333,0,0,1-3.192,2.8h-7.2a2.379,2.379,0,0,1-2.406-2.8l.534-3.8H753.46l.505-3.6.534-3.8A5.432,5.432,0,0,0,749,2091Zm-11.428,10.2.534-3.8a3.333,3.333,0,0,1,3.192-2.8h7.2a2.379,2.379,0,0,1,2.406,2.8l-.534,3.8Z" transform="translate(-714.425 -2085)" fill="#262626"/><path d="M702.938,2076h-8l-.562,4h4l-1.911,13.6-.73,5.2a3.811,3.811,0,0,1-3.648,3.2h-4.8l-.562,4h4.8a8.564,8.564,0,0,0,8.208-7.2l2.641-18.8h0Z" transform="translate(-686.73 -2076)" fill="#262626"/><path d="M1001.279,2091l-.506,3.6-.73,5.2-1.067,7.6-.169,1.2a3.334,3.334,0,0,1-3.192,2.8h-7.2a2.379,2.379,0,0,1-2.405-2.8l1.236-8.8.73-5.2.506-3.6h-3.6l-2.472,17.6a5.432,5.432,0,0,0,5.5,6.4h7.2a6.958,6.958,0,0,0,2.89-.652l-.092.652a2.854,2.854,0,0,1-2.736,2.4H982.379l-.506,3.6h12.793a7.136,7.136,0,0,0,6.84-6l.9-6.4.169-1.2,2.3-16.4Z" transform="translate(-863.877 -2085)" fill="#262626"/><path d="M872.537,2091h-7.2a6.958,6.958,0,0,0-2.89.652l.091-.652h-3.6l-.9,6.4-1.574,11.2L854.73,2121h3.6l.934-6.652a5.789,5.789,0,0,0,2.707.652h7.2a7.611,7.611,0,0,0,7.3-6.4l1.574-11.2A5.432,5.432,0,0,0,872.537,2091Zm.326,17.6a3.333,3.333,0,0,1-3.192,2.8h-7.2a2.379,2.379,0,0,1-2.406-2.8l1.574-11.2a3.334,3.334,0,0,1,3.192-2.8h7.2a2.379,2.379,0,0,1,2.406,2.8Z" transform="translate(-787.565 -2085)" fill="#262626"/></g></g><g transform="translate(267.246 -836.852)"><g transform="translate(3030.741 1778.014)" clip-path="url(#b)"><path d="M3045.511,1838h0l-6.29,5.493a3.121,3.121,0,0,0,2.066,5.471h11.29a1.094,1.094,0,0,0,.833-1.808Z" transform="translate(-3034.172 -1805.125)" fill="#1a53ff" opacity="0.5"/><path d="M3034.916,1783.662l-4.332,30.7a6.588,6.588,0,0,0,6.541,7.494h2.454a1.1,1.1,0,0,0,1.089-.943l1.148-8.134a2.2,2.2,0,0,1,2.177-1.886h7.184a2.2,2.2,0,0,0,2.179-1.886l1.014-7.189a2.2,2.2,0,0,1,2.18-1.887h6.562a2.2,2.2,0,0,1,2.18,2.5l-1.194,8.465-1.371,9.717a1.1,1.1,0,0,0,1.087,1.246h4a6.6,6.6,0,0,0,6.541-5.662l4.332-30.7a6.586,6.586,0,0,0-6.54-7.492h-30.694A6.6,6.6,0,0,0,3034.916,1783.662Zm29.588,10.782h-6.559a2.2,2.2,0,0,1-2.182-2.5l.928-6.574a2.2,2.2,0,0,1,2.182-1.889h6.557a2.2,2.2,0,0,1,2.183,2.5l-.928,6.574A2.2,2.2,0,0,1,3064.5,1794.445Z" transform="translate(-3030.743 -1778.014)" fill="#1a53ff"/></g></g></g></svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -0,0 +1,17 @@
@jee-theme: #1A53FF; //主题色
@jee-back: #F0F2F5; //主要背景色
@jee-card-back: #FFF; //卡片底色
@jee-theme-mask: rgba(26,83,255,0.1); //主体遮罩色(10% 透明度)
@jee-strengthen: #596380; //强化色
@jee-theme-hover: #0033CC; //主题Hover
@jee-warning: #FF4B33; //危险,强化警告色
@jee-inside-link: #1A79FF; //内部链接
@jee-external-link: #AE1B6E; //外部链接

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="308" height="230" viewBox="0 0 308 230"><defs><style>.a{fill:none;}.b{clip-path:url(#a);}.c{opacity:0.05;}.d{opacity:0.1;}.e{fill:#999691;}.f{fill:#ffd200;}.g{fill:#aeb8c2;}.h{fill:#ff4633;}.i{fill:#fff;}</style><clipPath id="a"><rect class="a" width="308" height="230" transform="translate(179 574)"/></clipPath></defs><g transform="translate(-179 -574)"><g class="b"><ellipse class="c" cx="154" cy="35" rx="154" ry="35" transform="translate(179 734)"/><ellipse class="d" cx="34" cy="7.727" rx="34" ry="7.727" transform="translate(354 774.773)"/><path class="e" d="M235.514,736.729H179V716.794l40.835-86.53H244.19l-40.835,86.53h32.159V683.575h21.607v33.219h11.958v19.935H257.121V757.8H235.514Z"/><path class="e" d="M290.391,714.573V673.478c0-27.189,18.694-45.883,45.883-45.883s45.884,18.694,45.884,45.883v41.095c0,27.2-18.694,45.883-45.884,45.883S290.391,741.777,290.391,714.573Zm69.979,1.515v-44.2a24.092,24.092,0,1,0-48.184,0v44.2a24.092,24.092,0,0,0,48.184,0Z"/><path class="e" d="M487,717.948c0,24.175-19.574,42.249-43.489,42.249-19.134,0-36.313-11.871-41.809-30.378l20.642-5.582A21.347,21.347,0,0,0,443.424,740,21.571,21.571,0,0,0,465.3,717.948c0-12.578-9.03-22.242-21.875-22.242a23.294,23.294,0,0,0-11.07,3.015l-9.744-16.833,36.847-31.532H406.664V630.264H484.88v20.193L456.089,678.08C475.663,682.075,487,698.548,487,717.948Z"/><path class="f" d="M487,649.66,179,736.34v-19L487,630.66Z"/><path d="M194.8,732l-12,3.126,2.394-19.628,12-3.126Z"/><path d="M218.8,725.241l-12,3.126,2.394-19.628,12-3.126Z"/><path d="M242.8,718.487l-12,3.126,2.394-19.628,12-3.126Z"/><path d="M266.8,711.733l-12,3.126,2.394-19.628,12-3.126Z"/><path d="M290.8,704.978l-12,3.126,2.394-19.628,12-3.126Z"/><path d="M314.8,698.224l-12,3.126,2.394-19.628,12-3.126Z"/><path d="M338.8,691.47l-12,3.126,2.394-19.628,12-3.126Z"/><path d="M362.8,684.715l-12,3.126,2.394-19.628,12-3.126Z"/><path d="M386.8,677.961l-12,3.126,2.394-19.628,12-3.126Z"/><path d="M410.8,671.207l-12,3.126L401.2,654.7l12-3.126Z"/><path d="M434.8,664.452l-12,3.126L425.2,647.95l12-3.126Z"/><path d="M458.8,657.7l-12,3.126L449.2,641.2l12-3.126Z"/><path d="M482.8,650.944l-12,3.126,2.394-19.628,12-3.126Z"/><path class="g" d="M386,650V782c0,.552.895,1,2,1s2-.448,2-1V650Z"/><rect class="h" width="80" height="80" rx="9.891" transform="translate(348 574)"/><path class="i" d="M388,584a30,30,0,1,0,30,30A30,30,0,0,0,388,584Zm0,55a25,25,0,1,1,25-25A25,25,0,0,1,388,639Z"/><rect class="i" width="25" height="5" transform="translate(375.5 611.5)"/></g></g></svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="308" height="230" viewBox="0 0 308 230"><defs><style>.a{fill:none;}.b{clip-path:url(#a);}.c{opacity:0.05;}.d{fill:#f5f5f7;}.e{fill:#dce0e6;}.f{fill:#24285b;}.g{fill:#596380;}.h{fill:#ffd200;}.i{fill:#fff;}.j{fill:#97a3ad;}</style><clipPath id="a"><rect class="a" width="308" height="230" transform="translate(1010 582)"/></clipPath></defs><g transform="translate(-1010 -582)"><g class="b"><ellipse class="c" cx="154" cy="35" rx="154" ry="35" transform="translate(1010 742)"/><ellipse class="c" cx="121" cy="2" rx="121" ry="2" transform="translate(1043 752)"/><rect class="d" width="228.672" height="158.82" transform="translate(1049.664 582)"/><rect class="e" width="228.672" height="125.754" transform="translate(1049.664 615.066)"/><ellipse class="f" cx="4.398" cy="4.429" rx="4.398" ry="4.429" transform="translate(1063.711 592.142)"/><ellipse class="g" cx="4.398" cy="4.429" rx="4.398" ry="4.429" transform="translate(1076.794 592.142)"/><ellipse class="h" cx="4.398" cy="4.429" rx="4.398" ry="4.429" transform="translate(1089.123 592.142)"/><path class="i" d="M1111.9,664.221a2.54,2.54,0,0,1,0-3.575l0,0,14.97-15.067a2.5,2.5,0,0,1,3.545.2,2.542,2.542,0,0,1,0,3.369l-14.971,15.077A2.5,2.5,0,0,1,1111.9,664.221Z"/><path class="i" d="M1127.106,664.464l-14.97-15.077a2.541,2.541,0,0,1-.057-3.575,2.5,2.5,0,0,1,3.55-.057c.021.02.041.041.061.062l14.961,15.067a2.542,2.542,0,0,1,.066,3.575,2.5,2.5,0,0,1-3.549.067l-.062-.062Z"/><path class="i" d="M1194.91,664.221a2.54,2.54,0,0,1-.005-3.575l.005,0,14.97-15.067a2.5,2.5,0,0,1,3.544-.2,2.539,2.539,0,0,1,.2,3.569,2.483,2.483,0,0,1-.2.2l-14.96,15.077A2.517,2.517,0,0,1,1194.91,664.221Z"/><path class="i" d="M1210.151,664.464l-14.97-15.077a2.541,2.541,0,0,1-.057-3.575,2.5,2.5,0,0,1,3.549-.057l.062.062,14.96,15.067a2.541,2.541,0,0,1,.067,3.575,2.5,2.5,0,0,1-3.549.067l-.062-.062Z"/><path class="i" d="M1142.82,707.39a2.508,2.508,0,0,1-2.49-2.326c-.7-8.605,2.54-25.543,19.8-28.01,5.392-.759,9.9.485,13.394,3.721,8.2,7.594,7.39,23.561,7.36,24.269a2.514,2.514,0,1,1-5.02-.283h0c0-.142.713-14.258-5.743-20.225-2.37-2.184-5.4-2.973-9.288-2.426-16.948,2.335-15.573,21.72-15.5,22.56a2.523,2.523,0,0,1-2.3,2.72Z"/><ellipse cx="52.8" cy="12" rx="52.8" ry="12" transform="translate(1111.2 765)"/><path class="j" d="M1065.337,756.844H1010V737.324l39.985-84.729h23.855l-39.985,84.729h31.482V704.8H1086.5v32.527H1098.2v19.519H1086.5v20.635h-21.158Z"/><path class="j" d="M1285.134,756.844H1229.8V737.324l39.985-84.729h23.855l-39.985,84.729h31.482V704.8h21.158v32.527H1318v19.519h-11.709v20.635h-21.158Z"/><path class="j" d="M1142.457,787.955a23.67,23.67,0,0,1,42.566.054,115.012,115.012,0,0,0,21.241-3.822c-5.762-17.839-21.556-29.205-42.531-29.205-20.925,0-36.693,11.3-42.5,29.049A111.5,111.5,0,0,0,1142.457,787.955Z"/></g></g></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="308" height="230" viewBox="0 0 308 230"><defs><style>.a{fill:none;}.b{clip-path:url(#a);}.c{fill:#e6e6e6;}.d{fill:#f5f5f7;}.e{fill:#9294ad;}.f{fill:#ffd200;}.g{fill:#aeb8c2;}.h{fill:#dce0e6;}.i{fill:#24285b;}.j{fill:#ff4d4d;}.k{fill:#fff;}</style><clipPath id="a"><rect class="a" width="308" height="230" transform="translate(638 574)"/></clipPath></defs><g transform="translate(-638 -574)"><g class="b"><path class="c" d="M788,799.455H748.216v-3.017h36.743V742.822H788Z"/><path class="d" d="M879.86,659.975c-.944,0-1.868.06-2.781.15v-1.3a39.4,39.4,0,0,0-39.585-39.217h-1.675c-.724-25.9-22.5-46.31-48.642-45.593a47.1,47.1,0,0,0-46.021,48.19,46.481,46.481,0,0,0,1.192,9.239,39.2,39.2,0,0,0,1.492,78.363H879.85a24.909,24.909,0,1,0,0-49.815h0Z"/><path class="e" d="M724.522,702.141c0,23.811-20.829,42.683-44.952,42.683A42.973,42.973,0,0,1,638,713.341l20.651-5.468c2.582,10.23,12.107,16.579,21.72,16.579a22.462,22.462,0,0,0,22.61-22.311c0-12.346-10.326-22.223-22.61-22.223-9.88,0-16.2,4.321-19.672,8.289l-18.338-5.82,3.917-67.2h69.61v19.93h-50.56l-1.959,31.219a39.764,39.764,0,0,1,19.94-5.644C707.342,660.693,724.522,678.33,724.522,702.141Z"/><path class="e" d="M744.521,699.142V658.224c0-27.074,18.782-45.682,46.11-45.682s46.109,18.608,46.109,45.682v40.918c0,27.074-18.782,45.682-46.109,45.682S744.521,726.216,744.521,699.142Zm70.322,1.5V656.636a24.212,24.212,0,0,0-48.424,0v44.006a24.213,24.213,0,0,0,48.424,0Z"/><path class="e" d="M853.89,699.142V658.224c0-27.074,18.782-45.682,46.11-45.682s46.11,18.608,46.11,45.682v40.918c0,27.074-18.782,45.682-46.11,45.682S853.89,726.216,853.89,699.142Zm70.322,1.5V656.636a24.212,24.212,0,0,0-48.424,0v44.006a24.213,24.213,0,0,0,48.424,0Z"/><rect class="f" width="94.385" height="58.936" transform="translate(743.832 700.859)"/><rect class="g" width="94.385" height="58.936" transform="translate(743.832 700.859)"/><rect class="h" width="111.021" height="28.91" transform="translate(735.691 676.123)"/><rect class="i" width="66.239" height="6.727" transform="translate(748.216 686.741)"/><ellipse class="j" cx="5.542" cy="5.49" rx="5.542" ry="5.49" transform="translate(823.063 685.615)"/><rect class="h" width="111.021" height="28.91" transform="translate(735.691 710.975)"/><rect class="i" width="66.239" height="6.727" transform="translate(748.216 721.584)"/><ellipse class="k" cx="5.542" cy="5.49" rx="5.542" ry="5.49" transform="translate(823.063 720.468)"/><rect class="h" width="111.021" height="28.91" transform="translate(735.691 745.828)"/><rect class="i" width="66.239" height="6.727" transform="translate(748.216 756.437)"/><ellipse class="k" cx="5.542" cy="5.49" rx="5.542" ry="5.49" transform="translate(823.063 755.321)"/><rect class="c" width="36.581" height="3.017" transform="translate(786.482 796.438)"/><ellipse class="i" cx="5.988" cy="5.933" rx="5.988" ry="5.933" transform="translate(743.842 792.134)"/><ellipse class="i" cx="5.988" cy="5.933" rx="5.988" ry="5.933" transform="translate(817.074 792.134)"/></g></g></svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="76" height="76" viewBox="0 0 76 76"><defs><style>.a{fill:#1953ff;}</style></defs><path class="a" d="M-1198-1084a6.007,6.007,0,0,1-6-6v-64a6.007,6.007,0,0,1,6-6h64a6.007,6.007,0,0,1,6,6v64a6.006,6.006,0,0,1-6,6Zm-4-70v64a4,4,0,0,0,4,4h64a4,4,0,0,0,4-4v-64a4,4,0,0,0-4-4h-64A4.005,4.005,0,0,0-1202-1154Zm35,47v-14h-14a1,1,0,0,1-1-1,1,1,0,0,1,1-1h14v-14a1,1,0,0,1,1-1,1,1,0,0,1,1,1v14h14a1,1,0,0,1,1,1,1,1,0,0,1-1,1h-14v14a1,1,0,0,1-1,1A1,1,0,0,1-1167-1107Z" transform="translate(1204 1160)"/></svg>

After

Width:  |  Height:  |  Size: 543 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="76" height="76" viewBox="0 0 76 76"><defs><style>.a{fill:#ccced1;}</style></defs><path class="a" d="M-1198-1084a6.007,6.007,0,0,1-6-6v-64a6.007,6.007,0,0,1,6-6h64a6.007,6.007,0,0,1,6,6v64a6.006,6.006,0,0,1-6,6Zm-4-70v64a4,4,0,0,0,4,4h64a4,4,0,0,0,4-4v-64a4,4,0,0,0-4-4h-64A4.005,4.005,0,0,0-1202-1154Zm35,47v-14h-14a1,1,0,0,1-1-1,1,1,0,0,1,1-1h14v-14a1,1,0,0,1,1-1,1,1,0,0,1,1,1v14h14a1,1,0,0,1,1,1,1,1,0,0,1-1,1h-14v14a1,1,0,0,1-1,1A1,1,0,0,1-1167-1107Z" transform="translate(1204 1160)"/></svg>

After

Width:  |  Height:  |  Size: 543 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1920" height="970" viewBox="0 0 1920 970"><defs><style>.a{fill:url(#a);}.b{clip-path:url(#b);}.c{filter:url(#n);}.d{filter:url(#k);}.e{filter:url(#h);}.f{filter:url(#e);}</style><linearGradient id="a" y1="0.383" x2="1" y2="0.589" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="#f1f8ff"/><stop offset="1" stop-color="#f7fbfe"/></linearGradient><clipPath id="b"><rect class="a" width="1920" height="970"/></clipPath><filter id="e" x="-169" y="375" width="756" height="756" filterUnits="userSpaceOnUse"><feOffset dx="20" dy="-20" input="SourceAlpha"/><feGaussianBlur stdDeviation="30" result="f"/><feFlood flood-color="#211f47" flood-opacity="0.071"/><feComposite operator="in" in2="f"/><feComposite in="SourceGraphic"/></filter><filter id="h" x="1230" y="568" width="433" height="433" filterUnits="userSpaceOnUse"><feOffset dx="2" dy="-10" input="SourceAlpha"/><feGaussianBlur stdDeviation="30" result="i"/><feFlood flood-color="#211f47" flood-opacity="0.071"/><feComposite operator="in" in2="i"/><feComposite in="SourceGraphic"/></filter><filter id="k" x="1440" y="88.44" width="655.121" height="655.121" filterUnits="userSpaceOnUse"><feOffset dx="2" dy="30" input="SourceAlpha"/><feGaussianBlur stdDeviation="30" result="l"/><feFlood flood-color="#211f47" flood-opacity="0.122"/><feComposite operator="in" in2="l"/><feComposite in="SourceGraphic"/></filter><filter id="n" x="422.061" y="2.561" width="350.879" height="350.879" filterUnits="userSpaceOnUse"><feOffset dx="2" dy="10" input="SourceAlpha"/><feGaussianBlur stdDeviation="30" result="o"/><feFlood flood-color="#211f47" flood-opacity="0.122"/><feComposite operator="in" in2="o"/><feComposite in="SourceGraphic"/></filter></defs><g class="b"><rect class="a" width="1920" height="970"/><g class="f" transform="matrix(1, 0, 0, 1, 0, 0)"><circle class="a" cx="288" cy="288" r="288" transform="translate(-99 485)"/></g><g class="e" transform="matrix(1, 0, 0, 1, 0, 0)"><circle class="a" cx="126.5" cy="126.5" r="126.5" transform="translate(1318 668)"/></g><g class="d" transform="matrix(1, 0, 0, 1, 0, 0)"><rect class="a" width="335.961" height="335.961" rx="30" transform="translate(1528 386) rotate(-45)"/></g><g class="c" transform="matrix(1, 0, 0, 1, 0, 0)"><rect class="a" width="170.879" height="170.879" transform="translate(510.06 82.56)"/></g></g></svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="1361px" height="609px" viewBox="0 0 1361 609" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
<title>Group 21</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Ant-Design-Pro-3.0" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="账户密码登录-校验" transform="translate(-79.000000, -82.000000)">
<g id="Group-21" transform="translate(77.000000, 73.000000)">
<g id="Group-18" opacity="0.8" transform="translate(74.901416, 569.699158) rotate(-7.000000) translate(-74.901416, -569.699158) translate(4.901416, 525.199158)">
<ellipse id="Oval-11" fill="#CFDAE6" opacity="0.25" cx="63.5748792" cy="32.468367" rx="21.7830479" ry="21.766008"></ellipse>
<ellipse id="Oval-3" fill="#CFDAE6" opacity="0.599999964" cx="5.98746479" cy="13.8668601" rx="5.2173913" ry="5.21330997"></ellipse>
<path d="M38.1354514,88.3520215 C43.8984227,88.3520215 48.570234,83.6838647 48.570234,77.9254015 C48.570234,72.1669383 43.8984227,67.4987816 38.1354514,67.4987816 C32.3724801,67.4987816 27.7006688,72.1669383 27.7006688,77.9254015 C27.7006688,83.6838647 32.3724801,88.3520215 38.1354514,88.3520215 Z" id="Oval-3-Copy" fill="#CFDAE6" opacity="0.45"></path>
<path d="M64.2775582,33.1704963 L119.185836,16.5654915" id="Path-12" stroke="#CFDAE6" stroke-width="1.73913043" stroke-linecap="round" stroke-linejoin="round"></path>
<path d="M42.1431708,26.5002681 L7.71190162,14.5640702" id="Path-16" stroke="#E0B4B7" stroke-width="0.702678964" opacity="0.7" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"></path>
<path d="M63.9262187,33.521561 L43.6721326,69.3250951" id="Path-15" stroke="#BACAD9" stroke-width="0.702678964" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"></path>
<g id="Group-17" transform="translate(126.850922, 13.543654) rotate(30.000000) translate(-126.850922, -13.543654) translate(117.285705, 4.381889)" fill="#CFDAE6">
<ellipse id="Oval-4" opacity="0.45" cx="9.13482653" cy="9.12768076" rx="9.13482653" ry="9.12768076"></ellipse>
<path d="M18.2696531,18.2553615 C18.2696531,13.2142826 14.1798519,9.12768076 9.13482653,9.12768076 C4.08980114,9.12768076 0,13.2142826 0,18.2553615 L18.2696531,18.2553615 Z" id="Oval-4" transform="translate(9.134827, 13.691521) scale(-1, -1) translate(-9.134827, -13.691521) "></path>
</g>
</g>
<g id="Group-14" transform="translate(216.294700, 123.725600) rotate(-5.000000) translate(-216.294700, -123.725600) translate(106.294700, 35.225600)">
<ellipse id="Oval-2" fill="#CFDAE6" opacity="0.25" cx="29.1176471" cy="29.1402439" rx="29.1176471" ry="29.1402439"></ellipse>
<ellipse id="Oval-2" fill="#CFDAE6" opacity="0.3" cx="29.1176471" cy="29.1402439" rx="21.5686275" ry="21.5853659"></ellipse>
<ellipse id="Oval-2-Copy" stroke="#CFDAE6" opacity="0.4" cx="179.019608" cy="138.146341" rx="23.7254902" ry="23.7439024"></ellipse>
<ellipse id="Oval-2" fill="#BACAD9" opacity="0.5" cx="29.1176471" cy="29.1402439" rx="10.7843137" ry="10.7926829"></ellipse>
<path d="M29.1176471,39.9329268 L29.1176471,18.347561 C23.1616351,18.347561 18.3333333,23.1796097 18.3333333,29.1402439 C18.3333333,35.1008781 23.1616351,39.9329268 29.1176471,39.9329268 Z" id="Oval-2" fill="#BACAD9"></path>
<g id="Group-9" opacity="0.45" transform="translate(172.000000, 131.000000)" fill="#E6A1A6">
<ellipse id="Oval-2-Copy-2" cx="7.01960784" cy="7.14634146" rx="6.47058824" ry="6.47560976"></ellipse>
<path d="M0.549019608,13.6219512 C4.12262681,13.6219512 7.01960784,10.722722 7.01960784,7.14634146 C7.01960784,3.56996095 4.12262681,0.670731707 0.549019608,0.670731707 L0.549019608,13.6219512 Z" id="Oval-2-Copy-2" transform="translate(3.784314, 7.146341) scale(-1, 1) translate(-3.784314, -7.146341) "></path>
</g>
<ellipse id="Oval-10" fill="#CFDAE6" cx="218.382353" cy="138.685976" rx="1.61764706" ry="1.61890244"></ellipse>
<ellipse id="Oval-10-Copy-2" fill="#E0B4B7" opacity="0.35" cx="179.558824" cy="175.381098" rx="1.61764706" ry="1.61890244"></ellipse>
<ellipse id="Oval-10-Copy" fill="#E0B4B7" opacity="0.35" cx="180.098039" cy="102.530488" rx="2.15686275" ry="2.15853659"></ellipse>
<path d="M28.9985381,29.9671598 L171.151018,132.876024" id="Path-11" stroke="#CFDAE6" opacity="0.8"></path>
</g>
<g id="Group-10" opacity="0.799999952" transform="translate(1054.100635, 36.659317) rotate(-11.000000) translate(-1054.100635, -36.659317) translate(1026.600635, 4.659317)">
<ellipse id="Oval-7" stroke="#CFDAE6" stroke-width="0.941176471" cx="43.8135593" cy="32" rx="11.1864407" ry="11.2941176"></ellipse>
<g id="Group-12" transform="translate(34.596774, 23.111111)" fill="#BACAD9">
<ellipse id="Oval-7" opacity="0.45" cx="9.18534718" cy="8.88888889" rx="8.47457627" ry="8.55614973"></ellipse>
<path d="M9.18534718,17.4450386 C13.8657264,17.4450386 17.6599235,13.6143199 17.6599235,8.88888889 C17.6599235,4.16345787 13.8657264,0.332739156 9.18534718,0.332739156 L9.18534718,17.4450386 Z" id="Oval-7"></path>
</g>
<path d="M34.6597385,24.809694 L5.71666084,4.76878945" id="Path-2" stroke="#CFDAE6" stroke-width="0.941176471"></path>
<ellipse id="Oval" stroke="#CFDAE6" stroke-width="0.941176471" cx="3.26271186" cy="3.29411765" rx="3.26271186" ry="3.29411765"></ellipse>
<ellipse id="Oval-Copy" fill="#F7E1AD" cx="2.79661017" cy="61.1764706" rx="2.79661017" ry="2.82352941"></ellipse>
<path d="M34.6312443,39.2922712 L5.06366663,59.785082" id="Path-10" stroke="#CFDAE6" stroke-width="0.941176471"></path>
</g>
<g id="Group-19" opacity="0.33" transform="translate(1282.537219, 446.502867) rotate(-10.000000) translate(-1282.537219, -446.502867) translate(1142.537219, 327.502867)">
<g id="Group-17" transform="translate(141.333539, 104.502742) rotate(275.000000) translate(-141.333539, -104.502742) translate(129.333539, 92.502742)" fill="#BACAD9">
<circle id="Oval-4" opacity="0.45" cx="11.6666667" cy="11.6666667" r="11.6666667"></circle>
<path d="M23.3333333,23.3333333 C23.3333333,16.8900113 18.1099887,11.6666667 11.6666667,11.6666667 C5.22334459,11.6666667 0,16.8900113 0,23.3333333 L23.3333333,23.3333333 Z" id="Oval-4" transform="translate(11.666667, 17.500000) scale(-1, -1) translate(-11.666667, -17.500000) "></path>
</g>
<circle id="Oval-5-Copy-6" fill="#CFDAE6" cx="201.833333" cy="87.5" r="5.83333333"></circle>
<path d="M143.5,88.8126685 L155.070501,17.6038544" id="Path-17" stroke="#BACAD9" stroke-width="1.16666667"></path>
<path d="M17.5,37.3333333 L127.466252,97.6449735" id="Path-18" stroke="#BACAD9" stroke-width="1.16666667"></path>
<polyline id="Path-19" stroke="#CFDAE6" stroke-width="1.16666667" points="143.902597 120.302281 174.935455 231.571342 38.5 147.510847 126.366941 110.833333"></polyline>
<path d="M159.833333,99.7453842 L195.416667,89.25" id="Path-20" stroke="#E0B4B7" stroke-width="1.16666667" opacity="0.6"></path>
<path d="M205.333333,82.1372105 L238.719406,36.1666667" id="Path-24" stroke="#BACAD9" stroke-width="1.16666667"></path>
<path d="M266.723424,132.231988 L207.083333,90.4166667" id="Path-25" stroke="#CFDAE6" stroke-width="1.16666667"></path>
<circle id="Oval-5" fill="#C1D1E0" cx="156.916667" cy="8.75" r="8.75"></circle>
<circle id="Oval-5-Copy-3" fill="#C1D1E0" cx="39.0833333" cy="148.75" r="5.25"></circle>
<circle id="Oval-5-Copy-2" fill-opacity="0.6" fill="#D1DEED" cx="8.75" cy="33.25" r="8.75"></circle>
<circle id="Oval-5-Copy-4" fill-opacity="0.6" fill="#D1DEED" cx="243.833333" cy="30.3333333" r="5.83333333"></circle>
<circle id="Oval-5-Copy-5" fill="#E0B4B7" cx="175.583333" cy="232.75" r="5.25"></circle>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.7 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="14" viewBox="0 0 14 14"><defs><style>.a{fill:#fff;stroke:#707070;}.b{fill:#596380;}.c{clip-path:url(#a);}.d{clip-path:url(#b);}</style><clipPath id="a"><rect class="a" width="14" height="14" transform="translate(796 520)"/></clipPath><clipPath id="b"><rect class="b" width="12" height="12" transform="translate(0)"/></clipPath></defs><g class="c" transform="translate(-796 -520)"><g transform="translate(-100 289.628)"><g class="d" transform="translate(897 231.372)"><path class="b" d="M1182.9,231.267h-3.343v3.745a2.254,2.254,0,0,1,0,4.508v3.75h3.343a2.291,2.291,0,0,0,2.258-2.308V233.58a2.289,2.289,0,0,0-2.258-2.313Zm0,0" transform="translate(-1173.16 -231.269)"/><path class="b" d="M903.133,235.581a1.657,1.657,0,0,0-.531.086v-4.3h-3.343A2.291,2.291,0,0,0,897,233.68v7.381a2.291,2.291,0,0,0,2.258,2.308H902.6v-4.293a1.713,1.713,0,0,0,.531.086,1.791,1.791,0,0,0,0-3.582Zm0,0" transform="translate(-897 -231.372)"/></g></g></g></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

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="1621586617012" class="icon" viewBox="0 0 1146 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6384" xmlns:xlink="http://www.w3.org/1999/xlink" width="17.90625" height="16"><defs><style type="text/css"></style></defs><path d="M0 788.389381a507.469027 108.743363 0 1 0 1014.938053 0 507.469027 108.743363 0 1 0-1014.938053 0Z" fill="#F3F3F8" p-id="6385"></path><path d="M321.880354 246.303717h367.915044l174.714337 220.749026s-174.895575 180.151504-352.328496 179.607788-357.584425-181.238938-357.584425-181.238938z" fill="#FBFBFD" p-id="6386"></path><path d="M797.451327 815.575221H217.486726a63.433628 63.433628 0 0 1-63.433629-63.433628V471.221239h166.558584l14.680354 29.360708A81.738761 81.738761 0 0 0 416.849558 579.964602h199.362831a63.614867 63.614867 0 0 0 63.433629-60.533806L711.72531 471.221239h149.159646v280.920354A63.433628 63.433628 0 0 1 797.451327 815.575221z" fill="#FBFBFD" p-id="6387"></path><path d="M797.451327 806.513274a54.371681 54.371681 0 0 0 54.371682-54.371681v-271.858407h-135.385487L688.707965 522.330619a72.495575 72.495575 0 0 1-72.495576 66.69593H416.849558a90.619469 90.619469 0 0 1-90.61947-86.088496l-11.236814-22.654867H163.115044v271.858407a54.371681 54.371681 0 0 0 54.371682 54.371681h579.964601m0 18.123894H217.486726a72.495575 72.495575 0 0 1-72.495576-72.495575v-289.982301h181.238938l18.123894 36.247788a72.495575 72.495575 0 0 0 72.495576 72.495575h199.362831a54.371681 54.371681 0 0 0 54.371682-54.371682l36.247787-54.371681h163.115045v289.982301a72.495575 72.495575 0 0 1-72.495576 72.495575z" fill="#E2E2EE" p-id="6388"></path><path d="M863.059823 467.958938L684.539469 253.734513H330.398584L151.87823 467.958938l-13.774159-11.599292L322.061593 235.610619h370.814867l183.957522 220.749027z" fill="#E2E2EE" p-id="6389"></path></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="62.667" height="16" viewBox="0 0 62.667 16"><defs><style>.a{fill:#262626;}.b{clip-path:url(#a);}</style><clipPath id="a"><rect class="a" width="62.667" height="16"/></clipPath></defs><g transform="translate(-686.73 -2076)"><g class="b" transform="translate(686.73 2076)"><path class="a" d="M930.451,2092.935a2.5,2.5,0,0,0-2.543-1.935h-5.479l-.225,1.6h5.367a1.366,1.366,0,0,1,1.082.476,1.014,1.014,0,0,1-.781,1.657h-3.554a3.383,3.383,0,0,0-3.243,2.844l-.175,1.245a2.414,2.414,0,0,0,2.443,2.845h2.488a3.952,3.952,0,0,0,2.037-.588l-.082.588h1.6l.5-3.556.474-3.378.125-.889h0A2.585,2.585,0,0,0,930.451,2092.935Zm-1.915,3.4-.1.711-.15,1.067a2.329,2.329,0,0,1-2.229,1.956h-2.488a1.057,1.057,0,0,1-1.069-1.244l.175-1.245a1.482,1.482,0,0,1,1.419-1.244h3.554a2.665,2.665,0,0,0,.911-.163Z" transform="translate(-879.269 -2088.333)"/><path class="a" d="M802.041,2091h-3.2a3.383,3.383,0,0,0-3.242,2.844l-.237,1.689-.225,1.6-.237,1.689a2.414,2.414,0,0,0,2.443,2.845h3.2a3.383,3.383,0,0,0,3.242-2.845l.013-.089h-1.6l-.013.089a1.482,1.482,0,0,1-1.418,1.244h-3.2a1.057,1.057,0,0,1-1.069-1.244l.237-1.689h7.285l.225-1.6.237-1.689A2.414,2.414,0,0,0,802.041,2091Zm-5.079,4.533.237-1.689a1.482,1.482,0,0,1,1.419-1.244h3.2a1.057,1.057,0,0,1,1.069,1.244l-.237,1.689Z" transform="translate(-775.657 -2088.333)"/><path class="a" d="M740.041,2091h-3.2a3.383,3.383,0,0,0-3.242,2.844l-.237,1.689-.225,1.6-.237,1.689a2.415,2.415,0,0,0,2.444,2.845h3.2a3.383,3.383,0,0,0,3.242-2.845l.013-.089h-1.6l-.013.089a1.482,1.482,0,0,1-1.418,1.244h-3.2a1.057,1.057,0,0,1-1.069-1.244l.237-1.689h7.285l.225-1.6.237-1.689A2.414,2.414,0,0,0,740.041,2091Zm-5.079,4.533.237-1.689a1.482,1.482,0,0,1,1.418-1.244h3.2a1.057,1.057,0,0,1,1.069,1.244l-.237,1.689Z" transform="translate(-724.674 -2088.333)"/><path class="a" d="M693.933,2076H690.38l-.25,1.778h1.777l-.849,6.044-.325,2.311a1.694,1.694,0,0,1-1.621,1.423H686.98l-.25,1.777h2.132a3.806,3.806,0,0,0,3.648-3.2l1.174-8.355h0Z" transform="translate(-686.73 -2076)"/><path class="a" d="M990.5,2091l-.225,1.6-.325,2.311-.474,3.377-.075.533a1.482,1.482,0,0,1-1.418,1.244h-3.2a1.057,1.057,0,0,1-1.069-1.244l.549-3.911.325-2.311.225-1.6h-1.6l-1.1,7.822a2.414,2.414,0,0,0,2.443,2.845h3.2a3.094,3.094,0,0,0,1.284-.29l-.041.29a1.268,1.268,0,0,1-1.216,1.066H982.1l-.225,1.6h5.686a3.171,3.171,0,0,0,3.04-2.666l.4-2.845.075-.533L992.1,2091Z" transform="translate(-929.43 -2088.333)"/><path class="a" d="M862.644,2091h-3.2a3.094,3.094,0,0,0-1.285.29l.041-.29h-1.6l-.4,2.844-.7,4.978-.774,5.511h1.6l.415-2.956a2.574,2.574,0,0,0,1.2.29h3.2a3.383,3.383,0,0,0,3.242-2.845l.7-4.978A2.414,2.414,0,0,0,862.644,2091Zm.145,7.822a1.482,1.482,0,0,1-1.419,1.244h-3.2a1.057,1.057,0,0,1-1.069-1.244l.7-4.978a1.482,1.482,0,0,1,1.418-1.244h3.2a1.057,1.057,0,0,1,1.069,1.244Z" transform="translate(-824.879 -2088.333)"/></g></g></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="14" viewBox="0 0 14 14"><defs><style>.a{fill:#fff;stroke:#707070;}.b{fill:#596380;}.c{clip-path:url(#a);}.d{clip-path:url(#b);}</style><clipPath id="a"><rect class="a" width="14" height="14" transform="translate(786 458)"/></clipPath><clipPath id="b"><rect class="b" width="11" height="14"/></clipPath></defs><g class="c" transform="translate(-786 -458)"><g transform="translate(155.5 328)"><g transform="translate(632 130)"><g class="d" transform="translate(0)"><path class="b" d="M636.689,140.115V141.7a.687.687,0,1,0,1.374,0v-1.584a1.4,1.4,0,0,0,.687-1.21,1.374,1.374,0,1,0-2.748,0,1.4,1.4,0,0,0,.687,1.21Zm-2.061-4.7v-2.1a2.748,2.748,0,1,1,5.5,0v2.1H641.5a1.386,1.386,0,0,1,1.374,1.4V143.1a1.386,1.386,0,0,1-1.374,1.4h-8.243a1.386,1.386,0,0,1-1.374-1.4v-6.288a1.386,1.386,0,0,1,1.374-1.4Zm2.748-3.493a1.386,1.386,0,0,0-1.374,1.4v2.1h2.748v-2.1a1.386,1.386,0,0,0-1.374-1.4Zm0,0" transform="translate(-631.882 -130.511)"/></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="90.667" height="22" viewBox="0 0 90.667 22"><defs><clipPath id="a"><path d="M2404.472,992h-22.8l3.2-22h22.8Z" transform="translate(-2381.676 -970)" fill="#1a53ff"/></clipPath><clipPath id="b"><rect width="62.667" height="16" fill="#262626"/></clipPath></defs><g transform="translate(-30 -21)"><g transform="translate(30 21)"><g clip-path="url(#a)"><path d="M2388.177,1037.5h0l-6.5,5.5h11.4Z" transform="translate(-2381.676 -1021)" fill="#1a53ff" opacity="0.5"/><path d="M2384.881,970l-3.2,22h5.7l.8-5.5h5.7l.8-5.5h5.7l-.8,5.5-.8,5.5h5.7l3.2-22Zm15.9,8.25h-5.7l.8-5.5h5.7Z" transform="translate(-2381.677 -970)" fill="#1a53ff"/></g></g><g transform="translate(-628.729 -2051)"><g transform="translate(686.73 2076)" clip-path="url(#b)"><path d="M930.451,2092.935a2.5,2.5,0,0,0-2.543-1.935h-5.479l-.225,1.6h5.367a1.366,1.366,0,0,1,1.082.476,1.014,1.014,0,0,1-.781,1.657h-3.554a3.383,3.383,0,0,0-3.243,2.844l-.175,1.245a2.414,2.414,0,0,0,2.443,2.845h2.488a3.952,3.952,0,0,0,2.037-.588l-.082.588h1.6l.5-3.556.474-3.378.125-.889h0A2.585,2.585,0,0,0,930.451,2092.935Zm-1.915,3.4-.1.711-.15,1.067a2.329,2.329,0,0,1-2.229,1.956h-2.488a1.057,1.057,0,0,1-1.069-1.244l.175-1.245a1.482,1.482,0,0,1,1.419-1.244h3.554a2.665,2.665,0,0,0,.911-.163Z" transform="translate(-879.269 -2088.333)" fill="#262626"/><path d="M802.041,2091h-3.2a3.383,3.383,0,0,0-3.242,2.844l-.237,1.689-.225,1.6-.237,1.689a2.414,2.414,0,0,0,2.443,2.845h3.2a3.383,3.383,0,0,0,3.242-2.845l.013-.089h-1.6l-.013.089a1.482,1.482,0,0,1-1.418,1.244h-3.2a1.057,1.057,0,0,1-1.069-1.244l.237-1.689h7.285l.225-1.6.237-1.689A2.414,2.414,0,0,0,802.041,2091Zm-5.079,4.533.237-1.689a1.482,1.482,0,0,1,1.419-1.244h3.2a1.057,1.057,0,0,1,1.069,1.244l-.237,1.689Z" transform="translate(-775.657 -2088.333)" fill="#262626"/><path d="M740.041,2091h-3.2a3.383,3.383,0,0,0-3.242,2.844l-.237,1.689-.225,1.6-.237,1.689a2.415,2.415,0,0,0,2.444,2.845h3.2a3.383,3.383,0,0,0,3.242-2.845l.013-.089h-1.6l-.013.089a1.482,1.482,0,0,1-1.418,1.244h-3.2a1.057,1.057,0,0,1-1.069-1.244l.237-1.689h7.285l.225-1.6.237-1.689A2.414,2.414,0,0,0,740.041,2091Zm-5.079,4.533.237-1.689a1.482,1.482,0,0,1,1.418-1.244h3.2a1.057,1.057,0,0,1,1.069,1.244l-.237,1.689Z" transform="translate(-724.674 -2088.333)" fill="#262626"/><path d="M693.933,2076H690.38l-.25,1.778h1.777l-.849,6.044-.325,2.311a1.694,1.694,0,0,1-1.621,1.423H686.98l-.25,1.777h2.132a3.806,3.806,0,0,0,3.648-3.2l1.174-8.355h0Z" transform="translate(-686.73 -2076)" fill="#262626"/><path d="M990.5,2091l-.225,1.6-.325,2.311-.474,3.377-.075.533a1.482,1.482,0,0,1-1.418,1.244h-3.2a1.057,1.057,0,0,1-1.069-1.244l.549-3.911.325-2.311.225-1.6h-1.6l-1.1,7.822a2.414,2.414,0,0,0,2.443,2.845h3.2a3.094,3.094,0,0,0,1.284-.29l-.041.29a1.268,1.268,0,0,1-1.216,1.066H982.1l-.225,1.6h5.686a3.171,3.171,0,0,0,3.04-2.666l.4-2.845.075-.533L992.1,2091Z" transform="translate(-929.43 -2088.333)" fill="#262626"/><path d="M862.644,2091h-3.2a3.094,3.094,0,0,0-1.285.29l.041-.29h-1.6l-.4,2.844-.7,4.978-.774,5.511h1.6l.415-2.956a2.574,2.574,0,0,0,1.2.29h3.2a3.383,3.383,0,0,0,3.242-2.845l.7-4.978A2.414,2.414,0,0,0,862.644,2091Zm.145,7.822a1.482,1.482,0,0,1-1.419,1.244h-3.2a1.057,1.057,0,0,1-1.069-1.244l.7-4.978a1.482,1.482,0,0,1,1.418-1.244h3.2a1.057,1.057,0,0,1,1.069,1.244Z" transform="translate(-824.879 -2088.333)" fill="#262626"/></g></g></g></svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

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="1621851766037" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2360" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><defs><style type="text/css"></style></defs><path d="M243.2 512c0-49.664-39.936-89.6-89.6-89.6S64 462.336 64 512s39.936 89.6 89.6 89.6 89.6-39.936 89.6-89.6z m179.2 0c0 49.664 39.936 89.6 89.6 89.6s89.6-39.936 89.6-89.6-39.936-89.6-89.6-89.6-89.6 39.936-89.6 89.6z m358.4 0c0 49.664 39.936 89.6 89.6 89.6S960 561.664 960 512s-39.936-89.6-89.6-89.6c-49.152 0-89.6 39.936-89.6 89.6z" p-id="2361" fill="#2c2c2c"></path></svg>

After

Width:  |  Height:  |  Size: 744 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20.001" height="20" viewBox="0 0 20.001 20"><defs><style>.a{fill:#252626;}</style></defs><path class="a" d="M-3862-1142a3,3,0,0,1-3-3v-14a3,3,0,0,1,3-3h14a3,3,0,0,1,3,3v14a3,3,0,0,1-3,3Zm-1-17v14a1,1,0,0,0,1,1h14a1,1,0,0,0,1-1v-14a1,1,0,0,0-1-1h-14A1,1,0,0,0-3863-1159Zm11,12v-2a1,1,0,0,1,1-1,1,1,0,0,1,1,1v2a1,1,0,0,1-1,1A1,1,0,0,1-3852-1147Zm-4,0v-10a1,1,0,0,1,1-1,1,1,0,0,1,1,1v10a1,1,0,0,1-1,1A1,1,0,0,1-3856-1147Zm-4,0v-7a1,1,0,0,1,1-1,1,1,0,0,1,1,1v7a1,1,0,0,1-1,1A1,1,0,0,1-3860-1147Z" transform="translate(3865 1162)"/></svg>

After

Width:  |  Height:  |  Size: 580 B

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="1619595883977" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3229" width="16" height="16" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css"></style></defs><path d="M495.055 647.042a26.196 26.196 0 0 1-18.583-7.697L250.689 413.561c-10.263-10.263-10.263-26.903 0-37.166 10.263-10.263 26.903-10.263 37.166 0l207.2 207.2 207.2-207.2c10.263-10.263 26.904-10.263 37.167 0 10.262 10.263 10.262 26.903 0 37.166L513.638 639.345a26.196 26.196 0 0 1-18.583 7.697z" fill="#2c2c2c" p-id="3230"></path></svg>

After

Width:  |  Height:  |  Size: 705 B

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="1619597015272" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5736" width="16" height="16" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css"></style></defs><path d="M617.6 233.6c12.8-12.8 32-12.8 44.8 0 12.8 12.8 12.8 28.8 3.2 41.6l-3.2 3.2-233.6 233.6 233.6 233.6c12.8 12.8 12.8 28.8 3.2 41.6l-3.2 3.2c-12.8 12.8-28.8 12.8-41.6 3.2l-3.2-3.2-256-256c-12.8-12.8-12.8-28.8-3.2-41.6l3.2-3.2 256-256z" fill="#2c2c2c" p-id="5737"></path></svg>

After

Width:  |  Height:  |  Size: 648 B

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="1619597331494" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1762" width="16" height="16" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css"></style></defs><path d="M406.4 233.6c-12.8-12.8-32-12.8-44.8 0-12.8 12.8-12.8 28.8-3.2 41.6l3.2 3.2 233.6 233.6-233.6 233.6c-12.8 12.8-12.8 28.8-3.2 41.6l3.2 3.2c12.8 12.8 28.8 12.8 41.6 3.2l3.2-3.2 256-256c12.8-12.8 12.8-28.8 3.2-41.6l-3.2-3.2-256-256z" fill="#2c2c2c" p-id="1763"></path></svg>

After

Width:  |  Height:  |  Size: 646 B

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="1619595944852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4607" width="16" height="16" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css"></style></defs><path d="M495.055 308.698a26.196 26.196 0 0 0-18.583 7.697L250.689 542.179c-10.263 10.263-10.263 26.903 0 37.166s26.903 10.263 37.166 0l207.2-207.2 207.2 207.2c10.263 10.263 26.904 10.263 37.167 0 10.262-10.263 10.262-26.903 0-37.166L513.638 316.395a26.196 26.196 0 0 0-18.583-7.697z" fill="#2c2c2c" p-id="4608"></path></svg>

After

Width:  |  Height:  |  Size: 691 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="14" viewBox="0 0 14 14"><defs><style>.a,.b{fill:#1a53ff;}.a{stroke:#707070;}.c{clip-path:url(#a);}.d{clip-path:url(#b);}</style><clipPath id="a"><rect class="a" width="14" height="14" transform="translate(796 520)"/></clipPath><clipPath id="b"><rect class="b" width="12" height="12" transform="translate(0)"/></clipPath></defs><g class="c" transform="translate(-796 -520)"><g transform="translate(-100 289.628)"><g class="d" transform="translate(897 231.372)"><path class="b" d="M1182.9,231.267h-3.343v3.745a2.254,2.254,0,0,1,0,4.508v3.75h3.343a2.291,2.291,0,0,0,2.258-2.308V233.58a2.289,2.289,0,0,0-2.258-2.313Zm0,0" transform="translate(-1173.16 -231.269)"/><path class="b" d="M903.133,235.581a1.657,1.657,0,0,0-.531.086v-4.3h-3.343A2.291,2.291,0,0,0,897,233.68v7.381a2.291,2.291,0,0,0,2.258,2.308H902.6v-4.293a1.713,1.713,0,0,0,.531.086,1.791,1.791,0,0,0,0-3.582Zm0,0" transform="translate(-897 -231.372)"/></g></g></g></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="14" viewBox="0 0 14 14"><defs><style>.a,.b{fill:#1a53ff;}.a{stroke:#707070;}.c{clip-path:url(#a);}.d{clip-path:url(#b);}</style><clipPath id="a"><rect class="a" width="14" height="14" transform="translate(786 458)"/></clipPath><clipPath id="b"><rect class="b" width="11" height="14"/></clipPath></defs><g class="c" transform="translate(-786 -458)"><g transform="translate(155.5 328)"><g transform="translate(632 130)"><g class="d" transform="translate(0)"><path class="b" d="M636.689,140.115V141.7a.687.687,0,1,0,1.374,0v-1.584a1.4,1.4,0,0,0,.687-1.21,1.374,1.374,0,1,0-2.748,0,1.4,1.4,0,0,0,.687,1.21Zm-2.061-4.7v-2.1a2.748,2.748,0,1,1,5.5,0v2.1H641.5a1.386,1.386,0,0,1,1.374,1.4V143.1a1.386,1.386,0,0,1-1.374,1.4h-8.243a1.386,1.386,0,0,1-1.374-1.4v-6.288a1.386,1.386,0,0,1,1.374-1.4Zm2.748-3.493a1.386,1.386,0,0,0-1.374,1.4v2.1h2.748v-2.1a1.386,1.386,0,0,0-1.374-1.4Zm0,0" transform="translate(-631.882 -130.511)"/></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="14" viewBox="0 0 14 14"><defs><style>.a,.b{fill:#1a53ff;}.a{stroke:#707070;}.c{clip-path:url(#a);}.d{clip-path:url(#b);}</style><clipPath id="a"><rect class="a" width="14" height="14" transform="translate(793 387)"/></clipPath><clipPath id="b"><rect class="b" width="13" height="14" transform="translate(0 0)"/></clipPath></defs><g class="c" transform="translate(-793 -387)"><g transform="translate(216.5 256)"><g class="d" transform="translate(577 131)"><path class="b" d="M740.84,134.733A3.714,3.714,0,1,0,744.554,131a3.724,3.724,0,0,0-3.714,3.733Zm0,0" transform="translate(-738.054 -131)"/><path class="b" d="M581.643,622.52h3.714a4.631,4.631,0,0,1,3.283,1.367,4.679,4.679,0,0,1,1.36,3.3v.933H577v-.933a4.679,4.679,0,0,1,1.36-3.3,4.631,4.631,0,0,1,3.283-1.367Zm0,0" transform="translate(-577 -614.12)"/></g></g></g></svg>

After

Width:  |  Height:  |  Size: 927 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="14" viewBox="0 0 14 14"><defs><style>.a,.b{fill:#596380;}.a{stroke:#707070;}.c{clip-path:url(#a);}.d{clip-path:url(#b);}</style><clipPath id="a"><rect class="a" width="14" height="14" transform="translate(793 387)"/></clipPath><clipPath id="b"><rect class="b" width="13" height="14" transform="translate(0 0)"/></clipPath></defs><g class="c" transform="translate(-793 -387)"><g transform="translate(216.5 256)"><g class="d" transform="translate(577 131)"><path class="b" d="M740.84,134.733A3.714,3.714,0,1,0,744.554,131a3.724,3.724,0,0,0-3.714,3.733Zm0,0" transform="translate(-738.054 -131)"/><path class="b" d="M581.643,622.52h3.714a4.631,4.631,0,0,1,3.283,1.367,4.679,4.679,0,0,1,1.36,3.3v.933H577v-.933a4.679,4.679,0,0,1,1.36-3.3,4.631,4.631,0,0,1,3.283-1.367Zm0,0" transform="translate(-577 -614.12)"/></g></g></g></svg>

After

Width:  |  Height:  |  Size: 927 B

View File

@ -0,0 +1,20 @@
<template>
<global-footer class="footer custom-render">
<template v-slot:links>
</template>
<template v-slot:copyright>
<a href="http://www.jeequan.com" target="_blank">@计全科技</a>
</template>
</global-footer>
</template>
<script>
import { GlobalFooter } from '@ant-design-vue/pro-layout'
export default {
name: 'ProGlobalFooter',
components: {
GlobalFooter
}
}
</script>

View File

@ -0,0 +1,74 @@
<template>
<a-dropdown placement="bottomRight">
<span class="ant-pro-account-avatar">
<a-avatar size="small" :src="greetImg" class="antd-pro-global-header-index-avatar" />
<span>{{ currentUserName }}</span>
</span>
<template v-slot:overlay>
<a-menu class="ant-pro-drop-down menu" :selected-keys="[]">
<a-menu-item v-if="$access('ENT_C_USERINFO')" key="settings" @click="handleToSettings">
<a-icon type="setting" />
账户设置
</a-menu-item>
<a-menu-divider />
<a-menu-item key="logout" @click="handleLogout">
<a-icon type="logout" />
退出登录
</a-menu-item>
</a-menu>
</template>
</a-dropdown>
</template>
<script>
export default {
name: 'AvatarDropdown',
props: {
},
data: function () {
return {
// greetImg: '', //
sex: ''
}
},
computed: {
//
currentUserName () {
return this.$store.state.user.userName
},
//
greetImg () {
return this.$store.state.user.avatarImgPath
}
},
methods: {
handleToSettings () {
this.$router.push({ name: 'ENT_C_USERINFO' })
},
handleLogout: function (e) {
this.$infoBox.confirmPrimary('确认退出?', '', () => {
this.$store.dispatch('Logout').then(() => {
this.$router.push({ name: 'login' })
})
})
}
}
}
</script>
<style lang="less" scoped>
.ant-pro-drop-down {
/deep/ .action {
margin-right: 8px;
}
/deep/ .ant-dropdown-menu-item {
min-width: 160px;
}
}
</style>

View File

@ -0,0 +1,55 @@
<template>
<div :class="wrpCls">
<avatar-dropdown :menu="showMenu" :current-user="currentUser" :class="prefixCls" />
</div>
</template>
<script>
import AvatarDropdown from './AvatarDropdown'
// import store from '@/store'
export default {
name: 'RightContent',
components: {
AvatarDropdown
},
props: {
prefixCls: {
type: String,
default: 'ant-pro-global-header-index-action'
},
isMobile: {
type: Boolean,
default: () => false
},
topMenu: {
type: Boolean,
required: true
},
theme: {
type: String,
required: true
}
},
data () {
return {
showMenu: true,
currentUser: {}
}
},
computed: {
wrpCls () {
return {
'ant-pro-global-header-index-right': true,
[`ant-pro-global-header-index-${(this.isMobile || !this.topMenu) ? 'light' : this.theme}`]: true
}
}
},
mounted () {
// console.log(store)
this.currentUser = {
name: 'dd'
}
}
}
</script>

View File

@ -0,0 +1,30 @@
<template>
<div class="loading">
<div>
<a-spin size="large" />
</div>
</div>
</template>
<script>
export default {
name: 'GlobalLoad',
data () {
return {}
}
}
</script>
<style scoped>
.loading{
position: fixed;
top:0;
left:0;
z-index:100;
width: 100%;
height: 100%;
text-align: center;
display: flex;
align-items: center;
justify-content: center;
background: rgba(255,255,255,0.25);
}
</style>

View File

@ -0,0 +1,123 @@
<template>
<div>
<a-row :gutter="[24,24]" style="width:100%">
<!-- 卡片默认新增框 -->
<a-col
:xxl="24/span.xxl"
:xl="24/span.xl"
:lg="24/span.lg"
:md="24/span.md"
:sm="24/span.sm"
:xs="24/span.xs"
@click="$emit('addJeepayCard')"
v-if="addAuthority"
>
<div class="jeepay-card-add" :style="{'height': height + 'px'}">
<div class="jeepay-card-add-top">
<img src="~@/assets/svg/add-icon.svg" alt="add-icon" class="jeepay-card-add-icon">
<img src="~@/assets/svg/add-icon-hover.svg" alt="add-icon" class="jeepay-card-add-icon-hover">
</div>
<div class="jeepay-card-add-text">
新增{{ name }}
</div>
</div>
</a-col>
<!-- 数据 -->
<a-col
v-for="(item, key) in cardList"
:key="key"
:xxl="24/span.xxl"
:xl="24/span.xl"
:lg="24/span.lg"
:md="24/span.md"
:sm="24/span.sm"
:xs="24/span.xs"
>
<slot name="cardContentSlot" :record="item"></slot>
<slot name="cardOpSlot" :record="item"></slot>
</a-col>
</a-row>
</div>
</template>
<script>
export default {
name: 'JeepayCard',
props: {
span: { type: Object, default: () => ({ xxl: 6, xl: 4, lg: 4, md: 3, sm: 2, xs: 1 }) },
height: { type: Number, default: 200 },
name: { type: String, default: '' },
addAuthority: { type: Boolean, default: false },
reqCardListFunc: { type: Function, default: () => () => ({}) }
},
data () {
return {
cardList: []
}
},
created () {
this.refCardList()
},
methods: {
refCardList () {
const that = this
this.reqCardListFunc().then(resData => {
that.cardList = resData
})
}
}
}
</script>
<style lang="less" scoped>
.jeepay-card-add {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
border: 2px dashed rgba(0, 0, 0, 0.15);
background: rgba(0, 0, 0, 0.03);
border-radius: 6px;
box-sizing: border-box;
cursor: pointer;
}
.jeepay-card-add-top {
width: 80px;
height: 80px;
position: relative;
}
.jeepay-card-add:hover {
border-color: rgba(25,83,255,0.3);
background: rgba(25,83,255,0.06);
transition: all 0.3s ease-in-out;
}
.jeepay-card-add:hover .jeepay-card-add-icon {
opacity: 0;
transition: all 0.2s ease-in-out;
}
.jeepay-card-add:hover .jeepay-card-add-icon-hover {
opacity: 1;
transition: all 0.5s ease-in-out;
}
.jeepay-card-add:hover .jeepay-card-add-text {
color: rgba(25,83,255,1);
transition: all 0.3s ease-in-out;
}
.jeepay-card-add-icon {
position: absolute;
width: 80px;
height: 80px;
opacity: 1;
}
.jeepay-card-add-icon-hover {
position: absolute;
width: 80px;
height: 80px;
opacity: 0;
}
.jeepay-card-add-text {
padding-top: 5px;
font-size: 16px;
color: rgba(0, 0, 0, 0.35);
}
</style>

View File

@ -0,0 +1,119 @@
<!--
Jeepay 通用表格, 支持基础分页 检索
@author terrfly
@site https://www.jeepay.vip
@date 2021/5/8 07:18
-->
<template>
<div>
<a-table
:columns="tableColumns"
:data-source="apiResData.records"
:pagination="pagination"
:loading="showLoading"
@change="handleTableChange"
:row-selection="rowSelection"
:rowKey="rowKey"
:scroll="{ x: scrollX }"
>
<!-- 自定义列插槽 参考https://github.com/feseed/admin-antd-vue/blob/master/src/components/ShTable.vue -->
<!-- eslint-disable-next-line -->
<template v-for="colCustom in columnsCustomSlots" :slot="colCustom.customRender" slot-scope="record">
<slot :name="colCustom.customRender" :record="record"></slot>
</template>
</a-table>
</div>
</template>
<script>
export default {
name: 'JeepayTable', //
// ( --> )
props: {
initData: { type: Boolean, default: true }, // true
tableColumns: Array, //
reqTableDataFunc: { type: Function }, //
currentChange: { type: Function, default: (v1, v2) => {} }, //
searchData: Object, //
pageSize: { type: Number, default: 10 }, //
rowSelection: Object, // checkbox
rowKey: { type: [String, Function] }, // rowKey checkbox
scrollX: { type: Number, default: 800 } //
},
data () {
return {
apiResData: { total: 0, records: [] }, //
iPage: { pageNumber: 1, pageSize: this.pageSize }, // table /
pagination: { total: 0, current: 1, pageSize: this.pageSize, showSizeChanger: true, showTotal: total => `${total}` }, // ATable
showLoading: false
}
},
//
computed: {
columnsCustomSlots () { // 1. slot 2. slot
return this.tableColumns.filter(item => item.scopedSlots).map(item => item.scopedSlots)
}
},
mounted () {
if (this.initData) { //
this.refTable(true)
}
},
methods: {
handleTableChange (pagination, filters, sorter) { //
this.pagination = pagination
this.iPage = {
pageSize: pagination.pageSize, //
pageNumber: pagination.current, //
sortField: sorter.columnKey, //
sortOrder: sorter.order, //
...filters //
}
this.refTable()
},
//
refTable (isToFirst = false) {
const that = this
if (isToFirst) {
this.iPage.pageNumber = 1
this.pagination.current = 1
}
//
this.showLoading = true
this.reqTableDataFunc(Object.assign({}, this.iPage, this.searchData)).then(resData => {
this.pagination.total = resData.total //
this.apiResData = resData //
this.showLoading = false // loading
// 0
if (resData.records.length === 0 && this.iPage.pageNumber > 1) {
that.$nextTick(() => {
//
const maxPageNumber = (resData.total / this.iPage.pageSize) + ((resData.total % this.iPage.pageSize) === 0 ? 0 : 1)
if (maxPageNumber === 0) { //
return false
}
//
const toPageSize = (this.iPage.pageNumber - 1) > maxPageNumber ? maxPageNumber : (this.iPage.pageNumber - 1)
this.iPage.pageNumber = toPageSize
this.pagination.current = toPageSize
that.refTable(false)
})
}
// loading
that.$emit('btnLoadClose')
}).catch(res => {
this.showLoading = false
that.$emit('btnLoadClose')
}) // loading
}
}
}
</script>

View File

@ -0,0 +1,57 @@
<!--
Jeepay 通用状态切换按钮 支持switch和badge两个格式 根据权限进行判断
@author terrfly
@site https://www.jeepay.vip
@date 2021/5/8 07:18
-->
<template>
<div>
<template v-if="!showSwitchType">
<div v-if="state == 0" ><a-badge status="error" text="停用" /></div>
<div v-else-if="state == 1" ><a-badge status="processing" text="启用" /></div>
<div v-else ><a-badge status="warning" text="未知" /></div>
</template>
<template v-if="showSwitchType">
<a-switch class="els" checked-children="启用" un-checked-children="停用" :checked="switchChecked" @change="onChangeInner" />
</template>
</div>
</template>
<script>
export default {
name: 'JeepayTableColState', //
// ( --> )
props: {
state: { type: Number, default: -1 }, // true
showSwitchType: { type: Boolean, default: false }, // badge
onChange: { type: Function, default: (checked) => { return new Promise(resolve => { resolve() }) } } // change
},
data: function () {
return { switchChecked: false }
},
mounted () {
this.switchChecked = this.state === 1
},
watch: {
state: function (o, n) {
this.switchChecked = this.state === 1
}
},
methods: {
onChangeInner: function (checked) {
const that = this
this.switchChecked = checked
// 0 1;
this.onChange((checked ? 1 : 0)).then().catch(res => {
that.$nextTick(() => { that.switchChecked = !checked })
})
}
}
}
</script>

View File

@ -0,0 +1,43 @@
<!--
Jeepay 通用列添加更多菜单项
@author terrfly
@site https://www.jeepay.vip
@date 2021/5/8 07:18
-->
<script>
export default {
name: 'JeepayTableColumns', //
render (createElement, context) {
const slots = []
this.$slots.default.map(item => {
if (item.tag) {
slots.push(item)
}
return false
})
if (slots.length <= 3) { //
return createElement(
'div',
{ style: 'display:flex; justify-content: space-evenly;' },
slots //
)
} else {
const firstEL = [slots[0], slots[1]]
const menuEL = []
for (let i = 2; i < slots.length; i++) {
menuEL.push(<a-menu-item>{slots[i]}</a-menu-item>)
}
return <div style="display:flex; justify-content: space-evenly;"> {firstEL}
<a-dropdown>
<a class="ant-dropdown-link" style="line-height:32px">更多<a-icon type="down" /></a>
<a-menu slot="overlay">
{menuEL}
</a-menu>
</a-dropdown>
</div>
}
}
}
</script>

View File

@ -0,0 +1,121 @@
<template>
<div class="jee-text-up table-head-layout">
<a-input required="required" :value="msg" @input="$emit('input', $event.target.value)">
</a-input>
<label>{{ placeholder }}</label>
</div>
</template>
<script>
export default {
name: 'JeepayTextUp',
// props: ['msg', 'placeholder']
props: {
msg: { type: String, default: '' },
placeholder: { type: String, default: '' }
}
}
</script>
<style scoped lang="less">
//
.jee-text-up {
position: relative;
input {
outline: 0;
text-indent: 60px;
transition: all .3s ease-in-out;
}
input::-webkit-input-placeholder {
color: #BFBFBF;
text-indent: 0;
}
input + label {
pointer-events: none;
position: absolute;
left: 0;
bottom: 6px;
padding: 2px 11px;
color: #BFBFBF;
font-size: 13px;
text-transform: uppercase;
transition: all .3s ease-in-out;
border-radius: 3px;
background: rgba(122, 184, 147, 0);
height: 20px;
line-height: 20px;
display: flex;
justify-content: center;
align-items: center;
}
//
input + label:after {
position: absolute;
content: "";
width: 0;
height: 0;
top: 100%;
left: 50%;
margin-left: -3px;
border-left: 3px solid transparent;
border-right: 3px solid transparent;
transition: all .3s ease-in-out;
}
input:focus,
input:active,
input:valid + label {
text-indent: 0;
background: #fff;
}
input:focus + label,
input:active + label,
input:valid + label {
color: #fff;
background: @jee-theme;
transform: translateY(-33px);
}
input:focus + label:after,
input:active + label:after {
border-top: 4px solid @jee-theme;
}
input:valid {
text-indent: 0; //
}
input:valid + label{
background: #dadada; //
}
input:valid + label:after{ //
border-top: 4px solid #dadada;
}
}
//
// .jee-text-up {
// position: relative;
// .jee-text-label {
// position: absolute;
// z-index: 1;
// left: 15px;
// top: 0px;
// transition: all .3s;
// color: #bfbfbf;
// pointer-events: none;
// height: 20px;
// line-height: 20px;
// }
// input:focus + .jee-text-label, input:valid + .jee-text-label {
// top: -35px;
// padding: 1px 10px;
// border-radius: 5px;
// background: @jee-theme;
// color: #fff;
// }
// }
</style>

View File

@ -0,0 +1,86 @@
<template>
<div>
<a-upload
name="file"
:action="action"
:headers="headers"
:accept="accept"
:showUploadList="false"
:multiple="true"
:before-upload="beforeUpload"
@change="handleChange"
>
<slot name="uploadSlot" :loading="loading"></slot>
<!-- <img v-if="fileUrl && type === 'image'" :src="fileUrl" />
<a-input v-else-if="fileUrl && type === 'file'" :value="fileUrl" />
<a-button style="marginLeft:5px;"> <a-icon :type="loading ? 'loading' : 'upload'" /> {{ loading ? '正在上传' : '点击上传' }} </a-button> -->
</a-upload>
</div>
</template>
<script>
import appConfig from '@/config/appConfig'
import storage from '@/utils/jeepayStorageWrapper'
function getHeaders () {
const headers = {}
headers[appConfig.ACCESS_TOKEN_NAME] = storage.getToken() // token
return headers
}
export default {
name: 'JeepayUpload',
props: {
action: { type: String, default: '' },
accept: { type: String, default: '' },
size: { type: Number, default: 10 }, //
num: { type: Number, default: 1 } //
},
data () {
return {
loading: false, //
fileList: [],
headers: getHeaders() // token
}
},
created () {
},
methods: {
//
handleChange (info) {
//
/* let fileList = [...info.fileList]
fileList = fileList.length > this.num ? fileList.splice(0 - this.num) : fileList //
fileList = fileList.map(file => {
if (file.response) {
file.url = file.response.data
}
return file
}) */
const res = info.file.response
if (info.file.status === 'uploading') {
this.loading = true
}
if (info.file.status === 'done') {
if (res.code !== 0) {
this.$message.error(res.msg)
}
this.loading = false
this.$emit('uploadSuccess', res.data)
} else if (info.file.status === 'error') {
console.log(info)
this.$message.error(`上传失败`)
}
},
//
beforeUpload (file) {
const validate = file.size / 1024 / 1024 < this.size
if (!validate) {
this.$message.error('文件应小于' + this.size + 'M!')
}
return validate
}
}
}
</script>

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