package com.example.action; 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.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.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.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.sql.SQLException; import java.util.HashMap; import java.util.List; @Controller public class AjaxController { @Autowired private MappingManager mappingManager; @Autowired private NginxCtrl nginxCtrl; @Autowired private ObjectClient objectClient; @Autowired private FreeMarkerConfigurer freeMarkerConfigurer; @RequestMapping("/ajax") @ResponseBody public BaseResponse ajax(@RequestParam("method") String method, HttpServletRequest request, HttpServletResponse response) { BaseResponse baseResponse = new BaseResponse(); String jsonString = null; try { if (method == null) { baseResponse.addError(new Error(ErrorType.BUSINESS_ERROR, "请求方法不能为空!")); return baseResponse; } Token token = LocalData.getToken(); if (token == null) { token = LocalData.getTempToken(); } if (!token.hasResource(method)) { baseResponse.addError(new Error(ErrorType.BUSINESS_ERROR, "无权调用该接口!")); return baseResponse; } InputStreamReader isr = new InputStreamReader(request.getInputStream(), "UTF-8"); BufferedReader in = new BufferedReader(isr); jsonString = in.readLine(); switch (method) { // 示例 case "ajax.example.example": break; case "nginx.start": baseResponse = nginxStart(jsonString, token); break; case "nginx.stop": baseResponse = nginxStop(jsonString, token); break; case "nginx.reload": baseResponse = nginxReload(jsonString, token); break; // 创建映射 case "ajax.admin.mapping.create": baseResponse = createMapping(jsonString, token); break; // 删除映射 case "ajax.admin.mapping.delete": baseResponse = deleteMapping(jsonString, token); break; // 修改映射 case "ajax.admin.mapping.update": baseResponse = updateMapping(jsonString, token); break; // 查询映射 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; } } catch (Exception ex) { baseResponse.addError(ErrorType.SYSTEM_ERROR, Message.ERROR_500); LogUtil.dumpException(ex); } finally { if (baseResponse.hasError()) { LogUtil.e("请求方法" + method + ", 请求参数:" + jsonString); LogUtil.e("返回结果包含异常" + MapperUtil.toJson(baseResponse)); } } return baseResponse; } private BaseResponse nginxStart(String jsonString, Token token) { BaseResponse baseResponse = new BaseResponse(); if (nginxCtrl.isRunning()) { baseResponse.addError(ErrorType.BUSINESS_ERROR, "程序已经运行"); return baseResponse; } ProcessUtil.execBat(nginxCtrl.getStartCmd()); return baseResponse; } private BaseResponse nginxStop(String jsonString, Token token) { BaseResponse baseResponse = new BaseResponse(); if (!nginxCtrl.isRunning()) { baseResponse.addError(ErrorType.BUSINESS_ERROR, "程序尚未运行"); return baseResponse; } ProcessUtil.execBat(nginxCtrl.getStopCmd()); return baseResponse; } private BaseResponse nginxReload(String jsonString, Token token) { BaseResponse baseResponse = new BaseResponse(); if (!nginxCtrl.isRunning()) { baseResponse.addError(ErrorType.BUSINESS_ERROR, "程序尚未运行"); return baseResponse; } ProcessUtil.execBat(nginxCtrl.getReloadCmd()); return baseResponse; } /** * 创建映射 */ private BaseResponse createMapping(String jsonString, Token token) { MappingCreateRequest request = MapperUtil.toJava(jsonString, MappingCreateRequest.class); return mappingManager.create(request, token); } /** * 删除映射 */ private BaseResponse deleteMapping(String jsonString, Token token) { MappingDeleteRequest request = MapperUtil.toJava(jsonString, MappingDeleteRequest.class); return mappingManager.delete(request, token); } /** * 修改映射 */ private BaseResponse updateMapping(String jsonString, Token token) { MappingUpdateRequest request = MapperUtil.toJava(jsonString, MappingUpdateRequest.class); return mappingManager.update(request, token); } /** * 查询映射 */ private BaseResponse findMapping(String jsonString, Token token) { MappingFindRequest request = MapperUtil.toJava(jsonString, MappingFindRequest.class); return mappingManager.find(request, token); } private BaseResponse loadPort(String jsonString, Token token) { PortLoadResponse response = new PortLoadResponse(); try { List 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 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(); } } }