context.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. 'use strict';
  2. /**
  3. * 导入验证类
  4. */
  5. const comoValidate = require('como-validator');
  6. /**
  7. * [params_handler 转换参数]
  8. * @author szjcomo
  9. * @createTime 2020-09-04
  10. * @param {[type]} result [description]
  11. * @param {[type]} name [description]
  12. * @param {[type]} defaults [description]
  13. * @param {[type]} handler [description]
  14. * @return {[type]} [description]
  15. */
  16. const params_handler = async function(result,name = null,defaults = null,handler = null) {
  17. if(name === null){
  18. let tmp = {};
  19. Object.getOwnPropertyNames(result).forEach(key => {
  20. if(typeof result[key] !== 'string'){
  21. tmp[key] = result[key];
  22. } else {
  23. tmp[key] = escapeHtml(result[key]);
  24. }
  25. })
  26. return tmp;
  27. }
  28. if(result.hasOwnProperty(name)) {
  29. if(typeof handler === 'function') return await handler.call({},result[name]);
  30. if(typeof result[name] !== 'string') return result[name];
  31. return escapeHtml(result[name]);
  32. }
  33. return defaults;
  34. }
  35. /**
  36. * [htmlspecialchars 转义html 免xss攻击]
  37. * @author szjcomo
  38. * @createTime 2020-09-04
  39. * @param {[type]} html [description]
  40. * @return {[type]} [description]
  41. */
  42. const escapeHtml = function(html) {
  43. let s = "";
  44. if (html.length == 0) return "";
  45. for (let i=0; i<html.length; i++){
  46. switch (html.substr(i,1)){
  47. case "<": s += "&lt;"; break;
  48. case ">": s += "&gt;"; break;
  49. case "&": s += "&amp;"; break;
  50. case " ":
  51. if(html.substr(i + 1, 1) == " "){
  52. s += " &nbsp;";
  53. i++;
  54. } else s += " ";
  55. break;
  56. case "\"": s += "&quot;"; break;
  57. default: s += html.substr(i,1); break;
  58. }
  59. }
  60. return s;
  61. }
  62. /**
  63. * [unEscapeHtml 转义html]
  64. * @author szjcomo
  65. * @createTime 2020-09-04
  66. * @param {[type]} html [description]
  67. * @return {[type]} [description]
  68. */
  69. const unEscapeHtml = function(html,regs = []) {
  70. let content = html.replace(/&amp;/g, '&')
  71. .replace(/&lt;/g, '<')
  72. .replace(/&gt;/g, '>')
  73. .replace(/&quot;/g, '"')
  74. .replace(/&nbsp;/g,' ')
  75. .replace(/&#039;/g, "'");
  76. regs.forEach(item => {
  77. content = content.replace(item.reg,item.value);
  78. })
  79. return content;
  80. }
  81. /**
  82. * [exports 扩展表单校验证器]
  83. * @type {Object}
  84. */
  85. module.exports = {
  86. // 获取验证规则类
  87. get rules() {
  88. return comoValidate.comoRules.getInstance();
  89. },
  90. /**
  91. * 表单验证函数
  92. *
  93. * @param {*} rules
  94. * @param {*} data
  95. */
  96. async validate(rules, data) {
  97. return await comoValidate.validate(rules, data);
  98. },
  99. /**
  100. * [appJson description]
  101. * @author szjcomo
  102. * @createTime 2020-09-04
  103. * @param {Object} data [description]
  104. * @return {[type]} [description]
  105. */
  106. appJson(result) {
  107. let ctx = this;
  108. result = result || ctx.app.szjcomo.appResult('There is no data to return');
  109. return ctx.body = result;
  110. },
  111. /**
  112. * [appDebug 输出调试信息]
  113. * @author szjcomo
  114. * @createTime 2020-09-04
  115. * @param {[type]} err [description]
  116. * @return {[type]} [description]
  117. */
  118. appException(err) {
  119. this.logger.error(err);
  120. },
  121. /**
  122. * [allAny 获取所有参数 不管是post还是get]
  123. * @author szjcomo
  124. * @createTime 2020-09-04
  125. * @param {[type]} name [description]
  126. * @param {[type]} defaults [description]
  127. * @param {[type]} handler [description]
  128. * @return {[type]} [description]
  129. */
  130. async anyParse(name = null,defaults = null,handler = null) {
  131. let ctx = this;
  132. let options = Object.assign(ctx.request.body,ctx.query);
  133. return await params_handler(options,name,defaults,handler);
  134. },
  135. /**
  136. * [postParse 解析post参数]
  137. * @author szjcomo
  138. * @createTime 2020-09-04
  139. * @param {[type]} name [description]
  140. * @param {[type]} defaults [description]
  141. * @param {[type]} handler [description]
  142. * @return {[type]} [description]
  143. */
  144. async postParse(name = null,defaults = null,handler = null) {
  145. let options = this.request.body;
  146. return await params_handler(options,name,defaults,handler);
  147. },
  148. /**
  149. * [getParse 解析get参数]
  150. * @author szjcomo
  151. * @createTime 2020-09-04
  152. * @param {[type]} name [description]
  153. * @param {[type]} defaults [description]
  154. * @param {[type]} handler [description]
  155. * @return {[type]} [description]
  156. */
  157. async getParse(name = null,defaults = null,handler = null) {
  158. let options = this.query;
  159. return await params_handler(options,name,defaults,handler);
  160. },
  161. /**
  162. * [escapeHtml html转义]
  163. * @author szjcomo
  164. * @createTime 2020-09-04
  165. * @param {[type]} html [description]
  166. * @return {[type]} [description]
  167. */
  168. escapeHtml(html) {
  169. return escapeHtml(html);
  170. },
  171. /**
  172. * [unEscapeHtml 反转义html]
  173. * @author szjcomo
  174. * @createTime 2020-09-04
  175. * @param {[type]} content [description]
  176. * @return {[type]} [description]
  177. */
  178. unEscapeHtml(content) {
  179. return unEscapeHtml(content);
  180. }
  181. };