Compare commits

..

No commits in common. "ca_router" and "chenzihao-patch-1" have entirely different histories.

226 changed files with 17363 additions and 22688 deletions

View File

@ -28,7 +28,6 @@
<velocity.version>2.3</velocity.version>
<jwt.version>0.9.1</jwt.version>
<hutool.version>5.8.22</hutool.version>
<pagehelper.boot.version>1.4.6</pagehelper.boot.version>
</properties>
<!-- 依赖声明 -->

View File

@ -151,5 +151,4 @@ sac:
# port: 5566
host: 192.168.1.23
port: 1775
url_pre: /gateway

View File

@ -26,12 +26,6 @@
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!-- pagehelper 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper.boot.version}</version>
</dependency>
<!-- Spring框架基本的核心工具 -->
<dependency>
<groupId>org.springframework</groupId>
@ -50,16 +44,10 @@
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.9</version>
</dependency>
<!-- pagehelper 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper.boot.version}</version>
</dependency>
<!-- 自定义验证注解 -->

View File

@ -77,33 +77,13 @@
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.16</version>
</dependency>
<!-- 防止进入swagger页面报类型转换错误排除3.0.0中的引用手动增加1.6.2版本 -->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.9</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-autoconfigure</artifactId>
<version>2.3.2</version>
</dependency>
</dependencies>
</project>

View File

@ -78,20 +78,20 @@ public class ApijsonInitUtil {
GenTableColumnServiceImpl genTableColumnService = SpringUtils.getBean("genTableColumnServiceImpl", GenTableColumnServiceImpl.class);
int pageNum = 1;
// while (true) {
// PageHelper.startPage(pageNum, 50, "table_id");
// GenTable genTableSearch = new GenTable();
// List<GenTable> list = genTableService.selectGenTableList(genTableSearch);
// if (list.size() == 0) {
// break;
// }
// for (GenTable genTable : list) {
// // 查询表字段
// List<GenTableColumn> listColumn = genTableColumnService.selectGenTableColumnListByTableId(genTable.getTableId());
// initConfigTableUserId(genTable.getTableName(), genTable.getUserId() , listColumn);
// }
// pageNum++;
// }
while (true) {
PageHelper.startPage(pageNum, 50, "table_id");
GenTable genTableSearch = new GenTable();
List<GenTable> list = genTableService.selectGenTableList(genTableSearch);
if (list.size() == 0) {
break;
}
for (GenTable genTable : list) {
// 查询表字段
List<GenTableColumn> listColumn = genTableColumnService.selectGenTableColumnListByTableId(genTable.getTableId());
initConfigTableUserId(genTable.getTableName(), genTable.getUserId() , listColumn);
}
pageNum++;
}
}
public static void deleteTablePkConfig(String tableName) {

View File

@ -47,9 +47,6 @@ public class GatewayConfigServiceImpl implements IGatewayConfigService {
@Value("${sac.gateway.port:5566}")
private Integer sacGatewayPort;
@Value("${sac.gateway.url_pre:}")
private String urlPre;
private static final String SYNC_CONFIG_PATH = "/vertx/app/config";
private static final Long DEFAULT_API_TIMEOUT = 3000L;
@ -104,7 +101,7 @@ public class GatewayConfigServiceImpl implements IGatewayConfigService {
public void synchronization(String appCode) {
Assert.hasText(sacGatewayHost, "网关地址未配置");
Assert.notNull(sacGatewayPort, "网关端口未配置");
String urlStr = "http://" + sacGatewayHost + ":" + sacGatewayPort + urlPre + SYNC_CONFIG_PATH;
String urlStr = "http://" + sacGatewayHost + ":" + sacGatewayPort + SYNC_CONFIG_PATH;
AppConfig appConfig = new AppConfig();
appConfig.setAppCode(appCode);
GatewayConfig gatewayConfig = selectGatewayConfigByAppCode(appCode);

View File

@ -26,11 +26,6 @@
<groupId>com.smarterFramework</groupId>
<artifactId>sf-file</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.16</version>
</dependency>
</dependencies>

View File

@ -1,7 +1,7 @@
FROM node:24-alpine AS builder
WORKDIR /app
COPY . .
ENV NODE_OPTIONS=--openssl-legacy-provider
RUN npm install --registry=https://registry.npmmirror.com && npm run build:stage
FROM registry.zsmarter.com/public/nginx:1.22.1

View File

@ -1,3 +1,4 @@
worker_processes 1;
events {
@ -28,6 +29,14 @@ http {
rewrite ^.*$ /index.html last;
}
location /stage-api/ {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://zt-sac-java:7781/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

@ -42,72 +42,3 @@ export function delWhitelist (id) {
method: 'delete'
})
}
// 查询白名单成员列列表
export function listWhitelistMember (query) {
return request({
url: '/deployment/whitelistMember/list',
method: 'get',
params: query
})
}
// 查询白名单成员列详细
export function getWhitelistMember (id) {
return request({
url: '/deployment/whitelistMember/' + id,
method: 'get'
})
}
// 新增白名单成员列
export function addWhitelistMember (data) {
return request({
url: '/deployment/whitelistMember',
method: 'post',
data: data
})
}
// 修改白名单成员列
export function updateWhitelistMember (data) {
return request({
url: '/deployment/whitelistMember',
method: 'put',
data: data
})
}
// 删除白名单成员列
export function delWhitelistMember (id) {
return request({
url: '/deployment/whitelistMember/' + id,
method: 'delete'
})
}
// 发布白名单
export function publishWhitelist (id) {
return request({
url: '/deployment/whitelist/publish/' + id,
method: 'get',
})
}
// 下架白名单
export function soldOutWhitelist (id) {
return request({
url: '/deployment/whitelist/sold/out/' + id,
method: 'get',
})
}
// 批量上传白名单
export function importWhitelist (data) {
return request({
url: 'deployment/whitelistMember/batch/import',
method: 'post',
data: data
})
}

View File

@ -1,28 +0,0 @@
import request from '@/utils/request'
// 查询网关配置信息
export function getGatewayConfig(params) {
return request({
url: '/gateway/config',
method: 'get',
params
})
}
// 更新网关配置
export function updateGatewayConfig(data) {
return request({
url: '/gateway/config',
method: 'put',
data
})
}
// 同步网关配置
export function updateGatewaySync(data) {
return request({
url: '/gateway/config/sync',
method: 'post',
data
})
}

View File

@ -42,12 +42,3 @@ export function delRoute(id) {
method: 'delete'
})
}
// 查询可绑定的路由列表(不分页)
export function getBindableList(params) {
return request({
url: '/gateway/route/bindableList',
method: 'get',
params
})
}

View File

@ -51,12 +51,3 @@ export function changeServerStatus(data) {
data: data
})
}
// 查询可绑定的服务列表(状态为启用的,不分页)
export function bindableServerList(params) {
return request({
url: '/gateway/server/bindableList',
method: 'get',
params
})
}

View File

@ -51,12 +51,3 @@ export function changeStrategyStatus(data) {
data: data
})
}
// 查询可绑定的策略列表(状态为启用的,不分页)
export function bindableStrategyList(params) {
return request({
url: '/gateway/strategy/bindableList',
method: 'get',
params
})
}

View File

