提交 a049ff63 编写于 作者: ibizdev's avatar ibizdev

ibizdev提交

上级 7b6b1b6c
......@@ -133,7 +133,7 @@ export class ChartSeries {
this.type = !Object.is(opts.type, '') ? opts.type : '';
this.name = !Object.is(opts.name, '') ? opts.name : '';
this.caption = !Object.is(opts.caption, '') ? opts.caption : '';
this.seriesIdField = !Object.is(opts.seriesIdField, '') ? opts.seriesIdField : '';
this.seriesIdField = (opts.seriesIdField && !Object.is(opts.seriesIdField, '')) ? opts.seriesIdField : (opts.seriesNameField && !Object.is(opts.seriesNameField, '')) ? opts.seriesNameField : '';
this.seriesNameField = !Object.is(opts.seriesNameField, '') ? opts.seriesNameField : '';
this.index = this.index ? this.index : 0;
this.chart = opts.chart ? opts.chart : null;
......
......@@ -21,7 +21,7 @@
<template v-else>
<i class='fa fa-cogs app-menu-icon'></i>
</template>
<span class='text' slot='title'>{{$t('app.menus.appindexview.' + item0.name)}}</span>
<span class='text' :title="$t('app.menus.appindexview.' + item0.name)">{{$t('app.menus.appindexview.' + item0.name)}}</span>
</template>
<template v-for="item1 in item0.items">
<template v-if="item1.items && Array.isArray(item1.items) && item1.items.length > 0">
......@@ -33,7 +33,7 @@
<template v-else-if="item1.iconcls && item1.iconcls != ''">
<i :class="[item1.iconcls, 'app-menu-icon']"></i>
</template>
<span class='text' slot='title'>{{$t('app.menus.appindexview.' + item1.name)}}</span>
<span class='text' :title="$t('app.menus.appindexview.' + item1.name)">{{$t('app.menus.appindexview.' + item1.name)}}</span>
</template>
<template v-for="item2 in item1.items">
<template v-if="item2.type =='MENUITEM'">
......@@ -45,7 +45,7 @@
<i :class="[item2.iconcls, 'app-menu-icon']"></i>
</template>
<template slot="title">
<span class="text">{{$t('app.menus.appindexview.' + item2.name)}}</span>
<span class="text" :title="$t('app.menus.appindexview.' + item2.name)">{{$t('app.menus.appindexview.' + item2.name)}}</span>
<template v-if="counterdata && counterdata[item2.counterid] && counterdata[item2.counterid] > 0">
<span class="pull-right">
<badge :count="counterdata[item2.counterid]" :overflow-count="9999"></badge>
......@@ -70,7 +70,7 @@
<i :class="[item1.iconcls, 'app-menu-icon']"></i>
</template>
<template slot="title">
<span class="text">{{$t('app.menus.appindexview.' + item1.name)}} </span>
<span class="text" :title="$t('app.menus.appindexview.' + item1.name)">{{$t('app.menus.appindexview.' + item1.name)}} </span>
<template v-if="counterdata && counterdata[item1.counterid] && counterdata[item1.counterid] > 0">
<span class="pull-right">
<badge :count="counterdata[item1.counterid]" :overflow-count="9999"></badge>
......@@ -99,7 +99,7 @@
<i class='fa fa-cogs app-menu-icon'></i>
</template>
<template slot="title">
<span class="text">{{$t('app.menus.appindexview.' + item0.name)}}</span>
<span class="text" :title="$t('app.menus.appindexview.' + item0.name)">{{$t('app.menus.appindexview.' + item0.name)}}</span>
<template v-if="counterdata && counterdata[item0.counterid] && counterdata[item0.counterid] > 0">
<span class="pull-right">
<badge :count="counterdata[item0.counterid]" :overflow-count="9999"></badge>
......
......@@ -10,6 +10,10 @@
> .el-menu {
border-right: 0;
.el-menu-item {
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
word-break: break-all;
.ivu-badge {
.ivu-badge-count {
box-shadow: 0 0 0 0px #fff;
......
<template>
<i-form :model="this.data" class='app-search-form' ref='searchform' style="">
<input style="display:none;"/>
<row >
<i-col v-show="detailsModel.n_ibzdictitemname_like.visible" :style="{}" :md="{ span: 12, offset: 0 }" :lg="{ span: 12, offset: 0 }" :xl="{ span: 12, offset: 0 }">
<app-form-item name='n_ibzdictitemname_like' :itemRules="this.rules.n_ibzdictitemname_like" class='' :caption="$t('ibzdictitem.default_searchform.details.n_ibzdictitemname_like')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.n_ibzdictitemname_like.error" :isEmptyCaption="false" labelPos="LEFT">
<input-box v-model="data.n_ibzdictitemname_like" @enter="onEnter($event)" :disabled="detailsModel.n_ibzdictitemname_like.disabled" type='text' style="width:100px;"></input-box>
</app-form-item>
</i-col>
<i-col v-show="detailsModel.n_dictitemval_like.visible" :style="{}" :md="{ span: 12, offset: 0 }" :lg="{ span: 12, offset: 0 }" :xl="{ span: 12, offset: 0 }">
<app-form-item name='n_dictitemval_like' :itemRules="this.rules.n_dictitemval_like" class='' :caption="$t('ibzdictitem.default_searchform.details.n_dictitemval_like')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.n_dictitemval_like.error" :isEmptyCaption="false" labelPos="LEFT">
<input-box v-model="data.n_dictitemval_like" @enter="onEnter($event)" :disabled="detailsModel.n_dictitemval_like.disabled" type='text' style="width:100px;"></input-box>
</app-form-item>
</i-col>
</row>
<row v-show="Object.keys(data).length>0">
<i-col :md="{ span: 4, offset: 20 }" :sm="{ span: 4, offset: 20 }" :lg="{ span: 4, offset: 20 }">
<i-button class='search_reset' size="default" type="primary" @click="onSearch">{{$t('app.searchButton.search')}}</i-button>
<i-button class='search_reset' size="default" @click="onReset">{{this.$t('app.searchButton.reset')}}</i-button>
</i-col>
</row>
<input style="display:none;"/>
<row>
<i-col span="20">
<row>
<i-col v-show="detailsModel.n_ibzdictitemname_like.visible" :style="{}" :md="{ span: 12, offset: 0 }" :lg="{ span: 12, offset: 0 }" :xl="{ span: 12, offset: 0 }">
<app-form-item name='n_ibzdictitemname_like' :itemRules="this.rules.n_ibzdictitemname_like" class='' :caption="$t('ibzdictitem.default_searchform.details.n_ibzdictitemname_like')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.n_ibzdictitemname_like.error" :isEmptyCaption="false" labelPos="LEFT">
<input-box v-model="data.n_ibzdictitemname_like" @enter="onEnter($event)" :disabled="detailsModel.n_ibzdictitemname_like.disabled" type='text' style="width:100px;"></input-box>
</app-form-item>
</i-col>
<i-col v-show="detailsModel.n_dictitemval_like.visible" :style="{}" :md="{ span: 12, offset: 0 }" :lg="{ span: 12, offset: 0 }" :xl="{ span: 12, offset: 0 }">
<app-form-item name='n_dictitemval_like' :itemRules="this.rules.n_dictitemval_like" class='' :caption="$t('ibzdictitem.default_searchform.details.n_dictitemval_like')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.n_dictitemval_like.error" :isEmptyCaption="false" labelPos="LEFT">
<input-box v-model="data.n_dictitemval_like" @enter="onEnter($event)" :disabled="detailsModel.n_dictitemval_like.disabled" type='text' style="width:100px;"></input-box>
</app-form-item>
</i-col>
</row>
</i-col>
<i-col span="4">
<row v-show="Object.keys(data).length>0">
<i-button class='search_reset' size="default" type="primary" @click="onSearch">{{$t('app.searchButton.search')}}</i-button>
<i-button class='search_reset' size="default" @click="onReset">{{this.$t('app.searchButton.reset')}}</i-button>
</row>
</i-col>
</row>
</i-form>
</template>
<script lang='tsx'>
......
......@@ -5,9 +5,13 @@
padding: 14px 0;
}
.app-search-form {
padding: 0 14px;
padding: 8px 14px 0;
.ivu-form-item{
margin-bottom: 8px;
}
.search_reset {
margin-right: 12px;
margin-bottom: 8px;
}
}
.app-search-form-flex {
......
......@@ -72,6 +72,9 @@
</template>
</el-table-column>
</template>
<template v-if="adaptiveState">
<el-table-column></el-table-column>
</template>
</el-table>
<row class='grid-pagination' v-show="items.length > 0">
<page class='pull-right' @on-change="pageOnChange($event)"
......@@ -531,7 +534,7 @@ export default class MainBase extends Vue implements ControlInterface {
* @type {boolean}
* @memberof AppEmbedPicker
*/
protected isDragendCol: boolean = true;
protected isDragendCol: boolean = false;
/**
* 所有列成员
......@@ -1298,6 +1301,17 @@ export default class MainBase extends Vue implements ControlInterface {
return column.show ? true : false;
}
/**
* 表格列是否自适应布局
*
* @readonly
* @type {boolean}
* @memberof Main
*/
get adaptiveState(): boolean {
return !this.allColumns.find((column: any) => column.show && Object.is(column.util, 'STAR'));
}
/**
* 保存
*
......
<template>
<i-form :model="this.data" class='app-search-form' ref='searchform' style="">
<input style="display:none;"/>
<row >
<i-col v-show="detailsModel.n_ibzdictid_like.visible" :style="{}" :md="{ span: 12, offset: 0 }" :lg="{ span: 12, offset: 0 }" :xl="{ span: 12, offset: 0 }">
<app-form-item name='n_ibzdictid_like' :itemRules="this.rules.n_ibzdictid_like" class='' :caption="$t('ibzdict.default_searchform.details.n_ibzdictid_like')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.n_ibzdictid_like.error" :isEmptyCaption="false" labelPos="LEFT">
<app-span :value="data.n_ibzdictid_like" style="width:100px;"></app-span>
</app-form-item>
</i-col>
<i-col v-show="detailsModel.n_ibzdictname_like.visible" :style="{}" :md="{ span: 12, offset: 0 }" :lg="{ span: 12, offset: 0 }" :xl="{ span: 12, offset: 0 }">
<app-form-item name='n_ibzdictname_like' :itemRules="this.rules.n_ibzdictname_like" class='' :caption="$t('ibzdict.default_searchform.details.n_ibzdictname_like')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.n_ibzdictname_like.error" :isEmptyCaption="false" labelPos="LEFT">
<input-box v-model="data.n_ibzdictname_like" @enter="onEnter($event)" :disabled="detailsModel.n_ibzdictname_like.disabled" type='text' style="width:100px;"></input-box>
</app-form-item>
</i-col>
</row>
<row v-show="Object.keys(data).length>0">
<i-col :md="{ span: 4, offset: 20 }" :sm="{ span: 4, offset: 20 }" :lg="{ span: 4, offset: 20 }">
<i-button class='search_reset' size="default" type="primary" @click="onSearch">{{$t('app.searchButton.search')}}</i-button>
<i-button class='search_reset' size="default" @click="onReset">{{this.$t('app.searchButton.reset')}}</i-button>
</i-col>
</row>
<input style="display:none;"/>
<row>
<i-col span="20">
<row>
<i-col v-show="detailsModel.n_ibzdictid_like.visible" :style="{}" :md="{ span: 12, offset: 0 }" :lg="{ span: 12, offset: 0 }" :xl="{ span: 12, offset: 0 }">
<app-form-item name='n_ibzdictid_like' :itemRules="this.rules.n_ibzdictid_like" class='' :caption="$t('ibzdict.default_searchform.details.n_ibzdictid_like')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.n_ibzdictid_like.error" :isEmptyCaption="false" labelPos="LEFT">
<app-span :value="data.n_ibzdictid_like" style="width:100px;"></app-span>
</app-form-item>
</i-col>
<i-col v-show="detailsModel.n_ibzdictname_like.visible" :style="{}" :md="{ span: 12, offset: 0 }" :lg="{ span: 12, offset: 0 }" :xl="{ span: 12, offset: 0 }">
<app-form-item name='n_ibzdictname_like' :itemRules="this.rules.n_ibzdictname_like" class='' :caption="$t('ibzdict.default_searchform.details.n_ibzdictname_like')" uiStyle="DEFAULT" :labelWidth="130" :isShowCaption="true" :error="detailsModel.n_ibzdictname_like.error" :isEmptyCaption="false" labelPos="LEFT">
<input-box v-model="data.n_ibzdictname_like" @enter="onEnter($event)" :disabled="detailsModel.n_ibzdictname_like.disabled" type='text' style="width:100px;"></input-box>
</app-form-item>
</i-col>
</row>
</i-col>
<i-col span="4">
<row v-show="Object.keys(data).length>0">
<i-button class='search_reset' size="default" type="primary" @click="onSearch">{{$t('app.searchButton.search')}}</i-button>
<i-button class='search_reset' size="default" @click="onReset">{{this.$t('app.searchButton.reset')}}</i-button>
</row>
</i-col>
</row>
</i-form>
</template>
<script lang='tsx'>
......
......@@ -5,9 +5,13 @@
padding: 14px 0;
}
.app-search-form {
padding: 0 14px;
padding: 8px 14px 0;
.ivu-form-item{
margin-bottom: 8px;
}
.search_reset {
margin-right: 12px;
margin-bottom: 8px;
}
}
.app-search-form-flex {
......
......@@ -37,6 +37,9 @@
</template>
</el-table-column>
</template>
<template v-if="adaptiveState">
<el-table-column></el-table-column>
</template>
</el-table>
<row class='grid-pagination' v-show="items.length > 0">
<page class='pull-right' @on-change="pageOnChange($event)"
......@@ -496,7 +499,7 @@ export default class MainBase extends Vue implements ControlInterface {
* @type {boolean}
* @memberof AppEmbedPicker
*/
protected isDragendCol: boolean = true;
protected isDragendCol: boolean = false;
/**
* 所有列成员
......@@ -1228,6 +1231,17 @@ export default class MainBase extends Vue implements ControlInterface {
return column.show ? true : false;
}
/**
* 表格列是否自适应布局
*
* @readonly
* @type {boolean}
* @memberof Main
*/
get adaptiveState(): boolean {
return !this.allColumns.find((column: any) => column.show && Object.is(column.util, 'STAR'));
}
/**
* 保存
*
......
......@@ -21,11 +21,26 @@
</dependency>
</dependencies>
<profiles>
<profile>
<id>prod</id>
<id>web</id>
<build>
<resources>
<resource>
<directory>${basedir}/src/main/webapp</directory>
<!--注意此次必须要放在此目录下才能被访问到 -->
<targetPath>META-INF/resources</targetPath>
<includes>
<include>**/**</include>
</includes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
......@@ -59,49 +74,28 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>ibzdict-app-web</finalName>
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
<mainClass>cn.ibizlab.web.webApplication</mainClass>
<outputDirectory>../../</outputDirectory>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<build>
<resources>
<resource>
<directory>${basedir}/src/main/webapp</directory>
<!--注意此次必须要放在此目录下才能被访问到 -->
<targetPath>META-INF/resources</targetPath>
<includes>
<include>**/**</include>
</includes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>ibzdict-app-web</finalName>
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
<mainClass>cn.ibizlab.web.webApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
......@@ -38,28 +38,9 @@ public class webSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
AuthorizationTokenFilter authenticationTokenFilter;
@Value("${ibiz.jwt.header:Authorization}")
private String tokenHeader;
@Value("${ibiz.custompermitpath:custompermit}")
private String custompermitpath;
@Value("${ibiz.customanonymouspath:customanonymous}")
private String customanonymouspath;
@Value("${ibiz.auth.path:v7/login}")
private String loginPath;
@Value("${ibiz.file.uploadpath:ibzutil/upload}")
private String uploadpath;
private final String defaultdownloadpath="util/download/{id}";
@Value("${ibiz.file.downloadpath:"+defaultdownloadpath+"}")
private String downloadpath;
@Value("${ibiz.file.previewpath:ibzutil/preview}")
private String previewpath;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
......@@ -114,35 +95,8 @@ public class webSecurityConfig extends WebSecurityConfigurerAdapter {
"/**/img/**",
"/"
).permitAll()
//放行登录请求
.antMatchers( HttpMethod.POST,"/"+loginPath).permitAll()
.antMatchers("/websocket/**").permitAll()
// 文件操作
.antMatchers("/"+downloadpath).permitAll()
.antMatchers("/"+uploadpath).permitAll()
.antMatchers("/"+previewpath+"/**").permitAll()
.antMatchers("/"+custompermitpath+"/**").permitAll()
.antMatchers("/"+customanonymouspath+"/**").anonymous()
.antMatchers("/**/codelist/**").permitAll()
.antMatchers("/**/getappdata").permitAll()
// 系统监控
.antMatchers("/actuator/**").anonymous()
// swagger start
.antMatchers("/swagger-ui.html").anonymous()
.antMatchers("/swagger-resources/**").anonymous()
.antMatchers("/webjars/**").anonymous()
.antMatchers("/*/api-docs").anonymous()
// swagger end
// 接口限流测试
.antMatchers("/test/**").anonymous()
.antMatchers(HttpMethod.OPTIONS, "/**").anonymous()
.antMatchers("/druid/**").permitAll()
// 所有请求都需要认证
.anyRequest().authenticated()
// 防止iframe 造成跨域
......
server:
devmode: true
port: 8080
servlet:
session:
cookie:
name: ibzdict-app-web
spring:
cloud:
nacos:
discovery:
server-addr: 172.16.102.211:8848
sysapi:
defaultServiceId: ibzdict
defaultStripPrefix: false
ribbon:
ReadTimeout: 60000
ConnectTimeout: 60000
application:
name: ibzdict-web
server:
devmode: true
port: 8080
servlet:
session:
cookie:
name: ibzdict-app-web
spring:
application:
name: ibzdict-app-web
cloud:
nacos:
discovery:
server-addr: 172.16.102.211:8848
datasource:
password: 'E6@8@7ce'
username: a_A_5ae9eb39a
url: jdbc:mysql://172.16.180.232:3306/a_A_5ae9eb39a?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true
driver-class-name: com.mysql.jdbc.Driver
filters: stat,wall,log4j2
#配置初始化大小/最小/最大
initial-size: 1
min-idle: 1
max-active: 20
#获取连接等待超时时间
max-wait: 60000
#间隔多久进行一次检测,检测需要关闭的空闲连接
time-between-eviction-runs-millis: 60000
#一个连接在池中最小生存的时间
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
#打开PSCache,并指定每个连接上PSCache的大小。oracle设为true,mysql设为false。分库分表较多推荐设置为false
pool-prepared-statements: false
max-pool-prepared-statement-per-connection-size: 20
sysapi:
defaultStripPrefix: false
name: ibzdict-web
#zuul网关路由设置
zuul:
routes:
ibzdictitem:
path: /ibzdictitems/**
serviceId: ibzdict-dictapi
stripPrefix: ${sysapi.defaultStripPrefix}
stripPrefix: false
ibzdict:
path: /ibzdicts/**
serviceId: ibzdict-dictapi
stripPrefix: ${sysapi.defaultStripPrefix}
stripPrefix: false
sensitive-headers:
- Cookie,Set-Cookie,Authorization
ribbon:
ReadTimeout: 60000
ConnectTimeout: 60000
spring:
profiles:
include: web-prod, sys
include: sys , web-prod
......@@ -31,35 +31,42 @@
</dependency>
</dependencies>
<!--由于boot是通过dependency来关联所有子项目,页面和配置等信息都存在与子项目中,
所以您在对boot进行打包前,需要先将子项目install到maven仓库,以确保boot可以正常引用所有完整的子项目-->
<profiles>
<profile>
<id>boot</id>
<build>
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
</resource>
</resources>
<build>
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>ibzdict</finalName>
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
<mainClass>cn.ibizlab.DevBootApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>ibzdict</finalName>
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
<mainClass>cn.ibizlab.DevBootApplication</mainClass>
<outputDirectory>../</outputDirectory>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
package cn.ibizlab;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import cn.ibizlab.util.helper.UniqueNameGenerator;
import org.springframework.boot.SpringApplication;
@Slf4j
@SpringBootApplication(exclude = {
})
@Import({
// cn.ibizlab
})
@EnableDiscoveryClient
@Configuration
@EnableTransactionManagement
public class DevBootApplication extends WebMvcConfigurerAdapter {
@SpringBootApplication
public class DevBootApplication{
public static void main(String[] args) {
SpringApplicationBuilder builder=new SpringApplicationBuilder(DevBootApplication.class);
builder.run(args);
SpringApplication.run(DevBootApplication.class,args);
}
}
package cn.ibizlab.config;
import cn.ibizlab.util.security.AuthenticationEntryPoint;
import cn.ibizlab.util.security.AuthorizationTokenFilter;
import cn.ibizlab.util.service.AuthenticationUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.core.GrantedAuthorityDefaults;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
@Configuration
@EnableWebSecurity
public class DevBootSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private AuthenticationEntryPoint unauthorizedHandler;
@Autowired
private AuthenticationUserService userDetailsService;
/**
* 自定义基于JWT的安全过滤器
*/
@Autowired
AuthorizationTokenFilter authenticationTokenFilter;
@Value("${ibiz.auth.path:v7/login}")
private String loginPath;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(userDetailsService)
.passwordEncoder(passwordEncoderBean());
}
@Bean
GrantedAuthorityDefaults grantedAuthorityDefaults() {
// Remove the ROLE_ prefix
return new GrantedAuthorityDefaults("");
}
@Bean
public PasswordEncoder passwordEncoderBean() {
return new BCryptPasswordEncoder();
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity
// 禁用 CSRF
.csrf().disable()
// 授权异常
.exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
// 不创建会话
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
// 过滤请求
.authorizeRequests()
.antMatchers(
HttpMethod.GET,
"/*.html",
"/**/*.html",
"/**/*.css",
"/**/*.js",
"/**/*.ico",
"/**/assets/**",
"/**/css/**",
"/**/fonts/**",
"/**/js/**",
"/**/img/**",
"/"
).permitAll()
//放行登录请求
.antMatchers( HttpMethod.POST,"/"+loginPath).permitAll()
.anyRequest().authenticated()
// 防止iframe 造成跨域
.and().headers().frameOptions().disable();
httpSecurity
.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
}
}
server:
port: 8080
spring:
application:
name: ibzdict
main:
allow-bean-definition-overriding: true
feign:
sentinel:
enabled: true
# Logger Config
logging:
level:
cn.ibizlab: debug
org.springframework.boot.autoconfigure: ERROR
client:
service:
ibiz:
wfrootpath:
spring:
profiles:
include: dev, core, mybatis, sys ,web-dev
include: sys , web-dev, dictapi-dev, dev
......@@ -19,6 +19,7 @@ import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.util.ObjectUtils;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.context.annotation.Lazy;
import cn.ibizlab.core.dict.domain.IBZDictItem;
import cn.ibizlab.core.dict.filter.IBZDictItemSearchContext;
import cn.ibizlab.core.dict.service.IIBZDictItemService;
......@@ -42,6 +43,7 @@ public class IBZDictItemServiceImpl implements IIBZDictItemService {
@Autowired
private IBZDictItemRepository repository;
@Override
@Transactional
public IBZDictItem get(String key) {
......@@ -51,8 +53,10 @@ public class IBZDictItemServiceImpl implements IIBZDictItemService {
et.setItemid(key);
return et;
}
else
else{
IBZDictItem et=result.get();
return result.get();
}
}
@Override
......@@ -63,7 +67,9 @@ public class IBZDictItemServiceImpl implements IIBZDictItemService {
@Override
@Transactional
public boolean save(IBZDictItem et) {
if(et.getItemid()==null) et.setItemid((String)et.getDefaultKey());
repository.save(et);
CachedBeanCopier.copy(get(et.getItemid()),et);
return true ;
}
......@@ -93,7 +99,9 @@ public class IBZDictItemServiceImpl implements IIBZDictItemService {
@Override
@Transactional
public boolean create(IBZDictItem et) {
if(et.getItemid()==null) et.setItemid((String)et.getDefaultKey());
repository.insert(et);
CachedBeanCopier.copy(get(et.getItemid()),et);
return true ;
}
......@@ -106,6 +114,7 @@ public class IBZDictItemServiceImpl implements IIBZDictItemService {
@Transactional
public boolean update(IBZDictItem et) {
repository.save(et);
CachedBeanCopier.copy(get(et.getItemid()),et);
return true ;
}
......
......@@ -19,6 +19,7 @@ import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.util.ObjectUtils;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.context.annotation.Lazy;
import cn.ibizlab.core.dict.domain.IBZDict;
import cn.ibizlab.core.dict.filter.IBZDictSearchContext;
import cn.ibizlab.core.dict.service.IIBZDictService;
......@@ -42,6 +43,10 @@ public class IBZDictServiceImpl implements IIBZDictService {
@Autowired
private IBZDictRepository repository;
@Autowired
@Lazy
private cn.ibizlab.core.dict.service.IIBZDictItemService ibzdictitemService;
@Override
@Transactional
public IBZDict get(String key) {
......@@ -51,14 +56,20 @@ public class IBZDictServiceImpl implements IIBZDictService {
et.setDictid(key);
return et;
}
else
else{
IBZDict et=result.get();
et.setItems(ibzdictitemService.selectByDictid(key));
return result.get();
}
}
@Override
@Transactional
public boolean create(IBZDict et) {
if(et.getDictid()==null) et.setDictid((String)et.getDefaultKey());
repository.insert(et);
ibzdictitemService.saveByDictid(et.getItems());
CachedBeanCopier.copy(get(et.getDictid()),et);
return true ;
}
......@@ -81,6 +92,8 @@ public class IBZDictServiceImpl implements IIBZDictService {
@Transactional
public boolean update(IBZDict et) {
repository.save(et);
ibzdictitemService.saveByDictid(et.getItems());
CachedBeanCopier.copy(get(et.getDictid()),et);
return true ;
}
......@@ -92,6 +105,7 @@ public class IBZDictServiceImpl implements IIBZDictService {
@Override
@Transactional
public boolean remove(String key) {
ibzdictitemService.removeByDictid(key) ;
repository.deleteById(key);
return true ;
}
......@@ -104,7 +118,10 @@ public class IBZDictServiceImpl implements IIBZDictService {
@Override
@Transactional
public boolean save(IBZDict et) {
if(et.getDictid()==null) et.setDictid((String)et.getDefaultKey());
repository.save(et);
ibzdictitemService.saveByDictid(et.getItems());
CachedBeanCopier.copy(get(et.getDictid()),et);
return true ;
}
......
package cn.ibizlab.core.util.config;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.*;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.internal.io.ResourceFactory;
import org.kie.spring.KModuleBeanFactoryPostProcessor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.IOException;
import java.util.List;
@Configuration
public class DroolsAutoConfiguration {
private Log logger= LogFactory.getLog(DroolsAutoConfiguration.class);
private static final String RULES_PATH = "rules/";
@Bean
@ConditionalOnMissingBean(KieFileSystem.class)
public KieFileSystem kieFileSystem() throws IOException {
KieFileSystem kieFileSystem = getKieServices().newKieFileSystem();
for (Resource file : getRuleFiles()) {
kieFileSystem.write(ResourceFactory.newUrlResource(file.getURL()));
}
return kieFileSystem;
}
private Resource[] getRuleFiles() throws IOException {
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
return resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "**/*.*");
}
@Bean
@ConditionalOnMissingBean(KieContainer.class)
public KieContainer kieContainer() throws IOException {
final KieRepository kieRepository = getKieServices().getRepository();
kieRepository.addKieModule(new KieModule() {
public ReleaseId getReleaseId() {
return kieRepository.getDefaultReleaseId();
}
});
KieBuilder kieBuilder = getKieServices().newKieBuilder(kieFileSystem());
kieBuilder.buildAll();
if(kieBuilder.getResults().hasMessages(new Message.Level[] { Message.Level.ERROR })){
List<Message> errors = kieBuilder.getResults().getMessages(new Message.Level[] { Message.Level.ERROR });
StringBuilder stringBuilder = new StringBuilder("Errors:");
for (Message msg : errors)
{
stringBuilder.append(new StringBuilder().append("\n ").append(prettyBuildMessage(msg)).toString());
}
logger.error(String.format("初始化处理逻辑发生异常,异常原因为[%s]",stringBuilder.toString()));
//忽略处理逻辑
getKieServices().newKieBuilder(getKieServices().newKieFileSystem()).buildAll();
}
return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId());
}
private KieServices getKieServices() {
return KieServices.Factory.get();
}
@Bean
@ConditionalOnMissingBean(KieBase.class)
public KieBase kieBase() throws IOException {
return kieContainer().getKieBase();
}
@Bean
@ConditionalOnMissingBean(KieSession.class)
public KieSession kieSession() throws IOException {
return kieContainer().newKieSession();
}
@Bean
@ConditionalOnMissingBean(KModuleBeanFactoryPostProcessor.class)
public KModuleBeanFactoryPostProcessor kiePostProcessor() {
return new KModuleBeanFactoryPostProcessor();
}
/**
* 输出异常信息
* @param msg
* @return
*/
public static String prettyBuildMessage(Message msg)
{
return new StringBuilder().append("Message: {id=").append(msg.getId()).append(", level=").append(msg.getLevel()).append(", path=").append(msg.getPath()).append(", line=").append(msg.getLine())
.append(", column=").append(msg.getColumn()).append(", text=\"").append(msg.getText()).append("\"}").toString();
}
}
\ No newline at end of file
......@@ -30,4 +30,41 @@
<artifactId>springfox-swagger-ui</artifactId>
</dependency>
</dependencies>
<profiles>
<profile>
<id>dictapi</id>
<build>
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>ibzdict-provider-dictapi</finalName>
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
<mainClass>cn.ibizlab.dictapi.ibzdictdictapiApplication</mainClass>
<outputDirectory>../../</outputDirectory>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
......@@ -19,7 +19,9 @@ import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.context.annotation.Profile;
@Profile("dictapi-prod")
@Configuration
@EnableWebSecurity
public class dictapiSecurityConfig extends WebSecurityConfigurerAdapter {
......@@ -36,28 +38,6 @@ public class dictapiSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
AuthorizationTokenFilter authenticationTokenFilter;
@Value("${ibiz.jwt.header:Authorization}")
private String tokenHeader;
@Value("${ibiz.custompermitpath:custompermit}")
private String custompermitpath;
@Value("${ibiz.customanonymouspath:customanonymous}")
private String customanonymouspath;
@Value("${ibiz.auth.path:v7/login}")
private String loginPath;
@Value("${ibiz.file.uploadpath:ibzutil/upload}")
private String uploadpath;
private final String defaultdownloadpath="util/download/{id}";
@Value("${ibiz.file.downloadpath:"+defaultdownloadpath+"}")
private String downloadpath;
@Value("${ibiz.file.previewpath:ibzutil/preview}")
private String previewpath;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
......@@ -108,7 +88,7 @@ public class dictapiSecurityConfig extends WebSecurityConfigurerAdapter {
"/**/img/**",
"/"
).permitAll()
// 所有请求都无需认证
// 服务中暂时只为重构用户身份,不进行身份认证
.anyRequest().permitAll()
// 防止iframe 造成跨域
.and().headers().frameOptions().disable();
......
......@@ -51,6 +51,9 @@ public class IBZDictResource {
@Lazy
private IBZDictMapping ibzdictMapping;
@ApiOperation(value = "Get", tags = {"IBZDict" }, notes = "Get")
@RequestMapping(method = RequestMethod.GET, value = "/ibzdicts/{ibzdict_id}")
public ResponseEntity<IBZDictDTO> get(@PathVariable("ibzdict_id") String ibzdict_id) {
......@@ -59,6 +62,9 @@ public class IBZDictResource {
return ResponseEntity.status(HttpStatus.OK).body(dto);
}
@ApiOperation(value = "Create", tags = {"IBZDict" }, notes = "Create")
@RequestMapping(method = RequestMethod.POST, value = "/ibzdicts")
@Transactional
......@@ -69,18 +75,34 @@ public class IBZDictResource {
return ResponseEntity.status(HttpStatus.OK).body(dto);
}
@ApiOperation(value = "createBatch", tags = {"createBatch" }, notes = "createBatch")
@RequestMapping(method = RequestMethod.POST, value = "/ibzdicts/createbatch")
public ResponseEntity<Boolean> createBatch(@RequestBody List<IBZDictDTO> ibzdictdtos) {
ibzdictService.createBatch(ibzdictMapping.toDomain(ibzdictdtos));
return ResponseEntity.status(HttpStatus.OK).body(true);
}
@ApiOperation(value = "CheckKey", tags = {"IBZDict" }, notes = "CheckKey")
@RequestMapping(method = RequestMethod.POST, value = "/ibzdicts/checkkey")
public ResponseEntity<Boolean> checkKey(@RequestBody IBZDictDTO ibzdictdto) {
return ResponseEntity.status(HttpStatus.OK).body(ibzdictService.checkKey(ibzdictMapping.toDomain(ibzdictdto)));
}
@ApiOperation(value = "GetDraft", tags = {"IBZDict" }, notes = "GetDraft")
@RequestMapping(method = RequestMethod.GET, value = "/ibzdicts/getdraft")
@Transactional
public ResponseEntity<IBZDictDTO> getDraft() {
return ResponseEntity.status(HttpStatus.OK).body(ibzdictMapping.toDto(ibzdictService.getDraft(new IBZDict())));
}
@ApiOperation(value = "Update", tags = {"IBZDict" }, notes = "Update")
@RequestMapping(method = RequestMethod.PUT, value = "/ibzdicts/{ibzdict_id}")
@Transactional
......@@ -92,6 +114,16 @@ public class IBZDictResource {
return ResponseEntity.status(HttpStatus.OK).body(dto);
}
@ApiOperation(value = "UpdateBatch", tags = {"UpdateBatch" }, notes = "UpdateBatch")
@RequestMapping(method = RequestMethod.POST, value = "/ibzdicts/updatebatch")
public ResponseEntity<Boolean> updateBatch(@RequestBody List<IBZDictDTO> ibzdictdtos) {
ibzdictService.updateBatch(ibzdictMapping.toDomain(ibzdictdtos));
return ResponseEntity.status(HttpStatus.OK).body(true);
}
@ApiOperation(value = "Remove", tags = {"IBZDict" }, notes = "Remove")
@RequestMapping(method = RequestMethod.DELETE, value = "/ibzdicts/{ibzdict_id}")
@Transactional
......@@ -99,13 +131,29 @@ public class IBZDictResource {
return ResponseEntity.status(HttpStatus.OK).body(ibzdictService.remove(ibzdict_id));
}
@ApiOperation(value = "RemoveBatch", tags = {"RemoveBatch" }, notes = "RemoveBatch")
@RequestMapping(method = RequestMethod.POST, value = "/ibzdicts/removebatch")
public ResponseEntity<Boolean> removeBatch(@RequestBody List<String> ids) {
ibzdictService.removeBatch(ids);
return ResponseEntity.status(HttpStatus.OK).body(true);
}
@ApiOperation(value = "Save", tags = {"IBZDict" }, notes = "Save")
@RequestMapping(method = RequestMethod.POST, value = "/ibzdicts/{ibzdict_id}/save")
@RequestMapping(method = RequestMethod.POST, value = "/ibzdicts/save")
public ResponseEntity<Boolean> save(@RequestBody IBZDictDTO ibzdictdto) {
return ResponseEntity.status(HttpStatus.OK).body(ibzdictService.save(ibzdictMapping.toDomain(ibzdictdto)));
}
//9
@ApiOperation(value = "SaveBatch", tags = {"SaveBatch" }, notes = "SaveBatch")
@RequestMapping(method = RequestMethod.POST, value = "/ibzdicts/savebatch")
public ResponseEntity<Boolean> saveBatch(@RequestBody List<IBZDictDTO> ibzdictdtos) {
ibzdictService.saveBatch(ibzdictMapping.toDomain(ibzdictdtos));
return ResponseEntity.status(HttpStatus.OK).body(true);
}
@ApiOperation(value = "fetchDEFAULT", tags = {"IBZDict" } ,notes = "fetchDEFAULT")
@RequestMapping(method= RequestMethod.GET , value="/ibzdicts/fetchdefault")
public ResponseEntity<List<IBZDictDTO>> fetchDefault(IBZDictSearchContext context) {
......
server:
port: 8081
spring:
application:
name: ibzdict-dictapi
\ No newline at end of file
server:
port: 8081
spring:
application:
name: ibzdict-dictapi
\ No newline at end of file
spring:
profiles:
include: service, core, syscore
# include: dev, mp, druid, redis
include: sys , dictapi-prod
package cn.ibizlab.util.rest;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson.JSONObject;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "")
public class AppController {
@RequestMapping(method = RequestMethod.GET, value = "/appdata")
public ResponseEntity<JSONObject> getAppData() {
JSONObject appData = new JSONObject() ;
return ResponseEntity.status(HttpStatus.OK).body(appData);
}
}
package cn.ibizlab.util.rest;
import cn.ibizlab.util.security.AuthenticationInfo;
import cn.ibizlab.util.security.AuthenticationUser;
import cn.ibizlab.util.security.AuthorizationLogin;
import cn.ibizlab.util.security.AuthTokenUtil;
import cn.ibizlab.util.service.IBZUSERService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.util.DigestUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/")
public class AuthenticationController
{
@Value("${ibiz.auth.pwencry:false}")
private boolean pwencry;
@Value("${ibiz.jwt.header:Authorization}")
private String tokenHeader;
@Autowired
private AuthTokenUtil jwtTokenUtil;
@Autowired
@Qualifier("AuthenticationUserService")
private UserDetailsService userDetailsService;
@Autowired
private IBZUSERService userService;
@PostMapping(value = "${ibiz.auth.path:v7/login}")
public ResponseEntity<AuthenticationInfo> login(@Validated @RequestBody AuthorizationLogin authorizationLogin){
userService.resetByUsername(authorizationLogin.getUsername());
final AuthenticationUser authuserdetail = (AuthenticationUser) userDetailsService.loadUserByUsername(authorizationLogin.getUsername());
String password=authorizationLogin.getPassword();
if(pwencry)
password=DigestUtils.md5DigestAsHex(authorizationLogin.getPassword().getBytes());
if(!authuserdetail.getPassword().equals( password )){
throw new RuntimeException("用户名密码错误");
}
// 生成令牌
final String token = jwtTokenUtil.generateToken(authuserdetail);
// 返回 token
return ResponseEntity.ok().body(new AuthenticationInfo(token,authuserdetail));
}
@GetMapping(value = "${ibiz.auth.account:ibizutil/account}")
public ResponseEntity<AuthenticationUser> getUserInfo(){
UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
AuthenticationUser authuserdetail=new AuthenticationUser();
if(userDetails==null){
throw new RuntimeException("未能获取用户信息");
}
else if(userDetails instanceof AuthenticationUser ) {
authuserdetail= (AuthenticationUser)userDetails;
}
else {
authuserdetail= (AuthenticationUser)userDetailsService.loadUserByUsername(userDetails.getUsername());
}
return ResponseEntity.ok().body(authuserdetail);
}
}
#nacos配置中心、数据源
spring:
cloud:
nacos:
discovery:
server-addr: 172.16.102.211:8848
datasource:
password: 'E6@8@7ce'
username: a_A_5ae9eb39a
url: jdbc:mysql://172.16.180.232:3306/a_A_5ae9eb39a?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true
driver-class-name: com.mysql.jdbc.Driver
filters: stat,wall,log4j2
#配置初始化大小/最小/最大
initial-size: 1
min-idle: 1
max-active: 20
#获取连接等待超时时间
max-wait: 60000
#间隔多久进行一次检测,检测需要关闭的空闲连接
time-between-eviction-runs-millis: 60000
#一个连接在池中最小生存的时间
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
#打开PSCache,并指定每个连接上PSCache的大小。oracle设为true,mysql设为false。分库分表较多推荐设置为false
pool-prepared-statements: false
max-pool-prepared-statement-per-connection-size: 20
#Mybatis-plus配置
mybatis-plus:
global-config:
refresh-mapper: true
db-config:
# 全局逻辑已删除默认值
logic-delete-value: 0
# 全局逻辑未删除默认值
logic-not-delete-value: 1
mapper-locations: classpath*:/mapper/*/*/*.xml
configuration:
jdbc-type-for-null: 'null'
map-underscore-to-camel-case: false
#阿里sentinel熔断器
feign:
sentinel:
enabled: true
#Log配置
logging:
level:
cn.ibizlab: debug
org.springframework.boot.autoconfigure: ERROR
#zuul网关超时设置
ribbon:
ReadTimeout: 60000
ConnectTimeout: 60000
......@@ -14,6 +14,7 @@
<groupId>cn.ibizlab</groupId>
<artifactId>ibzdict-dependencies</artifactId>
<version>1.0.0.0</version>
<relativePath>ibzdict-dependencies/pom.xml</relativePath>
</parent>
<modules>
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册