index.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. <template>
  2. <div class="gateway-limit">
  3. <div class="gateway-limit-head">
  4. <Search placeholder="请输入您要搜索的内容" :isSlot="true">
  5. <button class="btnAdd" @click="dialogAddShow = true">新增</button>
  6. </Search>
  7. </div>
  8. <div class="gateway-limit-content">
  9. <template v-if="limitList.length">
  10. <el-row :gutter="24">
  11. <el-col
  12. v-for="(
  13. { id, name, visitTimes, visitDuration, inBlacklist }, index
  14. ) in limitList"
  15. :key="id"
  16. :xs="24"
  17. :md="12"
  18. :lg="6"
  19. :xl="6"
  20. >
  21. <NormalCard
  22. :title="name"
  23. :flag.sync="limitList[index].flag"
  24. @close-click="removeCard(index)"
  25. >
  26. <el-row :gutter="16">
  27. <el-col :span="12" class="card-content-left"
  28. >IP访问单位次数:</el-col
  29. >
  30. <el-col :span="12" class="card-content-right">{{
  31. visitTimes
  32. }}</el-col>
  33. <el-col :span="12" class="card-content-left"
  34. >IP访问单位时间:</el-col
  35. >
  36. <el-col :span="12" class="card-content-right">{{
  37. visitDuration
  38. }}</el-col>
  39. <el-col :span="12" class="card-content-left"
  40. >是否加入黑名单:</el-col
  41. >
  42. <el-col :span="12" class="card-content-right">{{
  43. inBlacklist ? "是" : "否"
  44. }}</el-col>
  45. </el-row>
  46. </NormalCard>
  47. </el-col>
  48. </el-row>
  49. </template>
  50. <template v-else>
  51. <el-empty description="暂无数据" />
  52. </template>
  53. </div>
  54. <Dialog
  55. :flag="dialogAddShow"
  56. width="630px"
  57. @close-dialog="dialogAddShow = false"
  58. >
  59. <div class="dialog-add-title">新增限流配置</div>
  60. <div class="dialog-add-content">
  61. <el-form :model="limitAddForm" label-width="auto">
  62. <el-row :gutter="24">
  63. <el-col :span="12">
  64. <el-form-item label="IP单位访问时间">
  65. <el-input
  66. v-model="limitAddForm.visitDuration"
  67. placeholder="请输入访问时间"
  68. />
  69. </el-form-item>
  70. </el-col>
  71. <el-col :span="12">
  72. <el-form-item label="IP访问单位次数">
  73. <el-input
  74. v-model="limitAddForm.visitTimes"
  75. placeholder="请输入访问次数"
  76. />
  77. </el-form-item>
  78. </el-col>
  79. <el-col :span="12">
  80. <el-form-item label="是否加入黑名单">
  81. <el-radio-group v-model="limitAddForm.inBlacklist">
  82. <el-radio :label="true">是</el-radio>
  83. <el-radio :label="false">否</el-radio>
  84. </el-radio-group>
  85. </el-form-item>
  86. </el-col>
  87. <el-col :span="12">
  88. <el-form-item label="是否启用">
  89. <el-radio-group v-model="limitAddForm.enable">
  90. <el-radio :label="true">是</el-radio>
  91. <el-radio :label="false">否</el-radio>
  92. </el-radio-group>
  93. </el-form-item>
  94. </el-col>
  95. </el-row>
  96. <el-form-item label="限流规则描述">
  97. <el-input
  98. v-model="limitAddForm.description"
  99. placeholder="请输入描述"
  100. />
  101. </el-form-item>
  102. </el-form>
  103. </div>
  104. <div class="dialog-add-bottom center">
  105. <el-button size="medium" type="primary" @click="dialogAddShow = false"
  106. >提交</el-button
  107. >
  108. <el-button
  109. size="medium"
  110. class="btn-cancel"
  111. @click="dialogAddShow = false"
  112. >取消</el-button
  113. >
  114. </div>
  115. </Dialog>
  116. </div>
  117. </template>
  118. <script>
  119. import Search from "@/layout/components/Search";
  120. import NormalCard from "../components/NormalCard";
  121. import Dialog from "@/layout/components/Dialog";
  122. import { getGatewayLimitList } from "@/api/gateway";
  123. export default {
  124. name: "GatewayLimit",
  125. components: {
  126. Search,
  127. NormalCard,
  128. Dialog,
  129. },
  130. data() {
  131. return {
  132. limitList: [
  133. {
  134. id: 0,
  135. name: "访问规则名称",
  136. visitTimes: 21090,
  137. visitDuration: 21,
  138. inBlackList: true,
  139. flag: true,
  140. },
  141. ],
  142. limitAddForm: {
  143. visitTimes: "",
  144. visitDuration: "",
  145. inBlacklist: true,
  146. enable: true,
  147. description: "",
  148. },
  149. dialogAddShow: false,
  150. };
  151. },
  152. created() {
  153. this.fetchData();
  154. },
  155. methods: {
  156. fetchData() {
  157. this.listLoading = true;
  158. getGatewayLimitList().then((response) => {
  159. this.limitList.push(...response.data.items);
  160. console.log(this.limitList);
  161. this.listLoading = false;
  162. });
  163. },
  164. removeCard(index) {
  165. this.limitList.splice(index, 1);
  166. },
  167. },
  168. };
  169. </script>
  170. <style lang="scss" scoped>
  171. .gateway-limit-head {
  172. display: flex;
  173. justify-content: flex-end;
  174. }
  175. .gateway-limit-content {
  176. margin-top: 32px;
  177. height: calc(100vh - 224px);
  178. overflow-x: hidden;
  179. overflow-y: auto;
  180. & > .el-row > .el-col {
  181. margin-bottom: 24px;
  182. }
  183. ::v-deep .normal-card .card-content {
  184. & > .el-row > .el-col {
  185. margin-top: 21px;
  186. &:nth-child(1),
  187. &:nth-child(2) {
  188. margin-top: 0;
  189. }
  190. }
  191. .card-content-left {
  192. word-break: keep-all;
  193. }
  194. .card-content-right {
  195. color: #909399;
  196. word-break: break-all;
  197. }
  198. }
  199. }
  200. .dialog-add-title {
  201. font-size: 24px;
  202. font-weight: bold;
  203. color: #303133;
  204. }
  205. .dialog-add-content {
  206. margin-top: 48px;
  207. font-size: 14px;
  208. font-weight: 400;
  209. color: #303133;
  210. ::v-deep .el-input .el-input__inner {
  211. background-color: #f5f7fa;
  212. border: 1px solid #dcdfe6;
  213. border-radius: 8px;
  214. }
  215. }
  216. .dialog-add-bottom {
  217. margin-top: 48px;
  218. }
  219. </style>