0.0.1-SNAPSHOT
wangbing 5 years ago
parent 616922e041
commit 1719a94030

@ -1,25 +1,41 @@
package com.example.action;
import com.example.config.NginxConfig;
import com.example.frame.base.BaseResponse;
import com.example.frame.base.Error;
import com.example.frame.base.ErrorType;
import com.example.frame.base.Token;
import com.example.frame.utils.*;
import com.example.module.admin.ent.NginxCtrl;
import com.example.module.admin.ent.Service;
import com.example.module.admin.mgr.MappingManager;
import com.example.module.admin.req.*;
import com.example.module.admin.req.MappingCreateRequest;
import com.example.module.admin.req.MappingDeleteRequest;
import com.example.module.admin.req.MappingFindRequest;
import com.example.module.admin.req.MappingUpdateRequest;
import com.example.module.admin.rsp.MappingFindResponse;
import com.example.module.admin.rsp.PortLoadResponse;
import freemarker.cache.ClassTemplateLoader;
import freemarker.cache.MultiTemplateLoader;
import freemarker.cache.TemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.util.ClassUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import xyz.wbsite.wsqlite.ObjectClient;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import com.example.frame.base.BaseResponse;
import com.example.frame.base.ErrorType;
import com.example.frame.base.Token;
import com.example.frame.base.Error;
import java.io.*;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
@Controller
public class AjaxController {
@ -28,6 +44,10 @@ public class AjaxController {
private MappingManager mappingManager;
@Autowired
private NginxCtrl nginxCtrl;
@Autowired
private ObjectClient objectClient;
@Autowired
private FreeMarkerConfigurer freeMarkerConfigurer;
@RequestMapping("/ajax")
@ResponseBody
@ -82,6 +102,9 @@ public class AjaxController {
case "ajax.admin.mapping.find":
baseResponse = findMapping(jsonString, token);
break;
case "ajax.admin.port.load":
baseResponse = loadPort(jsonString, token);
break;
default:
baseResponse.addError(ErrorType.INVALID_PARAMETER, Message.NOT_EXIST_METHOD);
break;
@ -161,4 +184,44 @@ public class AjaxController {
return mappingManager.find(request, token);
}
private BaseResponse loadPort(String jsonString, Token token) {
PortLoadResponse response = new PortLoadResponse();
try {
List<Service> select = objectClient.select(Service.class, 1, 0);
for (Service service : select) {
MappingFindRequest mappingFindRequest = new MappingFindRequest();
mappingFindRequest.setPortId(service.getId());
mappingFindRequest.setPageSize(0);
MappingFindResponse mappingFindResponse = mappingManager.find(mappingFindRequest, token);
if (mappingFindResponse.hasError()) {
response.addErrors(mappingFindResponse.getErrors());
return response;
}
service.setMappingList(mappingFindResponse.getResult());
}
response.setResult(select);
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
response.addError(ErrorType.BUSINESS_ERROR, "配置加载错误");
return response;
}
return response;
}
private void flushConfig() {
try {
HashMap<String, Object> context = new HashMap<>();
Template template = freeMarkerConfigurer.getConfiguration().getTemplate("nginx.conf");
Writer wr = new OutputStreamWriter(new FileOutputStream(outfile), "UTF-8");
//写入
template.process(context, wr);
//关闭流
wr.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
}
}

@ -26,6 +26,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
@ -35,6 +36,7 @@ import java.util.HashMap;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -119,6 +121,7 @@ public class GlobalController implements ErrorController {
/**
* layoutscreen
* 使layoutViewNameTranslator
*
* @param model
* @param request
*/
@ -198,6 +201,22 @@ public class GlobalController implements ErrorController {
@RequestMapping(value = "/sse/{userId}", produces = "text/event-stream;charset=UTF-8")
public SseEmitter sse(@PathVariable String userId) {
SseEmitter sseEmitter = new SseEmitter(10000000L);
sseEmitter.onError(new Consumer<Throwable>() {
private String key = userId;
@Override
public void accept(Throwable throwable) {
sseMap.remove(key);
}
});
sseEmitter.onCompletion(new Runnable() {
private String key = userId;
@Override
public void run() {
sseMap.remove(key);
}
});
if (sseMap.get(userId) != null) {
sseMap.remove(userId);
}

@ -1,24 +1,17 @@
package com.example.config;
import com.example.frame.utils.FileUtil;
import com.example.frame.utils.ZipUtil;
import com.example.frame.utils.IDgenerator;
import com.example.module.admin.ent.Mapping;
import com.example.module.admin.ent.Port;
import com.example.module.admin.ent.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.system.ApplicationHome;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.util.StringUtils;
import xyz.wbsite.wsqlite.ObjectClient;
import javax.annotation.PostConstruct;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
@ -43,11 +36,11 @@ public class SqliteConfig {
ArrayList<Class> objects = new ArrayList<>();
objects.add(Mapping.class);
objects.add(Port.class);
objects.add(Service.class);
ObjectClient objectClient = new ObjectClient(new File(dbpath, "data.db"), objects);
List<Port> select = objectClient.select(Port.class, 1, 1);
if (select.size() == 0 && objectClient.insert(Port.class, new Port("8888")) != 1) {
List<Service> select = objectClient.select(Service.class, 1, 1);
if (select.size() == 0 && objectClient.insert(Service.class, new Service(IDgenerator.nextId(), "8888", "默认端口")) != 1) {
throw new RuntimeException("Nginx default port 8888 init failed.");
}

@ -1,6 +1,6 @@
package com.example.module.admin.ent;
import com.example.frame.base.BaseEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import xyz.wbsite.wsqlite.anonation.TableField;
import java.util.Date;
@ -19,6 +19,13 @@ public class Mapping {
*/
@TableField
private Long id;
/**
* ID - ID
*/
@TableField
private Long serviceId;
/**
* NAME -
*/
@ -35,10 +42,19 @@ public class Mapping {
@TableField
private String bz;
@TableField
// @JsonFormat(timezone = "GMT+8", pattern = "yyyyMMddHHmmss")
private Date createTime;
@TableField
private boolean isDeleted;
public Long getServiceId() {
return serviceId;
}
public void setServiceId(Long serviceId) {
this.serviceId = serviceId;
}
public String getName() {
return name;
}

@ -1,33 +0,0 @@
package com.example.module.admin.ent;
import xyz.wbsite.wsqlite.anonation.TableField;
import java.util.Date;
/**
* MAPPING -
*
* @author author
* @version 0.0.1
* @since 2019-09-28
*/
public class Port {
/**
* VALUE -
*/
@TableField
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public Port(String value) {
this.value = value;
}
}

@ -0,0 +1,77 @@
package com.example.module.admin.ent;
import xyz.wbsite.wsqlite.anonation.TableField;
import java.util.Date;
import java.util.List;
/**
* MAPPING -
*
* @author author
* @version 0.0.1
* @since 2019-09-28
*/
public class Service {
/**
* VALUE - ID
*/
@TableField
private Long id;
/**
* VALUE -
*/
@TableField
private String value;
/**
* VALUE -
*/
@TableField
private String bz;
private List<Mapping> mappingList;
public List<Mapping> getMappingList() {
return mappingList;
}
public void setMappingList(List<Mapping> mappingList) {
this.mappingList = mappingList;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getBz() {
return bz;
}
public void setBz(String bz) {
this.bz = bz;
}
public Service() {
}
public Service(Long id, String value, String bz) {
this.id = id;
this.value = value;
this.bz = bz;
}
}

@ -0,0 +1,58 @@
package com.example.module.admin.mgr;
import freemarker.cache.ClassTemplateLoader;
import freemarker.cache.MultiTemplateLoader;
import freemarker.cache.TemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import org.springframework.util.ClassUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import java.io.*;
public class FreeMarkerManager {
private FreeMarkerConfigurer freeMarkerConfigurer;
public FreeMarkerManager() {
freeMarkerConfigurer = new FreeMarkerConfigurer();
// 初始化一些配置
Configuration cfg = new Configuration(Configuration.VERSION_2_3_28);
cfg.setDefaultEncoding("UTF-8");
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
cfg.setNumberFormat("0.##");
MultiTemplateLoader multiTemplateLoader = new MultiTemplateLoader(new TemplateLoader[]{
new ClassTemplateLoader(ClassUtils.getDefaultClassLoader(), "/modules"),
});
cfg.setTemplateLoader(multiTemplateLoader);
freeMarkerConfigurer.setConfiguration(cfg);
}
public void outputTemp(File outfile, String template, Object model) {
try {
if (!outfile.exists()) {
outfile.createNewFile();
}
//获取连接
Configuration configuration = freeMarkerConfigurer.getConfiguration();
//设置编码
configuration.setDefaultEncoding("UTF-8");
//获取ftl,由于已经在配置文件中配置了路径所以在这里直接写模板名称就可以
Template temp = configuration.getTemplate(template);
//输出文件路径
Writer wr = new OutputStreamWriter(new FileOutputStream(outfile),"UTF-8");
//写入
temp.process(model, wr);
//关闭流
wr.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
}
}

@ -20,6 +20,8 @@ import org.springframework.stereotype.Service;
import xyz.wbsite.wsqlite.ObjectClient;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
/**
* MAPPING -
@ -52,12 +54,16 @@ public class MappingManagerImpl implements MappingManager {
long id = IDgenerator.nextId();
Mapping entity = MapperUtil.map(request, Mapping.class);
entity.setId(id);
entity.setCreateTime(new Date());
try {
int insert = objectClient.insert(Mapping.class, entity);
System.out.println();
if (insert != 1) {
response.addError(ErrorType.BUSINESS_ERROR, "新增错误");
return response;
}
response.setId(id);
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
response.addError(ErrorType.BUSINESS_ERROR, "新增错误");
}
response.setId(id);
@ -79,6 +85,13 @@ public class MappingManagerImpl implements MappingManager {
return response;
}
try {
int update = objectClient.delete(Mapping.class, "ID = " + request.getId());
response.setResult((long) update);
} catch (SQLException | ClassNotFoundException e) {
response.addError(ErrorType.BUSINESS_ERROR, "删除错误");
}
return response;
}
@ -98,6 +111,14 @@ public class MappingManagerImpl implements MappingManager {
return response;
}
Mapping mapping = MapperUtil.map(request, Mapping.class);
try {
int update = objectClient.update(Mapping.class, mapping, "ID = " + mapping.getId());
response.setResult((long) update);
} catch (SQLException | ClassNotFoundException e) {
response.addError(ErrorType.BUSINESS_ERROR, "更新错误");
}
return response;
}
@ -117,6 +138,14 @@ public class MappingManagerImpl implements MappingManager {
return response;
}
try {
List<Mapping> select = objectClient.select(Mapping.class, 1, 0);
response.setResult(select);
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
response.addError(ErrorType.BUSINESS_ERROR, "Sqlite错误");
}
return response;
}
}

@ -23,6 +23,9 @@ public class MappingCreateRequest extends BaseRequest {
@NotNull(message = "映射名称不能为空")
private String name;
@NotNull(message = "服务Id不能为空")
private Long serviceId;
/**
* VALUE -
*/
@ -36,6 +39,14 @@ public class MappingCreateRequest extends BaseRequest {
*/
private String bz;
public Long getServiceId() {
return serviceId;
}
public void setServiceId(Long serviceId) {
this.serviceId = serviceId;
}
public String getName() {
return name;
}

@ -14,26 +14,13 @@ public class MappingFindRequest extends BaseFindRequest {
/**
*
*/
private String username;
private Long portId;
/**
*
*/
private String password;
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return this.password;
public Long getPortId() {
return portId;
}
public void setPassword(String password) {
this.password = password;
public void setPortId(Long portId) {
this.portId = portId;
}
}

@ -4,6 +4,7 @@ import com.example.frame.base.BaseUpdateRequest;
import javax.validation.constraints.NotNull;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
/**
* MappingUpdateRequest -
@ -20,39 +21,65 @@ public class MappingUpdateRequest extends BaseUpdateRequest {
@NotNull(message = "主键不能为NULL")
private Long id;
@NotNull(message = "服务Id不能为空")
private Long serviceId;
/**
*
* NAME -
*/
@Length(min = 0, max = 100, message = "用户名长度不合法(0-100)")
private String username;
@NotNull(message = "映射名称不能为空")
private String name;
/**
*
* VALUE -
*/
@Length(min = 0, max = 100, message = "用户密码长度不合法(0-100)")
private String password;
@NotNull(message = "映射值不能为空")
@Pattern(regexp = "[^/]*", message = "映射值不能存在/")
@Pattern(regexp = "\\w*", message = "映射值需为英文")
private String value;
public Long getId() {
return this.id;
/**
* BZ -
*/
private String bz;
public String getName() {
return name;
}
public void setId(Long id) {
this.id = id;
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public String getUsername() {
return this.username;
public void setValue(String value) {
this.value = value;
}
public void setUsername(String username) {
this.username = username;
public String getBz() {
return bz;
}
public void setBz(String bz) {
this.bz = bz;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getPassword() {
return this.password;
public Long getServiceId() {
return serviceId;
}
public void setPassword(String password) {
this.password = password;
public void setServiceId(Long serviceId) {
this.serviceId = serviceId;
}
}

@ -0,0 +1,8 @@
package com.example.module.admin.rsp;
import com.example.frame.base.BaseFindResponse;
import com.example.module.admin.ent.Service;
public class PortLoadResponse extends BaseFindResponse<Service> {
}

@ -1,5 +1,5 @@
# 开发环境
server.port=8080
server.service=8080
server.servlet.context-path=/
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
@ -37,7 +37,7 @@ spring.freemarker.expose-session-attributes=false
spring.freemarker.expose-spring-macro-helpers=false
spring.freemarker.settings.template_update_delay=1
spring.freemarker.settings.locale=zh_CN
spring.freemarker.settings.datetime_format=yyyy-MM-dd
spring.freemarker.settings.datetime_format=yyyy-MM-dd HH:mm:ss
spring.freemarker.settings.date_format=yyyy-MM-dd
spring.freemarker.settings.number_format=#.##
spring.freemarker.settings.classic_compatible=true

@ -1,5 +1,5 @@
# 生产环境
server.port=80
server.service=80
server.servlet.context-path=/
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:static/
@ -37,7 +37,7 @@ spring.freemarker.expose-session-attributes=false
spring.freemarker.expose-spring-macro-helpers=false
spring.freemarker.settings.template_update_delay=1
spring.freemarker.settings.locale=zh_CN
spring.freemarker.settings.datetime_format=yyyy-MM-dd
spring.freemarker.settings.datetime_format=yyyy-MM-dd HH:mm:ss
spring.freemarker.settings.date_format=yyyy-MM-dd
spring.freemarker.settings.number_format=#.##
spring.freemarker.settings.classic_compatible=true

@ -158,4 +158,10 @@ window.ajax = {
data: JSON.stringify(data),
})
},
portLoad: function(data) {
return jsonRequest({
method:"ajax.admin.port.load",
data: JSON.stringify(data),
})
},
}

@ -1,68 +1,81 @@
<div id="app" v-cloak>
<el-card class="box-card">
<el-form :inline="true" :model="vm" ref="vm" label-width="90px">
<el-form-item label="角色名称" prop="roleName">
<el-input v-model="vm.roleName" clearable size="small" placeholder=""></el-input>
</el-form-item>
<el-form-item label="角色代码" prop="roleCode">
<el-input v-model="vm.roleCode" clearable size="small" placeholder=""></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" size="small" icon="el-icon-search" @click="onSearch">搜索</el-button>
<el-button type="warning" size="small" icon="el-icon-refresh-left" @click="onReset('vm')">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="box-card control">
<el-row>
<el-col :span="3">
<a>Nginx 控制中心</a>
</el-col>
<el-col :span="2">
<a @click="nginxStart">
<el-image v-if="run" :src="'${Uri.getUrl('/static/img/start_.png')}'" style="width: 50px; height: 50px"
<el-image v-if="run" :src="'${Uri.getUrl('/static/img/start_.png')}'"
style="width: 50px; height: 50px"
fit="fill"></el-image>
<el-image v-if="!run" :src="'${Uri.getUrl('/static/img/start.png')}'" style="width: 50px; height: 50px"
<el-image v-if="!run" :src="'${Uri.getUrl('/static/img/start.png')}'"
style="width: 50px; height: 50px"
fit="fill"></el-image>
</a>
</el-col>
<el-col :span="2">
<a @click="nginxStop">
<el-image v-if="run" :src="'${Uri.getUrl('/static/img/stop.png')}'" style="width: 50px; height: 50px"
<el-image v-if="run" :src="'${Uri.getUrl('/static/img/stop.png')}'"
style="width: 50px; height: 50px"
fit="fill"></el-image>
<el-image v-if="!run" :src="'${Uri.getUrl('/static/img/stop_.png')}'" style="width: 50px; height: 50px"
<el-image v-if="!run" :src="'${Uri.getUrl('/static/img/stop_.png')}'"
style="width: 50px; height: 50px"
fit="fill"></el-image>
</a>
</el-col>
<el-col :span="2">
<a @click="nginxReload">
<el-image v-if="run" :src="'${Uri.getUrl('/static/img/reload.png')}'" style="width: 50px; height: 50px"
<el-image v-if="run" :src="'${Uri.getUrl('/static/img/reload.png')}'"
style="width: 50px; height: 50px"
fit="fill"></el-image>
<el-image v-if="!run" :src="'${Uri.getUrl('/static/img/reload_.png')}'" style="width: 50px; height: 50px"
<el-image v-if="!run" :src="'${Uri.getUrl('/static/img/reload_.png')}'"
style="width: 50px; height: 50px"
fit="fill"></el-image>
</a>
</el-col>
</el-row>
</el-card>
<el-card class="box-card" v-for="item in services">
<el-card class="box-card" v-for="item in services" :key="item.id">
<el-row>
<el-col :span="12">
<el-input size="small" v-model="item.port" placeholder="请输入端口" style="width: 250px;text-align: center" suffix-icon="el-icon-edit">
<el-col :span="5">
<el-input size="small" v-model="item.value" placeholder="请输入端口" style="width: 160px;text-align: center"
suffix-icon="el-icon-edit">
<template slot="prepend">端口</template>
<el-button type="warning" slot="append" icon="el-icon-refresh">应用</el-button>
</el-input>
</el-col>
<el-col :span="12">
<el-col :span="6">
<el-input size="small" v-model="item.bz" placeholder="请输入备注" style="width: 200px;text-align: center"
suffix-icon="el-icon-collection-tag">
<template slot="prepend">备注</template>
</el-input>
</el-col>
<el-col :span="2">
<el-button type="primary" size="small" icon="el-icon-refresh">保存</el-button>
</el-col>
<el-col :span="11">
<span style="float: right;">
<el-button type="success" size="small" icon="el-icon-plus" @click="onAction(['create',''])">新增
<el-button type="success" size="small" icon="el-icon-plus" @click="onAction(['create',item])">新增
</el-button>
<el-button type="warning" size="small" icon="el-icon-download">导出</el-button>
<el-button size="small" icon="el-icon-refresh" @click="onFind"></el-button>
</span>
<el-dialog :title="form.title" :visible.sync="form.dialog">
<el-form :model="form" :rules="formRules" ref="form" label-width="90px"
style="width: 290px;">
<el-form-item label="角色名称" prop="roleName">
<el-input v-model="form.roleName" clearable size="small" placeholder=""></el-input>
<el-form-item label="名称" prop="name">
<el-input v-model="form.name" clearable size="small" placeholder="简要描述"></el-input>
</el-form-item>
<el-form-item label="路径" prop="value">
<el-input v-model="form.value" clearable size="small" placeholder="字母数字组合">
<template slot="prepend">:{{form.port}}/</template>
</el-input>
</el-form-item>
<el-form-item label="角色代码" prop="roleCode">
<el-input v-model="form.roleCode" clearable size="small" placeholder=""></el-input>
<el-form-item label="备注" prop="bz">
<el-input type="textarea" v-model="form.bz" clearable size="small"
placeholder="备注信息"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
@ -74,68 +87,55 @@
</el-row>
<el-table
@selection-change="onSelectionChange"
empty-text="无数据"
:data="result"
size="small"
:data="item.mappingList.filter(data => !item.search || data.name.toLowerCase().includes(item.search.toLowerCase())|| data.value.toLowerCase().includes(item.search.toLowerCase()))"
style="width: 100%">
<el-table-column
align="center"
type="selection"
width="50">
</el-table-column>
<el-table-column
align="center"
prop="id"
label="主键"
width="140">
width="150px"
label="名称"
prop="name">
</el-table-column>
<el-table-column
align="center"
prop="roleName"
label="角色名称">
width="150px"
label="路径"
prop="value">
</el-table-column>
<el-table-column
align="center"
prop="roleCode"
label="角色代码">
width="150px"
label="创建日期"
prop="createTime">
</el-table-column>
<el-table-column
align="center"
prop="createTime"
label="创建时间">
label="备注"
prop="bz">
</el-table-column>
<el-table-column
align="center"
label="操作">
width="150px"
align="right">
<template slot="header" slot-scope="scope">
<el-input
v-model="item.search"
size="small"
placeholder="输入关键字搜索"/>
</template>
<template slot-scope="scope">
<el-dropdown size="mini" split-button type="primary" @click="onAction(['roleRes',scope.row])"
@command="onAction">
<i class="el-icon-edit"></i>编辑资源
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="['edit',scope.row]" icon="el-icon-edit">编辑</el-dropdown-item>
<el-dropdown-item :command="['delete',scope.row]" icon="el-icon-delete">删除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<el-button
size="mini"
@click="onAction(['edit',scope.row,item])">编辑
</el-button>
<el-button
size="mini"
type="danger"
@click="onAction('delete', scope.row)">删除
</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
v-if="vm.totalCount > vm.pageSize"
@current-change="onPage"
:current-page="vm.pageNumber"
:page-size="vm.pageSize"
layout="total, prev, pager, next, jumper"
:total="vm.totalCount">
</el-pagination>
</el-card>
</div>
<style>
#app {
padding: 10px;
width: 800px;
width: 900px;
}
.box-card {
@ -165,20 +165,13 @@
var app = new Vue({
el: "#app",
data: {
vm: {
roleName: '',
roleCode: '',
pageNumber: 1,
pageSize: 10,
totalCount: 0
},
form: {
title: "",
dialog: false,
id: '',
roleName: '',
roleCode: '',
rowVersion: ''
value: '',
name: '',
bz: ''
},
formRules: {
roleName: [
@ -190,53 +183,48 @@
{min: 1, max: 50, message: '长度在 1 到 50 个字符', trigger: 'blur'}
],
},
services: [
{port: "8080"}
],
select: [],
result: [],
services: [],
run: ${run?default('false')}
},
methods: {
onSearch: function () {
this.vm.pageNumber = 1;
this.onFind();
},
onReset: function (form) {
this.$refs[form].resetFields();
nav.w('重置成功');
},
onFind: function () {
ajax.mappingFind(this.vm).then(function (response) {
ajax.portLoad().then(function (response) {
if (response.errors.length > 0) {
nav.e(response.errors[0].message);
} else {
this.result = response.result;
this.totalCount = Number(response.totalCount);
for (var i in response.result) {
response.result[i].search = "";
}
this.services = response.result;
}
}.bind(this))
},
onPage: function (pageNumber) {
this.vm.pageNumber = pageNumber;
this.onFind();
},
onSelectionChange: function (select) {
this.select = select;
},
onAction: function (arg) {
const action = arg[0];
const item = arg[1];
switch (action) {
case "create":
this.form.title = '新增';
this.form.serviceId = arg[1].id;
this.form.port = arg[1].value;
this.form.id = '';
this.form.roleName = '';
this.form.roleCode = '';
this.form.name = '';
this.form.value = '';
this.form.bz = '';
this.form.dialog = true;
break;
case "edit":
this.form.title = '编辑';
this.form.id = arg[1].id;
this.form.serviceId = arg[1].serviceId;
this.form.port = arg[2].value;
this.form.name = arg[1].name;
this.form.value = arg[1].value;
this.form.bz = arg[1].bz;
this.form.dialog = true;
break;
case "save":
if (this.form.id) {
ajax.roleUpdate(this.form).then(function (response) {
ajax.mappingUpdate(this.form).then(function (response) {
if (response.errors.length > 0) {
nav.e(response.errors[0].message);
} else {
@ -245,7 +233,7 @@
}
}.bind(this))
} else {
ajax.roleCreate(this.form).then(function (response) {
ajax.mappingCreate(this.form).then(function (response) {
if (response.errors.length > 0) {
nav.e(response.errors[0].message);
} else {
@ -255,21 +243,13 @@
}.bind(this))
}
break;
case "edit":
this.form.title = '编辑';
this.form.id = item.id;
this.form.roleName = item.roleName;
this.form.roleCode = item.roleCode;
this.form.rowVersion = item.rowVersion;
this.form.dialog = true;
break;
case "delete":
this.$confirm('将删除该项, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(function () {
ajax.roleDelete({id: item.id}).then(function (response) {
ajax.mappingDelete({id: arg[1].id}).then(function (response) {
if (response.errors.length > 0) {
nav.e(response.errors[0].message);
} else {

@ -3,9 +3,12 @@ package com.example.mapping;
import com.example.frame.base.Token;
import com.example.frame.utils.IDgenerator;
import com.example.frame.utils.LocalData;
import com.example.module.admin.ent.Mapping;
import com.example.module.admin.mgr.MappingManager;
import com.example.module.admin.req.MappingCreateRequest;
import com.example.module.admin.req.MappingFindRequest;
import com.example.module.admin.rsp.MappingCreateResponse;
import com.example.module.admin.rsp.MappingFindResponse;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
@ -30,9 +33,11 @@ public class MappingTest {
createRequest.setName("测试");
createRequest.setValue("test");
MappingCreateResponse mappingCreateResponse = mappingManager.create(createRequest, token);
assertTrue(!mappingCreateResponse.hasError());
MappingFindRequest mappingFindRequest = new MappingFindRequest();
MappingFindResponse mappingFindResponse = mappingManager.find(mappingFindRequest, token);
assertTrue(!mappingFindResponse.hasError());
}
}

@ -1,5 +1,5 @@
# 测试环境
server.port=8080
server.service=8080
server.servlet.context-path=/
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:static/

@ -5,6 +5,7 @@ import xyz.wbsite.wsqlite.anonation.TableField;
import java.io.File;
import java.lang.reflect.Field;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
@ -231,7 +232,9 @@ public class ObjectClient extends Client {
}
//分页参数
if(pageSize > 0){
sql.append(" LIMIT " + (pageNumber - 1) + "," + pageSize);
}
System.out.println("SQL ==> " + sql.toString());
list.addAll(executeQuery(sql.toString(), poClass));
@ -297,7 +300,7 @@ public class ObjectClient extends Client {
byte[] v = resultSet.getBytes(f.getName());
f.set(o, v);
} else if (f.getType() == Date.class) {
Date v = resultSet.getDate(f.getName());
Date v = resultSet.getTimestamp(f.getName());
f.set(o, v);
} else {
String v = resultSet.getString(f.getName());

Loading…
Cancel
Save

Powered by TurnKey Linux.