From 50ea6870dc79b4459be941436fdfb91a2c3b3467 Mon Sep 17 00:00:00 2001 From: mcy Date: Thu, 11 Jul 2019 15:07:57 +0800 Subject: [PATCH] modify --- canal-admin/canal-admin-server/pom.xml | 6 +- .../otter/canal/admin/config/WebConfig.java | 116 ++++++++++++++++++ .../controller/CanalConfigController.java | 9 +- .../admin/controller/UserController.java | 57 +++++++++ .../otter/canal/admin/model/BaseModel.java | 38 ++++++ .../alibaba/otter/canal/admin/model/User.java | 68 ++++++++++ canal-admin/canal-admin-ui/.env.development | 2 +- canal-admin/canal-admin-ui/.env.production | 2 +- canal-admin/canal-admin-ui/src/main.js | 8 +- .../canal-admin-ui/src/router/index.js | 22 ++++ canal-admin/canal-admin-ui/src/settings.js | 6 +- .../canal-admin-ui/src/utils/request.js | 2 +- .../canal-admin-ui/src/views/form/index.vue | 2 +- canal-admin/pom.xml | 5 + 14 files changed, 327 insertions(+), 16 deletions(-) create mode 100644 canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/config/WebConfig.java create mode 100644 canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/controller/UserController.java create mode 100644 canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/model/BaseModel.java create mode 100644 canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/model/User.java diff --git a/canal-admin/canal-admin-server/pom.xml b/canal-admin/canal-admin-server/pom.xml index 165b1cf5..65a2da76 100644 --- a/canal-admin/canal-admin-server/pom.xml +++ b/canal-admin/canal-admin-server/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot - spring-boot-starter-webflux + spring-boot-starter-web org.springframework.boot @@ -29,6 +29,10 @@ commons-dbutils commons-dbutils + + com.github.ben-manes.caffeine + caffeine + diff --git a/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/config/WebConfig.java b/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/config/WebConfig.java new file mode 100644 index 00000000..80a8df70 --- /dev/null +++ b/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/config/WebConfig.java @@ -0,0 +1,116 @@ +package com.alibaba.otter.canal.admin.config; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.alibaba.otter.canal.admin.controller.UserController; +import com.alibaba.otter.canal.admin.model.BaseModel; +import com.alibaba.otter.canal.admin.model.User; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.io.PrintWriter; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new HandlerInterceptor() { + + @Override + public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, + Object o) throws Exception { + httpServletResponse.setHeader("Access-Control-Allow-Origin", "*"); + httpServletResponse.setHeader("Access-Control-Allow-Methods", "*"); + httpServletResponse.setHeader("Access-Control-Allow-Headers", + "Origin, X-Requested-With, Content-Type, Accept, Authorization, X-Token"); + httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true"); + httpServletResponse.setHeader("Access-Control-Max-Age", String.valueOf(3600 * 24)); + + if (HttpMethod.OPTIONS.toString().equals(httpServletRequest.getMethod())) { + httpServletResponse.setStatus(HttpStatus.NO_CONTENT.value()); + return false; + } + + return true; + } + }).addPathPatterns("/api/**"); + + registry.addInterceptor(new HandlerInterceptor() { + + @Override + public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, + Object o) throws Exception { + String token = httpServletRequest.getHeader("X-Token"); + boolean valid = false; + if (token != null) { + User user = UserController.loginUsers.getIfPresent(token); + if (user != null) { + valid = true; + } + } + if (!valid) { + BaseModel baseModel = BaseModel.getInstance(null); + baseModel.setCode(50014); + baseModel.setMessage("Expired token"); + ObjectMapper mapper = new ObjectMapper(); + String json = mapper.writeValueAsString(baseModel); + try { + httpServletResponse.setContentType("application/json;charset=UTF-8"); + PrintWriter out = httpServletResponse.getWriter(); + out.print(json); + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } + + return true; + } + }).addPathPatterns("/api/**").excludePathPatterns("/api/**/user/**"); + } + + /** + * 跨域支持 + * + * @param registry + */ + // @Override + // public void addCorsMappings(CorsRegistry registry) { + // registry.addMapping("/api") + // .allowedOrigins("http://127.0.0.1") + // .allowCredentials(true) + // .allowedMethods("*") + // .allowedHeaders("Origin, X-Requested-With, Content-Type, Accept, + // Authorization") + // .maxAge(3600 * 24); + // } + + /** + * 添加静态资源--过滤swagger-api (开源的在线API文档) + * + * @param registry + */ + // @Override + // public void addResourceHandlers(ResourceHandlerRegistry registry) { + // // 过滤swagger + // registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); + // + // registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); + // + // registry.addResourceHandler("/swagger-resources/**") + // .addResourceLocations("classpath:/META-INF/resources/swagger-resources/"); + // + // registry.addResourceHandler("/swagger/**").addResourceLocations("classpath:/META-INF/resources/swagger*"); + // + // registry.addResourceHandler("/v2/api-docs/**") + // .addResourceLocations("classpath:/META-INF/resources/v2/api-docs/"); + // + // } +} diff --git a/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/controller/CanalConfigController.java b/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/controller/CanalConfigController.java index f56cecad..9342cea3 100644 --- a/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/controller/CanalConfigController.java +++ b/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/controller/CanalConfigController.java @@ -1,5 +1,6 @@ package com.alibaba.otter.canal.admin.controller; +import com.alibaba.otter.canal.admin.model.BaseModel; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @@ -10,14 +11,14 @@ import com.alibaba.otter.canal.admin.model.CanalConfig; import com.alibaba.otter.canal.admin.service.CanalConfigService; @RestController -@RequestMapping("/api/{env}/config") +@RequestMapping("/api/{env}/canal") public class CanalConfigController { @Autowired CanalConfigService canalConfigService; - @RequestMapping(value = "/canal", method = RequestMethod.GET) - public CanalConfig canalConfig(@PathVariable String env) { - return canalConfigService.getCanalConfig(); + @RequestMapping(value = "/config", method = RequestMethod.GET) + public BaseModel canalConfig(@PathVariable String env) { + return BaseModel.getInstance(canalConfigService.getCanalConfig()); } } diff --git a/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/controller/UserController.java b/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/controller/UserController.java new file mode 100644 index 00000000..c01161a9 --- /dev/null +++ b/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/controller/UserController.java @@ -0,0 +1,57 @@ +package com.alibaba.otter.canal.admin.controller; + +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.benmanes.caffeine.cache.LoadingCache; +import org.springframework.web.bind.annotation.*; + +import com.alibaba.otter.canal.admin.model.BaseModel; +import com.alibaba.otter.canal.admin.model.User; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +@RestController +@RequestMapping("/api/{env}/user") +public class UserController { + + public static final LoadingCache loginUsers = Caffeine.newBuilder() + .maximumSize(10_000) + .expireAfterAccess(10, TimeUnit.MINUTES) + .build(key -> null); + + @PostMapping(value = "/login") + public BaseModel> login(@RequestBody User user, @PathVariable String env) { + if ("admin".equals(user.getUsername()) && "121212".equals(user.getPassword())) { + Map tokenResp = new HashMap<>(); + String token = UUID.randomUUID().toString(); + loginUsers.put(token, user); + tokenResp.put("token", token); + return BaseModel.getInstance(tokenResp); + } else { + BaseModel> model = BaseModel.getInstance(null); + model.setCode(40001); + model.setMessage("Invalid username or password"); + return model; + } + } + + @GetMapping(value = "/info") + public BaseModel info(@RequestParam String token, @PathVariable String env) { + User user = loginUsers.getIfPresent(token); + if (user != null) { + return BaseModel.getInstance(user); + } else { + BaseModel model = BaseModel.getInstance(null); + model.setCode(50014); + model.setMessage("Invalid token"); + return model; + } + } + + @PostMapping(value = "/logout") + public BaseModel logout(@PathVariable String env) { + return BaseModel.getInstance("success"); + } +} diff --git a/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/model/BaseModel.java b/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/model/BaseModel.java new file mode 100644 index 00000000..a63cc77c --- /dev/null +++ b/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/model/BaseModel.java @@ -0,0 +1,38 @@ +package com.alibaba.otter.canal.admin.model; + +public class BaseModel { + + private Integer code = 20000; + private String message; + private T data; + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + public static BaseModel getInstance(T data) { + BaseModel baseModel = new BaseModel<>(); + baseModel.data = data; + return baseModel; + } +} diff --git a/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/model/User.java b/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/model/User.java new file mode 100644 index 00000000..37908174 --- /dev/null +++ b/canal-admin/canal-admin-server/src/main/java/com/alibaba/otter/canal/admin/model/User.java @@ -0,0 +1,68 @@ +package com.alibaba.otter.canal.admin.model; + +public class User { + + private Long id; + private String username; + private String password; + private String roles = "admin"; + private String introduction; + private String avatar = "https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif"; + private String name = "Canal Manager"; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + 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; + } + + public String getRoles() { + return roles; + } + + public void setRoles(String roles) { + this.roles = roles; + } + + public String getIntroduction() { + return introduction; + } + + public void setIntroduction(String introduction) { + this.introduction = introduction; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/canal-admin/canal-admin-ui/.env.development b/canal-admin/canal-admin-ui/.env.development index 8f5856db..9019dc45 100644 --- a/canal-admin/canal-admin-ui/.env.development +++ b/canal-admin/canal-admin-ui/.env.development @@ -2,7 +2,7 @@ ENV = 'development' # base api -VUE_APP_BASE_API = '/dev-api' +VUE_APP_BASE_API = 'http://127.0.0.1:8089/api/v1' # vue-cli uses the VUE_CLI_BABEL_TRANSPILE_MODULES environment variable, # to control whether the babel-plugin-dynamic-import-node plugin is enabled. diff --git a/canal-admin/canal-admin-ui/.env.production b/canal-admin/canal-admin-ui/.env.production index 80c81030..f41f2073 100644 --- a/canal-admin/canal-admin-ui/.env.production +++ b/canal-admin/canal-admin-ui/.env.production @@ -2,5 +2,5 @@ ENV = 'production' # base api -VUE_APP_BASE_API = '/prod-api' +VUE_APP_BASE_API = '/api/v1' diff --git a/canal-admin/canal-admin-ui/src/main.js b/canal-admin/canal-admin-ui/src/main.js index 015d8646..8ccf2fd5 100644 --- a/canal-admin/canal-admin-ui/src/main.js +++ b/canal-admin/canal-admin-ui/src/main.js @@ -23,10 +23,10 @@ import '@/permission' // permission control * Currently MockJs will be used in the production environment, * please remove it before going online! ! ! */ -import { mockXHR } from '../mock' -if (process.env.NODE_ENV === 'production') { - mockXHR() -} +// import { mockXHR } from '../mock' +// if (process.env.NODE_ENV === 'production') { +// mockXHR() +// } // set ElementUI lang to EN Vue.use(ElementUI, { diff --git a/canal-admin/canal-admin-ui/src/router/index.js b/canal-admin/canal-admin-ui/src/router/index.js index f091f0fd..df1c7fec 100644 --- a/canal-admin/canal-admin-ui/src/router/index.js +++ b/canal-admin/canal-admin-ui/src/router/index.js @@ -55,6 +55,28 @@ export const constantRoutes = [ }] }, + { + path: '/canalServer', + component: Layout, + redirect: '/canalServer/config', + name: 'Canal Server', + meta: { title: 'Canal Server', icon: 'example' }, + children: [ + { + path: 'canalServer', + name: 'Canal主配置', + component: () => import('@/views/canalServer/config'), + meta: { title: 'Canal主配置', icon: 'form' } + }, + { + path: 'tree', + name: 'Tree', + component: () => import('@/views/tree/index'), + meta: { title: 'Tree', icon: 'tree' } + } + ] + }, + { path: '/example', component: Layout, diff --git a/canal-admin/canal-admin-ui/src/settings.js b/canal-admin/canal-admin-ui/src/settings.js index ae3c4949..b79ac5d8 100644 --- a/canal-admin/canal-admin-ui/src/settings.js +++ b/canal-admin/canal-admin-ui/src/settings.js @@ -1,16 +1,16 @@ module.exports = { - title: 'Vue Admin Template', + title: 'Canal Admin', /** * @type {boolean} true | false * @description Whether fix the header */ - fixedHeader: false, + fixedHeader: true, /** * @type {boolean} true | false * @description Whether show the logo in sidebar */ - sidebarLogo: false + sidebarLogo: true } diff --git a/canal-admin/canal-admin-ui/src/utils/request.js b/canal-admin/canal-admin-ui/src/utils/request.js index 2fb95ac0..bac8ed91 100644 --- a/canal-admin/canal-admin-ui/src/utils/request.js +++ b/canal-admin/canal-admin-ui/src/utils/request.js @@ -7,7 +7,7 @@ import { getToken } from '@/utils/auth' const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url // withCredentials: true, // send cookies when cross-domain requests - timeout: 5000 // request timeout + timeout: 60000 // request timeout }) // request interceptor diff --git a/canal-admin/canal-admin-ui/src/views/form/index.vue b/canal-admin/canal-admin-ui/src/views/form/index.vue index 6eb2be28..27a4ce63 100644 --- a/canal-admin/canal-admin-ui/src/views/form/index.vue +++ b/canal-admin/canal-admin-ui/src/views/form/index.vue @@ -5,7 +5,7 @@ canal.properties     修改 - 取消 + 返回 diff --git a/canal-admin/pom.xml b/canal-admin/pom.xml index 440c7df7..62a42734 100644 --- a/canal-admin/pom.xml +++ b/canal-admin/pom.xml @@ -43,6 +43,11 @@ commons-dbutils 1.6 + + com.github.ben-manes.caffeine + caffeine + 2.6.2 +