diff --git a/admin/src/main/java/com/example/action/AjaxController.java b/admin/src/main/java/com/example/action/AjaxController.java index 6daa4aa..47d55d2 100644 --- a/admin/src/main/java/com/example/action/AjaxController.java +++ b/admin/src/main/java/com/example/action/AjaxController.java @@ -8,32 +8,28 @@ 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.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.req.*; +import com.example.module.admin.rsp.LoginResponse; 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.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; -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.web.servlet.view.freemarker.FreeMarkerConfigurer; import xyz.wbsite.wsqlite.ObjectClient; +import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.HashMap; import java.util.List; @@ -48,6 +44,10 @@ public class AjaxController { private ObjectClient objectClient; @Autowired private FreeMarkerConfigurer freeMarkerConfigurer; + @Value("${admin.username}") + private String username; + @Value("${admin.password}") + private String password; @RequestMapping("/ajax") @ResponseBody @@ -74,8 +74,8 @@ public class AjaxController { jsonString = in.readLine(); switch (method) { - // 示例 - case "ajax.example.example": + case "ajax.login": + baseResponse = login(jsonString, token); break; case "nginx.start": baseResponse = nginxStart(jsonString, token); @@ -89,22 +89,25 @@ public class AjaxController { // 创建映射 case "ajax.admin.mapping.create": baseResponse = createMapping(jsonString, token); + flushConfig(); break; // 删除映射 case "ajax.admin.mapping.delete": baseResponse = deleteMapping(jsonString, token); + flushConfig(); break; // 修改映射 case "ajax.admin.mapping.update": baseResponse = updateMapping(jsonString, token); + flushConfig(); break; - // 查询映射 - case "ajax.admin.mapping.find": - baseResponse = findMapping(jsonString, token); - break; - case "ajax.admin.port.load": + case "ajax.admin.service.load": baseResponse = loadPort(jsonString, token); break; + case "ajax.admin.config.flush": + flushConfig(); + baseResponse = new BaseResponse(); + break; default: baseResponse.addError(ErrorType.INVALID_PARAMETER, Message.NOT_EXIST_METHOD); break; @@ -122,6 +125,29 @@ public class AjaxController { return baseResponse; } + private BaseResponse login(String jsonString, Token token) { + LoginRequest loginRequest = MapperUtil.toJava(jsonString, LoginRequest.class); + LoginResponse loginResponse = new LoginResponse(); + ValidationUtil.validate(loginRequest, loginResponse); + if (loginResponse.hasError()) { + return loginResponse; + } + if (!loginRequest.getUsername().endsWith(username)) { + loginResponse.addError(ErrorType.BUSINESS_ERROR, "用户不存在!"); + return loginResponse; + } + + if (!loginRequest.getPassword().endsWith(password)) { + loginResponse.addError(ErrorType.BUSINESS_ERROR, "密码错误!"); + return loginResponse; + } + + String yyyyMMdd = new SimpleDateFormat("yyyyMMdd").format(new Date()); + String encode = MD5Util.encode(yyyyMMdd + username + password); + LocalData.getResponse().addCookie(new Cookie("token", encode)); + return loginResponse; + } + private BaseResponse nginxStart(String jsonString, Token token) { BaseResponse baseResponse = new BaseResponse(); if (nginxCtrl.isRunning()) { @@ -142,7 +168,7 @@ public class AjaxController { return baseResponse; } - private BaseResponse nginxReload(String jsonString, Token token) { + private synchronized BaseResponse nginxReload(String jsonString, Token token) { BaseResponse baseResponse = new BaseResponse(); if (!nginxCtrl.isRunning()) { baseResponse.addError(ErrorType.BUSINESS_ERROR, "程序尚未运行"); @@ -194,7 +220,7 @@ public class AjaxController { for (Service service : select) { MappingFindRequest mappingFindRequest = new MappingFindRequest(); - mappingFindRequest.setPortId(service.getId()); + mappingFindRequest.setServiceId(service.getId()); mappingFindRequest.setPageSize(0); MappingFindResponse mappingFindResponse = mappingManager.find(mappingFindRequest, token); if (mappingFindResponse.hasError()) { @@ -212,14 +238,14 @@ public class AjaxController { return response; } - private void flushConfig() { + private synchronized void flushConfig() { Writer wr = null; try { File config = nginxCtrl.getConfig(); HashMap context = new HashMap<>(); PortLoadResponse portLoadResponse = (PortLoadResponse) loadPort("", LocalData.getSysToken()); - context.put("services",portLoadResponse.getResult()); + context.put("services", portLoadResponse.getResult()); Template template = freeMarkerConfigurer.getConfiguration().getTemplate("nginx.conf.ftl"); wr = new OutputStreamWriter(new FileOutputStream(config), "UTF-8"); //写入 diff --git a/admin/src/main/java/com/example/config/NginxConfig.java b/admin/src/main/java/com/example/config/NginxConfig.java index 6e1a151..6ef1480 100644 --- a/admin/src/main/java/com/example/config/NginxConfig.java +++ b/admin/src/main/java/com/example/config/NginxConfig.java @@ -43,7 +43,7 @@ public class NginxConfig { nginxHome = new File(jarFile.getParent(), "nginx"); if (!nginxHome.exists()) { - ClassPathResource classPathResource = new ClassPathResource("nginx-1.14.2.zip"); + ClassPathResource classPathResource = new ClassPathResource("nginx-1.16.1.zip"); try { InputStream inputStream = classPathResource.getInputStream(); File nginxDir = new File(jarFile.getParent(), "nginx"); diff --git a/admin/src/main/java/com/example/config/SecurityConfig.java b/admin/src/main/java/com/example/config/SecurityConfig.java index 41de383..b720052 100644 --- a/admin/src/main/java/com/example/config/SecurityConfig.java +++ b/admin/src/main/java/com/example/config/SecurityConfig.java @@ -1,5 +1,6 @@ package com.example.config; +import com.example.frame.utils.MD5Util; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -12,7 +13,11 @@ import org.springframework.security.core.Authentication; import com.example.frame.base.Token; import com.example.frame.utils.CookieUtil; import com.example.frame.utils.LocalData; + +import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; +import java.text.SimpleDateFormat; +import java.util.Date; @Configuration @EnableGlobalMethodSecurity(securedEnabled = true) @@ -21,6 +26,10 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { private String[] excluded; @Value("${spring.mvc.static-path-pattern}") private String[] staticPath; + @Value("${admin.username}") + private String username; + @Value("${admin.password}") + private String password; @Override protected void configure(HttpSecurity http) throws Exception { @@ -36,7 +45,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { /** * 此方法不要删除 用于屏蔽默认用户密码生成 - * + *

* 例如 Using generated security password: f6b42a66-71b1-4c31-b6a8-942838c81408 * * @return @@ -54,25 +63,38 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { // 获取Token String token = request.getParameter("token"); - if (token == null || token.isEmpty()){ + if (token == null || token.isEmpty()) { token = CookieUtil.getCookieValue(request.getCookies(), "token"); } + String yyyyMMdd = new SimpleDateFormat("yyyyMMdd").format(new Date()); + String encode = MD5Util.encode(yyyyMMdd + username + password); + if (token == null) { LocalData.setToken(LocalData.getTempToken()); - }else { - // 组装Token ~ 这边根据实际的业务组装Token + } else if (!encode.equals(token)) { + LocalData.setToken(LocalData.getTempToken()); + } else { Token token1 = new Token(); token1.setId(1L); token1.setUserId(1L); - token1.setUserName("admin"); - //继承临时Token - token1.addResourceSet(LocalData.getTempToken()); - //管理员特有资源(这边请用正则表达式) - token1.putResource("/admin/.*\\.htm"); + token1.setUserName(username); + token1.putResource("/"); + token1.putResource("/mapping.htm"); + token1.putResource("/sse/.*"); + token1.putResource("/ajax"); + token1.putResource("ajax.login"); + token1.putResource("nginx.start"); + token1.putResource("nginx.stop"); + token1.putResource("nginx.reload"); + token1.putResource("ajax.admin.mapping.create"); + token1.putResource("ajax.admin.mapping.delete"); + token1.putResource("ajax.admin.mapping.update"); + token1.putResource("ajax.admin.service.load"); + token1.putResource("ajax.admin.config.flush"); LocalData.setToken(token1); } - + String servletPath = request.getServletPath(); // 授权 Token token_ = LocalData.getToken(); if (token_.hasResource(request.getServletPath())) { diff --git a/admin/src/main/java/com/example/frame/utils/LocalData.java b/admin/src/main/java/com/example/frame/utils/LocalData.java index 0903dfa..6cee16a 100644 --- a/admin/src/main/java/com/example/frame/utils/LocalData.java +++ b/admin/src/main/java/com/example/frame/utils/LocalData.java @@ -28,13 +28,9 @@ public class LocalData { temp.setId(-1); temp.setUserId(-1); temp.setUserName("游客"); - temp.putResource("/"); + temp.putResource("/login.htm"); temp.putResource("/ajax"); - temp.putResource("/upload"); - temp.putResource("/index.htm"); - temp.putResource("/home.htm"); - temp.putResource("/app.htm"); - temp.putResource(".*"); + temp.putResource("ajax.login"); system = new Token(); system.setId(0); system.setUserId(0); diff --git a/admin/src/main/java/com/example/module/admin/ent/Mapping.java b/admin/src/main/java/com/example/module/admin/ent/Mapping.java index 2c6439e..249ff87 100644 --- a/admin/src/main/java/com/example/module/admin/ent/Mapping.java +++ b/admin/src/main/java/com/example/module/admin/ent/Mapping.java @@ -30,6 +30,8 @@ public class Mapping { @TableField private String context; @TableField + private String type; + @TableField private String location; @TableField private String bz; @@ -38,6 +40,14 @@ public class Mapping { @TableField private boolean isDeleted; + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + public Long getServiceId() { return serviceId; } diff --git a/admin/src/main/java/com/example/module/admin/mgr/MappingManagerImpl.java b/admin/src/main/java/com/example/module/admin/mgr/MappingManagerImpl.java index d133c6a..e3e0df1 100644 --- a/admin/src/main/java/com/example/module/admin/mgr/MappingManagerImpl.java +++ b/admin/src/main/java/com/example/module/admin/mgr/MappingManagerImpl.java @@ -51,6 +51,20 @@ public class MappingManagerImpl implements MappingManager { return response; } + try { + Mapping where = new Mapping(); + where.setContext(request.getContext()); + List select = objectClient.select(Mapping.class, 1, 0, "SERVICEID = " + request.getServiceId()+" AND CONTEXT =" +request.getContext()); + + if (select.size() > 0) { + + } + + } catch (SQLException | ClassNotFoundException e) { + response.addError(ErrorType.BUSINESS_ERROR, "Sqlite错误"); + return response; + } + long id = IDgenerator.nextId(); Mapping entity = MapperUtil.map(request, Mapping.class); entity.setId(id); @@ -139,7 +153,7 @@ public class MappingManagerImpl implements MappingManager { } try { - List select = objectClient.select(Mapping.class, 1, 0); + List select = objectClient.select(Mapping.class, 1, 0, "SERVICEID=" + request.getServiceId()); response.setResult(select); } catch (SQLException | ClassNotFoundException e) { e.printStackTrace(); diff --git a/admin/src/main/java/com/example/module/admin/req/LoginRequest.java b/admin/src/main/java/com/example/module/admin/req/LoginRequest.java new file mode 100644 index 0000000..b3a7e05 --- /dev/null +++ b/admin/src/main/java/com/example/module/admin/req/LoginRequest.java @@ -0,0 +1,38 @@ +package com.example.module.admin.req; + +import com.example.frame.base.BaseRequest; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; + +/** + * MappingCreateRequest - 映射新增 + * + * @author author + * @version 0.0.1 + * @since 2019-09-28 + */ +public class LoginRequest extends BaseRequest { + + @NotNull(message = "用户名不能为空") + private String username; + + @NotNull(message = "密码不能为空") + private String password; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/admin/src/main/java/com/example/module/admin/req/MappingCreateRequest.java b/admin/src/main/java/com/example/module/admin/req/MappingCreateRequest.java index cce23d7..b3ccba2 100644 --- a/admin/src/main/java/com/example/module/admin/req/MappingCreateRequest.java +++ b/admin/src/main/java/com/example/module/admin/req/MappingCreateRequest.java @@ -18,29 +18,22 @@ import xyz.wbsite.wsqlite.anonation.TableField; */ public class MappingCreateRequest extends BaseRequest { - /** - * NAME - 映射名称 - */ @NotNull(message = "映射名称不能为空") private String name; @NotNull(message = "服务Id不能为空") private Long serviceId; - /** - * VALUE - 映射值 - */ - @NotNull(message = "映射值不能为空") - @Pattern(regexp = "[^/]*", message = "映射值不能存在/") - @Pattern(regexp = "\\w*", message = "映射值需为英文") + @NotNull(message = "映射路径不能为空") + @Pattern(regexp = "^/[a-zA-Z][a-zA-Z0-9_-]*$|^[A-Z]:/.*$|^/$", message = "映射路径须是(/)或(/+字母+字母数字及_") private String context; - @TableField + @NotNull(message = "映射类型不能为空") + private String type; + + @NotNull(message = "映射地址不能为空") private String location; - /** - * BZ - 备注 - */ private String bz; public Long getServiceId() { @@ -63,6 +56,14 @@ public class MappingCreateRequest extends BaseRequest { return context; } + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + public void setContext(String context) { this.context = context; } diff --git a/admin/src/main/java/com/example/module/admin/req/MappingFindRequest.java b/admin/src/main/java/com/example/module/admin/req/MappingFindRequest.java index d05cfa5..7ef5704 100644 --- a/admin/src/main/java/com/example/module/admin/req/MappingFindRequest.java +++ b/admin/src/main/java/com/example/module/admin/req/MappingFindRequest.java @@ -14,13 +14,13 @@ public class MappingFindRequest extends BaseFindRequest { /** * 用户名 */ - private Long portId; + private Long serviceId; - public Long getPortId() { - return portId; + public Long getServiceId() { + return serviceId; } - public void setPortId(Long portId) { - this.portId = portId; + public void setServiceId(Long serviceId) { + this.serviceId = serviceId; } } diff --git a/admin/src/main/java/com/example/module/admin/req/MappingUpdateRequest.java b/admin/src/main/java/com/example/module/admin/req/MappingUpdateRequest.java index a1c0c77..6043828 100644 --- a/admin/src/main/java/com/example/module/admin/req/MappingUpdateRequest.java +++ b/admin/src/main/java/com/example/module/admin/req/MappingUpdateRequest.java @@ -19,37 +19,35 @@ import javax.validation.constraints.Pattern; */ public class MappingUpdateRequest extends BaseUpdateRequest { - /** - * 主键 - */ @NotNull(message = "主键不能为NULL") private Long id; @NotNull(message = "服务Id不能为空") private Long serviceId; - /** - * NAME - 映射名称 - */ @NotNull(message = "映射名称不能为空") private String name; - /** - * VALUE - 映射值 - */ - @NotNull(message = "映射值不能为空") - @Pattern(regexp = "[^/]*", message = "映射值不能存在/") - @Pattern(regexp = "\\w*", message = "映射值需为英文") + @NotNull(message = "映射路径不能为空") + @Pattern(regexp = "^/[a-zA-Z][a-zA-Z0-9_-]*$|^[A-Z]:/.*$|^/$", message = "映射路径须是(/)或(/+字母+字母数字及_") private String context; - @TableField + @NotNull(message = "映射类型不能为空") + private String type; + + @NotNull(message = "映射地址不能为空") private String location; - /** - * BZ - 备注 - */ private String bz; + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + public String getName() { return name; } diff --git a/admin/src/main/java/com/example/module/admin/rsp/LoginResponse.java b/admin/src/main/java/com/example/module/admin/rsp/LoginResponse.java new file mode 100644 index 0000000..fe40dae --- /dev/null +++ b/admin/src/main/java/com/example/module/admin/rsp/LoginResponse.java @@ -0,0 +1,9 @@ +package com.example.module.admin.rsp; + +import com.example.frame.base.BaseResponse; + + +public class LoginResponse extends BaseResponse { + + +} diff --git a/admin/src/main/resources/application-dev.properties b/admin/src/main/resources/application-dev.properties index 5bb2254..6e8516e 100644 --- a/admin/src/main/resources/application-dev.properties +++ b/admin/src/main/resources/application-dev.properties @@ -12,9 +12,9 @@ spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true server.tomcat.uri-encoding=UTF-8 # 根路径、欢迎页 -web.welcome.page=/index.htm +web.welcome.page=/mapping.htm # 不需要验证授权, 或该请求有自己的验证机制 -web.url.auth.excluded=/favicon.ico,/static/**,/api,/login.htm,/mapping.htm,/sse/** +web.url.auth.excluded=/favicon.ico,/static/**,/api,/login.htm,/sse/** # 日志配置 logging.path=D:// logging.levels=DEBUG @@ -48,4 +48,6 @@ spring.servlet.multipart.resolveLazily=false spring.servlet.multipart.max-file-size=100MB spring.servlet.multipart.max-request-size=100MB dbpath= -nginx-path= \ No newline at end of file +nginx-path= +admin.username=admin +admin.password=admin \ No newline at end of file diff --git a/admin/src/main/resources/application-prod.properties b/admin/src/main/resources/application-prod.properties index 6eee83f..0a5e2d2 100644 --- a/admin/src/main/resources/application-prod.properties +++ b/admin/src/main/resources/application-prod.properties @@ -12,7 +12,7 @@ spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true server.tomcat.uri-encoding=UTF-8 # 根路径、欢迎页 -web.welcome.page=/index.htm +web.welcome.page=/mapping.htm # 不需要验证授权, 或该请求有自己的验证机制 web.url.auth.excluded=/favicon.ico,/static/**,/api,/login.htm # 日志配置 diff --git a/admin/src/main/resources/nginx-1.16.1.zip b/admin/src/main/resources/nginx-1.16.1.zip new file mode 100644 index 0000000..492c072 Binary files /dev/null and b/admin/src/main/resources/nginx-1.16.1.zip differ diff --git a/admin/src/main/resources/static/js/ajax.js b/admin/src/main/resources/static/js/ajax.js index dcfdf31..0654fe3 100644 --- a/admin/src/main/resources/static/js/ajax.js +++ b/admin/src/main/resources/static/js/ajax.js @@ -97,9 +97,9 @@ fileRequest = function (config) { }) }; window.ajax = { - example: function (data) { + login: function (data) { return jsonRequest({ - method: "ajax.example.example", + method: "ajax.login", data: data }) }, @@ -146,21 +146,15 @@ window.ajax = { data: JSON.stringify(data), }) }, - mappingFind: function (data) { + serviceLoad: function(data) { return jsonRequest({ - method:"ajax.admin.mapping.find", + method:"ajax.admin.service.load", data: JSON.stringify(data), }) }, - mappingGet: function(data) { + configFlush: function(data) { return jsonRequest({ - method:"ajax.admin.mapping.get", - data: JSON.stringify(data), - }) - }, - portLoad: function(data) { - return jsonRequest({ - method:"ajax.admin.port.load", + method:"ajax.admin.config.flush", data: JSON.stringify(data), }) }, diff --git a/admin/src/main/resources/templates/nginx.conf.ftl b/admin/src/main/resources/templates/nginx.conf.ftl index 5cbbb6d..a16901d 100644 --- a/admin/src/main/resources/templates/nginx.conf.ftl +++ b/admin/src/main/resources/templates/nginx.conf.ftl @@ -17,12 +17,24 @@ events { http { include mime.types; default_type application/octet-stream; + + #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + # '$status $body_bytes_sent "$http_referer" ' + # '"$http_user_agent" "$http_x_forwarded_for"'; + + #access_log logs/access.log main; + sendfile on; - keepalive_timeout 65; + #tcp_nopush on; + + #keepalive_timeout 0; + keepalive_timeout 65; + + #gzip on; <#list services as item> server { - listen 8888; + listen ${item.value}; server_name localhost; #charset koi8-r; @@ -30,26 +42,23 @@ http { #access_log logs/host.access.log main; <#list item.mappingList as mapping> - location /${mapping.context} { - proxy_pass ${mapping.location}; - proxy_redirect off; +<#if mapping.type="HTTP"> + location ${mapping.context} { + proxy_pass ${mapping.location}; proxy_set_header Host $remote_addr:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header request_uri $scheme://$remote_addr:$server_port$request_uri; - proxy_set_header proxy_context /${mapping.context}; - client_max_body_size 50m; - client_body_buffer_size 128k; - proxy_connect_timeout 300; - proxy_send_timeout 300; - proxy_read_timeout 300; - proxy_buffer_size 4k; - proxy_buffers 4 32k; - proxy_busy_buffers_size 64k; - proxy_temp_file_write_size 64k; + proxy_set_header proxy_context ${mapping.context}; index index.html index.htm index.jsp index.do; - } +<#elseif mapping.type="FILE"> + location ${mapping.context} { + root ${mapping.location}; + index index.html index.htm; + autoindex on; + } + error_page 500 502 503 504 /50x.html; diff --git a/admin/src/main/resources/templates/screen/login.ftl b/admin/src/main/resources/templates/screen/login.ftl index 69d58ca..4ae424b 100644 --- a/admin/src/main/resources/templates/screen/login.ftl +++ b/admin/src/main/resources/templates/screen/login.ftl @@ -4,9 +4,9 @@

系统登录
- - - + + + @@ -95,11 +95,11 @@ el: "#app", data: { form: { - name: '', + username: '', password: '' }, rules: { - name: [ + username: [ {required: true, message: '请输入用户名', trigger: 'blur'} ], password: [ @@ -116,11 +116,14 @@ this.$refs[formName].validate(function (valid) { if (valid) { this.isLogin = true; - setTimeout(function(){ - nav.i("登录成功!", function () { - location.href = "/index.htm" - }); - },1000) + ajax.login(this.form).then(function (response) { + this.isLogin = false; + if (response.errors.length > 0) { + nav.e(response.errors[0].message); + } else { + location.href = "/" + } + }.bind(this)) } else { return false; } diff --git a/admin/src/main/resources/templates/screen/mapping.ftl b/admin/src/main/resources/templates/screen/mapping.ftl index 3afd5b9..dbfc922 100644 --- a/admin/src/main/resources/templates/screen/mapping.ftl +++ b/admin/src/main/resources/templates/screen/mapping.ftl @@ -5,7 +5,7 @@ Nginx 控制中心 - + - - - - - + - + @@ -55,37 +51,12 @@ 保存 - + 新增 - + - - - - - - - - - - - - - - - - - - - - 取 消 - 保存 - - @@ -108,12 +79,12 @@ @@ -143,17 +114,75 @@ 删除 + @click="onAction(['delete', scope.row])">删除 + + + + + + + + + + + + + + + + + + + + + + HTTP + FILE + + + + + + + + + + + + + + + + + + + + + + + 取 消 + 保存 + +