diff --git a/src/main/java/xyz/wbsite/dbtool/javafx/manger/callable/SpringBootCallable.java b/src/main/java/xyz/wbsite/dbtool/javafx/manger/callable/SpringBootCallable.java index 5734452d..1db56371 100644 --- a/src/main/java/xyz/wbsite/dbtool/javafx/manger/callable/SpringBootCallable.java +++ b/src/main/java/xyz/wbsite/dbtool/javafx/manger/callable/SpringBootCallable.java @@ -566,6 +566,8 @@ public class SpringBootCallable implements Callable { excelannotation.mkdirs(); File excelconverter = new File(excel.getAbsolutePath(), "converter"); excelconverter.mkdirs(); + File exception = new File(excel.getAbsolutePath(), "exception"); + exception.mkdirs(); File excelstyle = new File(excel.getAbsolutePath(), "style"); excelstyle.mkdirs(); File utils = new File(root.getAbsolutePath(), "utils"); @@ -619,6 +621,9 @@ public class SpringBootCallable implements Callable { freeMarkerManager.outputTemp(new File(excelconverter.getAbsolutePath(), "ShortConverter.java"), option + "/java/frame/excel/converter/ShortConverter.java", ctx); freeMarkerManager.outputTemp(new File(excelconverter.getAbsolutePath(), "StringConverter.java"), option + "/java/frame/excel/converter/StringConverter.java", ctx); + freeMarkerManager.outputTemp(new File(exception.getAbsolutePath(), "ReadErrorException.java"), option + "/java/frame/excel/exception/ReadErrorException.java", ctx); + freeMarkerManager.outputTemp(new File(exception.getAbsolutePath(), "TemplateNotMatchException.java"), option + "/java/frame/excel/exception/TemplateNotMatchException.java", ctx); + freeMarkerManager.outputTemp(new File(excelstyle.getAbsolutePath(), "BaseCellStyle.java"), option + "/java/frame/excel/style/BaseCellStyle.java", ctx); freeMarkerManager.outputTemp(new File(excelstyle.getAbsolutePath(), "BaseFont.java"), option + "/java/frame/excel/style/BaseFont.java", ctx); freeMarkerManager.outputTemp(new File(excelstyle.getAbsolutePath(), "DataCellStyle.java"), option + "/java/frame/excel/style/DataCellStyle.java", ctx); @@ -762,8 +767,6 @@ public class SpringBootCallable implements Callable { boolean mkdirs = static_.mkdirs(); File css = new File(static_.getAbsolutePath(), "css"); boolean mkdirs1 = css.mkdirs(); - File js = new File(static_.getAbsolutePath(), "js"); - boolean mkdirs2 = js.mkdirs(); File img = new File(static_.getAbsolutePath(), "img"); boolean mkdirs3 = img.mkdirs(); @@ -778,10 +781,6 @@ public class SpringBootCallable implements Callable { freeMarkerManager.outputTemp(new File(css.getAbsolutePath(), "base.css"), option + "/resources/static/css/base.css", ctx); } - {//js文件 - freeMarkerManager.outputTemp(new File(js.getAbsolutePath(), "ajax.js"), option + "/resources/static/js/ajax.js", ctx); - freeMarkerManager.outputTemp(new File(js.getAbsolutePath(), "ajax_es6.js"), option + "/resources/static/js/ajax_es6.js", ctx); - } {//img Tool.outputResource(option + "/resources/static/img/logo.png", new File(img.getAbsolutePath(), "logo.png")); } diff --git a/src/main/resources/modules/SpringBoot/java/action/GlobalController.java b/src/main/resources/modules/SpringBoot/java/action/GlobalController.java index f9644ed0..46dfc51e 100644 --- a/src/main/resources/modules/SpringBoot/java/action/GlobalController.java +++ b/src/main/resources/modules/SpringBoot/java/action/GlobalController.java @@ -5,6 +5,7 @@ import ${basePackage}.frame.auth.LocalData; import ${basePackage}.config.ActionConfig; import ${basePackage}.frame.utils.MapperUtil; import ${basePackage}.frame.utils.FileUtil; +import com.fasterxml.jackson.core.TreeNode; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.web.servlet.error.ErrorController; @@ -32,6 +33,7 @@ import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.lang.reflect.Parameter; import java.util.Locale; import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Matcher; @@ -248,25 +250,58 @@ public class GlobalController implements ErrorController { return fileUploadResponse; } - @RequestMapping("/ajax/{module}/{target}/{method}") @ResponseBody - public Object ajax(@PathVariable String module, @PathVariable String target, @PathVariable String method, @RequestBody String param) { + public Object ajax( + @PathVariable String module, + @PathVariable String target, + @PathVariable String method, + HttpServletRequest request, + HttpServletResponse response, + @RequestBody(required = false) String data, + @RequestParam(name = "file", required = false) MultipartFile file) { try { String beanClassName = (ActionConfig.AJAX_PREFIX + module + "/" + target).toLowerCase(); Object ajax = LocalData.getApplicationContext().getBean(beanClassName); Class ajaxClass = ajax.getClass(); - Method methodC = ajaxClass.getMethod(method, String.class); - return methodC.invoke(ajax, ""); + + Method[] methods = ajaxClass.getDeclaredMethods(); + + Method methodC = null; + for (Method meth : methods) { + if (meth.getName().equals(method)) { + methodC = meth; + } + } + + if (methodC == null) { + BaseResponse baseResponse = new BaseResponse(); + baseResponse.addError(ErrorType.BUSINESS_ERROR, "未找到对应的方法!"); + } + + Parameter[] parameters = methodC.getParameters(); + Object[] arg = new Object[parameters.length]; + + for (int i = 0; i < parameters.length; i++) { + Parameter parameter = parameters[i]; + if (parameter.getType() == HttpServletRequest.class) { + arg[i] = request; + } else if (parameter.getType() == HttpServletResponse.class) { + arg[i] = response; + } else if (parameter.getType() == TreeNode.class) { + arg[i] = MapperUtil.toTree(data); + } else if (parameter.getType() == String.class) { + arg[i] = data; + } else if (parameter.getType() == MultipartFile.class) { + arg[i] = file; + } + } + return methodC.invoke(ajax, arg); } catch (BeansException e) { BaseResponse baseResponse = new BaseResponse(); baseResponse.addError(ErrorType.BUSINESS_ERROR, "未找到对应的目标!"); return baseResponse; - } catch (NoSuchMethodException e) { - BaseResponse baseResponse = new BaseResponse(); - baseResponse.addError(ErrorType.BUSINESS_ERROR, "未找到对应的方法!"); - return baseResponse; } catch (IllegalAccessException e) { BaseResponse baseResponse = new BaseResponse(); baseResponse.addError(ErrorType.BUSINESS_ERROR, "方法执必须公开!"); diff --git a/src/main/resources/modules/SpringBoot/java/action/ajax/system/DictAjax.java b/src/main/resources/modules/SpringBoot/java/action/ajax/system/DictAjax.java index a092fd80..a876374b 100644 --- a/src/main/resources/modules/SpringBoot/java/action/ajax/system/DictAjax.java +++ b/src/main/resources/modules/SpringBoot/java/action/ajax/system/DictAjax.java @@ -8,6 +8,10 @@ import ${basePackage}.module.system.req.*; import ${basePackage}.module.system.rsp.*; import ${basePackage}.frame.base.BaseResponse; import ${basePackage}.frame.base.ErrorType; +import ${basePackage}.frame.excel.exception.ReadErrorException; +import ${basePackage}.frame.excel.exception.TemplateNotMatchException; +import org.springframework.web.multipart.MultipartFile; +import com.fasterxml.jackson.core.TreeNode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -15,49 +19,50 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import java.io.IOException; +import java.net.URLEncoder; public class DictAjax { @Autowired private DictManager dictManager; - public DictCreateResponse create(String jsonParam) { + public DictCreateResponse create(TreeNode jsonParam) { DictCreateRequest request = MapperUtil.toJava(jsonParam, DictCreateRequest.class); return dictManager.create(request, LocalData.getToken()); } - public DictDeleteResponse delete(String jsonParam) { + public DictDeleteResponse delete(TreeNode jsonParam) { DictDeleteRequest request = MapperUtil.toJava(jsonParam, DictDeleteRequest.class); return dictManager.delete(request, LocalData.getToken()); } - public DictUpdateResponse update(String jsonParam) { + public DictUpdateResponse update(TreeNode jsonParam) { DictUpdateRequest request = MapperUtil.toJava(jsonParam, DictUpdateRequest.class); return dictManager.update(request, LocalData.getToken()); } - public DictFindResponse find(String jsonParam) { + public DictFindResponse find(TreeNode jsonParam) { DictFindRequest request = MapperUtil.toJava(jsonParam, DictFindRequest.class); return dictManager.find(request, LocalData.getToken()); } - public DictGetResponse get(String jsonParam) { + public DictGetResponse get(TreeNode jsonParam) { DictGetRequest request = MapperUtil.toJava(jsonParam, DictGetRequest.class); return dictManager.get(request, LocalData.getToken()); } - public DictLoadResponse load(String jsonParam) { + public DictLoadResponse load(TreeNode jsonParam) { DictLoadRequest request = MapperUtil.toJava(jsonParam, DictLoadRequest.class); return dictManager.load(request, LocalData.getToken()); } - public Object template(String jsonParam){ + public Object template(){ try { WSheet sheet = new WSheet<>(DictCreateRequest.class); byte[] bytes = sheet.getBytes(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); - headers.setContentDispositionFormData("attachment", new String((sheet.getName() + ".xlsx").getBytes("UTF-8"), "iso-8859-1")); + headers.setContentDispositionFormData("attachment", URLEncoder.encode(sheet.getName() + ".xlsx","utf-8")); return new ResponseEntity<>(bytes, headers, HttpStatus.OK); } catch (IOException e) { BaseResponse baseResponse = new BaseResponse(); @@ -65,4 +70,29 @@ public class DictAjax { return baseResponse; } } + + public Object imports(MultipartFile file) { + BaseResponse baseResponse = new BaseResponse(); + try { + byte[] bytes = file.getBytes(); + + WSheet sheet = new WSheet<>(bytes, DictCreateRequest.class); + + if (sheet.hasError()) { + byte[] sheetBytes = sheet.getBytes(true); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); + headers.setContentDispositionFormData("attachment", URLEncoder.encode(sheet.getName() + ".xlsx","utf-8")); + return new ResponseEntity<>(sheetBytes, headers, HttpStatus.OK); + } else { + return baseResponse; + } + } catch (IOException e) { + baseResponse.addError(ErrorType.BUSINESS_ERROR, "上传文件出错"); + } catch (TemplateNotMatchException | ReadErrorException e) { + baseResponse.addError(ErrorType.BUSINESS_ERROR, e.getMessage()); + } + + return baseResponse; + } } diff --git a/src/main/resources/modules/SpringBoot/java/action/screen/Index.java b/src/main/resources/modules/SpringBoot/java/action/screen/Index.java index f3f6075e..b5dbc2c3 100644 --- a/src/main/resources/modules/SpringBoot/java/action/screen/Index.java +++ b/src/main/resources/modules/SpringBoot/java/action/screen/Index.java @@ -2,7 +2,7 @@ package ${basePackage}.action.screen; import ${basePackage}.frame.base.Screen; import org.springframework.ui.Model; -import java.util.ArrayList; +import java.util.HashMap; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -11,13 +11,11 @@ public class Index extends Screen { @Override public void exec(Model model, HttpServletRequest request, HttpServletResponse response) { - model.addAttribute("hello", "Hello world!!!"); - model.addAttribute("status", 0); - - ArrayList citys = new ArrayList<>(); - citys.add("北京"); - citys.add("上海"); - citys.add("深圳"); - model.addAttribute("citys", citys); + // 获取配置 + HashMap prop = new HashMap<>(); + prop.put("open", true);//是否保持一个子菜单展开 + prop.put("coll", true);//左侧菜单是否收缩 + prop.put("tran", false);//是否展示动画 + model.addAttribute("prop", prop); } } diff --git a/src/main/resources/modules/SpringBoot/java/frame/excel/WSheet.java b/src/main/resources/modules/SpringBoot/java/frame/excel/WSheet.java index 2b4b45db..9ef34e26 100644 --- a/src/main/resources/modules/SpringBoot/java/frame/excel/WSheet.java +++ b/src/main/resources/modules/SpringBoot/java/frame/excel/WSheet.java @@ -9,6 +9,8 @@ import ${basePackage}.frame.utils.StringUtil; import ${basePackage}.frame.utils.ValidationUtil; import ${basePackage}.frame.excel.annotation.*; import ${basePackage}.frame.excel.converter.*; +import ${basePackage}.frame.excel.exception.ReadErrorException; +import ${basePackage}.frame.excel.exception.TemplateNotMatchException; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; @@ -207,7 +209,7 @@ public class WSheet implements Serializable, Cloneable { * @throws IOException
1:输入流无法转为Excel文件 - 请检查输入的 bytes 是否正确;
* 2:输入流关闭出错;
*/ - public WSheet(byte[] bytes, Class clazz) throws IOException { + public WSheet(byte[] bytes, Class clazz) throws TemplateNotMatchException, ReadErrorException { Workbook workbook = null; InputStream is = null; boolean flag; @@ -228,10 +230,14 @@ public class WSheet implements Serializable, Cloneable { } } if (is != null) { - is.close(); + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } } if (!flag) { - throw new RuntimeException("不支持的文件类型"); + throw new ReadErrorException("读取Excel文件错误"); } //第一张Sheet表 Sheet sheet = workbook.getSheetAt(0); @@ -251,7 +257,7 @@ public class WSheet implements Serializable, Cloneable { //检查列数量 List list = initColumns(clazz); if (list.size() != columnSum) { - throw new RuntimeException("与模板列数量不同。"); + throw new TemplateNotMatchException("与模板列数量不同。"); } else { for (int i = 0; i < list.size(); i++) { WColumn wColumn = list.get(i); @@ -261,7 +267,7 @@ public class WSheet implements Serializable, Cloneable { headValue = headValue.replace(" ", ""); if (!wColumn.getName().equals(headValue)) { - throw new RuntimeException("第" + (i + 1) + "项,不匹配的列名," + wColumn.getName() + "和" + headValue); + throw new TemplateNotMatchException("第" + (i + 1) + "项,不匹配的列名," + wColumn.getName() + "和" + headValue); } } } diff --git a/src/main/resources/modules/SpringBoot/java/frame/excel/exception/ReadErrorException.java b/src/main/resources/modules/SpringBoot/java/frame/excel/exception/ReadErrorException.java new file mode 100644 index 00000000..f9ad2807 --- /dev/null +++ b/src/main/resources/modules/SpringBoot/java/frame/excel/exception/ReadErrorException.java @@ -0,0 +1,10 @@ +package ${basePackage}.frame.excel.exception; + +public class ReadErrorException extends Exception { + public ReadErrorException() { + } + + public ReadErrorException(String s) { + super(s); + } +} diff --git a/src/main/resources/modules/SpringBoot/java/frame/excel/exception/TemplateNotMatchException.java b/src/main/resources/modules/SpringBoot/java/frame/excel/exception/TemplateNotMatchException.java new file mode 100644 index 00000000..14691f7e --- /dev/null +++ b/src/main/resources/modules/SpringBoot/java/frame/excel/exception/TemplateNotMatchException.java @@ -0,0 +1,10 @@ +package ${basePackage}.frame.excel.exception; + +public class TemplateNotMatchException extends Exception { + public TemplateNotMatchException() { + } + + public TemplateNotMatchException(String s) { + super(s); + } +} diff --git a/src/main/resources/modules/SpringBoot/java/module/system/req/DictCreateRequest.java b/src/main/resources/modules/SpringBoot/java/module/system/req/DictCreateRequest.java index 1c9f7cb6..9eb76a35 100644 --- a/src/main/resources/modules/SpringBoot/java/module/system/req/DictCreateRequest.java +++ b/src/main/resources/modules/SpringBoot/java/module/system/req/DictCreateRequest.java @@ -2,7 +2,9 @@ package ${basePackage}.module.system.req; import org.hibernate.validator.constraints.Length; import ${basePackage}.frame.base.BaseRequest; - +import ${basePackage}.frame.excel.annotation.ColumnDescription; +import ${basePackage}.frame.excel.annotation.ColumnName; +import xyz.wbsite.frame.excel.annotation.SheetName; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @@ -13,11 +15,14 @@ import javax.validation.constraints.NotNull; * @version 0.0.1 * @since 2019-07-20 */ +@SheetName("字典") public class DictCreateRequest extends BaseRequest { /** * 字典名称 */ + @ColumnName("字典名称") + @ColumnDescription("1-50长度的字典名称") @NotEmpty(message = "字典名称不能为空") @Length(min = 1, max = 50, message = "字典名称长度不合法(1-50)") private String dictName; @@ -25,6 +30,8 @@ public class DictCreateRequest extends BaseRequest { /** * 字典代码 */ + @ColumnName("字典代码") + @ColumnDescription("1-50长度的字典代码") @NotEmpty(message = "字典代码不能为空") @Length(min = 1, max = 50, message = "字典代码长度不合法(1-50)") private String dictCode; @@ -32,6 +39,8 @@ public class DictCreateRequest extends BaseRequest { /** * 字典版本号 */ + @ColumnName("字典版本号") + @ColumnDescription("字典版本号.例如:(yyyy-MM-dd HH:mm:ss)") @NotEmpty(message = "字典版本号不能为空") @Length(min = 1, max = 50, message = "字典版本号长度不合法(1-50)") private String version; @@ -39,6 +48,8 @@ public class DictCreateRequest extends BaseRequest { /** * 是否有效 */ + @ColumnName("是否有效") + @ColumnDescription("true/false") @NotNull(message = "是否有效不能为NULL") private Boolean valid; diff --git a/src/main/resources/modules/SpringBoot/resources/static/js/ajax.js b/src/main/resources/modules/SpringBoot/resources/static/js/ajax.js deleted file mode 100644 index 02ab8ddf..00000000 --- a/src/main/resources/modules/SpringBoot/resources/static/js/ajax.js +++ /dev/null @@ -1,302 +0,0 @@ -jsonService = axios.create({ - method: 'post', - timeout: 30000, - baseURL: '/ajax', - headers: {'Content-Type': 'application/json;charset=UTF-8'}, -}); -downloadService = axios.create({ - method: 'post', - timeout: 30000, - baseURL: '/ajax', - responseType: 'blob', - headers: {'Content-Type': 'application/json;charset=UTF-8'}, -}); -uploadService = axios.create({ - method: 'post', - timeout: 30000, - baseURL: '/ajax', - headers: {'Content-Type': 'multipart/form-data'}, - onUploadProgress: function (progressEvent) { - var complete = (progressEvent.loaded / progressEvent.total * 100 | 0) + '%' - nav.tip.show("上传中(" + complete + ")") - }, -}); - -// 添加JSON请求拦截器 -jsonService.interceptors.request.use(function (config) { - // 在发送请求之前做些什么 - nav.bar.show(); - nav.tip.show(); - return config; -}, function (error) { - return Promise.reject(error); -}); -uploadService.interceptors.request.use(function (config) { - // 在发送请求之前做些什么 - nav.bar.show(); - nav.tip.show("上传中 ..."); - return config; -}, function (error) { - return Promise.reject(error); -}); - -// 添加JSON响应拦截器 -jsonService.interceptors.response.use(function (response) { - // 对响应数据做点什么 - nav.tip.close(); - try {//确保服务器正确返回Json - if(response.data.errors.length > 0){ - console.error(response.data.errors) - } - nav.bar.finish(); - }catch (e){ - nav.bar.error(); - response.data = {errors: [{message: '服务器响应错误'}]}; - } - return response; -}, function (error) { - // 对响应错误做点什么,并返回错误结果 - nav.tip.close(); - nav.bar.error(); - const rsp = {errors: []}; - if (!error.response) { - rsp.errors.push({message: error.message}); - } else { - rsp.errors.push(handleError(error.response.status)); - } - return Promise.reject(rsp); -}); -// 添加Upload响应拦截器 -uploadService.interceptors.response.use(function (response) { - // 对响应数据做点什么 - nav.tip.close(); - try {//确保服务器正确返回Json - if(response.data.errors.length > 0){ - console.error(response.data.errors) - } - nav.bar.finish(); - }catch (e){ - nav.bar.error(); - response.data = {errors: [{message: '服务器响应错误'}]}; - } - return response; -}, function (error) { - // 对响应错误做点什么,并返回错误结果 - nav.tip.close(); - nav.bar.error(); - const rsp = {errors: []}; - if (!error.response) { - rsp.errors.push({message: error.message}); - } else { - rsp.errors.push(handleError(error.response.status)); - } - return Promise.reject(rsp); -}); -function handerResponse(){ - -} -function handleError(status){ - switch (status) { - case 401: - return {message: "未授权,请登录(401)"}; - case 403: - return {message: "拒绝访问(403)"}; - case 404: - return {message: "请求地址错误(404)"}; - case 408: - return {message: "请求超时(408)"}; - case 500: - return {message: "服务器内部错误(500)"}; - case 501: - return {message: "服务未实现(501)"}; - default: - return {message: "请求错误(" + error.response.status + ")"}; - } -} -jsonRequest = function (data) { - return jsonService.request(data) - .then(function (response) { - return Promise.resolve(response.data); - }, function (response) { - return Promise.resolve(response); - }) -}; -upRequest = function (data) { - data.url='/upload'; - return uploadService.request(data) - .then(function (response) { - return Promise.resolve(response.data); - }, function (response) { - return Promise.resolve(response); - }) -}; -downRequest = function (data) { - return downloadService.request(data) - .then(function (response) { - if (!response.data) { - return Promise.resolve({errors: [{message: '下载错误'}]}); - } - // 获取响应header中文件信息 - var dis = response.headers['content-disposition']; - // 正则匹配文件名 - var fileName = dis.match(/filename="(.*\..*)"/)[1]; - // 模拟下载 - var url = window.URL.createObjectURL(new Blob([response.data])); - var link = document.createElement('a') - link.style.display = 'none'; - link.href = url; - link.setAttribute('download', fileName) - document.body.appendChild(link) - link.click(); - return Promise.resolve({errors: []}); - }, function (response) { - return Promise.resolve(response); - }) -}; -window.ajax = { - authLogin: function (data) { - return jsonRequest({ - url: "/system/Auth/login", - data: JSON.stringify(data), - }) - }, - fileUpload: function (file) { - var fd = new FormData(); - fd.append("file", file); - return upRequest({ - data: fd - }) - }, - dictCreate: function (data) { - return jsonRequest({ - url: "/system/Dict/create", - data: JSON.stringify(data), - }) - }, - dictUpdate: function (data) { - return jsonRequest({ - url: "/system/Dict/update", - data: JSON.stringify(data), - }) - }, - dictDelete: function (data) { - return jsonRequest({ - url: "/system/Dict/delete", - data: JSON.stringify(data), - }) - }, - dictFind: function (data) { - return jsonRequest({ - url: "/system/Dict/find", - data: JSON.stringify(data), - }) - }, - dictGet: function (data) { - return jsonRequest({ - url: "/system/Dict/get", - data: JSON.stringify(data), - }) - }, - dictLoad: function (data) { - return jsonRequest({ - url: "/system/Dict/load", - data: JSON.stringify(data), - }) - }, - dictTemplate: function (data) { - return downRequest({ - url: "/system/Dict/template", - data: JSON.stringify(data), - }) - }, - dictItemCreate: function (data) { - return jsonRequest({ - url: "/system/DictItem/create", - data: JSON.stringify(data), - }) - }, - dictItemUpdate: function (data) { - return jsonRequest({ - url: "/system/DictItem/update", - data: JSON.stringify(data), - }) - }, - dictItemDelete: function (data) { - return jsonRequest({ - url: "/system/DictItem/delete", - data: JSON.stringify(data), - }) - }, - dictItemFind: function (data) { - return jsonRequest({ - url: "/system/DictItem/find", - data: JSON.stringify(data), - }) - }, - dictItemGet: function (data) { - return jsonRequest({ - url: "/system/DictItem/get", - data: JSON.stringify(data), - }) - }, -<#list modules as db> -<#list db.tables as table> -<#if table.getCreate()> - ${table.getFName()}Create: function (data) { - return jsonRequest({ - url: "/${db.moduleName}/${table.getCName()}/create", - data: JSON.stringify(data), - }) - }, - -<#if table.getDelete()> - ${table.getFName()}Delete: function (data) { - return jsonRequest({ - url: "/${db.moduleName}/${table.getCName()}/delete", - data: JSON.stringify(data), - }) - }, - -<#if table.getUpdate()> - ${table.getFName()}Update: function (data) { - return jsonRequest({ - url: "/${db.moduleName}/${table.getCName()}/update", - data: JSON.stringify(data), - }) - }, - -<#if table.getFind()> - ${table.getFName()}Find: function (data) { - return jsonRequest({ - url: "/${db.moduleName}/${table.getCName()}/find", - data: JSON.stringify(data), - }) - }, - -<#if table.getGet()> - ${table.getFName()}Get: function(data) { - return jsonRequest({ - url: "/${db.moduleName}/${table.getCName()}/get", - data: JSON.stringify(data), - }) - }, - -<#if table.getSearch()> - ${table.getFName()}Search: function (data) { - return jsonRequest({ - url: "/${db.moduleName}/${table.getCName()}/search", - data: JSON.stringify(data), - }) - }, - -<#if table.getGetAll()> - ${table.getFName()}GetAll: function (data) { - return jsonRequest({ - url: "/${db.moduleName}/${table.getCName()}/getAll", - data: JSON.stringify(data), - }) - }, - - - -} \ No newline at end of file diff --git a/src/main/resources/modules/SpringBoot/resources/static/js/ajax_es6.js b/src/main/resources/modules/SpringBoot/resources/static/js/ajax_es6.js deleted file mode 100644 index bc43b6c3..00000000 --- a/src/main/resources/modules/SpringBoot/resources/static/js/ajax_es6.js +++ /dev/null @@ -1,165 +0,0 @@ -import axios from 'axios' -// 创建axios实例 -const service = axios.create({ - baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url - withCredentials: true, // send cookies when cross-domain requests - method: 'post', // request method - timeout: 5000 // request timeout -}) - -// 添加请求拦截器 -service.interceptors.request.use(config => { - // 在发送请求之前做些什么 - if (config.url === '/upload') { - console.log() - } else { - console.log() - } - return config -}, error => { - // 对请求错误做些什么 - return Promise.reject(error) -}) - -// 添加响应拦截器 -service.interceptors.response.use(response => { - // 对响应数据做点什么 - return response -}, error => { - // 对响应错误做点什么 - const rsp = { errors: [] } - if (!error.response) { - rsp.errors.push({ message: error.message }) - } else { - switch (error.response.status) { - case 401: - rsp.errors.push({ message: '未授权,请登录(401)' }) - break - case 403: - rsp.errors.push({ message: '拒绝访问(403)' }) - break - case 404: - rsp.errors.push({ message: '请求地址错误(404)' }) - break - case 408: - rsp.errors.push({ message: '请求超时(408)' }) - break - case 500: - rsp.errors.push({ message: '服务器内部错误(500)' }) - break - case 501: - rsp.errors.push({ message: '服务未实现(501)' }) - break - default: - rsp.errors.push({ message: '请求错误(' + error.response.status + ')' }) - break - } - } - return Promise.reject(rsp) -}) -export function jsonRequest(config) { - return service.request({ - params: { - method: config.method - }, - url: '/ajax', - headers: { 'Content-Type': 'text/plain' }, - data: config.data - }).then(response => { - return Promise.resolve(response.data) - }, response => { - return Promise.resolve(response) - }) -} -export function fileRequest(config) { - return service.request({ - url: '/upload', - data: config.data, - headers: { 'Content-Type': 'multipart/form-data' }, - onUploadProgress: progressEvent => { - console.log((progressEvent.loaded / progressEvent.total * 100 | 0) + '%') - } - }).then(response => { - return Promise.resolve(response.data) - }, response => { - return Promise.resolve(response) - }) -} - -const ajax = { - example: data => { - return jsonRequest({ - method: 'ajax.example.example', - data: data - }) - }, - fileUpload: file => { - const fd = new FormData() - fd.append('file', file) - return fileRequest({ - data: fd - }) - }, -<#list modules as db> -<#list db.tables as table> -<#if table.getCreate()> - ${table.getFName()}Create: data => { - return jsonRequest({ - method:'ajax.${db.moduleName}.${table.getLName()}.create', - data: JSON.stringify(data), - }) - }, - -<#if table.getDelete()> - ${table.getFName()}Delete: data => { - return jsonRequest({ - method:'ajax.${db.moduleName}.${table.getLName()}.delete', - data: JSON.stringify(data), - }) - }, - -<#if table.getUpdate()> - ${table.getFName()}Update: data => { - return jsonRequest({ - method:'ajax.${db.moduleName}.${table.getLName()}.update', - data: JSON.stringify(data), - }) - }, - -<#if table.getFind()> - ${table.getFName()}Find: data => { - return jsonRequest({ - method:'ajax.${db.moduleName}.${table.getLName()}.find', - data: JSON.stringify(data), - }) - }, - -<#if table.getGet()> - ${table.getFName()}Get: data => { - return jsonRequest({ - method:'ajax.${db.moduleName}.${table.getLName()}.get', - data: JSON.stringify(data), - }) - }, - -<#if table.getSearch()> - ${table.getFName()}Search: data => { - return jsonRequest({ - method:'ajax.${db.moduleName}.${table.getLName()}.search', - data: JSON.stringify(data), - }) - }, - -<#if table.getGetAll()> - ${table.getFName()}GetAll: data => { - return jsonRequest({ - method:'ajax.${db.moduleName}.${table.getLName()}.get.all', - data: JSON.stringify(data), - }) - }, - - - -} - -export default ajax \ No newline at end of file diff --git a/src/main/resources/modules/SpringBoot/resources/templates/control/nav.ftl b/src/main/resources/modules/SpringBoot/resources/templates/control/nav.ftl index d1576067..abed9760 100644 --- a/src/main/resources/modules/SpringBoot/resources/templates/control/nav.ftl +++ b/src/main/resources/modules/SpringBoot/resources/templates/control/nav.ftl @@ -1,74 +1,287 @@ \ No newline at end of file diff --git a/src/main/resources/modules/SpringBoot/resources/templates/layout/default.ftl b/src/main/resources/modules/SpringBoot/resources/templates/layout/default.ftl index 9ee558d7..fa93dd22 100644 --- a/src/main/resources/modules/SpringBoot/resources/templates/layout/default.ftl +++ b/src/main/resources/modules/SpringBoot/resources/templates/layout/default.ftl @@ -6,7 +6,6 @@ - diff --git a/src/main/resources/modules/SpringBoot/resources/templates/screen/home.ftl b/src/main/resources/modules/SpringBoot/resources/templates/screen/home.ftl index 60dd3df8..6250d9f5 100644 --- a/src/main/resources/modules/SpringBoot/resources/templates/screen/home.ftl +++ b/src/main/resources/modules/SpringBoot/resources/templates/screen/home.ftl @@ -254,6 +254,18 @@ ${r"${r'${hello}'}"}

+

布尔值输出 + ${r"${true?c}"} +

+ +

三元表达式 + ${r"${true?string('yes','no')}"} +

+ +

输出当前日期 + ${r'${.now?string["yyyy-MM-dd HH:mm:ss"]}'} +

+ diff --git a/src/main/resources/modules/SpringBoot/resources/templates/screen/index.ftl b/src/main/resources/modules/SpringBoot/resources/templates/screen/index.ftl index 107e3a50..89493e1e 100644 --- a/src/main/resources/modules/SpringBoot/resources/templates/screen/index.ftl +++ b/src/main/resources/modules/SpringBoot/resources/templates/screen/index.ftl @@ -35,7 +35,7 @@