master
wangbing 5 years ago
parent d5c0d98dab
commit 21a3dfb390

@ -233,6 +233,7 @@ public class SpringBootCallable implements Callable {
freeMarkerManager.outputTemp(new File(system.getAbsolutePath(), "AuthAjax.java"), option + "/java/action/ajax/system/AuthAjax.java", ctx);
freeMarkerManager.outputTemp(new File(system.getAbsolutePath(), "DictAjax.java"), option + "/java/action/ajax/system/DictAjax.java", ctx);
freeMarkerManager.outputTemp(new File(system.getAbsolutePath(), "DictItemAjax.java"), option + "/java/action/ajax/system/DictItemAjax.java", ctx);
freeMarkerManager.outputTemp(new File(system.getAbsolutePath(), "FileAjax.java"), option + "/java/action/ajax/system/FileAjax.java", ctx);
for (Module module : project.getModules()) {
@ -870,6 +871,7 @@ public class SpringBootCallable implements Callable {
ctx.put("author", project.getProjectAuthor());
ctx.put("date", new Date());
ctx.put("table", table);
ctx.put("module", module.getName());
ctx.put("fields", table.getFields());
freeMarkerManager.outputTemp(new File(module.getAbsolutePath(), table.getFName() + ".ftl"), option + "/resources/templates/screen/module/mgr.ftl", ctx);
}

@ -278,6 +278,7 @@ public class GlobalController implements ErrorController {
if (methodC == null) {
BaseResponse baseResponse = new BaseResponse();
baseResponse.addError(ErrorType.BUSINESS_ERROR, "未找到对应的方法!");
return baseResponse;
}
Parameter[] parameters = methodC.getParameters();

@ -60,4 +60,47 @@ public class ${table.getCName()}Ajax{
return ${table.getFName()}Manager.getAll(request, LocalData.getToken());
}
</#if>
<#if table.getHtml()>
public Object template(){
try {
WSheet<DictItemCreateRequest> sheet = new WSheet<>(DictItemCreateRequest.class);
byte[] bytes = sheet.getBytes();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", URLEncoder.encode(sheet.getName() + ".xlsx","utf-8"));
return new ResponseEntity<>(bytes, headers, HttpStatus.OK);
} catch (IOException e) {
BaseResponse baseResponse = new BaseResponse();
baseResponse.addError(ErrorType.BUSINESS_ERROR, "");
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() + "-err.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;
}
</#if>
}

@ -82,7 +82,7 @@ public class DictAjax {
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"));
headers.setContentDispositionFormData("attachment", URLEncoder.encode(sheet.getName() + "-err.xlsx","utf-8"));
return new ResponseEntity<>(sheetBytes, headers, HttpStatus.OK);
} else {
return baseResponse;

@ -1,39 +1,93 @@
package ${basePackage}.action.ajax.system;
import org.springframework.beans.factory.annotation.Autowired;
import ${basePackage}.frame.auth.LocalData;
import ${basePackage}.frame.excel.WSheet;
import ${basePackage}.frame.utils.MapperUtil;
import ${basePackage}.module.system.mgr.DictItemManager;
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;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import java.io.IOException;
import java.net.URLEncoder;
public class DictItemAjax {
@Autowired
private DictItemManager dictManager;
public DictItemCreateResponse create(String jsonParam) {
public DictItemCreateResponse create(TreeNode jsonParam) {
DictItemCreateRequest request = MapperUtil.toJava(jsonParam, DictItemCreateRequest.class);
return dictManager.create(request, LocalData.getToken());
}
public DictItemDeleteResponse delete(String jsonParam) {
public DictItemDeleteResponse delete(TreeNode jsonParam) {
DictItemDeleteRequest request = MapperUtil.toJava(jsonParam, DictItemDeleteRequest.class);
return dictManager.delete(request, LocalData.getToken());
}
public DictItemUpdateResponse update(String jsonParam) {
public DictItemUpdateResponse update(TreeNode jsonParam) {
DictItemUpdateRequest request = MapperUtil.toJava(jsonParam, DictItemUpdateRequest.class);
return dictManager.update(request, LocalData.getToken());
}
public DictItemFindResponse find(String jsonParam) {
public DictItemFindResponse find(TreeNode jsonParam) {
DictItemFindRequest request = MapperUtil.toJava(jsonParam, DictItemFindRequest.class);
return dictManager.find(request, LocalData.getToken());
}
public DictItemGetResponse get(String jsonParam) {
public DictItemGetResponse get(TreeNode jsonParam) {
DictItemGetRequest request = MapperUtil.toJava(jsonParam, DictItemGetRequest.class);
return dictManager.get(request, LocalData.getToken());
}
public Object template(){
try {
WSheet<DictItemCreateRequest> sheet = new WSheet<>(DictItemCreateRequest.class);
byte[] bytes = sheet.getBytes();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", URLEncoder.encode(sheet.getName() + ".xlsx","utf-8"));
return new ResponseEntity<>(bytes, headers, HttpStatus.OK);
} catch (IOException e) {
BaseResponse baseResponse = new BaseResponse();
baseResponse.addError(ErrorType.BUSINESS_ERROR, "");
return baseResponse;
}
}
public Object imports(MultipartFile file) {
BaseResponse baseResponse = new BaseResponse();
try {
byte[] bytes = file.getBytes();
WSheet<DictItemCreateRequest> sheet = new WSheet<>(bytes, DictItemCreateRequest.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() + "-err.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;
}
}

@ -0,0 +1,54 @@
package ${basePackage}.action.ajax.system;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;
import ${basePackage}.frame.base.BaseResponse;
import ${basePackage}.frame.base.ErrorType;
import ${basePackage}.frame.base.FileUploadResponse;
import javax.swing.tree.TreeNode;
import java.io.IOException;
import java.net.URLEncoder;
public class FileAjax {
public Object upload(MultipartFile file) {
FileUploadResponse fileUploadResponse = new FileUploadResponse();
String fileName = file.getOriginalFilename();
//========
// todo 处理文件
//========
fileUploadResponse.setId(1L);
fileUploadResponse.setUrl("example.com\\img\\1.jpg");
fileUploadResponse.setDownloadUrl("example.com\\img\\1.jpg");
if (file != null) {
fileUploadResponse.addError(ErrorType.BUSINESS_ERROR, "文件上传成功,但未处理文件[" + fileName + "]!");
} else {
fileUploadResponse.addError(ErrorType.BUSINESS_ERROR, "文件上传失败!");
}
return fileUploadResponse;
}
public Object download(TreeNode jsonParam) {
try {
//========
// todo 下载示例
//========
byte[] bytes = "test".getBytes();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", URLEncoder.encode("example.test", "utf-8"));
return new ResponseEntity<>(bytes, headers, HttpStatus.OK);
} catch (IOException e) {
BaseResponse baseResponse = new BaseResponse();
baseResponse.addError(ErrorType.BUSINESS_ERROR, "");
return baseResponse;
}
}
}

@ -16,83 +16,13 @@
method: 'post',
timeout: 30000,
baseURL: '',
responseType: 'blob',
headers: {'Content-Type': 'multipart/form-data'},
onUploadProgress: function (progressEvent) {
var complete = (progressEvent.loaded / progressEvent.total * 100 | 0) + '%'
app.tipShow("上传中(" + complete + ")")
nav.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:
@ -111,31 +41,106 @@
return {message: "请求错误(" + error.response.status + ")"};
}
}
jsonRequest = function (data) {
function jsonRequest(data) {
nav.barShow();
nav.tipShow();
return jsonService.request(data)
.then(function (response) {
nav.tipClose();
if (response.data.errors) {// 确保服务器正确返回Json
nav.barFinish();
} else {
response.data = {errors: [{message: '服务器响应错误'}]};
nav.barError();
}
return Promise.resolve(response.data);
}, function (response) {
return Promise.resolve(response);
}, function (error) {
nav.tipClose();
nav.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);
})
};
upRequest = function (data) {
}
function upRequest(data) {
nav.barShow();
nav.tipShow("上传中...");
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);
nav.tipClose();
if (!response.data) {
nav.barError();
return Promise.resolve({errors: [{message: '下载错误'}]});
} else if ("application/json" == response.data.type) {
var reader = new FileReader();
reader.addEventListener("loadend", function () {
var rsp = JSON.parse(reader.result);
if (rsp.errors.length > 0) {
nav.barError();
nav.e(rsp.errors[0].message)
} else {
nav.barFinish();
}
});
reader.readAsText(response.data, "utf-8");
return Promise.resolve({errors: []});
} else {
nav.barFinish();
// 获取响应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 (error) {
nav.tipClose();
nav.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);
})
};
downRequest = function (data) {
function downRequest(data) {
nav.barShow();
return downloadService.request(data)
.then(function (response) {
if (!response.data) {
nav.barError();
return Promise.resolve({errors: [{message: '下载错误'}]});
} else if ("application/json" == response.data.type) {
var reader = new FileReader();
reader.addEventListener("loadend", function () {
var rsp = JSON.parse(reader.result);
if (rsp.errors.length > 0) {
nav.barError();
nav.e(rsp.errors[0].message)
} else {
nav.barFinish();
}
});
reader.readAsText(response.data, "utf-8");
return Promise.resolve({errors: []});
} else {
nav.barFinish();
// 获取响应header中文件信息
var dis = response.headers['content-disposition'];
// 正则匹配文件名
@ -149,17 +154,31 @@
document.body.appendChild(link)
link.click();
return Promise.resolve({errors: []});
}
}, function (response) {
return Promise.resolve(response);
return Promise.resolve(handleError(response.response.status));
})
};
window.ajax = {
// 定义共享异步请求对象
Vue.prototype.$ajax = {
login: function (data) {
return jsonRequest({
url: "system/Auth/login",
data: JSON.stringify(data),
})
},
upload: function (data) {
return upRequest({
url: "system/File/upload",
data: data,
})
},
download: function (data) {
return downRequest({
url: "system/File/download",
data: JSON.stringify(data),
})
},
create: function (module, target, data) {
return jsonRequest({
url: module + "/" + target + "/create",
@ -214,15 +233,17 @@
data: data,
})
},
}
};
var mixin = {
data: {
activeIndex: 'home',
contextPath: '${contextPath?default("")}',
homePath: '${homePath?default("")}',
contextPath: '${context?default("")}',
homePath: '${home?default("")}',
loadingTip: '',
loadingBar: '',
isSubmit:false
isSubmit: false,
result: [],
select: []
},
methods: {
tipShow: function (msg) {
@ -384,22 +405,18 @@
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));
this.$ajax.template(this.module, this.target, {});
},
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) {
this.$ajax.imports(this.module, this.target, file).then(function (response) {
if (response.errors.length > 0) {
this.e(response.errors[0].message);
} else {
this.i("文件导入成功!");
this.i("文件上传成功!");
}
}.bind(this))
},
@ -407,7 +424,7 @@
this.$refs['form'].validate(function (valid) {
if (valid) {
if (this.form.id) {
ajax.update(this.module, this.target, this.form).then(function (response) {
this.$ajax.update(this.module, this.target, this.form).then(function (response) {
if (response.errors.length > 0) {
nav.e(response.errors[0].message);
} else {
@ -416,7 +433,7 @@
}
}.bind(this))
} else {
ajax.create(this.module, this.target, this.form).then(function (response) {
this.$ajax.create(this.module, this.target, this.form).then(function (response) {
if (response.errors.length > 0) {
nav.e(response.errors[0].message);
} else {
@ -431,7 +448,7 @@
}.bind(this));
},
onFind: function () {
ajax.find(this.module, this.target, this.vm).then(function (response) {
this.$ajax.find(this.module, this.target, this.vm).then(function (response) {
if (response.errors.length > 0) {
this.e(response.errors[0].message);
} else {
@ -446,7 +463,7 @@
cancelButtonText: '取消',
type: 'warning'
}).then(function () {
ajax.delete(this.module, this.target, {id: item.id}).then(function (response) {
this.$ajax.delete(this.module, this.target, {id: item.id}).then(function (response) {
if (response.errors.length > 0) {
this.e(response.errors[0].message);
} else {
@ -469,7 +486,7 @@
}).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) {
this.$ajax.delete(this.module, this.target, {id: obj.id}).then(function (response) {
if (response.errors.length > 0) {
this.e(response.errors[0].message);
} else {
@ -498,4 +515,8 @@
filters: {},
watch: {}
}
// 实例化工具
window.nav = new Vue({
mixins: [mixin]
})
</script>

@ -7,7 +7,6 @@
<script src="${context}/static/dist/lib.min.js" type="text/javascript"></script>
<script src="${context}/static/dist/mint-ui.min.js" type="text/javascript"></script>
<link href="${context}/static/dist/mint-ui.min.css" rel="stylesheet"/>
<script src="${context}/static/js/ajax.js" type="text/javascript"></script>
<link href="${context}/static/favicon.ico" rel="icon" type="image/x-icon"/>
<style>
* {

@ -141,15 +141,15 @@
<el-divider></el-divider>
<p>ajax.example({}).then(function (response) {</p>
<p>ajax.login({}).then(function (response) {</p>
<p style="text-indent: 2em;">if (response.errors.length > 0) {</p>
<p style="text-indent: 4em;">nav.e(response.errors[0].message);</p>
<p style="text-indent: 4em;">this.e(response.errors[0].message);</p>
<p style="text-indent: 2em;">} else {</p>
<p style="text-indent: 4em;">nav.i("Ajax调用成功!");</p>
<p style="text-indent: 4em;">this.i("Ajax调用成功!");</p>
<p style="text-indent: 2em;">}</p>
@ -173,19 +173,19 @@
<el-divider></el-divider>
<p>ajax.fileUpload(req.file).then(function (response) {</p>
<p>ajax.upload(req.file).then(function (response) {</p>
<p style="text-indent: 2em;">if (response.errors.length > 0) {</p>
<p style="text-indent: 4em;">req.onError();</p>
<p style="text-indent: 4em;">nav.e(response.errors[0].message);</p>
<p style="text-indent: 4em;">this.e(response.errors[0].message);</p>
<p style="text-indent: 2em;">} else {</p>
<p style="text-indent: 4em;">req.onSuccess();</p>
<p style="text-indent: 4em;">nav.i("文件上传成功!");</p>
<p style="text-indent: 4em;">this.i("文件上传成功!");</p>
<p style="text-indent: 2em;">}</p>
@ -217,21 +217,21 @@
<el-tab-pane label="自定义工具">
<el-card class="box-card" style="width: 600px;margin: 20px">
<el-button type="primary" @click="this.nav.i('消息')">普通消息</el-button>
<el-button type="primary" @click="this.nav.e('错误')">错误消息</el-button>
<el-button type="primary" @click="this.nav.s('成功')">成功消息</el-button>
<el-button type="primary" @click="this.nav.w('警告')">警告消息</el-button>
<el-button type="primary" @click="i('消息')">普通消息</el-button>
<el-button type="primary" @click="e('错误')">错误消息</el-button>
<el-button type="primary" @click="s('成功')">成功消息</el-button>
<el-button type="primary" @click="w('警告')">警告消息</el-button>
</el-card>
<el-card class="box-card" style="width: 600px;margin: 20px">
<el-button type="primary" @click="this.nav.tip.show('加载中')">加载提示框</el-button>
<el-button type="primary" @click="this.nav.tip.close()">关闭提示框</el-button>
<el-button type="primary" @click="tipShow('加载中')">加载提示框</el-button>
<el-button type="primary" @click="tipClose()">关闭提示框</el-button>
</el-card>
<el-card class="box-card" style="width: 600px;margin: 20px">
<el-button type="primary" @click="this.nav.bar.show()">加载提示条</el-button>
<el-button type="primary" @click="this.nav.bar.finish()">成功</el-button>
<el-button type="primary" @click="this.nav.bar.error()">失败</el-button>
<el-button type="primary" @click="barShow()">加载提示条</el-button>
<el-button type="primary" @click="barFinish()">成功</el-button>
<el-button type="primary" @click="barError()">失败</el-button>
</el-card>
</el-tab-pane>
@ -1028,19 +1028,18 @@
},
methods: {
doAjax: function () {
ajax.authLogin({}).then(function (response) {
ajax.login({}).then(function (response) {
if (response.errors.length > 0) {
nav.e(response.errors[0].message);
this.e(response.errors[0].message);
} else {
nav.i("Ajax调用成功!");
this.i("Ajax调用成功!");
}
})
}.bind(this))
},
doPush: function () {
if (window.EventSource) {
window.evtSource = new EventSource('http://localhost:8080/sse/1');
window.evtSource.addEventListener('message', function (e) {
console.log(e.data);
this.$notify.info({
title: '消息',
message: "收到一条新的消息:" + e.data
@ -1054,15 +1053,15 @@
}
},
handleUpload: function (req) {
ajax.fileUpload(req.file).then(function (response) {
ajax.upload(req.file).then(function (response) {
if (response.errors.length > 0) {
req.onError();
nav.e(response.errors[0].message);
this.e(response.errors[0].message);
} else {
req.onSuccess();
nav.i("文件上传成功!");
this.i("文件上传成功!");
}
})
}.bind(this))
},
submitForm: function (formName) {
this.$refs[formName].validate(function (valid) {
@ -1072,13 +1071,13 @@
console.log('error submit!!');
return false;
}
});
}.bind(this));
},
resetForm: function (formName) {
this.$refs[formName].resetFields();
},
handleEdit: function (index, row) {
nav.i("编辑");
this.i("编辑");
},
showMessage: function () {

@ -16,7 +16,7 @@
</el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" style="width: 100%" :loading="$isSubmit" :disabled="$isSubmit"
<el-button type="primary" style="width: 100%" :loading="isSubmit" :disabled="isSubmit"
@click="submitForm('form')">登录
</el-button>
</el-form-item>
@ -92,6 +92,7 @@
<script type="text/javascript">
var app = new Vue({
mixins: [mixin],
el: "#app",
data: {
form: {
@ -105,8 +106,7 @@
password: [
{required: true, message: '请输入密码', trigger: 'change'}
],
},
$isSubmit: false
}
},
mounted: function () {
@ -115,17 +115,17 @@
submitForm: function (formName) {
this.$refs[formName].validate(function (valid) {
if (valid) {
this.$isSubmit = true;
ajax.login(this.form).then(function (response) {
this.$isSubmit = false;
this.isSubmit = true;
this.$ajax.login(this.form).then(function (response) {
this.isSubmit = false;
if (response.errors.length > 0) {
nav.e(response.errors[0].message);
this.e(response.errors[0].message);
} else {
nav.i("登录成功!", function () {
this.i("登录成功!", function () {
location.href = "/"
});
}
})
}.bind(this))
} else {
return false;
}

@ -18,7 +18,7 @@
<el-card class="box-card">
<el-row>
<el-col :span="12">
<el-button type="success" size="small" icon="el-icon-plus" @click="onAction(['create',''])">新增
<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>
@ -34,7 +34,7 @@
</el-form>
<span slot="footer" class="dialog-footer">
<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>
</el-dialog>
</el-col>
@ -42,14 +42,21 @@
<el-col :span="12">
<el-button-group style="float: right;">
<el-tooltip effect="dark" content="Excel模板下载" placement="bottom">
<el-button size="small" icon="el-icon-date"></el-button>
<el-button size="small" icon="el-icon-date" @click="excelTemplate"></el-button>
</el-tooltip>
<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 effect="dark" content="批量删除" placement="bottom">
<el-button size="small" icon="el-icon-delete" @click="onBitchDelete"></el-button>
</el-tooltip>
<el-tooltip effect="dark" content="刷新" placement="bottom">
<el-button size="small" icon="el-icon-refresh" @click="onFind"></el-button>
</el-tooltip>
@ -90,8 +97,8 @@
width="120"
label="操作">
<template slot-scope="scope">
<el-dropdown size="mini" split-button type="primary" @click="onAction(['edit',scope.row])"
@command="onAction">
<el-dropdown size="mini" split-button type="primary" @click="onCommand(['edit',scope.row])"
@command="onCommand">
<i class="el-icon-edit"></i>编辑
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="['delete',scope.row]" icon="el-icon-delete">删除
@ -133,8 +140,11 @@
</style>
<script>
var app = new Vue({
mixins: [mixin],
el: "#app",
data: {
module: '${module}',
target: '${table.getFName()}',
vm: {//条件及分页参数
<#list fields as item>
<#if item.isQuery>
@ -143,7 +153,9 @@
</#list>
pageNumber: 1,
pageSize: 10,
totalCount: 0
totalCount: 0,
sortKey:'CREATE_TIME',
sortType:'DESC'
},
form: {//待提交表单
title: "",
@ -169,68 +181,10 @@
],
</#if>
</#list>
},
select: [],
result: [],
},
methods: {
onSearch: function () {
this.vm.pageNumber = 1;
this.onFind();
},
onReset: function (form) {
this.$refs[form].resetFields();
nav.w('重置成功');
},
onFind: function () {
ajax.${table.getFName()}Find(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();
},
onBitchDelete: function () {
if (this.select.length === 0) {
nav.e("尚未选择数据列");
return;
}
this.$confirm('将删除所有选中项, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(function () {
this.select.forEach(function (item) {
ajax.${table.getFName()}Delete({id: item.id}).then(function (response) {
if (response.errors.length > 0) {
nav.e(response.errors[0].message);
} else {
this.select.remove(item);
if (this.select.length===0){
nav.s("删除成功");
this.onFind();
}
}
}.bind(this))
}.bind(this))
}.bind(this)).catch(function (action) {
});
},
onSelectionChange: function (select) {
this.select = select;
},
onAction: function (arg) {
const action = arg[0];
const item = arg[1];
switch (action) {
case "create":
methods: {
onCreate: function () {
this.form.title = "${table.tableComment?default("")}新增";
this.form.dialog = true;
this.form.id = "";
@ -239,28 +193,11 @@
this.form.${item.getFName()} = "";
</#if>
</#list>
break;
case "save":
if (this.form.id) {
ajax.${table.getFName()}Update(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.${table.getFName()}Create(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))
}
break;
},
onCommand: function (arg) {
const action = arg[0];
const item = arg[1];
switch (action) {
case "edit":
this.form.title = "${table.tableComment?default("")}编辑";
this.form.dialog = true;
@ -273,31 +210,16 @@
this.form.rowVersion = item.rowVersion;
break;
case "delete":
this.$confirm('将删除该项, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(function () {
ajax.${table.getFName()}Delete({id: item.id}).then(function (response) {
if (response.errors.length > 0) {
nav.e(response.errors[0].message);
} else {
nav.s("删除成功")
this.onFind();
}
}.bind(this))
}.bind(this)).catch(function (action) {
});
this.onDelete(item);
break;
default:
this.w("未找到对应的命令");
break;
}
},
},
created: function () {
},
mounted: function () {
this.onFind();
},
watch: {}
})
</script>

@ -74,6 +74,7 @@
<el-tooltip effect="dark" content="批量删除" placement="bottom">
<el-button size="small" icon="el-icon-delete" @click="onBitchDelete"></el-button>
</el-tooltip>
<el-tooltip effect="dark" content="刷新" placement="bottom">
<el-button size="small" icon="el-icon-refresh" @click="onFind"></el-button>
</el-tooltip>
@ -134,8 +135,8 @@
width="120"
label="操作">
<template slot-scope="scope">
<el-dropdown size="mini" type="primary" split-button @command="onCommand"
@click="onCommand(['view',scope.row])">
<el-dropdown size="mini" type="primary" split-button @click="onCommand(['view',scope.row])"
@command="onCommand">
<i class="el-icon-tickets"></i>查看
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="['edit',scope.row]" icon="el-icon-edit">编辑</el-dropdown-item>
@ -191,7 +192,9 @@
valid: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0
totalCount: 0,
sortKey:'CREATE_TIME',
sortType:'DESC'
},
select: [],
result: [],

@ -27,12 +27,13 @@
<el-card class="box-card">
<el-row>
<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(['create',''])">新增
</el-button>
<el-button type="warning" size="small" icon="el-icon-download">导出</el-button>
<el-dialog class="form" :title="form.title" :visible.sync="form.dialog">
<el-form :model="form":inline="true" :rules="formRules" ref="form" label-width="90px">
<el-form :model="form" :inline="true" :rules="formRules" ref="form" label-width="90px">
<el-form-item label="字典键" prop="dictName">
<el-input size="small" v-model="form.key"></el-input>
</el-form-item>
@ -49,7 +50,7 @@
</el-form>
<span slot="footer" class="dialog-footer">
<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>
</el-dialog>
</el-col>
@ -57,14 +58,21 @@
<el-col :span="12">
<el-button-group style="float: right;">
<el-tooltip effect="dark" content="Excel模板下载" placement="bottom">
<el-button size="small" icon="el-icon-date"></el-button>
<el-button size="small" icon="el-icon-date" @click="excelTemplate"></el-button>
</el-tooltip>
<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 effect="dark" content="批量删除" placement="bottom">
<el-button size="small" icon="el-icon-delete" @click="onBitchDelete"></el-button>
</el-tooltip>
<el-tooltip effect="dark" content="刷新" placement="bottom">
<el-button size="small" icon="el-icon-refresh" @click="onFind"></el-button>
</el-tooltip>
@ -124,8 +132,8 @@
width="120"
label="操作">
<template slot-scope="scope">
<el-dropdown size="mini" split-button type="primary" @click="onAction(['edit',scope.row])"
@command="onAction">
<el-dropdown size="mini" split-button type="primary" @click="onCommand(['edit',scope.row])"
@command="onCommand">
<i class="el-icon-edit"></i>编辑
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="['delete',scope.row]" icon="el-icon-delete">删除
@ -157,7 +165,7 @@
margin: 10px;
}
.form .el-dialog{
.form .el-dialog {
width: 700px;
}
@ -168,8 +176,11 @@
</style>
<script>
var app = new Vue({
mixins: [mixin],
el: "#app",
data: {
module: 'system',
target: 'dictItem',
vm: {
id: '',
dictId: location.getParam("dictId"),
@ -179,10 +190,10 @@
valid: '',
pageNumber: 1,
pageSize: 10,
totalCount: 0
totalCount: 0,
sortKey:'CREATE_TIME',
sortType:'DESC'
},
select: [],
result: [],
form: {
title: "",
dialog: false,
@ -205,77 +216,16 @@
},
},
methods: {
onSearch: function () {
this.vm.pageNumber = 1;
this.onFind();
},
onReset: function (form) {
this.$refs[form].resetFields();
nav.w('重置成功');
},
onFind: function () {
ajax.dictItemFind(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.dictItemDelete({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) {
});
}
},
getDict: function () {
ajax.dictGet({id: location.getParam("dictId")}).then(function (response) {
this.$ajax.get("system", "dict", {id: location.getParam("dictId")}).then(function (response) {
if (response.errors.length > 0) {
nav.e(response.errors[0].message);
this.e(response.errors[0].message);
} else {
this.vm.dictName = response.dict.dictName;
}
}.bind(this))
},
onAction: function (arg) {
const action = arg[0];
const item = arg[1];
switch (action) {
case "create":
onCreate: function () {
this.form.title = '新增字典项';
this.form.id = '';
this.form.key = '';
@ -283,34 +233,11 @@
this.form.sort = this.vm.totalCount;
this.form.valid = true;
this.form.dialog = true;
break;
case "save":
this.$refs['form'].validate(function (valid) {
if (valid) {
if (this.form.id) {
ajax.dictItemUpdate(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.dictItemCreate(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;
},
onCommand: function (arg) {
const cmd = arg[0];
const item = arg[1];
switch (cmd) {
case "edit":
this.form.title = '编辑字典项';
this.form.id = item.id;
@ -322,31 +249,17 @@
this.form.dialog = true;
break;
case "delete":
this.$confirm('将删除该项, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(function () {
ajax.dictItemDelete({id: item.id}).then(function (response) {
if (response.errors.length > 0) {
nav.e(response.errors[0].message);
} else {
nav.s("删除成功")
this.onFind();
}
}.bind(this));
}.bind(this));
this.onDelete(item);
break;
default:
this.w("未找到对应的命令");
break;
}
}
},
filters: {},
created: function () {
},
mounted: function () {
this.getDict();
this.onFind();
},
watch: {}
}
})
</script>

Loading…
Cancel
Save

Powered by TurnKey Linux.