edit.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. <template>
  2. <div>
  3. <el-form
  4. ref="ruleForm"
  5. :rules="rules"
  6. :model="sizeForm"
  7. label-suffix=":"
  8. label-position="right"
  9. label-width="140px"
  10. >
  11. <dg-row>
  12. <dg-col :span="12">
  13. <el-form-item label="方案名称" prop="name">
  14. {{ sizeForm.name }}
  15. <!-- <el-input
  16. v-model.trim="sizeForm.name"
  17. show-word-limit
  18. placeholder="请输入方案名称"
  19. clearable
  20. disabled
  21. /> -->
  22. </el-form-item>
  23. </dg-col>
  24. </dg-row>
  25. <dg-row>
  26. <dg-col :span="12">
  27. <el-form-item label="方案状态" prop="state">
  28. <dg-select
  29. style="width: 100%;"
  30. v-model="sizeForm.state"
  31. placeholder="请选择方案状态"
  32. code="DM_APPLY_STATUS"
  33. >
  34. </dg-select>
  35. </el-form-item>
  36. </dg-col>
  37. </dg-row>
  38. <dg-row>
  39. <dg-col :span="24">
  40. <el-form-item label="检测规则" prop="ruleContent">
  41. <!-- DSJPFJQFX DSJPFHBMDMZFX JQBYTJBWZFX -->
  42. <div v-if="sizeForm.type === 'DSJPFJQFX'">
  43. <div class="form-inline">
  44. <el-form-item label="" prop="interval">
  45. <el-input style="width: 80px;" v-model.trim="sizeForm.interval"></el-input>
  46. </el-form-item>
  47. &nbsp;分钟内,鉴权次数超过&nbsp;
  48. <el-form-item label="" prop="frequency"
  49. ><el-input style="width: 80px;" v-model.trim="sizeForm.frequency"></el-input>
  50. </el-form-item>
  51. &nbsp;次
  52. </div>
  53. <!-- <p>
  54. 规则说明:用户在短时间内,频繁发起请求,鉴定是否有应用或服务的访问权限。鉴权次数说明:a用户访问A应用(或者服务),A应用到鉴权服务鉴定a用户,是否可以访问A应用(或者服务),为一次鉴权。
  55. </p> -->
  56. </div>
  57. <div v-if="sizeForm.type === 'DSJPFHBMDMZFX'">
  58. <div class="form-inline">
  59. <el-form-item label="" prop="interval">
  60. <el-input style="width: 80px;" v-model.trim="sizeForm.interval"></el-input>
  61. </el-form-item>
  62. &nbsp; 分钟内,命中红/白名单超过&nbsp;
  63. <el-form-item label="" prop="frequency"
  64. ><el-input style="width: 80px;" v-model.trim="sizeForm.frequency"></el-input>
  65. </el-form-item>
  66. &nbsp;次
  67. </div>
  68. <!-- <p>
  69. 规则说明:在短时间内,鉴权的内容在红/白名单的次数超量。
  70. 命中红/白名单说明:a用户访问A应用(或者服务),A应用到鉴权服务鉴定a用户是否可以访问A应用(或者服务),若A应用在红/白名单中,为命中一次红白名单。
  71. </p> -->
  72. </div>
  73. <div v-if="sizeForm.type === 'JQBYTJBWZFX'">
  74. <p>
  75. 鉴权时,必要条件不完整。
  76. </p>
  77. <div>
  78. 鉴权类型:
  79. <dg-radio-group
  80. v-model="sizeForm.authType"
  81. enum="AuthenticationNecessaryParamEnum"
  82. @change="setNecessaryParams"
  83. call-off
  84. ></dg-radio-group>
  85. </div>
  86. <div class="form-inline">
  87. <label>必要参数:</label>
  88. <dg-checkbox-group
  89. v-model="sizeForm.necessaryParams"
  90. enum="AuthenticationTypeEnum"
  91. disabled
  92. ></dg-checkbox-group>
  93. </div>
  94. <!-- <p>
  95. 规则说明:用户在短时间内,频繁发起请求,鉴定是否有应用或服务的访问权限。鉴权次数说明:a用户访问A应用(或者服务),A应用到鉴权服务鉴定a用户,是否可以访问A应用(或者服务),为一次鉴权。
  96. </p> -->
  97. </div>
  98. </el-form-item>
  99. </dg-col>
  100. </dg-row>
  101. <dg-row>
  102. <dg-col :span="24">
  103. <el-form-item label="风险内容" prop="contentFormat">
  104. {{ sizeForm.contentFormat }}
  105. </el-form-item>
  106. </dg-col>
  107. </dg-row>
  108. <dg-row>
  109. <dg-col :span="24">
  110. <el-form-item label="规则说明" prop="ruleExplain">
  111. {{ sizeForm.ruleExplain }}
  112. <!-- <el-input
  113. type="textarea"
  114. rows="4"
  115. v-model.trim="sizeForm.ruleExplain"
  116. placeholder="请输入规则说明"
  117. clearable
  118. show-word-limit
  119. disabled
  120. maxlength="500"
  121. /> -->
  122. </el-form-item>
  123. </dg-col>
  124. </dg-row>
  125. <dg-row>
  126. <dg-col :span="24">
  127. <el-form-item label="处理意见" prop="handleOpinion">
  128. <el-input
  129. type="textarea"
  130. rows="4"
  131. v-model.trim="sizeForm.handleOpinion"
  132. placeholder="请输入处理意见"
  133. clearable
  134. show-word-limit
  135. maxlength="500"
  136. />
  137. </el-form-item>
  138. </dg-col>
  139. </dg-row>
  140. </el-form>
  141. <div class="dg-layer-demo" v-footer>
  142. <dg-button @click="handleClose">取消</dg-button>
  143. <dg-button type="primary" @click="handlSave">确定</dg-button>
  144. </div>
  145. </div>
  146. </template>
  147. <script>
  148. import { saveAuthRisk } from "@/api/log-manage";
  149. export default {
  150. name: "auth-risk-edit",
  151. props: {
  152. formData: Object
  153. },
  154. data() {
  155. return {
  156. necessaryParams: [],
  157. sizeForm: {
  158. interval: "",
  159. frequency: "",
  160. authType: "",
  161. necessaryParams: ""
  162. },
  163. rules: {
  164. handleOpinion: [{ required: true, message: "请输入处理意见", trigger: "blur" }],
  165. name: [{ required: true, message: "请输入方案名称", trigger: "blur" }],
  166. interval: [{ required: true, message: "请输入分钟数", trigger: "blur" }],
  167. frequency: [{ required: true, message: "请输入次数", trigger: "blur" }],
  168. state: [{ required: true, message: "请选择方案状态", trigger: "blur" }],
  169. ruleContent: [{ required: true }]
  170. }
  171. };
  172. },
  173. methods: {
  174. init() {
  175. this.sizeForm = Object.assign({}, this.formData, this.sizeForm);
  176. if (this.sizeForm.type === "JQBYTJBWZFX") {
  177. this.necessaryParams = JSON.parse(this.sizeForm.ruleContent);
  178. if (Array.isArray(this.necessaryParams) && this.necessaryParams.length) {
  179. this.sizeForm.authType = this.necessaryParams[0].type;
  180. this.setNecessaryParams(this.sizeForm.authType);
  181. }
  182. return;
  183. }
  184. const { interval, frequency } = JSON.parse(this.sizeForm.ruleContent);
  185. this.sizeForm.interval = interval;
  186. this.sizeForm.frequency = frequency;
  187. },
  188. setNecessaryParams(key) {
  189. const seleted = this.necessaryParams.find(item => item.type === key);
  190. if (seleted) {
  191. this.sizeForm.necessaryParams = seleted.params
  192. .map(item => {
  193. return item.name;
  194. })
  195. .join(",");
  196. }
  197. },
  198. handleClose() {
  199. this.$emit("success", true);
  200. },
  201. async handlSave() {
  202. const that = this;
  203. const valid = await new Promise(resolve => this.$refs.ruleForm.validate(resolve));
  204. if (!valid) return;
  205. const sizeForm = { ...this.sizeForm };
  206. if (["DSJPFHBMDMZFX", "DSJPFJQFX"].includes(this.sizeForm.type)) {
  207. sizeForm.ruleContent = JSON.stringify({ frequency: sizeForm.frequency, interval: sizeForm.interval });
  208. }
  209. saveAuthRisk(sizeForm.id, sizeForm)
  210. .then(() => {
  211. that.handleClose(true);
  212. that.$message.success("保存成功");
  213. })
  214. .catch(error => that.$notify.error({ title: "错误", message: error }));
  215. }
  216. },
  217. created() {
  218. this.init();
  219. }
  220. };
  221. </script>
  222. <style lang="scss" scoped>
  223. .form-inline {
  224. display: flex;
  225. label {
  226. min-width: 75px;
  227. }
  228. }
  229. </style>