!3 chore(config): 更新RSA私钥和Base64密钥配置

Merge pull request !3 from Odboy/dev
This commit is contained in:
2026-01-14 04:47:22 +00:00
committed by Gitee
82 changed files with 268 additions and 401 deletions
+17 -5
View File
@@ -19,6 +19,8 @@ export default {
url: '', url: '',
// 查询数据的参数 // 查询数据的参数
params: {}, params: {},
// 是否自定义参数
isCustomParams: false,
// 待查询的对象 // 待查询的对象
query: {}, query: {},
// 等待时间 // 等待时间
@@ -76,11 +78,21 @@ export default {
Object.keys(this.params).length !== 0 && Object.keys(this.params).forEach(item => { Object.keys(this.params).length !== 0 && Object.keys(this.params).forEach(item => {
if (this.params[item] === null || this.params[item] === '') this.params[item] = undefined if (this.params[item] === null || this.params[item] === '') this.params[item] = undefined
}) })
return { if (this.isCustomParams) {
page: this.page, return {
size: this.size, page: this.page,
...this.query, size: this.size,
...this.params args: {
...this.params
}
}
} else {
return {
page: this.page,
size: this.size,
...this.query,
...this.params
}
} }
}, },
// 改变页码 // 改变页码
@@ -73,7 +73,7 @@
<el-pagination <el-pagination
:total="total" :total="total"
:current-page="page" :current-page="page"
:page-size="6" :page-size="size"
style="margin-top:8px;" style="margin-top:8px;"
layout="total, prev, pager, next" layout="total, prev, pager, next"
@size-change="sizeChange" @size-change="sizeChange"
@@ -110,7 +110,13 @@ export default {
// 获取数据前设置好接口地址 // 获取数据前设置好接口地址
beforeInit() { beforeInit() {
this.url = 'api/quartzJob/searchQuartzLog' this.url = 'api/quartzJob/searchQuartzLog'
this.size = 6 this.page = 1
this.isCustomParams = true
this.params = {
jobName: this.query.jobName,
createTime: this.query.createTime,
isSuccess: this.query.isSuccess
}
return true return true
}, },
// 异常详情 // 异常详情
@@ -151,7 +151,7 @@
</template> </template>
<script> <script>
import crudRoles, {getCurrentUserRoleLevel} from '@/api/system/role' import crudRoles from '@/api/system/role'
import { searchDept, searchDeptTree } from '@/api/system/dept' import { searchDept, searchDeptTree } from '@/api/system/dept'
import { listChildMenuSetByMenuId, listMenuByPid } from '@/api/system/menu' import { listChildMenuSetByMenuId, listMenuByPid } from '@/api/system/menu'
import CRUD, { crud, form, header, presenter } from '@crud/crud' import CRUD, { crud, form, header, presenter } from '@crud/crud'
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.annotation; package cn.odboy.annotation;
import java.lang.annotation.Documented; import java.lang.annotation.Documented;
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.annotation; package cn.odboy.annotation;
import java.lang.annotation.Documented; import java.lang.annotation.Documented;
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.annotation; package cn.odboy.annotation;
import java.lang.annotation.Documented; import java.lang.annotation.Documented;
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.annotation; package cn.odboy.annotation;
import java.lang.annotation.Documented; import java.lang.annotation.Documented;
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.annotation; package cn.odboy.annotation;
import java.lang.annotation.Documented; import java.lang.annotation.Documented;
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.base; package cn.odboy.base;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
@@ -13,12 +13,11 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.base; package cn.odboy.base;
import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.annotations.ApiModelProperty;
import java.util.Date; import java.util.Date;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
@@ -29,8 +28,7 @@ import lombok.Setter;
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class KitBaseCreateTimeTb extends KitObject { public class KitBaseCreateTimeTb extends KitObject {
@Schema(name = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
@TableField(fill = FieldFill.INSERT) @TableField(fill = FieldFill.INSERT)
private Date @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
createTime; private Date createTime;
} }
@@ -13,12 +13,11 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.base; package cn.odboy.base;
import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.annotations.ApiModelProperty;
import java.util.Date; import java.util.Date;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
@@ -30,11 +29,9 @@ import lombok.Setter;
public class KitBaseTimeTb extends KitObject { public class KitBaseTimeTb extends KitObject {
@TableField(fill = FieldFill.INSERT) @TableField(fill = FieldFill.INSERT)
@Schema(name = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date private Date createTime;
createTime;
@TableField(fill = FieldFill.INSERT_UPDATE) @TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(name = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true) @ApiModelProperty(value = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date updateTime; private Date updateTime;
} }
@@ -13,12 +13,11 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.base; package cn.odboy.base;
import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.annotations.ApiModelProperty;
import java.util.Date; import java.util.Date;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
@@ -29,7 +28,7 @@ import lombok.Setter;
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class KitBaseUpdateTimeTb extends KitObject { public class KitBaseUpdateTimeTb extends KitObject {
@Schema(name = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true)
@TableField(fill = FieldFill.INSERT_UPDATE) @TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date updateTime; private Date updateTime;
} }
@@ -13,12 +13,11 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.base; package cn.odboy.base;
import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.annotations.ApiModelProperty;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.Date; import java.util.Date;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -34,13 +33,12 @@ public class KitBaseUserCreateTimeTb extends KitObject {
@CreatedBy @CreatedBy
@TableField(fill = FieldFill.INSERT) @TableField(fill = FieldFill.INSERT)
@Schema(name = "创建人", hidden = true) @ApiModelProperty(value = "创建人", hidden = true)
private String createBy; private String
createBy;
@TableField(fill = FieldFill.INSERT) @TableField(fill = FieldFill.INSERT)
@Schema(name = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date private Date createTime;
createTime;
@Override @Override
public String toString() { public String toString() {
@@ -13,13 +13,12 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.base; package cn.odboy.base;
import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableLogic;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.annotations.ApiModelProperty;
import java.util.Date; import java.util.Date;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@@ -38,21 +37,21 @@ public class KitBaseUserTimeLogicTb extends KitObject {
@CreatedBy @CreatedBy
@TableField(value = "create_by", fill = FieldFill.INSERT) @TableField(value = "create_by", fill = FieldFill.INSERT)
@Schema(name = "创建人", hidden = true) @ApiModelProperty(value = "创建人", hidden = true)
private String createBy; private String createBy;
@LastModifiedBy @LastModifiedBy
@TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE) @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
@Schema(name = "更新人", hidden = true) @ApiModelProperty(value = "更新人", hidden = true)
private String updateBy; private String updateBy;
@TableField(value = "create_time", fill = FieldFill.INSERT) @TableField(value = "create_time", fill = FieldFill.INSERT)
@Schema(name = "创建时间", hidden = true) @ApiModelProperty(value = "创建时间", hidden = true)
private Date private Date createTime;
createTime;
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
@Schema(name = "更新时间", hidden = true) @ApiModelProperty(value = "更新时间", hidden = true)
private Date updateTime; private Date updateTime;
@Schema(name = "数据有效性", hidden = true) @ApiModelProperty(value = "数据有效性", hidden = true)
@TableLogic @TableLogic
@TableField("available") @TableField("available")
private Integer available; private Integer
available;
} }
@@ -13,12 +13,11 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.base; package cn.odboy.base;
import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.annotations.ApiModelProperty;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.Date; import java.util.Date;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -35,22 +34,18 @@ public class KitBaseUserTimeTb extends KitObject {
@CreatedBy @CreatedBy
@TableField(fill = FieldFill.INSERT) @TableField(fill = FieldFill.INSERT)
@Schema(name = "创建人", hidden = true) @ApiModelProperty(value = "创建人", hidden = true)
private String createBy; private String
createBy;
@LastModifiedBy @LastModifiedBy
@TableField(fill = FieldFill.INSERT_UPDATE) @TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(name = "更新人", hidden = true) @ApiModelProperty(value = "更新人", hidden = true)
private String private String updateBy;
updateBy;
@TableField(fill = FieldFill.INSERT) @TableField(fill = FieldFill.INSERT)
@Schema(name = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date private Date createTime;
createTime;
@TableField(fill = FieldFill.INSERT_UPDATE) @TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(name = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true) @ApiModelProperty(value = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date updateTime; private Date updateTime;
@Override @Override
@@ -13,10 +13,8 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.base; package cn.odboy.base;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
/** /**
@@ -27,6 +25,5 @@ import java.io.Serializable;
*/ */
public class KitObject implements Serializable { public class KitObject implements Serializable {
@Serial
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
} }
@@ -13,13 +13,12 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.base; package cn.odboy.base;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import jakarta.validation.constraints.Min; import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import java.io.Serializable;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@@ -37,11 +36,11 @@ public class KitPageArgs<T> implements Serializable {
@NotNull(message = "参数page不能为空") @NotNull(message = "参数page不能为空")
@Min(value = 1, message = "参数page最小值为1") @Min(value = 1, message = "参数page最小值为1")
@Schema(name = "页码", example = "1") @ApiModelProperty(value = "页码", example = "1")
private Integer page; private Integer page;
@NotNull(message = "参数size不能为空") @NotNull(message = "参数size不能为空")
@Min(value = 1, message = "参数size最小值为1") @Min(value = 1, message = "参数size最小值为1")
@Schema(name = "每页数据量", example = "10") @ApiModelProperty(value = "每页数据量", example = "10")
private Integer size; private Integer size;
private T args; private T args;
} }
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.base; package cn.odboy.base;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.base; package cn.odboy.base;
import java.util.Map; import java.util.Map;
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.constant; package cn.odboy.constant;
/** /**
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.constant; package cn.odboy.constant;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
@@ -24,7 +23,6 @@ import lombok.Getter;
public enum FileTypeEnum { public enum FileTypeEnum {
/* 文件类型 */ /* 文件类型 */
IMAGE("image", "图片"), DOC("doc", "文档"), VOICE("voice", "音频"), VIDEO("video", "视频"), OTHER("other", "其他"); IMAGE("image", "图片"), DOC("doc", "文档"), VOICE("voice", "音频"), VIDEO("video", "视频"), OTHER("other", "其他");
private final String code; private final String code;
private final String description; private final String description;
} }
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.constant; package cn.odboy.constant;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
@@ -22,37 +21,30 @@ import lombok.Getter;
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
public enum RequestMethodEnum { public enum RequestMethodEnum {
/** /**
* 搜寻 @AnonymousGetMapping * 搜寻 @AnonymousGetMapping
*/ */
GET("GET"), GET("GET"),
/** /**
* 搜寻 @AnonymousPostMapping * 搜寻 @AnonymousPostMapping
*/ */
POST("POST"), POST("POST"),
/** /**
* 搜寻 @AnonymousPutMapping * 搜寻 @AnonymousPutMapping
*/ */
PUT("PUT"), PUT("PUT"),
/** /**
* 搜寻 @AnonymousPatchMapping * 搜寻 @AnonymousPatchMapping
*/ */
PATCH("PATCH"), PATCH("PATCH"),
/** /**
* 搜寻 @AnonymousDeleteMapping * 搜寻 @AnonymousDeleteMapping
*/ */
DELETE("DELETE"), DELETE("DELETE"),
/** /**
* 否则就是所有 Request 接口都放行 * 否则就是所有 Request 接口都放行
*/ */
ALL("All"); ALL("All");
/** /**
* Request 类型 * Request 类型
*/ */
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.constant; package cn.odboy.constant;
/** /**
@@ -25,22 +24,18 @@ public interface SystemConst {
* win 系统 * win 系统
*/ */
String WIN = "win"; String WIN = "win";
/** /**
* mac 系统 * mac 系统
*/ */
String MAC = "mac"; String MAC = "mac";
/** /**
* 请求头名称 * 请求头名称
*/ */
String HEADER_NAME = "Authorization"; String HEADER_NAME = "Authorization";
/** /**
* Token前缀 * Token前缀
*/ */
String TOKEN_PREFIX = "Bearer"; String TOKEN_PREFIX = "Bearer";
/** /**
* 小数点 * 小数点
*/ */
@@ -51,4 +46,6 @@ public interface SystemConst {
String SYMBOL_AT = "@"; String SYMBOL_AT = "@";
String PROPERTY_OS_NAME = "os.name"; String PROPERTY_OS_NAME = "os.name";
String OS_NAME_WINDOWS = "Windows"; String OS_NAME_WINDOWS = "Windows";
String CURRENT_APP_NAME = "cutejava";
String CURRENT_APP_TITLE = "CuteJava";
} }
@@ -41,7 +41,7 @@ public class KitSpringBeanHolder implements ApplicationContextAware, DisposableB
*/ */
public synchronized static void addCallBacks(CallBack callBack) { public synchronized static void addCallBacks(CallBack callBack) {
if (addCallback) { if (addCallback) {
KitSpringBeanHolder.CALL_BACKS.add(callBack); CALL_BACKS.add(callBack);
} else { } else {
log.warn("CallBack:{} 已无法添加!立即执行", callBack.getCallBackName()); log.warn("CallBack:{} 已无法添加!立即执行", callBack.getCallBackName());
callBack.executor(); callBack.executor();
@@ -116,7 +116,7 @@ public class KitSpringBeanHolder implements ApplicationContextAware, DisposableB
* 清除SpringContextHolder中的ApplicationContext为Null. * 清除SpringContextHolder中的ApplicationContext为Null.
*/ */
private static void clearHolder() { private static void clearHolder() {
log.debug("清除SpringContextHolder中的ApplicationContext:" + applicationContext); log.debug("清除SpringContextHolder中的ApplicationContext:{}", applicationContext);
applicationContext = null; applicationContext = null;
} }
@@ -137,8 +137,7 @@ public class KitSpringBeanHolder implements ApplicationContextAware, DisposableB
@Override @Override
public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException { public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException {
if (KitSpringBeanHolder.applicationContext != null) { if (KitSpringBeanHolder.applicationContext != null) {
log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:{}", KitSpringBeanHolder.applicationContext);
KitSpringBeanHolder.applicationContext);
} }
KitSpringBeanHolder.applicationContext = applicationContext; KitSpringBeanHolder.applicationContext = applicationContext;
if (addCallback) { if (addCallback) {
@@ -179,7 +179,7 @@ public class KitMpQUtil {
*/ */
private static <R> void handleBlurryQuery(QueryWrapper<R> queryWrapper, String blurry, Object fieldVal) { private static <R> void handleBlurryQuery(QueryWrapper<R> queryWrapper, String blurry, Object fieldVal) {
List<String> blurryList = List<String> blurryList =
Arrays.stream(blurry.split(",")).filter(StrUtil::isNotBlank).distinct().collect(Collectors.toList()); Arrays.stream(blurry.split(",")).filter(StrUtil::isNotBlank).distinct().toList();
queryWrapper.and(wrapper -> { queryWrapper.and(wrapper -> {
for (String blurryItem : blurryList) { for (String blurryItem : blurryList) {
String column = StrUtil.toUnderlineCase(blurryItem); String column = StrUtil.toUnderlineCase(blurryItem);
@@ -280,8 +280,7 @@ public class KitRedisHelper {
if (value == null) { if (value == null) {
return null; return null;
} }
if (value instanceof List<?>) { if (value instanceof List<?> list) {
List<?> list = (List<?>) value;
// 检查每个元素是否为指定类型 // 检查每个元素是否为指定类型
if (list.stream().allMatch(clazz::isInstance)) { if (list.stream().allMatch(clazz::isInstance)) {
return list.stream().map(clazz::cast).collect(Collectors.toList()); return list.stream().map(clazz::cast).collect(Collectors.toList());
@@ -18,7 +18,6 @@ package cn.odboy.framework.server.core;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.odboy.constant.SystemConst; import cn.odboy.constant.SystemConst;
import cn.odboy.util.KitSystemUtil; import cn.odboy.util.KitSystemUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
/** /**
@@ -36,26 +35,24 @@ public class KitFileLocalUploadHelper {
private static final String PATH_WINDOWS = "C:\\${appName}\\file\\"; private static final String PATH_WINDOWS = "C:\\${appName}\\file\\";
private static final String PATH_MAC = "/Users${username}/${appName}/file/"; private static final String PATH_MAC = "/Users${username}/${appName}/file/";
private static final String PATH_LINUX = "/home/${appName}/file/"; private static final String PATH_LINUX = "/home/${appName}/file/";
@Value("${spring.application.name}")
private String appName;
public String getPath() { public String getPath() {
String os = System.getProperty("os.name"); String os = System.getProperty("os.name");
if (os == null) { if (os == null) {
// 默认使用 Linux 路径作为兜底方案 // 默认使用 Linux 路径作为兜底方案
return PATH_LINUX.replace("${appName}", appName); return PATH_LINUX.replace("${appName}", SystemConst.CURRENT_APP_NAME);
} }
String lowerOs = os.toLowerCase(); String lowerOs = os.toLowerCase();
if (lowerOs.startsWith(SystemConst.WIN)) { if (lowerOs.startsWith(SystemConst.WIN)) {
return PATH_WINDOWS.replace("${appName}", appName); return PATH_WINDOWS.replace("${appName}", SystemConst.CURRENT_APP_NAME);
} else if (lowerOs.startsWith(SystemConst.MAC)) { } else if (lowerOs.startsWith(SystemConst.MAC)) {
String currentUserName = KitSystemUtil.getCurrentUserName(); String currentUserName = KitSystemUtil.getCurrentUserName();
if (StrUtil.isBlank(currentUserName)) { if (StrUtil.isBlank(currentUserName)) {
return PATH_MAC.replace("${appName}", appName).replace("${username}", ""); return PATH_MAC.replace("${appName}", SystemConst.CURRENT_APP_NAME).replace("${username}", "");
} }
return PATH_MAC.replace("${appName}", appName).replace("${username}", currentUserName); return PATH_MAC.replace("${appName}", SystemConst.CURRENT_APP_NAME).replace("${username}", currentUserName);
} }
return PATH_LINUX.replace("${appName}", appName); return PATH_LINUX.replace("${appName}", SystemConst.CURRENT_APP_NAME);
} }
public int getAvatarMaxSize() { public int getAvatarMaxSize() {
@@ -48,7 +48,7 @@ public class KitAnonTagUtil {
RequestMappingHandlerMapping requestMappingHandlerMapping = RequestMappingHandlerMapping requestMappingHandlerMapping =
(RequestMappingHandlerMapping) applicationContext.getBean("requestMappingHandlerMapping"); (RequestMappingHandlerMapping) applicationContext.getBean("requestMappingHandlerMapping");
Map<RequestMappingInfo, HandlerMethod> handlerMethodMap = requestMappingHandlerMapping.getHandlerMethods(); Map<RequestMappingInfo, HandlerMethod> handlerMethodMap = requestMappingHandlerMapping.getHandlerMethods();
Map<String, Set<String>> anonymousUrls = new HashMap<>(8); Map<String, java.util.Set<String>> anonymousUrls = new HashMap<>(8);
// 获取匿名标记 // 获取匿名标记
Set<String> get = new HashSet<>(); Set<String> get = new HashSet<>();
Set<String> post = new HashSet<>(); Set<String> post = new HashSet<>();
@@ -17,6 +17,7 @@ package cn.odboy.util;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.odboy.base.KitSelectOptionVo; import cn.odboy.base.KitSelectOptionVo;
import cn.odboy.framework.exception.BadRequestException;
import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSON;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.math.BigDecimal; import java.math.BigDecimal;
@@ -39,7 +40,7 @@ import lombok.experimental.UtilityClass;
* @date 2022-11-09 * @date 2022-11-09
*/ */
@UtilityClass @UtilityClass
public final class KitCollUtil extends CollUtil { public final class KitCollUtil extends cn.hutool.core.collection.CollUtil {
private static <T, K> Predicate<T> distinctPredicate(Function<? super T, ? extends K> keyMapper) { private static <T, K> Predicate<T> distinctPredicate(Function<? super T, ? extends K> keyMapper) {
Map<Object, Boolean> map = new HashMap<>(3); Map<Object, Boolean> map = new HashMap<>(3);
@@ -28,9 +28,6 @@ import cn.hutool.poi.excel.ExcelUtil;
import cn.odboy.constant.FileTypeEnum; import cn.odboy.constant.FileTypeEnum;
import cn.odboy.constant.SystemConst; import cn.odboy.constant.SystemConst;
import cn.odboy.framework.exception.BadRequestException; import cn.odboy.framework.exception.BadRequestException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
@@ -45,6 +42,9 @@ import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.poi.util.IOUtils; import org.apache.poi.util.IOUtils;
@@ -40,7 +40,7 @@ public final class KitListUtil {
*/ */
public static <T, K> List<T> distinctByArgs(List<T> items, Function<? super T, ? extends K> classifier) { public static <T, K> List<T> distinctByArgs(List<T> items, Function<? super T, ? extends K> classifier) {
return items.stream().collect(Collectors.groupingBy(classifier)).values().stream() return items.stream().collect(Collectors.groupingBy(classifier)).values().stream()
.map(monitorItem -> monitorItem.iterator().next()).collect(Collectors.toList()); .map(List::getFirst).collect(Collectors.toList());
} }
/** /**
@@ -77,9 +77,9 @@ public class SystemQuartzJobController {
@ApiOperation("查询定时任务执行日志") @ApiOperation("查询定时任务执行日志")
@PostMapping(value = "/searchQuartzLog") @PostMapping(value = "/searchQuartzLog")
@PreAuthorize("@el.check('quartzJob:list')") @PreAuthorize("@el.check('quartzJob:list')")
public ResponseEntity<KitPageResult<SystemQuartzLogTb>> queryQuartzJobLog(SystemQueryQuartzJobArgs args) { public ResponseEntity<KitPageResult<SystemQuartzLogTb>> queryQuartzJobLog(@Validated @RequestBody KitPageArgs<SystemQueryQuartzJobArgs> pageArgs) {
Page<SystemQuartzLogTb> page = new Page<>(args.getPage(), args.getSize()); Page<SystemQuartzLogTb> page = new Page<>(pageArgs.getPage(), pageArgs.getSize());
return ResponseEntity.ok(systemQuartzJobService.searchQuartzLogByArgs(args, page)); return ResponseEntity.ok(systemQuartzJobService.searchQuartzLogByArgs(pageArgs.getArgs(), page));
} }
@OperationLog @OperationLog
@@ -72,9 +72,8 @@ public class SystemRoleController {
@ApiOperation("查询角色") @ApiOperation("查询角色")
@PostMapping(value = "/searchRole") @PostMapping(value = "/searchRole")
@PreAuthorize("@el.check('roles:list')") @PreAuthorize("@el.check('roles:list')")
public ResponseEntity<KitPageResult<SystemRoleVo>> queryRoleByArgs( public ResponseEntity<KitPageResult<SystemRoleVo>> queryRoleByArgs(@Validated @RequestBody KitPageArgs<SystemQueryRoleArgs> pageArgs) {
@Validated @RequestBody KitPageArgs<SystemQueryRoleArgs> pageArgs) { Page<SystemRoleTb> page = new Page<>(pageArgs.getPage(), pageArgs.getSize());
Page<Object> page = new Page<>(pageArgs.getPage(), pageArgs.getSize());
return ResponseEntity.ok(systemRoleService.searchRoleByArgs(pageArgs.getArgs(), page)); return ResponseEntity.ok(systemRoleService.searchRoleByArgs(pageArgs.getArgs(), page));
} }
@@ -23,8 +23,4 @@ public class SystemQueryDictArgs {
@ApiModelProperty(value = "模糊查询") @ApiModelProperty(value = "模糊查询")
private String blurry; private String blurry;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
} }
@@ -31,8 +31,4 @@ public class SystemQueryJobArgs {
private Boolean enabled; private Boolean enabled;
@ApiModelProperty(value = "创建时间") @ApiModelProperty(value = "创建时间")
private List<Date> createTime; private List<Date> createTime;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
} }
@@ -29,8 +29,4 @@ public class SystemQueryQuartzJobArgs {
private Boolean isSuccess; private Boolean isSuccess;
@ApiModelProperty(value = "创建时间") @ApiModelProperty(value = "创建时间")
private List<Date> createTime; private List<Date> createTime;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
} }
@@ -27,10 +27,4 @@ public class SystemQueryRoleArgs {
private String blurry; private String blurry;
@ApiModelProperty(value = "创建时间") @ApiModelProperty(value = "创建时间")
private List<Date> createTime; private List<Date> createTime;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
@ApiModelProperty(value = "偏移量", hidden = true)
private long offset;
} }
@@ -40,8 +40,4 @@ public class SystemQueryUserArgs extends KitObject {
private Long deptId; private Long deptId;
@ApiModelProperty(value = "创建时间") @ApiModelProperty(value = "创建时间")
private List<Date> createTime; private List<Date> createTime;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
} }
@@ -18,7 +18,6 @@ package cn.odboy.system.dal.mysql;
import cn.odboy.system.dal.dataobject.SystemDictTb; import cn.odboy.system.dal.dataobject.SystemDictTb;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
/** /**
@@ -29,10 +28,6 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper @Mapper
public interface SystemDictMapper extends BaseMapper<SystemDictTb> { public interface SystemDictMapper extends BaseMapper<SystemDictTb> {
default List<SystemDictTb> listAll() {
return selectList(null);
}
default SystemDictTb getByName(String dictName) { default SystemDictTb getByName(String dictName) {
LambdaQueryWrapper<SystemDictTb> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SystemDictTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemDictTb::getName, dictName); wrapper.eq(SystemDictTb::getName, dictName);
@@ -43,8 +43,8 @@ public class BizLockAspect {
public Object around(ProceedingJoinPoint joinPoint, BizLock bizLock) throws Throwable { public Object around(ProceedingJoinPoint joinPoint, BizLock bizLock) throws Throwable {
// 解析SpEL表达式生成最终的lockKey // 解析SpEL表达式生成最终的lockKey
String lockKey = parseLockKey(joinPoint, bizLock); String lockKey = parseLockKey(joinPoint, bizLock);
Boolean success = redisHelper.setIfAbsent(lockKey, lockKey, bizLock.leaseTime(), bizLock.timeUnit()); boolean success = redisHelper.setIfAbsent(lockKey, lockKey, bizLock.leaseTime(), bizLock.timeUnit());
if (success == null || !success) { if (!success) {
throw new BadRequestException(bizLock.errorMessage()); throw new BadRequestException(bizLock.errorMessage());
} }
try { try {
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.system.framework.mybatisplus; package cn.odboy.system.framework.mybatisplus;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
@@ -55,4 +54,3 @@ public class MpMetaObjectHandler implements MetaObjectHandler {
this.strictUpdateFill(metaObject, "updateBy", String.class, username); this.strictUpdateFill(metaObject, "updateBy", String.class, username);
} }
} }
@@ -27,8 +27,8 @@ import cn.odboy.util.KitBrowserUtil;
import cn.odboy.util.KitIPUtil; import cn.odboy.util.KitIPUtil;
import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSON;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import jakarta.servlet.http.HttpServletRequest;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Around;
@@ -96,7 +96,7 @@ public class OperationLogAspect {
} }
} }
if (StrUtil.isBlank(bizName)) { if (StrUtil.isBlank(bizName)) {
bizName = "Default"; bizName = "默认业务";
} }
String method = joinPoint.getTarget().getClass().getName() + "." + signature.getName() + "()"; String method = joinPoint.getTarget().getClass().getName() + "." + signature.getName() + "()";
Object[] args = joinPoint.getArgs(); Object[] args = joinPoint.getArgs();
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.system.framework.storage; package cn.odboy.system.framework.storage;
import cn.odboy.framework.exception.BadRequestException; import cn.odboy.framework.exception.BadRequestException;
@@ -13,16 +13,15 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.system.framework.storage.local; package cn.odboy.system.framework.storage.local;
import cn.odboy.constant.SystemConst;
import cn.odboy.framework.exception.BadRequestException; import cn.odboy.framework.exception.BadRequestException;
import cn.odboy.framework.properties.AppProperties; import cn.odboy.framework.properties.AppProperties;
import jakarta.servlet.MultipartConfigElement; import jakarta.servlet.MultipartConfigElement;
import java.io.File; import java.io.File;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.MultipartConfigFactory; import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
@@ -32,8 +31,6 @@ import org.springframework.util.unit.DataSize;
@Configuration @Configuration
public class MultipartConfig { public class MultipartConfig {
@Value("${spring.application.name}")
private String name;
@Autowired @Autowired
private AppProperties properties; private AppProperties properties;
@@ -45,7 +42,7 @@ public class MultipartConfig {
MultipartConfigFactory factory = new MultipartConfigFactory(); MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setMaxFileSize(DataSize.ofMegabytes(properties.getOss().getMaxSize())); factory.setMaxFileSize(DataSize.ofMegabytes(properties.getOss().getMaxSize()));
factory.setMaxRequestSize(DataSize.ofMegabytes(properties.getOss().getMaxSize())); factory.setMaxRequestSize(DataSize.ofMegabytes(properties.getOss().getMaxSize()));
String location = System.getProperty("user.home") + "/" + name + "/tmp"; String location = System.getProperty("user.home") + "/" + SystemConst.CURRENT_APP_NAME + "/tmp";
File tmpFile = new File(location); File tmpFile = new File(location);
if (!tmpFile.exists()) { if (!tmpFile.exists()) {
if (!tmpFile.mkdirs()) { if (!tmpFile.mkdirs()) {
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package cn.odboy.system.framework.storage.minio; package cn.odboy.system.framework.storage.minio;
import cn.hutool.core.io.FastByteArrayOutputStream; import cn.hutool.core.io.FastByteArrayOutputStream;
@@ -44,13 +43,13 @@ import io.minio.Result;
import io.minio.http.Method; import io.minio.http.Method;
import io.minio.messages.Bucket; import io.minio.messages.Bucket;
import io.minio.messages.Item; import io.minio.messages.Item;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import java.io.File; import java.io.File;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -153,13 +152,11 @@ public class MinioRepository {
String type = FileTypeUtil.getType(tempFile); String type = FileTypeUtil.getType(tempFile);
String prefix = KitFileUtil.getPrefix(tempFile); String prefix = KitFileUtil.getPrefix(tempFile);
String suffix = KitFileUtil.getSuffix(tempFile); String suffix = KitFileUtil.getSuffix(tempFile);
String fileCode = IdUtil.fastSimpleUUID(); String fileCode = IdUtil.fastSimpleUUID();
String fileName = fileCode + FileUtil.getSuffix(originalFilename); String fileName = fileCode + FileUtil.getSuffix(originalFilename);
String objectName = KitDateUtil.getNowDateStr() + "/" + fileName; String objectName = KitDateUtil.getNowDateStr() + "/" + fileName;
log.info("上传文件,原文件名:{},上传后文件名:{}", originalFilename, fileName); log.info("上传文件,原文件名:{},上传后文件名:{}", originalFilename, fileName);
String fileUrl = ossMinioConfig.getEndpoint() + "/" + ossMinioConfig.getBucketName() + "/" + objectName; String fileUrl = ossMinioConfig.getEndpoint() + "/" + ossMinioConfig.getBucketName() + "/" + objectName;
SystemOssStorageTb systemOssStorageTb = new SystemOssStorageTb(); SystemOssStorageTb systemOssStorageTb = new SystemOssStorageTb();
systemOssStorageTb.setServiceType("minio"); systemOssStorageTb.setServiceType("minio");
systemOssStorageTb.setEndpoint(ossMinioConfig.getEndpoint()); systemOssStorageTb.setEndpoint(ossMinioConfig.getEndpoint());
@@ -173,7 +170,6 @@ public class MinioRepository {
systemOssStorageTb.setFileUrl(fileUrl); systemOssStorageTb.setFileUrl(fileUrl);
systemOssStorageTb.setFileCode(fileCode); systemOssStorageTb.setFileCode(fileCode);
systemOssStorageTb.setObjectName(objectName); systemOssStorageTb.setObjectName(objectName);
try (InputStream fileInputStream = KitFileUtil.getInputStream(tempFile)) { try (InputStream fileInputStream = KitFileUtil.getInputStream(tempFile)) {
PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(ossMinioConfig.getBucketName()).object(objectName) PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(ossMinioConfig.getBucketName()).object(objectName)
.stream(fileInputStream, fileSize, -1).contentType(contentType).build(); .stream(fileInputStream, fileSize, -1).contentType(contentType).build();
@@ -203,14 +199,11 @@ public class MinioRepository {
if (StrUtil.isBlank(originalFilename)) { if (StrUtil.isBlank(originalFilename)) {
throw new BadRequestException("文件名不能为空"); throw new BadRequestException("文件名不能为空");
} }
long size = file.getSize(); long size = file.getSize();
KitFileUtil.checkSize(properties.getOss().getMaxSize(), size); KitFileUtil.checkSize(properties.getOss().getMaxSize(), size);
String fileName = UUID.randomUUID() + FileUtil.getSuffix(originalFilename); String fileName = UUID.randomUUID() + FileUtil.getSuffix(originalFilename);
// yyyy/MM/dd/fileName.xxx // yyyy/MM/dd/fileName.xxx
String objectName = KitDateUtil.getNowDateTimeStr() + "/" + fileName; String objectName = KitDateUtil.getNowDateTimeStr() + "/" + fileName;
log.info("准备上传文件,原文件名:{},上传后文件名:{}", originalFilename, fileName); log.info("准备上传文件,原文件名:{},上传后文件名:{}", originalFilename, fileName);
try (InputStream fileInputStream = file.getInputStream()) { try (InputStream fileInputStream = file.getInputStream()) {
PutObjectArgs objectArgs = PutObjectArgs objectArgs =
@@ -286,17 +279,14 @@ public class MinioRepository {
public void download(String fileName, HttpServletResponse res) { public void download(String fileName, HttpServletResponse res) {
GetObjectArgs objectArgs = GetObjectArgs objectArgs =
GetObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build(); GetObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build();
try (GetObjectResponse response = minioClient.getObject(objectArgs); try (GetObjectResponse response = minioClient.getObject(objectArgs);
FastByteArrayOutputStream os = new FastByteArrayOutputStream()) { FastByteArrayOutputStream os = new FastByteArrayOutputStream()) {
byte[] buf = new byte[1024]; byte[] buf = new byte[1024];
int len; int len;
while ((len = response.read(buf)) != -1) { while ((len = response.read(buf)) != -1) {
os.write(buf, 0, len); os.write(buf, 0, len);
} }
os.flush(); os.flush();
byte[] bytes = os.toByteArray(); byte[] bytes = os.toByteArray();
res.setCharacterEncoding("utf-8"); res.setCharacterEncoding("utf-8");
res.addHeader("Content-Disposition", "attachment;fileName=" + fileName); res.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
@@ -318,12 +308,10 @@ public class MinioRepository {
public void downloadOptimizedVersion(String fileName, HttpServletResponse res) { public void downloadOptimizedVersion(String fileName, HttpServletResponse res) {
GetObjectArgs objectArgs = GetObjectArgs objectArgs =
GetObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build(); GetObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build();
try (GetObjectResponse response = minioClient.getObject(objectArgs)) { try (GetObjectResponse response = minioClient.getObject(objectArgs)) {
// 增大缓冲区 // 增大缓冲区
byte[] buf = new byte[1024 * 4]; byte[] buf = new byte[1024 * 4];
int len; int len;
// 分块下载并输出到响应流 // 分块下载并输出到响应流
try (ServletOutputStream stream = res.getOutputStream()) { try (ServletOutputStream stream = res.getOutputStream()) {
res.setCharacterEncoding("utf-8"); res.setCharacterEncoding("utf-8");
@@ -331,7 +319,6 @@ public class MinioRepository {
res.setHeader("Cache-Control", "no-store"); res.setHeader("Cache-Control", "no-store");
res.setHeader("Pragma", "no-cache"); res.setHeader("Pragma", "no-cache");
res.setHeader("Expires", "0"); res.setHeader("Expires", "0");
while ((len = response.read(buf)) != -1) { while ((len = response.read(buf)) != -1) {
stream.write(buf, 0, len); stream.write(buf, 0, len);
// 确保实时写入 // 确保实时写入
@@ -26,7 +26,6 @@ import cn.odboy.system.dal.model.response.SystemDictDetailVo;
import cn.odboy.system.dal.mysql.SystemDictMapper; import cn.odboy.system.dal.mysql.SystemDictMapper;
import cn.odboy.util.KitBeanUtil; import cn.odboy.util.KitBeanUtil;
import cn.odboy.util.KitPageUtil; import cn.odboy.util.KitPageUtil;
import cn.odboy.util.KitValidUtil;
import cn.odboy.util.xlsx.KitExcelExporter; import cn.odboy.util.xlsx.KitExcelExporter;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -92,20 +91,21 @@ public class SystemDictService {
*/ */
public KitPageResult<SystemDictTb> searchDict(SystemQueryDictArgs args, Page<SystemDictTb> page) { public KitPageResult<SystemDictTb> searchDict(SystemQueryDictArgs args, Page<SystemDictTb> page) {
LambdaQueryWrapper<SystemDictTb> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SystemDictTb> wrapper = new LambdaQueryWrapper<>();
injectQueryParams(args, wrapper); this.injectQueryParams(args, wrapper);
Page<SystemDictTb> selectPage = systemDictMapper.selectPage(page, wrapper); Page<SystemDictTb> selectPage = systemDictMapper.selectPage(page, wrapper);
return KitPageUtil.toPage(selectPage); return KitPageUtil.toPage(selectPage);
} }
private void injectQueryParams(SystemQueryDictArgs args, LambdaQueryWrapper<SystemDictTb> wrapper) { private void injectQueryParams(SystemQueryDictArgs args, LambdaQueryWrapper<SystemDictTb> wrapper) {
KitValidUtil.notNull(args); if (args != null) {
wrapper.and(StrUtil.isNotBlank(args.getBlurry()), c -> c.like(SystemDictTb::getName, args.getBlurry()).or() wrapper.and(StrUtil.isNotBlank(args.getBlurry()), c -> c.like(SystemDictTb::getName, args.getBlurry()).or()
.like(SystemDictTb::getDescription, args.getBlurry())); .like(SystemDictTb::getDescription, args.getBlurry()));
}
} }
public List<SystemDictTb> queryDictByArgs(SystemQueryDictArgs args) { public List<SystemDictTb> queryDictByArgs(SystemQueryDictArgs args) {
LambdaQueryWrapper<SystemDictTb> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SystemDictTb> wrapper = new LambdaQueryWrapper<>();
injectQueryParams(args, wrapper); this.injectQueryParams(args, wrapper);
return systemDictMapper.selectList(wrapper); return systemDictMapper.selectList(wrapper);
} }
@@ -19,6 +19,7 @@ import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.RandomUtil;
import cn.hutool.extra.mail.Mail; import cn.hutool.extra.mail.Mail;
import cn.hutool.extra.mail.MailAccount; import cn.hutool.extra.mail.MailAccount;
import cn.odboy.constant.SystemConst;
import cn.odboy.framework.exception.BadRequestException; import cn.odboy.framework.exception.BadRequestException;
import cn.odboy.framework.properties.AppProperties; import cn.odboy.framework.properties.AppProperties;
import cn.odboy.framework.redis.KitRedisHelper; import cn.odboy.framework.redis.KitRedisHelper;
@@ -32,7 +33,6 @@ import cn.odboy.util.KitResourceTemplateUtil;
import java.util.Collections; import java.util.Collections;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@@ -46,8 +46,6 @@ public class SystemEmailService {
private KitRedisHelper redisHelper; private KitRedisHelper redisHelper;
@Autowired @Autowired
private AppProperties properties; private AppProperties properties;
@Value("${spring.application.title}")
private String applicationTitle;
/** /**
* 更新邮件配置 * 更新邮件配置
@@ -146,7 +144,7 @@ public class SystemEmailService {
KitResourceTemplateUtil.render(null, biEnum.getTemplateName(), Dict.create().set("code", oldCode)); KitResourceTemplateUtil.render(null, biEnum.getTemplateName(), Dict.create().set("code", oldCode));
} }
SystemSendEmailArgs sendEmailRequest = SystemSendEmailArgs sendEmailRequest =
new SystemSendEmailArgs(Collections.singletonList(email), applicationTitle, content); new SystemSendEmailArgs(Collections.singletonList(email), SystemConst.CURRENT_APP_TITLE, content);
sendEmail(sendEmailRequest); sendEmail(sendEmailRequest);
} }
@@ -26,7 +26,6 @@ import cn.odboy.system.dal.model.request.SystemQueryJobArgs;
import cn.odboy.system.dal.mysql.SystemJobMapper; import cn.odboy.system.dal.mysql.SystemJobMapper;
import cn.odboy.util.KitBeanUtil; import cn.odboy.util.KitBeanUtil;
import cn.odboy.util.KitPageUtil; import cn.odboy.util.KitPageUtil;
import cn.odboy.util.KitValidUtil;
import cn.odboy.util.xlsx.KitExcelExporter; import cn.odboy.util.xlsx.KitExcelExporter;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -129,12 +128,13 @@ public class SystemJobService {
} }
public void injectQueryParams(SystemQueryJobArgs args, LambdaQueryWrapper<SystemJobTb> wrapper) { public void injectQueryParams(SystemQueryJobArgs args, LambdaQueryWrapper<SystemJobTb> wrapper) {
KitValidUtil.notNull(args); if (args != null) {
wrapper.like(StrUtil.isNotBlank(args.getName()), SystemJobTb::getName, args.getName()); wrapper.like(StrUtil.isNotBlank(args.getName()), SystemJobTb::getName, args.getName());
wrapper.eq(args.getEnabled() != null, SystemJobTb::getEnabled, args.getEnabled()); wrapper.eq(args.getEnabled() != null, SystemJobTb::getEnabled, args.getEnabled());
if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) {
wrapper.between(SystemJobTb::getCreateTime, args.getCreateTime().get(0), wrapper.between(SystemJobTb::getCreateTime, args.getCreateTime().get(0),
args.getCreateTime().get(1)); args.getCreateTime().get(1));
}
} }
wrapper.orderByDesc(SystemJobTb::getJobSort, SystemJobTb::getId); wrapper.orderByDesc(SystemJobTb::getJobSort, SystemJobTb::getId);
} }
@@ -33,7 +33,6 @@ import cn.odboy.system.dal.mysql.SystemLocalStorageMapper;
import cn.odboy.util.KitBeanUtil; import cn.odboy.util.KitBeanUtil;
import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitFileUtil;
import cn.odboy.util.KitPageUtil; import cn.odboy.util.KitPageUtil;
import cn.odboy.util.KitValidUtil;
import cn.odboy.util.xlsx.KitExcelExporter; import cn.odboy.util.xlsx.KitExcelExporter;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -140,15 +139,16 @@ public class SystemLocalStorageService {
} }
private void injectQueryParams(SystemQueryStorageArgs args, LambdaQueryWrapper<SystemLocalStorageTb> wrapper) { private void injectQueryParams(SystemQueryStorageArgs args, LambdaQueryWrapper<SystemLocalStorageTb> wrapper) {
KitValidUtil.notNull(args); if (args != null) {
wrapper.and(StrUtil.isNotBlank(args.getBlurry()), wrapper.and(StrUtil.isNotBlank(args.getBlurry()),
c -> c.like(SystemLocalStorageTb::getName, args.getBlurry()).or() c -> c.like(SystemLocalStorageTb::getName, args.getBlurry()).or()
.like(SystemLocalStorageTb::getSuffix, args.getBlurry()).or() .like(SystemLocalStorageTb::getSuffix, args.getBlurry()).or()
.like(SystemLocalStorageTb::getType, args.getBlurry()).or() .like(SystemLocalStorageTb::getType, args.getBlurry()).or()
.like(SystemLocalStorageTb::getCreateBy, args.getBlurry())); .like(SystemLocalStorageTb::getCreateBy, args.getBlurry()));
if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) {
wrapper.between(SystemLocalStorageTb::getUpdateTime, args.getCreateTime().get(0), wrapper.between(SystemLocalStorageTb::getUpdateTime, args.getCreateTime().get(0),
args.getCreateTime().get(1)); args.getCreateTime().get(1));
}
} }
wrapper.orderByDesc(SystemLocalStorageTb::getId); wrapper.orderByDesc(SystemLocalStorageTb::getId);
} }
@@ -219,11 +219,12 @@ public class SystemQuartzJobService {
} }
private void injectQuartzLogQueryParams(SystemQueryQuartzJobArgs args, LambdaQueryWrapper<SystemQuartzLogTb> wrapper) { private void injectQuartzLogQueryParams(SystemQueryQuartzJobArgs args, LambdaQueryWrapper<SystemQuartzLogTb> wrapper) {
KitValidUtil.notNull(args); if (args != null) {
wrapper.like(StrUtil.isNotBlank(args.getJobName()), SystemQuartzLogTb::getJobName, args.getJobName()); wrapper.like(StrUtil.isNotBlank(args.getJobName()), SystemQuartzLogTb::getJobName, args.getJobName());
wrapper.eq(args.getIsSuccess() != null, SystemQuartzLogTb::getIsSuccess, args.getIsSuccess()); wrapper.eq(args.getIsSuccess() != null, SystemQuartzLogTb::getIsSuccess, args.getIsSuccess());
if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) {
wrapper.between(SystemQuartzLogTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1)); wrapper.between(SystemQuartzLogTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1));
}
} }
wrapper.orderByDesc(SystemQuartzLogTb::getId); wrapper.orderByDesc(SystemQuartzLogTb::getId);
} }
@@ -68,7 +68,7 @@ public class SystemRoleService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void saveRole(SystemCreateRoleArgs args) { public void saveRole(SystemCreateRoleArgs args) {
checkRoleLevels(args.getLevel()); checkRoleLevels(args.getLevel());
if (this.getRoleByName(args.getName()) != null) { if (this.countRoleByName(args.getName()) > 0) {
throw new BadRequestException("角色名称已存在"); throw new BadRequestException("角色名称已存在");
} }
SystemRoleTb roleTb = KitBeanUtil.copyToClass(args, SystemRoleTb.class); SystemRoleTb roleTb = KitBeanUtil.copyToClass(args, SystemRoleTb.class);
@@ -85,6 +85,12 @@ public class SystemRoleService {
return systemRoleMapper.selectOne(wrapper); return systemRoleMapper.selectOne(wrapper);
} }
private long countRoleByName(String name) {
LambdaQueryWrapper<SystemRoleTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemRoleTb::getName, name);
return systemRoleMapper.selectCount(wrapper);
}
/** /**
* 修改 * 修改
* *
@@ -166,10 +172,11 @@ public class SystemRoleService {
/** /**
* 根据条件查询全部角色 * 根据条件查询全部角色
* *
* @param args 条件 * @param args 条件
* @param rolePage 分页参数
* @return / * @return /
*/ */
public List<SystemRoleVo> queryRoleByArgs(SystemQueryRoleArgs args) { public List<SystemRoleVo> queryRoleByArgs(SystemQueryRoleArgs args, Page<SystemRoleTb> rolePage) {
KitValidUtil.notNull(args); KitValidUtil.notNull(args);
// 查询角色基本信息 // 查询角色基本信息
LambdaQueryWrapper<SystemRoleTb> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SystemRoleTb> wrapper = new LambdaQueryWrapper<>();
@@ -181,27 +188,25 @@ public class SystemRoleService {
args.getCreateTime().get(1)); args.getCreateTime().get(1));
} }
wrapper.orderByAsc(SystemRoleTb::getLevel); wrapper.orderByAsc(SystemRoleTb::getLevel);
if (args.getSize() != null) { List<SystemRoleTb> roles;
Page<SystemRoleTb> rolePage = new Page<>(args.getPage(), args.getSize()); if (rolePage == null) {
Page<SystemRoleTb> page = systemRoleMapper.selectPage(rolePage, wrapper); roles = systemRoleMapper.selectList(wrapper);
List<SystemRoleTb> roles = page.getRecords();
return roles.stream().map(systemUserRoleService::convertToRoleVo).collect(Collectors.toList());
} else { } else {
List<SystemRoleTb> roles = systemRoleMapper.selectList(wrapper); Page<SystemRoleTb> page = systemRoleMapper.selectPage(rolePage, wrapper);
return roles.stream().map(systemUserRoleService::convertToRoleVo).collect(Collectors.toList()); roles = page.getRecords();
} }
return roles.stream().map(systemUserRoleService::convertToRoleVo).collect(Collectors.toList());
} }
/** /**
* 分页查询角色 * 分页查询角色
* *
* @param args 条件 * @param args 条件
* @param page 分页参数 * @param page 分页条件
* @return / * @return /
*/ */
public KitPageResult<SystemRoleVo> searchRoleByArgs(SystemQueryRoleArgs args, Page<Object> page) { public KitPageResult<SystemRoleVo> searchRoleByArgs(SystemQueryRoleArgs args, Page<SystemRoleTb> page) {
args.setOffset(page.offset()); List<SystemRoleVo> roles = this.queryRoleByArgs(args, page);
List<SystemRoleVo> roles = this.queryRoleByArgs(args);
Long total = this.countRoleByArgs(args); Long total = this.countRoleByArgs(args);
return KitPageUtil.toPage(roles, total); return KitPageUtil.toPage(roles, total);
} }
@@ -280,7 +285,7 @@ public class SystemRoleService {
} }
public void exportRoleXlsx(HttpServletResponse response, SystemQueryRoleArgs args) { public void exportRoleXlsx(HttpServletResponse response, SystemQueryRoleArgs args) {
List<SystemRoleVo> systemRoleVos = this.queryRoleByArgs(args); List<SystemRoleVo> systemRoleVos = this.queryRoleByArgs(args, null);
List<SystemRoleExportRowVo> rowVos = new ArrayList<>(); List<SystemRoleExportRowVo> rowVos = new ArrayList<>();
for (SystemRoleVo dataObject : systemRoleVos) { for (SystemRoleVo dataObject : systemRoleVos) {
SystemRoleExportRowVo rowVo = new SystemRoleExportRowVo(); SystemRoleExportRowVo rowVo = new SystemRoleExportRowVo();
@@ -343,20 +343,6 @@ public class SystemUserService {
return KitPageUtil.toPage(userVos, userPage.getTotal()); return KitPageUtil.toPage(userVos, userPage.getTotal());
} }
// /**
// * 查询全部不分页
// *
// * @param args 条件
// * @return /
// */
// public List<SystemUserVo> queryUserVoByArgs(SystemQueryUserArgs args) {
// // 查询用户基本信息
// LambdaQueryWrapper<SystemUserTb> wrapper = buildUserQueryWrapper(args);
// List<SystemUserTb> users = systemUserMapper.selectList(wrapper);
// // 转换为SystemUserVo并关联查询
// return users.stream().map(this::convertToUserVo).collect(Collectors.toList());
// }
public long countUserByArgs(SystemQueryUserArgs args) { public long countUserByArgs(SystemQueryUserArgs args) {
LambdaQueryWrapper<SystemUserTb> wrapper = buildUserQueryWrapper(args); LambdaQueryWrapper<SystemUserTb> wrapper = buildUserQueryWrapper(args);
return systemUserMapper.selectCount(wrapper); return systemUserMapper.selectCount(wrapper);
@@ -385,7 +371,7 @@ public class SystemUserService {
c.or(); c.or();
c.like(SystemUserTb::getNickName, args.getBlurry()); c.like(SystemUserTb::getNickName, args.getBlurry());
}); });
return systemUserMapper.selectPage(new Page<>(args.getPage(), 50), wrapper).getRecords().stream().map(m -> { return systemUserMapper.selectPage(new Page<>(pageArgs.getPage(), 50), wrapper).getRecords().stream().map(m -> {
Map<String, Object> ext = new HashMap<>(1); Map<String, Object> ext = new HashMap<>(1);
ext.put("id", m.getId()); ext.put("id", m.getId());
ext.put("deptId", m.getDeptId()); ext.put("deptId", m.getDeptId());
@@ -54,12 +54,12 @@ public final class KitSqlUtil {
try { try {
className = DriverManager.getDriver(jdbcUrl.trim()).getClass().getName(); className = DriverManager.getDriver(jdbcUrl.trim()).getClass().getName();
} catch (SQLException e) { } catch (SQLException e) {
throw new BadRequestException("Get class name error: =" + jdbcUrl); throw new BadRequestException("获取驱动类名失败,jdbcUrl=" + jdbcUrl);
} }
if (StringUtils.isEmpty(className)) { if (StringUtils.isEmpty(className)) {
DataTypeEnum dataTypeEnum = DataTypeEnum.urlOf(jdbcUrl); DataTypeEnum dataTypeEnum = DataTypeEnum.urlOf(jdbcUrl);
if (null == dataTypeEnum) { if (null == dataTypeEnum) {
throw new BadRequestException("Not supported data type: jdbcUrl=" + jdbcUrl); throw new BadRequestException("不支持的数据库类型,jdbcUrl=" + jdbcUrl);
} }
druidDataSource.setDriverClassName(dataTypeEnum.getDriver()); druidDataSource.setDriverClassName(dataTypeEnum.getDriver());
} else { } else {
@@ -82,12 +82,12 @@ public final class KitSqlUtil {
try { try {
int timeOut = 5; int timeOut = 5;
if (null == connection || connection.isClosed() || !connection.isValid(timeOut)) { if (null == connection || connection.isClosed() || !connection.isValid(timeOut)) {
log.info("connection is closed or invalid, retry get connection!"); log.info("连接已关闭或者错误,重试获取连接");
connection = dataSource.getConnection(); connection = dataSource.getConnection();
} }
} catch (Exception e) { } catch (Exception e) {
log.error("create connection error, jdbcUrl: {}", jdbcUrl); log.error("创建连接失败, jdbcUrl={}", jdbcUrl);
throw new BadRequestException("create connection error, jdbcUrl: " + jdbcUrl); throw new BadRequestException("创建连接失败, jdbcUrl=" + jdbcUrl);
} finally { } finally {
KitCloseUtil.close(connection); KitCloseUtil.close(connection);
} }
@@ -30,9 +30,6 @@ server:
# IMMEDIATE(立即): 当应用程序以"IMMEDIATE"模式关闭时,它会立即终止,而不管当前是否有任何活动任务或请求。这种方式适用于那些可以立即停止而不会造成严重问题的情况。 # IMMEDIATE(立即): 当应用程序以"IMMEDIATE"模式关闭时,它会立即终止,而不管当前是否有任何活动任务或请求。这种方式适用于那些可以立即停止而不会造成严重问题的情况。
shutdown: graceful shutdown: graceful
spring: spring:
application:
name: cutejava
title: CuteJava
lifecycle: lifecycle:
# 采用java.time.Duration格式的值,如果在这个时间内,优雅停机没有停掉应用,超过这个时间就会强制停止应用 # 采用java.time.Duration格式的值,如果在这个时间内,优雅停机没有停掉应用,超过这个时间就会强制停止应用
timeout-per-shutdown-phase: 30s timeout-per-shutdown-phase: 30s
@@ -149,10 +146,10 @@ mybatis-plus:
app: app:
# 密码加密传输,前端公钥加密,后端私钥解密 # 密码加密传输,前端公钥加密,后端私钥解密
rsa: rsa:
private-key: MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A== private-key: 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
# 鉴权 # 鉴权
jwt: jwt:
# 必须使用最少88位的Base64对该令牌进行编码 cn.odboy.util.KitBase64SecretUtil # 必须使用最少88位的Base64对该令牌进行编码 cn.odboy.util.CsBase64SecretUtil
base64-secret: YzE5ZWNjMjlkMGY4NDc4MDlmYzE0Y2I0MTk4YTQ4YjY5NTU0OGQxODNjNjQ0MmU1YjBmZTYwYjljYzI0M2M4MTJkZjk3Y2ZlYjg3ZTQxMjM4MjEwY2ZiYzE4YmFiYmZlZDVhM2M1YmI3M2FmNDFmNWJmM2MyMTM1ZDNhMmRmYzY= base64-secret: YzE5ZWNjMjlkMGY4NDc4MDlmYzE0Y2I0MTk4YTQ4YjY5NTU0OGQxODNjNjQ0MmU1YjBmZTYwYjljYzI0M2M4MTJkZjk3Y2ZlYjg3ZTQxMjM4MjEwY2ZiYzE4YmFiYmZlZDVhM2M1YmI3M2FmNDFmNWJmM2MyMTM1ZDNhMmRmYzY=
# 令牌过期时间 此处单位/毫秒 ,默认4小时,可在此网站生成 https://www.convertworld.com/zh-hans/time/milliseconds.html # 令牌过期时间 此处单位/毫秒 ,默认4小时,可在此网站生成 https://www.convertworld.com/zh-hans/time/milliseconds.html
token-validity-in-seconds: 14400000 token-validity-in-seconds: 14400000
@@ -215,4 +212,4 @@ logging:
knife4j: knife4j:
enable: true enable: true
setting: setting:
language: zh_cn language: zh_cn
@@ -30,9 +30,6 @@ server:
# IMMEDIATE(立即): 当应用程序以"IMMEDIATE"模式关闭时,它会立即终止,而不管当前是否有任何活动任务或请求。这种方式适用于那些可以立即停止而不会造成严重问题的情况。 # IMMEDIATE(立即): 当应用程序以"IMMEDIATE"模式关闭时,它会立即终止,而不管当前是否有任何活动任务或请求。这种方式适用于那些可以立即停止而不会造成严重问题的情况。
shutdown: graceful shutdown: graceful
spring: spring:
application:
name: cutejava
title: CuteJava
lifecycle: lifecycle:
# 采用java.time.Duration格式的值,如果在这个时间内,优雅停机没有停掉应用,超过这个时间就会强制停止应用 # 采用java.time.Duration格式的值,如果在这个时间内,优雅停机没有停掉应用,超过这个时间就会强制停止应用
timeout-per-shutdown-phase: 30s timeout-per-shutdown-phase: 30s
@@ -158,10 +155,10 @@ mybatis-plus:
app: app:
# 密码加密传输,前端公钥加密,后端私钥解密 # 密码加密传输,前端公钥加密,后端私钥解密
rsa: rsa:
private-key: MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A== private-key: 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
# 鉴权 # 鉴权
jwt: jwt:
# 必须使用最少88位的Base64对该令牌进行编码 cn.odboy.util.KitBase64SecretUtil # 必须使用最少88位的Base64对该令牌进行编码 cn.odboy.util.CsBase64SecretUtil
base64-secret: YzE5ZWNjMjlkMGY4NDc4MDlmYzE0Y2I0MTk4YTQ4YjY5NTU0OGQxODNjNjQ0MmU1YjBmZTYwYjljYzI0M2M4MTJkZjk3Y2ZlYjg3ZTQxMjM4MjEwY2ZiYzE4YmFiYmZlZDVhM2M1YmI3M2FmNDFmNWJmM2MyMTM1ZDNhMmRmYzY= base64-secret: YzE5ZWNjMjlkMGY4NDc4MDlmYzE0Y2I0MTk4YTQ4YjY5NTU0OGQxODNjNjQ0MmU1YjBmZTYwYjljYzI0M2M4MTJkZjk3Y2ZlYjg3ZTQxMjM4MjEwY2ZiYzE4YmFiYmZlZDVhM2M1YmI3M2FmNDFmNWJmM2MyMTM1ZDNhMmRmYzY=
# 令牌过期时间 此处单位/毫秒 ,默认4小时,可在此网站生成 https://www.convertworld.com/zh-hans/time/milliseconds.html # 令牌过期时间 此处单位/毫秒 ,默认4小时,可在此网站生成 https://www.convertworld.com/zh-hans/time/milliseconds.html
token-validity-in-seconds: 14400000 token-validity-in-seconds: 14400000
@@ -224,4 +221,4 @@ logging:
knife4j: knife4j:
enable: false enable: false
setting: setting:
language: zh_cn language: zh_cn
@@ -9,7 +9,7 @@ spring:
quartz: quartz:
scheduler: scheduler:
# 必需,指定调度器实例的名称 # 必需,指定调度器实例的名称
instanceName: ${spring.application.name} instanceName: cutejava
# 必需,指定调度器实例的 ID # 必需,指定调度器实例的 ID
instanceId: auto instanceId: auto
threadPool: threadPool:
@@ -46,4 +46,6 @@ public interface SystemConst {
String SYMBOL_AT = "@"; String SYMBOL_AT = "@";
String PROPERTY_OS_NAME = "os.name"; String PROPERTY_OS_NAME = "os.name";
String OS_NAME_WINDOWS = "Windows"; String OS_NAME_WINDOWS = "Windows";
String CURRENT_APP_NAME = "cutejava";
String CURRENT_APP_TITLE = "CuteJava";
} }
@@ -41,7 +41,7 @@ public class KitSpringBeanHolder implements ApplicationContextAware, DisposableB
*/ */
public synchronized static void addCallBacks(CallBack callBack) { public synchronized static void addCallBacks(CallBack callBack) {
if (addCallback) { if (addCallback) {
KitSpringBeanHolder.CALL_BACKS.add(callBack); CALL_BACKS.add(callBack);
} else { } else {
log.warn("CallBack:{} 已无法添加!立即执行", callBack.getCallBackName()); log.warn("CallBack:{} 已无法添加!立即执行", callBack.getCallBackName());
callBack.executor(); callBack.executor();
@@ -116,7 +116,7 @@ public class KitSpringBeanHolder implements ApplicationContextAware, DisposableB
* 清除SpringContextHolder中的ApplicationContext为Null. * 清除SpringContextHolder中的ApplicationContext为Null.
*/ */
private static void clearHolder() { private static void clearHolder() {
log.debug("清除SpringContextHolder中的ApplicationContext:" + applicationContext); log.debug("清除SpringContextHolder中的ApplicationContext:{}", applicationContext);
applicationContext = null; applicationContext = null;
} }
@@ -137,8 +137,7 @@ public class KitSpringBeanHolder implements ApplicationContextAware, DisposableB
@Override @Override
public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException { public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException {
if (KitSpringBeanHolder.applicationContext != null) { if (KitSpringBeanHolder.applicationContext != null) {
log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:{}", KitSpringBeanHolder.applicationContext);
KitSpringBeanHolder.applicationContext);
} }
KitSpringBeanHolder.applicationContext = applicationContext; KitSpringBeanHolder.applicationContext = applicationContext;
if (addCallback) { if (addCallback) {
@@ -18,7 +18,6 @@ package cn.odboy.framework.server.core;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.odboy.constant.SystemConst; import cn.odboy.constant.SystemConst;
import cn.odboy.util.KitSystemUtil; import cn.odboy.util.KitSystemUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
/** /**
@@ -36,26 +35,24 @@ public class KitFileLocalUploadHelper {
private static final String PATH_WINDOWS = "C:\\${appName}\\file\\"; private static final String PATH_WINDOWS = "C:\\${appName}\\file\\";
private static final String PATH_MAC = "/Users${username}/${appName}/file/"; private static final String PATH_MAC = "/Users${username}/${appName}/file/";
private static final String PATH_LINUX = "/home/${appName}/file/"; private static final String PATH_LINUX = "/home/${appName}/file/";
@Value("${spring.application.name}")
private String appName;
public String getPath() { public String getPath() {
String os = System.getProperty("os.name"); String os = System.getProperty("os.name");
if (os == null) { if (os == null) {
// 默认使用 Linux 路径作为兜底方案 // 默认使用 Linux 路径作为兜底方案
return PATH_LINUX.replace("${appName}", appName); return PATH_LINUX.replace("${appName}", SystemConst.CURRENT_APP_NAME);
} }
String lowerOs = os.toLowerCase(); String lowerOs = os.toLowerCase();
if (lowerOs.startsWith(SystemConst.WIN)) { if (lowerOs.startsWith(SystemConst.WIN)) {
return PATH_WINDOWS.replace("${appName}", appName); return PATH_WINDOWS.replace("${appName}", SystemConst.CURRENT_APP_NAME);
} else if (lowerOs.startsWith(SystemConst.MAC)) { } else if (lowerOs.startsWith(SystemConst.MAC)) {
String currentUserName = KitSystemUtil.getCurrentUserName(); String currentUserName = KitSystemUtil.getCurrentUserName();
if (StrUtil.isBlank(currentUserName)) { if (StrUtil.isBlank(currentUserName)) {
return PATH_MAC.replace("${appName}", appName).replace("${username}", ""); return PATH_MAC.replace("${appName}", SystemConst.CURRENT_APP_NAME).replace("${username}", "");
} }
return PATH_MAC.replace("${appName}", appName).replace("${username}", "/" + currentUserName); return PATH_MAC.replace("${appName}", SystemConst.CURRENT_APP_NAME).replace("${username}", "/" + currentUserName);
} }
return PATH_LINUX.replace("${appName}", appName); return PATH_LINUX.replace("${appName}", SystemConst.CURRENT_APP_NAME);
} }
public int getAvatarMaxSize() { public int getAvatarMaxSize() {
@@ -77,9 +77,9 @@ public class SystemQuartzJobController {
@ApiOperation("查询定时任务执行日志") @ApiOperation("查询定时任务执行日志")
@PostMapping(value = "/searchQuartzLog") @PostMapping(value = "/searchQuartzLog")
@PreAuthorize("@el.check('quartzJob:list')") @PreAuthorize("@el.check('quartzJob:list')")
public ResponseEntity<KitPageResult<SystemQuartzLogTb>> queryQuartzJobLog(SystemQueryQuartzJobArgs args) { public ResponseEntity<KitPageResult<SystemQuartzLogTb>> queryQuartzJobLog(@Validated @RequestBody KitPageArgs<SystemQueryQuartzJobArgs> pageArgs) {
Page<SystemQuartzLogTb> page = new Page<>(args.getPage(), args.getSize()); Page<SystemQuartzLogTb> page = new Page<>(pageArgs.getPage(), pageArgs.getSize());
return ResponseEntity.ok(systemQuartzJobService.searchQuartzLogByArgs(args, page)); return ResponseEntity.ok(systemQuartzJobService.searchQuartzLogByArgs(pageArgs.getArgs(), page));
} }
@OperationLog @OperationLog
@@ -72,9 +72,8 @@ public class SystemRoleController {
@ApiOperation("查询角色") @ApiOperation("查询角色")
@PostMapping(value = "/searchRole") @PostMapping(value = "/searchRole")
@PreAuthorize("@el.check('roles:list')") @PreAuthorize("@el.check('roles:list')")
public ResponseEntity<KitPageResult<SystemRoleVo>> queryRoleByArgs( public ResponseEntity<KitPageResult<SystemRoleVo>> queryRoleByArgs(@Validated @RequestBody KitPageArgs<SystemQueryRoleArgs> pageArgs) {
@Validated @RequestBody KitPageArgs<SystemQueryRoleArgs> pageArgs) { Page<SystemRoleTb> page = new Page<>(pageArgs.getPage(), pageArgs.getSize());
Page<Object> page = new Page<>(pageArgs.getPage(), pageArgs.getSize());
return ResponseEntity.ok(systemRoleService.searchRoleByArgs(pageArgs.getArgs(), page)); return ResponseEntity.ok(systemRoleService.searchRoleByArgs(pageArgs.getArgs(), page));
} }
@@ -23,8 +23,4 @@ public class SystemQueryDictArgs {
@ApiModelProperty(value = "模糊查询") @ApiModelProperty(value = "模糊查询")
private String blurry; private String blurry;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
} }
@@ -31,8 +31,4 @@ public class SystemQueryJobArgs {
private Boolean enabled; private Boolean enabled;
@ApiModelProperty(value = "创建时间") @ApiModelProperty(value = "创建时间")
private List<Date> createTime; private List<Date> createTime;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
} }
@@ -29,8 +29,4 @@ public class SystemQueryQuartzJobArgs {
private Boolean isSuccess; private Boolean isSuccess;
@ApiModelProperty(value = "创建时间") @ApiModelProperty(value = "创建时间")
private List<Date> createTime; private List<Date> createTime;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
} }
@@ -27,10 +27,4 @@ public class SystemQueryRoleArgs {
private String blurry; private String blurry;
@ApiModelProperty(value = "创建时间") @ApiModelProperty(value = "创建时间")
private List<Date> createTime; private List<Date> createTime;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
@ApiModelProperty(value = "偏移量", hidden = true)
private long offset;
} }
@@ -40,8 +40,4 @@ public class SystemQueryUserArgs extends KitObject {
private Long deptId; private Long deptId;
@ApiModelProperty(value = "创建时间") @ApiModelProperty(value = "创建时间")
private List<Date> createTime; private List<Date> createTime;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
} }
@@ -18,7 +18,6 @@ package cn.odboy.system.dal.mysql;
import cn.odboy.system.dal.dataobject.SystemDictTb; import cn.odboy.system.dal.dataobject.SystemDictTb;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
/** /**
@@ -29,10 +28,6 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper @Mapper
public interface SystemDictMapper extends BaseMapper<SystemDictTb> { public interface SystemDictMapper extends BaseMapper<SystemDictTb> {
default List<SystemDictTb> listAll() {
return selectList(null);
}
default SystemDictTb getByName(String dictName) { default SystemDictTb getByName(String dictName) {
LambdaQueryWrapper<SystemDictTb> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SystemDictTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemDictTb::getName, dictName); wrapper.eq(SystemDictTb::getName, dictName);
@@ -43,8 +43,8 @@ public class BizLockAspect {
public Object around(ProceedingJoinPoint joinPoint, BizLock bizLock) throws Throwable { public Object around(ProceedingJoinPoint joinPoint, BizLock bizLock) throws Throwable {
// 解析SpEL表达式生成最终的lockKey // 解析SpEL表达式生成最终的lockKey
String lockKey = parseLockKey(joinPoint, bizLock); String lockKey = parseLockKey(joinPoint, bizLock);
Boolean success = redisHelper.setIfAbsent(lockKey, lockKey, bizLock.leaseTime(), bizLock.timeUnit()); boolean success = redisHelper.setIfAbsent(lockKey, lockKey, bizLock.leaseTime(), bizLock.timeUnit());
if (success == null || !success) { if (!success) {
throw new BadRequestException(bizLock.errorMessage()); throw new BadRequestException(bizLock.errorMessage());
} }
try { try {
@@ -15,6 +15,7 @@
*/ */
package cn.odboy.system.framework.storage.local; package cn.odboy.system.framework.storage.local;
import cn.odboy.constant.SystemConst;
import cn.odboy.framework.exception.BadRequestException; import cn.odboy.framework.exception.BadRequestException;
import cn.odboy.framework.properties.AppProperties; import cn.odboy.framework.properties.AppProperties;
import java.io.File; import java.io.File;
@@ -30,9 +31,6 @@ import org.springframework.util.unit.DataSize;
@Slf4j @Slf4j
@Configuration @Configuration
public class MultipartConfig { public class MultipartConfig {
@Value("${spring.application.name}")
private String name;
@Autowired @Autowired
private AppProperties properties; private AppProperties properties;
@@ -44,7 +42,7 @@ public class MultipartConfig {
MultipartConfigFactory factory = new MultipartConfigFactory(); MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setMaxFileSize(DataSize.ofMegabytes(properties.getOss().getMaxSize())); factory.setMaxFileSize(DataSize.ofMegabytes(properties.getOss().getMaxSize()));
factory.setMaxRequestSize(DataSize.ofMegabytes(properties.getOss().getMaxSize())); factory.setMaxRequestSize(DataSize.ofMegabytes(properties.getOss().getMaxSize()));
String location = System.getProperty("user.home") + "/" + name + "/tmp"; String location = System.getProperty("user.home") + "/" + SystemConst.CURRENT_APP_NAME + "/tmp";
File tmpFile = new File(location); File tmpFile = new File(location);
if (!tmpFile.exists()) { if (!tmpFile.exists()) {
if (!tmpFile.mkdirs()) { if (!tmpFile.mkdirs()) {
@@ -26,7 +26,6 @@ import cn.odboy.system.dal.model.response.SystemDictDetailVo;
import cn.odboy.system.dal.mysql.SystemDictMapper; import cn.odboy.system.dal.mysql.SystemDictMapper;
import cn.odboy.util.KitBeanUtil; import cn.odboy.util.KitBeanUtil;
import cn.odboy.util.KitPageUtil; import cn.odboy.util.KitPageUtil;
import cn.odboy.util.KitValidUtil;
import cn.odboy.util.xlsx.KitExcelExporter; import cn.odboy.util.xlsx.KitExcelExporter;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -92,20 +91,21 @@ public class SystemDictService {
*/ */
public KitPageResult<SystemDictTb> searchDict(SystemQueryDictArgs args, Page<SystemDictTb> page) { public KitPageResult<SystemDictTb> searchDict(SystemQueryDictArgs args, Page<SystemDictTb> page) {
LambdaQueryWrapper<SystemDictTb> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SystemDictTb> wrapper = new LambdaQueryWrapper<>();
injectQueryParams(args, wrapper); this.injectQueryParams(args, wrapper);
Page<SystemDictTb> selectPage = systemDictMapper.selectPage(page, wrapper); Page<SystemDictTb> selectPage = systemDictMapper.selectPage(page, wrapper);
return KitPageUtil.toPage(selectPage); return KitPageUtil.toPage(selectPage);
} }
private void injectQueryParams(SystemQueryDictArgs args, LambdaQueryWrapper<SystemDictTb> wrapper) { private void injectQueryParams(SystemQueryDictArgs args, LambdaQueryWrapper<SystemDictTb> wrapper) {
KitValidUtil.notNull(args); if (args != null) {
wrapper.and(StrUtil.isNotBlank(args.getBlurry()), c -> c.like(SystemDictTb::getName, args.getBlurry()).or() wrapper.and(StrUtil.isNotBlank(args.getBlurry()), c -> c.like(SystemDictTb::getName, args.getBlurry()).or()
.like(SystemDictTb::getDescription, args.getBlurry())); .like(SystemDictTb::getDescription, args.getBlurry()));
}
} }
public List<SystemDictTb> queryDictByArgs(SystemQueryDictArgs args) { public List<SystemDictTb> queryDictByArgs(SystemQueryDictArgs args) {
LambdaQueryWrapper<SystemDictTb> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SystemDictTb> wrapper = new LambdaQueryWrapper<>();
injectQueryParams(args, wrapper); this.injectQueryParams(args, wrapper);
return systemDictMapper.selectList(wrapper); return systemDictMapper.selectList(wrapper);
} }
@@ -19,6 +19,7 @@ import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.RandomUtil;
import cn.hutool.extra.mail.Mail; import cn.hutool.extra.mail.Mail;
import cn.hutool.extra.mail.MailAccount; import cn.hutool.extra.mail.MailAccount;
import cn.odboy.constant.SystemConst;
import cn.odboy.framework.exception.BadRequestException; import cn.odboy.framework.exception.BadRequestException;
import cn.odboy.framework.properties.AppProperties; import cn.odboy.framework.properties.AppProperties;
import cn.odboy.framework.redis.KitRedisHelper; import cn.odboy.framework.redis.KitRedisHelper;
@@ -32,7 +33,6 @@ import cn.odboy.util.KitResourceTemplateUtil;
import java.util.Collections; import java.util.Collections;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@@ -46,8 +46,6 @@ public class SystemEmailService {
private KitRedisHelper redisHelper; private KitRedisHelper redisHelper;
@Autowired @Autowired
private AppProperties properties; private AppProperties properties;
@Value("${spring.application.title}")
private String applicationTitle;
/** /**
* 更新邮件配置 * 更新邮件配置
@@ -146,7 +144,7 @@ public class SystemEmailService {
KitResourceTemplateUtil.render(null, biEnum.getTemplateName(), Dict.create().set("code", oldCode)); KitResourceTemplateUtil.render(null, biEnum.getTemplateName(), Dict.create().set("code", oldCode));
} }
SystemSendEmailArgs sendEmailRequest = SystemSendEmailArgs sendEmailRequest =
new SystemSendEmailArgs(Collections.singletonList(email), applicationTitle, content); new SystemSendEmailArgs(Collections.singletonList(email), SystemConst.CURRENT_APP_TITLE, content);
sendEmail(sendEmailRequest); sendEmail(sendEmailRequest);
} }
@@ -26,7 +26,6 @@ import cn.odboy.system.dal.model.request.SystemQueryJobArgs;
import cn.odboy.system.dal.mysql.SystemJobMapper; import cn.odboy.system.dal.mysql.SystemJobMapper;
import cn.odboy.util.KitBeanUtil; import cn.odboy.util.KitBeanUtil;
import cn.odboy.util.KitPageUtil; import cn.odboy.util.KitPageUtil;
import cn.odboy.util.KitValidUtil;
import cn.odboy.util.xlsx.KitExcelExporter; import cn.odboy.util.xlsx.KitExcelExporter;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -129,12 +128,13 @@ public class SystemJobService {
} }
public void injectQueryParams(SystemQueryJobArgs args, LambdaQueryWrapper<SystemJobTb> wrapper) { public void injectQueryParams(SystemQueryJobArgs args, LambdaQueryWrapper<SystemJobTb> wrapper) {
KitValidUtil.notNull(args); if (args != null) {
wrapper.like(StrUtil.isNotBlank(args.getName()), SystemJobTb::getName, args.getName()); wrapper.like(StrUtil.isNotBlank(args.getName()), SystemJobTb::getName, args.getName());
wrapper.eq(args.getEnabled() != null, SystemJobTb::getEnabled, args.getEnabled()); wrapper.eq(args.getEnabled() != null, SystemJobTb::getEnabled, args.getEnabled());
if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) {
wrapper.between(SystemJobTb::getCreateTime, args.getCreateTime().get(0), wrapper.between(SystemJobTb::getCreateTime, args.getCreateTime().get(0),
args.getCreateTime().get(1)); args.getCreateTime().get(1));
}
} }
wrapper.orderByDesc(SystemJobTb::getJobSort, SystemJobTb::getId); wrapper.orderByDesc(SystemJobTb::getJobSort, SystemJobTb::getId);
} }
@@ -33,7 +33,6 @@ import cn.odboy.system.dal.mysql.SystemLocalStorageMapper;
import cn.odboy.util.KitBeanUtil; import cn.odboy.util.KitBeanUtil;
import cn.odboy.util.KitFileUtil; import cn.odboy.util.KitFileUtil;
import cn.odboy.util.KitPageUtil; import cn.odboy.util.KitPageUtil;
import cn.odboy.util.KitValidUtil;
import cn.odboy.util.xlsx.KitExcelExporter; import cn.odboy.util.xlsx.KitExcelExporter;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -140,15 +139,16 @@ public class SystemLocalStorageService {
} }
private void injectQueryParams(SystemQueryStorageArgs args, LambdaQueryWrapper<SystemLocalStorageTb> wrapper) { private void injectQueryParams(SystemQueryStorageArgs args, LambdaQueryWrapper<SystemLocalStorageTb> wrapper) {
KitValidUtil.notNull(args); if (args != null) {
wrapper.and(StrUtil.isNotBlank(args.getBlurry()), wrapper.and(StrUtil.isNotBlank(args.getBlurry()),
c -> c.like(SystemLocalStorageTb::getName, args.getBlurry()).or() c -> c.like(SystemLocalStorageTb::getName, args.getBlurry()).or()
.like(SystemLocalStorageTb::getSuffix, args.getBlurry()).or() .like(SystemLocalStorageTb::getSuffix, args.getBlurry()).or()
.like(SystemLocalStorageTb::getType, args.getBlurry()).or() .like(SystemLocalStorageTb::getType, args.getBlurry()).or()
.like(SystemLocalStorageTb::getCreateBy, args.getBlurry())); .like(SystemLocalStorageTb::getCreateBy, args.getBlurry()));
if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) {
wrapper.between(SystemLocalStorageTb::getUpdateTime, args.getCreateTime().get(0), wrapper.between(SystemLocalStorageTb::getUpdateTime, args.getCreateTime().get(0),
args.getCreateTime().get(1)); args.getCreateTime().get(1));
}
} }
wrapper.orderByDesc(SystemLocalStorageTb::getId); wrapper.orderByDesc(SystemLocalStorageTb::getId);
} }
@@ -219,11 +219,12 @@ public class SystemQuartzJobService {
} }
private void injectQuartzLogQueryParams(SystemQueryQuartzJobArgs args, LambdaQueryWrapper<SystemQuartzLogTb> wrapper) { private void injectQuartzLogQueryParams(SystemQueryQuartzJobArgs args, LambdaQueryWrapper<SystemQuartzLogTb> wrapper) {
KitValidUtil.notNull(args); if (args != null) {
wrapper.like(StrUtil.isNotBlank(args.getJobName()), SystemQuartzLogTb::getJobName, args.getJobName()); wrapper.like(StrUtil.isNotBlank(args.getJobName()), SystemQuartzLogTb::getJobName, args.getJobName());
wrapper.eq(args.getIsSuccess() != null, SystemQuartzLogTb::getIsSuccess, args.getIsSuccess()); wrapper.eq(args.getIsSuccess() != null, SystemQuartzLogTb::getIsSuccess, args.getIsSuccess());
if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) {
wrapper.between(SystemQuartzLogTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1)); wrapper.between(SystemQuartzLogTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1));
}
} }
wrapper.orderByDesc(SystemQuartzLogTb::getId); wrapper.orderByDesc(SystemQuartzLogTb::getId);
} }
@@ -68,7 +68,7 @@ public class SystemRoleService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void saveRole(SystemCreateRoleArgs args) { public void saveRole(SystemCreateRoleArgs args) {
checkRoleLevels(args.getLevel()); checkRoleLevels(args.getLevel());
if (this.getRoleByName(args.getName()) != null) { if (this.countRoleByName(args.getName()) > 0) {
throw new BadRequestException("角色名称已存在"); throw new BadRequestException("角色名称已存在");
} }
SystemRoleTb roleTb = KitBeanUtil.copyToClass(args, SystemRoleTb.class); SystemRoleTb roleTb = KitBeanUtil.copyToClass(args, SystemRoleTb.class);
@@ -85,6 +85,12 @@ public class SystemRoleService {
return systemRoleMapper.selectOne(wrapper); return systemRoleMapper.selectOne(wrapper);
} }
private long countRoleByName(String name) {
LambdaQueryWrapper<SystemRoleTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemRoleTb::getName, name);
return systemRoleMapper.selectCount(wrapper);
}
/** /**
* 修改 * 修改
* *
@@ -166,10 +172,11 @@ public class SystemRoleService {
/** /**
* 根据条件查询全部角色 * 根据条件查询全部角色
* *
* @param args 条件 * @param args 条件
* @param rolePage 分页参数
* @return / * @return /
*/ */
public List<SystemRoleVo> queryRoleByArgs(SystemQueryRoleArgs args) { public List<SystemRoleVo> queryRoleByArgs(SystemQueryRoleArgs args, Page<SystemRoleTb> rolePage) {
KitValidUtil.notNull(args); KitValidUtil.notNull(args);
// 查询角色基本信息 // 查询角色基本信息
LambdaQueryWrapper<SystemRoleTb> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SystemRoleTb> wrapper = new LambdaQueryWrapper<>();
@@ -181,27 +188,25 @@ public class SystemRoleService {
args.getCreateTime().get(1)); args.getCreateTime().get(1));
} }
wrapper.orderByAsc(SystemRoleTb::getLevel); wrapper.orderByAsc(SystemRoleTb::getLevel);
if (args.getSize() != null) { List<SystemRoleTb> roles;
Page<SystemRoleTb> rolePage = new Page<>(args.getPage(), args.getSize()); if (rolePage == null) {
Page<SystemRoleTb> page = systemRoleMapper.selectPage(rolePage, wrapper); roles = systemRoleMapper.selectList(wrapper);
List<SystemRoleTb> roles = page.getRecords();
return roles.stream().map(systemUserRoleService::convertToRoleVo).collect(Collectors.toList());
} else { } else {
List<SystemRoleTb> roles = systemRoleMapper.selectList(wrapper); Page<SystemRoleTb> page = systemRoleMapper.selectPage(rolePage, wrapper);
return roles.stream().map(systemUserRoleService::convertToRoleVo).collect(Collectors.toList()); roles = page.getRecords();
} }
return roles.stream().map(systemUserRoleService::convertToRoleVo).collect(Collectors.toList());
} }
/** /**
* 分页查询角色 * 分页查询角色
* *
* @param args 条件 * @param args 条件
* @param page 分页参数 * @param page 分页条件
* @return / * @return /
*/ */
public KitPageResult<SystemRoleVo> searchRoleByArgs(SystemQueryRoleArgs args, Page<Object> page) { public KitPageResult<SystemRoleVo> searchRoleByArgs(SystemQueryRoleArgs args, Page<SystemRoleTb> page) {
args.setOffset(page.offset()); List<SystemRoleVo> roles = this.queryRoleByArgs(args, page);
List<SystemRoleVo> roles = this.queryRoleByArgs(args);
Long total = this.countRoleByArgs(args); Long total = this.countRoleByArgs(args);
return KitPageUtil.toPage(roles, total); return KitPageUtil.toPage(roles, total);
} }
@@ -280,7 +285,7 @@ public class SystemRoleService {
} }
public void exportRoleXlsx(HttpServletResponse response, SystemQueryRoleArgs args) { public void exportRoleXlsx(HttpServletResponse response, SystemQueryRoleArgs args) {
List<SystemRoleVo> systemRoleVos = this.queryRoleByArgs(args); List<SystemRoleVo> systemRoleVos = this.queryRoleByArgs(args, null);
List<SystemRoleExportRowVo> rowVos = new ArrayList<>(); List<SystemRoleExportRowVo> rowVos = new ArrayList<>();
for (SystemRoleVo dataObject : systemRoleVos) { for (SystemRoleVo dataObject : systemRoleVos) {
SystemRoleExportRowVo rowVo = new SystemRoleExportRowVo(); SystemRoleExportRowVo rowVo = new SystemRoleExportRowVo();
@@ -371,7 +371,7 @@ public class SystemUserService {
c.or(); c.or();
c.like(SystemUserTb::getNickName, args.getBlurry()); c.like(SystemUserTb::getNickName, args.getBlurry());
}); });
return systemUserMapper.selectPage(new Page<>(args.getPage(), 50), wrapper).getRecords().stream().map(m -> { return systemUserMapper.selectPage(new Page<>(pageArgs.getPage(), 50), wrapper).getRecords().stream().map(m -> {
Map<String, Object> ext = new HashMap<>(1); Map<String, Object> ext = new HashMap<>(1);
ext.put("id", m.getId()); ext.put("id", m.getId());
ext.put("deptId", m.getDeptId()); ext.put("deptId", m.getDeptId());
@@ -54,12 +54,12 @@ public final class KitSqlUtil {
try { try {
className = DriverManager.getDriver(jdbcUrl.trim()).getClass().getName(); className = DriverManager.getDriver(jdbcUrl.trim()).getClass().getName();
} catch (SQLException e) { } catch (SQLException e) {
throw new BadRequestException("Get class name error: =" + jdbcUrl); throw new BadRequestException("获取驱动类名失败,jdbcUrl=" + jdbcUrl);
} }
if (StringUtils.isEmpty(className)) { if (StringUtils.isEmpty(className)) {
DataTypeEnum dataTypeEnum = DataTypeEnum.urlOf(jdbcUrl); DataTypeEnum dataTypeEnum = DataTypeEnum.urlOf(jdbcUrl);
if (null == dataTypeEnum) { if (null == dataTypeEnum) {
throw new BadRequestException("Not supported data type: jdbcUrl=" + jdbcUrl); throw new BadRequestException("不支持的数据库类型,jdbcUrl=" + jdbcUrl);
} }
druidDataSource.setDriverClassName(dataTypeEnum.getDriver()); druidDataSource.setDriverClassName(dataTypeEnum.getDriver());
} else { } else {
@@ -82,12 +82,12 @@ public final class KitSqlUtil {
try { try {
int timeOut = 5; int timeOut = 5;
if (null == connection || connection.isClosed() || !connection.isValid(timeOut)) { if (null == connection || connection.isClosed() || !connection.isValid(timeOut)) {
log.info("connection is closed or invalid, retry get connection!"); log.info("连接已关闭或者错误,重试获取连接");
connection = dataSource.getConnection(); connection = dataSource.getConnection();
} }
} catch (Exception e) { } catch (Exception e) {
log.error("create connection error, jdbcUrl: {}", jdbcUrl); log.error("创建连接失败, jdbcUrl={}", jdbcUrl);
throw new BadRequestException("create connection error, jdbcUrl: " + jdbcUrl); throw new BadRequestException("创建连接失败, jdbcUrl=" + jdbcUrl);
} finally { } finally {
KitCloseUtil.close(connection); KitCloseUtil.close(connection);
} }
@@ -55,8 +55,7 @@ public class TaskJobBean extends QuartzJobBean {
public void executeInternal(JobExecutionContext context) { public void executeInternal(JobExecutionContext context) {
// ========================== 获取代理类 ========================== // ========================== 获取代理类 ==========================
TaskInstanceInfoService taskInstanceInfoService = KitSpringBeanHolder.getBean(TaskInstanceInfoService.class); TaskInstanceInfoService taskInstanceInfoService = KitSpringBeanHolder.getBean(TaskInstanceInfoService.class);
TaskInstanceDetailService taskInstanceDetailService = TaskInstanceDetailService taskInstanceDetailService = KitSpringBeanHolder.getBean(TaskInstanceDetailService.class);
KitSpringBeanHolder.getBean(TaskInstanceDetailService.class);
// ========================== 获取参数 ========================== // ========================== 获取参数 ==========================
JobDataMap dataMap = context.getMergedJobDataMap(); JobDataMap dataMap = context.getMergedJobDataMap();
long id = dataMap.getLong(TaskJobKeys.ID); long id = dataMap.getLong(TaskJobKeys.ID);
@@ -69,8 +68,7 @@ public class TaskJobBean extends QuartzJobBean {
if (StrUtil.isBlank(retryNodeCode)) { if (StrUtil.isBlank(retryNodeCode)) {
executeNormalTask(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeVos); executeNormalTask(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeVos);
} else { } else {
executeRetryTask(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeVos, executeRetryTask(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeVos, retryNodeCode);
retryNodeCode);
} }
} }
@@ -83,19 +81,14 @@ public class TaskJobBean extends QuartzJobBean {
* @param dataMap 数据映射 * @param dataMap 数据映射
* @param taskTemplateNodeVos 模板节点列表 * @param taskTemplateNodeVos 模板节点列表
*/ */
private void executeNormalTask(TaskInstanceInfoService taskInstanceInfoService, private void executeNormalTask(TaskInstanceInfoService taskInstanceInfoService, TaskInstanceDetailService taskInstanceDetailService, long id, JobDataMap dataMap, List<TaskTemplateNodeVo> taskTemplateNodeVos) {
TaskInstanceDetailService taskInstanceDetailService, long id, JobDataMap dataMap,
List<TaskTemplateNodeVo> taskTemplateNodeVos) {
// ========================== 初始化执行明细 ========================== // ========================== 初始化执行明细 ==========================
List<TaskInstanceDetailTb> taskInstanceDetails = List<TaskInstanceDetailTb> taskInstanceDetails = taskTemplateNodeVos.stream().map(taskTemplateNodeVo -> buildTaskInstanceDetail(id, taskTemplateNodeVo))
taskTemplateNodeVos.stream().map(taskTemplateNodeVo -> buildTaskInstanceDetail(id, taskTemplateNodeVo)) .collect(Collectors.toList());
.collect(Collectors.toList());
taskInstanceDetailService.saveBatch(taskInstanceDetails); taskInstanceDetailService.saveBatch(taskInstanceDetails);
Map<String, Long> codeIdMap = taskInstanceDetails.stream() Map<String, Long> codeIdMap = taskInstanceDetails.stream().collect(Collectors.toMap(TaskInstanceDetailTb::getBizCode, TaskInstanceDetailTb::getId));
.collect(Collectors.toMap(TaskInstanceDetailTb::getBizCode, TaskInstanceDetailTb::getId));
// ========================== 顺序执行 ========================== // ========================== 顺序执行 ==========================
executeTaskSteps(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeVos, executeTaskSteps(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeVos, codeIdMap);
codeIdMap);
} }
/** /**
@@ -178,16 +171,14 @@ public class TaskJobBean extends QuartzJobBean {
* @param taskTemplateNodes 需要执行的任务节点列表 * @param taskTemplateNodes 需要执行的任务节点列表
* @param codeIdMap 节点编码与明细ID映射 * @param codeIdMap 节点编码与明细ID映射
*/ */
private void executeTaskSteps(TaskInstanceInfoService taskInstanceInfoService, private void executeTaskSteps(TaskInstanceInfoService taskInstanceInfoService, TaskInstanceDetailService taskInstanceDetailService, Long id, JobDataMap dataMap, List<TaskTemplateNodeVo> taskTemplateNodes, Map<String, Long> codeIdMap) {
TaskInstanceDetailService taskInstanceDetailService, Long id, JobDataMap dataMap,
List<TaskTemplateNodeVo> taskTemplateNodes, Map<String, Long> codeIdMap) {
try { try {
boolean isTerminate = false; boolean isTerminate = false;
for (TaskTemplateNodeVo taskTemplateNodeVo : taskTemplateNodes) { for (TaskTemplateNodeVo taskTemplateNodeVo : taskTemplateNodes) {
String code = taskTemplateNodeVo.getCode(); String code = taskTemplateNodeVo.getCode();
while (true) { while (true) {
TaskInstanceDetailTb currentTaskInstanceNode = ThreadUtil.safeSleep(5000);
taskInstanceDetailService.getOneByInstanceIdAndCode(id, code); TaskInstanceDetailTb currentTaskInstanceNode = taskInstanceDetailService.getOneByInstanceIdAndCode(id, code);
if (TaskStatusEnum.Fail.getCode().equals(currentTaskInstanceNode.getExecuteStatus())) { if (TaskStatusEnum.Fail.getCode().equals(currentTaskInstanceNode.getExecuteStatus())) {
log.info("任务节点执行失败, instanceId={}, bizCode={}", id, code); log.info("任务节点执行失败, instanceId={}, bizCode={}", id, code);
isTerminate = true; isTerminate = true;
@@ -197,30 +188,30 @@ public class TaskJobBean extends QuartzJobBean {
break; break;
} else if (TaskStatusEnum.Pending.getCode().equals(currentTaskInstanceNode.getExecuteStatus())) { } else if (TaskStatusEnum.Pending.getCode().equals(currentTaskInstanceNode.getExecuteStatus())) {
log.info("任务节点由待执行变更为执行中, instanceId={}, bizCode={}", id, code); log.info("任务节点由待执行变更为执行中, instanceId={}, bizCode={}", id, code);
try { ThreadUtil.execAsync(() -> {
TaskStepExecutor executor = KitSpringBeanHolder.getBean("taskStep" + getBeanAlias(code)); try {
taskInstanceDetailService.fastStart(id, code, dataMap); TaskStepExecutor executor = KitSpringBeanHolder.getBean("taskStep" + getBeanAlias(code));
executor.execute(codeIdMap.getOrDefault(code, null), dataMap, taskTemplateNodeVo); taskInstanceDetailService.fastStart(id, code, dataMap);
taskInstanceDetailService.fastSuccessWithInfo(id, code, null); executor.execute(codeIdMap.getOrDefault(code, null), dataMap, taskTemplateNodeVo);
} catch (Exception e) { taskInstanceDetailService.fastSuccessWithInfo(id, code, null);
log.error("任务节点执行失败", e); } catch (Exception e) {
taskInstanceDetailService.fastFailWithInfo(id, code, e.getMessage()); log.error("任务节点执行失败", e);
throw new ServerException(e); taskInstanceDetailService.fastFailWithInfo(id, code, e.getMessage());
} }
break; });
} else if (TaskStatusEnum.Running.getCode().equals(currentTaskInstanceNode.getExecuteStatus())) { } else if (TaskStatusEnum.Running.getCode().equals(currentTaskInstanceNode.getExecuteStatus())) {
ThreadUtil.safeSleep(5000); log.info("任务节点执行中, instanceId={}, bizCode={}", id, code);
} else { } else {
// 处理未知状态 // 处理未知状态
log.warn("任务节点处于未知状态, instanceId={}, bizCode={}, status={}", id, code, log.warn("任务节点处于未知状态, instanceId={}, bizCode={}, status={}", id, code, currentTaskInstanceNode.getExecuteStatus());
currentTaskInstanceNode.getExecuteStatus());
ThreadUtil.safeSleep(5000);
} }
} }
if (isTerminate) { if (isTerminate) {
// 跳出任务线
break; break;
} }
} }
// 主动终止 或者 被动退出的
if (isTerminate) { if (isTerminate) {
taskInstanceInfoService.fastFailWithMessageData(id, "任务执行失败", dataMap); taskInstanceInfoService.fastFailWithMessageData(id, "任务执行失败", dataMap);
} else { } else {
@@ -26,6 +26,5 @@ public interface TaskStepExecutor {
* @param jobDataMap 执行参数 * @param jobDataMap 执行参数
* @param taskTemplateNode 任务节点信息 * @param taskTemplateNode 任务节点信息
*/ */
void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode) void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode) throws BadRequestException;
throws BadRequestException;
} }
@@ -30,9 +30,6 @@ server:
# IMMEDIATE(立即): 当应用程序以"IMMEDIATE"模式关闭时,它会立即终止,而不管当前是否有任何活动任务或请求。这种方式适用于那些可以立即停止而不会造成严重问题的情况。 # IMMEDIATE(立即): 当应用程序以"IMMEDIATE"模式关闭时,它会立即终止,而不管当前是否有任何活动任务或请求。这种方式适用于那些可以立即停止而不会造成严重问题的情况。
shutdown: graceful shutdown: graceful
spring: spring:
application:
name: cutejava
title: CuteJava
lifecycle: lifecycle:
# 采用java.time.Duration格式的值,如果在这个时间内,优雅停机没有停掉应用,超过这个时间就会强制停止应用 # 采用java.time.Duration格式的值,如果在这个时间内,优雅停机没有停掉应用,超过这个时间就会强制停止应用
timeout-per-shutdown-phase: 30s timeout-per-shutdown-phase: 30s
@@ -160,7 +157,7 @@ mybatis-plus:
app: app:
# 密码加密传输,前端公钥加密,后端私钥解密 # 密码加密传输,前端公钥加密,后端私钥解密
rsa: rsa:
private-key: MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A== private-key: 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
# 鉴权 # 鉴权
jwt: jwt:
# 必须使用最少88位的Base64对该令牌进行编码 cn.odboy.util.CsBase64SecretUtil # 必须使用最少88位的Base64对该令牌进行编码 cn.odboy.util.CsBase64SecretUtil
@@ -225,4 +222,4 @@ logging:
total-size-cap: 1GB total-size-cap: 1GB
level: level:
# root: debug # root: debug
cn.odboy: info cn.odboy: info
@@ -30,9 +30,6 @@ server:
# IMMEDIATE(立即): 当应用程序以"IMMEDIATE"模式关闭时,它会立即终止,而不管当前是否有任何活动任务或请求。这种方式适用于那些可以立即停止而不会造成严重问题的情况。 # IMMEDIATE(立即): 当应用程序以"IMMEDIATE"模式关闭时,它会立即终止,而不管当前是否有任何活动任务或请求。这种方式适用于那些可以立即停止而不会造成严重问题的情况。
shutdown: graceful shutdown: graceful
spring: spring:
application:
name: cutejava
title: CuteJava
lifecycle: lifecycle:
# 采用java.time.Duration格式的值,如果在这个时间内,优雅停机没有停掉应用,超过这个时间就会强制停止应用 # 采用java.time.Duration格式的值,如果在这个时间内,优雅停机没有停掉应用,超过这个时间就会强制停止应用
timeout-per-shutdown-phase: 30s timeout-per-shutdown-phase: 30s
@@ -159,11 +156,11 @@ mybatis-plus:
app: app:
# 密码加密传输,前端公钥加密,后端私钥解密 # 密码加密传输,前端公钥加密,后端私钥解密
rsa: rsa:
private-key: MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A== private-key: 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
# 鉴权 # 鉴权
jwt: jwt:
# 必须使用最少88位的Base64对该令牌进行编码 # 必须使用最少88位的Base64对该令牌进行编码 cn.odboy.util.CsBase64SecretUtil
base64-secret: ZmQ0ZGI5NjQ0MDQwY2I4MjMxY2Y3ZmI3MjdhN2ZmMjNhODViOTg1ZGE0NTBjMGM4NDA5NzYxMjdjOWMwYWRmZTBlZjlhNGY3ZTg4Y2U3YTE1ODVkZDU5Y2Y3OGYwZWE1NzUzNWQ2YjFjZDc0NGMxZWU2MmQ3MjY1NzJmNTE0MzI= base64-secret: YzE5ZWNjMjlkMGY4NDc4MDlmYzE0Y2I0MTk4YTQ4YjY5NTU0OGQxODNjNjQ0MmU1YjBmZTYwYjljYzI0M2M4MTJkZjk3Y2ZlYjg3ZTQxMjM4MjEwY2ZiYzE4YmFiYmZlZDVhM2M1YmI3M2FmNDFmNWJmM2MyMTM1ZDNhMmRmYzY=
# 令牌过期时间 此处单位/毫秒 ,默认4小时,可在此网站生成 https://www.convertworld.com/zh-hans/time/milliseconds.html # 令牌过期时间 此处单位/毫秒 ,默认4小时,可在此网站生成 https://www.convertworld.com/zh-hans/time/milliseconds.html
token-validity-in-seconds: 14400000 token-validity-in-seconds: 14400000
# token 续期检查时间范围(默认30分钟,单位毫秒),在token即将过期的一段时间内用户操作了,则给用户的token续期 # token 续期检查时间范围(默认30分钟,单位毫秒),在token即将过期的一段时间内用户操作了,则给用户的token续期
@@ -224,4 +221,4 @@ logging:
total-size-cap: 1GB total-size-cap: 1GB
level: level:
# root: debug # root: debug
cn.odboy: info cn.odboy: info
@@ -9,7 +9,7 @@ spring:
quartz: quartz:
scheduler: scheduler:
# 必需,指定调度器实例的名称 # 必需,指定调度器实例的名称
instanceName: ${spring.application.name} instanceName: cutejava
# 必需,指定调度器实例的 ID # 必需,指定调度器实例的 ID
instanceId: auto instanceId: auto
threadPool: threadPool: