master
wangbing 5 years ago
parent 5a11f27a45
commit d5c0d98dab

@ -566,6 +566,8 @@ public class SpringBootCallable implements Callable {
excelannotation.mkdirs(); excelannotation.mkdirs();
File excelconverter = new File(excel.getAbsolutePath(), "converter"); File excelconverter = new File(excel.getAbsolutePath(), "converter");
excelconverter.mkdirs(); excelconverter.mkdirs();
File exception = new File(excel.getAbsolutePath(), "exception");
exception.mkdirs();
File excelstyle = new File(excel.getAbsolutePath(), "style"); File excelstyle = new File(excel.getAbsolutePath(), "style");
excelstyle.mkdirs(); excelstyle.mkdirs();
File utils = new File(root.getAbsolutePath(), "utils"); 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(), "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(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(), "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(), "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); 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(); boolean mkdirs = static_.mkdirs();
File css = new File(static_.getAbsolutePath(), "css"); File css = new File(static_.getAbsolutePath(), "css");
boolean mkdirs1 = css.mkdirs(); boolean mkdirs1 = css.mkdirs();
File js = new File(static_.getAbsolutePath(), "js");
boolean mkdirs2 = js.mkdirs();
File img = new File(static_.getAbsolutePath(), "img"); File img = new File(static_.getAbsolutePath(), "img");
boolean mkdirs3 = img.mkdirs(); 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); 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 {//img
Tool.outputResource(option + "/resources/static/img/logo.png", new File(img.getAbsolutePath(), "logo.png")); Tool.outputResource(option + "/resources/static/img/logo.png", new File(img.getAbsolutePath(), "logo.png"));
} }

