AppController.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. /*
  2. * Copyright 2017-2020 吴学文 and java110 team.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.java110.api.controller.app;
  17. import com.alibaba.fastjson.JSONObject;
  18. import com.java110.api.smo.IApiServiceSMO;
  19. import com.java110.api.smo.api.IApiSMO;
  20. import com.java110.api.smo.privilege.IPrivilegeSMO;
  21. import com.java110.core.base.controller.BaseController;
  22. import com.java110.core.context.IPageData;
  23. import com.java110.core.factory.GenerateCodeFactory;
  24. import com.java110.core.language.Java110Lang;
  25. import com.java110.core.log.LoggerFactory;
  26. import com.java110.utils.constant.CommonConstant;
  27. import com.java110.utils.util.DateUtil;
  28. import com.java110.vo.ResultVo;
  29. import io.swagger.annotations.ApiImplicitParam;
  30. import io.swagger.annotations.ApiOperation;
  31. import org.slf4j.Logger;
  32. import org.springframework.beans.factory.annotation.Autowired;
  33. import org.springframework.http.HttpStatus;
  34. import org.springframework.http.ResponseEntity;
  35. import org.springframework.web.bind.annotation.*;
  36. import org.springframework.web.client.RestTemplate;
  37. import javax.servlet.http.HttpServletRequest;
  38. import java.util.HashMap;
  39. import java.util.Map;
  40. /**
  41. * 微信小程序api处理类
  42. * <p>
  43. * 主要用于透传api 直接提供出来的接口
  44. * <p>
  45. * 方便快速开发
  46. * <p>
  47. * add by wuxw 2019-11-19
  48. */
  49. @RestController
  50. @RequestMapping(path = "/app")
  51. public class AppController extends BaseController {
  52. private final static Logger logger = LoggerFactory.getLogger(AppController.class);
  53. @Autowired
  54. private IApiSMO apiSMOImpl;
  55. @Autowired
  56. private RestTemplate restTemplate;
  57. @Autowired
  58. private IPrivilegeSMO privilegeSMOImpl;
  59. /**
  60. * 资源请求 post方式
  61. * <p>
  62. * /app/user.listUser
  63. * <p>
  64. * /api/user.listUser
  65. *
  66. * @param service 请求接口方式
  67. * @param postInfo post内容
  68. * @param request 请求对象 查询头信息 url等信息
  69. * @return http status 200 成功 其他失败
  70. */
  71. @RequestMapping(path = "/{service:.+}", method = RequestMethod.POST)
  72. @ApiOperation(value = "资源post请求", notes = "test: 返回 2XX 表示服务正常")
  73. @ApiImplicitParam(paramType = "query", name = "service", value = "用户编号", required = true, dataType = "String")
  74. @Java110Lang
  75. public ResponseEntity<String> servicePost(@PathVariable String service,
  76. @RequestBody String postInfo,
  77. HttpServletRequest request) {
  78. ResponseEntity<String> responseEntity = null;
  79. try {
  80. Map<String, String> headers = new HashMap<String, String>();
  81. this.getRequestInfo(request, headers);
  82. headers.put(CommonConstant.HTTP_SERVICE, service);
  83. headers.put(CommonConstant.HTTP_METHOD, CommonConstant.HTTP_METHOD_POST);
  84. logger.debug("api:{} 请求报文为:{},header信息为:{}", service, postInfo, headers);
  85. IPageData pd = (IPageData) request.getAttribute(CommonConstant.CONTEXT_PAGE_DATA);
  86. privilegeSMOImpl.hasPrivilege(restTemplate, pd, "/app/" + service);
  87. responseEntity = apiSMOImpl.doApi(postInfo, headers, request);
  88. //todo 写入 token
  89. wirteToken(request, pd, service, responseEntity);
  90. } catch (Throwable e) {
  91. logger.error("请求post 方法[" + service + "]失败:" + postInfo, e);
  92. responseEntity = ResultVo.error("请求发生异常," + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
  93. }
  94. logger.debug("api:{} 返回信息为:{}", service, responseEntity);
  95. return responseEntity;
  96. }
  97. /**
  98. * 写入 token
  99. *
  100. * @param request
  101. * @param pd
  102. * @param service
  103. * @param responseEntity
  104. */
  105. private void wirteToken(HttpServletRequest request, IPageData pd, String service, ResponseEntity<String> responseEntity) {
  106. String[] services = new String[]{
  107. "login.accessTokenLogin"
  108. };
  109. if (responseEntity.getStatusCode() != HttpStatus.OK) {
  110. return;
  111. }
  112. boolean flag = false;
  113. for (String tmpService : services) {
  114. if (tmpService.equals(service)) {
  115. flag = true;
  116. }
  117. }
  118. if (!flag) {
  119. return;
  120. }
  121. JSONObject paramOut = JSONObject.parseObject(responseEntity.getBody());
  122. if (!"0".equals(paramOut.getString("code"))) {
  123. return;
  124. }
  125. String token = paramOut.getJSONObject("data").getString("token");
  126. pd.setToken(token);
  127. }
  128. /**
  129. * 资源请求 get方式
  130. *
  131. * @param service 请求接口方式
  132. * @param request 请求对象 查询头信息 url等信息
  133. * @return http status 200 成功 其他失败
  134. */
  135. @RequestMapping(path = "/{service:.+}", method = RequestMethod.GET)
  136. @ApiOperation(value = "资源get请求", notes = "test: 返回 2XX 表示服务正常")
  137. @ApiImplicitParam(paramType = "query", name = "service", value = "用户编号", required = true, dataType = "String")
  138. @Java110Lang
  139. public ResponseEntity<String> serviceGet(@PathVariable String service,
  140. HttpServletRequest request) {
  141. ResponseEntity<String> responseEntity = null;
  142. try {
  143. Map<String, String> headers = new HashMap<String, String>();
  144. this.getRequestInfo(request, headers);
  145. headers.put(CommonConstant.HTTP_SERVICE, service);
  146. headers.put(CommonConstant.HTTP_METHOD, CommonConstant.HTTP_METHOD_GET);
  147. logger.debug("api:{} 请求报文为:{},header信息为:{}", "", headers);
  148. IPageData pd = (IPageData) request.getAttribute(CommonConstant.CONTEXT_PAGE_DATA);
  149. privilegeSMOImpl.hasPrivilege(restTemplate, pd, "/app/" + service);
  150. responseEntity = apiSMOImpl.doApi(JSONObject.toJSONString(getParameterStringMap(request)), headers, request);
  151. } catch (Throwable e) {
  152. logger.error("请求get 方法[" + service + "]失败:", e);
  153. responseEntity = ResultVo.error("请求发生异常," + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
  154. }
  155. logger.debug("api:{} 返回信息为:{}", service, responseEntity);
  156. return responseEntity;
  157. }
  158. /**
  159. * 资源请求 get方式
  160. *
  161. * @param request 请求对象 查询头信息 url等信息
  162. * @return http status 200 成功 其他失败
  163. */
  164. @RequestMapping(path = "/{resource}/{action}", method = RequestMethod.GET)
  165. @ApiOperation(value = "资源get请求", notes = "test: 返回 2XX 表示服务正常")
  166. @ApiImplicitParam(paramType = "query", name = "subServiceGet", value = "用户编号", required = true, dataType = "String")
  167. @Java110Lang
  168. public ResponseEntity<String> subServiceGet(
  169. @PathVariable String resource,
  170. @PathVariable String action,
  171. HttpServletRequest request) {
  172. ResponseEntity<String> responseEntity = null;
  173. Map<String, String> headers = new HashMap<String, String>();
  174. try {
  175. this.getRequestInfo(request, headers);
  176. headers.put(CommonConstant.HTTP_SERVICE, "/" + resource + "/" + action);
  177. headers.put(CommonConstant.HTTP_RESOURCE, resource);
  178. headers.put(CommonConstant.HTTP_ACTION, action);
  179. headers.put(CommonConstant.HTTP_METHOD, CommonConstant.HTTP_METHOD_GET);
  180. logger.debug("api:{} 请求报文为:{},header信息为:{}", "", headers);
  181. IPageData pd = (IPageData) request.getAttribute(CommonConstant.CONTEXT_PAGE_DATA);
  182. privilegeSMOImpl.hasPrivilege(restTemplate, pd, "/app/" + resource + "/" + action);
  183. responseEntity = apiSMOImpl.doApi(JSONObject.toJSONString(getParameterStringMap(request)), headers, request);
  184. //responseEntity = apiServiceSMOImpl.service(JSONObject.toJSONString(getParameterStringMap(request)), headers);
  185. } catch (Throwable e) {
  186. logger.error("请求get 方法[" + action + "]失败:", e);
  187. responseEntity = ResultVo.error("请求发生异常," + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
  188. }
  189. logger.debug("api:{} 返回信息为:{}", action, responseEntity);
  190. return responseEntity;
  191. }
  192. /**
  193. * 资源请求 post方式
  194. *
  195. * @param resource 请求接口方式
  196. * @param postInfo post内容
  197. * @param request 请求对象 查询头信息 url等信息
  198. * @return http status 200 成功 其他失败
  199. */
  200. @RequestMapping(path = "/{resource}/{action}", method = RequestMethod.POST)
  201. @ApiOperation(value = "资源post请求", notes = "test: 返回 2XX 表示服务正常")
  202. @ApiImplicitParam(paramType = "query", name = "subServicePost", value = "用户编号", required = true, dataType = "String")
  203. @Java110Lang
  204. public ResponseEntity<String> subServicePost(
  205. @PathVariable String resource,
  206. @PathVariable String action,
  207. @RequestBody String postInfo,
  208. HttpServletRequest request) {
  209. ResponseEntity<String> responseEntity = null;
  210. Map<String, String> headers = new HashMap<String, String>();
  211. try {
  212. this.getRequestInfo(request, headers);
  213. headers.put(CommonConstant.HTTP_SERVICE, "/" + resource + "/" + action);
  214. headers.put(CommonConstant.HTTP_RESOURCE, resource);
  215. headers.put(CommonConstant.HTTP_ACTION, action);
  216. headers.put(CommonConstant.HTTP_METHOD, CommonConstant.HTTP_METHOD_POST);
  217. logger.debug("api:{} 请求报文为:{},header信息为:{}", action, postInfo, headers);
  218. IPageData pd = (IPageData) request.getAttribute(CommonConstant.CONTEXT_PAGE_DATA);
  219. privilegeSMOImpl.hasPrivilege(restTemplate, pd, "/app/" + resource + "/" + action);
  220. responseEntity = apiSMOImpl.doApi(postInfo, headers, request);
  221. } catch (Throwable e) {
  222. logger.error("请求post 方法[" + action + "]失败:" + postInfo, e);
  223. responseEntity = ResultVo.error("请求发生异常," + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
  224. }
  225. logger.debug("api:{} 返回信息为:{}", action, responseEntity);
  226. return responseEntity;
  227. }
  228. /**
  229. * 外部系统使用 get
  230. * 对接一些大系统时 他们不会按照HC的要求
  231. * 所以将HC要求的appId 放到路劲地址
  232. * @param request 请求对象 查询头信息 url等信息
  233. * @return http status 200 成功 其他失败
  234. */
  235. @RequestMapping(path = "/ext/{serviceCode}/{appId}", method = RequestMethod.GET)
  236. @Java110Lang
  237. public ResponseEntity<String> extGet(
  238. @PathVariable String serviceCode,
  239. @PathVariable String appId,
  240. HttpServletRequest request) {
  241. ResponseEntity<String> responseEntity = null;
  242. Map<String, String> headers = new HashMap<String, String>();
  243. try {
  244. this.getRequestInfo(request, headers);
  245. //todo 补充appId信息
  246. headers.put("app-id",appId);
  247. headers.put("user-id","-1");
  248. headers.put("transaction-id", GenerateCodeFactory.getUUID());
  249. headers.put("req-time", DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_DEFAULT));
  250. headers.put(CommonConstant.HTTP_SERVICE, serviceCode);
  251. headers.put(CommonConstant.HTTP_METHOD, CommonConstant.HTTP_METHOD_GET);
  252. logger.debug("api:{} 请求报文为:{},header信息为:{}", "", headers);
  253. IPageData pd = (IPageData) request.getAttribute(CommonConstant.CONTEXT_PAGE_DATA);
  254. privilegeSMOImpl.hasPrivilege(restTemplate, pd, "/app/" + serviceCode);
  255. responseEntity = apiSMOImpl.doApi(JSONObject.toJSONString(getParameterStringMap(request)), headers, request);
  256. } catch (Throwable e) {
  257. logger.error("请求get 方法[" + serviceCode + "]失败:", e);
  258. responseEntity = ResultVo.error("请求发生异常," + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
  259. }
  260. logger.debug("api:{} 返回信息为:{}", serviceCode, responseEntity);
  261. return responseEntity;
  262. }
  263. /**
  264. * 外部系统使用 post
  265. * 对接一些大系统时 他们不会按照HC的要求
  266. * 所以将HC要求的appId 放到路劲地址
  267. * @param request 请求对象 查询头信息 url等信息
  268. * @return http status 200 成功 其他失败
  269. */
  270. @RequestMapping(path = "/ext/{appId}/{serviceCode}", method = RequestMethod.POST)
  271. @Java110Lang
  272. public ResponseEntity<String> extPost(
  273. @PathVariable String serviceCode,
  274. @PathVariable String appId,
  275. HttpServletRequest request) {
  276. ResponseEntity<String> responseEntity = null;
  277. Map<String, String> headers = new HashMap<String, String>();
  278. try {
  279. this.getRequestInfo(request, headers);
  280. //todo 补充appId信息
  281. headers.put("app-id",appId);
  282. headers.put("user-id","-1");
  283. headers.put("transaction-id", GenerateCodeFactory.getUUID());
  284. headers.put("req-time", DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_DEFAULT));
  285. headers.put(CommonConstant.HTTP_SERVICE, serviceCode);
  286. headers.put(CommonConstant.HTTP_METHOD, CommonConstant.HTTP_METHOD_POST);
  287. logger.debug("api:{} 请求报文为:{},header信息为:{}", "", headers);
  288. IPageData pd = (IPageData) request.getAttribute(CommonConstant.CONTEXT_PAGE_DATA);
  289. privilegeSMOImpl.hasPrivilege(restTemplate, pd, "/app/" + serviceCode);
  290. responseEntity = apiSMOImpl.doApi(JSONObject.toJSONString(getParameterStringMap(request)), headers, request);
  291. } catch (Throwable e) {
  292. logger.error("请求get 方法[" + serviceCode + "]失败:", e);
  293. responseEntity = ResultVo.error("请求发生异常," + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
  294. }
  295. logger.debug("api:{} 返回信息为:{}", serviceCode, responseEntity);
  296. return responseEntity;
  297. }
  298. /**
  299. * 资源请求 put方式
  300. *
  301. * @param service 请求接口方式
  302. * @param postInfo 修改内容
  303. * @param request 请求对象 查询头信息 url等信息
  304. * @return http status 200 成功 其他失败
  305. */
  306. @RequestMapping(path = "/{service:.+}", method = RequestMethod.PUT)
  307. @ApiOperation(value = "资源put请求", notes = "test: 返回 2XX 表示服务正常")
  308. @ApiImplicitParam(paramType = "query", name = "service", value = "用户编号", required = true, dataType = "String")
  309. @Java110Lang
  310. public ResponseEntity<String> servicePut(@PathVariable String service,
  311. @RequestBody String postInfo,
  312. HttpServletRequest request) {
  313. ResponseEntity<String> responseEntity = null;
  314. try {
  315. Map<String, String> headers = new HashMap<String, String>();
  316. this.getRequestInfo(request, headers);
  317. headers.put(CommonConstant.HTTP_SERVICE, service);
  318. headers.put(CommonConstant.HTTP_METHOD, CommonConstant.HTTP_METHOD_PUT);
  319. logger.debug("api:{} 请求报文为:{},header信息为:{}", service, postInfo, headers);
  320. IPageData pd = (IPageData) request.getAttribute(CommonConstant.CONTEXT_PAGE_DATA);
  321. privilegeSMOImpl.hasPrivilege(restTemplate, pd, "/app/" + service);
  322. responseEntity = apiSMOImpl.doApi(postInfo, headers, request);
  323. //responseEntity = apiServiceSMOImpl.service(JSONObject.toJSONString(getParameterStringMap(request)), headers);
  324. } catch (Throwable e) {
  325. logger.error("请求put 方法[" + service + "]失败:", e);
  326. responseEntity = ResultVo.error("请求发生异常," + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
  327. }
  328. logger.debug("api:{} 返回信息为:{}", service, responseEntity);
  329. return responseEntity;
  330. }
  331. /**
  332. * 资源请求 delete方式
  333. *
  334. * @param service 请求接口方式
  335. * @param request 请求对象 查询头信息 url等信息
  336. * @return http status 200 成功 其他失败
  337. */
  338. @RequestMapping(path = "/{service:.+}", method = RequestMethod.DELETE)
  339. @ApiOperation(value = "资源delete请求", notes = "test: 返回 2XX 表示服务正常")
  340. @ApiImplicitParam(paramType = "query", name = "service", value = "用户编号", required = true, dataType = "String")
  341. @Java110Lang
  342. public ResponseEntity<String> serviceDelete(@PathVariable String service,
  343. HttpServletRequest request) {
  344. ResponseEntity<String> responseEntity = null;
  345. try {
  346. Map<String, String> headers = new HashMap<String, String>();
  347. this.getRequestInfo(request, headers);
  348. headers.put(CommonConstant.HTTP_SERVICE, service);
  349. headers.put(CommonConstant.HTTP_METHOD, CommonConstant.HTTP_METHOD_DELETE);
  350. logger.debug("api:{} 请求报文为:{},header信息为:{}", service, "", headers);
  351. IPageData pd = (IPageData) request.getAttribute(CommonConstant.CONTEXT_PAGE_DATA);
  352. privilegeSMOImpl.hasPrivilege(restTemplate, pd, "/app/" + service);
  353. responseEntity = apiSMOImpl.doApi(JSONObject.toJSONString(getParameterStringMap(request)), headers, request);
  354. //responseEntity = apiServiceSMOImpl.service(JSONObject.toJSONString(getParameterStringMap(request)), headers);
  355. } catch (Throwable e) {
  356. logger.error("请求delete 方法[" + service + "]失败:", e);
  357. responseEntity = ResultVo.error("请求发生异常," + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
  358. }
  359. logger.debug("api:{} 返回信息为:{}", service, responseEntity);
  360. return responseEntity;
  361. }
  362. /**
  363. * 获取请求信息
  364. *
  365. * @param request
  366. * @param headers
  367. * @throws RuntimeException
  368. */
  369. private void getRequestInfo(HttpServletRequest request, Map headers) throws Exception {
  370. try {
  371. super.initHeadParam(request, headers);
  372. super.initUrlParam(request, headers);
  373. this.getUserInfo(request, headers);
  374. } catch (Exception e) {
  375. logger.error("加载头信息失败", e);
  376. throw e;
  377. }
  378. }
  379. private void getUserInfo(HttpServletRequest request, Map headers) throws Exception {
  380. Object claimsObj = request.getAttribute("claims");
  381. if (claimsObj == null) {
  382. return;
  383. }
  384. Map<String, String> claims = (Map<String, String>) claimsObj;
  385. for (String key : claims.keySet()) {
  386. if ("userId".equals(key)) {
  387. headers.put("user_id", claims.get(key));
  388. }
  389. if ("userName".equals(key)) {
  390. headers.put("userName", "-");
  391. }
  392. headers.put(key, claims.get(key));
  393. }
  394. }
  395. }