4 Commits

Author SHA1 Message Date
xiang
d4c3cf4870 perf:优化代码 2026-01-30 22:53:16 +08:00
xiang
bc4b0c9753 perf:优化代码 2026-01-30 22:51:17 +08:00
xiang
26474073e5 perf:优化代码 2026-01-30 22:50:35 +08:00
xiang
3d50ec5985 perf:页面优化 2026-01-30 22:41:56 +08:00
24 changed files with 72 additions and 196 deletions

View File

@@ -1,55 +0,0 @@
package com.xiang.xservice.application.generator.config;
import com.alibaba.fastjson2.JSONReader;
import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.fastjson2.support.config.FastJsonConfig;
import com.alibaba.fastjson2.support.spring6.http.converter.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.List;
/**
* 2019-2-11 liutf WebMvcConfig 整合 cors 和 SpringMvc MessageConverter
*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/statics/**").addResourceLocations("classpath:/statics/");
}
/**
* FASTJSON2升级 by https://zhengkai.blog.csdn.net/
* https://blog.csdn.net/moshowgame/article/details/138013669
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
//自定义配置...
FastJsonConfig config = new FastJsonConfig();
config.setDateFormat("yyyy-MM-dd HH:mm:ss");
// 添加更多解析特性以提高容错性
config.setReaderFeatures(
JSONReader.Feature.FieldBased,
JSONReader.Feature.SupportArrayToBean,
JSONReader.Feature.InitStringFieldAsEmpty
);
config.setWriterFeatures(
JSONWriter.Feature.WriteMapNullValue,
JSONWriter.Feature.PrettyFormat
);
converter.setFastJsonConfig(config);
converter.setDefaultCharset(StandardCharsets.UTF_8);
converter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));
converters.add(0, converter);
}
}

View File

@@ -1,6 +1,6 @@
package com.xiang.xservice.application.generator.controller; package com.xiang.xservice.application.generator.controller;
import com.xiang.xservice.application.generator.entity.dto.ParamInfo; import com.xiang.xservice.application.generator.entity.domain.ParamInfo;
import com.xiang.xservice.application.generator.service.CodeGenService; import com.xiang.xservice.application.generator.service.CodeGenService;
import com.xiang.xservice.basic.common.resp.Result; import com.xiang.xservice.basic.common.resp.Result;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;

View File

@@ -1,6 +1,6 @@
package com.xiang.xservice.application.generator.controller; package com.xiang.xservice.application.generator.controller;
import com.xiang.xservice.application.generator.entity.dto.TemplateList; import com.xiang.xservice.application.generator.entity.domain.TemplateList;
import com.xiang.xservice.application.generator.service.TemplateService; import com.xiang.xservice.application.generator.service.TemplateService;
import com.xiang.xservice.basic.common.resp.Result; import com.xiang.xservice.basic.common.resp.Result;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;

View File

@@ -7,8 +7,6 @@ import lombok.AllArgsConstructor;
* <p> * <p>
* 忽略大小写 * 忽略大小写
**考虑增加这个类是, 如果在 StringUtils 中加工具方法, 使用起来代码非常冗长且不方便 **考虑增加这个类是, 如果在 StringUtils 中加工具方法, 使用起来代码非常冗长且不方便
* @author Nisus
* @see String
*/ */
@AllArgsConstructor @AllArgsConstructor
public class NonCaseString implements CharSequence { public class NonCaseString implements CharSequence {

View File

@@ -1,4 +1,4 @@
package com.xiang.xservice.application.generator.entity.dto; package com.xiang.xservice.application.generator.entity.domain;
import lombok.Data; import lombok.Data;
@@ -7,7 +7,7 @@ import java.util.List;
/** /**
* 类信息 * 类信息
* *
* @author zhengkai.blog.csdn.net * @author xiang
*/ */
@Data @Data
public class ClassInfo { public class ClassInfo {

View File

@@ -1,11 +1,11 @@
package com.xiang.xservice.application.generator.entity.dto; package com.xiang.xservice.application.generator.entity.domain;
import lombok.Data; import lombok.Data;
/** /**
* 字段信息 * 字段信息
* *
* @author zhengkai.blog.csdn.net * @author xiang
*/ */
@Data @Data
public class FieldInfo { public class FieldInfo {

View File

@@ -1,4 +1,4 @@
package com.xiang.xservice.application.generator.entity.dto; package com.xiang.xservice.application.generator.entity.domain;
import lombok.Data; import lombok.Data;
@@ -7,7 +7,7 @@ import java.util.Map;
/** /**
* 请求参数信息 * 请求参数信息
* *
* @author zhengkai.blog.csdn.net * @author xiang
*/ */
@Data @Data
public class ParamInfo { public class ParamInfo {

View File

@@ -1,4 +1,4 @@
package com.xiang.xservice.application.generator.entity.dto; package com.xiang.xservice.application.generator.entity.domain;
import lombok.Data; import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.xiang.xservice.application.generator.entity.dto; package com.xiang.xservice.application.generator.entity.domain;
import lombok.Data; import lombok.Data;

View File

@@ -1,49 +0,0 @@
package com.xiang.xservice.application.generator.entity.vo;
import lombok.Data;
import java.util.HashMap;
/**
* 统一返回结果VO
*
* @author zhengkai.blog.csdn.net
*/
@Data
public class ResultVo extends HashMap<String, Object> {
public ResultVo() {
put("code", 200);
put("msg", "success");
}
public static ResultVo ok() {
return new ResultVo();
}
public static ResultVo ok(Object data) {
ResultVo resultVo = new ResultVo();
resultVo.put("data", data);
return resultVo;
}
public static ResultVo error(String msg) {
ResultVo resultVo = new ResultVo();
resultVo.put("code", 500);
resultVo.put("msg", msg);
return resultVo;
}
public static ResultVo error(int code, String msg) {
ResultVo resultVo = new ResultVo();
resultVo.put("code", code);
resultVo.put("msg", msg);
return resultVo;
}
@Override
public ResultVo put(String key, Object value) {
super.put(key, value);
return this;
}
}

View File

@@ -1,4 +1,4 @@
package com.xiang.xservice.application.generator.entity.enums; package com.xiang.xservice.application.generator.enums;
import lombok.Getter; import lombok.Getter;

View File

@@ -1,7 +1,7 @@
package com.xiang.xservice.application.generator.service; package com.xiang.xservice.application.generator.service;
import com.xiang.xservice.application.generator.entity.dto.ParamInfo; import com.xiang.xservice.application.generator.entity.domain.ParamInfo;
import com.xiang.xservice.basic.common.resp.Result; import com.xiang.xservice.basic.common.resp.Result;
import java.util.Map; import java.util.Map;

View File

@@ -1,6 +1,6 @@
package com.xiang.xservice.application.generator.service; package com.xiang.xservice.application.generator.service;
import com.xiang.xservice.application.generator.entity.dto.TemplateList; import com.xiang.xservice.application.generator.entity.domain.TemplateList;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;

View File

@@ -1,9 +1,9 @@
package com.xiang.xservice.application.generator.service.impl; package com.xiang.xservice.application.generator.service.impl;
import com.xiang.xservice.application.generator.entity.dto.ClassInfo; import com.xiang.xservice.application.generator.entity.domain.ClassInfo;
import com.xiang.xservice.application.generator.entity.dto.ParamInfo; import com.xiang.xservice.application.generator.entity.domain.ParamInfo;
import com.xiang.xservice.application.generator.entity.dto.TemplateList; import com.xiang.xservice.application.generator.entity.domain.TemplateList;
import com.xiang.xservice.application.generator.entity.enums.ParserTypeEnum; import com.xiang.xservice.application.generator.enums.ParserTypeEnum;
import com.xiang.xservice.application.generator.service.CodeGenService; import com.xiang.xservice.application.generator.service.CodeGenService;
import com.xiang.xservice.application.generator.service.TemplateService; import com.xiang.xservice.application.generator.service.TemplateService;
import com.xiang.xservice.application.generator.service.parser.JsonParserService; import com.xiang.xservice.application.generator.service.parser.JsonParserService;
@@ -50,7 +50,6 @@ public class CodeGenServiceImpl implements CodeGenService {
// 3. generate the code by freemarker templates with parameters . // 3. generate the code by freemarker templates with parameters .
// Freemarker根据参数和模板生成代码 // Freemarker根据参数和模板生成代码
Map<String, String> result = getResultByParams(paramInfo.getOptions()); Map<String, String> result = getResultByParams(paramInfo.getOptions());
log.info("table:{} - time:{} ", MapUtil.getString(result, "tableName"), System.currentTimeMillis());
return Result.success(result); return Result.success(result);
} catch (Exception e) { } catch (Exception e) {
log.error("代码生成失败", e); log.error("代码生成失败", e);
@@ -67,10 +66,10 @@ public class CodeGenServiceImpl implements CodeGenService {
// 解析模板配置并生成代码 // 解析模板配置并生成代码
List<TemplateList> parentTemplates = templateService.getAllTemplates(); List<TemplateList> parentTemplates = templateService.getAllTemplates();
for (TemplateList parentTemplateObj : parentTemplates) { for (TemplateList parentTemplateObj : parentTemplates) {
List<com.xiang.xservice.application.generator.entity.dto.Template> childTemplates = parentTemplateObj.getTemplates(); List<com.xiang.xservice.application.generator.entity.domain.Template> childTemplates = parentTemplateObj.getTemplates();
if (childTemplates != null) { if (childTemplates != null) {
for (int x = 0; x < childTemplates.size(); x++) { for (int x = 0; x < childTemplates.size(); x++) {
com.xiang.xservice.application.generator.entity.dto.Template childTemplate = childTemplates.get(x); com.xiang.xservice.application.generator.entity.domain.Template childTemplate = childTemplates.get(x);
String templatePath = parentTemplateObj.getGroup() + "/" + childTemplate.getName() + ".ftl"; String templatePath = parentTemplateObj.getGroup() + "/" + childTemplate.getName() + ".ftl";
String generatedCode = FreemarkerUtil.processString(templatePath, params); String generatedCode = FreemarkerUtil.processString(templatePath, params);
result.put(childTemplate.getName(), generatedCode); result.put(childTemplate.getName(), generatedCode);

View File

@@ -1,7 +1,7 @@
package com.xiang.xservice.application.generator.service.impl; package com.xiang.xservice.application.generator.service.impl;
import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONArray;
import com.xiang.xservice.application.generator.entity.dto.TemplateList; import com.xiang.xservice.application.generator.entity.domain.TemplateList;
import com.xiang.xservice.application.generator.service.TemplateService; import com.xiang.xservice.application.generator.service.TemplateService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.ClassPathResource;

View File

@@ -2,9 +2,9 @@ package com.xiang.xservice.application.generator.service.impl.parser;
import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.xiang.xservice.application.generator.entity.dto.ClassInfo; import com.xiang.xservice.application.generator.entity.domain.ClassInfo;
import com.xiang.xservice.application.generator.entity.dto.FieldInfo; import com.xiang.xservice.application.generator.entity.domain.FieldInfo;
import com.xiang.xservice.application.generator.entity.dto.ParamInfo; import com.xiang.xservice.application.generator.entity.domain.ParamInfo;
import com.xiang.xservice.application.generator.service.parser.JsonParserService; import com.xiang.xservice.application.generator.service.parser.JsonParserService;
import com.xiang.xservice.basic.exception.BusinessException; import com.xiang.xservice.basic.exception.BusinessException;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;

View File

@@ -1,13 +1,13 @@
package com.xiang.xservice.application.generator.service.impl.parser; package com.xiang.xservice.application.generator.service.impl.parser;
import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSON;
import com.xiang.xservice.application.generator.entity.dto.ClassInfo; import com.xiang.xservice.application.generator.entity.domain.ClassInfo;
import com.xiang.xservice.application.generator.entity.dto.FieldInfo; import com.xiang.xservice.application.generator.entity.domain.FieldInfo;
import com.xiang.xservice.application.generator.entity.dto.ParamInfo; import com.xiang.xservice.application.generator.entity.domain.ParamInfo;
import com.xiang.xservice.application.generator.service.parser.SqlParserService; import com.xiang.xservice.application.generator.service.parser.SqlParserService;
import com.xiang.xservice.application.generator.util.MapUtil; import com.xiang.xservice.application.generator.util.MapUtil;
import com.xiang.xservice.application.generator.util.StringUtilsPlus; import com.xiang.xservice.application.generator.util.StringUtilsPlus;
import com.xiang.xservice.application.generator.util.mysqlJavaTypeUtil; import com.xiang.xservice.application.generator.util.Mysql2JavaTypeUtil;
import com.xiang.xservice.basic.exception.BusinessException; import com.xiang.xservice.basic.exception.BusinessException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.parser.CCJSqlParserManager; import net.sf.jsqlparser.parser.CCJSqlParserManager;
@@ -219,7 +219,7 @@ public class SqlParserServiceImpl implements SqlParserService {
} }
String originTableName = tableName; String originTableName = tableName;
//ignore prefix //ignore prefix
if(tableName!=null && StringUtilsPlus.isNotNull(MapUtil.getString(paramInfo.getOptions(),"ignorePrefix"))){ if(tableName!=null && StringUtils.isNotBlank(MapUtil.getString(paramInfo.getOptions(),"ignorePrefix"))){
tableName = tableName.replaceAll(MapUtil.getString(paramInfo.getOptions(),"ignorePrefix"),""); tableName = tableName.replaceAll(MapUtil.getString(paramInfo.getOptions(),"ignorePrefix"),"");
} }
// class Name // class Name
@@ -361,8 +361,8 @@ public class SqlParserServiceImpl implements SqlParserService {
} }
//swagger class //swagger class
String swaggerClass = "string" ; String swaggerClass = "string" ;
if(mysqlJavaTypeUtil.getMysqlSwaggerTypeMap().containsKey(mysqlType)){ if(Mysql2JavaTypeUtil.getMysqlSwaggerTypeMap().containsKey(mysqlType)){
swaggerClass = mysqlJavaTypeUtil.getMysqlSwaggerTypeMap().get(mysqlType); swaggerClass = Mysql2JavaTypeUtil.getMysqlSwaggerTypeMap().get(mysqlType);
} }
// field class // field class
// int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID', // int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
@@ -371,8 +371,8 @@ public class SqlParserServiceImpl implements SqlParserService {
//2018-11-22 lshz0088 处理字段类型的时候不严谨columnLine.contains(" int") 类似这种的,可在前后适当加一些空格之类的加以区分,否则当我的字段包含这些字符的时候,产生类型判断问题。 //2018-11-22 lshz0088 处理字段类型的时候不严谨columnLine.contains(" int") 类似这种的,可在前后适当加一些空格之类的加以区分,否则当我的字段包含这些字符的时候,产生类型判断问题。
//2020-05-03 MOSHOW.K.ZHENG 优化对所有类型的处理 //2020-05-03 MOSHOW.K.ZHENG 优化对所有类型的处理
//2020-10-20 zhengkai 新增包装类型的转换选择 //2020-10-20 zhengkai 新增包装类型的转换选择
if(mysqlJavaTypeUtil.getMysqlJavaTypeMap().containsKey(mysqlType)){ if(Mysql2JavaTypeUtil.getMysqlJavaTypeMap().containsKey(mysqlType)){
fieldClass = mysqlJavaTypeUtil.getMysqlJavaTypeMap().get(mysqlType); fieldClass = Mysql2JavaTypeUtil.getMysqlJavaTypeMap().get(mysqlType);
} }
// field commentMySQL的一般位于field行而pgsql和oralce多位于后面。 // field commentMySQL的一般位于field行而pgsql和oralce多位于后面。
String fieldComment = null; String fieldComment = null;

View File

@@ -1,8 +1,8 @@
package com.xiang.xservice.application.generator.service.parser; package com.xiang.xservice.application.generator.service.parser;
import com.xiang.xservice.application.generator.entity.dto.ClassInfo; import com.xiang.xservice.application.generator.entity.domain.ClassInfo;
import com.xiang.xservice.application.generator.entity.dto.ParamInfo; import com.xiang.xservice.application.generator.entity.domain.ParamInfo;
/** /**
* JSON解析服务接口 * JSON解析服务接口

View File

@@ -1,8 +1,8 @@
package com.xiang.xservice.application.generator.service.parser; package com.xiang.xservice.application.generator.service.parser;
import com.xiang.xservice.application.generator.entity.dto.ClassInfo; import com.xiang.xservice.application.generator.entity.domain.ClassInfo;
import com.xiang.xservice.application.generator.entity.dto.ParamInfo; import com.xiang.xservice.application.generator.entity.domain.ParamInfo;
/** /**
* SQL解析服务接口 * SQL解析服务接口

View File

@@ -1,45 +1,19 @@
package com.xiang.xservice.application.generator.util; package com.xiang.xservice.application.generator.util;
import joptsimple.internal.Strings;
import java.util.Map; import java.util.Map;
public class MapUtil { public class MapUtil {
public static String getString(Map map, String key) { public static String getString(Map<String, Object> map, String key) {
if (map != null && map.containsKey(key)) { if (map != null && map.containsKey(key)) {
try { try {
return map.get(key).toString(); return map.get(key).toString();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); return Strings.EMPTY;
return "";
}
} else {
return "";
} }
} }
return Strings.EMPTY;
public static Integer getInteger(Map map, String key) {
if (map != null && map.containsKey(key)) {
try {
return Integer.valueOf(map.get(key).toString());
} catch (Exception e) {
e.printStackTrace();
return 0;
}
} else {
return 0;
}
}
public static Boolean getBoolean(Map map, String key) {
if (map != null && map.containsKey(key)) {
try {
return Boolean.parseBoolean(map.get(key).toString()) || "true".equals(map.get(key).toString());
} catch (Exception e) {
e.printStackTrace();
return false;
}
} else {
return false;
}
} }
} }

View File

@@ -2,7 +2,7 @@ package com.xiang.xservice.application.generator.util;
import java.util.HashMap; import java.util.HashMap;
public final class mysqlJavaTypeUtil { public final class Mysql2JavaTypeUtil {
public static final HashMap<String, String> mysqlJavaTypeMap = new HashMap<String, String>(); public static final HashMap<String, String> mysqlJavaTypeMap = new HashMap<String, String>();
public static final HashMap<String, String> mysqlSwaggerTypeMap = new HashMap<String, String>(); public static final HashMap<String, String> mysqlSwaggerTypeMap = new HashMap<String, String>();

View File

@@ -1,13 +1,15 @@
package com.xiang.xservice.application.generator.util; package com.xiang.xservice.application.generator.util;
import org.apache.commons.lang3.StringUtils;
public class StringUtilsPlus { public class StringUtilsPlus {
/** /**
* 首字母大写 * 首字母大写
* *
* @param str * @param str 字符串
* *
* @return * @return 首字母大写
*/ */
public static String upperCaseFirst(String str) { public static String upperCaseFirst(String str) {
if (str == null || str.trim().isEmpty()) { if (str == null || str.trim().isEmpty()) {
@@ -19,25 +21,24 @@ public class StringUtilsPlus {
/** /**
* 首字母小写 * 首字母小写
* *
* @param str * @param str 字符串
* *
* @return * @return 首字母小写
*/ */
public static String lowerCaseFirst(String str) { public static String lowerCaseFirst(String str) {
//2019-2-10 解决StringUtils.lowerCaseFirst潜在的NPE异常@liutf
return (str != null && str.length() > 1) ? str.substring(0, 1).toLowerCase() + str.substring(1) : ""; return (str != null && str.length() > 1) ? str.substring(0, 1).toLowerCase() + str.substring(1) : "";
} }
/** /**
* 下划线,转换为驼峰式 * 下划线,转换为驼峰式
* *
* @param underscoreName * @param underscoreName 下划线字符串
* *
* @return * @return 驼峰式
*/ */
public static String underlineToCamelCase(String underscoreName) { public static String underlineToCamelCase(String underscoreName) {
StringBuilder result = new StringBuilder(); StringBuilder result = new StringBuilder();
if (underscoreName != null && underscoreName.trim().length() > 0) { if (StringUtils.isNotBlank(underscoreName)) {
boolean flag = false; boolean flag = false;
for (int i = 0; i < underscoreName.length(); i++) { for (int i = 0; i < underscoreName.length(); i++) {
char ch = underscoreName.charAt(i); char ch = underscoreName.charAt(i);
@@ -58,8 +59,6 @@ public class StringUtilsPlus {
/** /**
* 转 user_name 风格 * 转 user_name 风格
* <p>
* 不管原始是什么风格
*/ */
public static String toUnderline(String str, boolean upperCase) { public static String toUnderline(String str, boolean upperCase) {
if (str == null || str.trim().isEmpty()) { if (str == null || str.trim().isEmpty()) {
@@ -91,7 +90,8 @@ public class StringUtilsPlus {
} }
/** /**
* any str ==> lowerCamel * 任何字符串 转驼峰
* @param str 任何字符串
*/ */
public static String toLowerCamel(String str) { public static String toLowerCamel(String str) {
if (str == null || str.trim().isEmpty()) { if (str == null || str.trim().isEmpty()) {
@@ -122,9 +122,4 @@ public class StringUtilsPlus {
return lowerCaseFirst(result.toString()); return lowerCaseFirst(result.toString());
} }
public static boolean isNotNull(String str) {
return org.apache.commons.lang3.StringUtils.isNotEmpty(str);
}
} }

View File

@@ -0,0 +1,14 @@
package com.xiang.xservice.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/statics/**").addResourceLocations("classpath:/statics/");
}
}

View File

@@ -41,10 +41,10 @@ const vm = new Vue({
options: { options: {
dataType: "sql", dataType: "sql",
authorName: "${(value.author)!!}", authorName: "Xiang",
packageName: "${(value.packageName)!!}", packageName: "com.xiang",
returnUtilSuccess: "${(value.returnUtilSuccess)!!}", returnUtilSuccess: "Result.success",
returnUtilFailure: "${(value.returnUtilFailure)!!}", returnUtilFailure: "Result.error",
isPackageType: true, isPackageType: true,
isSwagger: false, isSwagger: false,
@@ -62,7 +62,7 @@ const vm = new Vue({
templates: [{}], templates: [{}],
historicalData: [], historicalData: [],
currentSelect: 'plusentity', currentSelect: 'plusentity',
outputStr: "${(value.outputStr)!!}", outputStr: "",
outputJson: {} outputJson: {}
}, },
methods: { methods: {