@ -5,6 +5,7 @@ import ${basePackage}.frame.auth.LocalData;
import ${basePackage}.config.ActionConfig; import ${basePackage}.config.ActionConfig;
import ${basePackage}.frame.utils.MapperUtil; import ${basePackage}.frame.utils.MapperUtil;
import ${basePackage}.frame.utils.FileUtil; import ${basePackage}.frame.utils.FileUtil;
import com.fasterxml.jackson.core.TreeNode;
import org.springframework.beans.BeansException; import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.error.ErrorController; 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.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.Locale; import java.util.Locale;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Matcher; import java.util.regex.Matcher;
@ -248,25 +250,58 @@ public class GlobalController implements ErrorController {
return fileUploadResponse; return fileUploadResponse;
} }
@RequestMapping("/ajax/{module}/{target}/{method}") @RequestMapping("/ajax/{module}/{target}/{method}")
@ResponseBody @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 { try {
String beanClassName = (ActionConfig.AJAX_PREFIX + module + "/" + target).toLowerCase(); String beanClassName = (ActionConfig.AJAX_PREFIX + module + "/" + target).toLowerCase();
Object ajax = LocalData.getApplicationContext().getBean(beanClassName); Object ajax = LocalData.getApplicationContext().getBean(beanClassName);
Class ajaxClass = ajax.getClass(); 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) { } catch (BeansException e) {
BaseResponse baseResponse = new BaseResponse(); BaseResponse baseResponse = new BaseResponse();
baseResponse.addError(ErrorType.BUSINESS_ERROR, "未找到对应的目标!"); baseResponse.addError(ErrorType.BUSINESS_ERROR, "未找到对应的目标!");
return baseResponse; return baseResponse;
} catch (NoSuchMethodException e) {
BaseResponse baseResponse = new BaseResponse();
baseResponse.addError(ErrorType.BUSINESS_ERROR, "未找到对应的方法!");
return baseResponse;
} catch (IllegalAccessException e) { } catch (IllegalAccessException e) {
BaseResponse baseResponse = new BaseResponse(); BaseResponse baseResponse = new BaseResponse();
baseResponse.addError(ErrorType.BUSINESS_ERROR, "方法执必须公开!"); baseResponse.addError(ErrorType.BUSINESS_ERROR, "方法执必须公开!");

@ -8,6 +8,10 @@ import ${basePackage}.module.system.req.*;
import ${basePackage}.module.system.rsp.*; import ${basePackage}.module.system.rsp.*;
import ${basePackage}.frame.base.BaseResponse; import ${basePackage}.frame.base.BaseResponse;
import ${basePackage}.frame.base.ErrorType; 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.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
@ -15,49 +19,50 @@ import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import java.io.IOException; import java.io.IOException;
import java.net.URLEncoder;
public class DictAjax { public class DictAjax {
@Autowired @Autowired
private DictManager dictManager; private DictManager dictManager;
public DictCreateResponse create(String jsonParam) { public DictCreateResponse create(TreeNode jsonParam) {
DictCreateRequest request = MapperUtil.toJava(jsonParam, DictCreateRequest.class); DictCreateRequest request = MapperUtil.toJava(jsonParam, DictCreateRequest.class);
return dictManager.create(request, LocalData.getToken()); return dictManager.create(request, LocalData.getToken());
} }
public DictDeleteResponse delete(String jsonParam) { public DictDeleteResponse delete(TreeNode jsonParam) {
DictDeleteRequest request = MapperUtil.toJava(jsonParam, DictDeleteRequest.class); DictDeleteRequest request = MapperUtil.toJava(jsonParam, DictDeleteRequest.class);
return dictManager.delete(request, LocalData.getToken()); return dictManager.delete(request, LocalData.getToken());
} }
public DictUpdateResponse update(String jsonParam) { public DictUpdateResponse update(TreeNode jsonParam) {
DictUpdateRequest request = MapperUtil.toJava(jsonParam, DictUpdateRequest.class); DictUpdateRequest request = MapperUtil.toJava(jsonParam, DictUpdateRequest.class);
return dictManager.update(request, LocalData.getToken()); return dictManager.update(request, LocalData.getToken());
} }
public DictFindResponse find(String jsonParam) { public DictFindResponse find(TreeNode jsonParam) {
DictFindRequest request = MapperUtil.toJava(jsonParam, DictFindRequest.class); DictFindRequest request = MapperUtil.toJava(jsonParam, DictFindRequest.class);
return dictManager.find(request, LocalData.getToken()); return dictManager.find(request, LocalData.getToken());
} }
public DictGetResponse get(String jsonParam) { public DictGetResponse get(TreeNode jsonParam) {
DictGetRequest request = MapperUtil.toJava(jsonParam, DictGetRequest.class); DictGetRequest request = MapperUtil.toJava(jsonParam, DictGetRequest.class);
return dictManager.get(request, LocalData.getToken()); return dictManager.get(request, LocalData.getToken());
} }
public DictLoadResponse load(String jsonParam) { public DictLoadResponse load(TreeNode jsonParam) {
DictLoadRequest request = MapperUtil.toJava(jsonParam, DictLoadRequest.class); DictLoadRequest request = MapperUtil.toJava(jsonParam, DictLoadRequest.class);
return dictManager.load(request, LocalData.getToken()); return dictManager.load(request, LocalData.getToken());
} }
public Object template(String jsonParam){ public Object template(){
try { try {
WSheet<DictCreateRequest> sheet = new WSheet<>(DictCreateRequest.class); WSheet<DictCreateRequest> sheet = new WSheet<>(DictCreateRequest.class);
byte[] bytes = sheet.getBytes(); byte[] bytes = sheet.getBytes();
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); 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); return new ResponseEntity<>(bytes, headers, HttpStatus.OK);
} catch (IOException e) { } catch (IOException e) {
BaseResponse baseResponse = new BaseResponse(); BaseResponse baseResponse = new BaseResponse();
@ -65,4 +70,29 @@ public class DictAjax {
return baseResponse; return baseResponse;
} }
} }
public Object imports(MultipartFile file) {
BaseResponse baseResponse = new BaseResponse();
try {
byte[] bytes = file.getBytes();
WSheet<DictCreateRequest> 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;
}
} }

@ -2,7 +2,7 @@ package ${basePackage}.action.screen;
import ${basePackage}.frame.base.Screen; import ${basePackage}.frame.base.Screen;
import org.springframework.ui.Model; import org.springframework.ui.Model;
import java.util.ArrayList; import java.util.HashMap;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@ -11,13 +11,11 @@ public class Index extends Screen {
@Override @Override
public void exec(Model model, HttpServletRequest request, HttpServletResponse response) { public void exec(Model model, HttpServletRequest request, HttpServletResponse response) {
model.addAttribute("hello", "Hello world!!!"); // 获取配置
model.addAttribute("status", 0); HashMap<String, Object> prop = new HashMap<>();
prop.put("open", true);//是否保持一个子菜单展开
ArrayList<String> citys = new ArrayList<>(); prop.put("coll", true);//左侧菜单是否收缩
citys.add("北京"); prop.put("tran", false);//是否展示动画
citys.add("上海"); model.addAttribute("prop", prop);
citys.add("深圳");
model.addAttribute("citys", citys);
} }
} }

@ -9,6 +9,8 @@ import ${basePackage}.frame.utils.StringUtil;
import ${basePackage}.frame.utils.ValidationUtil; import ${basePackage}.frame.utils.ValidationUtil;
import ${basePackage}.frame.excel.annotation.*; import ${basePackage}.frame.excel.annotation.*;
import ${basePackage}.frame.excel.converter.*; 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.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.usermodel.*;
@ -207,7 +209,7 @@ public class WSheet<T> implements Serializable, Cloneable {
* @throws IOException <br/>1:Excel - bytes <br/> * @throws IOException <br/>1:Excel - bytes <br/>
* 2:<br/> * 2:<br/>
*/ */
public WSheet(byte[] bytes, Class<T> clazz) throws IOException { public WSheet(byte[] bytes, Class<T> clazz) throws TemplateNotMatchException, ReadErrorException {
Workbook workbook = null; Workbook workbook = null;
InputStream is = null; InputStream is = null;
boolean flag; boolean flag;
@ -228,10 +230,14 @@ public class WSheet<T> implements Serializable, Cloneable {
} }
} }
if (is != null) { if (is != null) {
try {
is.close(); is.close();
} catch (IOException e) {
e.printStackTrace();
}
} }
if (!flag) { if (!flag) {
throw new RuntimeException("不支持的文件类型"); throw new ReadErrorException("读取Excel文件错误");
} }
//第一张Sheet表 //第一张Sheet表
Sheet sheet = workbook.getSheetAt(0); Sheet sheet = workbook.getSheetAt(0);
@ -251,7 +257,7 @@ public class WSheet<T> implements Serializable, Cloneable {
//检查列数量 //检查列数量
List<WColumn> list = initColumns(clazz); List<WColumn> list = initColumns(clazz);
if (list.size() != columnSum) { if (list.size() != columnSum) {
throw new RuntimeException("与模板列数量不同。"); throw new TemplateNotMatchException("与模板列数量不同。");
} else { } else {
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
WColumn wColumn = list.get(i); WColumn wColumn = list.get(i);
@ -261,7 +267,7 @@ public class WSheet<T> implements Serializable, Cloneable {
headValue = headValue.replace(" ", ""); headValue = headValue.replace(" ", "");
if (!wColumn.getName().equals(headValue)) { if (!wColumn.getName().equals(headValue)) {
throw new RuntimeException("第" + (i + 1) + "项,不匹配的列名," + wColumn.getName() + "和" + headValue); throw new TemplateNotMatchException("第" + (i + 1) + "项,不匹配的列名," + wColumn.getName() + "和" + headValue);
} }
} }
} }

@ -0,0 +1,10 @@
package ${basePackage}.frame.excel.exception;
public class ReadErrorException extends Exception {
public ReadErrorException() {
}
public ReadErrorException(String s) {
super(s);
}
}

@ -0,0 +1,10 @@
package ${basePackage}.frame.excel.exception;
public class TemplateNotMatchException extends Exception {
public TemplateNotMatchException() {
}
public TemplateNotMatchException(String s) {
super(s);
}
}

@ -2,7 +2,9 @@ package ${basePackage}.module.system.req;
import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.Length;
import ${basePackage}.frame.base.BaseRequest; 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.NotEmpty;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
@ -13,11 +15,14 @@ import javax.validation.constraints.NotNull;
* @version 0.0.1 * @version 0.0.1
* @since 2019-07-20 * @since 2019-07-20
*/ */
@SheetName("字典")
public class DictCreateRequest extends BaseRequest { public class DictCreateRequest extends BaseRequest {
/** /**
* *
*/ */
@ColumnName("字典名称")
@ColumnDescription("1-50长度的字典名称")
@NotEmpty(message = "字典名称不能为空") @NotEmpty(message = "字典名称不能为空")
@Length(min = 1, max = 50, message = "字典名称长度不合法(1-50)") @Length(min = 1, max = 50, message = "字典名称长度不合法(1-50)")
private String dictName; private String dictName;
@ -25,6 +30,8 @@ public class DictCreateRequest extends BaseRequest {
/** /**
* *
*/ */
@ColumnName("字典代码")
@ColumnDescription("1-50长度的字典代码")
@NotEmpty(message = "字典代码不能为空") @NotEmpty(message = "字典代码不能为空")
@Length(min = 1, max = 50, message = "字典代码长度不合法(1-50)") @Length(min = 1, max = 50, message = "字典代码长度不合法(1-50)")
private String dictCode; private String dictCode;
@ -32,6 +39,8 @@ public class DictCreateRequest extends BaseRequest {
/** /**
* *
*/ */
@ColumnName("字典版本号")
@ColumnDescription("字典版本号.例如:yyyy-MM-dd HH:mm:ss")
@NotEmpty(message = "字典版本号不能为空") @NotEmpty(message = "字典版本号不能为空")
@Length(min = 1, max = 50, message = "字典版本号长度不合法(1-50)") @Length(min = 1, max = 50, message = "字典版本号长度不合法(1-50)")
private String version; private String version;
@ -39,6 +48,8 @@ public class DictCreateRequest extends BaseRequest {
/** /**
* *
*/ */
@ColumnName("是否有效")
@ColumnDescription("true/false")
@NotNull(message = "是否有效不能为NULL") @NotNull(message = "是否有效不能为NULL")
private Boolean valid; private Boolean valid;

@ -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>
<#if table.getDelete()>
${table.getFName()}Delete: function (data) {
return jsonRequest({
url: "/${db.moduleName}/${table.getCName()}/delete",
data: JSON.stringify(data),
})
},
</#if>
<#if table.getUpdate()>
${table.getFName()}Update: function (data) {
return jsonRequest({
url: "/${db.moduleName}/${table.getCName()}/update",
data: JSON.stringify(data),
})
},
</#if>
<#if table.getFind()>
${table.getFName()}Find: function (data) {
return jsonRequest({
url: "/${db.moduleName}/${table.getCName()}/find",
data: JSON.stringify(data),
})
},
</#if>
<#if table.getGet()>
${table.getFName()}Get: function(data) {
return jsonRequest({
url: "/${db.moduleName}/${table.getCName()}/get",
data: JSON.stringify(data),
})
},
</#if>
<#if table.getSearch()>
${table.getFName()}Search: function (data) {
return jsonRequest({
url: "/${db.moduleName}/${table.getCName()}/search",
data: JSON.stringify(data),
})
},
</#if>
<#if table.getGetAll()>
${table.getFName()}GetAll: function (data) {
return jsonRequest({
url: "/${db.moduleName}/${table.getCName()}/getAll",
data: JSON.stringify(data),
})
},
</#if>
</#list>
</#list>
}

@ -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>
<#if table.getDelete()>
${table.getFName()}Delete: data => {
return jsonRequest({
method:'ajax.${db.moduleName}.${table.getLName()}.delete',
data: JSON.stringify(data),
})
},
</#if>
<#if table.getUpdate()>
${table.getFName()}Update: data => {
return jsonRequest({
method:'ajax.${db.moduleName}.${table.getLName()}.update',
data: JSON.stringify(data),
})
},
</#if>
<#if table.getFind()>
${table.getFName()}Find: data => {
return jsonRequest({
method:'ajax.${db.moduleName}.${table.getLName()}.find',
data: JSON.stringify(data),
})
},
</#if>
<#if table.getGet()>
${table.getFName()}Get: data => {
return jsonRequest({
method:'ajax.${db.moduleName}.${table.getLName()}.get',
data: JSON.stringify(data),
})
},
</#if>
<#if table.getSearch()>
${table.getFName()}Search: data => {
return jsonRequest({
method:'ajax.${db.moduleName}.${table.getLName()}.search',
data: JSON.stringify(data),
})
},
</#if>
<#if table.getGetAll()>
${table.getFName()}GetAll: data => {
return jsonRequest({
method:'ajax.${db.moduleName}.${table.getLName()}.get.all',
data: JSON.stringify(data),
})
},
</#if>
</#list>
</#list>
}
export default ajax

@ -1,39 +1,255 @@
<script> <script>
window.nav = new Vue({ 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: '',
responseType: 'blob',
headers: {'Content-Type': 'application/json;charset=UTF-8'},
});
uploadService = axios.create({
method: 'post',
timeout: 30000,
baseURL: '',
headers: {'Content-Type': 'multipart/form-data'},
onUploadProgress: function (progressEvent) {
var complete = (progressEvent.loaded / progressEvent.total * 100 | 0) + '%'
app.tipShow("上传中(" + complete + ")")
},
});
// 添加JSON请求拦截器
jsonService.interceptors.request.use(function (config) {
// 在发送请求之前做些什么
app.barShow();
app.tipShow();
return config;
}, function (error) {
return Promise.reject(error);
});
uploadService.interceptors.request.use(function (config) {
// 在发送请求之前做些什么
app.barShow();
app.tipShow("上传中 ...");
return config;
}, function (error) {
return Promise.reject(error);
});
// 添加JSON响应拦截器
jsonService.interceptors.response.use(function (response) {
// 对响应数据做点什么
app.tipClose();
try {//确保服务器正确返回Json
if (response.data.errors.length > 0) {
console.error(response.data.errors)
}
app.barFinish();
} catch (e) {
app.barError();
response.data = {errors: [{message: '服务器响应错误'}]};
}
return response;
}, function (error) {
// 对响应错误做点什么,并返回错误结果
app.tipClose();
app.barError();
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) {
// 对响应数据做点什么
app.tipClose();
try {//确保服务器正确返回Json
if (response.data.errors.length > 0) {
console.error(response.data.errors)
}
app.barFinish();
} catch (e) {
app.barError();
response.data = {errors: [{message: '服务器响应错误'}]};
}
return response;
}, function (error) {
// 对响应错误做点什么,并返回错误结果
app.tipClose();
app.barError();
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 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) {
var fd = new FormData();
fd.append("file", data.data);
data.data = fd;
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', decodeURIComponent(fileName))
document.body.appendChild(link)
link.click();
return Promise.resolve({errors: []});
}, function (response) {
return Promise.resolve(response);
})
};
window.ajax = {
login: function (data) {
return jsonRequest({
url: "system/Auth/login",
data: JSON.stringify(data),
})
},
create: function (module, target, data) {
return jsonRequest({
url: module + "/" + target + "/create",
data: JSON.stringify(data),
})
},
update: function (module, target, data) {
return jsonRequest({
url: module + "/" + target + "/update",
data: JSON.stringify(data),
})
},
delete: function (module, target, data) {
return jsonRequest({
url: module + "/" + target + "/delete",
data: JSON.stringify(data),
})
},
find: function (module, target, data) {
return jsonRequest({
url: module + "/" + target + "/find",
data: JSON.stringify(data),
})
},
get: function (module, target, data) {
return jsonRequest({
url: module + "/" + target + "/get",
data: JSON.stringify(data),
})
},
load: function (module, target, data) {
return jsonRequest({
url: module + "/" + target + "/load",
data: JSON.stringify(data),
})
},
template: function (module, target, data) {
return downRequest({
url: "/ajax/" + module + "/" + target + "/template",
data: JSON.stringify(data),
})
},
imports: function (module, target, data) {
return upRequest({
url: "/ajax/" + module + "/" + target + "/imports",
data: data,
})
},
exports: function (module, target, data) {
return upRequest({
url: "/ajax/" + module + "/" + target + "/exports",
data: data,
})
},
}
var mixin = {
data: { data: {
activeIndex: 'home', activeIndex: 'home',
contextPath: '${contextPath?default("")}', contextPath: '${contextPath?default("")}',
homePath: '${homePath?default("")}', homePath: '${homePath?default("")}',
loadingTip: '', loadingTip: '',
loadingBar: '', loadingBar: '',
tip: { isSubmit:false
show: function (msg) { },
methods: {
tipShow: function (msg) {
var message = "<i class='el-icon-loading'></i> 正在加载 ..." var message = "<i class='el-icon-loading'></i> 正在加载 ..."
if (msg) { if (msg) {
message = "<i class='el-icon-loading'></i> " + msg message = "<i class='el-icon-loading'></i> " + msg
} }
if (!nav.loadingTip) { if (!this.loadingTip) {
nav.loadingTip = nav.$message({ this.loadingTip = this.$message({
type: '', type: '',
duration: 0, duration: 0,
dangerouslyUseHTMLString: true, dangerouslyUseHTMLString: true,
message: message message: message
}); });
} else { } else {
nav.loadingTip.message = message; this.loadingTip.message = message;
} }
}, },
close: function () { tipClose: function (msg) {
if (nav.loadingTip) { if (this.loadingTip) {
nav.loadingTip.close(); this.loadingTip.close();
nav.loadingTip = ''; this.loadingTip = '';
}
} }
}, },
bar: { barShow: function () {
show: function () { if (!this.loadingBar) {
if (!nav.loadingBar) { this.loadingBar = this.$message({
nav.loadingBar = nav.$message({
type: '', type: '',
duration: 0, duration: 0,
customClass: 'loading-bar', customClass: 'loading-bar',
@ -41,34 +257,31 @@
message: '<i class="bar" style="width: 90%"></i>' message: '<i class="bar" style="width: 90%"></i>'
}); });
} else { } else {
nav.loadingBar.message = '<i class="bar" style="width: 90%"></i>' this.loadingBar.message = '<i class="bar" style="width: 90%"></i>'
} }
}, },
finish: function () { barFinish: function () {
if (nav.loadingBar) { if (this.loadingBar) {
nav.loadingBar.message = '<i class="bar" style="width: 100%"></i>' this.loadingBar.message = '<i class="bar" style="width: 100%"></i>'
setTimeout(function () { setTimeout(function () {
if (nav.loadingBar) { if (this.loadingBar) {
nav.loadingBar.close(); this.loadingBar.close();
nav.loadingBar = ''; this.loadingBar = '';
} }
},500); }.bind(this), 500);
} }
}, },
error: function () { barError: function () {
if (nav.loadingBar) { if (this.loadingBar) {
nav.loadingBar.message = '<i class="bar error" style="width: 100%"></i>' this.loadingBar.message = '<i class="bar error" style="width: 100%"></i>'
setTimeout(function () { setTimeout(function () {
if(nav.loadingBar){ if (this.loadingBar) {
nav.loadingBar.close(); this.loadingBar.close();
nav.loadingBar = ''; this.loadingBar = '';
}
},500);
}
} }
}.bind(this), 500);
} }
}, },
methods: {
i: function (message, callback) { i: function (message, callback) {
this.$message({ this.$message({
type: "info", type: "info",
@ -106,7 +319,7 @@
}); });
}, },
toOpen: function (url) { toOpen: function (url) {
nav.tip.show(); this.tipShow();
var url = url.substring(0, 1) == "/" ? url.substring(1) : url; var url = url.substring(0, 1) == "/" ? url.substring(1) : url;
$("body").append($("<a id='wb-open' href='" + this.contextPath + "/" + url + "' target='_self' style='dispaly:none;'></a>")) $("body").append($("<a id='wb-open' href='" + this.contextPath + "/" + url + "' target='_self' style='dispaly:none;'></a>"))
document.getElementById("wb-open").click(); document.getElementById("wb-open").click();
@ -119,7 +332,7 @@
$("#wb-open").remove(); $("#wb-open").remove();
}, },
toHome: function () { toHome: function () {
nav.tip.show(); this.tipShow();
location.href = this.contextPath + "/" location.href = this.contextPath + "/"
}, },
/** /**
@ -154,7 +367,135 @@
$(select).scrollTop(distance); $(select).scrollTop(distance);
} }
})(); })();
},
onSearch: function () {
this.vm.pageNumber = 1;
this.onFind();
},
onReset: function (form) {
this.$refs[form].resetFields();
this.w('重置成功');
},
onPageChange: function (pageNumber) {
this.vm.pageNumber = pageNumber;
this.onFind();
},
onSelectionChange: function (select) {
this.select = select;
},
excelTemplate: function () {
ajax.template(this.module, this.target, {}).then(function (response) {
if (response.errors.length > 0) {
this.e(response.errors[0].message);
}
}.bind(this));
},
excelSelect: function () {
this.$refs['excel'].dispatchEvent(new MouseEvent('click'))
},
excelImport: function (item) {
const file = item.target.files[0];
ajax.imports(this.module, this.target, file).then(function (response) {
if (response.errors.length > 0) {
this.e(response.errors[0].message);
} else {
this.i("文件导入成功!");
}
}.bind(this))
},
onSave: function () {
this.$refs['form'].validate(function (valid) {
if (valid) {
if (this.form.id) {
ajax.update(this.module, this.target, this.form).then(function (response) {
if (response.errors.length > 0) {
nav.e(response.errors[0].message);
} else {
this.onFind();
this.form.dialog = false;
}
}.bind(this))
} else {
ajax.create(this.module, this.target, this.form).then(function (response) {
if (response.errors.length > 0) {
nav.e(response.errors[0].message);
} else {
this.onFind();
this.form.dialog = false;
}
}.bind(this))
} }
} else {
return false;
} }
}.bind(this));
},
onFind: function () {
ajax.find(this.module, this.target, this.vm).then(function (response) {
if (response.errors.length > 0) {
this.e(response.errors[0].message);
} else {
this.result = response.result;
this.vm.totalCount = Number(response.totalCount);
}
}.bind(this))
},
onDelete: function (item) {
this.$confirm('将删除该项, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(function () {
ajax.delete(this.module, this.target, {id: item.id}).then(function (response) {
if (response.errors.length > 0) {
this.e(response.errors[0].message);
} else {
this.s("删除成功");
this.onFind();
}
}.bind(this));
}.bind(this)).catch(function (action) {
}); });
},
onBitchDelete: function () {
if (this.select.length == 0) {
this.w("至少选中一项");
} else {
this.$confirm('将删除已选择的项, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(function () {
for (var i = 0; i < this.select.length; i++) {
var obj = this.select[i];
ajax.delete(this.module, this.target, {id: obj.id}).then(function (response) {
if (response.errors.length > 0) {
this.e(response.errors[0].message);
} else {
for (var j = 0; j < this.select.length; j++) {
if (this.select[j].id == obj.id) {
this.select.splice(j, 1);
}
}
if (this.select.length == 0) {
this.s("删除成功")
this.onFind();
}
}
}.bind(this))
}
}.bind(this)).catch(function (action) {
});
}
},
},
created: function () {
},
mounted: function () {
},
filters: {},
watch: {}
}
</script> </script>

@ -6,7 +6,6 @@
<script src="${context}/static/dist/lib.min.js" type="text/javascript"></script> <script src="${context}/static/dist/lib.min.js" type="text/javascript"></script>
<script src="${context}/static/dist/index.min.js" type="text/javascript"></script> <script src="${context}/static/dist/index.min.js" type="text/javascript"></script>
<link href="${context}/static/dist/index.min.css" rel="stylesheet"/> <link href="${context}/static/dist/index.min.css" rel="stylesheet"/>
<script src="${context}/static/js/ajax.js" type="text/javascript"></script>
<link href="${context}/static/css/base.css" rel="stylesheet"/> <link href="${context}/static/css/base.css" rel="stylesheet"/>
</head> </head>
<body> <body>

@ -254,6 +254,18 @@
<el-tag>${r"${r'${hello}'}"}</el-tag> <el-tag>${r"${r'${hello}'}"}</el-tag>
</p> </p>
<p>布尔值输出
<el-tag>${r"${true?c}"}</el-tag>
</p>
<p>三元表达式
<el-tag>${r"${true?string('yes','no')}"}</el-tag>
</p>
<p>输出当前日期
<el-tag>${r'${.now?string["yyyy-MM-dd HH:mm:ss"]}'}</el-tag>
</p>
</el-card> </el-card>
<el-card class="box-card" style="width: 600px;margin: 20px"> <el-card class="box-card" style="width: 600px;margin: 20px">

@ -35,7 +35,7 @@
<div id="main" :style="{marginLeft:(prop.coll?'64px':'200px')}"> <div id="main" :style="{marginLeft:(prop.coll?'64px':'200px')}">
<div id="head"> <div id="head">
<div class="collapseSwitch" @click="collapseSwitch"> <div class="collapseSwitch" @click="collapseSwitch">
<a :class="prop.coll?'reversal':''"><i class="el-icon-s-grid"></i></a> <a :class="prop.coll?'reversal':''"><i class="el-icon-s-fold"></i></a>
</div> </div>
<el-link :underline="false" @click="onHome" icon="el-icon-s-home">首页</el-link> <el-link :underline="false" @click="onHome" icon="el-icon-s-home">首页</el-link>
@ -76,6 +76,7 @@
<el-tabs v-model="activeTabName" type="border-card" closable @tab-remove="removeTab"> <el-tabs v-model="activeTabName" type="border-card" closable @tab-remove="removeTab">
<el-tab-pane <el-tab-pane
v-for="(item, index) in tabs" v-for="(item, index) in tabs"
:lazy="true"
:key="item.name" :key="item.name"
:label="item.title" :label="item.title"
:name="item.name"> :name="item.name">
@ -146,11 +147,11 @@
#head .collapseSwitch a { #head .collapseSwitch a {
display: inline-block; display: inline-block;
transition: all 1s; transition: all .5s;
} }
#head .collapseSwitch a.reversal { #head .collapseSwitch a.reversal {
transform: rotate(90deg); transform: rotate(-180deg);
} }
#head a { #head a {
@ -216,6 +217,10 @@
padding: 0; padding: 0;
height: 100%; height: 100%;
} }
#content div[role=tab]{
padding: 0 10px;
}
</style> </style>
<script> <script>
window.index = new Vue({ window.index = new Vue({
@ -224,9 +229,9 @@
tabs: [],//所有Tabs tabs: [],//所有Tabs
activeTabName: '', activeTabName: '',
prop: { prop: {
open: true,//是否保持一个子菜单展开 open: ${r"<#if prop.open>true<#else>false</#if>"},
coll: false,//左侧菜单是否收缩 coll: ${r"<#if prop.coll>true<#else>false</#if>"},
tran: false//是否展示动画 tran: ${r"<#if prop.tran>true<#else>false</#if>"}
} }
}, },
methods: { methods: {

@ -16,7 +16,7 @@
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" style="width: 100%" :loading="isLogin" :disabled="isLogin" <el-button type="primary" style="width: 100%" :loading="$isSubmit" :disabled="$isSubmit"
@click="submitForm('form')">登录 @click="submitForm('form')">登录
</el-button> </el-button>
</el-form-item> </el-form-item>
@ -106,7 +106,7 @@
{required: true, message: '请输入密码', trigger: 'change'} {required: true, message: '请输入密码', trigger: 'change'}
], ],
}, },
isLogin: false $isSubmit: false
}, },
mounted: function () { mounted: function () {
@ -115,14 +115,14 @@
submitForm: function (formName) { submitForm: function (formName) {
this.$refs[formName].validate(function (valid) { this.$refs[formName].validate(function (valid) {
if (valid) { if (valid) {
this.isLogin = true; this.$isSubmit = true;
ajax.authLogin(this.form).then(function (response) { ajax.login(this.form).then(function (response) {
this.isLogin = false; this.$isSubmit = false;
if (response.errors.length > 0) { if (response.errors.length > 0) {
nav.e(response.errors[0].message); nav.e(response.errors[0].message);
} else { } else {
nav.i("登录成功!", function () { nav.i("登录成功!", function () {
location.href = "/index.htm" location.href = "/"
}); });
} }
}) })

@ -24,7 +24,8 @@
<el-card class="box-card"> <el-card class="box-card">
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-button type="success" size="small" icon="el-icon-plus" @click="onAction(['create',''])">新增</el-button> <el-button type="success" size="small" icon="el-icon-plus" @click="onCreate">新增
</el-button>
<el-button type="warning" size="small" icon="el-icon-download">导出</el-button> <el-button type="warning" size="small" icon="el-icon-download">导出</el-button>
@ -51,7 +52,7 @@
</el-form> </el-form>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button size="small" @click="form.dialog = false">取 消</el-button> <el-button size="small" @click="form.dialog = false">取 消</el-button>
<el-button size="small" type="primary" @click="onAction(['save',''])">保存</el-button> <el-button size="small" type="primary" @click="onSave">保存</el-button>
</span> </span>
</el-dialog> </el-dialog>
</el-col> </el-col>
@ -59,11 +60,17 @@
<el-col :span="12"> <el-col :span="12">
<el-button-group style="float: right;"> <el-button-group style="float: right;">
<el-tooltip effect="dark" content="Excel模板下载" placement="bottom"> <el-tooltip effect="dark" content="Excel模板下载" placement="bottom">
<el-button size="small" icon="el-icon-date" @click="onAction(['template',''])"></el-button> <el-button size="small" icon="el-icon-date" @click="excelTemplate"></el-button>
</el-tooltip> </el-tooltip>
<el-tooltip effect="dark" content="Excel导入" placement="bottom"> <el-tooltip effect="dark" content="Excel导入" placement="bottom">
<el-button size="small" icon="el-icon-upload2"></el-button> <el-button size="small" @click="excelSelect">
<i class="el-icon-upload2">
<input type="file" style="display: none" @change="excelImport($event)" ref="excel">
</i>
</el-button>
</el-tooltip> </el-tooltip>
<el-tooltip effect="dark" content="批量删除" placement="bottom"> <el-tooltip effect="dark" content="批量删除" placement="bottom">
<el-button size="small" icon="el-icon-delete" @click="onBitchDelete"></el-button> <el-button size="small" icon="el-icon-delete" @click="onBitchDelete"></el-button>
</el-tooltip> </el-tooltip>
@ -127,8 +134,8 @@
width="120" width="120"
label="操作"> label="操作">
<template slot-scope="scope"> <template slot-scope="scope">
<el-dropdown size="mini" split-button type="primary" @click="onAction(['view',scope.row])" <el-dropdown size="mini" type="primary" split-button @command="onCommand"
@command="onAction"> @click="onCommand(['view',scope.row])">
<i class="el-icon-tickets"></i>查看 <i class="el-icon-tickets"></i>查看
<el-dropdown-menu slot="dropdown"> <el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="['edit',scope.row]" icon="el-icon-edit">编辑</el-dropdown-item> <el-dropdown-item :command="['edit',scope.row]" icon="el-icon-edit">编辑</el-dropdown-item>
@ -144,7 +151,7 @@
background background
v-if="vm.totalCount > vm.pageSize" v-if="vm.totalCount > vm.pageSize"
style="margin-top: 10px" style="margin-top: 10px"
@current-change="onPage" @current-change="onPageChange"
:current-page="vm.pageNumber" :current-page="vm.pageNumber"
:page-size="vm.pageSize" :page-size="vm.pageSize"
layout="total, sizes, prev, pager, next, jumper" layout="total, sizes, prev, pager, next, jumper"
@ -172,8 +179,11 @@
</style> </style>
<script> <script>
var app = new Vue({ var app = new Vue({
mixins: [mixin],
el: "#app", el: "#app",
data: { data: {
module: 'system',
target: 'dict',
vm: { vm: {
id: '', id: '',
dictName: '', dictName: '',
@ -210,68 +220,7 @@
}, },
}, },
methods: { methods: {
onSearch: function () { onCreate: function () {
this.vm.pageNumber = 1;
this.onFind();
},
onReset: function (form) {
this.$refs[form].resetFields();
nav.w('重置成功');
},
onFind: function () {
ajax.dictFind(this.vm).then(function (response) {
if (response.errors.length > 0) {
nav.e(response.errors[0].message);
} else {
this.result = response.result;
this.vm.totalCount = Number(response.totalCount);
}
}.bind(this))
},
onPage: function (pageNumber) {
this.vm.pageNumber = pageNumber;
this.onFind();
},
onSelectionChange: function (select) {
this.select = select;
},
onBitchDelete: function () {
if (this.select.length == 0) {
nav.w("至少选中一项");
} else {
this.$confirm('将删除已选择的项, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(function () {
for (var i = 0; i < this.select.length; i++) {
var obj = this.select[i];
ajax.dictDelete({id: obj.id}).then(function (response) {
if (response.errors.length > 0) {
nav.e(response.errors[0].message);
} else {
for (var j = 0; j < this.select.length; j++) {
if (this.select[j].id == obj.id) {
this.select.splice(j, 1);
}
}
if (this.select.length == 0) {
nav.s("删除成功")
this.onFind();
}
}
}.bind(this))
}
}.bind(this)).catch(function (action) {
});
}
},
onAction: function (arg) {
const action = arg[0];
const item = arg[1];
switch (action) {
case "create":
this.form.title = '新增字典'; this.form.title = '新增字典';
this.form.id = ''; this.form.id = '';
this.form.dictName = ''; this.form.dictName = '';
@ -279,41 +228,11 @@
this.form.version = ''; this.form.version = '';
this.form.valid = true; this.form.valid = true;
this.form.dialog = true; this.form.dialog = true;
break; },
case "save": onCommand: function (args) {
this.$refs['form'].validate(function (valid) { const cmd = args[0];
if (valid) { const item = args[1];
if (this.form.id) { switch (cmd) {
ajax.dictUpdate(this.form).then(function (response) {
if (response.errors.length > 0) {
nav.e(response.errors[0].message);
} else {
this.onFind();
this.form.dialog = false;
}
}.bind(this))
} else {
ajax.dictCreate(this.form).then(function (response) {
if (response.errors.length > 0) {
nav.e(response.errors[0].message);
} else {
this.onFind();
this.form.dialog = false;
}
}.bind(this))
}
} else {
return false;
}
}.bind(this));
break;
case "view":
parent.index.addTab({
title: "字典项管理",
name: "dictItem" + item.id,
url: "${context}/system/dictItem.htm?dictId=" + item.id
});
break;
case "edit": case "edit":
this.form.title = '编辑字典'; this.form.title = '编辑字典';
this.form.id = item.id; this.form.id = item.id;
@ -325,37 +244,27 @@
this.form.dialog = true; this.form.dialog = true;
break; break;
case "delete": case "delete":
this.$confirm('将删除该项, 是否继续?', '提示', { this.onDelete(item);
confirmButtonText: '确定', break;
cancelButtonText: '取消', case "view":
type: 'warning' if (!parent || !parent.index) {
}).then(function () { this.e("找不到上级页面!");
ajax.dictDelete({id: item.id}).then(function (response) {
if (response.errors.length > 0) {
nav.e(response.errors[0].message);
} else { } else {
nav.s("删除成功"); parent.index.addTab({
this.onFind(); title: "字典项管理",
name: "dictItem" + item.id,
url: "${context}/system/dictItem.htm?dictId=" + item.id
});
} }
}.bind(this));
}.bind(this));
break; break;
case "template": default:
ajax.dictTemplate({}).then(function (response) { this.w("未找到对应的命令");
if (response.errors.length > 0) { break;
nav.e(response.errors[0].message);
}
}.bind(this));
break
} }
} }
}, },
filters: {},
created: function () {
},
mounted: function () { mounted: function () {
this.onFind(); this.onFind();
}, }
watch: {}
}) })
</script> </script>

Loading…
Cancel
Save

Powered by TurnKey Linux.