@ -1,66 +0,0 @@
import request from '@/utils/request'
// 查询应用授权列表
export function listAppMandate (query) {
return request({
url: '/mandate/appMandate/list',
method: 'get',
params: query
})
}
// 查询应用授权详细
export function getAppMandate (id) {
return request({
url: '/mandate/appMandate/' + id,
method: 'get'
})
}
// 新增应用授权
export function addAppMandate (data) {
return request({
url: '/mandate/appMandate',
method: 'post',
data: data
})
}
// 新增应用授权批量
export function addAppMandateList (data) {
return request({
url: '/mandate/appMandate/addList',
method: 'post',
data: data
})
}
// 修改应用授权
export function updateAppMandate (data) {
return request({
url: '/mandate/appMandate',
method: 'put',
data: data
})
}
// 删除应用授权
export function delAppMandate (id) {
return request({
url: '/mandate/appMandate/' + id,
method: 'delete'
})
}
// 查询应用授权列表
export function appMandateUser () {
return request({
url: '/mandate/appMandate/queryUser',
method: 'get',
})
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 575 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

View File

@ -1,27 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="104px" height="30px" viewBox="0 0 104 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>SAC</title>
<defs>
<linearGradient x1="50%" y1="12.1751553%" x2="57.1919171%" y2="87.8248447%" id="linearGradient-1">
<stop stop-color="#FFFFFF" offset="0%"></stop>
<stop stop-color="#E5F1FF" offset="100%"></stop>
</linearGradient>
<linearGradient x1="89.6896665%" y1="8.24507501%" x2="11.6260569%" y2="79.7724897%" id="linearGradient-2">
<stop stop-color="#79C3FF" offset="0%"></stop>
<stop stop-color="#4490FE" offset="100%"></stop>
</linearGradient>
<linearGradient x1="50%" y1="17.0179916%" x2="57.1919171%" y2="82.9820084%" id="linearGradient-3">
<stop stop-color="#FFFFFF" offset="0%"></stop>
<stop stop-color="#E5F1FF" offset="100%"></stop>
</linearGradient>
</defs>
<g id="官网" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="首页" transform="translate(-262, -23)" fill-rule="nonzero">
<g id="logo" transform="translate(262, 23)">
<path d="M32.7865113,0.35850417 L30.7865113,6.44149583 L9.48530263,6.44149583 C8.1356254,6.44149583 7.04149583,7.5356254 7.04149583,8.88530263 C7.04149583,10.2349799 8.1356254,11.3291094 9.48530263,11.3291094 L23.8419133,11.3291094 C28.4569114,11.3291094 32.1981065,15.0703046 32.1981065,19.6853026 C32.1981065,24.3003007 28.4569114,28.0414958 23.8419133,28.0414958 L1.31479405,28.0414958 L3.31479405,21.9585042 L23.8419133,21.9585042 C25.0973678,21.9585042 26.1151148,20.9407572 26.1151148,19.6853026 C26.1151148,18.4298481 25.0973678,17.4121011 23.8419133,17.4121011 L9.48530263,17.4121011 C4.77608188,17.4121011 0.95850417,13.5945234 0.95850417,8.88530263 C0.95850417,4.17608188 4.77608188,0.35850417 9.48530263,0.35850417 L32.7865113,0.35850417 Z" id="路径-9" fill="url(#linearGradient-1)"></path>
<path d="M38.8681484,0.0454698506 L50.8563478,21.0969657 L59.5873478,6.61496568 L47.4598541,6.61559281 L44.4598541,0.532601149 L64.9730561,0.532601149 C67.3400843,0.532601149 68.7999234,3.11736276 67.5777828,5.14447769 L55.2888271,25.5276696 C54.8343051,26.2815668 54.1956757,26.9076108 53.4328824,27.3470396 C50.9465576,28.7793575 47.76987,27.9249162 46.337552,25.4385914 L31.7387233,0.0819362866 L38.8681484,0.0454698506 Z" id="路径-27" fill="url(#linearGradient-2)" transform="translate(49.879, 14.0435) scale(1, -1) translate(-49.879, -14.0435)"></path>
<path d="M94.832475,0.35850417 L96.832475,6.44149583 L82.7982917,6.44149583 C78.5133882,6.44149583 75.0397876,9.91509647 75.0397876,14.2 C75.0397876,18.4849035 78.5133882,21.9585042 82.7982917,21.9585042 L101.041496,21.9585042 L103.041496,28.0414958 L82.7982917,28.0414958 C75.1538447,28.0414958 68.9567959,21.8444471 68.9567959,14.2 C68.9567959,6.55555294 75.1538447,0.35850417 82.7982917,0.35850417 L94.832475,0.35850417 Z" id="路径-28" fill="url(#linearGradient-3)"></path>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -1,4 +1,4 @@
@import "./variables.scss";
@import './variables.scss';
@mixin colorBtn($color) {
background: $color;
@ -14,31 +14,31 @@
}
.blue-btn {
@include colorBtn($blue);
@include colorBtn($blue)
}
.light-blue-btn {
@include colorBtn($light-blue);
@include colorBtn($light-blue)
}
.red-btn {
@include colorBtn($red);
@include colorBtn($red)
}
.pink-btn {
@include colorBtn($pink);
@include colorBtn($pink)
}
.green-btn {
@include colorBtn($green);
@include colorBtn($green)
}
.tiffany-btn {
@include colorBtn($tiffany);
@include colorBtn($tiffany)
}
.yellow-btn {
@include colorBtn($yellow);
@include colorBtn($yellow)
}
.pan-btn {
@ -64,7 +64,7 @@
&:before,
&:after {
content: "";
content: '';
position: absolute;
top: 0;
right: 0;

View File

@ -52,19 +52,6 @@
left: 0;
position: relative;
margin: 0 auto;
.el-dialog__header {
padding: 20px 24px;
}
.el-dialog__header {
padding: 20px 24px;
}
.el-dialog__body {
padding: 24px;
}
.el-dialog__footer {
padding: 24px;
padding-top: 0px;
}
}
// refine element ui upload
@ -82,7 +69,7 @@
// dropdown
.el-dropdown-menu {
a {
display: block;
display: block
}
}
@ -103,38 +90,3 @@
.el-submenu__icon-arrow {
display: none;
}
.el-table {
.el-dropdown-menu {
display: flex;
}
.el-dropdown-menu__item {
display: flex;
flex: 1; /* 让所有项均分空间 */
justify-content: center; /* 水平居中 */
}
.el-dropdown-menu--mini .el-dropdown-menu__item {
padding: 0px;
margin-right: 12px;
}
.el-dropdown-menu--mini .el-dropdown-menu__item:first-child {
padding: 0px;
margin-left: 12px;
}
}
.el-table__column-filter-trigger {
position: relative;
.el-icon-arrow-down {
background: url("../images/filter_icon.png") no-repeat;
width: 15px;
height: 15px;
background-size: 100% 100%;
position: absolute;
top: -12px;
&::before {
display: none;
}
// display: none;
}
}

View File

@ -4,15 +4,10 @@
**/
/* theme color */
$--color-primary: #3F68FF;
$--color-success: #67C23A;
$--color-primary: #1890ff;
$--color-success: #13ce66;
$--color-warning: #ffba00;
$--color-danger: #FA5555;
// $--color-info: #1E1E1E;
// $--color-primary: #1890ff;
// $--color-success: #13ce66;
// $--color-warning: #ffba00;
// $--color-danger: #ff4949;
$--color-danger: #ff4949;
// $--color-info: #1E1E1E;
$--button-font-weight: 400;

View File

@ -122,12 +122,6 @@ aside {
//main-container全局样式
.app-container {
padding: 20px;
&-flex {
padding: 20px;
height: 100%;
display: flex;
flex-direction: column;
}
}
.components-container {
@ -186,9 +180,3 @@ aside {
margin-bottom: 10px;
}
}
.required-asterisk::before {
content: "*";
color: #ff4949;
margin-right: 4px;
}

View File

@ -46,12 +46,6 @@
.mr20 {
margin-right: 20px;
}
.mb14 {
margin-bottom: 14px;
}
.mb16 {
margin-bottom: 16px;
}
.mb20 {
margin-bottom: 20px;
}
@ -59,18 +53,7 @@
margin-left: 20px;
}
.h1,
.h2,
.h3,
.h4,
.h5,
.h6,
h1,
h2,
h3,
h4,
h5,
h6 {
.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 {
font-family: inherit;
font-weight: 500;
line-height: 1.1;
@ -91,17 +74,13 @@ h6 {
max-height: 70vh;
padding: 10px 20px 0;
}
.el-table th {
background-color: #f0f0f0; /* 你想要的颜色 */
}
// .has
.el-table {
.el-table__header-wrapper,
.el-table__fixed-header-wrapper {
.el-table__header-wrapper, .el-table__fixed-header-wrapper {
th {
word-break: break-word;
background-color: #d4e1ff !important;
color: #4169ff;
background-color: #f8f8f9;
color: #515a6e;
height: 40px;
font-size: 13px;
}
@ -119,7 +98,7 @@ h6 {
color:#6379bb;
border-bottom:1px solid #ddd;
margin:8px 10px 25px 10px;
padding-bottom: 5px;
padding-bottom:5px
}
/** 表格布局 **/
@ -135,7 +114,7 @@ h6 {
.tree-border {
margin-top: 5px;
border: 1px solid #e5e6e7;
background: #ffffff none;
background: #FFFFFF none;
border-radius:4px;
}
@ -160,14 +139,12 @@ h6 {
}
/** 表格更多操作下拉样式 */
.el-table .el-dropdown-link,
.el-table .el-dropdown-selfdefine {
.el-table .el-dropdown-link,.el-table .el-dropdown-selfdefine {
cursor: pointer;
margin-left: 5px;
}
.el-table .el-dropdown,
.el-icon-arrow-down {
.el-table .el-dropdown, .el-icon-arrow-down {
font-size: 12px;
}
@ -218,22 +195,22 @@ h6 {
/* button color */
.el-button--cyan.is-active,
.el-button--cyan:active {
background: #20b2aa;
border-color: #20b2aa;
color: #ffffff;
background: #20B2AA;
border-color: #20B2AA;
color: #FFFFFF;
}
.el-button--cyan:focus,
.el-button--cyan:hover {
background: #48d1cc;
border-color: #48d1cc;
color: #ffffff;
background: #48D1CC;
border-color: #48D1CC;
color: #FFFFFF;
}
.el-button--cyan {
background-color: #20b2aa;
border-color: #20b2aa;
color: #ffffff;
background-color: #20B2AA;
border-color: #20B2AA;
color: #FFFFFF;
}
/* text color */
@ -289,7 +266,7 @@ h6 {
/* 拖拽列样式 */
.sortable-ghost{
opacity: 0.8;
opacity: .8;
color: #fff!important;
background: #42b983!important;
}
@ -298,16 +275,3 @@ h6 {
position: relative;
float: right;
}
.dropdown-max {
max-width: 600px;
display: flex;
flex-flow: row wrap;
padding-left: 5px;
li {
margin-right: 5px;
white-space: nowrap;
}
}
.el-radio {
margin-right: 20px;
}

View File

@ -31,8 +31,7 @@ function install () {
} else {
return new Promise((resolve, reject) => {
getDicts(dictMeta.type).then(res => {
console.log(res);
store.dispatch('dict/setDict', { key: dictMeta.type, value: res.data, text: res.data.dictLabel })
store.dispatch('dict/setDict', { key: dictMeta.type, value: res.data })
resolve(res.data)
}).catch(error => {
reject(error)

View File

@ -5,19 +5,19 @@
<span
v-if="item.raw.listClass == 'default' || item.raw.listClass == ''"
:key="item.value"
:index="index"
:class="item.raw.cssClass"
>{{ item.label + " " }}</span
:index="index"
>{{ item.label + ' ' }}</span
>
<el-tag
v-else
:disable-transitions="true"
:key="item.value"
:class="item.raw.cssClass"
:disable-transitions="true"
:index="index"
:type="item.raw.listClass == 'primary' ? '' : item.raw.listClass"
:class="item.raw.cssClass"
>
{{ item.label + " " }}
{{ item.label + ' ' }}
</el-tag>
</template>
</template>
@ -29,61 +29,63 @@
<script>
export default {
name: "DictTag",
name: 'DictTag',
props: {
options: {
type: Array,
default: null,
default: null
},
value: [Number, String, Array],
// value
showValue: {
type: Boolean,
default: true,
default: true
}
},
data() {
return {
unmatchArray: [], //
unmatchArray: [] //
}
},
computed: {
values() {
if (this.value !== null && typeof this.value !== "undefined") {
return Array.isArray(this.value) ? this.value : [String(this.value)];
if (this.value !== null && typeof this.value !== 'undefined') {
console.log(this.value)
return Array.isArray(this.value) ? this.value : [String(this.value)]
} else {
return [];
return []
}
},
unmatch() {
this.unmatchArray = [];
if (this.value !== null && typeof this.value !== "undefined") {
this.unmatchArray = []
if (this.value !== null && typeof this.value !== 'undefined') {
//
if (!Array.isArray(this.value)) {
if (this.options.some((v) => v.value == this.value)) return false;
this.unmatchArray.push(this.value);
return true;
if (this.options.some((v) => v.value == this.value)) return false
this.unmatchArray.push(this.value)
return true
}
// Array
this.value.forEach((item) => {
if (!this.options.some((v) => v.value == item))
this.unmatchArray.push(item);
});
return true;
if (!this.options.some((v) => v.value == item)) {
this.unmatchArray.push(item)
}
})
return true
}
// value
return false;
},
return false
}
},
filters: {
handleArray(array) {
if (array.length === 0) return "";
if (array.length === 0) return ''
return array.reduce((pre, cur) => {
return pre + " " + cur;
return pre + ' ' + cur
})
}
}
};
}
</script>
<style scoped>
.el-tag + .el-tag {

View File

@ -1,79 +0,0 @@
<template>
<div     class="my-dropdown"     @click.stop="trigger == 'click' ? (showMenu = !showMenu) : ''"
    @mouseenter="trigger == 'hover' ? (showMenu = true) : ''"
    @mouseleave="trigger == 'hover' ? (showMenu = false) : ''"     ref="myDropDdown"   >
    <div class="tip-text" ref="tipText">
      <slot></slot>
    </div>
    <slot name="list"></slot>
  </div>
</template>
<script>
import emitter from "./emitter";
export default {
name: "MyDropdown",
componentName: "MyDropdown",
mixins: [emitter],
props: {
// 
trigger: {
type: String,
default: "click",
},
// 
placement: {
type: String,
default: "bottom",
validator: function (value) {
// 
return ["bottom", "top"].includes(value);
},
},
},
data () {
return {
//
showMenu: false,
};
},
mounted () {
//
this.initEvent();
},
methods: {
// 
initEvent () {
//itemon-click
this.$on("item-click", (params) => {
this.$emit("on-click", params);
this.showMenu = false;
});
//this
this.handleEmptyDomElementClickBindThis =
this.handleEmptyDomElementClick.bind(this);
window.addEventListener("click", this.handleEmptyDomElementClickBindThis);
},
// 
handleEmptyDomElementClick (e) {
if (!Array.from(this.$refs.myDropDdown.childNodes).includes(e.target)) {
this.showMenu = false;
}
},
},
beforeDestroy () {
// window
window.removeEventListener(this.handleEmptyDomElementClickBindThis);
},
watch: {
//
showMenu () {
this.broadcast("MyDropdownMenu", "set-menu-status", this.showMenu);
},
},
};
</script>
<style lang="scss" scoped>
.my-dropdown {
position: relative;
}
</style>

View File

@ -1,75 +0,0 @@
<template>
<div     :class="[
      'my-dropdownItem',
      divided ? 'my-dropdownItem-divided' : '',
      disabled ? 'my-dropdownItem-disabled' : '',
    ]"     @click.stop="handleItemClick"   >
    <slot></slot>
  </div>
</template>
<script>
import emitter from "./emitter";
export default {
name: "MyDropdownItem",
componentName: "MyDropdownItem",
mixins: [emitter],
props: {
divided: {
type: Boolean,
default: false,
},
disabled: {
type: Boolean,
default: false,
},
name: {
type: String,
default: "",
},
},
data () {
return {};
},
methods: {
handleItemClick () {
if (this.disabled) return;
// itemdropdown
this.dispatch("MyDropdown", "item-click", this.name);
},
},
};
</script>
<style lang="scss" scoped>
.my-dropdownItem {
margin: 0;
line-height: normal;
padding: 7px 16px;
clear: both;
color: #515a6e;
font-size: 14px !important;
white-space: nowrap;
list-style: none;
cursor: pointer;
transition: background 0.2s ease-in-out;
&:hover {
background: #f3f3f3;
}
}
.my-dropdownItem-divided {
border-bottom: 1px solid #eee
}
.my-dropdownItem-disabled {
color: #cacdd2;
cursor: not-allowed;
&:hover {
background: #fff;
}
}
</style>

View File

@ -1,96 +0,0 @@
<template>
<!-- 涉及到高度位移过渡使用js钩子函数的方式比较好处理些 -->
  <transition @before-enter="beforeEnter" @enter="enter" @leave="leave"     v-bind:css="false">
<div class="my-dropdown-menu" v-if="showMenue" ref="myDroupdownMenu">
<slot></slot>
</div>
</transition>
</template>
<script>
import emitter from "./emitter";
export default {
name: "MyDropdownMenu",
componentName: "MyDropdownMenu",
mixins: [emitter],
data () {
return {
showMeune: false,
timer: null,
};
},
mounted () {
this.$on("set-menu-status", (status) => {
this.showMeune = status;
});
},
methods: {
//
beforeEnter: function (el) {
// 
el.style.opacity = 0;
el.style.transform = "scaleY(0)";
el.style.transformOrigin = "top center";
},
//dom
enter: function (el, done) {
console.log(el);
//
const htmlClientHeight = document.documentElement.clientHeight;
//top
const offsetTop = el.offsetTop;
const scrollHeight = el.scrollHeight;
//top,left,bottom
const { bottom } = el.getBoundingClientRect();
// ,
if (htmlClientHeight - bottom < scrollHeight) {
el.style.transformOrigin = "bottom center";
el.style.top = -(scrollHeight + 20) + "px";
} else {
//placement
if (this.$parent.placement == "top") {
el.style.transformOrigin = "bottom center";
el.style.top = -(scrollHeight + 20) + "px";
} else {
el.style.top = offsetTop + "px";
}
}
el.style.transform = "scaleY(1)";
el.style.opacity = 1;
//enterleavedone
done();
},
//dom 
leave: function (el, done) {
el.style.transform = "scaleY(0)";
el.style.opacity = 0;
clearTimeout(this.timer);
this.timer = setTimeout(() => {
//enterleavedone
done();
}, 250);
},
},
};
</script>
<style lang="scss" scoped>
.my-dropdown-menu {
min-width: 100px;
max-height: 200px;
overflow: auto;
margin: 5px 0;
padding: 5px 0;
background-color: #fff;
box-sizing: border-box;
border-radius: 4px;
box-shadow: 0 1px 6px rgb(0 0 0 / 20%);
z-index: 999;
transform-origin: top center;
position: absolute;
transition: transform .25s ease, opacity 0.25s ease;
}
</style>

View File

@ -1,45 +0,0 @@
/**
* @Description 由于涉及到跨组件之间通信因此我们只有自己实现发布订阅的模式来实现组件之间通信,灵感主要来源于element-ui组件库源码中跨层级父子组件通信方案本质上也是发布订阅和$emit和$on
* @param { String } componentName 组件名
* @param { String } eventName 事件名
* @param { argument } params 参数
**/
// 广播通知事件
function _broadcast (componentName, eventName, params) {
// 遍历当前组件的子组件
this.$children.forEach(function (child) {
// 取出componentName,组件options上面可以自己配置
var name = child.$options.componentName;
// 如果找到了需要通知的组件名,触发组件上面的$eimit方法触发自定义事件
if (name === componentName) {
child.$emit.apply(child, [eventName].concat(params));
} else {
// 没找到,递归往下找
_broadcast.apply(child, [componentName, eventName].concat([params]));
}
});
}
const emiiter = {
methods: {
// 派发事件(通知父组件)
dispatch (componentName, eventName, params) {
var parent = this.$parent || this.$root;
var name = parent.$options.componentName;
// 循环往上层父组件,知道知道组件名和需要触发的组件名相同即可,然后触发对应组件的事件
while (parent && (!name || name !== componentName)) {
parent = parent.$parent;
if (parent) {
name = parent.$options.componentName;
}
}
if (parent) {
parent.$emit.apply(parent, [eventName].concat(params));
}
},
// 广播事件(通知子组件)
broadcast (componentName, eventName, params) {
_broadcast.call(this, componentName, eventName, params);
},
},
};
export default emiiter;

View File

@ -2,7 +2,7 @@
<div class="upload-file">
<el-upload
ref="fileUpload"
:accept="suffixArr.join(',')"
:accept="accept"
:action="baseUrl+uploadFileUrl"
:before-upload="handleBeforeUpload"
:file-list="fileList"
@ -13,17 +13,16 @@
:on-success="handleUploadSuccess"
:show-file-list="false"
class="upload-file-uploader"
:multiple="multiple"
multiple
>
<!-- 上传按钮 -->
<el-button size="mini" type="default" icon="el-icon-upload2">选取文件</el-button>
<el-button size="mini" type="primary">选取文件</el-button>
<!-- 上传提示 -->
<div v-if="showTip" slot="tip" class="el-upload__tip">
<!-- 请上传
请上传
<template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b></template>
<template v-if="fileType"> 格式为 <b style="color: #f56c6c">{{ fileType.join('/') }}</b></template>
的文件 -->
<span style="color: #999;">支持扩展名{{ suffixArr.join(' ') }}...</span>
的文件
</div>
</el-upload>
@ -31,7 +30,7 @@
<transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul">
<li v-for="(file, index) in fileList" :key="file.url" class="el-upload-list__item ele-upload-list__item-content">
<el-link :href="`${baseUrl}${file.url}`" :underline="false" target="_blank">
<span class="el-icon-document"> {{ getFileName(file) }} </span>
<span class="el-icon-document"> {{ getFileName(file.name) }} </span>
</el-link>
<div class="ele-upload-list__item-content-action">
<el-link :underline="false" type="danger" @click="handleDelete(index)">删除</el-link>
@ -73,9 +72,9 @@ export default {
type: String,
default: () => '/system/oss/zip/upload'
},
multiple: {
type: Boolean,
default: true
accept: {
type: Array,
default: () => []
}
},
data() {
@ -94,7 +93,6 @@ export default {
value: {
handler(val) {
if (val) {
console.log(val)
let temp = 1
//
const list = Array.isArray(val) ? val : this.value.split(',')
@ -119,11 +117,6 @@ export default {
//
showTip() {
return this.isShowTip && (this.fileType || this.fileSize)
},
suffixArr() {
return this.fileType.map(item => {
return `.${item}`
})
}
},
methods: {
@ -133,7 +126,7 @@ export default {
if (this.fileType) {
const fileName = file.name.split('.')
const fileExt = fileName[fileName.length - 1]
const isTypeOk = this.fileType.indexOf(fileExt.toLocaleUpperCase()) >= 0 || this.fileType.indexOf(fileExt.toLocaleLowerCase()) >= 0
const isTypeOk = this.fileType.indexOf(fileExt) >= 0
if (!isTypeOk) {
this.$modal.msgError(`文件格式不正确, 请上传${this.fileType.join('/')}格式文件!`)
return false
@ -163,9 +156,7 @@ export default {
//
handleUploadSuccess(res, file) {
if (res.code === 200) {
const { data } = res;
data.name = data.url;
this.uploadList.push(data)
this.uploadList.push({ name: res.data.url, url: res.data.url, size: res.data.size })
this.uploadedSuccessfully()
} else {
@ -180,8 +171,6 @@ export default {
handleDelete(index) {
this.fileList.splice(index, 1)
this.$emit('input', this.listToString(this.fileList))
this.$emit('change', this.fileList)
this.$emit('getSize', this.fileList)
},
//
uploadedSuccessfully() {
@ -190,15 +179,12 @@ export default {
this.uploadList = []
this.number = 0
this.$emit('input', this.listToString(this.fileList))
this.$emit('change', this.fileList)
this.$emit('getSize', this.fileList)
this.$modal.closeLoading()
}
},
//
getFileName(file) {
const {name, originalName} = file;
if (originalName) return originalName;
getFileName(name) {
if (name.lastIndexOf('/') > -1) {
return name.slice(name.lastIndexOf('/') + 1)
} else {

View File

@ -1,23 +1,44 @@
<template>
<div class="component-upload-image">
<el-upload ref="imageUpload" :action="baseUrl + uploadImgUrl" :before-upload="handleBeforeUpload"
:class="{ hide: this.fileList.length >= this.limit }" :file-list="fileList" :headers="headers" :accept="accept"
:limit="limit" :list-type="listType" :on-error="handleUploadError" :on-exceed="handleExceed"
:on-preview="handlePictureCardPreview" :on-remove="handleDelete" :on-success="handleUploadSuccess"
:show-file-list="true" multiple>
<el-upload
ref="imageUpload"
:action="baseUrl+uploadImgUrl"
:before-upload="handleBeforeUpload"
:class="{hide: this.fileList.length >= this.limit}"
:file-list="fileList"
:headers="headers"
:limit="limit"
:list-type="listType"
:on-error="handleUploadError"
:on-exceed="handleExceed"
:on-preview="handlePictureCardPreview"
:on-remove="handleDelete"
:on-success="handleUploadSuccess"
:show-file-list="true"
multiple
>
<i v-if="listType=='picture-card'" class="el-icon-plus"></i>
<el-button v-else icon="el-icon-upload" size="small" type="primary">上传文件</el-button>
</el-upload>
<!-- 上传提示 -->
<div v-if="showTip" slot="tip" class="el-upload__tip">
请上传<template v-if="fileSize">大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b></template>
请上传
<template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b></template>
<template v-if="fileType"> 格式为 <b style="color: #f56c6c">{{ fileType.join('/') }}</b></template>
的文件
</div>
<el-dialog :visible.sync="dialogVisible" append-to-body title="预览" width="800">
<img :src="dialogImageUrl" style="display: block; max-width: 100%; margin: 0 auto" />
<el-dialog
:visible.sync="dialogVisible"
append-to-body
title="预览"
width="800"
>
<img
:src="dialogImageUrl"
style="display: block; max-width: 100%; margin: 0 auto"
/>
</el-dialog>
</div>
</template>
@ -55,10 +76,6 @@ export default {
uploadImgUrl: {
type: String,
default: () => '/system/oss/upload'
},
accept: {
type: String,
default: () => ".png,.jpg,.jpeg"
}
},
data() {
@ -85,9 +102,12 @@ export default {
//
this.fileList = list.map(item => {
if (typeof item === 'string') {
console.log(333333)
if (item.indexOf(this.baseUrl) === -1) {
item = { name: item, url: item }
console.log(item)
} else {
console.log(7777)
item = { name: item, url: item }
}
}
@ -214,8 +234,7 @@ export default {
transition: all 0s;
}
::v-deep .el-list-enter,
.el-list-leave-active {
::v-deep .el-list-enter, .el-list-leave-active {
opacity: 0;
transform: translateY(0);
}

View File

@ -1,5 +1,5 @@
<template>
<el-dropdown trigger="hover" @command="handleSetSize">
<el-dropdown trigger="click" @command="handleSetSize">
<div>
<svg-icon class-name="size-icon" icon-class="size" />
</div>

View File

@ -30,10 +30,9 @@ export default {
.app-main {
/* 50= navbar 50 */
min-height: calc(100vh - 50px);
height: calc(100vh - 50px);
width: 100%;
position: relative;
overflow: auto;
overflow: hidden;
}
.fixed-header + .app-main {
@ -44,7 +43,6 @@ export default {
.app-main {
/* 84 = navbar + tags-view = 50 + 34 */
min-height: calc(100vh - 84px);
height: calc(100vh - 84px);
}
.fixed-header + .app-main {

View File

@ -1,35 +1,36 @@
<template>
<div class="navbar">
<hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container"
@toggleClick="toggleSideBar" />
<!-- <div style="float: left; line-height: 50px;" class="sidebar-logo-container">
<Logo :collapse="true" />
</div> -->
<hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
<breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!topNav"/>
<top-nav id="topmenu-container" class="topmenu-container" v-if="topNav"/>
<div class="right-menu">
<!-- <template v-if="device !== 'mobile'">
<template v-if="device!=='mobile'">
<search id="header-search" class="right-menu-item" />
<el-tooltip content="源码地址" effect="dark" placement="bottom">
<!-- <el-tooltip content="源码地址" effect="dark" placement="bottom">
<ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" />
</el-tooltip>
<el-tooltip content="文档地址" effect="dark" placement="bottom">
<ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />
</el-tooltip>
</el-tooltip> -->
<screenfull id="screenfull" class="right-menu-item hover-effect" />
<el-tooltip content="布局大小" effect="dark" placement="bottom">
<!-- <el-tooltip content="布局大小" effect="dark" placement="bottom">
<size-select id="size-select" class="right-menu-item hover-effect" />
</el-tooltip>
</el-tooltip> -->
</template> -->
</template>
<el-dropdown class="avatar-container right-menu-item hover-effect" trigger="hover">
<el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
<div class="avatar-wrapper">
<img :src="avatar" class="user-avatar">
<span class="ml10">{{ name }}</span>
<i class="el-icon-caret-bottom" />
</div>
<el-dropdown-menu slot="dropdown">
@ -50,6 +51,7 @@
<script>
import { mapGetters } from 'vuex'
import Logo from "../components/Sidebar/Logo";
import Breadcrumb from '@/components/Breadcrumb'
import TopNav from '@/components/TopNav'
import Hamburger from '@/components/Hamburger'
@ -61,6 +63,7 @@ import RuoYiDoc from '@/components/RuoYi/Doc'
export default {
components: {
Logo,
Breadcrumb,
TopNav,
Hamburger,
@ -74,8 +77,7 @@ export default {
...mapGetters([
'sidebar',
'avatar',
'device',
'name'
'device'
]),
setting: {
get() {
@ -181,9 +183,6 @@ export default {
.avatar-wrapper {
margin-top: 5px;
position: relative;
display: flex;
align-items: center;
line-height: initial;
.user-avatar {
cursor: pointer;
@ -196,7 +195,7 @@ export default {
cursor: pointer;
position: absolute;
right: -20px;
// top: 25px;
top: 25px;
font-size: 12px;
}
}

View File

@ -14,7 +14,7 @@
</template>
<script>
import logoImg from '@/assets/logo/logo.svg'
import logoImg from '@/assets/logo/logo.png'
import variables from '@/assets/styles/variables.scss'
export default {

View File

@ -1,5 +1,6 @@
export { default as AppMain } from './AppMain'
export { default as Navbar } from './Navbar'
// export { default as NavbarNew } from './NavbarNew'
export { default as Settings } from './Settings'
export { default as Sidebar } from './Sidebar/index.vue'
export { default as TagsView } from './TagsView/index.vue'

View File

@ -18,7 +18,7 @@ import './assets/icons' // icon
import './permission' // permission control
import { getDicts } from "@/api/system/dict/data";
import { getConfigKey } from "@/api/system/config";
import { parseTime, resetForm, addDateRange, selectDictLabel, selectDictLabels, handleTree, addDateRange2 } from "@/utils/ruoyi";
import { parseTime, resetForm, addDateRange, selectDictLabel, selectDictLabels, handleTree } from "@/utils/ruoyi";
// 分页组件
import Pagination from "@/components/Pagination";
// 自定义表格工具组件
@ -48,7 +48,6 @@ Vue.prototype.selectDictLabel = selectDictLabel
Vue.prototype.selectDictLabels = selectDictLabels
Vue.prototype.download = download
Vue.prototype.handleTree = handleTree
Vue.prototype.addDateRange2 = addDateRange2
// 全局组件挂载
Vue.component('DictTag', DictTag)
@ -72,10 +71,7 @@ DictData.install()
* Currently MockJs will be used in the production environment,
* please remove it before going online! ! !
*/
Element.Table.props.stripe = { type: Boolean, default: true }
Element.Dialog.props.closeOnPressEscape = { type: Boolean, default: false }
// Element.Dialog.props.width = { type: Boolean, default: '700' }
// Element.Radio.props.border = { type: Boolean, default: true }
Vue.use(Element, {
size: Cookies.get('size') || 'medium' // set element-ui default size
})

View File

@ -10,7 +10,7 @@ import { getApplicationId } from './utils/application'
NProgress.configure({ showSpinner: false })
const whiteList = ['/login', '/register']
const needApplicationList = ['/build', '/gateway']
const needApplicationList = ['/build/installationList', '/build/whiteListManagement', '/build/publish']
router.beforeEach((to, from, next) => {
NProgress.start()
@ -65,8 +65,7 @@ router.beforeEach((to, from, next) => {
})
function checkApplication(path) {
return needApplicationList.some(item => path.startsWith(item)) && !getApplicationId()
// return needApplicationList.includes(path) && !getApplicationId();
return needApplicationList.includes(path) && !getApplicationId();
}
router.afterEach(() => {

View File

@ -88,44 +88,20 @@ export const constantRoutes = [
]
},
// 本地测试-----------
// {
// path: '/gateway',
// component: Layout,
// hidden: true,
// redirect: 'server-config',
// children: [
// // {
// // path: 'server-config',
// // component: () => import('@/views/gateway/server/config/index'),
// // name: 'serverConfig',
// // meta: { title: '新增服务配置', breadcrumb: false, }
// // },
// // {
// // path: 'server-detail',
// // component: () => import('@/views/gateway/server/detail'),
// // name: 'serverDetail',
// // meta: { title: '服务详情', breadcrumb: false, }
// // },
// // {
// // path: 'route-edit',
// // component: () => import('@/views/gateway/route/edit'),
// // name: 'routeEdit',
// // meta: { title: '路由配置', breadcrumb: false, }
// // },
// // {
// // path: 'strategy-edit',
// // component: () => import('@/views/gateway/strategy/edit'),
// // name: 'strategyEdit',
// // meta: { title: '策略配置', breadcrumb: false, }
// // },
// // {
// // path: 'interface-edit',
// // component: () => import('@/views/gateway/interface/edit'),
// // name: 'interfaceEdit',
// // meta: { title: '接口配置', breadcrumb: false, }
// // }
// ]
// },
{
path: '/gateway',
component: Layout,
hidden: true,
redirect: 'server-config',
children: [
{
path: 'server-config',
component: () => import('@/views/gateway/server/config/index'),
name: 'serverConfig',
meta: { title: '新增服务配置', breadcrumb: false, }
}
]
},
// 本地测试-----------
]
@ -139,7 +115,8 @@ export const dynamicRoutes = [
children: [
{
path: 'role/:userId(\\d+)',
component: () => import('@/views/system/user/authRole'),
// component: () => import('@/views/system/user/authRole'),
component: (resolve) => require(['@/views/system/user/authRole'], resolve),
name: 'AuthRole',
meta: { title: '分配角色', activeMenu: '/system/user' }
}
@ -201,7 +178,139 @@ export const dynamicRoutes = [
}
]
},
{
path: '/build/install',
component: Layout,
hidden: true,
permissions: ['build:install:add'],
children: [
{
path: 'add',
component: () => import('@/views/FDS/installationList/add'),
name: 'InstallAdd',
meta: { title: '新增安装包', activeMenu: '/build/installationList' }
}
]
},
{
path: '/build/install',
component: Layout,
hidden: true,
permissions: ['build:install:edit'],
children: [
{
path: 'edit',
component: () => import('@/views/FDS/installationList/edit'),
name: 'InstallEdit',
meta: { title: '编辑安装包', activeMenu: '/build/installationList' }
}
]
},
{
path: '/build/install',
component: Layout,
hidden: true,
permissions: ['build:install:detail'],
children: [
{
path: 'detail',
component: () => import('@/views/FDS/installationList/detail'),
name: 'InstallDetail',
meta: { title: '安装包详情', activeMenu: '/build/installationList' }
}
]
},
{
path: '/build/publishList',
component: Layout,
hidden: true,
permissions: ['build:publishList:add'],
children: [
{
path: 'add',
component: () => import('@/views/FDS/publishList/add'),
name: 'PublishAdd',
meta: { title: '新增发布', activeMenu: '/build/publish' }
}
]
},
{
path: '/build/publishList',
component: Layout,
hidden: true,
permissions: ['build:publishList:detail'],
children: [
{
path: 'detail',
component: () => import('@/views/FDS/publishList/detail'),
name: 'PublishDetail',
meta: { title: '发布详情', activeMenu: '/build/publish' }
}
]
},
{
path: '/build/whiteList',
component: Layout,
hidden: true,
permissions: ['build:whiteListManagement:add'],
children: [
{
path: 'add',
component: () => import('@/views/FDS/whiteListManagement/add'),
name: 'WhiteListManagementAdd',
meta: { title: '新增白名单', activeMenu: '/build/whiteListManagement' }
}
]
},
{
path: '/build/whiteList',
component: Layout,
hidden: true,
permissions: ['build:whiteListManagement:detail'],
children: [
{
path: 'detail',
component: () => import('@/views/FDS/whiteListManagement/detail'),
name: 'WhiteListManagementDetail',
meta: { title: '白名单详情', activeMenu: '/build/whiteListManagement' }
}
]
},
{
path: '/build/whiteList',
component: Layout,
hidden: true,
permissions: ['build:whiteListManagement:equepDetail'],
children: [
{
path: 'equepDetail',
component: () => import('@/views/FDS/whiteListManagement/equepDetail'),
name: 'WhiteListManagementEquepDetail',
meta: { title: '白名单设备详情', activeMenu: '/build/whiteListManagement' }
}
]
},
{
path: '/build/whiteList',
component: Layout,
hidden: true,
permissions: ['build:whiteListManagement:addConfig'],
children: [
{
path: 'addConfig',
component: () => import('@/views/FDS/whiteListManagement/addConfig'),
name: 'WhiteListManagementConfigAdd',
meta: { title: '新增白名单配置', activeMenu: '/build/whiteListManagement' }
}
]
}
]

View File

@ -5,7 +5,7 @@ const { sideTheme, showSettings, topNav, tagsView, fixedHeader, sidebarLogo, dyn
const storageSetting = JSON.parse(localStorage.getItem('layout-setting')) || ''
const state = {
title: '',
theme: storageSetting.theme || '#3F68FF',
theme: storageSetting.theme || '#409EFF',
sideTheme: storageSetting.sideTheme || sideTheme,
showSettings: showSettings,
topNav: storageSetting.topNav === undefined ? topNav : storageSetting.topNav,

View File

@ -37,8 +37,8 @@ const user = {
state.permissions = permissions
},
SET_APPLICATION: (state, applicationInfo) => {
const { appCode } = applicationInfo
state.applicationId = appCode || ''
const { id } = applicationInfo
state.applicationId = id || ''
state.applicationInfo = applicationInfo
}
},
@ -66,7 +66,7 @@ const user = {
return new Promise((resolve, reject) => {
getInfo().then(res => {
const user = res.user
const avatar = (user.avatar == '' || user.avatar == null) ? require('@/assets/images/profile.png') : process.env.VUE_APP_BASE_API + user.avatar
const avatar = (user.avatar == '' || user.avatar == null) ? require('@/assets/images/profile.jpg') : process.env.VUE_APP_BASE_API + user.avatar
if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组
commit('SET_ROLES', res.roles)
commit('SET_PERMISSIONS', res.permissions)
@ -113,9 +113,9 @@ const user = {
// 设置选中的项目应用信息
SetApplication({ commit }, applicationInfo) {
commit('SET_APPLICATION', applicationInfo)
const { appCode, appName, isAdmin } = applicationInfo || {}
if (appCode) {
setApplicationId(appCode)
const { id, appName } = applicationInfo || {}
if (id) {
setApplicationId(applicationInfo.id)
Cookies.set('Admin-Application-appCode', applicationInfo.appCode)
} else {
removeApplicationId()
@ -126,14 +126,6 @@ const user = {
} else {
removeApplicationName()
}
if (isAdmin) {
Cookies.set('Admin-isAdmin', isAdmin)
} else {
Cookies.set('Admin-isAdmin', 0)
}
}
}
}

View File

@ -1,3 +0,0 @@
import vue from 'vue'
const EventBus = new vue();
export default EventBus;

View File

@ -7,7 +7,6 @@ import { blobValidate, tansParams } from '@/utils/ruoyi'
import cache from '@/plugins/cache'
import { saveAs } from 'file-saver'
import Cookies from 'js-cookie'
import router from '@/router'
let downloadLoadingInstance
// 是否显示重新登录
@ -98,15 +97,6 @@ service.interceptors.response.use(res => {
})
}
return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
} else if (code === 4030) {
MessageBox.confirm('AppCode未找到请重新选择项目。', '系统提示', {
confirmButtonText: '重新选择',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
router.push('/')
})
return Promise.reject('AppCode未找到请重新选择项目。')
} else if (code === 500) {
Message({ message: msg, type: 'error' })
return Promise.reject(new Error(msg))

View File

@ -68,25 +68,6 @@ export function addDateRange (params, dateRange, propName) {
return search;
}
// 添加日期范围
export function addDateRange2 (params, dateRange, propName) {
let search = params;
search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {};
dateRange = Array.isArray(dateRange) ? dateRange : [];
if (typeof (propName) === 'undefined') {
search.beginTime = dateRange[0];
search.endTime = dateRange[1];
} else {
search.params['begin' + propName] = dateRange[0];
search.params['end' + propName] = dateRange[1];
}
return search;
}
// 回显数据字典
export function selectDictLabel(datas, value) {
if (value === undefined) {

View File

@ -8,29 +8,25 @@
<el-main>
<div class="form-main">
<el-form ref="elForm" :model="formData" :rules="rules" label-width="100px" size="medium">
<el-form-item label="上传方式" prop="uploadingType">
<el-radio-group v-model="formData.uploadingType" size="medium">
<el-radio v-for="(item, index) in dict.type.sys_apk_uploading_type" :key="index"
:disabled="item.disabled"
:label="item.value"
>{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<!-- <el-form-item label="上传方式" prop="uploadingType">-->
<!-- <el-radio-group v-model="formData.uploadingType" size="medium">-->
<!-- <el-radio v-for="(item, index) in dict.type.sys_apk_uploading_type" :key="index"-->
<!-- :disabled="item.disabled"-->
<!-- :label="item.value"-->
<!-- >{{ item.label }}-->
<!-- </el-radio>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<el-form-item v-if="activeTabs==='1'" label="安装包名称" prop="sysApkName">
<el-input v-model="formData.sysApkName" :style="{width: '100%'}" clearable placeholder="请输入安装包名称">
</el-input>
</el-form-item>
<!-- <el-form-item v-else label="模块包名称" prop="field107">-->
<!-- <el-input v-model="formData.field107" :style="{width: '100%'}" clearable placeholder="请输入模块包名称">-->
<!-- </el-input>-->
<!-- </el-form-item>-->
<el-form-item label="版本号" prop="version">
<el-input v-model="formData.version" :style="{width: '100%'}" clearable placeholder="请输入版本号">
</el-input>
</el-form-item>
<el-form-item label="安装包文件" prop="sysApk">
<file-upload v-model="formData.sysApk" :fileType="['apk','txt']" :limit="1"
<file-upload v-model="formData.sysApk" :fileSize="50" :fileType="['apk','hap','iap','zip']" :limit="1"
@getSize="getSize"
/>
@ -47,16 +43,6 @@
</el-radio>
</el-radio-group>
</el-form-item>
<!-- <el-form-item v-if="activeTabs!='1'" label="适用模块" prop="configName">-->
<!-- <el-select v-model="formData.field108" clearable placeholder="请选择对应的模块">-->
<!-- <el-option-->
<!-- v-for="dict in dict.type.sys_yes_no"-->
<!-- :key="dict.value"-->
<!-- :label="dict.label"-->
<!-- :value="dict.value"-->
<!-- />-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<el-form-item size="large">
<el-button type="primary" @click="submitForm">提交</el-button>
<el-button @click="cancel"> </el-button>
@ -77,7 +63,7 @@ export default {
data() {
return {
formData: {
uploadingType: 'OffLineUploading',
uploadingType: 'OnLineUploading',
sysApkName: undefined,
version: undefined,
sysApk: null,
@ -123,6 +109,7 @@ export default {
})
},
getSize(e) {
console.log(e)
this.formData.sysApkSize = e[0].size + 'kb'
},
cancel() {

View File

@ -27,11 +27,11 @@
</el-form-item>
<el-form-item v-if="activeTabs!='1'" label="适用模块:">登录模块</el-form-item>
<el-form-item label="上传时间:">{{ form.createTime }}</el-form-item>
<el-form-item label="上传状态:">
<dict-tag :options="dict.type.uploading_status" :value="form.uploadingStatus"/>
</el-form-item>
<!-- <el-form-item label="上传状态:">-->
<!-- <dict-tag :options="dict.type.uploading_status" :value="form.uploadingStatus"/>-->
<!-- </el-form-item>-->
<el-form-item label="上传人员:">{{ form.created }}</el-form-item>
<el-form-item label="上传日志:">日志日志</el-form-item>
<!-- <el-form-item label="上传日志:"></el-form-item>-->
<el-form-item size="large">
<el-button @click="cancel"> </el-button>
</el-form-item>

View File

@ -8,30 +8,27 @@
<el-main>
<div class="form-main">
<el-form ref="elForm" :model="formData" :rules="rules" label-width="100px" size="medium">
<el-form-item label="上传方式" prop="uploadingType">
<el-radio-group v-model="formData.uploadingType" size="medium">
<el-radio v-for="(item, index) in dict.type.sys_apk_uploading_type" :key="index"
:disabled="item.disabled"
:label="item.value"
>{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<!-- <el-form-item label="上传方式" prop="uploadingType">-->
<!-- <el-radio-group v-model="formData.uploadingType" size="medium">-->
<!-- <el-radio v-for="(item, index) in dict.type.sys_apk_uploading_type" :key="index"-->
<!-- :disabled="item.disabled"-->
<!-- :label="item.value"-->
<!-- >{{ item.label }}-->
<!-- </el-radio>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<el-form-item v-if="activeTabs==='1'" label="安装包名称" prop="sysApkName">
<el-input v-model="formData.sysApkName" :style="{width: '100%'}" clearable placeholder="请输入安装包名称">
</el-input>
</el-form-item>
<!-- <el-form-item v-else label="模块包名称" prop="field107">-->
<!-- <el-input v-model="formData.field107" :style="{width: '100%'}" clearable placeholder="请输入模块包名称">-->
<!-- </el-input>-->
<!-- </el-form-item>-->
<el-form-item label="版本号" prop="version">
<el-input v-model="formData.version" :style="{width: '100%'}" clearable placeholder="请输入版本号">
</el-input>
</el-form-item>
<el-form-item label="安装包文件" prop="sysApk">
<file-upload v-model="formData.sysApk" :fileType="['apk','txt']" :limit="1"
<file-upload v-model="formData.sysApk" :fileSize="50" :fileType="['apk','hap','iap','zip']" :limit="1"
:uploadFileUrl="formData.uploadingType==='OffLineUploading'?'/system/oss/zip/upload':'/system/oss/upload'"
@getSize="getSize"
/>
@ -48,16 +45,6 @@
</el-radio>
</el-radio-group>
</el-form-item>
<!-- <el-form-item v-if="activeTabs!='1'" label="适用模块" prop="configName">-->
<!-- <el-select v-model="formData.field108" clearable placeholder="请选择对应的模块">-->
<!-- <el-option-->
<!-- v-for="dict in dict.type.sys_yes_no"-->
<!-- :key="dict.value"-->
<!-- :label="dict.label"-->
<!-- :value="dict.value"-->
<!-- />-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<el-form-item size="large">
<el-button type="primary" @click="submitForm">提交</el-button>
<el-button @click="cancel"> </el-button>

View File

@ -1,68 +1,39 @@
<template>
<div class="app-container">
<el-tabs v-model="activeTabs" type="card" @tab-click="handleClickTabs">
<el-tab-pane
v-for="item in packTabs"
:key="item.name"
:label="item.title"
:name="item.name"
>
</el-tab-pane>
</el-tabs>
<el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="90px" size="small">
<el-form-item label="上传类型" prop="uploadingType">
<el-select v-model="queryParams.uploadingType" clearable placeholder="请选择上传类型">
<el-option
v-for="dict in dict.type.sys_apk_uploading_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="120px" size="small">
<!-- <el-form-item label="上传类型" prop="uploadingType">-->
<!-- <el-select v-model="queryParams.uploadingType" placeholder="请选择上传类型" clearable>-->
<!-- <el-option-->
<!-- v-for="dict in dict.type.sys_apk_uploading_type"-->
<!-- :key="dict.value"-->
<!-- :label="dict.label"-->
<!-- :value="dict.value"-->
<!-- />-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<el-form-item label="安装包名称" prop="sysApkName">
<el-input
v-model="queryParams.sysApkName"
clearable
placeholder="请输入安装包名称"
@keyup.enter.native="handleQuery"
/>
<el-input v-model="queryParams.sysApkName" clearable placeholder="请输入安装包名称" @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="版本号" prop="version">
<el-input
v-model="queryParams.version"
clearable
placeholder="请输入版本号"
@keyup.enter.native="handleQuery"
/>
<el-input v-model="queryParams.version" clearable placeholder="请输入版本号" @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="安装包类型" prop="sysType">
<el-select v-model="queryParams.sysType" clearable placeholder="请选择安装包类型">
<el-option
v-for="dict in dict.type.sys_apk_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="上传状态" prop="uploadingStatus">
<el-select v-model="queryParams.uploadingStatus" clearable placeholder="请选择上传状态">
<el-option
v-for="dict in dict.type.uploading_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
<el-option v-for="dict in dict.type.sys_apk_type" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<!-- <el-form-item label="上传状态" prop="uploadingStatus">-->
<!-- <el-select v-model="queryParams.uploadingStatus" clearable placeholder="请选择上传状态">-->
<!-- <el-option-->
<!-- v-for="dict in dict.type.uploading_status"-->
<!-- :key="dict.value"-->
<!-- :label="dict.label"-->
<!-- :value="dict.value"-->
<!-- />-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<el-form-item label="创建人" prop="created">
<el-input
v-model="queryParams.created"
clearable
placeholder="请输入创建人"
@keyup.enter.native="handleQuery"
/>
<el-input v-model="queryParams.created" clearable placeholder="请输入创建人" @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item>
<el-button icon="el-icon-search" size="mini" type="primary" @click="handleQuery">搜索</el-button>
@ -72,41 +43,45 @@
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
v-hasPermi="['system:config:add']"
icon="el-icon-plus"
plain
size="mini"
type="primary"
@click="handleAdd"
>新建
<el-button v-hasPermi="['deploy:INFO:add']" icon="el-icon-plus" plain size="mini" type="primary"
@click="handleAdd">新增
</el-button>
</el-col>
<!-- <el-col :span="1.5">-->
<!-- <el-button-->
<!-- v-hasPermi="['deploy:INFO:edit']"-->
<!-- :disabled="single"-->
<!-- icon="el-icon-edit"-->
<!-- plain-->
<!-- size="mini"-->
<!-- type="success"-->
<!-- @click="handleUpdate"-->
<!-- >修改-->
<!-- </el-button>-->
<!-- </el-col>-->
<el-col :span="1.5">
<el-button
v-hasPermi="['system:config:delete']"
:disabled="multiple"
icon="el-icon-plus"
plain
size="mini"
type="info"
@click="handleDelete"
>批量删除
<el-button v-hasPermi="['deploy:INFO:remove']" :disabled="multiple" icon="el-icon-delete" plain size="mini"
type="danger" @click="handleDelete">批量删除
</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="INFOList" @selection-change="handleSelectionChange">
<el-table-column align="center" type="selection" width="55" />
<template v-if="activeTabs=='1'">
<el-table-column align="center" label="上传类型" prop="uploadingType">
<template slot-scope="scope">
<dict-tag :options="dict.type.sys_apk_uploading_type" :value="scope.row.uploadingType"/>
</template>
</el-table-column>
<el-table-column align="center" label="安装包名称" prop="sysApkName" />
<el-table-column align="center" label="版本号" prop="version" />
<el-table-column align="center" label="安装包" prop="sysApk"/>
<el-table-column align="center" label="安装包" prop="sysApk">
<template slot="header" slot-scope="scope">
<span>安装包</span>
<el-tooltip placement="top">
<div slot="content">复制当前的安装包地址</div>
<i class="el-icon-warning-outline" size="20"></i>
</el-tooltip>
</template>
<template slot-scope="scope">
<el-button icon="el-icon-copy" type="primary" @click="copyIt(scope.row.sysApk)">复制</el-button>
</template>
</el-table-column>
<el-table-column align="center" label="安装包大小" prop="sysApkSize" />
<el-table-column align="center" label="安装包类型" prop="sysType">
<template slot-scope="scope">
@ -114,78 +89,113 @@
</template>
</el-table-column>
<el-table-column align="center" label="创建人" prop="created" />
</template>
<template v-if="activeTabs=='2'">
<el-table-column align="center" label="安装包名称" prop="configId"/>
<el-table-column :show-overflow-tooltip="true" align="center" label="版本号" prop="version"/>
<el-table-column :show-overflow-tooltip="true" align="center" label="安装包大小" prop="sys_apk_size"/>
<el-table-column :show-overflow-tooltip="true" align="center" label="上传方式" prop="uploading_type"/>
<el-table-column :show-overflow-tooltip="true" align="center" label="创建人" prop="created"/>
<el-table-column align="center" label="创建时间" prop="create_time" width="180">
<el-table-column align="center" class-name="small-padding fixed-width" fixed="right" label="操作">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
</template>
<el-table-column align="center" label="状态" prop="uploading_status">
<template slot-scope="scopeA">
<dict-tag :options="dict.type.uploading_status" :value="scopeA.row.uploadingStatus"/>
</template>
</el-table-column>
<el-table-column align="center" class-name="small-padding fixed-width" label="操作" width="250">
<template slot-scope="scope">
<el-button
v-hasPermi="['system:config:dowmload']"
icon="el-icon-download"
size="mini"
type="text"
@click="handleDownload(scope.row)"
>下载安装包
<el-button icon="el-icon-download" size="mini" type="text" @click="handleDownload(scope.row)">下载安装包
</el-button>
<el-button
v-hasPermi="['system:config:edit']"
icon="el-icon-edit"
size="mini"
type="text"
@click="handleEdit(scope.row)"
>编辑
<el-button v-hasPermi="['deploy:INFO:edit']" icon="el-icon-edit" size="mini" type="text"
@click="handleUpdate(scope.row)">修改
</el-button>
<el-button
v-hasPermi="['system:config:detail']"
icon="el-icon-view"
size="mini"
type="text"
@click="handleDetail(scope.row)"
>详情
<el-button icon="el-icon-view" size="mini" type="text" @click="handleDetail(scope.row)">详情
</el-button>
<el-button
v-hasPermi="['system:config:delete']"
icon="el-icon-delete"
size="mini"
type="text"
@click="handleDelete(scope.row)"
>删除
<el-button v-hasPermi="['deploy:INFO:remove']" icon="el-icon-delete" size="mini" type="text"
@click="handleDelete(scope.row)">删除
</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:limit.sync="queryParams.pageSize"
:page.sync="queryParams.pageNum"
:total="total"
@pagination="getList"
/>
<pagination v-show="total > 0" :limit.sync="queryParams.pageSize" :page.sync="queryParams.pageNum" :total="total"
@pagination="getList" />
<!-- 添加或修改安装包管理对话框 -->
<el-dialog :title="title" :visible.sync="open" append-to-body width="700px">
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-form-item label="安装包名称" prop="sysApkName">
<el-input v-model="form.sysApkName" placeholder="请输入安装包名称" />
</el-form-item>
<el-form-item label="版本号" prop="version">
<el-input v-model="form.version" placeholder="请输入版本号" />
</el-form-item>
<el-form-item label="安装包" prop="sysApk">
<file-upload v-model="form.sysApk" :accept="['.zip', '.apk', '.hap', '.iap']" :fileSize="50"
:fileType="['apk', 'hap', 'iap', 'zip']" :limit="1" uploadFileUrl="/system/oss/upload" @getSize="getSize" />
</el-form-item>
<el-form-item label="安装包大小" prop="sysApkSize">
<el-input v-model="form.sysApkSize" placeholder="请输入安装包大小" readonly />
</el-form-item>
<el-form-item label="安装包类型" prop="sysType">
<el-select v-model="form.sysType" placeholder="请选择安装包类型">
<el-option v-for="dict in dict.type.sys_apk_type" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog :title="title" :visible.sync="openDetail" append-to-body width="700px">
<el-form ref="form" :model="form" label-width="120px">
<el-form-item label="安装包名称" prop="moduleName">
{{ form.sysApkName }}
</el-form-item>
<el-form-item label="版本号" prop="version">
{{ form.version }}
</el-form-item>
<el-form-item label="安装包" prop="moduleUrl">
{{ form.sysApk }}
</el-form-item>
<el-form-item label="安装包大小" prop="moduleSize">
{{ form.sysApkSize }}
</el-form-item>
<el-form-item label="系统类型" prop="sysType">
{{ form.sysType }}
</el-form-item>
<el-form-item label="下载地址:">
<el-input v-model="form.sysApk" class="input-with-select" readonly>
<el-button slot="append" @click="copyIt(form.sysApk)">复制</el-button>
</el-input>
</el-form-item>
<el-form-item label="上传时间:">{{ form.createTime }}</el-form-item>
<el-form-item label="上传人员:">{{ form.created }}</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancelDetail"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { delINFO, listINFO } from '@/api/FDS/installList'
import { addINFO, delINFO, getINFO, listINFO, updateINFO } from '@/api/FDS/installList'
import Cookies from 'js-cookie'
export default {
name: 'InstallationList',
name: 'INFO',
dicts: ['sys_apk_uploading_type', 'uploading_status', 'sys_apk_type'],
data () {
return {
form: {
uploadingType: 'OnLineUploading',
sysApkName: undefined,
version: undefined,
sysApk: null,
sysApkSize: undefined,
sysType: '',
appCode: Cookies.get('Admin-Application-appCode')
},
//
loading: true,
//
@ -200,15 +210,11 @@ export default {
total: 0,
//
INFOList: [],
packTabs: [{
name: '1',
title: 'APP安装包'
}, {
name: '2',
title: 'H5模块包'
}],
//
create_time: [],
//
title: '',
//
open: false,
openDetail: false,
//
queryParams: {
pageNum: 1,
@ -220,15 +226,24 @@ export default {
uploadingStatus: null,
created: null
},
//
form: {},
activeTabs: '1'
//
rules: {
uploadingType: [
{ required: true, message: '上传类型不能为空', trigger: 'change' }
],
sysApkName: [
{ required: true, message: '安装包名称不能为空', trigger: 'blur' }
],
version: [
{ required: true, message: '版本号不能为空', trigger: 'blur' }
],
sysType: [
{ required: true, message: '安装包类型不能为空', trigger: 'change' }
],
sysApk: [
{ required: true, message: '安装包不能为空', trigger: 'change' }
]
}
},
watch: {
$route(to, from) {
if (to) this.getList()
}
},
created () {
@ -237,13 +252,31 @@ export default {
methods: {
/** 查询安装包管理(新)列表 */
getList () {
this.loading = false
this.loading = true
listINFO(this.queryParams).then(response => {
this.INFOList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel () {
this.open = false
this.reset()
},
//
reset () {
this.form = {
uploadingType: 'OnLineUploading',
sysApkName: undefined,
version: undefined,
sysApk: null,
sysApkSize: undefined,
sysType: '',
appCode: Cookies.get('Admin-Application-appCode')
}
this.resetForm('form')
},
/** 搜索按钮操作 */
handleQuery () {
this.queryParams.pageNum = 1
@ -251,77 +284,99 @@ export default {
},
/** 重置按钮操作 */
resetQuery () {
this.create_time = []
this.resetForm('queryForm')
this.handleQuery()
},
/** 新增按钮操作 */
handleAdd() {
const query = {
activeTabs: this.activeTabs
}
this.$router.push({
path: '/build/install/add/',
query: query
})
// this.$tab.openPage('', '/build/install/add/', params)
},
//
handleSelectionChange (selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length != 1
this.single = selection.length !== 1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd () {
this.reset()
this.open = true
this.title = '添加安装包管理'
},
/** 修改按钮操作 */
handleUpdate (row) {
this.reset()
const id = row.id || this.ids
getINFO(id).then(response => {
this.form = response.data
this.open = true
this.title = '修改安装包管理'
})
},
/** 详情按钮操作 */
handleDetail (row) {
this.reset()
const id = row.id || this.ids
getINFO(id).then(response => {
this.form = response.data
this.openDetail = true
this.title = '安装包详情'
this.type = 'detail'
})
},
/** 提交按钮 */
submitForm () {
this.$refs['form'].validate(valid => {
if (valid) {
if (this.form.id != null) {
let data = Object.assign({}, this.form)
data.appCode = Cookies.get('Admin-Application-appCode')
delete data.explain
updateINFO(data).then(response => {
this.$modal.msgSuccess('修改成功')
this.open = false
this.getList()
})
} else {
addINFO(this.form).then(response => {
this.$modal.msgSuccess('新增成功')
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete (row) {
const configIds = row.id || this.ids
this.$modal.confirm('是否确认删除编号为"' + configIds + '"的数据项?').then(function() {
return delINFO(configIds)
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除安装包管理编号为"' + ids + '"的数据项?').then(function () {
return delINFO(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess('删除成功')
}).catch(() => {
})
},
/** 修改按钮操作 */
handleEdit(row) {
const query = {
activeTabs: this.activeTabs,
id: row.id
}
this.$router.push({
path: '/build/install/edit/',
query: query
})
// this.$tab.openPage('', '/build/install/add/', params)
getSize (e) {
this.form.sysApkSize = e[0].size + 'kb'
},
/** 查看详情弹窗 **/
handleDetail(row) {
// /** */
// handleExport() {
// this.download('deploy/INFO/export', {
// ...this.queryParams
// }, `INFO_${new Date().getTime()}.xlsx`)
// },
const params = {
id: row.id
}
this.$tab.openPage('安装包详情', '/build/install/detail/', params)
},
/** 切换TAB触发的事件 */
handleClickTabs() {
this.getList()
},
/** 下载按钮 */
/**下载安装包*/
handleDownload (row) {
const configIds = row.id || this.ids
this.$modal.confirm('是否确认下载编号为"' + configIds + '"的数据项?').then(function() {
return delConfig(configIds)
}).then(() => {
this.getList()
this.$modal.msgSuccess('下载成功')
}).catch(() => {
})
window.open(row.sysApk)
},
cancelDetail () {
this.openDetail = false
this.reset()
},
copyIt (url) {
navigator.clipboard.writeText(url)
this.$message.success('复制成功')
}
}
}

View File

@ -1,55 +1,48 @@
<template>
<el-dialog :modal-append-to-body="false" :title="title" v-bind="$attrs" width="700px"
@close="onClose"
@open="onOpen"
v-on="$listeners"
>
<el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="90px"
size="small"
>
<el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :modal-append-to-body="false" :title="title"
:visible.sync="open" v-bind="$attrs" width="700px" @close="onClose" @open="onOpen" v-on="$listeners">
<el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="90px" size="small">
<el-form-item label="安装包名称" prop="installpackName">
<el-input
v-model="queryParams.installpackName"
clearable
placeholder="请输入安装包名称"
style="width: 240px"
@keyup.enter.native="handleQuery"
/>
<el-input v-model="queryParams.sysApkName" clearable placeholder="请输入安装包名称" style="width: 240px"
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item>
<el-button icon="el-icon-search" size="mini" type="primary" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-table v-loading="loading" :data="dataList">
<el-table-column align="center" label="安装包名称" prop="configId"/>
<el-table-column :show-overflow-tooltip="true" align="center" label="版本号" prop="configName"/>
<el-table-column :show-overflow-tooltip="true" align="center" label="安装包大小" prop="configName"/>
<el-table-column :show-overflow-tooltip="true" align="center" label="适用系统" prop="configValue"/>
<el-table-column align="center" label="状态" prop="configType">
<template slot-scope="scopeA">
<dict-tag :options="dict.type.sys_yes_no" :value="scopeA.row.type"/>
</template>
</el-table-column>
<el-table v-loading="loading" :data="moduleList">
<el-table-column align="center" label="安装包名称" prop="sysApkName" />
<el-table-column :show-overflow-tooltip="true" align="center" label="版本号" prop="version" />
<el-table-column :show-overflow-tooltip="true" align="center" label="安装包大小" prop="sysApkSize" />
<el-table-column :show-overflow-tooltip="true" align="center" label="适用系统" prop="sysType" />
<!-- <el-table-column align="center" label="状态" prop="uploadingStatus">-->
<!-- <template slot-scope="scopeA">-->
<!-- <dict-tag :options="dict.type.sys_yes_no" :value="scopeA.row.type"/>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column align="center" class-name="small-padding fixed-width" label="操作" width="50">
<template slot-scope="scope">
<el-button circle icon="el-icon-plus" size="20" type="primary" @click="addPack"
></el-button>
<el-button circle icon="el-icon-plus" size="20" type="primary" @click="addPack(scope.row)"></el-button>
</template>
</el-table-column>
</el-table>
<!-- <div slot="footer" class="dialog-footer">-->
<!-- <el-button type="primary" @click="submitAddForm()"> </el-button>-->
<!-- </div>-->
</el-dialog>
</template>
<script>
import { listConfig } from '@/api/system/config'
import { listINFO } from '@/api/FDS/installList'
import Cookies from 'js-cookie'
export default {
name: 'AddPack',
dicts: ['sys_yes_no'],
props: {
systemType: {
type: String,
default: ''
}
},
data () {
return {
//
@ -57,18 +50,19 @@ export default {
loading: true,
configName: undefined,
form: {},
dataList: [],
moduleList: [],
//
showSearch: true,
total: 0,
open: true,
//
queryParams: {
pageNum: 1,
pageSize: 10,
installpackName: undefined
sysApkName: null,
appCode: Cookies.get('Admin-Application-appCode')
}
}
},
created () {
this.getList()
@ -78,12 +72,15 @@ export default {
/** 查询参数列表 */
getList () {
this.loading = true
listConfig(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
this.dataList = response.rows
listINFO(
{
...this.queryParams,
sysType: this.systemType
}).then(response => {
this.moduleList = response.rows
this.total = response.total
this.loading = false
}
)
})
},
/** 搜索按钮操作 */
@ -97,14 +94,16 @@ export default {
this.resetForm('queryForm')
this.handleQuery()
},
//
submitAddForm() {
},
/** 新增当前包的按钮 */
addPack() {
addPack (row) {
this.$emit('addPack', {
apkId: row.id,
version: row.version,
sysType: row.sysType,
sysApkName: row.sysApkName,
sysApk: row.sysApk
})
},
closeModal () {

View File

@ -3,43 +3,21 @@
<el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="90px" size="small">
<el-form-item label="选择APP" prop="configName">
<el-select v-model="queryParams.configType" clearable placeholder="请选择APP">
<el-option
v-for="dict in dict.type.sys_yes_no"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
<el-option v-for="dict in dict.type.sys_yes_no" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="版本号" prop="version">
<el-input
v-model="queryParams.version"
clearable
placeholder="请输入版本号"
style="width: 240px"
@keyup.enter.native="handleQuery"
/>
<el-input v-model="queryParams.version" clearable placeholder="请输入版本号" style="width: 240px"
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="公开时间">
<el-date-picker
v-model="dateRange"
end-placeholder="结束日期"
range-separator="-"
start-placeholder="开始日期"
style="width: 240px"
type="daterange"
value-format="yyyy-MM-dd"
></el-date-picker>
<el-date-picker v-model="dateRange" end-placeholder="结束日期" range-separator="-" start-placeholder="开始日期"
style="width: 240px" type="daterange" value-format="yyyy-MM-dd"></el-date-picker>
</el-form-item>
<el-form-item label="状态" prop="configType">
<el-select v-model="queryParams.configType" clearable placeholder="请选择状态">
<el-option
v-for="dict in dict.type.sys_yes_no"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
<el-option v-for="dict in dict.type.sys_yes_no" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item>
@ -50,37 +28,17 @@
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
v-hasPermi="['system:config:add']"
icon="el-icon-plus"
plain
size="mini"
type="primary"
@click="handleAdd"
>新增
<el-button v-hasPermi="['system:config:add']" icon="el-icon-plus" plain size="mini" type="primary"
@click="handleAdd">新增
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
:disabled="multiple"
icon="el-icon-plus"
plain
size="mini"
type="info"
@click="handlePublish"
>批量发布
<el-button :disabled="multiple" icon="el-icon-plus" plain size="mini" type="info" @click="handlePublish">批量发布
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
v-hasPermi="['system:config:add']"
:disabled="multiple"
icon="el-icon-plus"
plain
size="mini"
type="info"
@click="handleDelete"
>批量删除
<el-button v-hasPermi="['system:config:add']" :disabled="multiple" icon="el-icon-plus" plain size="mini"
type="info" @click="handleDelete">批量删除
</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
@ -92,12 +50,8 @@
<el-table-column :show-overflow-tooltip="true" align="center" label="文件类型" prop="configName" />
<el-table-column :show-overflow-tooltip="true" align="center" label="版本号" prop="version" />
<el-table-column :show-overflow-tooltip="true" align="center" label="子版本号" prop="configValue" />
<el-table-column
label="系统"
min-width="80"
prop="platform"
>
<template scope="scope">
<el-table-column label="系统" min-width="80" prop="platform">
<template slot-scope="scope">
<div>{{ scope.row.platform === '0' ? '安卓' : 'IOS' }}</div>
</template>
</el-table-column>
@ -132,18 +86,10 @@
</el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" label="更新说明" prop="remark" />
<el-table-column
align="center"
label="二维码"
min-width="80"
>
<el-table-column align="center" label="二维码" min-width="80">
<template slot-scope="scope">
<el-image
:preview-src-list="srcList"
:src="url"
style="width: 80px; height: 80px"
>
<el-image :preview-src-list="srcList" :src="url" style="width: 80px; height: 80px">
</el-image>
<!-- <el-popover-->
@ -162,39 +108,21 @@
</el-table-column>
<el-table-column align="center" class-name="small-padding fixed-width" label="操作" width="150">
<template slot-scope="scope">
<el-button
v-hasPermi="['system:config:edit']"
icon="el-icon-bottom"
size="mini"
type="text"
@click="handleDown(scope.row)"
>下架
<el-button v-hasPermi="['system:config:edit']" icon="el-icon-bottom" size="mini" type="text"
@click="handleDown(scope.row)">下架
</el-button>
<el-button
v-hasPermi="['system:config:edit']"
icon="el-icon-edit"
size="mini"
type="text"
@click="handleEdit(scope.row)"
>修改
<el-button v-hasPermi="['system:config:edit']" icon="el-icon-edit" size="mini" type="text"
@click="handleEdit(scope.row)">修改
</el-button>
<el-dropdown size="mini"
@command="(command) => handleCommand(command, scope.row)"
>
<el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)">
<el-button icon="el-icon-d-arrow-right" size="mini" type="text">更多</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item v-hasPermi="['system:user:resetPwd']" command="handleDetail"
icon="el-icon-view"
>详情
<el-dropdown-item v-hasPermi="['system:user:resetPwd']" command="handleDetail" icon="el-icon-view">详情
</el-dropdown-item>
<el-dropdown-item v-hasPermi="['system:user:edit']" command="handleDownload"
icon="el-icon-download"
>下载安装包
<el-dropdown-item v-hasPermi="['system:user:edit']" command="handleDownload" icon="el-icon-download">下载安装包
</el-dropdown-item>
<el-dropdown-item v-hasPermi="['system:user:edit']" command="handleDelete"
icon="el-icon-delete"
>删除
<el-dropdown-item v-hasPermi="['system:user:edit']" command="handleDelete" icon="el-icon-delete">删除
</el-dropdown-item>
</el-dropdown-menu>
@ -203,13 +131,8 @@
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:limit.sync="queryParams.pageSize"
:page.sync="queryParams.pageNum"
:total="total"
@pagination="getList"
/>
<pagination v-show="total > 0" :limit.sync="queryParams.pageSize" :page.sync="queryParams.pageNum" :total="total"
@pagination="getList" />
</div>
</template>

View File

@ -8,17 +8,17 @@
<el-main>
<div class="form-main">
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-form-item label="白名单名称" prop="whiteListName">
<el-form-item label="白名单名称" prop="whitelistName">
<el-input v-model="form.whiteListName" placeholder="请输入白名单名称"/>
</el-form-item>
<el-form-item label="白名单类型" prop="whiteListType">
<el-form-item label="白名单类型" prop="whitelistType">
<el-select v-model="form.whiteListType" clearable placeholder="请选择白名单类型">
<el-option label="白名单人员" value="0"/>
<el-option label="白名单设备" value="1"/>
</el-select>
</el-form-item>
<el-form-item label="白名单模式" prop="whitePattern">
<el-form-item label="白名单模式" prop="whitelistMode">
<el-select v-model="form.whitePattern" clearable placeholder="请选择白名单模式">
<el-option label="正则模式" value="0"/>
<el-option label="普通模式" value="1"/>
@ -27,7 +27,7 @@
<el-form-item label="备注">
<el-input v-model="form.remark" placeholder="请输入内容" type="textarea"/>
<el-input v-model="form.remarks" placeholder="请输入内容" type="textarea"/>
</el-form-item>
</el-form>
</div>
@ -41,7 +41,7 @@
</template>
<script>
import { addConfig } from '@/api/system/config'
import { addWhitelist } from '@/api/FDS/whiteList'
export default {
name: 'WhiteAdd',
@ -85,7 +85,7 @@ export default {
this.$refs['form'].validate(valid => {
if (valid) {
addConfig(this.form).then(response => {
addWhitelist(this.form).then(response => {
this.$modal.msgSuccess('新增成功')
})
this.$router.push({ path: '/build/whiteListManagement' })

View File

@ -43,7 +43,7 @@
</template>
<script>
import { updateConfig } from '@/api/system/config'
import { updateConfig } from '@/api/FDS/whiteList'
export default {
name: 'WhiteAdd',
@ -84,7 +84,7 @@ export default {
this.$refs['form'].validate(valid => {
if (valid) {
if (this.form.configId != undefined) {
updateConfig(this.form).then(response => {
updateWhitelist(this.form).then(response => {
this.$modal.msgSuccess('修改成功')
})
}

View File

@ -168,7 +168,7 @@
</template>
<script>
import { delConfig, getConfig, listConfig } from '@/api/system/config'
import { listWhitelist,delWhitelist} from '@/api/FDS/whiteList'
export default {
name: 'WhiteList',
dicts: ['sys_yes_no'],
@ -222,7 +222,7 @@ export default {
/** 查询参数列表 */
getList() {
this.loading = true
listConfig(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
listWhitelist(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
this.configList = response.rows
this.total = response.total
this.loading = false
@ -288,7 +288,7 @@ export default {
handleDelete(row) {
const configIds = row.configId || this.ids
this.$modal.confirm('是否确认删除编号为"' + configIds + '"的数据项?').then(function() {
return delConfig(configIds)
return delWhitelist(configIds)
}).then(() => {
this.getList()
this.$modal.msgSuccess('删除成功')

View File

@ -1,8 +1,13 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="环境名称" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入环境名称" clearable @keyup.enter.native="handleQuery" />
<el-input
v-model="queryParams.name"
placeholder="请输入环境名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
@ -12,41 +17,87 @@
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
v-hasPermi="['deployment:environment:add']">新增</el-button>
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['deployment:environment:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
v-hasPermi="['deployment:environment:edit']">修改</el-button>
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['deployment:environment:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
v-hasPermi="['deployment:environment:remove']">删除</el-button>
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['deployment:environment:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['deployment:environment:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="environmentList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="主键" align="center" prop="id" />
<el-table-column label="环境名称" align="center" prop="name" />
<el-table-column label="服务器地址" align="center" prop="serverAddress" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right">
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
v-hasPermi="['deployment:environment:edit']">修改</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
v-hasPermi="['deployment:environment:remove']">删除</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['deployment:environment:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['deployment:environment:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
@pagination="getList" />
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改环境维护对话框 -->
<el-dialog :title="title" :visible.sync="open" width="550px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="应用id" prop="appId">
<el-input v-model="form.appId" placeholder="请输入应用id" />
</el-form-item>
@ -61,8 +112,8 @@
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancel"> </el-button>
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
@ -221,14 +272,3 @@ export default {
}
};
</script>
<style lang="scss" scoped>
::v-deep .el-dialog .el-form {
.el-input,
.el-select,
.el-textarea {
width: 100%;
}
}
</style>

View File

@ -1,403 +0,0 @@
<template>
<div class="app-container">
<el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="" size="small">
<el-form-item label="安装包名称" prop="sysApkName">
<el-input v-model="queryParams.sysApkName" clearable placeholder="请输入安装包名称" @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="版本号" prop="version">
<el-input v-model="queryParams.version" clearable placeholder="请输入版本号" @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="安装包类型" prop="sysType">
<el-select v-model="queryParams.sysType" clearable placeholder="请选择安装包类型">
<el-option v-for="dict in dict.type.sys_apk_type" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="创建人" prop="created">
<el-input v-model="queryParams.created" clearable placeholder="请输入创建人" @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item>
<el-button icon="el-icon-search" size="mini" type="primary" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button v-hasPermi="['deployment:install:add']" icon="el-icon-plus" plain size="mini" type="primary"
@click="handleAdd">新增
</el-button>
</el-col>
<el-col :span="1.5">
<el-button v-hasPermi="['deploy:INFO:remove']" :disabled="multiple" icon="el-icon-delete" plain size="mini"
type="danger" @click="handleDelete">批量删除
</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="INFOList" @selection-change="handleSelectionChange">
<el-table-column align="center" type="selection" width="55" />
<el-table-column align="center" label="安装包名称" prop="sysApkName" />
<el-table-column align="center" label="版本号" prop="version" />
<el-table-column align="center" label="安装包" prop="sysApk">
<template slot="header" slot-scope="scope">
<span>安装包</span>
<el-popover placement="top-start" width="180" trigger="hover">
<span slot="reference"><i class="el-icon-info ml10"></i></span>
<p class="tip">复制当前的安装包地址</p>
</el-popover>
</template>
<template slot-scope="scope">
<el-button icon="el-icon-copy" type="text" @click="copyIt(scope.row.sysApk)">复制</el-button>
</template>
</el-table-column>
<el-table-column align="center" label="安装包大小" prop="sysApkSize" />
<el-table-column align="center" label="安装包类型" prop="sysType" :filters="dict.type.sys_apk_type.map(item => ({
...item,
text: item.label
}))" :filter-method="filterTagSysType">
<template slot-scope="scope">
<dict-tag :options="dict.type.sys_apk_type" :value="scope.row.sysType" />
</template>
</el-table-column>
<el-table-column align="center" label="创建人" prop="created" />
<el-table-column align="center" class-name="small-padding fixed-width" fixed="right" label="操作">
<template slot-scope="scope">
<el-popover placement="left" width="" trigger="hover">
<div>
<div style="margin-bottom: 10px;color:#000;font-size:14px">操作</div>
<div style="text-align: right; margin: 0">
<el-button @click="handleDownload(scope.row)" size="mini">下载</el-button>
<el-button v-hasPermi="['deployment:install:edit']" plain size="mini"
@click="handleUpdate(scope.row)">修改</el-button>
<el-button v-hasPermi="['deployment:install:detail']" plain size="mini"
@click="handleDetail(scope.row)">详情</el-button>
<el-button v-hasPermi="['deployment:install:remove']" plain type="danger" size="mini"
@click="handleDelete(scope.row)">删除</el-button>
</div>
</div>
<el-button slot="reference" size="mini" type="text">更多<i class="el-icon-caret-right"></i></el-button>
</el-popover>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :limit.sync="queryParams.pageSize" :page.sync="queryParams.pageNum" :total="total"
@pagination="getList" />
<!-- 添加或修改安装包管理对话框 -->
<el-dialog :title="title" :visible.sync="open" append-to-body width="550px">
<el-form ref="form" :model="form" :rules="rules" label-width="100px" labelPosition="left">
<el-form-item label="安装包名称" prop="sysApkName">
<el-input v-model="form.sysApkName" placeholder="请输入安装包名称" />
</el-form-item>
<el-form-item label="版本号" prop="version">
<el-input v-model="form.version" placeholder="请输入版本号" />
</el-form-item>
<el-form-item label="安装包" prop="sysApk">
<file-upload v-model="form.sysApk" :accept="'.zip,.apk,.hap, .iap'" :fileSize="50"
:fileType="['apk', 'hap', 'iap', 'zip']" :limit="1" uploadFileUrl="/system/oss/upload" @getSize="getSize" />
</el-form-item>
<el-form-item label="安装包大小" prop="sysApkSize">
<el-input v-model="form.sysApkSize" placeholder="请输入安装包大小" readonly />
</el-form-item>
<el-form-item label="安装包类型" prop="sysType">
<el-select v-model="form.sysType" placeholder="请选择安装包类型">
<el-option v-for="dict in dict.type.sys_apk_type" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancel"> </el-button>
<el-button type="primary" @click="submitForm"> </el-button>
</div>
</el-dialog>
<el-dialog :title="title" :visible.sync="openDetail" append-to-body width="550px">
<el-form ref="form" :model="form" label-width="100px" labelPosition="left">
<el-form-item label="安装包名称" prop="moduleName" filters>
{{ form.sysApkName }}
</el-form-item>
<el-form-item label="版本号" prop="version">
{{ form.version }}
</el-form-item>
<el-form-item label="安装包">
<el-input v-model="form.sysApk" class="input-with-select" readonly>
<el-button slot="append" @click="copyIt(form.sysApk)">复制</el-button>
</el-input>
</el-form-item>
<el-form-item label="安装包大小" prop="moduleSize">
{{ form.sysApkSize }}
</el-form-item>
<el-form-item label="系统类型" prop="sysType">
{{ form.sysType }}
</el-form-item>
<el-form-item label="上传时间:">{{ form.createTime }}</el-form-item>
<el-form-item label="上传人员:">{{ form.created }}</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancelDetail"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { addINFO, delINFO, getINFO, listINFO, updateINFO } from '@/api/FDS/installList'
export default {
name: 'INFO',
dicts: ['sys_apk_uploading_type', 'uploading_status', 'sys_apk_type'],
data () {
return {
form: {
uploadingType: 'OnLineUploading',
sysApkName: undefined,
version: undefined,
sysApk: null,
sysApkSize: undefined,
sysType: '',
},
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
INFOList: [],
//
title: '',
//
open: false,
openDetail: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
uploadingType: null,
sysApkName: null,
version: null,
sysType: null,
uploadingStatus: null,
created: null
},
elDropdown: '',
//
rules: {
uploadingType: [
{ required: true, message: '上传类型不能为空', trigger: 'change' }
],
sysApkName: [
{ required: true, message: '安装包名称不能为空', trigger: 'blur' }
],
version: [
{ required: true, message: '版本号不能为空', trigger: 'blur' }
],
sysType: [
{ required: true, message: '安装包类型不能为空', trigger: 'change' }
],
sysApk: [
{ required: true, message: '安装包不能为空', trigger: 'change' }
]
}
}
},
created () {
this.getList()
// const dropdownMenu = this.$refs['elDropdown'].$children[0] // dropdowndropdownMenu
// dropdownMenu.$data.currentPlacement = 'start'
// console.log(dropdownMenu.$data)
},
methods: {
/** 查询安装包管理(新)列表 */
getList () {
this.loading = true
listINFO(this.queryParams).then(response => {
this.INFOList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel () {
this.open = false
this.reset()
},
//
reset () {
this.form = {
uploadingType: 'OnLineUploading',
sysApkName: undefined,
version: undefined,
sysApk: null,
sysApkSize: undefined,
sysType: '',
}
this.resetForm('form')
},
/** 搜索按钮操作 */
handleQuery () {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery () {
this.resetForm('queryForm')
this.handleQuery()
},
//
handleSelectionChange (selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length !== 1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd () {
this.reset()
this.open = true
this.title = '添加安装包'
},
/** 修改按钮操作 */
handleUpdate (row) {
this.reset()
const id = row.id || this.ids
getINFO(id).then(response => {
this.form = response.data
this.open = true
this.title = '修改安装包'
})
},
/** 详情按钮操作 */
handleDetail (row) {
this.reset()
const id = row.id || this.ids
getINFO(id).then(response => {
this.form = response.data
this.openDetail = true
this.title = '安装包详情'
this.type = 'detail'
})
},
/** 提交按钮 */
submitForm () {
this.$refs['form'].validate(valid => {
if (valid) {
if (this.form.id != null) {
let data = Object.assign({}, this.form)
delete data.explain
updateINFO(data).then(response => {
this.$modal.msgSuccess('修改成功')
this.open = false
this.getList()
})
} else {
addINFO(this.form).then(response => {
this.$modal.msgSuccess('新增成功')
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete (row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除安装包管理编号为"' + ids + '"的数据项?').then(function () {
return delINFO(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess('删除成功')
}).catch(() => {
})
},
getSize (e) {
if (e && e.length > 0) {
this.form.sysApkSize = (e[0].size / 1024 / 1024).toFixed(2) + 'm'
} else {
this.form.sysApkSize = ''
}
},
/**下载安装包*/
handleDownload (row) {
window.open(row.sysApk)
},
cancelDetail () {
this.openDetail = false
this.reset()
},
copyIt (url) {
navigator.clipboard.writeText(url)
this.$message.success('复制成功')
},
//
filterTagSysType (value, row) {
return row.sysType === Number(value);
},
//
handleCommand (command, row) {
switch (command) {
case "handleDownload":
this.handleDownload(row);
break;
case "handleUpdate":
this.handleUpdate(row);
break;
case "handleDetail":
this.handleDetail(row);
break;
case "handleDelete":
this.handleDelete(row);
break;
default:
break;
}
},
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-dialog .el-form {
.el-input,
.el-select,
.el-textarea {
width: 100%
}
}
.dropDown {
position: relative;
}
.lang-select-dropdown {
position: absolute;
top: 30px;
left: 0px;
margin: 0px;
padding: 0px;
min-width: max-content;
text-align: center;
}
</style>

View File

@ -1,8 +1,8 @@
<template>
<div class="app-container">
<el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="" size="small">
<el-form-item label="模块包名称" prop="moduleName">
<el-input v-model="queryParams.moduleName" clearable placeholder="请输入模块包名称" @keyup.enter.native="handleQuery" />
<el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="120px" size="small">
<el-form-item label="模块包名称名称" prop="moduleName">
<el-input v-model="queryParams.moduleName" clearable placeholder="请输入模块包名称名称" @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="版本号" prop="version">
<el-input v-model="queryParams.version" clearable placeholder="请输入版本号" @keyup.enter.native="handleQuery" />
@ -20,7 +20,7 @@
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button v-hasPermi="['deployment:module:add']" icon="el-icon-plus" size="mini" type="primary"
<el-button v-hasPermi="['deployment:module:add']" icon="el-icon-plus" plain size="mini" type="primary"
@click="handleAdd">新增
</el-button>
</el-col>
@ -34,63 +34,47 @@
type="danger" @click="handleDelete">删除
</el-button>
</el-col>
<el-col :span="1.5">
<el-button v-hasPermi="['deployment:module:export']" icon="el-icon-download" plain size="mini" type="warning"
@click="handleExport">导出
</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="moduleList" @selection-change="handleSelectionChange">
<el-table-column align="center" type="selection" width="55" />
<!-- <el-table-column align="center" label="主键" prop="id"/>-->
<el-table-column align="center" label="模块包名称" prop="moduleName" />
<el-table-column align="center" label="版本号" prop="version" />
<el-table-column align="center" label="安装包" prop="moduleUrl">
<template slot="header" slot-scope="scope">
<span>安装包</span>
<el-popover placement="top-start" width="180" trigger="hover">
<span slot="reference"><i class="el-icon-info ml10"></i></span>
<p class="tip">复制当前的H5模块包地址</p>
</el-popover>
</template>
<template slot-scope="scope">
<el-button icon="el-icon-copy" type="text" @click="copyIt(scope.row.moduleUrl)">复制</el-button>
</template>
</el-table-column>
<el-table-column align="center" label="安装包" prop="moduleUrl" />
<el-table-column align="center" label="安装包大小" prop="moduleSize" />
<el-table-column align="center" label="系统类型" prop="sysType" :filters="dict.type.sys_apk_type.map(item => ({
...item,
text: item.label
}))" :filter-method="filterTagSysType">
<el-table-column align="center" label="系统类型" prop="sysType">
<template slot-scope="scope">
<dict-tag :options="dict.type.sys_apk_type" :value="scope.row.sysType" />
</template>
</el-table-column>
<el-table-column align="center" label="模块类型" prop="moduleType" :filters="dict.type.module_type.map(item => ({
...item,
text: item.label
}))" :filter-method="filterTagModuleType">
<el-table-column align="center" label="模块类型" prop="moduleType">
<template slot-scope="scope">
<dict-tag :options="dict.type.module_type" :value="scope.row.moduleType" />
</template>
</el-table-column>
<!-- <el-table-column align="center" label="上传状态" prop="uploadingStatus"/>-->
<el-table-column align="center" class-name="small-padding fixed-width" label="操作" fixed="right">
<el-table-column align="center" class-name="small-padding fixed-width" label="操作">
<template slot-scope="scope">
<el-popover placement="left" width="" trigger="hover">
<div>
<div style="margin-bottom: 10px;color:#000;font-size:14px">操作</div>
<div style="text-align: right; margin: 0">
<el-button @click="handleDownLoad(scope.row)" size="mini">下载</el-button>
<el-button v-hasPermi="['deployment:module:edit']" plain size="mini"
@click="handleUpdate(scope.row)">修改</el-button>
<el-button v-hasPermi="['deployment:module:detail']" plain size="mini"
@click="handleDetail(scope.row)">详情</el-button>
<el-button v-hasPermi="['deployment:module:remove']" plain type="danger" size="mini"
@click="handleDelete(scope.row)">删除</el-button>
</div>
</div>
<el-button slot="reference" size="mini" type="text">更多<i class="el-icon-caret-right"></i></el-button>
</el-popover>
<el-button icon="el-icon-download" size="mini" type="text" @click="handleDownLoad(scope.row)">下载安装包
</el-button>
<el-button v-hasPermi="['deployment:module:edit']" icon="el-icon-edit" size="mini" type="text"
@click="handleUpdate(scope.row)">修改
</el-button>
<el-button icon="el-icon-detail" size="mini" type="text" @click="handleDetail(scope.row)">详情
</el-button>
<el-button v-hasPermi="['deployment:module:remove']" icon="el-icon-delete" size="mini" type="text"
@click="handleDelete(scope.row)">删除
</el-button>
</template>
</el-table-column>
</el-table>
@ -99,20 +83,17 @@
@pagination="getList" />
<!-- 添加或修改H5模块包对话框 -->
<el-dialog :title="title" :visible.sync="open" append-to-body width="550px">
<el-form ref="form" :model="form" :rules="rules" label-width="100px" labelPosition="left">
<el-form-item label="模块包名称" prop="moduleName">
<el-input v-model="form.moduleName" placeholder="请输入模块包名称" />
<el-dialog :title="title" :visible.sync="open" append-to-body width="500px">
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-form-item label="模块包名称名称" prop="moduleName">
<el-input v-model="form.moduleName" placeholder="请输入模块包名称名称" />
</el-form-item>
<el-form-item label="版本号" prop="version">
<el-input v-model="form.version" placeholder="请输入版本号" />
</el-form-item>
<el-form-item label="安装包" prop="moduleUrl">
<file-upload v-model="form.moduleUrl" :accept="'.zip'" :fileSize="20" :fileType="['zip']" :limit="1"
<file-upload v-model="form.moduleUrl" :accept="['.zip']" :fileSize="20" :fileType="['zip']" :limit="1"
@getSize="getSize" />
</el-form-item>
<el-form-item label="安装包大小" prop="moduleSize">
@ -132,38 +113,74 @@
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancel"> </el-button>
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<!-- 添加或修改H5模块包对话框 -->
<el-dialog :title="title" :visible.sync="openDetail" append-to-body width="550px">
<el-form ref="form" :model="form" label-width="100px" labelPosition="left">
<el-form-item label="模块包名称" prop="moduleName">
<el-dialog :title="title" :visible.sync="openDetail" append-to-body width="500px">
<el-form ref="form" :model="form" label-width="120px">
<el-form-item label="模块包名称名称" prop="moduleName">
{{ form.moduleName }}
</el-form-item>
<el-form-item label="版本号" prop="version">
{{ form.version }}
</el-form-item>
<el-form-item label="安装包" prop="moduleUrl">
<el-input v-model="form.moduleUrl" class="input-with-select" readonly>
<el-button slot="append" @click="copyIt(form.moduleUrl)">复制</el-button>
</el-input>
{{ form.moduleUrl }}
<!-- <file-upload v-model="form.moduleUrl" :fileSize="20" :fileType="['apk','hap','iap']"-->
<!-- :limit="1"-->
<!-- uploadFileUrl="/system/oss/upload"-->
<!-- @getSize="getSize"-->
<!-- />-->
</el-form-item>
<el-form-item label="安装包大小" prop="moduleSize">
{{ form.moduleSize }}
<!-- <el-input v-model="form.moduleSize" placeholder="请输入安装包大小"/>-->
</el-form-item>
<el-form-item label="系统类型" prop="sysType">
{{ form.sysType }}
<!-- <el-select v-model="form.sysType" placeholder="请选择系统类型">-->
<!-- <el-option-->
<!-- v-for="dict in dict.type.sys_apk_type"-->
<!-- :key="dict.value"-->
<!-- :label="dict.label"-->
<!-- :value="dict.value"-->
<!-- ></el-option>-->
<!-- </el-select>-->
</el-form-item>
<el-form-item label="模块类型" prop="moduleType">
<dict-tag :options="dict.type.module_type" :value="form.moduleType" />
<!-- {{ form.moduleType }}-->
<!-- <el-select v-model="form.moduleType" placeholder="请选择模块类型">-->
<!-- <el-option-->
<!-- v-for="dict in dict.type.module_type"-->
<!-- :key="dict.value"-->
<!-- :label="dict.label"-->
<!-- :value="dict.value"-->
<!-- ></el-option>-->
<!-- </el-select>-->
</el-form-item>
<el-form-item label="下载地址:">
<el-input v-model="form.moduleUrl" class="input-with-select" readonly>
<el-button slot="append" @click="copyIt(form.moduleUrl)">复制</el-button>
</el-input>
</el-form-item>
<el-form-item label="上传时间:">{{ form.createTime }}</el-form-item>
<!-- <el-form-item label="上传状态:">-->
<!-- <dict-tag :options="dict.type.uploading_status" :value="form.uploadingStatus"/>-->
<!-- </el-form-item>-->
<el-form-item label="上传人员:">{{ form.created }}</el-form-item>
<!-- <el-form-item label="上传日志:"></el-form-item>-->
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancelDetail"> </el-button>
@ -175,6 +192,8 @@
<script>
import { addModule, delModule, getModule, listModule, updateModule } from '@/api/deployment/module'
import Cookies from 'js-cookie'
export default {
name: 'Module',
dicts: ['module_type', 'sys_apk_type', 'uploading_status'],
@ -213,7 +232,7 @@ export default {
//
rules: {
moduleName: [
{ required: true, message: '模块包名称不能为空', trigger: 'blur' }
{ required: true, message: '模块包名称名称不能为空', trigger: 'blur' }
],
version: [
{ required: true, message: '版本号不能为空', trigger: 'blur' }
@ -224,39 +243,14 @@ export default {
moduleType: [
{ required: true, message: '模块类型不能为空', trigger: 'change' }
],
moduleUrl: [
{ required: true, message: '模块包不能为空', trigger: 'change' }
uploadingStatus: [
{ required: true, message: '上传状态不能为空', trigger: 'change' }
]
// uploadingStatus: [
// { required: true, message: '', trigger: 'change' }
// ]
}
}
},
created () {
this.getList()
console.log(this.dict.type.module_type)
let arr = [{
label: "通用",
value: "universal",
}]
arr = arr.map(item => ({
...item,
text: item.label
}))
console.log(arr);
// console.log(this.dict.type.module_type.map(d => d.value))
// arr = this.dict.type.module_type.map(item => {
// item.text = item.label
// })
// console.log(arr);
},
methods: {
/** 查询H5模块包列表 */
@ -300,6 +294,7 @@ export default {
modified: null,
createTime: null,
updateTime: null,
appCode: Cookies.get('Admin-Application-appCode')
}
this.resetForm('form')
},
@ -354,6 +349,7 @@ export default {
if (valid) {
if (this.form.id != null) {
let data = Object.assign({}, this.form)
data.appCode = Cookies.get('Admin-Application-appCode')
delete data.explain
updateModule(data).then(response => {
this.$modal.msgSuccess('修改成功')
@ -388,62 +384,19 @@ export default {
}, `module_${new Date().getTime()}.xlsx`)
},
getSize (e) {
if (e && e.length > 0) {
this.form.moduleSize = (e[0].size / 1024 / 1024).toFixed(2) + 'm'
} else {
this.form.moduleSize = ''
}
console.log(e)
console.log(this.form)
this.form.moduleSize = e[0].size + 'kb'
},
filterTagModuleType (value, row) {
return row.moduleType === Number(value);
},
filterTagSysType (value, row) {
return row.sysType === Number(value);
},
handleDownLoad (row) {
window.open(row.moduleUrl)
},
copyIt (url) {
navigator.clipboard.writeText(url)
this.$message.success('复制成功')
},
handleCommand (command, row) {
switch (command) {
case "handleDownload":
this.handleDownload(row);
break;
case "handleUpdate":
this.handleUpdate(row);
break;
case "handleDetail":
this.handleDetail(row);
break;
case "handleDelete":
this.handleDelete(row);
break;
default:
break;
}
},
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-dialog .el-form {
.el-input,
.el-select,
.el-textarea {
width: 100%
}
}
</style>

View File

@ -1,381 +0,0 @@
<template>
<div class="app-container">
<el-container>
<!-- <el-header>
<div>新增发布</div>
<el-divider />
</el-header> -->
<el-main>
<div class="form-main">
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-row>
<el-col :span="12">
<el-form-item label="APP名称" prop="versionDesc">
<el-input v-model="form.appName" disabled />
</el-form-item>
</el-col>
<el-col :span="12"> <el-form-item label="选择系统" prop="systemType">
<el-select v-model="form.systemType" placeholder="请选择系统类型" @change="changeSys">
<el-option v-for="dict in dict.type.sys_apk_type" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12"> <el-form-item v-if="form.systemType != 'IOS'" label="安装包" prop="sysApkName">
<el-input v-model="form.sysApkName" class="input-with-select" placeholder="请选择包" readonly>
<el-button slot="append" icon="el-icon-search" @click="handlePackOpen"></el-button>
</el-input>
</el-form-item>
<el-form-item v-if="form.systemType == 'ios'" label="app store地址" prop="appStoreAddress">
<el-input v-model="form.appStoreAddress" placeholder="请输入app store地址" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="版本号" prop="version">
<el-input v-model="form.version" placeholder="请输入版本号" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="版本说明" prop="versionDesc">
<el-input v-model="form.versionDesc" placeholder="请输入版本说明" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="有效期" prop="validityStartTime">
<el-date-picker v-model="daterangeDate" style="width: 400px" value-format="yyyy-MM-dd" type="daterange"
range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="发布环境" prop="publishEnvironment">
<el-select v-model="form.publishEnvironment">
<el-option v-for="dict in environmentList" :key="dict.value" :label="dict.name"
:value="parseInt(dict.id)" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发布策略" prop="publishStrategy">
<el-select v-model="form.publishStrategy">
<el-option v-for="dict in dict.type.release_strategy" :key="dict.value" :label="dict.label"
:value="parseInt(dict.value)" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="结果通知" prop="resultNotify">
<el-switch v-model="form.resultNotify" :active-value="1" :inactive-value="0" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="公开版" prop="publicVersion">
<el-switch v-model="form.publicVersion" :active-value="1" :inactive-value="0" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="强制更新" prop="forceUpdate">
<el-switch v-model="form.forceUpdate" :active-value="1" :inactive-value="0" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="下载验证" prop="downloadVerification">
<el-switch v-model="form.downloadVerification" :active-value="1" :inactive-value="0" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="更新对象" prop="updateObject">
<el-select v-model="form.updateObject">
<el-option v-for="dict in dict.type.release_user_type" :key="dict.value" :label="dict.label"
:value="parseInt(dict.value)" />
</el-select>
<!-- <el-button v-if="form.updateObject === 0" circle icon="el-icon-plus" size="16" type="primary"
@click="whiteOpen = true"></el-button> -->
</el-form-item>
<!-- <div v-if="form.updateObject === 0" class="area-box">
<el-tag v-for="tag in WhiteArr" type="info" :key="tag.sysApkName" @close="handleDeleteTag(tag.apkId)"
closable>
{{ tag.sysApkName }}
</el-tag>
</div> -->
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</el-main>
<!--安装包弹窗-->
</el-container>
<div slot="footer" class="footer">
<el-button @click="cancel"> </el-button>
<el-button v-if="form.status != 2" type="primary" @click="pubLishForm">
</el-button>
<el-button type="primary" @click="submitForm"> </el-button>
</div>
<AddPack :systemType="form.systemType" v-if="packOpen" @close="closeAddPack" @addPack="handleAddPack"></AddPack>
<AddWhite :systemType="form.systemType" v-if="whiteOpen" @close="closeAddWhite" @addWhiteList="handleAddWhite">
</AddWhite>
</div>
</template>
<script>
import AddPack from './component/addPack.vue'
import AddWhite from './component/addWhite.vue'
import {
addPublish,
} from '@/api/deployment/publish'
import { listEnvironment } from '@/api/deployment/environment'
import { getApplicationName } from '@/utils/application'
export default {
name: 'PublishAdd',
dicts: ['release_strategy', 'release_user_type', 'sys_apk_type'],
components: {
AddPack, AddWhite
},
data () {
return {
//
form: {
appName: getApplicationName(),
},
packOpen: false,
whiteOpen: false,
environmentList: [],
//
loading: true,
dataList: [],
queryParamsEnvironment: {
pageNum: 1,
pageSize: 999
},
daterangeDate: '',
WhiteArr: [],
//
rules: {
appName: [
{ required: true, message: '应用名称不能为空', trigger: 'blur' }
],
systemType: [
{ required: true, message: '系统类型不能为空', trigger: 'change' }
],
apkId: [
{ required: true, message: '安装包编号不能为空', trigger: 'blur' }
],
version: [
{ required: true, message: '版本号不能为空', trigger: 'blur' }
],
publishEnvironment: [
{ required: true, message: '发布环境不能为空', trigger: 'change' }
],
publishStrategy: [
{ required: true, message: '发布策略不能为空', trigger: 'change' }
],
publicVersion: [
{ required: true, message: '公开版不能为空', trigger: 'change' }
],
forceUpdate: [
{ required: true, message: '强制更新不能为空', trigger: 'change' }
],
sysApkName: [
{ required: true, message: '安装包不能为空', trigger: 'blur' }
]
}
}
},
computed: {},
mounted () {
this.getEnvironmentList()
this.reset();
},
methods: {
reset () {
this.form = {
appName: getApplicationName(),
}
},
/** 弹出包选择框*/
handlePackOpen () {
this.packOpen = true
},
/** 查询环境维护列表 */
getEnvironmentList () {
listEnvironment(this.queryParamsEnvironment).then(response => {
this.environmentList = response.rows
})
},
handleAddPack (e) {
this.form.apkId = e.apkId
this.form.version = e.version
this.form.systemType = e.sysType
this.form.sysApkName = e.sysApkName
this.form.apkUrl = e.sysApk
this.packOpen = false
},
handleAddWhite (e) {
if (e) {
this.WhiteArr.push(e)
}
},
/** 提交按钮 */
submitForm () {
this.$refs['form'].validate(valid => {
if (valid) {
let data = Object.assign({}, this.form)
delete data.explain
this.form.validityStartTime = this.daterangeDate[0]
this.form.validityEndTime = this.daterangeDate[1]
addPublish(this.form).then(response => {
this.$modal.msgSuccess('新增成功')
this.loading = false
this.open = false
this.close()
this.$router.push({ path: '/build/publish' })
})
}
})
},
//
changeSys () {
// this.form.systemType = sysType
this.form.apkId = null
this.form.version = null
this.form.sysApkName = null
this.form.appStoreAddress = null
this.form.apkUrl = null
},
//
pubLishForm () {
this.$refs['form'].validate(valid => {
if (valid) {
let data = Object.assign({}, this.form)
delete data.explain
addPublish(this.form).then(response => {
this.$modal.msgSuccess('新增成功')
this.loading = false
this.open = false
this.close()
this.$router.push({ path: '/build/publish' })
})
}
})
},
closeAddPack () {
this.packOpen = false
},
closeAddWhite () {
this.whiteOpen = false
},
cancel () {
this.close()
this.$router.push({ path: '/build/publish' })
},
handleDeleteTag (e) {
for (var i in this.WhiteArr) {
if (this.WhiteArr[i].apkId == e) {
this.WhiteArr.splice(i, 1);
break; // 退
}
}
},
close () {
this.$tab.closePage();
},
}
}
</script>
<style lang="scss" scoped>
.app-container {
background: #ffffff;
// margin: 24px;
position: relative;
height: 100%;
}
.form-main {
margin: 0 auto;
}
::v-deep .el-input.is-disabled .el-input__inner,
.el-textarea.is-disabled .el-textarea__inner {
border: 1px solid #E4E7ED !important;
}
.tag-group {
.el-tag {
cursor: pointer;
}
}
.el-tag+.el-tag {
margin-left: 10px
}
::v-deep .el-input {
max-width: 400px;
}
.footer {
display: flex;
align-items: center;
justify-content: flex-end;
position: absolute;
bottom: 24px;
right: 80px
}
.area-box {
max-width: 400px;
min-height: 100px;
padding: 10px;
box-sizing: border-box;
border: 1px solid #DCDFE6;
border-radius: 4px;
overflow-y: auto;
}
::v-deep .el-input,
.el-select {
max-width: 400px;
width: 400px;
}
</style>

View File

@ -1,119 +0,0 @@
<template>
<el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :modal-append-to-body="false" :title="title"
:visible.sync="open" v-bind="$attrs" width="700px" @close="onClose" @open="onOpen" attrs v-on="$listeners">
<el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="90px" size="small">
<el-form-item label="安装包名称" prop="installpackName">
<el-input v-model="queryParams.sysApkName" clearable placeholder="请输入安装包名称" style="width: 240px"
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item>
<el-button icon="el-icon-search" size="mini" type="primary" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-table v-loading="loading" :data="moduleList">
<el-table-column align="center" label="安装包名称" prop="sysApkName" />
<el-table-column :show-overflow-tooltip="true" align="center" label="版本号" prop="version" />
<el-table-column :show-overflow-tooltip="true" align="center" label="安装包大小" prop="sysApkSize" />
<el-table-column :show-overflow-tooltip="true" align="center" label="适用系统" prop="sysType" />
<el-table-column align="center" class-name="small-padding fixed-width" label="操作" width="50">
<template slot-scope="scope">
<el-button circle icon="el-icon-plus" size="20" type="primary" @click="addPack(scope.row)"></el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :limit.sync="queryParams.pageSize" :page.sync="queryParams.pageNum" :total="total"
@pagination="getList" />
<div slot="footer" class="dialog-footer">
<el-button @click="cancel"> </el-button>
<el-button type="primary" @click="submitForm"> </el-button>
</div>
</el-dialog>
</template>
<script>
import { listINFO } from '@/api/FDS/installList'
export default {
name: 'AddPack',
dicts: ['sys_yes_no'],
props: {
systemType: {
type: String,
default: ''
}
},
data () {
return {
//
title: '筛选安装包',
loading: true,
configName: undefined,
form: {},
moduleList: [],
//
showSearch: true,
total: 0,
open: true,
//
queryParams: {
pageNum: 1,
pageSize: 10,
sysApkName: null,
}
}
},
created () {
this.getList()
},
methods: {
/** 查询参数列表 */
getList () {
this.loading = true
listINFO(
{
...this.queryParams,
sysType: this.systemType
}).then(response => {
this.moduleList = response.rows
this.total = response.total
this.loading = false
})
},
/** 搜索按钮操作 */
handleQuery () {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery () {
this.dateRange = []
this.resetForm('queryForm')
this.handleQuery()
},
/** 新增当前包的按钮 */
addPack (row) {
this.$emit('addPack', {
apkId: row.id,
version: row.version,
sysType: row.sysType,
sysApkName: row.sysApkName,
sysApk: row.sysApk
})
},
closeModal () {
this.$emit('close')
},
onOpen () {
this.active = this.current
this.key = ''
},
cancel () {
}
}
}
</script>

View File

@ -1,119 +0,0 @@
<template>
<el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :modal-append-to-body="false" :title="title"
:visible.sync="open" v-bind="$attrs" width="700px" @close="onClose" @open="onOpen" attrs v-on="$listeners">
<el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="90px" size="small">
<el-form-item label="安装包名称" prop="installpackName">
<el-input v-model="queryParams.sysApkName" clearable placeholder="请输入安装包名称" style="width: 240px"
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item>
<el-button icon="el-icon-search" size="mini" type="primary" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-table v-loading="loading" :data="moduleList">
<el-table-column align="center" label="安装包名称" prop="sysApkName" />
<el-table-column :show-overflow-tooltip="true" align="center" label="版本号" prop="version" />
<el-table-column :show-overflow-tooltip="true" align="center" label="安装包大小" prop="sysApkSize" />
<el-table-column :show-overflow-tooltip="true" align="center" label="适用系统" prop="sysType" />
<!-- <el-table-column align="center" label="状态" prop="uploadingStatus">-->
<!-- <template slot-scope="scopeA">-->
<!-- <dict-tag :options="dict.type.sys_yes_no" :value="scopeA.row.type"/>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column align="center" class-name="small-padding fixed-width" label="操作" width="50">
<template slot-scope="scope">
<el-button circle icon="el-icon-plus" size="20" type="primary" @click="addPack(scope.row)"></el-button>
</template>
</el-table-column>
</el-table>
</el-dialog>
</template>
<script>
import { listINFO } from '@/api/FDS/installList'
import Cookies from 'js-cookie'
export default {
name: 'AddPack',
dicts: ['sys_yes_no'],
props: {
systemType: {
type: String,
default: ''
}
},
data () {
return {
//
title: '筛选白名单',
loading: true,
configName: undefined,
form: {},
moduleList: [],
//
showSearch: true,
total: 0,
open: true,
//
queryParams: {
pageNum: 1,
pageSize: 10,
sysApkName: null,
}
}
},
created () {
this.getList()
},
methods: {
/** 查询参数列表 */
getList () {
this.loading = true
listINFO(
{
...this.queryParams,
sysType: this.systemType
}).then(response => {
this.moduleList = response.rows
this.total = response.total
this.loading = false
})
},
/** 搜索按钮操作 */
handleQuery () {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery () {
this.dateRange = []
this.resetForm('queryForm')
this.handleQuery()
},
/** 新增当前包的按钮 */
addPack (row) {
this.$emit('addWhiteList', {
apkId: row.id,
version: row.version,
sysType: row.sysType,
sysApkName: row.sysApkName,
sysApk: row.sysApk
})
},
closeModal () {
this.$emit('close')
},
onOpen () {
this.active = this.current
this.key = ''
},
onClose () {
}
}
}
</script>

View File

@ -1,289 +0,0 @@
<template>
<div class="app-container">
<el-container>
<el-main>
<div class="form-main">
<el-form ref="form" :model="form" label-width="120px">
<el-row>
<el-col :span="12">
<el-form-item label="APP名称" prop="versionDesc">
{{ form.appName }}
</el-form-item>
</el-col>
<el-col :span="12"> <el-form-item label="选择系统" prop="systemType">
{{ form.systemType }}
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item v-if="form.systemType != 'ios'" label="安装包" prop="sysApkName">
{{ form.sysApkName }}
</el-form-item>
<el-form-item v-if="form.systemType == 'ios'" label="app store地址" prop="appStoreAddress">
{{ form.appStoreAddress }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="版本号" prop="version">
{{ form.version }}
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="版本说明" prop="versionDesc">
{{ form.versionDesc }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="有效期" prop="validityStartTime">
{{ form.validityStartTime }}{{ form.validityEndTime }}
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="发布环境" prop="publishEnvironment">
<el-select v-model="form.publishEnvironment" disabled>
<el-option v-for="dict in environmentList" :key="dict.value" :label="dict.name"
:value="parseInt(dict.id)" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发布策略" prop="publishStrategy">
<el-select v-model="form.publishStrategy" disabled>
<el-option v-for="dict in dict.type.release_strategy" :key="dict.value" :label="dict.label"
:value="parseInt(dict.value)" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="结果通知" prop="resultNotify">
<el-switch v-model="form.resultNotify" disabled :active-value="1" :inactive-value="0" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="公开版" prop="publicVersion">
<el-switch v-model="form.publicVersion" disabled :active-value="1" :inactive-value="0" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="强制更新" prop="forceUpdate">
<el-switch v-model="form.forceUpdate" disabled :active-value="1" :inactive-value="0" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="下载验证" prop="downloadVerification">
<el-switch v-model="form.downloadVerification" disabled :active-value="1" :inactive-value="0" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="更新对象" prop="updateObject">
<el-select v-model="form.updateObject" disabled>
<el-option v-for="dict in dict.type.release_user_type" :key="dict.value" :label="dict.label"
:value="parseInt(dict.value)" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
{{ form.remark }}
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="下载地址" prop="apkUrl">
<el-input v-model="form.apkUrl" class="input-with-select" readonly>
<el-button slot="append" @click="copyIt(form.apkUrl)">复制</el-button>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发布状态" prop="status">
<span v-for="item in dict.type.release_status">
<el-tag v-if="item.value == form.status" :type="item.listClass">{{ item.label }}</el-tag>
</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="创建人" prop="created">
{{ form.created }}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发布时间" prop="validityStartTime">
{{ form.validityStartTime }}
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</el-main>
</el-container>
<div slot="footer" class="footer">
<el-button @click="cancel"> </el-button>
</div>
</div>
</template>
<script>
import { listEnvironment } from '@/api/deployment/environment'
import { getApplicationName } from '@/utils/application'
import { getINFO } from '@/api/FDS/installList'
import {
getPublish,
} from '@/api/deployment/publish'
export default {
name: 'publishDetail',
dicts: ['release_environment', 'sys_yes_no', 'release_strategy', 'release_user_type', 'release_status'],
data () {
return {
form: {
},
total: 0,
packOpen: false,
environmentList: [],
//
loading: true,
dataList: [],
//
queryParams: {
pageNum: 1,
pageSize: 10,
sysApkName: null,
},
queryParamsEnvironment: {
pageNum: 1,
pageSize: 999
},
}
},
mounted () {
if (this.$route.query.id) {
this.getPublishById(this.$route.query.id)
}
this.getEnvironmentList()
},
methods: {
getPublishById (id) {
this.loading = true
getPublish(id).then(response => {
this.form = response.data;
this.form.sysApkName = this.getINFOById();
this.form.appName = getApplicationName();
this.loading = false
})
},
/** 查询环境维护列表 */
getEnvironmentList () {
listEnvironment(this.queryParamsEnvironment).then(response => {
this.environmentList = response.rows
})
},
/** 根据apkId查询安装包 */
getINFOById () {
getINFO(this.form.apkId).then(res => {
console.log(res.data.sysApkName)
return res.data.sysApkName
})
},
/** 查询环境维护列表 */
getEnvironmentList () {
this.loading = true
listEnvironment(this.queryParamsEnvironment).then(response => {
this.environmentList = response.rows
})
},
cancel () {
this.close()
this.$router.push({ path: '/build/publish' })
},
copyIt (url) {
navigator.clipboard.writeText(url)
this.$message.success('复制成功')
},
close () {
this.$tab.closePage();
},
},
}
</script>
<style lang="scss" scoped>
.app-container {
background: #ffffff;
// margin: 24px;
position: relative;
height: 100%;
}
.form-main {
margin: 0 auto;
}
::v-deep .el-input.is-disabled .el-input__inner,
.el-textarea.is-disabled .el-textarea__inner {
border: 1px solid #E4E7ED !important;
}
.tag-group {
.el-tag {
cursor: pointer;
}
}
.el-tag+.el-tag {
margin-left: 10px
}
.footer {
display: flex;
align-items: center;
justify-content: flex-end;
position: absolute;
bottom: 24px;
right: 80px
}
.area-box {
max-width: 400px;
min-height: 100px;
padding: 10px;
box-sizing: border-box;
border: 1px solid #DCDFE6;
border-radius: 4px;
overflow-y: auto;
}
::v-deep .el-input {
max-width: 400px;
}
::v-deep .el-input,
.el-select {
max-width: 400px;
width: 400px;
}
</style>

View File

@ -1,407 +0,0 @@
<template>
<div class="app-container">
<el-container>
<!-- <el-header>
<div>编辑发布</div>
<el-divider />
</el-header> -->
<el-main v-loading="loading">
<div class="form-main">
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-row>
<el-col :span="12">
<el-form-item label="APP名称" prop="versionDesc">
<el-input v-model="form.appName" disabled />
</el-form-item>
</el-col>
<el-col :span="12"> <el-form-item label="选择系统" prop="systemType">
<el-select v-model="form.systemType" placeholder="请选择系统类型" @change="changeSys">
<el-option v-for="dict in dict.type.sys_apk_type" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12"> <el-form-item v-if="form.systemType != 'IOS'" label="安装包" prop="sysApkName">
<el-input v-model="form.sysApkName" class="input-with-select" placeholder="请选择包" readonly>
<el-button slot="append" icon="el-icon-search" @click="handlePackOpen"></el-button>
</el-input>
</el-form-item>
<el-form-item v-if="form.systemType == 'ios'" label="app store地址" prop="appStoreAddress">
<el-input v-model="form.appStoreAddress" placeholder="请输入app store地址" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="版本号" prop="version">
<el-input v-model="form.version" placeholder="请输入版本号" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="版本说明" prop="versionDesc">
<el-input v-model="form.versionDesc" placeholder="请输入版本说明" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="有效期" prop="validityStartTime">
<el-date-picker v-model="daterangeDate" style="width: 400px" value-format="yyyy-MM-dd" type="daterange"
range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="发布环境" prop="publishEnvironment">
<el-select v-model="form.publishEnvironment">
<el-option v-for="dict in environmentList" :key="dict.value" :label="dict.name"
:value="parseInt(dict.id)" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发布策略" prop="publishStrategy">
<el-select v-model="form.publishStrategy">
<el-option v-for="dict in dict.type.release_strategy" :key="dict.value" :label="dict.label"
:value="parseInt(dict.value)" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="结果通知" prop="resultNotify">
<el-switch v-model="form.resultNotify" :active-value="1" :inactive-value="0" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="公开版" prop="publicVersion">
<el-switch v-model="form.publicVersion" :active-value="1" :inactive-value="0" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="强制更新" prop="forceUpdate">
<el-switch v-model="form.forceUpdate" :active-value="1" :inactive-value="0" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="下载验证" prop="downloadVerification">
<el-switch v-model="form.downloadVerification" :active-value="1" :inactive-value="0" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="更新对象" prop="updateObject">
<el-select v-model="form.updateObject">
<el-option v-for="dict in dict.type.release_user_type" :key="dict.value" :label="dict.label"
:value="parseInt(dict.value)" />
</el-select>
<!-- <el-button v-if="form.updateObject === 0" circle icon="el-icon-plus" size="16" type="primary"
@click="whiteOpen = true"></el-button> -->
</el-form-item>
<!-- <div v-if="form.updateObject === 0" class="area-box">
<el-tag v-for="tag in WhiteArr" type="info" :key="tag.sysApkName" @close="handleDeleteTag(tag.apkId)"
closable>
{{ tag.sysApkName }}
</el-tag>
</div> -->
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</el-main>
<!--安装包弹窗-->
</el-container>
<div class="footer">
<el-button @click="cancel"> </el-button>
<el-button v-if="form.status != 2" type="primary" @click="pubLishForm">
</el-button>
<el-button type="primary" @click="submitForm"> </el-button>
</div>
<AddPack :systemType="form.systemType" v-if="packOpen" @close="closeAddPack" @addPack="handleAddPack"></AddPack>
<AddWhite :systemType="form.systemType" v-if="whiteOpen" @close="closeAddWhite" @addWhiteList="handleAddWhite">
</AddWhite>
</div>
</template>
<script>
import AddPack from './component/addPack.vue'
import AddWhite from './component/addWhite.vue'
import {
addPublish,
getPublish,
updatePublish,
publish
} from '@/api/deployment/publish'
import { listEnvironment } from '@/api/deployment/environment'
import { getApplicationName } from '@/utils/application'
import { getINFO } from '@/api/FDS/installList'
export default {
name: 'PublishEdit',
dicts: ['release_strategy', 'release_user_type', 'sys_apk_type'],
components: {
AddPack, AddWhite
},
data () {
return {
//
form: {
sysApkName: ''
},
total: 0,
packOpen: false,
whiteOpen: false,
environmentList: [],
//
loading: true,
dataList: [],
queryParamsEnvironment: {
pageNum: 1,
pageSize: 999
},
daterangeDate: '',
WhiteArr: [],
queryParams: {
pageNum: 1,
pageSize: 10,
sysApkName: null,
},
//
rules: {
appName: [
{ required: true, message: '应用名称不能为空', trigger: 'blur' }
],
systemType: [
{ required: true, message: '系统类型不能为空', trigger: 'change' }
],
apkId: [
{ required: true, message: '安装包编号不能为空', trigger: 'blur' }
],
version: [
{ required: true, message: '版本号不能为空', trigger: 'blur' }
],
publishEnvironment: [
{ required: true, message: '发布环境不能为空', trigger: 'change' }
],
publishStrategy: [
{ required: true, message: '发布策略不能为空', trigger: 'change' }
],
publicVersion: [
{ required: true, message: '公开版不能为空', trigger: 'change' }
],
forceUpdate: [
{ required: true, message: '强制更新不能为空', trigger: 'change' }
],
sysApkName: [
{ required: true, message: '安装包不能为空', trigger: 'blur' }
]
}
}
},
computed: {},
mounted () {
if (this.$route.query.id) {
this.getPublishById(this.$route.query.id)
}
this.getEnvironmentList()
},
methods: {
getPublishById (id) {
this.loading = true
getPublish(id).then(response => {
this.form = response.data
this.form.appName = getApplicationName();
this.daterangeDate = [this.form.validityStartTime, this.form.validityEndTime]
this.$nextTick(() => {
this.getINFOById();
this.loading = false
})
})
},
getINFOById () {
getINFO(this.form.apkId).then(res => {
this.form.sysApkName = res.data.sysApkName
})
},
/** 弹出包选择框*/
handlePackOpen () {
this.packOpen = true
},
/** 查询环境维护列表 */
getEnvironmentList () {
listEnvironment(this.queryParamsEnvironment).then(response => {
this.environmentList = response.rows
})
},
handleAddPack (e) {
this.form.apkId = e.apkId
this.form.version = e.version
this.form.systemType = e.sysType
this.form.sysApkName = e.sysApkName
this.form.apkUrl = e.sysApk
this.packOpen = false
},
/** 提交按钮 */
submitForm () {
this.$refs['form'].validate(valid => {
if (valid) {
let data = Object.assign({}, this.form)
delete data.explain
this.form.validityStartTime = this.daterangeDate[0]
this.form.validityEndTime = this.daterangeDate[1]
updatePublish(data).then(response => {
this.$modal.msgSuccess('修改成功')
this.loading = false
this.open = false
this.$router.push({ path: '/build/publish' })
})
}
})
},
//
changeSys () {
// this.form.systemType = sysType
this.form.apkId = null
this.form.version = null
this.form.sysApkName = null
this.form.appStoreAddress = null
this.form.apkUrl = null
},
//
pubLishForm () {
this.$refs['form'].validate(valid => {
if (valid) {
if (this.form.id != null) {
let data = Object.assign({}, this.form)
delete data.explain
updatePublish(data).then(response => {
this.handlePublish(data.id)
this.loading = false
})
} else {
addPublish(this.form).then((res) => {
this.loading = false
})
}
this.close()
this.$router.push({ path: '/build/publish' })
}
})
},
handlePublish (id) {
publish(id).then(response => {
this.close()
this.$modal.msgSuccess('发布成功')
})
},
handleAddWhite (e) {
if (e) {
this.WhiteArr.push(e)
}
},
/** 关闭包选择框*/
closeAddPack () {
this.packOpen = false
},
closeAddWhite () {
this.whiteOpen = false
},
cancel () {
this.close()
this.$router.push({ path: '/build/publish' })
},
handleDeleteTag (e) {
for (var i in this.WhiteArr) {
if (this.WhiteArr[i].apkId == e) {
this.WhiteArr.splice(i, 1);
break; // 退
}
}
},
close () {
this.$tab.closePage();
},
}
}
</script>
<style lang="scss" scoped>
.app-container {
background: #ffffff;
// margin: 24px;
position: relative;
height: 100%;
}
.form-main {
margin: 0 auto;
}
::v-deep .el-input.is-disabled .el-input__inner,
.el-textarea.is-disabled .el-textarea__inner {
border: 1px solid #E4E7ED !important;
}
.tag-group {
.el-tag {
cursor: pointer;
}
}
.el-tag+.el-tag {
margin-left: 10px
}
.footer {
display: flex;
align-items: center;
justify-content: flex-end;
position: absolute;
bottom: 24px;
right: 80px
}
.area-box {
max-width: 400px;
min-height: 100px;
padding: 10px;
box-sizing: border-box;
border: 1px solid #DCDFE6;
border-radius: 4px;
overflow-y: auto;
}
::v-deep .el-input,
.el-select {
max-width: 400px;
width: 400px;
}
</style>

View File

@ -1,7 +1,6 @@
<template>
<div class="app-container">
<el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="" size="small"
labelPosition="left">
<el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="120px" size="small">
<el-form-item label="APP名称" prop="appName">
<el-input v-model="queryParams.appName" clearable placeholder="请输入APP名称" @keyup.enter.native="handleQuery" />
</el-form-item>
@ -35,10 +34,12 @@
type="success" @click="handleUpdate">修改
</el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-button :disabled="multiple" icon="el-icon-top" plain size="mini" type="info" @click="handlePublish">批量发布
<el-col :span="1.5">
<el-button :disabled="multiple" icon="el-icon-top" plain size="mini" type="info" @click="handleDelete">批量发布
</el-button>
</el-col> -->
</el-col>
<el-col :span="1.5">
<el-button v-hasPermi="['deployment:publish:remove']" :disabled="multiple" icon="el-icon-delete" plain size="mini"
type="danger" @click="handleDelete">批量删除
@ -51,10 +52,7 @@
<el-table-column :show-overflow-tooltip="true" align="center" type="selection" width="55" />
<el-table-column :show-overflow-tooltip="true" align="center" label="APP名称" prop="appName" />
<el-table-column :show-overflow-tooltip="true" align="center" label="版本号" prop="version" />
<el-table-column :show-overflow-tooltip="true" align="center" label="系统" prop="systemType" :filters="dict.type.sys_apk_type.map(item => ({
...item,
text: item.label
}))" :filter-method="filterTagSysType" />
<el-table-column :show-overflow-tooltip="true" align="center" label="系统" prop="systemType" />
<el-table-column align="center" label="公开版" prop="publicVersion">
<template slot-scope="scope">
<el-switch v-model="scope.row.publicVersion" :active-value="1" :inactive-value="0" class="drawer-switch"
@ -67,109 +65,222 @@
disabled />
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" label="上传时间" prop="updateTime" sortable>
<el-table-column :show-overflow-tooltip="true" align="center" label="上传时间" prop="updateTime">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updateTime) }}</span>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" label="发布环境" prop="publishEnvironment" :filters="environmentList.map(item => ({
...item,
text: item.name,
value: item.id
}))" :filter-method="filterPublishEnvironment" filter-placement="bottom-end">
<el-table-column :show-overflow-tooltip="true" align="center" label="发布环境" prop="publishEnvironment">
<template slot-scope="scope">
<div v-for="item in environmentList" :key="item.id">
<div v-if="item.id === scope.row.publishEnvironment">{{ item.name }}</div>
</div>
<!-- <dict-tag :options="environmentList" :value="scope.row.publishEnvironment"/>-->
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" :filters="dict.type.release_status.map(item => ({
...item,
text: item.label
}))" :filter-method="filterTagStatus" label="发布状态" prop="publishEnvironment">
<el-table-column :show-overflow-tooltip="true" align="center" label="发布状态" prop="publishEnvironment">
<template slot-scope="scope">
<span v-for="item in dict.type.release_status">
<el-tag v-if="item.value == scope.row.status"
:type="scope.row.status == 0 ? 'info' : scope.row.status == 1 ? 'success' : 'warning'">{{ item.label
}}</el-tag>
</span>
<!-- <dict-tag :options="dict.type.release_status" :value="scope.row.status" /> -->
<dict-tag :options="dict.type.release_status" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" label="安装包编号" prop="apkId" />
<el-table-column :show-overflow-tooltip="true" align="center" label="版本说明" prop="versionDesc" />
<el-table-column :show-overflow-tooltip="true" align="center" label="公开时间" prop="createTime" sortable>
<el-table-column :show-overflow-tooltip="true" align="center" label="公开时间" prop="createTime">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column align="center" label="二维码" min-width="80">
<template slot-scope="scope">
<template v-if="scope.row.quickMark">
<el-image v-if="scope.row.status != 2" :preview-src-list="[scope.row.quickMark]" :src="scope.row.quickMark"
style="width: 80px; height: 80px">
</el-image>
<el-image v-else :src="scope.row.quickMark" style="width: 80px; height: 80px">
</el-image>
</template>
<div v-else>/</div>
<!-- <el-popover-->
<!-- v-if="scope.row.qrCode && scopeC.row.status !== '20'"-->
<!-- ref="popver"-->
<!-- trigger="click"-->
<!-- width="200"-->
<!-- >-->
<!-- <div class="table-img">-->
<!-- <img :src="'data:image/jpg;base64,'+ scope.row.qrCode">-->
<!-- <p v-if="scopeC.row.verifyCode">密码:{{ scope.row.verifyCode }}</p>-->
<!-- </div>-->
<!-- </el-popover>-->
<!-- <div v-else>-</div>-->
</template>
</el-table-column>
<el-table-column align="center" class-name="small-padding fixed-width" label="操作" fixed="right">
<el-table-column align="center" class-name="small-padding fixed-width" label="操作">
<template slot-scope="scope">
<el-popover placement="left" width="" trigger="hover">
<div>
<div style="margin-bottom: 10px;color:#000;font-size:14px">操作</div>
<div style="text-align: right; margin: 0">
<el-button @click="handlePublish(scope.row)" v-if="scope.row.status == 2 || scope.row.status == 0" plain
size="mini">发布</el-button>
<el-button @click="handleDown(scope.row)" plain size="mini" v-if="scope.row.status == 1">下架</el-button>
<el-button @click="handleDownload(scope.row)" size="mini">下载</el-button>
<el-button plain size="mini" @click="handleUpdate(scope.row)"
v-if="scope.row.status === 2 || scope.row.status === 0">修改</el-button>
<el-button plain size="mini" @click="handleDetail(scope.row)">详情</el-button>
<el-button plain type="danger" size="mini" @click="handleDelete(scope.row)">删除</el-button>
</div>
</div>
<el-button slot="reference" size="mini" type="text">更多<i class="el-icon-caret-right"></i></el-button>
</el-popover>
<!--
<el-dropdown trigger="hover" placement="left-start" size="mini"
@command="(command) => handleCommand(command, scope.row)">
<el-button size="mini" type="text">更多<i class="el-icon-caret-right"></i></el-button>
<el-dropdown-menu slot="dropdown" class="dropdown-max">
<el-dropdown-item command="handlePublish"
v-if="scope.row.status == 2 || scope.row.status == 0">发布</el-dropdown-item>
<el-dropdown-item command="handleDown" v-if="scope.row.status == 1">下架</el-dropdown-item>
<el-dropdown-item command="handleUpdate"
v-if="scope.row.status === 2 || scope.row.status === 0">编辑</el-dropdown-item>
<el-dropdown-item command="handleDownload">下载安装包
</el-dropdown-item>
<el-dropdown-item command="handleDetail">详情</el-dropdown-item>
<el-dropdown-item command="handleDelete"
v-if="scope.row.status === 2 || scope.row.status === 0">删除</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown> -->
<el-button v-if="scope.row.status === 1" icon="el-icon-bottom" size="mini" type="text"
@click="handleDown(scope.row)">下架
</el-button>
<el-button v-if="scope.row.status == 2 || scope.row.status == 0" icon="el-icon-top" size="mini" type="text"
@click="handlePublish(scope.row.id)">发布
</el-button>
<el-button icon="el-icon-view" size="mini" type="text" @click="handleDetail(scope.row)">详情
</el-button>
<el-button icon="el-icon-download" size="mini" type="text" @click="handleDownload(scope.row)">下载安装包
</el-button>
<el-button v-if="scope.row.status === 2 || scope.row.status === 0" v-hasPermi="['deployment:publish:edit']"
icon="el-icon-edit" size="mini" type="text" @click="handleUpdate(scope.row)">修改
</el-button>
<el-button v-if="scope.row.status === 2 || scope.row.status === 0" v-hasPermi="['deployment:publish:remove']"
icon="el-icon-delete" size="mini" type="text" @click="handleDelete(scope.row)">删除
</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :limit.sync="queryParams.pageSize" :page.sync="queryParams.pageNum" :total="total"
@pagination="getList" />
<!-- 添加或修改发布列表对话框 -->
<el-dialog :title="title" :visible.sync="open" append-to-body width="900px">
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-form-item label="APPid">
<el-input v-model="form.applyId" placeholder="请输入Appid" readonly />
</el-form-item>
<el-form-item label="APP名称">
<el-input v-model="form.appName" placeholder="请输入APP名称" readonly />
</el-form-item>
<el-form-item label="选择系统" prop="systemType">
<el-select v-model="form.systemType" placeholder="请选择系统类型" @change="changeSys">
<el-option v-for="dict in dict.type.sys_apk_type" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
<!-- <el-radio-group v-model="form.systemType" @change="changeSys">-->
<!-- <el-radio-button label="android">android</el-radio-button>-->
<!-- <el-radio-button label="IOS">IOS</el-radio-button>-->
<!-- <el-radio-button label="HarmonyOS">HarmonyOS</el-radio-button>-->
<!-- </el-radio-group>-->
</el-form-item>
<el-form-item v-if="form.systemType != 'IOS'" label="安装包" prop="sysApkName">
<!-- <el-input v-model="form.apkId" class="input-with-select" placeholder="请选择包" readonly>-->
<!-- <el-button slot="append" icon="el-icon-search" @click="handlePackOpen"></el-button>-->
<!-- </el-input>-->
<el-input v-model="form.sysApkName" class="input-with-select" placeholder="请选择包" readonly>
<el-button slot="append" icon="el-icon-search" @click="handlePackOpen"></el-button>
</el-input>
<!-- <el-input v-model="form.apkId" placeholder="请输入安装包编号"/>-->
</el-form-item>
<el-form-item v-if="form.systemType == 'ios'" label="app store地址" prop="appStoreAddress">
<el-input v-model="form.appStoreAddress" placeholder="请输入app store地址" />
</el-form-item>
<el-form-item label="版本号" prop="version">
<el-input v-model="form.version" placeholder="请输入版本号" />
</el-form-item>
<el-form-item label="版本说明" prop="versionDesc">
<el-input v-model="form.versionDesc" placeholder="请输入版本说明" />
</el-form-item>
<el-form-item label="发布环境" prop="publishEnvironment">
<el-select v-model="form.publishEnvironment">
<el-option v-for="dict in environmentList" :key="dict.value" :label="dict.name" :value="parseInt(dict.id)" />
</el-select>
</el-form-item>
<el-form-item label="发布策略" prop="publishStrategy">
<el-select v-model="form.publishStrategy">
<el-option v-for="dict in dict.type.release_strategy" :key="dict.value" :label="dict.label"
:value="parseInt(dict.value)" />
</el-select>
</el-form-item>
<el-form-item label="结果通知" prop="resultNotify">
<el-switch v-model="form.resultNotify" :active-value="1" :inactive-value="0" />
</el-form-item>
<el-form-item label="公开版" prop="publicVersion">
<el-switch v-model="form.publicVersion" :active-value="1" :inactive-value="0" />
</el-form-item>
<el-form-item label="强制更新" prop="forceUpdate">
<el-switch v-model="form.forceUpdate" :active-value="1" :inactive-value="0" />
</el-form-item>
<el-form-item label="下载验证" prop="downloadVerification">
<el-switch v-model="form.downloadVerification" :active-value="1" :inactive-value="0" />
</el-form-item>
<!-- <el-form-item label="更新对象(-1: 不限制, 白名单id)" prop="updateObject">-->
<!-- <el-form-item label="更新对象" prop="updateObject">-->
<!-- <el-select v-model="form.publishStrategy">-->
<!-- <el-option-->
<!-- v-for="dict in dict.type.release_user_type"-->
<!-- :key="dict.value"-->
<!-- :label="dict.label"-->
<!-- :value="parseInt(dict.value)"-->
<!-- />-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<el-form-item label="有效期开始时间" prop="validityStartTime">
<el-date-picker v-model="form.validityStartTime" clearable placeholder="请选择有效期开始时间" type="date"
value-format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
<el-form-item label="有效期结束时间" prop="validityEndTime">
<el-date-picker v-model="form.validityEndTime" clearable placeholder="请选择有效期结束时间" type="date"
value-format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button v-if="form.status != 2" type="primary" @click="pubLishForm">
</el-button>
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<AddPack v-if="packOpen" :systemType="form.systemType" @addPack="addPack" @close="closeAddPack"></AddPack>
<DetailModal v-if="openDetail" :detailId="detailId" :openDetail="openDetail" @close="closeDetailModal"></DetailModal>
</div>
</template>
<script>
import {
addPublish,
delPublish,
getPublish,
listPublish,
publish,
soldPublish,
updatePublish
} from '@/api/deployment/publish'
import Cookies from 'js-cookie'
import AddPack from '@/views/FDS/publishList/components/addPack.vue'
import DetailModal from './component/detail.vue'
import { listEnvironment } from '@/api/deployment/environment'
import { getApplicationName } from '@/utils/application'
import { getINFO } from '@/api/FDS/installList'
export default {
name: 'Publish',
dicts: ['release_environment', 'sys_yes_no', 'release_strategy', 'release_user_type', 'release_status', 'sys_apk_type'],
components: {
AddPack,
DetailModal
},
data () {
return {
//
@ -189,6 +300,7 @@ export default {
//
title: '',
//
open: false,
packOpen: false,
openDetail: false,
detailId: '',
@ -212,7 +324,50 @@ export default {
pageNum: 1,
pageSize: 10,
sysApkName: null,
appCode: Cookies.get('Admin-Application-appCode')
},
//
rules: {
appName: [
{ required: true, message: '应用name不能为空', trigger: 'blur' }
],
systemType: [
{ required: true, message: '系统类型不能为空', trigger: 'change' }
],
apkId: [
{ required: true, message: '安装包编号不能为空', trigger: 'blur' }
],
version: [
{ required: true, message: '版本号不能为空', trigger: 'blur' }
],
publishEnvironment: [
{ required: true, message: '发布环境不能为空', trigger: 'change' }
],
publishStrategy: [
{ required: true, message: '发布策略不能为空', trigger: 'change' }
],
publicVersion: [
{ required: true, message: '公开版不能为空', trigger: 'change' }
],
forceUpdate: [
{ required: true, message: '强制更新不能为空', trigger: 'change' }
],
updateObject: [
{ required: true, message: '更新对象(-1: 不限制, 白名单id)不能为空', trigger: 'change' }
],
status: [
{ required: true, message: '0:保存,1:已发布,2:已下架不能为空', trigger: 'change' }
],
isDelete: [
{ required: true, message: '逻辑删除,0:未删除,1:删除不能为空', trigger: 'blur' }
],
createTime: [
{ required: true, message: '创建时间不能为空', trigger: 'blur' }
],
sysApkName: [
{ required: true, message: '安装包不能为空', trigger: 'blur' }
]
}
}
},
created () {
@ -222,6 +377,7 @@ export default {
methods: {
/** 查询发布列表列表 */
getList (type) {
this.loading = true
listPublish(this.queryParams).then(response => {
this.publishList = response.rows
@ -232,7 +388,45 @@ export default {
this.handlePublish(this.publishList[0].id)
}
},
//
cancel () {
this.open = false
this.loading = false
this.reset()
},
//
reset () {
this.form = {
id: null,
applyId: Cookies.get('Admin-Application-Id'),
appName: getApplicationName(),
systemType: null,
apkId: null,
appStoreAddress: null,
version: null,
versionDesc: null,
publishEnvironment: null,
publishStrategy: null,
resultNotify: null,
publicVersion: null,
forceUpdate: null,
downloadVerification: null,
updateObject: null,
validityStartTime: null,
validityEndTime: null,
remark: null,
status: null,
isDelete: null,
created: null,
modified: null,
createTime: null,
updateTime: null,
apkUrl: null,
sysApkName: null
}
this.resetForm('form')
},
/** 搜索按钮操作 */
handleQuery () {
this.queryParams.pageNum = 1
@ -251,19 +445,84 @@ export default {
},
/** 新增按钮操作 */
handleAdd () {
this.$router.push('/build/publishAdd')
this.reset()
this.open = true
this.title = '添加发布列表'
this.getEnvironmentList()
},
/** 修改按钮操作 */
handleUpdate (row) {
this.reset()
this.getEnvironmentList()
const id = row.id || this.ids
getPublish(id).then(response => {
this.form = response.data
this.getPackList(this.form.apkId)
})
},
/** 编辑按钮操作 */
handleUpdate (row) {
this.$router.push({
path: '/build/publishEdit',
query: {
id: row.id,
/** 查询参数列表 */
getPackList (id) {
getINFO(id).then(response => {
this.form.sysApkName = response.data.sysApkName
this.open = true
this.title = '修改发布列表'
})
},
/** 提交按钮 */
submitForm () {
this.$refs['form'].validate(valid => {
if (valid) {
if (this.form.id != null) {
let data = Object.assign({}, this.form)
delete data.explain
updatePublish(data).then(response => {
console.log(data)
this.$modal.msgSuccess('修改成功')
this.loading = false
this.open = false
this.getList()
})
} else {
addPublish(this.form).then(response => {
this.$modal.msgSuccess('新增成功')
this.loading = false
this.open = false
this.getList()
})
}
}
})
},
//
pubLishForm () {
this.$refs['form'].validate(valid => {
if (valid) {
if (this.form.id != null) {
let data = Object.assign({}, this.form)
delete data.explain
updatePublish(data).then(response => {
this.handlePublish(data.id)
this.loading = false
this.open = false
// this.getList()
})
} else {
addPublish(this.form).then((res) => {
this.loading = false
this.open = false
this.getList('publish')
// this.handlePublish(res.id)
})
}
}
})
},
/** 删除按钮操作 */
handleDelete (row) {
@ -276,6 +535,32 @@ export default {
}).catch(() => {
})
},
/** 导出按钮操作 */
handleExport () {
this.download('deployment/publish/export', {
...this.queryParams
}, `publish_${new Date().getTime()}.xlsx`)
},
/** 弹出包选择框*/
handlePackOpen () {
this.packOpen = true
},
addPack (e) {
this.form.apkId = e.apkId
this.form.version = e.version
this.form.systemType = e.sysType
this.form.sysApkName = e.sysApkName
this.form.apkUrl = e.sysApk
this.packOpen = false
},
/** 关闭包选择框*/
closeAddPack () {
this.packOpen = false
},
/** 查询环境维护列表 */
getEnvironmentList () {
@ -284,10 +569,19 @@ export default {
})
},
//
changeSys () {
// this.form.systemType = sysType
this.form.apkId = null
this.form.version = null
this.form.sysApkName = null
this.form.appStoreAddress = null
this.form.apkUrl = null
console.log(this.form, 99999999)
},
/**下载安装包*/
handleDownload (row) {
window.open(row.apkUrl);
handleDownload () {
},
/**下架*/
handleDown (row) {
@ -297,56 +591,21 @@ export default {
})
},
/**发布*/
handlePublish (row) {
publish(row.id).then(response => {
handlePublish (id) {
publish(id).then(response => {
this.$modal.msgSuccess('发布成功')
this.getList()
})
},
/**详情*/
handleDetail (row) {
this.$router.push({
path: '/build/publishDetail',
query: {
id: row.id,
this.detailId = row.id
this.openDetail = true
},
closeDetailModal () {
this.openDetail = false
}
})
},
filterTagStatus (value, row) {
return row.status === Number(value);
},
filterTagSysType (value, row) {
return row.sysType === Number(value);
},
filterPublishEnvironment (value, row) {
return row.publishEnvironment === Number(value);
},
//
handleCommand (command, row) {
switch (command) {
case "handlePublish":
this.handlePublish(row);
break;
case "handleDown":
this.handleDown(row);
break;
case "handleUpdate":
this.handleUpdate(row);
break;
case "handleDownload":
this.handleDownload(row);
break;
case "handleDetail":
this.handleDetail(row);
break;
case "handleDelete":
this.handleDelete(row);
break;
default:
break;
}
},
}
}
</script>
@ -361,14 +620,4 @@ export default {
.el-tag+.el-tag {
margin-left: 10px
}
.dropdown-container {
display: flex;
/* 设置为Flex布局 */
}
.el-dropdown-link {
cursor: pointer;
color: #409EFF;
}
</style>

View File

@ -1,147 +0,0 @@
<template>
<div class="app-container">
<el-container>
<el-main>
<div class="form-main">
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-form-item label="白名单名称" prop="whitelistName">
<el-input v-model="form.whitelistName" placeholder="请输入白名单名称" />
</el-form-item>
<el-form-item label="白名单类型" prop="whitelistType">
<el-select v-model="form.whitelistType" clearable placeholder="请选择白名单类型">
<el-option v-for="dict in dict.type.whitelist_type" :key="dict.value" :label="dict.label"
:value="parseInt(dict.value)" />
</el-select>
</el-form-item>
<el-form-item label="白名单模式" prop="whitelistMode">
<el-select v-model="form.whitelistMode" clearable placeholder="请选择白名单模式">
<el-option v-for="dict in dict.type.white_mode" :key="dict.value" :label="dict.label"
:value="parseInt(dict.value)" />
</el-select>
</el-form-item>
<el-form-item label="备注">
<el-input v-model="form.remarks" placeholder="请输入内容" type="textarea" />
</el-form-item>
</el-form>
</div>
<div class="footer">
<el-button @click="cancel"> </el-button>
<el-button type="primary" @click="submitAddForm()"> </el-button>
</div>
</el-main>
</el-container>
</div>
</template>
<script>
import { addWhitelist } from '@/api/FDS/whiteList'
export default {
name: 'WhiteAdd',
dicts: ["white_mode", 'whitelist_type'],
data () {
return {
form: {},
tokenId: '',
//
fileList: [],
rules: {
whitelistName: [
{ required: true, message: '白名单名称不能为空', trigger: 'blur' }
],
whitelistType: [
{ required: true, message: '白名单类型不能为空', trigger: 'change' }
],
whitelistMode: [
{ required: true, message: '白名单模式不能为空', trigger: 'change' }
]
}
}
},
computed: {},
mounted () {
this.reset()
},
methods: {
reset () {
this.form = {
}
console.log(this.form)
},
/** 新增按钮 */
submitAddForm: function () {
this.$refs['form'].validate(valid => {
if (valid) {
addWhitelist(this.form).then(response => {
this.$modal.msgSuccess('新增成功')
})
this.close()
this.$router.push({ path: '/build/whitelist' })
}
})
},
cancel () {
this.close()
this.$router.push({ path: '/build/whitelist' })
},
close () {
this.$tab.closePage();
},
}
}
</script>
<style lang="scss" scoped>
.app-container {
background: #ffffff;
height: 100%;
position: relative;
}
.form-main {
width: 700px;
margin: 0 auto;
}
::v-deep .el-input.is-disabled .el-input__inner,
.el-textarea.is-disabled .el-textarea__inner {
border: 1px solid #E4E7ED !important;
}
.tag-group {
.el-tag {
cursor: pointer;
}
}
.el-tag+.el-tag {
margin-left: 10px
}
.page-footer {
margin: 0 auto;
width: 700px;
justify-content: center;
display: flex;
}
::v-deep .el-input,
.el-select,
.el-textarea {
max-width: 400px;
width: 400px;
}
.footer {
margin-top: 20px;
display: flex;
align-items: center;
justify-content: flex-end;
position: absolute;
bottom: 24px;
right: 80px
}
</style>

View File

@ -1,292 +0,0 @@
<template>
<div class="app-container">
<el-container>
<el-header>
<div>白名单配置</div>
<el-divider />
</el-header>
<el-main>
<div class="form-main">
<el-form ref="configForm" :model="configForm" :rules="configRules" label-width="120px">
<el-form-item label="添加方式" prop="configName">
<el-radio-group v-model="configForm.addMode">
<el-radio :label="1">手动添加
</el-radio>
<el-radio :label="2">批量添加
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="白名单类型">
<dict-tag :options="dict.type.white_mode" :value="configForm.whitelistType" />
</el-form-item>
<template v-if="configForm.addMode == 1">
<el-form-item :label="configForm.whiteListType == 0 ? '用户ID' : '白名单设备'" prop="user">
<el-input v-model="configForm.userId" :placeholder="configForm.whiteListType == 0 ? '请输入用户ID' : '请输入设备信息'"
type="textarea" />
</el-form-item>
</template>
<el-form-item v-else-if="configForm.addMode == 2" label="白名单文件" prop="fileList">
<div class="upload-file">
<el-upload ref="fileUpload" :accept="accept" action="#" :before-upload="handleBeforeUpload"
:file-list="fileList" :limit="1" :auto-upload="false" :on-error="handleUploadError"
:on-exceed="handleExceed" :on-success="handleUploadSuccess" :on-change="changeFile"
:show-file-list="false" class="upload-file-uploader" multiple>
<!-- 上传按钮 -->
<el-button size="mini" type="primary">选取文件</el-button>
<!-- 上传提示 -->
<div v-if="showTip" slot="tip" class="el-upload__tip">
请上传
<template v-if="fileSize">大小不超过 <b style="color: #f56c6c">1MB</b></template>
<template v-if="fileType"> 格式为 <b style="color: #f56c6c">txt</b></template>
的文件
</div>
</el-upload>
<!-- 文件列表 -->
<transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear"
tag="ul">
<li v-for="(file, index) in fileList" :key="file.uid"
class="el-upload-list__item ele-upload-list__item-content fl-ac">
<div class="el-icon-document"> {{ file.name }} </div>
<div class="ele-upload-list__item-content-action">
<el-link :underline="false" type="danger" @click="handleDelete(index)">删除</el-link>
</div>
</li>
</transition-group>
</div>
</el-form-item>
</el-form>
</div>
<div class="page-footer">
<el-button type="primary" @click="submitAddForm()"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-main>
</el-container>
</div>
</template>
<script>
import { listWhitelistMember, addWhitelistMember, importWhitelist } from "@/api/FDS/whiteList";
import { getToken } from '@/utils/auth'
export default {
name: 'WhiteAddConfig',
dicts: ["white_mode", 'whitelist_type', 'release_status'],
data () {
return {
form: {},
tokenId: '',
//
fileList: [],
configForm: {
addMode: 1,
whiteListType: '',
whitelistIds: '',
remark: '',
equepid: '',
fileList: []
},
accept: 'text/plain',
headers: {
Authorization: 'Bearer ' + getToken()
},
number: 0,
isShowTip: true,
fileSize: 1,
fileList: [],
uploadList: [],
_formData: new FormData(),
file: {},
fileType: ['txt'],
configRules: {
user: [
{ required: true, message: '用户Id不能为空', trigger: 'blur' }
],
fileList: [
{ required: true, message: '白名单文件不能为空', trigger: 'change' }
]
}
}
},
computed: {
//
showTip () {
return this.isShowTip && (this.fileType || this.fileSize)
}
},
mounted () {
this.whitelistId = this.$route.query.id;
this.configForm.whitelistType = this.$route.query.whitelistType
},
methods: {
reset () {
this.form = {
addMode: undefined,
whiteListType: undefined,
userId: undefined,
equepid: undefined,
file: undefined
}
this.resetForm('form')
},
/** 提交按钮 */
submitAddForm: function () {
this.$refs['configForm'].validate(valid => {
if (valid) {
if (this.configForm.addMode == 1) {
addWhitelistMember({
user: this.configForm.user,
whitelistId: this.whitelistId
}).then(response => {
this.$modal.msgSuccess('新增成功')
this.$router.push({ path: '/build/whitelist' })
})
} else {
importWhitelist(this._formData).then(res => {
this.$modal.msgSuccess('新增成功')
this.$router.push({ path: '/build/whitelist' })
})
}
}
})
},
cancel () {
this.$router.push({ path: '/build/whitelist' })
},
//
handleBeforeUpload (file) {
console.log(file)
//
if (this.fileType) {
const fileName = file.name.split('.')
const fileExt = fileName[fileName.length - 1]
const isTypeOk = this.fileType.indexOf(fileExt) >= 0
if (!isTypeOk) {
this.$modal.msgError(`文件格式不正确, 请上传${this.fileType.join('/')}格式文件!`)
return false
}
}
//
if (this.fileSize) {
const isLt = file.size / 1024 / 1024 < this.fileSize
if (!isLt) {
this.$modal.msgError(`上传文件大小不能超过 ${this.fileSize} MB!`)
return false
}
}
this.$modal.loading('正在上传文件,请稍候...')
this.number++
return true
},
//
handleExceed () {
this.$modal.msgError(`上传文件数量不能超过 1 个!`)
},
//
handleUploadError (err) {
console.log(222);
this.$modal.msgError('上传文件失败,请重试')
this.$modal.closeLoading()
},
//
handleUploadSuccess (res, file) {
console.log(res);
if (res.status == 'ready') {
this.uploadList.push(res)
this.$modal.closeLoading()
this.uploadedSuccessfully()
} else {
this.$modal.closeLoading()
this.uploadedSuccessfully()
}
// if (res.code === 200) {
// this.uploadList.push({ name: res.data.url, url: res.data.url, size: res.data.size })
// this.uploadedSuccessfully()
// } else {
// this.number--
// this.$modal.closeLoading()
// this.$refs.fileUpload.handleRemove(file)
// this.uploadedSuccessfully()
// }
},
//
uploadedSuccessfully () {
if (this.number > 0 && this.uploadList.length === this.number) {
this.fileList = this.fileList.concat(this.uploadList)
this.configForm.fileList = this.fileList.concat(this.uploadList)
this.uploadList = []
this.number = 0
this.$modal.closeLoading()
}
},
//
getFileName (name) {
if (name.lastIndexOf('/') > -1) {
return name.slice(name.lastIndexOf('/') + 1)
} else {
return ''
}
},
changeFile (file) {
this.handleBeforeUpload(file)
this.handleUploadSuccess(file, file)
let formData = new FormData()
this.file = file
formData.append('file', file.raw)//
formData.append('whitelistId', this.whitelistId)//
this._formData = formData
},
handleDelete (index) {
this.fileList.splice(index, 1)
},
}
}
</script>
<style lang="scss" scoped>
.app-container {
background: #ffffff;
margin: 24px;
}
.form-main {
width: 700px;
margin: 0 auto;
}
::v-deep .el-input.is-disabled .el-input__inner,
.el-textarea.is-disabled .el-textarea__inner {
border: 1px solid #E4E7ED !important;
}
.tag-group {
.el-tag {
cursor: pointer;
}
}
.el-tag+.el-tag {
margin-left: 10px
}
.page-footer {
margin: 0 auto;
width: 700px;
justify-content: center;
display: flex;
}
.fl-ac {
display: flex;
align-items: center;
justify-content: space-between;
}
</style>

View File

@ -1,112 +0,0 @@
<template>
<el-dialog :modal-append-to-body="false" :visible.sync="dialogVisible" :title="title" v-bind="$attrs" width="550px"
v-on="$listeners">
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-form-item v-if="whitelistType == 0" label="用户Id" prop="user">
<el-input v-model="form.user" placeholder="请输入用户Id" />
</el-form-item>
<el-form-item v-else label="设备号" prop="user">
<el-input v-model="form.user" placeholder="请输入设备号" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancel"> </el-button>
<el-button type="primary" @click="submitAddForm()"> </el-button>
</div>
</el-dialog>
</template>
<script>
import { updateWhitelistMember, getWhitelistMember } from '@/api/FDS/whiteList'
export default {
name: 'EditWhiteList',
props: {
//
user: {
type: Number,
default: undefined
},
whitelistType: {
type: String,
default: undefined
},
id: {
type: Number,
default: undefined
}
},
data () {
return {
configName: undefined,
dialogVisible: true,
form: {
user: undefined,
},
id: undefined,
title: '编辑',
//
rules: {
user: [
{ required: true, message: '用户Id不能为空', trigger: 'blur' }
],
}
}
},
mounted () {
this.form.user = this.user
this.form.id = this.id
this.getWhitelistMemberById()
},
methods: {
/**
* 查询白名单成员列详细
*/
getWhitelistMemberById () {
getWhitelistMember(this.user).then(res => {
this.form.user = res.data.id
})
},
/** 提交按钮 */
submitAddForm: function () {
// this.form.id = this.user
this.$refs['form'].validate(valid => {
if (valid) {
updateWhitelistMember(this.form).then(response => {
this.$modal.msgSuccess('修改成功')
this.closeModal()
})
}
})
},
reset () {
this.form = {
user: undefined,
}
this.resetForm('form')
},
//
cancel () {
this.reset()
this.closeModal()
},
closeModal () {
this.$emit('close')
}
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-dialog .el-form {
.el-input,
.el-select,
.el-textarea {
width: 100%
}
}
</style>

View File

@ -1,155 +0,0 @@
<template>
<div class="app-container">
<el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="90px" size="small">
<el-form-item label="白名单信息" prop="user">
<el-input v-model="queryParams.user" clearable :placeholder="whitelistType == 0 ? '请输入用户Id' : '请输入设备号'"
style="width: 240px" @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item>
<el-button icon="el-icon-search" size="mini" type="primary" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button v-hasPermi="['system:config:delete']" :disabled="multiple" icon="el-icon-plus" plain size="mini"
type="info" @click="handleDelete">批量删除
</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="dataList" @selection-change="handleSelectionChange">
<el-table-column align="center" type="selection" width="55" />
<el-table-column :show-overflow-tooltip="true" align="center" :label="whitelistType == 0 ? '用户Id' : '设备号'"
prop="user" />
<el-table-column :show-overflow-tooltip="true" align="center" label="添加时间" prop="createTime" />
<el-table-column align="center" class-name="small-padding fixed-width" label="操作" width="250">
<template slot-scope="scope">
<el-button v-hasPermi="['system:config:edit']" icon="el-icon-edit" size="mini" type="text"
@click="handleEdit(scope.row)">编辑
</el-button>
<el-button v-hasPermi="['system:config:delete']" icon="el-icon-delete" size="mini" type="text"
@click="handleDelete(scope.row)">删除
</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :limit.sync="queryParams.pageSize" :page.sync="queryParams.pageNum" :total="total"
@pagination="getList" />
<EditWhiteList v-if="editWhiteListOpen" @close="closeEditWhiteList" :user="user" :id='id'
:whitelistType="whitelistType" />
</div>
</template>
<script>
import { listWhitelistMember, delWhitelistMember } from '@/api/FDS/whiteList'
import EditWhiteList from './components/editWhiteList.vue'
export default {
name: 'WhiteListDetail',
components: { EditWhiteList },
dicts: ['sys_yes_no'],
data () {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
dataList: [],
//
title: '',
editWhiteListOpen: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
user: undefined,
whitelistId: ''
},
user: '',
id: '',
//
form: {},
whitelistId: '',
whitelistType: ''
}
},
created () {
this.getList()
},
mounted () {
this.whitelistId = this.$route.query.id
this.whitelistType = this.$route.query.whitelistType
},
methods: {
/** 查询参数列表 */
getList () {
this.loading = true
this.queryParams.whitelistId = this.$route.query.id;
listWhitelistMember(this.queryParams).then(response => {
this.dataList = response.rows
this.total = response.total
this.loading = false
}
)
},
//
reset () {
this.form = {
phoneNumber: undefined
}
this.resetForm('form')
},
/** 搜索按钮操作 */
handleQuery () {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery () {
this.resetForm('queryForm')
this.handleQuery()
},
//
handleSelectionChange (selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length != 1
this.multiple = !selection.length
},
/** 删除按钮操作 */
handleDelete (row) {
const configIds = row.id || this.ids
this.$modal.confirm('是否确认删除编号为"' + configIds + '"的数据项?').then(function () {
return delWhitelistMember(configIds)
}).then(() => {
this.getList()
this.$modal.msgSuccess('删除成功')
}).catch(() => {
})
},
/** 修改按钮操作 */
handleEdit (row) {
this.reset()
this.user = row.user
this.id = row.id
this.editWhiteListOpen = true
},
/** 关闭新增弹出框*/
closeEditWhiteList () {
this.editWhiteListOpen = false
this.getList()
},
}
}
</script>

View File

@ -1,148 +0,0 @@
<template>
<div class="app-container">
<el-container>
<el-main>
<div class="form-main">
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-form-item label="白名单名称" prop="whitelistName">
<el-input v-model="form.whitelistName" placeholder="请输入白名单名称" />
</el-form-item>
<el-form-item label="白名单类型" prop="whitelistType">
<el-select v-model="form.whitelistType" clearable placeholder="请选择白名单类型">
<el-option v-for="dict in dict.type.whitelist_type" :key="dict.value" :label="dict.label"
:value="parseInt(dict.value)" />
</el-select>
</el-form-item>
<el-form-item label="白名单模式" prop="whitelistMode">
<el-select v-model="form.whitelistMode" clearable placeholder="请选择白名单模式">
<el-option v-for="dict in dict.type.white_mode" :key="dict.value" :label="dict.label"
:value="parseInt(dict.value)" />
</el-select>
</el-form-item>
<el-form-item label="备注">
<el-input v-model="form.remarks" placeholder="请输入内容" type="textarea" />
</el-form-item>
</el-form>
</div>
<div class="footer">
<el-button @click="cancel"> </el-button>
<el-button type="primary" @click="submitAddForm()"> </el-button>
</div>
</el-main>
</el-container>
</div>
</template>
<script>
import { updateWhitelist, getWhitelist } from '@/api/FDS/whiteList'
export default {
name: 'WhiteEdit',
dicts: ["white_mode", 'whitelist_type'],
data () {
return {
form: {},
tokenId: '',
rules: {
whitelistName: [
{ required: true, message: '白名单名称不能为空', trigger: 'blur' }
],
whitelistType: [
{ required: true, message: '白名单类型不能为空', trigger: 'change' }
],
whitelistMode: [
{ required: true, message: '白名单模式不能为空', trigger: 'change' }
]
}
}
},
computed: {},
mounted () {
this.getWhitelistById(this.$route.query.id)
},
methods: {
getWhitelistById (id) {
getWhitelist(id).then(response => {
this.form = response.data
})
},
/** 提交按钮 */
submitAddForm: function () {
this.$refs['form'].validate(valid => {
if (valid) {
updateWhitelist(this.form).then(response => {
this.$modal.msgSuccess('修改成功')
})
this.close()
this.$router.push({ path: '/build/whitelist' })
}
})
},
cancel () {
this.close()
this.$router.push({ path: '/build/whitelist' })
},
close () {
this.$tab.closePage();
},
}
}
</script>
<style lang="scss" scoped>
.app-container {
background: #ffffff;
height: 100%;
position: relative;
}
.form-main {
width: 700px;
margin: 0 auto;
}
::v-deep .el-input.is-disabled .el-input__inner,
.el-textarea.is-disabled .el-textarea__inner {
border: 1px solid #E4E7ED !important;
}
.tag-group {
.el-tag {
cursor: pointer;
}
}
.el-tag+.el-tag {
margin-left: 10px
}
.page-footer {
margin: 0 auto;
width: 700px;
justify-content: center;
display: flex;
}
::v-deep .el-input,
.el-select,
.el-textarea {
max-width: 400px;
width: 400px;
}
.footer {
margin-top: 20px;
display: flex;
align-items: center;
justify-content: flex-end;
position: absolute;
bottom: 24px;
right: 80px
}
</style>

View File

@ -1,154 +0,0 @@
<template>
<div class="app-container">
<el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="90px" size="small">
<el-form-item label="白名单信息" prop="user">
<el-input v-model="queryParams.user" clearable placeholder="请输入设备号" style="width: 240px"
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item>
<el-button icon="el-icon-search" size="mini" type="primary" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button v-hasPermi="['system:config:delete']" :disabled="multiple" icon="el-icon-plus" plain size="mini"
type="info" @click="handleDelete">批量删除
</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="dataList" @selection-change="handleSelectionChange">
<el-table-column align="center" type="selection" width="55" />
<el-table-column align="center" label="设备号" prop="user" />
<el-table-column :show-overflow-tooltip="true" align="center" label="添加时间" prop="createTime" />
<el-table-column :show-overflow-tooltip="true" align="center" label="备注" prop="remarks" />
<el-table-column align="center" class-name="small-padding fixed-width" label="操作" width="250">
<template slot-scope="scope">
<el-button v-hasPermi="['system:config:edit']" icon="el-icon-edit" size="mini" type="text"
@click="handleEdit(scope.row)">编辑
</el-button>
<el-button v-hasPermi="['system:config:delete']" icon="el-icon-delete" size="mini" type="text"
@click="handleDelete(scope.row)">删除
</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :limit.sync="queryParams.pageSize" :page.sync="queryParams.pageNum" :total="total"
@pagination="getList" />
<EditWhiteList :visible.sync="editWhiteListOpen" @close="closeEditWhiteList" />
</div>
</template>
<script>
import { delConfig, listConfig } from '@/api/system/config'
import EditWhiteList from './components/editWhiteList.vue'
export default {
name: 'WhiteListEquepDetail',
dicts: ['sys_yes_no'],
components: {
EditWhiteList
},
data () {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
dataList: [],
configList: [],
//
title: '',
//
editWhiteListOpen: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
user: undefined
},
//
form: {}
}
},
created () {
this.getList()
},
methods: {
/** 查询参数列表 */
getList () {
this.loading = true
listConfig(this.queryParams).then(response => {
this.dataList = response.rows
this.total = response.total
this.loading = false
}
)
},
//
reset () {
this.resetForm('form')
},
/** 搜索按钮操作 */
handleQuery () {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery () {
this.dateRange = []
this.resetForm('queryForm')
this.handleQuery()
},
//
handleSelectionChange (selection) {
this.ids = selection.map(item => item.configId)
this.single = selection.length != 1
this.multiple = !selection.length
},
/** 删除按钮操作 */
handleDelete (row) {
const configIds = row.configId || this.ids
this.$modal.confirm('是否确认删除编号为"' + configIds + '"的数据项?').then(function () {
return delConfig(configIds)
}).then(() => {
this.getList()
this.$modal.msgSuccess('删除成功')
}).catch(() => {
})
},
/** 修改按钮操作 */
handleEdit (row) {
this.reset()
const configId = row.configId || this.ids
this.editWhiteListOpen = true
// getConfig(configId).then(response => {
// this.form = response.data
// this.editWhiteListOpen = true
// })
},
/** 关闭新增弹出框*/
closeEditWhiteList () {
this.editWhiteListOpen = false
this.getList()
}
}
}
</script>

View File

@ -1,360 +0,0 @@
<template>
<div class="app-container">
<el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="" size="small">
<el-form-item label="名单类型" prop="whitelistType">
<el-select v-model="queryParams.whitelistType" clearable placeholder="请选择名单类型">
<el-option v-for="dict in dict.type.whitelist_type" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="名称" prop="whitelistName">
<el-input v-model="queryParams.whitelistName" clearable placeholder="请输入名称" style="width: 240px"
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="创建时间">
<el-date-picker v-model="dateRange" end-placeholder="结束日期" range-separator="-" start-placeholder="开始日期"
style="width: 240px" type="daterange" value-format="yyyy-MM-dd"></el-date-picker>
</el-form-item>
<el-form-item label="状态" prop="configType">
<el-select v-model="queryParams.status" clearable placeholder="请选择状态">
<el-option v-for="dict in dict.type.release_status" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item>
<el-button icon="el-icon-search" size="mini" type="primary" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button v-hasPermi="['system:config:add']" icon="el-icon-plus" plain size="mini" type="primary"
@click="handleAdd">新增
</el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-button :disabled="multiple" icon="el-icon-plus" plain size="mini" type="info" @click="handlePublish">批量发布
</el-button>
</el-col> -->
<el-col :span="1.5">
<el-button :disabled="multiple" icon="el-icon-plus" plain size="mini" type="info" @click="handleDelete">批量删除
</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="datalist" @selection-change="handleSelectionChange">
<el-table-column align="center" type="selection" width="55" />
<el-table-column align="center" label="白名单名称" prop="whitelistName" />
<el-table-column :show-overflow-tooltip="true" align="center" label="白名单类型" prop="whitelistType" :filters="dict.type.whitelist_type.map(item => ({
...item,
text: item.label
}))" :filter-method="filterTagWhitelistType">
<template slot-scope="scope">
<dict-tag :options="dict.type.whitelist_type" :value="scope.row.whitelistType" />
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" label="白名单模式" prop="whitelistMode" :filters="dict.type.white_mode.map(item => ({
...item,
text: item.label
}))" :filter-method="filterTagWhitelistMode">
<template slot-scope="scope">
<dict-tag :options="dict.type.white_mode" :value="scope.row.whitelistMode" />
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" label="数量" prop="deploymentWhitelistListList">
<template slot-scope="scope">
<span>{{ scope.row.deploymentWhitelistListList ? scope.row.deploymentWhitelistListList.length : 0 }}</span>
</template>
</el-table-column>
<el-table-column align="center" label="创建时间" prop="createTime" width="180" sortable>
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column align="center" label="状态" prop="status" :filters="dict.type.release_status.map(item => ({
...item,
text: item.label
}))" :filter-method="filterTagStatus">
<template slot-scope="scope">
<span v-for="item in dict.type.release_status">
<el-tag v-if="item.value == scope.row.status"
:type="scope.row.status == 0 ? 'info' : scope.row.status == 1 ? 'success' : 'warning'">{{ item.label
}}</el-tag>
</span>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" label="备注" prop="remarks" />
<el-table-column align="center" class-name="small-padding fixed-width" label="操作" fixed="right">
<template slot-scope="scope">
<el-popover placement="left" width="" trigger="hover">
<div>
<div style="margin-bottom: 10px;color:#000;font-size:14px">操作</div>
<div style="text-align: right; margin: 0">
<el-button @click="handlePublish(scope.row)" v-if="scope.row.status != 1" plain size="mini">发布</el-button>
<el-button @click="handleDown(scope.row)" plain size="mini" v-if="scope.row.status == 1">下架</el-button>
<el-button @click="handleConfig(scope.row)" size="mini" v-if="scope.row.status != 1">名单配置</el-button>
<el-button v-hasPermi="['deployment:module:edit']" plain size="mini" @click="handleEdit(scope.row)"
v-if="scope.row.status != 1">修改</el-button>
<el-button plain size="mini" @click="handleDetail(scope.row)">详情</el-button>
<el-button v-hasPermi="['deployment:module:remove']" plain type="danger" size="mini"
v-if="scope.row.status != 1" @click="handleDelete(scope.row)">删除</el-button>
</div>
</div>
<el-button slot="reference" size="mini" type="text">更多<i class="el-icon-caret-right"></i></el-button>
</el-popover>
<!--
<el-dropdown trigger="hover" placement="left-start" size="mini"
@command="(command) => handleCommand(command, scope.row)">
<el-button size="mini" type="text">更多<i class="el-icon-caret-right"></i></el-button>
<el-dropdown-menu slot="dropdown" class="dropdown-max">
<el-dropdown-item command="handlePublish" v-if="scope.row.status != 1">发布</el-dropdown-item>
<el-dropdown-item command="handleDown" v-if="scope.row.status == 1">下架</el-dropdown-item>
<el-dropdown-item command="handleEdit" v-if="scope.row.status != 1">编辑</el-dropdown-item>
<el-dropdown-item command="handleConfig" v-if="scope.row.status != 1">名单配置</el-dropdown-item>
<el-dropdown-item command="handleDetail">详情</el-dropdown-item>
<el-dropdown-item command="handleDelete" v-if="scope.row.status != 1">删除</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown> -->
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :limit.sync="queryParams.pageSize" :page.sync="queryParams.pageNum" :total="total"
@pagination="getList" />
</div>
</template>
<script>
import { listWhitelist, delWhitelist, publishWhitelist, soldOutWhitelist } from "@/api/FDS/whiteList";
export default {
name: "WhiteList",
dicts: ["white_mode", 'whitelist_type', 'release_status'],
data () {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
datalist: [],
//
title: "",
//
addOpen: false,
//
configOpen: false,
//
dateRange: [],
//
queryParams: {
pageNum: 1,
pageSize: 10,
whitelistName: undefined,
whitelistType: undefined,
status: undefined,
},
//
form: {},
//
configForm: {
addMode: 1,
whitelistType: undefined,
whitelistName: undefined,
},
};
},
created () {
this.getList();
},
methods: {
/** 查询参数列表 */
getList () {
this.loading = true;
listWhitelist(this.addDateRange2(this.queryParams, this.dateRange)).then(response => {
// listConfig(this.addDateRange(this.queryParams, this.dateRange)).then(
this.datalist = response.rows;
this.total = response.total;
this.loading = false;
}
);
},
//
reset () {
this.form = {
configId: undefined,
configName: undefined,
configKey: undefined,
configValue: undefined,
configType: "Y",
remark: undefined,
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery () {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery () {
this.dateRange = [];
this.resetForm("queryForm");
this.handleQuery();
},
/** 新增按钮操作 */
handleAdd () {
const params = {
type: "add",
};
this.$tab.openPage("新增白名单", "/build/whiteAdd/", params);
},
//
handleSelectionChange (selection) {
this.ids = selection.map((item) => item.id);
this.single = selection.length != 1;
this.multiple = !selection.length;
},
/** 修改按钮操作 */
handleEdit (row) {
// E: \zhongtianBase\smarterFramework\sf - ui\src\views\deployment\whitelist\edit.vue
const params = {
type: "edit",
id: row.id
};
this.$tab.openPage("编辑白名单", "/build/whiteEdit/", params);
},
/** 白名单配置弹窗 **/
handleConfig (row) {
this.reset();
this.$router.push({
path: "/build/addConfig",
query: {
id: row.id,
whitelistType: row.whitelistType
}
});
},
/** 删除按钮操作 */
handleDelete (row) {
const configIds = row.id || this.ids;
this.$modal
.confirm('是否确认删除编号为"' + configIds + '"的数据项?')
.then(function () {
return delWhitelist(configIds);
})
.then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
})
.catch(() => { });
},
/** 发布按钮操作 */
handlePublish (row) {
const configIds = row.id || this.ids;
this.$modal
.confirm('是否确认发布编号为"' + configIds + '"的数据项?')
.then(function () {
//
return publishWhitelist(configIds);
})
.then(() => {
this.getList();
this.$modal.msgSuccess("发布成功");
})
.catch(() => { });
},
/** 下架按钮操作 */
handleDown (row) {
const configIds = row.id || this.ids;
this.$modal
.confirm('是否确认下架编号为"' + configIds + '"的数据项?')
.then(function () {
//
return soldOutWhitelist(configIds);
})
.then(() => {
this.getList();
this.$modal.msgSuccess("下架成功");
})
.catch(() => { });
},
/** 查看详情按钮操作 */
handleDetail (row) {
if (row.type == 1) {
this.$router.push({
path: "/build/whitelistDetail",
query: {
id: row.id,
whitelistType: row.whitelistType
}
});
} else {
this.$router.push({
path: "/build/whitelistDetail",
query: {
id: row.id,
whitelistType: row.whitelistType
}
});
}
},
//
handleCommand (command, row) {
switch (command) {
case "handlePublish":
this.handlePublish(row);
break;
case "handleDown":
this.handleDown(row);
break;
case "handleEdit":
this.handleEdit(row);
break;
case "handleConfig":
this.handleConfig(row);
break;
case "handleDetail":
this.handleDetail(row);
break;
case "handleDelete":
this.handleDelete(row);
break;
default:
break;
}
},
filterTagWhitelistType (value, row) {
return row.whitelistType === Number(value);
},
filterTagWhitelistMode (value, row) {
return row.whitelistMode === Number(value);
},
filterTagStatus (value, row) {
return row.status === Number(value);
},
},
};
</script>
<style lang="scss" scoped></style>

View File

@ -1,19 +1,12 @@
<template>
<div>
<el-table
ref="table"
v-loading="loading"
:data="tableData"
max-height="500"
@selection-change="handleSelectionChange"
@row-click="handleRowClick"
>
<el-table v-loading="loading" :data="tableData" max-height="500" @selection-change="handleSelectionChange">
<el-table-column align="center" type="selection" width="55"/>
<template v-for="item in tableOptions">
<el-table-column
v-if="item.type === 'slot'"
:key="`${item.prop}_slot`"
:key="item.prop"
:label="item.label"
:width="item.width"
:fixed="item.fixed"
@ -72,22 +65,9 @@ export default {
created() {
},
methods: {
handleRowClick(row) {
this.$refs.table.toggleRowSelection(row);
},
handleSelectionChange(val) {
this.multipleSelection = val;
this.$emit('chooseChange', val);
},
setCheckedRows(rows) {
const ids = rows.map(item => item.id);
this.$nextTick(() => {
this.tableData.forEach((row) => {
if (ids.includes(row.id)) {
this.$refs.table.toggleRowSelection(row, true);
}
})
})
}
}
}

View File

@ -1,355 +0,0 @@
<template>
<div class="app-container-flex">
<el-container>
<el-header>
<el-row type="flex" justify="space-between">
<span>网关设置</span>
<div>
<el-button
type="primary"
size="mini"
:icon="editable ? 'el-icon-close' : `el-icon-edit`"
plain
@click="handleToggle"
:disabled="loading || btnLoading"
>{{ editable ? '取消' : '编辑' }}</el-button>
<el-button
type="primary"
size="mini"
icon="el-icon-setting"
plain
@click="handleSyncConfig"
:disabled="loading || btnLoading || syncLoading"
>同步配置</el-button>
</div>
</el-row>
<el-divider class="mt10 mb10" />
</el-header>
<el-main v-loading="loading">
<el-form
ref="form"
:model="form"
:rules="rules"
label-position="left"
size="mini"
:disabled="!editable"
:validate-on-rule-change="false"
>
<el-row :gutter="40">
<!-- <el-col :span="24">
<el-form-item label="限流">
<el-switch v-model="limiting" />
</el-form-item>
</el-col> -->
<el-col :span="12">
<el-form-item label="API限流默认配置" prop="apiCurrentLimitingStatus" label-width="145px">
<template slot="label">
<span>API限流默认配置</span>
<el-popover
placement="top-start"
width="360"
trigger="hover"
>
<span slot="reference"><i class="el-icon-info ml10"></i></span>
<p class="tip">1.对开启默认限流配置开关之前的历史API不受影响</p>
<p class="tip">2.对已经生效了的使用默认限流配置的API在下次修改默认配置时同样会生效</p>
<p class="tip">3.单个API限流配置会覆盖API默认限流配置</p>
</el-popover>
</template>
<el-switch v-model="form.apiCurrentLimitingStatus" active-value="1" inactive-value="0" />
</el-form-item>
<el-form-item label="限流阈值" prop="apiCurrentLimitingThreshold" label-width="106px">
<el-input-number
v-model="form.apiCurrentLimitingThreshold"
placeholder="设置限流的阈值,即允许通过的请求次数或者并发连接数"
:min="1"
:controls="false"
/>
</el-form-item>
<el-form-item label="限流时间窗口" prop="apiCurrentLimitingTimeWindow" label-width="106px">
<el-input-number
v-model="form.apiCurrentLimitingTimeWindow"
placeholder="请输入限流时间窗口"
:min="1"
:controls="false"
/>
</el-form-item>
<el-form-item label="限流响应" prop="apiCurrentLimitingDefaultResponse">
<el-input
v-model="form.apiCurrentLimitingDefaultResponse"
:autosize="{ minRows: 4, maxRows: 4}"
type="textarea"
placeholder="限流响应JSON字符串"
/>
</el-form-item>
<el-form-item label="数据加密" prop="dataEncryptionStatus">
<el-switch v-model="form.dataEncryptionStatus" active-value="1" inactive-value="0" />
</el-form-item>
<el-form-item label="加密算法" prop="encryptionAlgorithm" label-width="80px">
<el-radio-group v-model="form.encryptionAlgorithm">
<el-radio label="ECC" border>ECC</el-radio>
<el-radio label="RSA" border>RSA</el-radio>
<el-radio label="SM2" border>国密</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item :label="`${isRSA ? '私钥' : '秘钥'}内容`" prop="privateKey" label-width="80px">
<el-input
v-model="form.privateKey"
:autosize="{ minRows: 4, maxRows: 4}"
type="textarea"
:placeholder="`请输入${isRSA ? '私钥' : '秘钥'}内容`"
/>
</el-form-item>
<template v-if="isRSA">
<el-form-item label="公钥内容" prop="publicKey" label-width="80px">
<el-input
v-model="form.publicKey"
:autosize="{ minRows: 4, maxRows: 4}"
type="textarea"
placeholder="请输入公钥内容"
/>
</el-form-item>
</template>
</el-col>
<el-col :span="12">
<el-form-item label="APP限流默认配置" prop="appCurrentLimitingStatus" label-width="150px">
<template slot="label">
<span>APP限流默认配置</span>
<el-popover
placement="top-start"
width="360"
trigger="hover"
>
<span slot="reference"><i class="el-icon-info ml10"></i></span>
<p class="tip">1.对开启默认限流配置开关之前的历史APP不受影响</p>
<p class="tip">2.对已经生效了的使用默认限流配置的APP在下次修改默认配置时同样会生效</p>
<p class="tip">3.单个APP限流配置会覆盖APP默认限流配置</p>
</el-popover>
</template>
<el-switch v-model="form.appCurrentLimitingStatus" active-value="1" inactive-value="0" />
</el-form-item>
<el-form-item label="限流阈值" prop="appCurrentLimitingThreshold" label-width="106px">
<el-input-number
v-model="form.appCurrentLimitingThreshold"
placeholder="设置限流的阈值,即允许通过的请求次数或者并发连接数"
:min="1"
:controls="false"
/>
</el-form-item>
<el-form-item label="限流时间窗口" prop="appCurrentLimitingTimeWindow" label-width="106px">
<el-input-number
v-model="form.appCurrentLimitingTimeWindow"
placeholder="请输入限流时间窗口"
:min="1"
:controls="false"
/>
</el-form-item>
<el-form-item label="限流响应" prop="appCurrentLimitingDefaultResponse">
<el-input
v-model="form.appCurrentLimitingDefaultResponse"
:autosize="{ minRows: 4, maxRows: 4}"
type="textarea"
placeholder="限流响应JSON字符串"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-main>
<el-footer v-if="editable">
<el-row type="flex" justify="end">
<el-button :disabled="btnLoading" @click="close">返回</el-button>
<el-button type="primary" :loading="btnLoading" @click="submitForm">保存</el-button>
</el-row>
</el-footer>
</el-container>
</div>
</template>
<script>
import { deepClone } from '@/utils'
import { getGatewayConfig, updateGatewayConfig, updateGatewaySync } from '@/api/gateway/config'
let CACHEFOEM;
export default {
data() {
return {
editable: false,
loading: false,
btnLoading: false,
syncLoading: false,
form: {
apiCurrentLimitingStatus: '0',
apiCurrentLimitingThreshold: void 0,
apiCurrentLimitingTimeWindow: void 0,
apiCurrentLimitingDefaultResponse: void 0,
appCurrentLimitingStatus: '0',
appCurrentLimitingThreshold: void 0,
appCurrentLimitingTimeWindow: void 0,
appCurrentLimitingDefaultResponse: void 0,
dataEncryptionStatus: '0',
encryptionAlgorithm: void 0,
privateKey: void 0,
publicKey: void 0,
},
}
},
computed: {
isRSA() {
return this.form.encryptionAlgorithm === 'RSA'
},
apiRequired() {
return this.form.apiCurrentLimitingStatus === '1'
},
appRequired() {
return this.form.appCurrentLimitingStatus === '1'
},
dataEncryRequired() {
return this.form.dataEncryptionStatus === '1'
},
rules() {
return {
// apiCurrentLimitingStatus: [
// { required: true, message: 'API', trigger: 'change' }
// ],
apiCurrentLimitingThreshold: [
{ required: this.apiRequired, message: '限流阈值不能为空', trigger: 'blur' }
],
apiCurrentLimitingTimeWindow: [
{ required: this.apiRequired, message: '限流时间窗口不能为空', trigger: 'blur' }
],
apiCurrentLimitingDefaultResponse: [
{ required: this.apiRequired, message: '限流响应不能为空', trigger: 'blur' }
],
// appCurrentLimitingStatus: [
// { required: true, message: 'APP', trigger: 'change' }
// ],
appCurrentLimitingThreshold: [
{ required: this.appRequired, message: '限流阈值不能为空', trigger: 'blur' }
],
appCurrentLimitingTimeWindow: [
{ required: this.appRequired, message: '限流时间窗口不能为空', trigger: 'blur' }
],
appCurrentLimitingDefaultResponse: [
{ required: this.appRequired, message: '限流响应不能为空', trigger: 'blur' }
],
// dataEncryptionStatus: [
// { required: true, message: '', trigger: 'change' }
// ],
encryptionAlgorithm: [
{ required: this.dataEncryRequired, message: '加密算法不能为空', trigger: 'change' }
],
privateKey: [
{ required: this.dataEncryRequired, message: '秘钥内容不能为空', trigger: 'blur' }
],
publicKey: [
{ required: this.dataEncryRequired, message: '公钥内容不能为空', trigger: 'blur' }
]
}
}
},
created() {
this.getDetail()
},
methods: {
async getDetail() {
try {
this.loading = true;
const {code, data} = await getGatewayConfig();
if (code === 200) {
Object.keys(this.form).forEach((key) => {
this.form[key] = data[key];
})
this.$nextTick(() => {
CACHEFOEM = deepClone(this.form);
})
}
this.loading = false;
} catch (error) {
this.loading = false;
}
},
async handleToggle() {
await this.validateChange();
if (this.editable) this.$refs.form.clearValidate();
this.editable = !this.editable;
},
async handleSyncConfig() {
await this.$modal.confirm('确定同步网关配置吗?', '提示', {
distinguishCancelAndClose: true,
confirmButtonText: '确定',
cancelButtonText: '取消'
})
try {
this.syncLoading = true;
const res = await updateGatewaySync();
if (res.code === 200) {
this.$modal.msgSuccess('同步配置成功')
this.getDetail();
} else {
this.$modal.msgError(res.msg || '同步配置失败')
}
this.syncLoading = false;
} catch (error) {
this.syncLoading = false;
}
},
async submitForm() {
// if (!this.apiRequired && !this.appRequired && !this.dataEncryRequired) {
// this.$modal.msgError('')
// return
// }
await this.$refs.form.validate();
try {
this.btnLoading = true;
await updateGatewayConfig(this.form);
this.$modal.msgSuccess('保存成功')
this.getDetail();
this.btnLoading = false;
} catch (error) {
this.$modal.msgError(error.message || '保存失败')
this.btnLoading = false;
}
},
validateChange() {
if (!this.editable || JSON.stringify(this.form) === JSON.stringify(CACHEFOEM)) {
return Promise.resolve();
}
return this.$modal.confirm('当前有未保存的配置,是否放弃修改?', '提示', {
distinguishCancelAndClose: true,
confirmButtonText: '确定',
cancelButtonText: '取消'
}).then(() => {
this.form = deepClone(CACHEFOEM);
})
},
close() {
this.validateChange().then(() => {
this.$tab.closePage();
})
}
}
}
</script>
<style lang="scss" scoped>
::v-deep.el-input-number {
width: 100%;
.el-input__inner {
text-align: left;
}
}
.el-icon-info {
color: #959595;
cursor: pointer;
}
.tip {
color: #999;
font-size: 14px;
margin: 0;
}
</style>

View File

@ -1,416 +0,0 @@
<template>
<div class="app-container-flex">
<el-container>
<el-header>
{{titleName}}
<el-divider/>
</el-header>
<el-main v-loading="loading">
<el-form ref="form" :model="form" :rules="rules" label-width="120px" label-position="right" :disabled="!editable">
<el-row :gutter="20">
<el-col :span="24">
<!-- <el-form-item label="策略类型" prop="strategyType">
<el-radio-group v-model="form.strategyType" @input="strategyTypeChange">
<el-radio
v-for="dict in dict.type.gateway_strategy_type"
:key="dict.value"
:label="dict.value"
:disabled="disabledType(dict.value)"
>{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item> -->
</el-col>
<el-col :span="8">
<el-form-item label="接口名称" prop="interfaceName">
<el-input v-model="form.interfaceName" clearable placeholder="请输入接口名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="接口编码" prop="apiCode">
<el-input v-model="form.apiCode" clearable placeholder="请输入接口编码" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="接口版本" prop="version">
<el-input v-model="form.version" placeholder="标识接口的版本号,用于版本控制和管理" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="接口描述" prop="description">
<el-input v-model="form.description" type="textarea" placeholder="对接口功能、参数、返回结果等进行描述" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="接口路径" prop="interfacePath">
<el-input v-model="form.interfacePath" placeholder="接口的访问路径或URL" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="选择服务" prop="serverId">
<el-select
v-model="form.serverId"
placeholder="请选择服务"
clearable
filterable
>
<el-option
v-for="item in serverList"
:key="item.id"
:label="item.serverName"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="请求方法" prop="requestMethod">
<el-select
v-model="form.requestMethod"
placeholder="请选择服务"
clearable
filterable
>
<el-option
v-for="item in dict.type.http_request_method"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<!-- <el-row :gutter="20">
<el-col :span="8"> -->
<el-form-item label="Mock" prop="mockStatus">
<el-switch v-model="form.mockStatus" active-value="1" inactive-value="0" />
</el-form-item>
<!-- </el-col>
</el-row> -->
</el-col>
<el-col :span="8">
<el-form-item label="超时时间" prop="timeout">
<template slot="label">
<span>超时时间</span>
<el-popover
placement="top-start"
trigger="hover"
>
<span slot="reference"><i class="el-icon-info ml10"></i></span>
<p class="tip">超时时间: 1-150000ms 默认3000ms 单位ms</p>
</el-popover>
</template>
<el-input-number
v-model="form.timeout"
placeholder="请输入超时时间"
:min="1"
:max="150000"
:controls="false"
/>
</el-form-item>
</el-col>
<template v-if="form.mockStatus === '1'">
<el-col :span="24">
<el-form-item label="Mock响应" prop="mockResponse">
<el-input
v-model="form.mockResponse"
type="textarea"
placeholder="Mock响应JSON字符串"
/>
</el-form-item>
</el-col>
</template>
<el-col :span="24">
<el-form-item label="接口文档" prop="document">
<file-upload
:value="documentList"
uploadFileUrl="/system/oss/upload"
:fileType="['doc', 'docx', 'md', 'pdf', 'txt']"
@change="handleChange"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="关联策略" prop="strategyIds">
<el-button type="primary" size="mini" @click="chooseStrategy">选择策略</el-button>
<div style="margin-top: 7px;position: relative;">
<el-tag
v-for="tag in strategyList"
style="margin: 2px 6px 2px 0;"
type="info"
:key="tag.id"
:closable="editable"
:disable-transitions="false"
@close="handleClose(tag)"
>
{{ tag.strategyName }}
</el-tag>
</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-main>
<el-footer class="footer">
<el-button :disabled="btnLoading" @click="close">取消</el-button>
<el-button v-if="editable" type="primary" :loading="btnLoading" @click="submitForm()">保存</el-button>
</el-footer>
</el-container>
<el-dialog title="选择策略" :visible.sync="open" :close-on-click-modal="false" width="1200px" append-to-body destroy-on-close>
<BaseSearch
:defaultValue="queryParams"
:queryOptions="queryOptions"
@query="handleQuery"
/>
<!-- v-loading="loading" -->
<BaseTable
ref="chooseTableRef"
:tableData="tableData"
:tableOptions="tableOptions"
@chooseChange="chooseChange"
>
<template #strategyType="{ row }">
<dict-tag :options="dict.type.gateway_strategy_type" :value="row.strategyType"/>
</template>
</BaseTable>
<div slot="footer" class="dialog-footer">
<el-button @click="open = false"> </el-button>
<el-button type="primary" @click="chooseEnd"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import BaseSearch from '@/views/gateway/components/BaseSearch';
import BaseTable from '@/views/gateway/components/BaseTable';
import { deepClone } from '@/utils'
import { getInterface, addInterface, updateInterface } from "@/api/gateway/interface";
import { bindableServerList } from '@/api/gateway/server'
import { bindableStrategyList } from '@/api/gateway/strategy'
import EventBus from '@/utils/eventBus'
// let CACHEFOEM;
export default {
components: {
BaseSearch,
BaseTable,
},
dicts: ['gateway_strategy_type', 'http_request_method'],
data() {
return {
loading: false,
btnLoading: false,
serverList: [],
form: {
id: void 0,
interfaceName: void 0,
apiCode: void 0,
interfacePath: void 0,
requestMethod: 'POST',
description: void 0, //()
version: void 0,
document: void 0,
serverId: void 0, //id
strategyIds: [], //ids
mockStatus: '0',
timeout: void 0,
mockResponse: void 0,
},
strategyList: [],
documentList: [],
rules: {
interfaceName: [
{ required: true, message: '接口名称不能为空', trigger: 'blur' }
],
apiCode: [
{ required: true, message: '接口编码不能为空', trigger: 'blur' }
],
interfacePath: [
{ required: true, message: '接口路径不能为空', trigger: 'blur' }
],
serverId: [
{ required: true, message: '服务不能为空', trigger: 'change' }
],
requestMethod: [
{ required: true, message: '请求方法不能为空', trigger: 'change' }
],
// strategyIds: [
// { required: true, type: 'array', message: '', trigger: 'change' }
// ],
version: [
{ required: true, message: '接口版本不能为空', trigger: 'blur' }
],
mockResponse: [
{ required: true, message: 'Mock响应数据不能为空', trigger: 'blur' }
]
},
open: false,
queryParams: {},
tableData: [],
tableOptions: [
{ type: 'slot', label: '策略类型', prop: 'strategyType', width: '120' },
{ label: '策略名称', prop: 'strategyName' },
{ label: '策略描述', prop: 'description' },
],
multipleSelection: [],
}
},
computed: {
editable() {
return this.$route.query.type !== 'detail'
},
titleName() {
if (!this.editable) {
return '接口详情'
}
return this.$route.query.id ? '编辑接口' : '新增接口'
},
queryOptions() {
return [
{ label: '策略名称', prop: 'strategyName', type: 'input' },
{ label: '策略类型', prop: 'strategyType', type: 'select', dicts: this.dict.type.gateway_strategy_type },
]
}
},
created() {
this.init();
this.getDetail()
},
activated() {
this.getDetail()
},
methods: {
init() {
bindableServerList().then((list) => {
this.serverList = list;
})
},
async getDetail() {
const { id } = this.$route.query
if (id) {
this.loading = true;
try {
const { data } = await getInterface(id)
this.reset();
Object.keys(this.form).forEach(key => {
if (data[key] !== void 0) {
this.$set(this.form, key, data[key])
}
})
this.form.timeout = data.timeout ?? void 0;
this.strategyList = data.strategyList;
this.documentList = data.document ? [data.document] : [];
this.form.strategyIds = data.strategyList.map(item => item.id);
// CACHEFOEM = deepClone(data);
} catch (error) {
this.$message.error(error.message || '请求失败')
}
this.loading = false;
}
},
handleChange(files) {
this.documentList = files;
const [file] = files;
if (!file) this.form.document = null;
const {id, fileName, originalName, fileSuffix, url, size} = file;
this.form.document = { id, fileName, originalName, fileSuffix, url, size };
},
//
reset() {
this.form = {
id: void 0,
interfaceName: void 0,
apiCode: void 0,
interfacePath: void 0,
requestMethod: 'POST',
description: void 0, //()
version: void 0,
document: void 0,
serverId: void 0, //id
strategyIds: [], //ids
mockStatus: '0',
timeout: void 0,
mockResponse: void 0,
};
this.resetForm("form");
},
async submitForm() {
const request = this.form.id != null ? updateInterface : addInterface;
const msg = this.form.id != null ? '修改' : '新增';
await this.$refs.form.validate();
try {
const params = {
...this.form,
strategyIds: this.strategyList.map(item => item.id)
}
this.btnLoading = true;
await request(params);
this.$modal.msgSuccess(`${msg}成功`);
EventBus.$emit('reloadInterfaceList');
this.btnLoading = false;
this.close();
} catch (error) {
this.$modal.msgError(`${msg}失败`);
this.btnLoading = false;
}
},
close() {
this.$tab.closePage();
},
chooseStrategy() {
this.open = true;
this.handleQuery(this.queryParams);
},
handleQuery(form) {
bindableStrategyList(form).then((res) => {
this.tableData = res;
this.$refs.chooseTableRef.setCheckedRows(this.strategyList);
})
},
handleClose(tag) {
this.strategyList = this.strategyList.filter((item) => {
return item.id !== tag.id
})
},
chooseChange(rows) {
this.multipleSelection = rows;
},
chooseEnd() {
this.strategyList = deepClone(this.multipleSelection);
this.form.strategyIds = this.strategyList.map(item => item.id);
this.open = false;
}
}
}
</script>
<style lang="scss" scoped>
.footer {
display: flex;
align-items: center;
justify-content: flex-end;
}
::v-deep.el-select {
width: 100%;
}
::v-deep.el-input-number {
width: 100%;
.el-input__inner{
text-align: left;
}
}.el-icon-info {
color: #959595;
cursor: pointer;
}
.tip {
color: #999;
font-size: 14px;
margin: 0;
}
</style>

View File

@ -1,5 +1,5 @@
<template>
<div class="app-container-flex">
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="接口名称" prop="interfaceName">
<el-input
@ -36,7 +36,7 @@
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb14">
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
@ -69,7 +69,7 @@
v-hasPermi="['gateway:interface:remove']"
>批量删除</el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-col :span="1.5">
<el-button
type="warning"
plain
@ -78,49 +78,29 @@
@click="handleExport"
v-hasPermi="['gateway:interface:export']"
>导出</el-button>
</el-col> -->
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="interfaceList" @selection-change="handleSelectionChange" height="100%">
<el-table v-loading="loading" :data="interfaceList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="关联服务" min-width="180" prop="serverName">
<template slot-scope="scope">
<el-button @click="handleServerDetail(scope.row)" type="text">{{scope.row.serverName}}</el-button>
</template>
</el-table-column>
<el-table-column label="接口名称" min-width="180" show-overflow-tooltip prop="interfaceName">
<template slot-scope="scope">
<el-button @click="handleUpdate(scope.row, 'detail')" type="text">{{scope.row.interfaceName}}</el-button>
</template>
</el-table-column>
<el-table-column label="接口编码" min-width="150" show-overflow-tooltip prop="apiCode" />
<el-table-column label="接口路径" min-width="150" show-overflow-tooltip prop="interfacePath" />
<el-table-column label="接口描述" min-width="180" show-overflow-tooltip prop="description" />
<el-table-column label="接口文档" min-width="200" show-overflow-tooltip prop="document" />
<el-table-column label="请求方式" min-width="100" prop="requestMethod">
<el-table-column label="接口ID" width="60" align="center" prop="id" />
<el-table-column label="接口名称" align="center" show-overflow-tooltip prop="interfaceName" />
<el-table-column label="接口路径" align="center" show-overflow-tooltip prop="interfacePath" />
<el-table-column label="接口描述" align="center" show-overflow-tooltip prop="description" />
<el-table-column label="接口文档" align="center" show-overflow-tooltip prop="document" />
<el-table-column label="请求方式" width="80" align="center" prop="requestMethod">
<template slot-scope="scope">
<dict-tag :options="dict.type.http_request_method" :value="scope.row.requestMethod"/>
</template>
</el-table-column>
<el-table-column label="接口版本" min-width="100" prop="version" />
<el-table-column label="接口状态" min-width="100" align="center" prop="status">
<el-table-column label="接口版本" width="100" align="center" prop="version" />
<el-table-column label="接口状态" width="80" align="center" prop="status">
<template slot-scope="scope">
<dict-tag :options="dict.type.gateway_data_status" :value="scope.row.status"/>
</template>
</el-table-column>
<!-- <el-table-column label="创建者" width="100" prop="created" /> -->
<el-table-column label="创建时间" min-width="120" prop="createTime">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<!-- <el-table-column label="更新时间" align="center" prop="updateTime" width="100">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column> -->
<el-table-column label="操作" width="180" fixed="right" class-name="small-padding fixed-width">
<el-table-column label="操作" align="center" width="150" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
@ -128,7 +108,7 @@
icon="el-icon-edit"
@click="handleStatus(scope.row)"
v-hasPermi="['gateway:interface:edit']"
>{{scope.row.status === '0' ? '启用' : '禁用' }}</el-button>
>{{scope.row === '0' ? '启用' : '禁用' }}</el-button>
<el-button
size="mini"
type="text"
@ -156,7 +136,7 @@
/>
<!-- 添加或修改接口管理对话框 -->
<!-- <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
<el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="接口名称" prop="interfaceName">
<el-input v-model="form.interfaceName" placeholder="请输入接口名称" />
@ -187,12 +167,11 @@
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog> -->
</el-dialog>
</div>
</template>
<script>
import EventBus from '@/utils/eventBus'
import { listInterface, getInterface, delInterface, addInterface, updateInterface, changeInterfaceStatus } from "@/api/gateway/interface";
export default {
@ -215,9 +194,9 @@ export default {
//
interfaceList: [],
//
// title: "",
// //
// open: false,
title: "",
//
open: false,
//
daterangeCreateTime: [],
//
@ -229,28 +208,23 @@ export default {
createTime: null,
},
//
// form: {},
// //
// rules: {
// interfaceName: [
// { required: true, message: "", trigger: "blur" }
// ],
// interfacePath: [
// { required: true, message: "", trigger: "blur" }
// ],
// requestMethod: [
// { required: true, message: "", trigger: "change" }
// ],
// }
form: {},
//
rules: {
interfaceName: [
{ required: true, message: "接口名称不能为空", trigger: "blur" }
],
interfacePath: [
{ required: true, message: "接口路径不能为空", trigger: "blur" }
],
requestMethod: [
{ required: true, message: "请求方式不能为空", trigger: "change" }
],
}
};
},
created() {
this.getList();
EventBus.$on("reloadInterfaceList",this.getList);
},
beforeDestroy() {
EventBus.$off('reloadInterfaceList', this.getList);
},
methods: {
/** 查询接口管理列表 */
@ -270,31 +244,27 @@ export default {
});
},
//
// cancel() {
// this.open = false;
// this.reset();
// },
// //
// reset() {
// this.form = {
// id: null,
// interfaceName: null,
// interfacePath: null,
// requestMethod: null,
// description: null,
// version: null,
// status: null,
// document: null,
// createBy: null,
// createTime: null,
// updateBy: null,
// updateTime: null
// };
// this.resetForm("form");
// },
handleServerDetail(row) {
// console.log(row.serverId, '')
this.$router.push({path: '/gateway/server-detail', query: {id: row.serverId}})
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
interfaceName: null,
interfacePath: null,
requestMethod: null,
description: null,
version: null,
status: null,
document: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
@ -316,27 +286,19 @@ export default {
},
/** 新增按钮操作 */
handleAdd() {
// this.reset();
// this.open = true;
// this.title = "";
this.$router.push({path: '/gateway/interface-edit'})
this.reset();
this.open = true;
this.title = "添加接口管理";
},
/** 修改按钮操作 */
handleUpdate(row, type) {
// this.reset();
const id = row.id;
// getInterface(id).then(response => {
// this.form = response.data;
// this.open = true;
// this.title = "";
// });
this.$router.push({
path: '/gateway/interface-edit',
query: {
id,
type
}
})
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getInterface(id).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改接口管理";
});
},
/** 启用/禁用按钮操作 */
handleStatus(row) {
@ -354,30 +316,30 @@ export default {
})
},
/** 提交按钮 */
// submitForm() {
// this.$refs["form"].validate(valid => {
// if (valid) {
// if (this.form.id != null) {
// let data = Object.assign({},this.form)
// delete data.explain
// updateInterface(data).then(response => {
// this.$modal.msgSuccess("");
// this.open = false;
// this.getList();
// });
// } else {
// addInterface(this.form).then(response => {
// this.$modal.msgSuccess("");
// this.open = false;
// this.getList();
// });
// }
// }
// });
// },
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
let data = Object.assign({},this.form)
delete data.explain
updateInterface(data).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addInterface(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row?.id || this.ids;
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除接口管理编号为"' + ids + '"的数据项?').then(function() {
return delInterface(ids);
}).then(() => {

View File

@ -1,220 +0,0 @@
<template>
<div class="app-container-flex">
<el-container>
<el-header>
{{titleName}}
<el-divider/>
</el-header>
<el-main>
<el-form ref="form" :model="form" :rules="rules" label-width="120px" label-position="right" :disabled="!editable">
<el-row :gutter="20">
<el-col :span="16">
<el-form-item label="路由名称" prop="routeName">
<el-input v-model="form.routeName" placeholder="路由规则的名称" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="后端协议类型" prop="requestProtocol">
<el-select v-model="form.requestProtocol">
<el-option label="HTTP" value="HTTP" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="路由方式" prop="routeType">
<el-radio-group v-model="form.routeType" @change="handleRouteTypeChange">
<el-radio label="WEIGHT_ROUTE">权重路由</el-radio>
<el-radio label="HEADER_ROUTE">请求头路由</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="规则详情" prop="routeContent">
<EditTable
ref="editTable"
:editable="editable"
:routeType="form.routeType"
:value="form.routeContent"
:loading="tableLoading"
@validate="$refs.form.validateField('routeContent')"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="路由状态探活" prop="routeStatusActiveMonitoring">
<el-switch
v-model="form.routeStatusActiveMonitoring"
active-value="1"
inactive-value="0">
</el-switch>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="路径path" prop="routeActiveMonitoringPath">
<el-input v-model="form.routeActiveMonitoringPath" placeholder="默认'/'" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="超时时间" prop="routeActiveMonitoringTimeout">
<el-input-number
v-model="form.routeActiveMonitoringTimeout"
placeholder="请输入超时时间"
:min="1"
:controls="false"
/>
<span class="ml10">ms</span>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-main>
<el-footer class="footer">
<el-button :disabled="btnLoading" @click="close">取消</el-button>
<el-button v-if="editable" :loading="btnLoading" type="primary" @click="submitForm">保存</el-button>
</el-footer>
</el-container>
</div>
</template>
<script>
import EventBus from '@/utils/eventBus';
import { deepClone } from '@/utils'
import { addRoute, getRoute, updateRoute } from "@/api/gateway/route";
import EditTable from './editTable.vue'
//
let CACHEFOEM = {};
export default {
components: { EditTable },
data() {
const checkRouteContent = async(rule, value, callback) => {
try {
await this.$refs.editTable.validtorTable()
callback()
} catch (error) {
callback(error)
}
};
return {
tableLoading: false,
btnLoading: false,
form: {
routeName: '',
requestProtocol: 'HTTP',
routeType: 'WEIGHT_ROUTE',
routeContent: [
// {
// weight: 0,
// serverAddress: '',
// headerKey: '',
// headerValues: '',
// matchType: '',
// }
],
routeStatusActiveMonitoring: '1', // 0 1
routeActiveMonitoringPath: '/',
routeActiveMonitoringTimeout: 3000,
},
rules: {
routeName: [
{ required: true, message: '路由名称不能为空', trigger: 'blur' }
],
routeContent:[
{ required: true, type: 'array', message: '规则详情不能为空' },
{ validator: checkRouteContent, trigger: 'blur' }
]
}
}
},
computed: {
editable() {
return this.$route.query.type !== 'detail'
},
titleName() {
if (!this.editable) {
return '路由详情'
}
return this.$route.query.id ? '编辑路由' : '新增路由'
},
newRow() {
const weightRow = { weight: 0, serverAddress: '' };
const headerRow = { headerKey: '', headerValues: [], matchType: '' };
return this.form.routeType === 'WEIGHT_ROUTE' ? weightRow : headerRow;
}
},
created() {
this.getDetail()
},
activated() {
this.getDetail()
},
methods: {
getDetail() {
CACHEFOEM = {};
const { id } = this.$route.query
if (id) {
getRoute(id).then(res => {
const { routeContent, ...args } = res.data;
this.form = {
...args,
routeContent: JSON.parse(routeContent)
};
CACHEFOEM = deepClone(this.form)
})
}
},
handleRouteTypeChange(val) {
this.tableLoading = true;
if (val === CACHEFOEM.routeType) {
this.form.routeContent = [...CACHEFOEM.routeContent];
} else {
this.form.routeContent = [];
}
this.$refs.form.clearValidate('routeContent');
this.$nextTick(() => {
this.tableLoading = false;
})
},
handleAddRow() {
this.form.routeContent.unshift({...this.newRow})
},
handleDeleteRow(index) {
this.form.routeContent.splice(index, 1)
},
async submitForm() {
const request = this.form.id != null ? updateRoute : addRoute;
const msg = this.form.id != null ? '修改' : '新增';
await this.$refs.form.validate();
try {
this.btnLoading = true
await request(this.form);
this.btnLoading = false;
this.$modal.msgSuccess(`${msg}成功`);
EventBus.$emit('reloadRouteList');
this.close();
} catch (error) {
this.btnLoading = false;
this.$modal.msgError(`${msg}失败`);
}
},
close() {
// this.$refs.form.resetFields();
this.$tab.closePage();
},
}
}
</script>
<style lang="scss" scoped>
.footer {
display: flex;
align-items: center;
justify-content: flex-end;
}
::v-deep.el-select {
width: 100%;
}
::v-deep.el-input-number .el-input__inner{
text-align: left;
}
</style>

View File

@ -1,277 +0,0 @@
<template>
<div>
<el-row type="flex" justify="end">
<el-button
v-if="editable"
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAddRow"
>新增一行</el-button>
</el-row>
<el-form :model="formModel" ref="form" class="table-form" @validate="validateForm">
<el-table v-loading="loading" :data="formModel.tableData" style="margin-top: 10px;" max-height="400" border>
<template v-if="routeType === 'WEIGHT_ROUTE'">
<el-table-column prop="weight" width="240" key="weight">
<template slot="header">
<span class="required-asterisk">流量占比(%)</span>
</template>
<template slot-scope="{row, $index}">
<template v-if="!editable">{{ row.weight }}</template>
<template v-else>
<el-form-item
:prop="`tableData[${$index}].weight`"
:rules="[
{ required: true, message: '流量占比不能为空', trigger: 'blur' },
{ type: 'number', message: '流量占比必须为数字值', trigger: 'blur' }
]"
>
<el-input-number
v-model="tableData[$index].weight"
placeholder="请输入流量占比"
:min="0"
:max="100"
:controls="false"
/>
</el-form-item>
</template>
</template>
</el-table-column>
</template>
<template v-else>
<el-table-column prop="headerKey" key="headerKey">
<template slot="header">
<span class="required-asterisk">参数名</span>
</template>
<template slot-scope="{row, $index}">
<template v-if="!editable">{{ row.headerKey }}</template>
<template v-else>
<el-form-item
:prop="`tableData[${$index}].headerKey`"
:rules="[
{ required: true, message: '参数名不能为空', trigger: 'blur' },
{ pattern: /^[a-zA-Z0-9\_]+$/, message: '参数名只能是字母数字和下划线组合', trigger: 'blur' }
]"
>
<el-input v-model="tableData[$index].headerKey" clearable placeholder="请输入参数名"/>
</el-form-item>
</template>
</template>
</el-table-column>
<el-table-column prop="matchType" label="匹配方式" key="matchType">
<template slot="header">
<span class="required-asterisk">匹配方式</span>
</template>
<template slot-scope="{row, $index}">
<template v-if="!editable">{{ {'EQ': '完全匹配', 'IN': '模式匹配'}[row.matchType] }}</template>
<template v-else>
<el-form-item
:prop="`tableData[${$index}].matchType`"
:rules="{
required: true, message: '匹配方式不能为空', trigger: 'change'
}"
>
<el-select v-model="value[$index].matchType" @change="$refs.form.validateField(`tableData[${$index}].headerValues`)">
<el-option label="完全匹配" value="EQ" />
<el-option label="模式匹配" value="IN" />
</el-select>
</el-form-item>
</template>
</template>
</el-table-column>
<el-table-column prop="headerValues" label="参数值" key="headerValues">
<template slot="header">
<span class="required-asterisk">参数值</span>
<el-tooltip class="item" effect="dark" placement="top">
<div slot="content">完全匹配为精准匹配只能匹配一个参数值<br/>IN 模糊匹配支持输入多个值输入单个值后<br/>需使用分号分隔第二行信息</div>
<i class="el-icon-info ml10"></i>
</el-tooltip>
</template>
<template slot-scope="{row, $index}">
<template v-if="!editable">{{ row.headerValues.join(';') }}</template>
<template v-else>
<el-form-item
:prop="`tableData[${$index}].headerValues`"
:rules="{
validator: (rule, value, callback) => {
validatorHeaderValues($index, value, callback)
}, trigger: 'blur'
}"
>
<el-input
v-if="tableData[$index].headerValues"
:value="tableData[$index].headerValues.join(';')"
@input="tableData[$index].headerValues = $event.split(';')"
placeholder="请输入参数值"
clearable
/>
</el-form-item>
</template>
</template>
</el-table-column>
</template>
<el-table-column prop="serverAddress" label="服务地址" key="serverAddress">
<template slot="header">
<span class="required-asterisk">服务地址</span>
</template>
<template slot-scope="{row, $index}">
<template v-if="!editable">{{ row.serverAddress }}</template>
<template v-else>
<el-form-item
:prop="`tableData[${$index}].serverAddress`"
:rules="[
{ required: true, message: '服务地址不能为空', trigger: 'blur' },
{ pattern: /^(https?:\/\/)?((?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]|localhost|\d{1,3}(?:\.\d{1,3}){3})(?::\d+)?$/, message: '请输入正确的服务地址', trigger: 'blur' }
]"
>
<el-input
v-model="tableData[$index].serverAddress"
placeholder="请输入服务地址"
clearable
/>
</el-form-item>
</template>
</template>
</el-table-column>
<el-table-column v-if="editable" prop="address" label="操作" width="80">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDeleteRow(scope.$index)"
>删除</el-button>
</template>
</el-table-column>
</el-table>
</el-form>
</div>
</template>
<script>
export default {
name: 'WeightTable',
props: {
editable: {
type: Boolean,
default: true
},
routeType: {
type: String,
default: 'WEIGHT_ROUTE'
},
value: {
type: Array,
default: () => {
return []
}
},
loading: {
type: Boolean,
default: false
}
},
data() {
return {
}
},
computed: {
tableData: {
get() {
return this.value
},
set(val) {
this.$emit('input', val)
}
},
formModel() {
return {
tableData: this.tableData
}
}
},
methods: {
// 100
validtorTable() {
return new Promise((resolve, reject) => {
if (this.tableData.length === 0) {
reject(new Error('请添加规则详情'))
}
const hasEmty = this.tableData.some(item => {
const values = this.routeType === 'WEIGHT_ROUTE' ? ['weight', 'serverAddress'] : ['headerKey', 'headerValues', 'matchType', 'serverAddress'];
return values.some(key => {
return item[key] === '' || item[key] === null || item[key] === void 0
})
})
if (hasEmty) {
reject(new Error('请填写完整'))
}
if (this.routeType === 'WEIGHT_ROUTE') {
const weightCount = this.tableData.reduce((acc, cur) => {
return acc + cur.weight;
}, 0);
if (weightCount !== 100) {
reject(new Error('流量占比之和必须为100'))
}
}
resolve()
})
},
validatorHeaderValues(index, value, callback) {
if (value.length === 0) {
callback(new Error('参数值不能为空'))
}
const row = this.tableData[index];
if (row.matchType === 'EQ' && value.length > 1) {
callback(new Error('完全匹配为精准匹配,只能匹配一个参数值'))
}
callback()
},
handleAddRow() {
const weightRow = { weight: 0, serverAddress: '' };
const headerRow = { headerKey: '', headerValues: [], matchType: '' };
const newRow = this.routeType === 'WEIGHT_ROUTE' ? weightRow : headerRow;
this.tableData.unshift(newRow)
},
handleDeleteRow(index) {
this.tableData.splice(index, 1)
this.$emit('validate')
},
//
// validtorFrom() {
// return new Promise(async(resolve, reject) => {
// try {
// await this.$refs.form.validate();
// resolve()
// } catch (error) {
// reject(new Error(''))
// }
// })
// },
validateForm(key, res) {
this.$emit('validate')
}
}
}
</script>
<style lang="scss" scoped>
// ::v-deep.el-form-item {
// }
.table-form {
::v-deep.el-form-item {
margin-bottom: 22px;
&.is-error .el-input__inner {
border-color: #ff4949;
}
.el-input__inner {
border-color: #DCDFE6;
}
}
}
::v-deep.el-input-number .el-input__inner{
text-align: left;
}
</style>

View File

@ -1,5 +1,5 @@
<template>
<div class="app-container-flex">
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="路由名称" prop="routerName">
<el-input
@ -10,14 +10,12 @@
/>
</el-form-item>
<el-form-item label="请求方式" prop="requestMethod">
<el-select v-model="queryParams.requestMethod" clearable placeholder="请选择请求方式">
<el-option
v-for="dict in dict.type.http_request_method"
:key="dict.value"
:label="dict.label"
:value="dict.value"
<el-input
v-model="queryParams.requestMethod"
placeholder="请输入请求方式"
clearable
@keyup.enter.native="handleQuery"
/>
</el-select>
</el-form-item>
<el-form-item label="创建人" prop="createBy">
<el-input
@ -44,7 +42,7 @@
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb14">
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
@ -55,17 +53,17 @@
v-hasPermi="['gateway:route:add']"
>新增</el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleDetail"
@click="handleUpdate"
v-hasPermi="['gateway:route:edit']"
>修改</el-button>
</el-col> -->
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
@ -75,9 +73,9 @@
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['gateway:route:remove']"
>批量删除</el-button>
>删除</el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-col :span="1.5">
<el-button
type="warning"
plain
@ -86,47 +84,36 @@
@click="handleExport"
v-hasPermi="['gateway:route:export']"
>导出</el-button>
</el-col> -->
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="routeList" @selection-change="handleSelectionChange" height="100%">
<el-table v-loading="loading" :data="routeList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="路由名称" prop="routeName" min-width="150">
<el-table-column label="ID" align="center" prop="id" />
<el-table-column label="路由名称" align="center" prop="routerName" />
<el-table-column label="请求路径" align="center" prop="requestPath" />
<el-table-column label="请求方式" align="center" prop="requestMethod">
<template slot-scope="scope">
<el-button @click="handleDetail(scope.row, 'detail')" type="text">{{scope.row.routeName}}</el-button>
<dict-tag :options="dict.type.http_request_method" :value="scope.row.requestMethod"/>
</template>
</el-table-column>
<el-table-column label="路由方式" prop="routeType" min-width="100">
<template slot-scope="scope">
{{{'WEIGHT_ROUTE': '权重路由', 'HEADER_ROUTE': '请求头路由'}[scope.row.routeType]}}
</template>
</el-table-column>
<el-table-column label="协议" prop="requestProtocol" min-width="100" />
<el-table-column label="路由活跃状态" align="center" prop="routeActiveStatus" min-width="100">
<template slot-scope="scope">
<!-- 0=探活未开启1=状态获取中2=正常3=异常 -->
<dict-tag :options="dict.type.route_active_status" :value="scope.row.routeActiveStatus"/>
</template>
</el-table-column>
<!-- <el-table-column label="创建人" align="center" prop="created" width="120" /> -->
<el-table-column label="创建时间" prop="createTime" min-width="100">
<el-table-column label="请求参数json格式" align="center" prop="requestParameter" />
<el-table-column label="服务地址" align="center" prop="serverAddress" />
<el-table-column label="服务器端口" align="center" prop="serverPort" />
<el-table-column label="创建人" align="center" prop="createBy" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<!-- <el-table-column label="更新时间" prop="updateTime" width="120">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column> -->
<el-table-column label="操作" fixed="right" width="150" class-name="small-padding fixed-width">
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleDetail(scope.row)"
@click="handleUpdate(scope.row)"
v-hasPermi="['gateway:route:edit']"
>修改</el-button>
<el-button
@ -147,16 +134,42 @@
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改路由管理对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="路由名称" prop="routerName">
<el-input v-model="form.routerName" placeholder="请输入路由名称" />
</el-form-item>
<el-form-item label="请求路径" prop="requestPath">
<el-input v-model="form.requestPath" placeholder="请输入请求路径" />
</el-form-item>
<el-form-item label="请求方式" prop="requestMethod">
<el-input v-model="form.requestMethod" placeholder="请输入请求方式" />
</el-form-item>
<el-form-item label="请求参数json格式" prop="requestParameter">
<el-input v-model="form.requestParameter" placeholder="请输入请求参数json格式" />
</el-form-item>
<el-form-item label="服务地址" prop="serverAddress">
<el-input v-model="form.serverAddress" placeholder="请输入服务地址" />
</el-form-item>
<el-form-item label="服务器端口" prop="serverPort">
<el-input v-model="form.serverPort" placeholder="请输入服务器端口" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import EventBus from '@/utils/eventBus'
import { listRoute, getRoute, delRoute, addRoute, updateRoute } from "@/api/gateway/route";
export default {
name: "Route",
dicts: ['http_request_method', 'route_active_status'],
data() {
return {
//
@ -188,15 +201,24 @@ export default {
createBy: null,
createTime: null,
},
//
form: {},
//
rules: {
routerName: [
{ required: true, message: "路由名称不能为空", trigger: "blur" }
],
requestPath: [
{ required: true, message: "请求路径不能为空", trigger: "blur" }
],
requestMethod: [
{ required: true, message: "请求方式不能为空", trigger: "blur" }
],
}
};
},
created() {
this.getList();
EventBus.$on("reloadRouteList",this.getList);
},
befoueDestroy() {
EventBus.$off('reloadRouteList', this.getList);
},
methods: {
/** 查询路由管理列表 */
@ -215,6 +237,28 @@ export default {
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
routerName: null,
requestPath: null,
requestMethod: null,
requestParameter: null,
serverAddress: null,
serverPort: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
@ -235,21 +279,45 @@ export default {
},
/** 新增按钮操作 */
handleAdd() {
this.$router.push({path: '/gateway/route-edit'});
this.reset();
this.open = true;
this.title = "添加路由管理";
},
/** 修改按钮操作 */
handleDetail(row, type) {
this.$router.push({
path: '/gateway/route-edit',
query: {
id: row.id,
type,
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getRoute(id).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改路由管理";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
let data = Object.assign({},this.form)
delete data.explain
updateRoute(data).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addRoute(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row?.id || this.ids;
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除路由管理编号为"' + ids + '"的数据项?').then(function() {
return delRoute(ids);
}).then(() => {

View File

@ -62,7 +62,7 @@ export default {
tableOptions: [
{ label: '接口ID', prop: 'id', width: '80' },
{ label: '接口名称', prop: 'interfaceName' },
{ label: '接口路', prop: 'interfacePath' },
{ label: '接口路', prop: 'interfacePath' },
{ label: '接口描述', prop: 'description' },
{ label: '接口版本', prop: 'version', width: '120' },
{ type: 'slot', prop: 'action', label: '操作', fixed: 'right', width: '100px' }

View File

@ -1,112 +0,0 @@
<template>
<div class="app-container-flex" v-loading="loading">
<el-container>
<el-header>
服务详情
<el-divider/>
</el-header>
<el-main>
<el-descriptions title="基础信息" border>
<el-descriptions-item label="服务名称">{{ detail.serverName }}</el-descriptions-item>
<el-descriptions-item label="服务模式">
<dict-tag :options="dict.type.gateway_service_model" :value="detail.serviceModel"/>
</el-descriptions-item>
<el-descriptions-item label="服务地址">{{ detail.serverAddress }}</el-descriptions-item>
<el-descriptions-item label="服务状态">
<dict-tag :options="dict.type.gateway_data_status" :value="detail.status"/>
</el-descriptions-item>
<el-descriptions-item label="服务备注">{{ detail.remark }}</el-descriptions-item>
</el-descriptions>
<!-- <el-divider/> -->
<div class="el-descriptions__header" style="margin-top: 40px;">
<div class="el-descriptions__title">接口信息</div>
</div>
<el-table
:data="detail.interfaceInfoList"
style="width: 100%;margin-bottom: 20px;"
row-key="id"
border
>
<el-table-column prop="interfaceName" label="接口名称">
<template slot-scope="{row}">
<el-button
@click="handleInterfaceDetail(row.id)"
type="text"
>{{row.interfaceName}}</el-button>
</template>
</el-table-column>
<el-table-column prop="interfacePath" label="接口路径" />
<el-table-column prop="description" label="接口描述" />
<el-table-column prop="strategyList" label="关联策略" width="300">
<template slot-scope="scope">
<el-button
v-for="item in scope.row.strategyList"
:key="item.id"
@click="handleStrategyDetail(item.id)"
type="text"
>{{item.strategyName}}</el-button>
</template>
</el-table-column>
<el-table-column prop="version" label="接口版本" width="100" />
<el-table-column prop="requestMethod" label="请求方式" width="80">
<template slot-scope="scope">
<dict-tag :options="dict.type.http_request_method" :value="scope.row.requestMethod"/>
</template>
</el-table-column>
</el-table>
</el-main>
</el-container>
</div>
</template>
<script>
import { getServer } from "@/api/gateway/server";
export default {
dicts: ['gateway_service_model', 'gateway_data_status', 'http_request_method'],
data() {
return {
loading: false,
detail: {}
}
},
created() {
this.getDetail();
},
methods: {
async getDetail() {
this.loading = true;
const { id } = this.$route.query;
try {
const {dode, data} = await getServer(id);
this.detail = data;
} catch (error) {
}
this.loading = false;
},
handleInterfaceDetail(id) {
this.$router.push({
path: '/gateway/interface-edit',
query: {
id: id,
type: 'detail'
}
})
},
handleStrategyDetail(id) {
this.$router.push({
path: '/gateway/strategy-edit',
query: {
id: id,
type: 'detail'
}
})
},
}
}
</script>
<style lang="scss" scoped>
</style>

View File

@ -1,5 +1,5 @@
<template>
<div class="app-container-flex">
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="服务名称" prop="serverName">
<el-input
@ -44,7 +44,7 @@
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb14">
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
@ -63,7 +63,7 @@
size="mini"
:disabled="multiple"
@click="handleStatus()"
>批量启用</el-button>
>批量发布</el-button>
</el-col>
<el-col :span="1.5">
<el-button
@ -76,7 +76,7 @@
v-hasPermi="['gateway:server:remove']"
>批量删除</el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-col :span="1.5">
<el-button
type="warning"
plain
@ -85,63 +85,56 @@
@click="handleExport"
v-hasPermi="['gateway:server:export']"
>导出</el-button>
</el-col> -->
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="serverList" @selection-change="handleSelectionChange" height="100%">
<el-table v-loading="loading" :data="serverList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="服务ID" width="60" align="center" prop="id" /> -->
<el-table-column label="服务名称" align="left" show-overflow-tooltip prop="serverName">
<template slot-scope="scope">
<el-button @click="handleDetail(scope.row)" type="text">{{scope.row.serverName}}</el-button>
</template>
</el-table-column>
<el-table-column label="服务地址" align="left" show-overflow-tooltip prop="serverAddress" />
<el-table-column label="备注" align="left" show-overflow-tooltip prop="remark" />
<el-table-column label="服务ID" width="60" align="center" prop="id" />
<el-table-column label="服务名称" align="center" show-overflow-tooltip prop="serverName" />
<el-table-column label="服务地址" align="center" show-overflow-tooltip prop="serverAddress" />
<el-table-column label="备注" align="center" show-overflow-tooltip prop="remark" />
<!-- <el-table-column label="接口版本" align="center" prop="version" /> -->
<el-table-column label="服务状态" width="100" align="center" prop="status">
<template slot-scope="scope">
<dict-tag :options="dict.type.gateway_data_status" :value="scope.row.status"/>
</template>
</el-table-column>
<el-table-column label="创建者" width="150" align="left" prop="created" />
<el-table-column label="创建时间" align="left" prop="createTime" width="150">
<el-table-column label="创建者" width="100" align="center" prop="createBy" />
<el-table-column label="创建时间" align="center" prop="createTime" width="100">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" align="left" prop="updateTime" width="150">
<el-table-column label="更新时间" align="center" prop="updateTime" width="100">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" align="left" width="180" class-name="small-padding fixed-width">
<el-table-column label="操作" align="center" width="200" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['gateway:server:edit']"
>修改</el-button>
<!-- <el-button
<el-button
size="mini"
type="text"
@click="handleConfig(scope.row)"
v-hasPermi="['gateway:server:config']"
>服务配置</el-button> -->
>服务配置</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleStatus(scope.row)"
v-hasPermi="['gateway:server:config']"
>{{scope.row.status == '1' ? '停止' : '启用'}}</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['gateway:server:remove']"
>删除</el-button>
@ -158,65 +151,21 @@
/>
<!-- 添加或修改服务管理对话框 -->
<el-dialog :title="title" :visible.sync="open" class="server-dialog" width="600px" append-to-body destroy-on-close>
<el-form ref="form" :model="form" :rules="rules" label-width="110px">
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="服务名称" prop="serverName">
<el-input
v-model="form.serverName"
clearable
placeholder="请输入服务名称"
maxlength="50"
show-word-limit
/>
<el-input v-model="form.serverName" placeholder="请输入服务名称" />
</el-form-item>
<el-form-item label="服务类型" prop="serviceType">
<el-select v-model="form.serviceType" clearable placeholder="请选择服务类型">
<el-option v-for="item in dict.type.gateway_service_type" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
<!-- <el-radio-group v-model="form.serviceType">
<el-radio v-for="item in dict.type.gateway_service_type" :key="item.value" :label="item.value">{{item.label}}</el-radio>
</el-radio-group> -->
</el-form-item>
<el-form-item label="服务模式" prop="serviceModel">
<el-radio-group v-model="form.serviceModel" @change="handleServiceModelChange">
<el-radio v-for="item in dict.type.gateway_service_model" :key="item.value" :label="item.value">{{item.label}}</el-radio>
<!-- <el-radio label="ROUTE">路由模式</el-radio> -->
</el-radio-group>
</el-form-item>
<el-form-item v-if="form.serviceModel === 'NORMAL'" label="服务地址" prop="serverAddress" key="serverAddress">
<el-input v-model="form.serverAddress" clearable placeholder="请输入服务地址" />
</el-form-item>
<el-form-item v-if="form.serviceModel === 'ROUTE'" label="路由规则" prop="routeId" key="routeId">
<el-select v-model="form.routeId" clearable placeholder="请选择路由规则" style="width: 100%">
<el-option v-for="item in routeList" :key="item.id" :label="item.routeName" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="超时时间" prop="timeout">
<template slot="label">
<span>超时时间</span>
<el-popover
placement="top-start"
trigger="hover"
>
<span slot="reference"><i class="el-icon-info ml10"></i></span>
<p class="tip">超时时间: 1-150000ms 默认3000ms 单位ms</p>
</el-popover>
</template>
<el-input-number
v-model="form.timeout"
placeholder="请输入超时时间"
:min="1"
:max="150000"
:controls="false"
/>
<el-form-item label="服务地址" prop="serverAddress">
<el-input v-model="form.serverAddress" placeholder="请输入服务地址" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
<el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancel"> </el-button>
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
@ -224,10 +173,10 @@
<script>
import { listServer, getServer, delServer, addServer, updateServer, changeServerStatus } from "@/api/gateway/server";
import { getBindableList } from "@/api/gateway/route"
export default {
name: "Server",
dicts: ['gateway_data_status', 'gateway_service_model', 'gateway_service_type'],
dicts: ['gateway_data_status'],
data() {
return {
//
@ -256,7 +205,6 @@ export default {
pageSize: 10,
serverName: null,
serverAddress: null,
remark: null,
status: null,
createBy: null,
createTime: null,
@ -266,44 +214,18 @@ export default {
//
rules: {
serverName: [
// 线线50
{ required: true, message: "服务名称不能为空", trigger: "blur" },
{ min: 0, max: 50, message: "长度在 0 到 50 个字符" },
{ pattern: /^[a-zA-Z_][a-zA-Z0-9_]*$/, message: "只能以字母或下划线开头,只能包含字母、数字、下划线", trigger: "blur" }
],
serviceType: [
{ required: true, message: "服务类型不能为空", trigger: "change" },
{ required: true, message: "服务名称不能为空", trigger: "blur" }
],
serverAddress: [
{ required: true, message: "服务地址不能为空", trigger: "blur" },
{
pattern: /^(https?:\/\/)?((?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]|localhost|\d{1,3}(?:\.\d{1,3}){3})(?::\d+)?$/,
message: "请输入正确的服务地址",
trigger: "blur",
}
{ required: true, message: "服务地址不能为空", trigger: "blur" }
],
routeId: [
{ required: true, message: "路由规则不能为空", trigger: "change" },
]
},
routeList: [],
}
};
},
created() {
this.getList();
this.getRouteList();
},
methods: {
handleServiceModelChange(val) {
if (val === 'ROUTE') {
this.getRouteList();
}
},
async getRouteList() {
const data = await getBindableList();
this.routeList = data;
},
/** 查询服务管理列表 */
getList() {
this.loading = true;
@ -330,11 +252,7 @@ export default {
this.form = {
id: null,
serverName: null,
serviceType: 'SAC',
serviceModel: 'NORMAL',
serverAddress: null,
timeout: void 0,
routeId: null,
remark: null,
version: null,
status: null,
@ -367,17 +285,7 @@ export default {
handleAdd() {
this.reset();
this.open = true;
this.title = "新增服务";
},
/** 详情按钮操作 */
handleDetail(row) {
const { id } = row;
this.$router.push({
path: '/gateway/server-detail',
query: {
id: row.id
}
})
this.title = "添加服务管理";
},
/** 修改按钮操作 */
handleUpdate(row) {
@ -385,9 +293,8 @@ export default {
const id = row.id || this.ids
getServer(id).then(response => {
this.form = response.data;
this.form.timeout = response.data?.timeout ?? void 0;
this.open = true;
this.title = "修改服务";
this.title = "修改服务管理";
});
},
/** 服务配置 */
@ -423,7 +330,7 @@ export default {
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row?.id || this.ids.join(",");
const ids = row.id || this.ids.join(",");
this.$modal.confirm('是否确认删除服务管理编号为"' + ids + '"的数据项?').then(function() {
return delServer(ids);
}).then(() => {
@ -443,6 +350,7 @@ export default {
status: status
}
changeServerStatus(params).then((res) => {
console.log(res)
if (res.code === 200) {
this.getList();
this.$modal.msgSuccess(row.status === '1' ? "停用成功" : "启用成功");
@ -460,28 +368,3 @@ export default {
}
};
</script>
<style lang="scss" scoped>
.el-select {
width: 100%;
}
::v-deep.el-input-number {
width: 100%;
.el-input__inner{
text-align: left;
}
}
.server-dialog {
::v-deep.el-form {
margin-right: 30px;
}
}
.el-icon-info {
color: #959595;
cursor: pointer;
}
.tip {
color: #999;
font-size: 14px;
margin: 0;
}
</style>

View File

@ -1,350 +0,0 @@
<template>
<div class="app-container-flex">
<el-container>
<el-header>
{{titleName}}
<el-divider/>
</el-header>
<el-main v-loading="loading">
<el-form ref="form" :model="form" :rules="rules" label-width="130px" label-position="right" :disabled="!editable">
<el-row>
<el-col :span="24">
<el-form-item label="策略类型" prop="strategyType">
<el-radio-group v-model="form.strategyType" @input="strategyTypeChange">
<el-radio
v-for="dict in dict.type.gateway_strategy_type"
:key="dict.value"
:label="dict.value"
:disabled="disabledType(dict.value)"
>{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="策略名称" prop="strategyName">
<el-input v-model="form.strategyName" clearable placeholder="描述性的名称,用于识别和管理该策略" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="策略描述" prop="description">
<el-input v-model="form.description" type="textarea" placeholder="请输入策略描述" />
</el-form-item>
</el-col>
<!-- 认证策略 start -->
<!-- 认证策略 end -->
<!-- 鉴权策略 start -->
<!-- 鉴权策略 end -->
<!-- 限流策略 start-->
<template v-if="form.strategyType === 'CURRENT_LIMITING'">
<el-col :span="8">
<el-form-item label="限流阈值" prop="currentLimitingThreshold">
<template slot="label">
<span>限流阈值</span>
<el-popover
placement="top-start"
width="280"
trigger="hover"
>
<span slot="reference"><i class="el-icon-info ml10"></i></span>
<p class="tip">设置限流的阈值即允许通过的请求次数或者并发连接数</p>
</el-popover>
</template>
<el-input-number
v-model="form.currentLimitingThreshold"
placeholder="请输入限流阈值"
:min="0"
:controls="false"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="限流时间窗口" prop="currentLimitingTimeWindow">
<template slot="label">
<span>限流时间窗口</span>
<el-popover
placement="top-start"
trigger="hover"
>
<span slot="reference"><i class="el-icon-info ml10"></i></span>
<p class="tip">限流时间窗口单位s</p>
</el-popover>
</template>
<el-input-number
v-model="form.currentLimitingTimeWindow"
placeholder="请输入限流时间窗口"
:min="0"
:controls="false"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="限流响应" prop="currentLimitingResponse">
<template slot="label">
<span>限流响应</span>
<el-popover
placement="top-start"
trigger="hover"
>
<span slot="reference"><i class="el-icon-info ml10"></i></span>
<p class="tip">限流响应JSON字符串</p>
</el-popover>
</template>
<el-input
v-model="form.currentLimitingResponse"
:autosize="{ minRows: 4}"
type="textarea"
placeholder="请输入限流响应"
/>
</el-form-item>
</el-col>
</template>
<!-- 限流策略 end -->
<!-- 熔断策略 start -->
<template v-if="form.strategyType === 'CIRCUIT_BREAKER'">
<el-col :span="8">
<el-form-item label="熔断阈值" prop="circuitBreakerThreshold">
<el-input-number
v-model="form.circuitBreakerThreshold"
placeholder="请输入熔断阈值"
:min="0"
:controls="false"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="熔断时间窗口" prop="circuitBreakerTimeWindow">
<template slot="label">
<span>熔断时间窗口</span>
<el-popover
placement="top-start"
trigger="hover"
>
<span slot="reference"><i class="el-icon-info ml10"></i></span>
<p class="tip">调用失败阈值对应的时间窗口单位s</p>
</el-popover>
</template>
<el-input-number
v-model="form.circuitBreakerTimeWindow"
placeholder="请输入熔断时间窗口"
:min="0"
:controls="false"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="恢复时间间隔" prop="circuitBreakerRecoveryInterval">
<template slot="label">
<span>恢复时间间隔</span>
<el-popover
placement="top-start"
trigger="hover"
>
<span slot="reference"><i class="el-icon-info ml10"></i></span>
<p class="tip">熔断后的恢复时间间隔单位s</p>
</el-popover>
</template>
<el-input-number
v-model="form.circuitBreakerRecoveryInterval"
placeholder="请输入恢复时间间隔"
:min="0"
:controls="false"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="熔断响应" prop="circuitBreakerResponse">
<template slot="label">
<span>熔断响应</span>
<el-popover
placement="top-start"
trigger="hover"
>
<span slot="reference"><i class="el-icon-info ml10"></i></span>
<p class="tip">熔断响应JSON字符串</p>
</el-popover>
</template>
<el-input
v-model="form.circuitBreakerResponse"
type="textarea"
:autosize="{ minRows: 4}"
placeholder="请输入熔断响应"
/>
</el-form-item>
</el-col>
</template>
<!-- 熔断策略 end -->
</el-row>
</el-form>
</el-main>
<el-footer class="footer">
<el-button :disabled="btnLoading" @click="close">取消</el-button>
<el-button v-if="editable" type="primary" :loading="btnLoading" @click="submitForm">保存</el-button>
</el-footer>
</el-container>
</div>
</template>
<script>
import EventBus from '@/utils/eventBus'
import { deepClone } from '@/utils'
import { updateStrategy, getStrategy, addStrategy } from "@/api/gateway/strategy";
let CACHEFOEM;
export default {
components: { },
dicts: ['gateway_strategy_type'],
data() {
return {
loading: false,
btnLoading: false,
form: {
id: void 0,
strategyType: 'CURRENT_LIMITING',
strategyName: void 0,
description: void 0,
currentLimitingThreshold: void 0,
currentLimitingTimeWindow: void 0,
currentLimitingResponse: '{"msg":"到达限流阈值,请稍后重试!","code":500}',
circuitBreakerThreshold: void 0,
circuitBreakerTimeWindow: void 0,
circuitBreakerRecoveryInterval: void 0,
circuitBreakerResponse: '{"msg":"到达熔断阈值,请稍后重试!","code":500}',
},
rules: {
strategyType: [
{ required: true, message: '策略类型不能为空', trigger: 'change' }
],
strategyName:[
{ required: true, message: '策略名称不能为空', trigger: 'blur' }
],
currentLimitingThreshold: [
{ required: true, message: '限流阈值不能为空', trigger: 'blur' }
],
currentLimitingTimeWindow: [
{ required: true, message: '限流时间窗口不能为空', trigger: 'blur' }
],
currentLimitingResponse: [
{ required: true, message: '限流响应不能为空', trigger: 'blur' }
],
circuitBreakerThreshold: [
{ required: true, message: '熔断阈值不能为空', trigger: 'blur' }
],
circuitBreakerTimeWindow: [
{ required: true, message: '熔断时间窗口不能为空', trigger: 'blur' }
],
circuitBreakerRecoveryInterval: [
{ required: true, message: '恢复时间间隔不能为空', trigger: 'blur' }
],
circuitBreakerResponse: [
{ required: true, message: '熔断响应不能为空', trigger: 'blur' }
],
}
}
},
computed: {
editable() {
return this.$route.query.type !== 'detail'
},
titleName() {
if (!this.editable) {
return '策略详情'
}
return this.$route.query.id ? '编辑策略' : '新增策略'
},
},
created() {
this.getDetail()
},
activated() {
this.getDetail()
},
methods: {
disabledType(type) {
return !(['CURRENT_LIMITING', 'CIRCUIT_BREAKER'].includes(type)) || !!(this.form.id);
},
async getDetail() {
const { id } = this.$route.query
if (id) {
this.loading = true;
try {
const { data } = await getStrategy(id)
this.form = data;
CACHEFOEM = deepClone(data);
} catch (error) {
this.$message.error(error.message || '请求失败')
}
this.loading = false;
}
},
//
reset() {
this.form = {
id: void 0,
strategyType: 'CURRENT_LIMITING',
strategyName: void 0,
description: void 0,
currentLimitingThreshold: void 0,
currentLimitingTimeWindow: void 0,
currentLimitingResponse: '{"msg":"到达限流阈值,请稍后重试!","code":500}',
circuitBreakerThreshold: void 0,
circuitBreakerTimeWindow: void 0,
circuitBreakerRecoveryInterval: void 0,
circuitBreakerResponse: '{"msg":"到达熔断阈值,请稍后重试!","code":500}',
};
this.resetForm("form");
},
strategyTypeChange() {
const { id, strategyType } = this.form;
this.reset();
if (CACHEFOEM && strategyType === CACHEFOEM.strategyType) {
Object.keys(this.form).forEach((key) => {
this.form[key] = CACHEFOEM[key];
})
} else {
this.form.id = id;
this.form.strategyType = strategyType;
}
},
async submitForm() {
const request = this.form.id != null ? updateStrategy : addStrategy;
const msg = this.form.id != null ? '修改' : '新增';
await this.$refs.form.validate();
try {
this.btnLoading = true;
await request(this.form);
this.$modal.msgSuccess(`${msg}成功`);
EventBus.$emit('reloadStratefyList');
this.close();
} catch (error) {
this.$modal.msgError(`${msg}失败`);
}
this.btnLoading = false;
},
close() {
this.$tab.closePage();
},
}
}
</script>
<style lang="scss" scoped>
.footer {
display: flex;
align-items: center;
justify-content: flex-end;
}
::v-deep.el-input-number .el-input__inner{
text-align: left;
}
.el-icon-info {
color: #959595;
cursor: pointer;
}
.tip {
color: #999;
font-size: 14px;
margin: 0;
}
</style>

View File

@ -1,5 +1,5 @@
<template>
<div class="app-container-flex">
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="策略名称" prop="strategyName">
<el-input
@ -46,7 +46,7 @@
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb14">
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
@ -79,7 +79,7 @@
v-hasPermi="['gateway:strategy:remove']"
>删除</el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-col :span="1.5">
<el-button
type="warning"
plain
@ -88,41 +88,37 @@
@click="handleExport"
v-hasPermi="['gateway:strategy:export']"
>导出</el-button>
</el-col> -->
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="strategyList" @selection-change="handleSelectionChange" height="100%">
<el-table v-loading="loading" :data="strategyList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="策略名称" min-width="180" show-overflow-tooltip prop="strategyName">
<template slot-scope="scope">
<el-button @click="handleUpdate(scope.row, 'detail')" type="text">{{scope.row.strategyName}}</el-button>
</template>
</el-table-column>
<el-table-column label="策略描述" min-width="180" show-overflow-tooltip prop="description" />
<!-- <el-table-column label="请求方式" prop="requestMethod" /> -->
<el-table-column label="策略类型" min-width="120" prop="strategyType">
<el-table-column label="策略ID" width="60" align="center" prop="id" />
<el-table-column label="策略类型" width="120" align="center" prop="strategyType">
<template slot-scope="scope">
<dict-tag :options="dict.type.gateway_strategy_type" :value="scope.row.strategyType"/>
</template>
</el-table-column>
<el-table-column label="策略状态" min-width="100" align="center" prop="status">
<el-table-column label="策略名称" align="left" show-overflow-tooltip prop="strategyName" />
<el-table-column label="策略描述" align="left" show-overflow-tooltip prop="description" />
<!-- <el-table-column label="请求方式" align="center" prop="requestMethod" /> -->
<el-table-column label="策略状态" width="80" align="center" prop="status">
<template slot-scope="scope">
<dict-tag :options="dict.type.gateway_data_status" :value="scope.row.status"/>
</template>
</el-table-column>
<el-table-column label="创建者" min-width="100" prop="created" />
<el-table-column label="创建时间" prop="createTime" min-width="100">
<el-table-column label="创建时间" align="center" prop="createTime" width="100">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="更新时间" prop="updateTime" min-width="100">
<el-table-column label="更新时间" align="center" prop="updateTime" width="100">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="180" fixed="right" class-name="small-padding fixed-width">
<el-table-column label="操作" align="center" width="150" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
@ -130,7 +126,7 @@
icon="el-icon-edit"
@click="handleStatus(scope.row)"
v-hasPermi="['gateway:strategy:edit']"
>{{scope.row.status === '0' ? '启用' : '禁用' }}</el-button>
>{{scope.row === '0' ? '启用' : '禁用' }}</el-button>
<el-button
size="mini"
type="text"
@ -158,9 +154,9 @@
/>
<!-- 添加或修改策略管理对话框 -->
<!-- <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body> -->
<!-- <el-form ref="form" :model="form" :rules="rules" :validate-on-rule-change="false" label-width="100px"> -->
<!-- <el-form-item label="策略类型" prop="strategyType">
<el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" :validate-on-rule-change="false" label-width="100px">
<el-form-item label="策略类型" prop="strategyType">
<el-radio-group v-model="form.strategyType" @input="strategyTypeChange">
<el-radio
v-for="dict in dict.type.gateway_strategy_type"
@ -174,23 +170,23 @@
</el-form-item>
<el-form-item label="策略描述" prop="description">
<el-input v-model="form.description" placeholder="请输入策略描述" />
</el-form-item> -->
</el-form-item>
<!-- 认证策略 -->
<!-- <template v-if="form.strategyType === 'AUTHENTICATION'"> -->
<template v-if="form.strategyType === 'AUTHENTICATION'">
<!-- 认证方式 -->
<!-- 认证配置 针对选定的认证方式需要相应的配置信息如秘钥证书令牌有效期等 -->
<!-- 生效范围 -->
<!-- </template> -->
</template>
<!-- 认证策略 -->
<!-- 鉴权策略 -->
<!-- <template v-if="form.strategyType === 'PERMISSION'"> -->
<template v-if="form.strategyType === 'PERMISSION'">
<!-- 角色授权 指定用户或角色是否具有访问接口或资源的权限-->
<!-- 角色列表 指定哪些角色拥有访问接口或资源的权限-->
<!-- 用户ID 标识请求中的用户身份信息-->
<!-- IP地址 允许访问接口或资源的IP地址范围限制请求来源-->
<!-- <el-form-item label="请求方法" prop="requestMethod">
<el-form-item label="请求方法" prop="requestMethod">
<el-radio-group v-model="form.requestMethod">
<el-radio
v-for="dict in dict.type.http_request_method"
@ -198,19 +194,19 @@
:label="dict.value"
>{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item> -->
<!-- 请求路允许访问的接口路径或URL -->
</el-form-item>
<!-- 请求路允许访问的接口路劲或URL -->
<!-- 访问频率限制 设置允许用户或角色在一定时间内访问接口的次数限制 -->
<!-- 访问时间限制 允许用户或者角色访问接口的时间段 -->
<!-- 访问来源 访问接口的来源 -->
<!-- 有限期 -->
<!-- 授权范围 指定用户或角色 -->
<!-- </template> -->
</template>
<!-- 鉴权策略 -->
<!-- 限流策略 -->
<!-- <template v-if="form.strategyType == 'CURRENT_LIMITING'"> -->
<!-- <el-form-item label="限流算法" prop="currentLimitingAlgorithm">
<template v-if="form.strategyType == 'CURRENT_LIMITING'">
<el-form-item label="限流算法" prop="currentLimitingAlgorithm">
<el-input v-model="form.currentLimitingAlgorithm" placeholder="选择具体的限流算法,如令牌桶算法、楼桶算法、计数器算法等" />
</el-form-item>
<el-form-item label="限流阈值" prop="currentLimitingThreshold">
@ -218,20 +214,20 @@
</el-form-item>
<el-form-item label="限流周期" prop="currentLimitingPeriod">
<el-input v-model="form.currentLimitingPeriod" placeholder="设置限流的时间周期,如每秒限流、没分钟限流等" />
</el-form-item> -->
</el-form-item>
<!-- 生效范围 -->
<!-- <el-form-item label="限流处理方式" prop="currentLimitingProcessingMethod">
<el-form-item label="限流处理方式" prop="currentLimitingProcessingMethod">
<el-input v-model="form.currentLimitingProcessingMethod" placeholder="请输入限流处理方式" />
</el-form-item> -->
</el-form-item>
<!-- 超限处理策略 -->
<!-- 监控和警告 -->
<!-- 限流日志 -->
<!-- </template> -->
</template>
<!-- 限流策略 -->
<!-- 数据加密策略 -->
<!-- <template v-if="form.strategyType == 'DATA_ENCRYPTION'"> -->
<!-- <el-form-item label="状态" prop="status">
<template v-if="form.strategyType == 'DATA_ENCRYPTION'">
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in dict.type.gateway_data_status"
@ -239,9 +235,10 @@
:label="dict.value"
>{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item> -->
<!-- <el-form-item label="加密算法" prop="encryptionAlgorithm">
</el-form-item>
<el-form-item label="加密算法" prop="encryptionAlgorithm">
<el-radio-group v-model="form.encryptionAlgorithm" @input="changeEncryptionAlgorithm">
<!-- ECCRSASM2国密 -->
<el-radio label="ECC">ECC</el-radio>
<el-radio label="RSA">RSA</el-radio>
<el-radio label="SM2">国密</el-radio>
@ -252,20 +249,19 @@
</el-form-item>
<el-form-item v-if="publicKeyRequired" label="公钥内容" prop="publicKey">
<el-input v-model="form.publicKey" type="textarea" placeholder="请输入公钥" />
</el-form-item> -->
<!-- </template> -->
</el-form-item>
</template>
<!-- 数据加密策略 -->
<!-- </el-form> -->
<!-- <div slot="footer" class="dialog-footer">
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div> -->
<!-- </el-dialog> -->
</div>
</el-dialog>
</div>
</template>
<script>
import EventBus from "@/utils/eventBus";
import { listStrategy, getStrategy, delStrategy, addStrategy, updateStrategy, changeStrategyStatus } from "@/api/gateway/strategy";
export default {
@ -287,10 +283,10 @@ export default {
total: 0,
//
strategyList: [],
// //
// title: "",
// //
// open: false,
//
title: "",
//
open: false,
//
daterangeCreateTime: [],
//
@ -304,62 +300,57 @@ export default {
createTime: null,
},
//
// form: {
// id: null,
// strategyName: null,
// strategyType: null,
// description: null,
// requestMethod: null,
// encryptionAlgorithm: null,
// status: null,
// privateKey: null,
// publicKey: null,
// currentLimitingAlgorithm: null,
// currentLimitingThreshold: null,
// currentLimitingPeriod: null,
// currentLimitingProcessingMethod: null,
// createBy: null,
// createTime: null,
// updateBy: null,
// updateTime: null
// },
form: {
id: null,
strategyName: null,
strategyType: null,
description: null,
requestMethod: null,
encryptionAlgorithm: null,
status: null,
privateKey: null,
publicKey: null,
currentLimitingAlgorithm: null,
currentLimitingThreshold: null,
currentLimitingPeriod: null,
currentLimitingProcessingMethod: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null
},
};
},
computed: {
// publicKeyRequired() {
// return this.form.encryptionAlgorithm === 'RSA';
// },
// //
// rules() {
// return {
// strategyName: [
// { required: this.form.strategyType === 'DATA_ENCRYPTION', message: "", trigger: "blur" }
publicKeyRequired() {
return this.form.encryptionAlgorithm === 'RSA';
},
//
rules() {
return {
strategyName: [
{ required: this.form.strategyType === 'DATA_ENCRYPTION', message: "策略名称不能为空", trigger: "blur" }
],
strategyType: [
{ required: true, message: "策略类型不能为空", trigger: "change" }
],
// requestMethod: [
// { required: true, message: "", trigger: "blur" }
// ],
// strategyType: [
// { required: true, message: "", trigger: "change" }
// ],
// // requestMethod: [
// // { required: true, message: "", trigger: "blur" }
// // ],
// encryptionAlgorithm: [
// { required: true, message: "", trigger: "blur" }
// ],
// privateKey: [
// { required: true, message: "", trigger: "blur" }
// ],
// publicKey: [
// { required: this.publicKeyRequired, message: "", trigger: "blur" }
// ],
// }
// }
encryptionAlgorithm: [
{ required: true, message: "加密算法不能为空", trigger: "blur" }
],
privateKey: [
{ required: true, message: "私钥内容不能为空", trigger: "blur" }
],
publicKey: [
{ required: this.publicKeyRequired, message: "公钥内容不能为空", trigger: "blur" }
],
}
}
},
created() {
this.getList();
EventBus.$on("reloadStratefyList",this.getList);
},
befoueDestroy() {
EventBus.$off('reloadStratefyList', this.getList);
},
methods: {
/** 查询策略管理列表 */
@ -379,33 +370,33 @@ export default {
});
},
//
// cancel() {
// this.open = false;
// this.reset();
// },
// //
// reset() {
// this.form = {
// id: null,
// strategyName: null,
// strategyType: null,
// description: null,
// requestMethod: null,
// encryptionAlgorithm: null,
// status: null,
// privateKey: null,
// publicKey: null,
// currentLimitingAlgorithm: null,
// currentLimitingThreshold: null,
// currentLimitingPeriod: null,
// currentLimitingProcessingMethod: null,
// createBy: null,
// createTime: null,
// updateBy: null,
// updateTime: null
// };
// this.resetForm("form");
// },
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
strategyName: null,
strategyType: null,
description: null,
requestMethod: null,
encryptionAlgorithm: null,
status: null,
privateKey: null,
publicKey: null,
currentLimitingAlgorithm: null,
currentLimitingThreshold: null,
currentLimitingPeriod: null,
currentLimitingProcessingMethod: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
@ -426,68 +417,60 @@ export default {
},
/** 新增按钮操作 */
handleAdd() {
// this.reset();
// this.open = true;
// this.title = "";
this.$router.push({path:'/gateway/strategy-edit'})
this.reset();
this.open = true;
this.title = "添加策略管理";
},
/** 修改按钮操作 */
handleUpdate(row, type) {
// this.reset();
const id = row.id;
// getStrategy(id).then(response => {
// this.form = response.data;
// this.open = true;
// this.title = "";
// });
this.$router.push({
path:'/gateway/strategy-edit',
query: {
id,
type
}
})
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getStrategy(id).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改策略管理";
});
},
strategyTypeChange() {
const { id, strategyName, strategyType } = this.form;
this.reset();
this.form.id = id;
this.form.strategyName = strategyName;
this.form.strategyType = strategyType;
},
changeEncryptionAlgorithm(val) {
// RSA
if (val === 'RSA') {
this.form.publicKey = null;
};
},
/** 提交按钮 */
submitForm() {
console.log(this.form)
// return;
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
let data = Object.assign({},this.form)
delete data.explain
updateStrategy(data).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addStrategy(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
// strategyTypeChange() {
// const { id, strategyName, strategyType } = this.form;
// this.reset();
// this.form.id = id;
// this.form.strategyName = strategyName;
// this.form.strategyType = strategyType;
// },
// changeEncryptionAlgorithm(val) {
// // RSA
// if (val === 'RSA') {
// this.form.publicKey = null;
// };
// },
// /** */
// submitForm() {
// console.log(this.form)
// // return;
// this.$refs["form"].validate(valid => {
// if (valid) {
// if (this.form.id != null) {
// let data = Object.assign({},this.form)
// delete data.explain
// updateStrategy(data).then(response => {
// this.$modal.msgSuccess("");
// this.open = false;
// this.getList();
// });
// } else {
// addStrategy(this.form).then(response => {
// this.$modal.msgSuccess("");
// this.open = false;
// this.getList();
// });
// }
// }
// });
// },
/** 删除按钮操作 */
handleDelete(row) {
const ids = row?.id || this.ids;
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除策略管理编号为"' + ids + '"的数据项?').then(function() {
return delStrategy(ids);
}).then(() => {

View File

@ -106,12 +106,8 @@ export default {
return this.$store.state.permission.addRoutes;
},
},
async created() {
created() {
this.$store.dispatch('app/toggleSideBarHide', true);
// if (this.routes.length === 0) {
// let routes = await this.$store.dispatch('GenerateRoutes');
// this.$router.addRoutes(routes)
// }
this.getList();
},
watch: {
@ -124,6 +120,7 @@ export default {
getList() {
this.loading = true;
getListApi(this.queryParams).then(response => {
console.log(response)
this.list = response.rows;
this.total = response.total;
this.loading = false;

View File

@ -161,7 +161,7 @@ export default {
justify-content: center;
align-items: center;
height: 100%;
background-image: url("../assets/images/login-background.png");
background-image: url("../assets/images/login-background.jpg");
background-size: cover;
}
.title {

View File

@ -1,266 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="用户名" prop="userName">
<el-input v-model="queryParams.userName" placeholder="请输入用户名" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
v-hasPermi="['mandate:appMandate:add']"
:disabled="Cookies.get('Admin-isAdmin') == 1 ? false : true">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="el-icon-delete" size="mini"
:disabled="multiple && Cookies.get('Admin-isAdmin') == 1 ? false : true" @click="handleDelete"
v-hasPermi="['mandate:appMandate:remove']">删除</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="appMandateList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="用户名" align="center" prop="userName" />
<el-table-column label="是否为管理员" align="center" prop="isAdmin">
<template slot-scope="scope">
<el-switch :disabled="Cookies.get('Admin-isAdmin') == 1 ? false : true" :value="scope.row.isAdmin"
@change="isAdminChange(scope.row)" :active-value="1" :inactive-value="0" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button :disabled="Cookies.get('Admin-isAdmin') == 1 ? false : true" size="mini" type="text"
icon="el-icon-delete" @click="handleDelete(scope.row)"
v-hasPermi="['mandate:appMandate:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
@pagination="getList" />
<!-- 添加或修改应用授权对话框 -->
<el-dialog :title="title" :visible.sync="open" width="650px" append-to-body>
<el-transfer :titles="['可选用户', '选中用户']" v-model="value" :data="columns" @change="dataChange"></el-transfer>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listAppMandate, delAppMandate, addAppMandateList, updateAppMandate, appMandateUser } from "@/api/mandate/appMandate";
import { listUser } from "@/api/system/user";
import Cookies from 'js-cookie'
export default {
name: "AppMandate",
data () {
return {
Cookies: Cookies,
columns: [],
value: [],
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
appMandateList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
userName: null,
},
//
form: {},
//
rules: {
userName: [
{ required: true, message: "用户名不能为空", trigger: "blur" }
],
}
};
},
created () {
this.getList();
},
methods: {
/** 查询应用授权列表 */
getList () {
this.loading = true;
listAppMandate(this.queryParams).then(response => {
this.appMandateList = response.rows;
this.total = response.total;
this.loading = false;
});
},
getUserList () {
this.loading = true;
appMandateUser().then(res => {
const arr1 = JSON.parse(JSON.stringify(res.rows));
const arr2 = JSON.parse(JSON.stringify(this.appMandateList))
const mergedArr = [...arr1, ...arr2];
const userIdCounts = new Map();
mergedArr.forEach(item => {
if (!userIdCounts.has(item.userId)) {
userIdCounts.set(item.userId, 1);
} else {
userIdCounts.set(item.userId, userIdCounts.get(item.userId) + 1);
}
});
const uniqueItems = mergedArr.filter(item => userIdCounts.get(item.userId) === 1);
for (var i in uniqueItems) {
uniqueItems[i].key = i
uniqueItems[i].label = uniqueItems[i].userName
}
this.columns = uniqueItems;
this.loading = false;
});
},
dataChange () {
},
removeDuplicateValues (arrays) {
//
const flatArray = arrays.flat();
// 使Map
const elementMap = new Map();
//
for (const item of flatArray) {
elementMap.set(item, (elementMap.get(item.userId) || 0) + 1);
}
//
const uniqueElements = Array.from(elementMap.entries())
.filter(([value, count]) => count === 1)
.map(([value, _]) => value);
return uniqueElements;
},
//
cancel () {
this.open = false;
},
/** 搜索按钮操作 */
handleQuery () {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery () {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange (selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length !== 1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd () {
this.open = true;
this.getUserList();
this.title = "添加应用授权";
this.value = [];
},
/** 提交按钮 */
submitForm () {
const group = [];
for (var j in this.value) {
group.push({
userName: this.columns[this.value[j]].userName,
userId: this.columns[this.value[j]].userId,
});
}
addAppMandateList(group).then(res => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
},
/** 删除按钮操作 */
handleDelete (row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除应用授权编号为"' + ids + '"的数据项?').then(function () {
return delAppMandate(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => { });
},
isAdminChange (row) {
if (row.isAdmin == 0) {
this.$confirm('是否将该用户设置为管理员', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
updateAppMandate({
isAdmin: 1,
id: row.id
}).then(res => {
this.$message({
type: 'success',
message: '设置成功!'
});
this.getList();
})
})
} else {
this.$confirm("是否撤销该用户的管理员权限", '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
updateAppMandate({
isAdmin: 0,
id: row.id
}).then(res => {
this.$message({
type: 'success',
message: '设置成功!'
});
this.getList();
})
})
}
}
}
};
</script>

View File

@ -8,20 +8,35 @@
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input v-model="registerForm.password" type="password" auto-complete="off" placeholder="密码"
@keyup.enter.native="handleRegister">
<el-input
v-model="registerForm.password"
type="password"
auto-complete="off"
placeholder="密码"
@keyup.enter.native="handleRegister"
>
<svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
</el-input>
</el-form-item>
<el-form-item prop="confirmPassword">
<el-input v-model="registerForm.confirmPassword" type="password" auto-complete="off" placeholder="确认密码"
@keyup.enter.native="handleRegister">
<el-input
v-model="registerForm.confirmPassword"
type="password"
auto-complete="off"
placeholder="确认密码"
@keyup.enter.native="handleRegister"
>
<svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
</el-input>
</el-form-item>
<el-form-item prop="code" v-if="captchaEnabled">
<el-input v-model="registerForm.code" auto-complete="off" placeholder="验证码" style="width: 63%"
@keyup.enter.native="handleRegister">
<el-input
v-model="registerForm.code"
auto-complete="off"
placeholder="验证码"
style="width: 63%"
@keyup.enter.native="handleRegister"
>
<svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
</el-input>
<div class="register-code">
@ -29,8 +44,13 @@
</div>
</el-form-item>
<el-form-item style="width:100%;">
<el-button :loading="loading" size="medium" type="primary" style="width:100%;"
@click.native.prevent="handleRegister">
<el-button
:loading="loading"
size="medium"
type="primary"
style="width:100%;"
@click.native.prevent="handleRegister"
>
<span v-if="!loading"> </span>
<span v-else> 中...</span>
</el-button>
@ -131,10 +151,9 @@ export default {
justify-content: center;
align-items: center;
height: 100%;
background-image: url("../assets/images/login-background.png");
background-image: url("../assets/images/login-background.jpg");
background-size: cover;
}
.title {
margin: 0px auto 30px auto;
text-align: center;
@ -146,39 +165,32 @@ export default {
background: #ffffff;
width: 400px;
padding: 25px 25px 5px 25px;
.el-input {
height: 38px;
input {
height: 38px;
}
}
.input-icon {
height: 39px;
width: 14px;
margin-left: 2px;
}
}
.register-tip {
font-size: 13px;
text-align: center;
color: #bfbfbf;
}
.register-code {
width: 33%;
height: 38px;
float: right;
img {
cursor: pointer;
vertical-align: middle;
}
}
.el-register-footer {
height: 40px;
line-height: 40px;
@ -191,7 +203,6 @@ export default {
font-size: 12px;
letter-spacing: 1px;
}
.register-code-img {
height: 38px;
}

View File

@ -1,122 +1,216 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="68px" size="small">
<el-form-item label="商品编号" prop="goodsCode">
<el-input v-model="queryParams.goodsCode" placeholder="请输入商品编号" clearable @keyup.enter.native="handleQuery" />
<el-input
v-model="queryParams.goodsCode"
clearable
placeholder="请输入商品编号"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="审核状态" prop="reviewStatus">
<el-select v-model="queryParams.reviewStatus" placeholder="请选择审核状态" clearable>
<el-option v-for="dict in dict.type.goods_review_status" :key="dict.value" :label="dict.label"
:value="dict.value" />
<el-select v-model="queryParams.reviewStatus" clearable placeholder="请选择审核状态">
<el-option
v-for="dict in dict.type.goods_review_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="商品标题" prop="productTitle">
<el-input v-model="queryParams.productTitle" placeholder="请输入商品标题" clearable @keyup.enter.native="handleQuery" />
<el-input
v-model="queryParams.productTitle"
clearable
placeholder="请输入商品标题"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="商品原价" prop="originalPrice">
<el-input v-model="queryParams.originalPrice" placeholder="请输入商品原价" clearable @keyup.enter.native="handleQuery" />
<el-input
v-model="queryParams.originalPrice"
clearable
placeholder="请输入商品原价"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="商品类型" prop="goodsType">
<el-select v-model="queryParams.goodsType" placeholder="请选择商品类型" clearable>
<el-option v-for="dict in dict.type.goods_type" :key="dict.value" :label="dict.label" :value="dict.value" />
<el-select v-model="queryParams.goodsType" clearable placeholder="请选择商品类型">
<el-option
v-for="dict in dict.type.goods_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="商品规格" prop="goodsSpec">
<el-input v-model="queryParams.goodsSpec" placeholder="请输入商品规格" clearable @keyup.enter.native="handleQuery" />
<el-input
v-model="queryParams.goodsSpec"
clearable
placeholder="请输入商品规格"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="商品型号" prop="goodsModel">
<el-input v-model="queryParams.goodsModel" placeholder="请输入商品型号" clearable @keyup.enter.native="handleQuery" />
<el-input
v-model="queryParams.goodsModel"
clearable
placeholder="请输入商品型号"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-search" size="mini" type="primary" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
v-hasPermi="['service:goods:add']">新增</el-button>
<el-button
v-hasPermi="['service:goods:add']"
icon="el-icon-plus"
plain
size="mini"
type="primary"
@click="handleAdd"
>新增
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
v-hasPermi="['service:goods:edit']">修改</el-button>
<el-button
v-hasPermi="['service:goods:edit']"
:disabled="single"
icon="el-icon-edit"
plain
size="mini"
type="success"
@click="handleUpdate"
>修改
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
v-hasPermi="['service:goods:remove']">删除</el-button>
<el-button
v-hasPermi="['service:goods:remove']"
:disabled="multiple"
icon="el-icon-delete"
plain
size="mini"
type="danger"
@click="handleDelete"
>删除
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
v-hasPermi="['service:goods:export']">导出</el-button>
<el-button
v-hasPermi="['service:goods:export']"
icon="el-icon-download"
plain
size="mini"
type="warning"
@click="handleExport"
>导出
</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="goodsList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="商品编号" align="center" prop="goodsCode" />
<el-table-column label="审核状态" align="center" prop="reviewStatus">
<el-table-column align="center" type="selection" width="55"/>
<el-table-column align="center" label="主键" prop="id"/>
<el-table-column align="center" label="商品编号" prop="goodsCode"/>
<el-table-column align="center" label="审核状态" prop="reviewStatus">
<template slot-scope="scope">
<dict-tag :options="dict.type.goods_review_status" :value="scope.row.reviewStatus"/>
</template>
</el-table-column>
<el-table-column label="商品标题" align="center" prop="productTitle" />
<el-table-column label="商品图片" align="center" prop="productPicture" width="100">
<el-table-column align="center" label="商品标题" prop="productTitle"/>
<el-table-column align="center" label="商品图片" prop="productPicture" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.productPicture" :width="50" :height="50" />
<image-preview :height="50" :src="scope.row.productPicture" :width="50"/>
</template>
</el-table-column>
<el-table-column label="商品原价" align="center" prop="originalPrice" />
<el-table-column label="商品描述" align="center" prop="productDesc" />
<el-table-column label="商品类型" align="center" prop="goodsType">
<el-table-column align="center" label="商品原价" prop="originalPrice">
<template slot-scope="scope">
<span>{{ scope.row.originalPrice / 100 }}</span>
</template>
</el-table-column>
<el-table-column align="center" label="商品描述" prop="productDesc"/>
<el-table-column align="center" label="商品类型" prop="goodsType">
<template slot-scope="scope">
<dict-tag :options="dict.type.goods_type" :value="scope.row.goodsType"/>
</template>
</el-table-column>
<el-table-column label="商品规格" align="center" prop="goodsSpec" />
<el-table-column label="商品型号" align="center" prop="goodsModel" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<el-table-column align="center" label="商品规格" prop="goodsSpec"/>
<el-table-column align="center" label="商品型号" prop="goodsModel"/>
<el-table-column align="center" class-name="small-padding fixed-width" label="操作">
<template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
v-hasPermi="['service:goods:edit']">修改</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
v-hasPermi="['service:goods:remove']">删除</el-button>
<el-button
v-hasPermi="['service:goods:edit']"
icon="el-icon-edit"
size="mini"
type="text"
@click="handleUpdate(scope.row)"
>修改
</el-button>
<el-button
v-hasPermi="['service:goods:remove']"
icon="el-icon-delete"
size="mini"
type="text"
@click="handleDelete(scope.row)"
>删除
</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
@pagination="getList" />
<pagination
v-show="total>0"
:limit.sync="queryParams.pageSize"
:page.sync="queryParams.pageNum"
:total="total"
@pagination="getList"
/>
<!-- 添加或修改商品信息对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-dialog :title="title" :visible.sync="open" append-to-body width="500px">
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="商品编号" prop="goodsCode">
<el-input v-model="form.goodsCode" placeholder="请输入商品编号"/>
</el-form-item>
<el-form-item label="审核状态" prop="reviewStatus">
<el-radio-group v-model="form.reviewStatus">
<el-radio v-for="dict in dict.type.goods_review_status" :key="dict.value"
:label="parseInt(dict.value)">{{ dict.label }}</el-radio>
<el-radio
v-for="dict in dict.type.goods_review_status"
:key="dict.value"
:label="parseInt(dict.value)"
>{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="商品标题" prop="productTitle">
<el-input v-model="form.productTitle" placeholder="请输入商品标题"/>
</el-form-item>
<el-form-item label="商品图片" prop="productPicture">
<image-upload v-model="form.productPicture" />
<image-upload v-model="form.productPicture" :limit="1"/>
</el-form-item>
<el-form-item label="商品原价" prop="originalPrice">
<el-input v-model="form.originalPrice" placeholder="请输入商品原价"/>
</el-form-item>
<el-form-item label="商品描述" prop="productDesc">
<el-input v-model="form.productDesc" type="textarea" placeholder="请输入内容" />
<el-input v-model="form.productDesc" placeholder="请输入内容" type="textarea"/>
</el-form-item>
<el-form-item label="商品类型" prop="goodsType">
<el-radio-group v-model="form.goodsType">
<el-radio v-for="dict in dict.type.goods_type" :key="dict.value"
:label="parseInt(dict.value)">{{ dict.label }}</el-radio>
<el-radio
v-for="dict in dict.type.goods_type"
:key="dict.value"
:label="parseInt(dict.value)"
>{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="商品规格" prop="goodsSpec">
@ -138,10 +232,10 @@
</template>
<script>
import { listGoods, getGoods, delGoods, addGoods, updateGoods } from "@/api/service/goods";
import { addGoods, delGoods, getGoods, listGoods, updateGoods } from '@/api/service/goods'
export default {
name: "Goods",
name: 'Goods',
dicts: ['goods_review_status', 'goods_type'],
data() {
return {
@ -160,7 +254,7 @@ export default {
//
goodsList: [],
//
title: "",
title: '',
//
open: false,
//
@ -180,49 +274,49 @@ export default {
//
rules: {
goodsCode: [
{ required: true, message: "商品编号不能为空", trigger: "blur" }
{ required: true, message: '商品编号不能为空', trigger: 'blur' }
],
reviewStatus: [
{ required: true, message: "审核状态不能为空", trigger: "change" }
{ required: true, message: '审核状态不能为空', trigger: 'change' }
],
productTitle: [
{ required: true, message: "商品标题不能为空", trigger: "blur" }
{ required: true, message: '商品标题不能为空', trigger: 'blur' }
],
productPicture: [
{ required: true, message: "商品图片不能为空", trigger: "blur" }
{ required: true, message: '商品图片不能为空', trigger: 'blur' }
],
originalPrice: [
{ required: true, message: "商品原价不能为空", trigger: "blur" }
{ required: true, message: '商品原价不能为空', trigger: 'blur' }
],
goodsType: [
{ required: true, message: "商品类型不能为空", trigger: "change" }
{ required: true, message: '商品类型不能为空', trigger: 'change' }
],
goodsSpec: [
{ required: true, message: "商品规格不能为空", trigger: "blur" }
{ required: true, message: '商品规格不能为空', trigger: 'blur' }
],
goodsModel: [
{ required: true, message: "商品型号不能为空", trigger: "blur" }
{ required: true, message: '商品型号不能为空', trigger: 'blur' }
]
}
};
}
},
created() {
this.getList();
this.getList()
},
methods: {
/** 查询商品信息列表 */
getList() {
this.loading = true;
this.loading = true
listGoods(this.queryParams).then(response => {
this.goodsList = response.rows;
this.total = response.total;
this.loading = false;
});
this.goodsList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false;
this.reset();
this.open = false
this.reset()
},
//
reset() {
@ -245,18 +339,18 @@ export default {
updateTime: null,
goodsName: null,
goodsModel: null
};
this.resetForm("form");
}
this.resetForm('form')
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
this.resetForm('queryForm')
this.handleQuery()
},
//
handleSelectionChange(selection) {
@ -266,51 +360,52 @@ export default {
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加商品信息";
this.reset()
this.open = true
this.title = '添加商品信息'
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
this.reset()
const id = row.id || this.ids
getGoods(id).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改商品信息";
});
this.form = response.data
this.open = true
this.title = '修改商品信息'
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
this.$refs['form'].validate(valid => {
if (valid) {
if (this.form.id != null) {
let data = Object.assign({}, this.form)
delete data.explain
updateGoods(data).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
this.$modal.msgSuccess('修改成功')
this.open = false
this.getList()
})
} else {
addGoods(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
this.$modal.msgSuccess('新增成功')
this.open = false
this.getList()
})
}
}
});
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除商品信息编号为"' + ids + '"的数据项?').then(function() {
return delGoods(ids);
return delGoods(ids)
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => { });
this.getList()
this.$modal.msgSuccess('删除成功')
}).catch(() => {
})
},
/** 导出按钮操作 */
handleExport() {
@ -319,5 +414,5 @@ export default {
}, `goods_${new Date().getTime()}.xlsx`)
}
}
};
}
</script>

View File

@ -2,12 +2,21 @@
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
<el-form-item label="菜单名称" prop="menuName">
<el-input v-model="queryParams.menuName" placeholder="请输入菜单名称" clearable @keyup.enter.native="handleQuery" />
<el-input
v-model="queryParams.menuName"
placeholder="请输入菜单名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="菜单状态" clearable>
<el-option v-for="dict in dict.type.sys_normal_disable" :key="dict.value" :label="dict.label"
:value="dict.value" />
<el-option
v-for="dict in dict.type.sys_normal_disable"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item>
@ -18,17 +27,35 @@
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
v-hasPermi="['system:menu:add']">新增</el-button>
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:menu:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="info" plain icon="el-icon-sort" size="mini" @click="toggleExpandAll">展开/折叠</el-button>
<el-button
type="info"
plain
icon="el-icon-sort"
size="mini"
@click="toggleExpandAll"
>展开/折叠</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-if="refreshTable" v-loading="loading" :data="menuList" row-key="menuId" :default-expand-all="isExpandAll"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
<el-table
v-if="refreshTable"
v-loading="loading"
:data="menuList"
row-key="menuId"
:default-expand-all="isExpandAll"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
>
<el-table-column prop="menuName" label="菜单名称" :show-overflow-tooltip="true" width="160"></el-table-column>
<el-table-column prop="icon" label="图标" align="center" width="100">
<template slot-scope="scope">
@ -50,12 +77,27 @@
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
v-hasPermi="['system:menu:edit']">修改</el-button>
<el-button size="mini" type="text" icon="el-icon-plus" @click="handleAdd(scope.row)"
v-hasPermi="['system:menu:add']">新增</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
v-hasPermi="['system:menu:remove']">删除</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:menu:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-plus"
@click="handleAdd(scope.row)"
v-hasPermi="['system:menu:add']"
>新增</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:menu:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
@ -66,8 +108,13 @@
<el-row>
<el-col :span="24">
<el-form-item label="上级菜单" prop="parentId">
<treeselect v-model="form.parentId" :options="menuOptions" :normalizer="normalizer" :show-count="true"
placeholder="选择上级菜单" />
<treeselect
v-model="form.parentId"
:options="menuOptions"
:normalizer="normalizer"
:show-count="true"
placeholder="选择上级菜单"
/>
</el-form-item>
</el-col>
<el-col :span="24">
@ -81,10 +128,20 @@
</el-col>
<el-col :span="24" v-if="form.menuType != 'F'">
<el-form-item label="菜单图标" prop="icon">
<el-popover placement="bottom-start" width="460" trigger="hover" @show="$refs['iconSelect'].reset()">
<el-popover
placement="bottom-start"
width="460"
trigger="click"
@show="$refs['iconSelect'].reset()"
>
<IconSelect ref="iconSelect" @selected="selected" :active-icon="form.icon" />
<el-input slot="reference" v-model="form.icon" placeholder="点击选择图标" readonly>
<svg-icon v-if="form.icon" slot="prefix" :icon-class="form.icon" style="width: 25px;" />
<svg-icon
v-if="form.icon"
slot="prefix"
:icon-class="form.icon"
style="width: 25px;"
/>
<i v-else slot="prefix" class="el-icon-search el-input__icon" />
</el-input>
</el-popover>
@ -181,8 +238,11 @@
显示状态
</span>
<el-radio-group v-model="form.visible">
<el-radio v-for="dict in dict.type.sys_show_hide" :key="dict.value"
:label="dict.value">{{ dict.label }}</el-radio>
<el-radio
v-for="dict in dict.type.sys_show_hide"
:key="dict.value"
:label="dict.value"
>{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
@ -195,8 +255,11 @@
菜单状态
</span>
<el-radio-group v-model="form.status">
<el-radio v-for="dict in dict.type.sys_normal_disable" :key="dict.value"
:label="dict.value">{{ dict.label }}</el-radio>
<el-radio
v-for="dict in dict.type.sys_normal_disable"
:key="dict.value"
:label="dict.value"
>{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>

View File

@ -2,14 +2,31 @@
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="表名称" prop="tableName">
<el-input v-model="queryParams.tableName" placeholder="请输入表名称" clearable @keyup.enter.native="handleQuery" />
<el-input
v-model="queryParams.tableName"
placeholder="请输入表名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="表描述" prop="tableComment">
<el-input v-model="queryParams.tableComment" placeholder="请输入表描述" clearable @keyup.enter.native="handleQuery" />
<el-input
v-model="queryParams.tableComment"
placeholder="请输入表描述"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="创建时间">
<el-date-picker v-model="dateRange" style="width: 240px" value-format="yyyy-MM-dd" type="daterange"
range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
<el-date-picker
v-model="dateRange"
style="width: 240px"
value-format="yyyy-MM-dd"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
@ -19,20 +36,46 @@
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="el-icon-download" size="mini" @click="handleGenTable"
v-hasPermi="['tool:gen:code']">生成</el-button>
<el-button
type="primary"
plain
icon="el-icon-download"
size="mini"
@click="handleGenTable"
v-hasPermi="['tool:gen:code']"
>生成</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="info" plain icon="el-icon-upload" size="mini" @click="openImportTable"
v-hasPermi="['tool:gen:import']">导入</el-button>
<el-button
type="info"
plain
icon="el-icon-upload"
size="mini"
@click="openImportTable"
v-hasPermi="['tool:gen:import']"
>导入</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleEditTable"
v-hasPermi="['tool:gen:edit']">修改</el-button>
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleEditTable"
v-hasPermi="['tool:gen:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
v-hasPermi="['tool:gen:remove']">删除</el-button>
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['tool:gen:remove']"
>删除</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
@ -44,40 +87,100 @@
<span>{{(queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1}}</span>
</template>
</el-table-column>
<el-table-column label="表名称" align="center" prop="tableName" :show-overflow-tooltip="true" width="120" />
<el-table-column label="表描述" align="center" prop="tableComment" :show-overflow-tooltip="true" width="120" />
<el-table-column label="实体" align="center" prop="className" :show-overflow-tooltip="true" width="120" />
<el-table-column
label="表名称"
align="center"
prop="tableName"
:show-overflow-tooltip="true"
width="120"
/>
<el-table-column
label="表描述"
align="center"
prop="tableComment"
:show-overflow-tooltip="true"
width="120"
/>
<el-table-column
label="实体"
align="center"
prop="className"
:show-overflow-tooltip="true"
width="120"
/>
<el-table-column label="创建时间" align="center" prop="createTime" width="160" />
<el-table-column label="更新时间" align="center" prop="updateTime" width="160" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button type="text" size="small" icon="el-icon-view" @click="handlePreview(scope.row, false)"
v-hasPermi="['tool:gen:preview']">预览</el-button>
<el-button type="text" size="small" icon="el-icon-view" @click="handlePreview(scope.row, true)"
v-hasPermi="['tool:gen:preview']">预览JSON</el-button>
<el-button type="text" size="small" icon="el-icon-edit" @click="handleEditTable(scope.row)"
v-hasPermi="['tool:gen:edit']">编辑</el-button>
<el-button type="text" size="small" icon="el-icon-delete" @click="handleDelete(scope.row)"
v-hasPermi="['tool:gen:remove']">删除</el-button>
<el-button type="text" size="small" icon="el-icon-refresh" @click="handleSynchDb(scope.row)"
v-hasPermi="['tool:gen:edit']">同步</el-button>
<el-button type="text" size="small" icon="el-icon-download" @click="handleGenTable(scope.row, false)"
v-hasPermi="['tool:gen:code']">生成代码</el-button>
<el-button type="text" size="small" icon="el-icon-download" @click="handleGenTable(scope.row, true)"
v-hasPermi="['tool:gen:code']">生成JSON</el-button>
<el-button
type="text"
size="small"
icon="el-icon-view"
@click="handlePreview(scope.row, false)"
v-hasPermi="['tool:gen:preview']"
>预览</el-button>
<el-button
type="text"
size="small"
icon="el-icon-view"
@click="handlePreview(scope.row,true)"
v-hasPermi="['tool:gen:preview']"
>预览JSON</el-button>
<el-button
type="text"
size="small"
icon="el-icon-edit"
@click="handleEditTable(scope.row)"
v-hasPermi="['tool:gen:edit']"
>编辑</el-button>
<el-button
type="text"
size="small"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['tool:gen:remove']"
>删除</el-button>
<el-button
type="text"
size="small"
icon="el-icon-refresh"
@click="handleSynchDb(scope.row)"
v-hasPermi="['tool:gen:edit']"
>同步</el-button>
<el-button
type="text"
size="small"
icon="el-icon-download"
@click="handleGenTable(scope.row,false)"
v-hasPermi="['tool:gen:code']"
>生成代码</el-button>
<el-button
type="text"
size="small"
icon="el-icon-download"
@click="handleGenTable(scope.row,true)"
v-hasPermi="['tool:gen:code']"
>生成JSON</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
@pagination="getList" />
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 预览界面 -->
<el-dialog :title="preview.title" :visible.sync="preview.open" width="80%" top="5vh" append-to-body class="scrollbar">
<el-tabs v-model="preview.activeName">
<el-tab-pane v-for="(value, key) in preview.data"
<el-tab-pane
v-for="(value, key) in preview.data"
:label="key.substring(key.lastIndexOf('/')+1,key.indexOf('.vm'))"
:name="key.substring(key.lastIndexOf('/') + 1, key.indexOf('.vm'))" :key="key">
<el-link :underline="false" icon="el-icon-document-copy" v-clipboard:copy="value"
v-clipboard:success="clipboardSuccess" style="float:right">复制</el-link>
:name="key.substring(key.lastIndexOf('/')+1,key.indexOf('.vm'))"
:key="key"
>
<el-link :underline="false" icon="el-icon-document-copy" v-clipboard:copy="value" v-clipboard:success="clipboardSuccess" style="float:right">复制</el-link>
<pre><code class="hljs" v-html="highlightedCode(value, key)"></code></pre>
</el-tab-pane>
</el-tabs>

View File

@ -35,8 +35,7 @@ module.exports = {
proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: {
// target: `http://192.168.1.23:22009`,
target: `/`,
target: `http://192.168.1.23:22009`,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: ''

View File

@ -1,4 +1,4 @@
FROM 192.168.5.120:5000/library/maven:latest AS builder
FROM docker.yzj/library/maven:latest AS builder
WORKDIR /app

View File

@ -15,7 +15,7 @@
<properties>
<vertx.version>4.5.7</vertx.version>
<hystrix.version>1.5.2</hystrix.version>
<resilience4j.version>1.7.0</resilience4j.version>
<resilience4j.version>2.2.0</resilience4j.version>
</properties>
<dependencyManagement>

View File

@ -8,9 +8,8 @@ import com.sf.vertx.exception.ServiceException;
import com.sf.vertx.pojo.SacCurrentLimiting;
import com.sf.vertx.utils.AppUtils;
//import io.github.resilience4j.core.functions.CheckedRunnable;
import io.github.resilience4j.core.functions.CheckedRunnable;
import io.github.resilience4j.ratelimiter.RateLimiter;
import io.vavr.CheckedRunnable;
import io.vertx.ext.web.RoutingContext;
import lombok.extern.slf4j.Slf4j;

View File

@ -6,9 +6,8 @@ import com.sf.vertx.exception.ServiceException;
import com.sf.vertx.pojo.SacCurrentLimiting;
import com.sf.vertx.utils.AppUtils;
//import io.github.resilience4j.core.functions.CheckedRunnable;
import io.github.resilience4j.core.functions.CheckedRunnable;
import io.github.resilience4j.ratelimiter.RateLimiter;
import io.vavr.CheckedRunnable;
import io.vertx.ext.web.RoutingContext;
import io.vertx.ext.web.handler.HttpException;
import lombok.extern.slf4j.Slf4j;

View File

@ -18,7 +18,7 @@
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<vertx.version>4.5.7</vertx.version>
<hystrix.version>1.5.2</hystrix.version>
<resilience4j.version>1.7.0</resilience4j.version>
<resilience4j.version>2.2.0</resilience4j.version>
<fastjson.version>2.0.34</fastjson.version>
<commons.collections.version>3.2.2</commons.collections.version>
<hutool.version>5.8.22</hutool.version>