Merge branch 'wangfeng-500-dev' into 'master-500-dev'
Wangfeng 500 dev See merge request !1233
Showing
5 changed files
with
237 additions
and
246 deletions
@@ -48,32 +48,34 @@ layui.define(['common', 'swiper', 'admin', 'commonDetail', 'mxClient', 'sessions | @@ -48,32 +48,34 @@ layui.define(['common', 'swiper', 'admin', 'commonDetail', 'mxClient', 'sessions | ||
48 | }); | 48 | }); |
49 | } | 49 | } |
50 | 50 | ||
51 | - let list = [ | ||
52 | - { | ||
53 | - title:'这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称', | ||
54 | - level:'高', | ||
55 | - time:'2023-12-20 18:00:00', | ||
56 | - }, | ||
57 | - { | ||
58 | - title:'这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称', | ||
59 | - level:'高', | ||
60 | - time:'2023-12-20 18:00:00', | ||
61 | - }, | ||
62 | - ] | ||
63 | - vulnerabilityDialog(); | 51 | + var list = []; |
52 | + // 读取漏洞信息 | ||
53 | + getVulnebilityList(); | ||
54 | + function getVulnebilityList() { | ||
55 | + admin.req({ | ||
56 | + url: common.domainName + '/api-web/vulnerabilities/unread' | ||
57 | + , type: "get" | ||
58 | + , async: false | ||
59 | + , done: function (res) { | ||
60 | + if(res.data && res.data.length > 0){ | ||
61 | + list = res.data; | ||
62 | + vulnerabilityDialog(res.data) | ||
63 | + } | ||
64 | + } | ||
65 | + }); | ||
66 | + } | ||
64 | //漏洞处理弹窗 | 67 | //漏洞处理弹窗 |
65 | - function vulnerabilityDialog(){ | ||
66 | - let dom = ` | ||
67 | - <ul style="padding: 10px 15px;"> | 68 | + function vulnerabilityDialog(list){ |
69 | + let dom = ` <ul style="padding: 10px 15px;"> | ||
68 | ${ | 70 | ${ |
69 | list.map(item=>{ | 71 | list.map(item=>{ |
70 | return `<li style="padding: 20px 0px;border-bottom: 2px solid #ccc;"> | 72 | return `<li style="padding: 20px 0px;border-bottom: 2px solid #ccc;"> |
71 | <span style="color: #C41011;border-bottom: 1px solid;cursor: pointer;overflow: hidden; | 73 | <span style="color: #C41011;border-bottom: 1px solid;cursor: pointer;overflow: hidden; |
72 | text-overflow: ellipsis;white-space: nowrap;max-width: 100%;display: inline-block;" | 74 | text-overflow: ellipsis;white-space: nowrap;max-width: 100%;display: inline-block;" |
73 | - class="vulnerability-name">${item.title}</span> | 75 | + class="vulnerability-name" data-id="${item.id}">${item.name}</span> |
74 | <div style="margin-top: 20px;"> | 76 | <div style="margin-top: 20px;"> |
75 | <span style="margin-right: 30px;">漏洞级别:<span style="padding: 4px 10px;color: white;background-color: #C41011;border-radius: 4px;">${item.level}</span></span> | 77 | <span style="margin-right: 30px;">漏洞级别:<span style="padding: 4px 10px;color: white;background-color: #C41011;border-radius: 4px;">${item.level}</span></span> |
76 | - <span>披露时间:${item.time}</span> | 78 | + <span>披露时间: ${item.createTime}</span> |
77 | </div> | 79 | </div> |
78 | </li>` | 80 | </li>` |
79 | }).join('') | 81 | }).join('') |
@@ -91,64 +93,87 @@ layui.define(['common', 'swiper', 'admin', 'commonDetail', 'mxClient', 'sessions | @@ -91,64 +93,87 @@ layui.define(['common', 'swiper', 'admin', 'commonDetail', 'mxClient', 'sessions | ||
91 | btn: false, | 93 | btn: false, |
92 | move: false, | 94 | move: false, |
93 | success:()=>{ | 95 | success:()=>{ |
94 | - let dialogIndex=layer.index; | ||
95 | - $('.vulnerability-name').unbind("click").on('click',()=>{ | ||
96 | - layer.close(dialogIndex); | ||
97 | - let detail = ` | 96 | + let dialogIndex = layer.index; |
97 | + $('span.vulnerability-name').unbind("click").on('click',function () { | ||
98 | + admin.req({ | ||
99 | + url: common.domainName + '/api-web/vulnerabilities/byId?id='+$(this).data("id") | ||
100 | + , type: "get" | ||
101 | + , async: false | ||
102 | + , done: function (res) { | ||
103 | + if(res.object){ | ||
104 | + let d = res.object; | ||
105 | + layer.close(dialogIndex); | ||
106 | + let detail = ` | ||
98 | <form class="layui-form" style="margin-top: 15px;" lay-filter="vulnerabilityForm"> | 107 | <form class="layui-form" style="margin-top: 15px;" lay-filter="vulnerabilityForm"> |
99 | <div class="layui-form-item"> | 108 | <div class="layui-form-item"> |
100 | <label class="layui-form-label">漏洞名称:</label> | 109 | <label class="layui-form-label">漏洞名称:</label> |
101 | - <div class="layui-input-block">这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称</div> | 110 | + <div class="layui-input-block">${d.name}</div> |
102 | </div> | 111 | </div> |
103 | <div class="layui-form-item"> | 112 | <div class="layui-form-item"> |
104 | <label class="layui-form-label">漏洞详情:</label> | 113 | <label class="layui-form-label">漏洞详情:</label> |
105 | - <div class="layui-input-block">这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称</div> | 114 | + <div class="layui-input-block">${d.remark}</div> |
106 | </div> | 115 | </div> |
107 | <div class="layui-form-item"> | 116 | <div class="layui-form-item"> |
108 | <label class="layui-form-label">影响范围:</label> | 117 | <label class="layui-form-label">影响范围:</label> |
109 | - <div class="layui-input-block">这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称</div> | 118 | + <div class="layui-input-block">${d.impactSite}</div> |
110 | </div> | 119 | </div> |
111 | <div class="layui-form-item"> | 120 | <div class="layui-form-item"> |
112 | <label class="layui-form-label">修复建议:</label> | 121 | <label class="layui-form-label">修复建议:</label> |
113 | - <div class="layui-input-block">这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称</div> | 122 | + <div class="layui-input-block">${d.repairSuggestions}</div> |
114 | </div> | 123 | </div> |
115 | <div class="layui-form-item"> | 124 | <div class="layui-form-item"> |
116 | <label class="layui-form-label"><span style="color: red;">*</span>阅读状态:</label> | 125 | <label class="layui-form-label"><span style="color: red;">*</span>阅读状态:</label> |
117 | <div class="layui-input-inline"> | 126 | <div class="layui-input-inline"> |
118 | - <input type="radio" name="readStatus" value="已读" title="已读" lay-filter="readStatus"> | ||
119 | - <input type="radio" name="readStatus" value="未读" title="未读" lay-filter="readStatus" checked> | 127 | + <input type="radio" name="isRead" value="1" title="已读" lay-filter="isRead"checked> |
128 | + <input type="radio" name="isRead" value="0" title="未读" lay-filter="isRead"> | ||
120 | </div> | 129 | </div> |
121 | </div> | 130 | </div> |
122 | <div class="layui-form-item"> | 131 | <div class="layui-form-item"> |
123 | <label class="layui-form-label"><span style="color: red;">*</span>是否涉及:</label> | 132 | <label class="layui-form-label"><span style="color: red;">*</span>是否涉及:</label> |
124 | <div class="layui-input-inline"> | 133 | <div class="layui-input-inline"> |
125 | - <input type="radio" name="whether" value="是" title="是" lay-filter="whether"> | ||
126 | - <input type="radio" name="whether" value="否" title="否" lay-filter="whether" checked> | 134 | + <input type="radio" name="isRelated" value="1" title="是" lay-filter="isRelated"> |
135 | + <input type="radio" name="isRelated" value="0" title="否" lay-filter="isRelated" checked> | ||
127 | </div> | 136 | </div> |
137 | + <div><input type="hidden" id="vulnerabilitiesId" name="vulnerabilitiesId" value="${d.id}"></div> | ||
128 | </div> | 138 | </div> |
129 | </form> | 139 | </form> |
130 | ` | 140 | ` |
131 | - //漏洞处理抽屉 | ||
132 | - layer.open({ | ||
133 | - title: ['漏洞咨询', 'font-size:20px;background-color: #d0ddec;display:flex;align-items: center; justify-content: flex-start;'], | ||
134 | - type: 1, | ||
135 | - offset: 'rb', | ||
136 | - area: ['30%', '100%'], | ||
137 | - closeBtn:0, | ||
138 | - anim:3, | ||
139 | - content:detail, | ||
140 | - btn: ['确定'], | ||
141 | - move: false, | ||
142 | - success:()=>{ | ||
143 | - form.render(); | ||
144 | - }, | ||
145 | - yes:(index)=>{ | ||
146 | - console.log(form.val('vulnerabilityForm')); | ||
147 | - list.splice(0,1); | ||
148 | - layer.close(index); | ||
149 | - vulnerabilityDialog(); | 141 | + //漏洞处理抽屉 |
142 | + layer.open({ | ||
143 | + title: ['漏洞咨询', 'font-size:20px;background-color: #d0ddec;display:flex;align-items: center; justify-content: flex-start;'], | ||
144 | + type: 1, | ||
145 | + offset: 'rb', | ||
146 | + area: ['30%', '100%'], | ||
147 | + closeBtn:0, | ||
148 | + anim:3, | ||
149 | + content:detail, | ||
150 | + btn: ['确定'], | ||
151 | + move: false, | ||
152 | + success:()=>{ | ||
153 | + form.render(); | ||
154 | + }, | ||
155 | + yes:(index)=>{ | ||
156 | + var formData = form.val('vulnerabilityForm'); | ||
157 | + admin.req({ | ||
158 | + url: common.domainName + '/api-web/vulnerabilities/read?access_token=' + access_token | ||
159 | + , data: JSON.stringify(formData) | ||
160 | + , type: 'post' | ||
161 | + , contentType: "application/json; charset=utf-8" | ||
162 | + , done: function (res) { | ||
163 | + if (!res.success) { | ||
164 | + layer.msg(res.msg ? res.msg : '保存失败', {offset: '15px', icon: 7, time: 1000}); | ||
165 | + } | ||
166 | + } | ||
167 | + }); | ||
168 | + list = list.filter((item) => {return item.id != formData.vulnerabilitiesId}); | ||
169 | + layer.close(index); | ||
170 | + vulnerabilityDialog(list); | ||
171 | + } | ||
172 | + }) | ||
173 | + } | ||
150 | } | 174 | } |
151 | - }) | 175 | + }); |
176 | + | ||
152 | }) | 177 | }) |
153 | }, | 178 | }, |
154 | }) | 179 | }) |
@@ -4,18 +4,14 @@ | @@ -4,18 +4,14 @@ | ||
4 | <div class="condition esData-conditon" style="justify-content: space-between;width: 100%;"> | 4 | <div class="condition esData-conditon" style="justify-content: space-between;width: 100%;"> |
5 | <el-form :inline="true"> | 5 | <el-form :inline="true"> |
6 | <el-form-item> | 6 | <el-form-item> |
7 | - <el-input clearable :size="$global.elementConfig.size.input" v-model="queryParams.keyWord" placeholder="关键字搜索" /> | 7 | + <el-input clearable :size="$global.elementConfig.size.input" v-model="queryParams.name" placeholder="关键字搜索" /> |
8 | </el-form-item> | 8 | </el-form-item> |
9 | <el-form-item> | 9 | <el-form-item> |
10 | <el-select clearable :size="$global.elementConfig.size.input" v-model="queryParams.type" placeholder="漏洞类型"> | 10 | <el-select clearable :size="$global.elementConfig.size.input" v-model="queryParams.type" placeholder="漏洞类型"> |
11 | - <el-option :value="1">是</el-option> | ||
12 | - <el-option :value="0">否</el-option> | ||
13 | - </el-select> | ||
14 | - </el-form-item> | ||
15 | - <el-form-item> | ||
16 | - <el-select clearable :size="$global.elementConfig.size.input" v-model="queryParams.enabled" placeholder="是否涉及"> | ||
17 | - <el-option :value="1">是</el-option> | ||
18 | - <el-option :value="0">否</el-option> | 11 | + <el-option :value="1">高危漏洞</el-option> |
12 | + <el-option :value="2">中危漏洞</el-option> | ||
13 | + <el-option :value="3">低危漏洞</el-option> | ||
14 | + <el-option :value="4">信息漏洞</el-option> | ||
19 | </el-select> | 15 | </el-select> |
20 | </el-form-item> | 16 | </el-form-item> |
21 | <el-form-item> | 17 | <el-form-item> |
@@ -32,7 +28,7 @@ | @@ -32,7 +28,7 @@ | ||
32 | </el-row> | 28 | </el-row> |
33 | 29 | ||
34 | <div class="search-table"> | 30 | <div class="search-table"> |
35 | - <cm-table-page :columns="tableData.columns" :dataList="tableData.dataList" | 31 | + <cm-table-page :columns="tableData.columns" :dataList="dataList" |
36 | :height="height - 550" | 32 | :height="height - 550" |
37 | :loading="false" | 33 | :loading="false" |
38 | :pageSize="queryParams.pageSize" | 34 | :pageSize="queryParams.pageSize" |
@@ -44,21 +40,21 @@ | @@ -44,21 +40,21 @@ | ||
44 | :total="queryParams.count" | 40 | :total="queryParams.count" |
45 | @loaddata="loaddata"> | 41 | @loaddata="loaddata"> |
46 | <template #default="{row,prop,column}"> | 42 | <template #default="{row,prop,column}"> |
47 | - <span style="color: blue;cursor: pointer;text-decoration: underline;" v-if="prop=='name'" @click="handleView">{{row.name}}</span> | 43 | + |
48 | </template> | 44 | </template> |
49 | <template #tools="{scope}"> | 45 | <template #tools="{scope}"> |
50 | <div class="list-handle"> | 46 | <div class="list-handle"> |
51 | <span class="icon-bg" @click="handleFun(scope.row)"> | 47 | <span class="icon-bg" @click="handleFun(scope.row)"> |
52 | - <i class="el-icon-document" title="处理"></i> | 48 | + <i class="el-icon-s-check" title="处理"></i> |
53 | </span> | 49 | </span> |
54 | <span class="icon-bg" @click="handleDetail(scope.row)"> | 50 | <span class="icon-bg" @click="handleDetail(scope.row)"> |
55 | - <i class="el-icon-document" title="详情"></i> | 51 | + <i class="el-icon-view" title="详情"></i> |
56 | </span> | 52 | </span> |
57 | - <span class="icon-bg"@click="handleDel(scope.row)"> | 53 | + <span class="icon-bg" @click="handleDel(scope.row)"> |
58 | <i class="el-icon-delete"></i> | 54 | <i class="el-icon-delete"></i> |
59 | </span> | 55 | </span> |
60 | <span class="icon-bg"@click="handleDownload(scope.row)"> | 56 | <span class="icon-bg"@click="handleDownload(scope.row)"> |
61 | - <i class="el-icon-delete" title="下载"></i> | 57 | + <i class="el-icon-download" title="下载"></i> |
62 | </span> | 58 | </span> |
63 | </div> | 59 | </div> |
64 | </template> | 60 | </template> |
@@ -80,26 +76,28 @@ | @@ -80,26 +76,28 @@ | ||
80 | <el-form-item label="漏洞名称" prop="name"> | 76 | <el-form-item label="漏洞名称" prop="name"> |
81 | <el-input :size="$global.elementConfig.size.input" clearable v-model="docForm.name"></el-input> | 77 | <el-input :size="$global.elementConfig.size.input" clearable v-model="docForm.name"></el-input> |
82 | </el-form-item> | 78 | </el-form-item> |
83 | - <el-form-item label="漏洞级别" prop="level"> | ||
84 | - <el-select v-model="docForm.level" style="width: 100%;"> | ||
85 | - <el-option :value="3">高</el-option> | ||
86 | - <el-option :value="2">中</el-option> | ||
87 | - <el-option :value="1">低</el-option> | 79 | + <el-form-item label="漏洞级别" prop="type"> |
80 | + <el-select v-model="docForm.type" style="width: 100%;"> | ||
81 | + <el-option :value="1">高危漏洞</el-option> | ||
82 | + <el-option :value="2">中危漏洞</el-option> | ||
83 | + <el-option :value="3">低危漏洞</el-option> | ||
84 | + <el-option :value="4">信息漏洞</el-option> | ||
88 | </el-select> | 85 | </el-select> |
89 | </el-form-item> | 86 | </el-form-item> |
90 | - <el-form-item label="漏洞详情" prop="detail"> | ||
91 | - <el-input type="textarea" v-model="docForm.detail"></el-input> | 87 | + <el-form-item label="存在站点" prop="existsSite"> |
88 | + <el-input type="textarea" v-model="docForm.existsSite"></el-input> | ||
92 | </el-form-item> | 89 | </el-form-item> |
93 | - <el-form-item label="影响范围" prop="reach"> | ||
94 | - <el-input type="textarea" v-model="docForm.reach"></el-input> | 90 | + <el-form-item label="漏洞详情" prop="remark"> |
91 | + <el-input type="textarea" v-model="docForm.remark"></el-input> | ||
95 | </el-form-item> | 92 | </el-form-item> |
96 | - <el-form-item label="修复建议" prop="response"> | ||
97 | - <el-input type="textarea" v-model="docForm.response"></el-input> | 93 | + <el-form-item label="影响范围" prop="impactSite"> |
94 | + <el-input type="textarea" v-model="docForm.impactSite"></el-input> | ||
98 | </el-form-item> | 95 | </el-form-item> |
99 | - <el-form-item label="录入人" prop="createUser"> | ||
100 | - <el-input v-model="docForm.createUser"></el-input> | 96 | + <el-form-item label="修复建议" prop="repairSuggestions"> |
97 | + <el-input type="textarea" v-model="docForm.repairSuggestions"></el-input> | ||
101 | </el-form-item> | 98 | </el-form-item> |
102 | 99 | ||
100 | + | ||
103 | <el-form-item> | 101 | <el-form-item> |
104 | <el-button :size="$global.elementConfig.size.button" @click="addFolder('ruleForm')" type="primary"> | 102 | <el-button :size="$global.elementConfig.size.button" @click="addFolder('ruleForm')" type="primary"> |
105 | 保存 | 103 | 保存 |
@@ -121,27 +119,20 @@ | @@ -121,27 +119,20 @@ | ||
121 | ref="handleRefForm"> | 119 | ref="handleRefForm"> |
122 | 120 | ||
123 | <el-form-item label="厂商" prop="manufacturer"> | 121 | <el-form-item label="厂商" prop="manufacturer"> |
124 | - <el-input :size="$global.elementConfig.size.input" clearable v-model="handleForm.manufacturer"></el-input> | 122 | + <el-input :size="$global.elementConfig.size.input" clearable v-model="handleForm.manufacturer" disabled></el-input> |
125 | </el-form-item> | 123 | </el-form-item> |
126 | - <el-form-item label="处理人" prop="user"> | ||
127 | - <el-select v-model="handleForm.user" style="width: 100%;"> | ||
128 | - <el-option :value="3">高</el-option> | ||
129 | - <el-option :value="2">中</el-option> | ||
130 | - <el-option :value="1">低</el-option> | ||
131 | - </el-select> | ||
132 | - </el-form-item> | ||
133 | - <el-form-item label="处理时间" prop="time"> | ||
134 | - <el-date-picker v-model="handleForm.time"></el-date-picker> | 124 | + |
125 | + <el-form-item label="处理时间" prop="solveTime"> | ||
126 | + <el-date-picker v-model="handleForm.solveTime"></el-date-picker> | ||
135 | </el-form-item> | 127 | </el-form-item> |
136 | - <el-form-item label="处理情况" prop="state"> | ||
137 | - <el-select v-model="handleForm.state" style="width: 100%;"> | ||
138 | - <el-option :value="3">高</el-option> | ||
139 | - <el-option :value="2">中</el-option> | ||
140 | - <el-option :value="1">低</el-option> | 128 | + <el-form-item label="处理情况" prop="solveResult"> |
129 | + <el-select v-model="handleForm.solveResult" style="width: 100%;"> | ||
130 | + <el-option :value="1">已处理</el-option> | ||
131 | + <el-option :value="0">未处理</el-option> | ||
141 | </el-select> | 132 | </el-select> |
142 | </el-form-item> | 133 | </el-form-item> |
143 | - <el-form-item label="备注" prop="remark"> | ||
144 | - <el-input type="textarea" v-model="handleForm.remark"></el-input> | 134 | + <el-form-item label="处理说明" prop="solveRemark"> |
135 | + <el-input type="textarea" v-model="handleForm.solveRemark"></el-input> | ||
145 | </el-form-item> | 136 | </el-form-item> |
146 | 137 | ||
147 | <el-form-item> | 138 | <el-form-item> |
@@ -166,38 +157,44 @@ | @@ -166,38 +157,44 @@ | ||
166 | <ul> | 157 | <ul> |
167 | <li style="margin-bottom: 15px;display: flex;"> | 158 | <li style="margin-bottom: 15px;display: flex;"> |
168 | <div style="width: 80px;">漏洞名称:</div> | 159 | <div style="width: 80px;">漏洞名称:</div> |
169 | - <div style="flex: 1;">这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称</div> | 160 | + <div style="flex: 1;">{{detail.name}}</div> |
170 | </li> | 161 | </li> |
171 | <li style="margin-bottom: 15px;display: flex;"> | 162 | <li style="margin-bottom: 15px;display: flex;"> |
172 | <div style="width: 80px;">漏洞级别:</div> | 163 | <div style="width: 80px;">漏洞级别:</div> |
173 | - <div style="flex: 1;">高</div> | 164 | + <div style="flex: 1;">{{detail.level}}</div> |
174 | </li> | 165 | </li> |
175 | <li style="margin-bottom: 15px;display: flex;"> | 166 | <li style="margin-bottom: 15px;display: flex;"> |
176 | <div style="width: 80px;">漏洞详情:</div> | 167 | <div style="width: 80px;">漏洞详情:</div> |
177 | - <div style="flex: 1;">这是漏洞详情这是漏洞详情这是漏洞详情这是漏洞详情这是漏洞详情这是漏洞详情这是漏洞详情这是漏洞详情这是漏洞详情这是漏洞详情</div> | 168 | + <div style="flex: 1;">{{detail.remark}}</div> |
178 | </li> | 169 | </li> |
179 | <li style="margin-bottom: 15px;display: flex;"> | 170 | <li style="margin-bottom: 15px;display: flex;"> |
180 | <div style="width: 80px;">影响范围:</div> | 171 | <div style="width: 80px;">影响范围:</div> |
181 | - <div style="flex: 1;">这是影响范围这是影响范围这是影响范围这是影响范围这是影响范围这是影响范围这是影响范围这是影响范围这是影响范围这是影响范围这是影响范围这是影响范围这是影响范围</div> | 172 | + <div style="flex: 1;">{{detail.impactSite}}</div> |
182 | </li> | 173 | </li> |
183 | <li style="margin-bottom: 15px;display: flex;"> | 174 | <li style="margin-bottom: 15px;display: flex;"> |
184 | <div style="width: 80px;">修复建议:</div> | 175 | <div style="width: 80px;">修复建议:</div> |
185 | - <div style="flex: 1;">这是修复建议这是影响范围这是影响范围这是影响范围这是影响范围这是影响范围这是影响范围这是影响范围这是影响范围这是影响范围这是影响范围这是影响范围这是影响范围</div> | 176 | + <div style="flex: 1;">{{detail.repairSuggestions}}</div> |
186 | </li> | 177 | </li> |
187 | <li style="margin-bottom: 15px;display: flex;"> | 178 | <li style="margin-bottom: 15px;display: flex;"> |
188 | <div style="width: 80px;">录入人:</div> | 179 | <div style="width: 80px;">录入人:</div> |
189 | - <div style="flex: 1;">录入人</div> | 180 | + <div style="flex: 1;">{{detail.createUserName}}</div> |
190 | </li> | 181 | </li> |
191 | </ul> | 182 | </ul> |
192 | 183 | ||
193 | - <el-table :data="viewManuResult"> | ||
194 | - <el-table-column align="center" prop="manu" label="处理厂商" width="100" show-overflow-tooltip/> | ||
195 | - <el-table-column align="center" prop="status" label="处理状态" width="80" /> | ||
196 | - <el-table-column align="center" prop="user" label="处理人" width="80" /> | ||
197 | - <el-table-column align="center" prop="time" label="处理时间" width="160" /> | ||
198 | - <el-table-column align="center" prop="info" label="处理说明" /> | 184 | + <el-table :data="detail.resolutions" v-if="detail.resolutions.length > 0"> |
185 | + <el-table-column align="center" prop="manufacturerName" label="处理厂商" width="100" show-overflow-tooltip/> | ||
186 | + <el-table-column align="center" prop="solveResult" label="处理状态" width="80" > | ||
187 | + <template #default="scope"> | ||
188 | + <span v-if="scope.row.solveResult == '0'">未处理</span> | ||
189 | + <span v-if="scope.row.solveResult == '1'">已处理</span> | ||
190 | + </template> | ||
191 | + </el-table-column> | ||
192 | + <el-table-column align="center" prop="solveUserName" label="处理人" width="120" /> | ||
193 | + <el-table-column align="center" prop="solveTime" label="处理时间" width="160" /> | ||
194 | + <el-table-column align="center" prop="solveRemark" label="处理说明" /> | ||
195 | + | ||
199 | </el-table> | 196 | </el-table> |
200 | </div> | 197 | </div> |
201 | </el-drawer> | 198 | </el-drawer> |
202 | 199 | ||
203 | -</div> | ||
200 | +</div> |
@@ -5,29 +5,18 @@ export default { | @@ -5,29 +5,18 @@ export default { | ||
5 | const {proxy} = Vue.getCurrentInstance() | 5 | const {proxy} = Vue.getCurrentInstance() |
6 | let height = Vue.ref(window.innerHeight); | 6 | let height = Vue.ref(window.innerHeight); |
7 | let queryParams = Vue.ref({ | 7 | let queryParams = Vue.ref({ |
8 | - keyWord:'', | 8 | + name:'', |
9 | type:'', | 9 | type:'', |
10 | - enabled:'', | ||
11 | - pageNum: 1, | 10 | + pageNo:1, |
12 | pageSize: 10, | 11 | pageSize: 10, |
13 | count:0, | 12 | count:0, |
14 | }) | 13 | }) |
15 | 14 | ||
16 | let tableData = Vue.ref({ | 15 | let tableData = Vue.ref({ |
17 | - count: 0, | ||
18 | - dataList: [ | ||
19 | - { | ||
20 | - name:'测试', | ||
21 | - level:'高', | ||
22 | - time:'', | ||
23 | - admin:'', | ||
24 | - busTypeName:'', | ||
25 | - } | ||
26 | - ], | ||
27 | columns: [ | 16 | columns: [ |
28 | { | 17 | { |
29 | prop: 'name', | 18 | prop: 'name', |
30 | - label: '名称', | 19 | + label: '漏洞名称', |
31 | sortable: true, | 20 | sortable: true, |
32 | align: 'center', | 21 | align: 'center', |
33 | width: '200', | 22 | width: '200', |
@@ -39,32 +28,44 @@ export default { | @@ -39,32 +28,44 @@ export default { | ||
39 | align: 'center' | 28 | align: 'center' |
40 | }, | 29 | }, |
41 | { | 30 | { |
42 | - prop: 'time', | ||
43 | - label: '披露时间', | 31 | + prop: 'existsSite', |
32 | + label: '存在站点', | ||
44 | sortable: true, | 33 | sortable: true, |
45 | align: 'center', | 34 | align: 'center', |
46 | width: '130' | 35 | width: '130' |
47 | - }, { | ||
48 | - prop: 'admin', | ||
49 | - label: '阅读情况', | 36 | + }, |
37 | + { | ||
38 | + prop: 'impactSite', | ||
39 | + label: '影响范围', | ||
50 | sortable: true, | 40 | sortable: true, |
51 | align: 'center', | 41 | align: 'center', |
52 | - width: '130' | 42 | + width: '150' |
43 | + }, | ||
44 | + { | ||
45 | + prop: 'createTime', | ||
46 | + label: '披露时间', | ||
47 | + sortable: true, | ||
48 | + align: 'center', | ||
49 | + width: '180' | ||
53 | }, { | 50 | }, { |
54 | - prop: 'busTypeName', | ||
55 | - label: '处理情况', | 51 | + prop: 'repairPriority', |
52 | + label: '处理优先级', | ||
56 | sortable: true, | 53 | sortable: true, |
57 | align: 'center', | 54 | align: 'center', |
58 | - width: '270' | ||
59 | - }, | 55 | + width: '130' |
56 | + } | ||
60 | ] | 57 | ] |
61 | }) | 58 | }) |
62 | 59 | ||
60 | + let dataList = Vue.ref([]); | ||
61 | + let totalCount = Vue.ref(0); | ||
62 | + | ||
63 | let addDialogVisible = Vue.ref(false) | 63 | let addDialogVisible = Vue.ref(false) |
64 | let addDialogTitle = Vue.ref('') | 64 | let addDialogTitle = Vue.ref('') |
65 | 65 | ||
66 | // 新增按钮 | 66 | // 新增按钮 |
67 | const handleAdd = ()=>{ | 67 | const handleAdd = ()=>{ |
68 | + getManufacturer(); | ||
68 | addDialogVisible.value = true; | 69 | addDialogVisible.value = true; |
69 | addDialogTitle.value = '新增'; | 70 | addDialogTitle.value = '新增'; |
70 | } | 71 | } |
@@ -78,16 +79,18 @@ export default { | @@ -78,16 +79,18 @@ export default { | ||
78 | docForm.value = { | 79 | docForm.value = { |
79 | name:'', | 80 | name:'', |
80 | level:'', | 81 | level:'', |
81 | - detail:'', | ||
82 | - reach:'', | ||
83 | - response:'', | ||
84 | - createUser:'', | 82 | + remark:'', |
83 | + impactSite:'', | ||
84 | + repairSuggestions:'' | ||
85 | } | 85 | } |
86 | } | 86 | } |
87 | + // 保存漏洞 | ||
87 | const addFolder = ()=>{ | 88 | const addFolder = ()=>{ |
88 | ruleForm.value.validate((validate)=>{ | 89 | ruleForm.value.validate((validate)=>{ |
89 | if (validate){ | 90 | if (validate){ |
90 | - | 91 | + proxy.$http.post('/api-web/vulnerabilities/save', docForm.value, function (res) { |
92 | + addDialogVisible.value = false; | ||
93 | + }) | ||
91 | } | 94 | } |
92 | }) | 95 | }) |
93 | } | 96 | } |
@@ -95,10 +98,9 @@ export default { | @@ -95,10 +98,9 @@ export default { | ||
95 | let docForm = Vue.ref({ | 98 | let docForm = Vue.ref({ |
96 | name:'', | 99 | name:'', |
97 | level:'', | 100 | level:'', |
98 | - detail:'', | ||
99 | - reach:'', | ||
100 | - response:'', | ||
101 | - createUser:'', | 101 | + remark:'', |
102 | + impactSite:'', | ||
103 | + repairSuggestions:'', | ||
102 | }) | 104 | }) |
103 | let docRulesForm = Vue.ref({ | 105 | let docRulesForm = Vue.ref({ |
104 | name:[ | 106 | name:[ |
@@ -107,25 +109,35 @@ export default { | @@ -107,25 +109,35 @@ export default { | ||
107 | level:[ | 109 | level:[ |
108 | { required: true, message: '请选择漏洞级别', trigger: 'blur' }, | 110 | { required: true, message: '请选择漏洞级别', trigger: 'blur' }, |
109 | ], | 111 | ], |
110 | - detail:[ | 112 | + remark:[ |
111 | { required: true, message: '请输入漏洞详情', trigger: 'blur' }, | 113 | { required: true, message: '请输入漏洞详情', trigger: 'blur' }, |
112 | ], | 114 | ], |
113 | - reach:[ | 115 | + impactSite:[ |
114 | { required: true, message: '请输入影响范围', trigger: 'blur' }, | 116 | { required: true, message: '请输入影响范围', trigger: 'blur' }, |
115 | ], | 117 | ], |
116 | - response:[ | 118 | + repairSuggestions:[ |
117 | { required: true, message: '请输入修复建议', trigger: 'blur' }, | 119 | { required: true, message: '请输入修复建议', trigger: 'blur' }, |
118 | - ], | ||
119 | - createUser:[ | ||
120 | - { required: true, message: '请输入录入人', trigger: 'blur' }, | ||
121 | ] | 120 | ] |
122 | }) | 121 | }) |
123 | let ruleForm = Vue.ref(); | 122 | let ruleForm = Vue.ref(); |
123 | + let detail = Vue.ref({}); | ||
124 | 124 | ||
125 | + let viewDrawer = Vue.ref(false) | ||
125 | 126 | ||
127 | + // 查看详细 | ||
128 | + const handleDetail = (obj) =>{ | ||
129 | + viewDrawer.value = true; | ||
130 | + proxy.$http.get('/api-web/vulnerabilities/detail', {id:obj.id}, function (res) { | ||
131 | + if (res.object) { | ||
132 | + detail.value = res.object; | ||
133 | + } | ||
134 | + }) | ||
135 | + } | ||
126 | // 处理按钮 | 136 | // 处理按钮 |
127 | - let handleFun = ()=>{ | 137 | + let handleFun = (v)=>{ |
128 | handleVisible.value = true; | 138 | handleVisible.value = true; |
139 | + handleForm.value.vulnerabilitiesId = v.id; | ||
140 | + getManufacturer(); | ||
129 | } | 141 | } |
130 | let handleVisible = Vue.ref(false); | 142 | let handleVisible = Vue.ref(false); |
131 | const showHandleFolder = ()=>{ | 143 | const showHandleFolder = ()=>{ |
@@ -133,62 +145,75 @@ export default { | @@ -133,62 +145,75 @@ export default { | ||
133 | } | 145 | } |
134 | let handleForm = Vue.ref({ | 146 | let handleForm = Vue.ref({ |
135 | manufacturer:'', | 147 | manufacturer:'', |
136 | - user:'', | ||
137 | - time:'', | ||
138 | - state:'', | ||
139 | - remark:'', | 148 | + solveResult:'', |
149 | + solveRemark:'', | ||
150 | + solveTime:'', | ||
151 | + vulnerabilitiesId:'' | ||
152 | + | ||
140 | }) | 153 | }) |
141 | let handleRulesForm = Vue.ref({ | 154 | let handleRulesForm = Vue.ref({ |
142 | - manufacturer:[{ | ||
143 | - required: true, message: '请输入厂商名称', trigger: 'blur' | ||
144 | - }], | ||
145 | - user:[{ | ||
146 | - required: true, message: '请输入处理人', trigger: 'blur' | 155 | + solveResult:[{ |
156 | + required: true, message: '请输出处理结果', trigger: 'blur' | ||
147 | }], | 157 | }], |
148 | - time:[{ | 158 | + solveTime:[{ |
149 | required: true, message: '请输入处理时间', trigger: 'blur' | 159 | required: true, message: '请输入处理时间', trigger: 'blur' |
150 | }], | 160 | }], |
151 | - state:[{ | 161 | + solveRemark:[{ |
152 | required: true, message: '请输入处理情况', trigger: 'blur' | 162 | required: true, message: '请输入处理情况', trigger: 'blur' |
153 | }] | 163 | }] |
154 | }) | 164 | }) |
155 | let handleRefForm = Vue.ref(); | 165 | let handleRefForm = Vue.ref(); |
166 | + // 保存处理漏洞 | ||
156 | const addHandelFolder = ()=>{ | 167 | const addHandelFolder = ()=>{ |
157 | handleRefForm.value.validate((validate)=>{ | 168 | handleRefForm.value.validate((validate)=>{ |
158 | if (validate){ | 169 | if (validate){ |
170 | + proxy.$http.post('/api-web/vulnerabilities/solve',handleForm.value, function (res) { | ||
171 | + handleVisible.value = false; | ||
172 | + }) | ||
173 | + } | ||
174 | + }) | ||
175 | + } | ||
159 | 176 | ||
177 | + //删除 | ||
178 | + const handleDel = (v) =>{ | ||
179 | + proxy.$global.confirm("删除后将不可恢复,您确定要删除吗?", function () { | ||
180 | + proxy.$http.get('/api-web/vulnerabilities/delete',{id:v.id}, function (res) { | ||
181 | + if(res.success){ | ||
182 | + proxy.$global.showMsg('删除成功'); | ||
183 | + getVulnerabilityList(); | ||
184 | + }else{ | ||
185 | + proxy.$global.showMsg(res.msg, 'warning'); | ||
186 | + } | ||
187 | + }) | ||
188 | + }); | ||
189 | + | ||
190 | + } | ||
191 | + | ||
192 | + // 获取当前登陆人所属厂商 | ||
193 | + const getManufacturer = ()=>{ | ||
194 | + proxy.$http.get('/api-web/vulnerabilities/manufacturer',{}, function (res) { | ||
195 | + console.log("res---->",res.str) | ||
196 | + handleForm.value.manufacturer = res.str; | ||
197 | + }) | ||
198 | + } | ||
199 | + | ||
200 | + // 获取漏洞列表 | ||
201 | + const getVulnerabilityList = ()=>{ | ||
202 | + proxy.$http.get('/api-web/vulnerabilities/list', queryParams, function (res) { | ||
203 | + if (res.data) { | ||
204 | + dataList.value = res.data; | ||
205 | + queryParams.value.count = res.count; | ||
160 | } | 206 | } |
161 | }) | 207 | }) |
162 | } | 208 | } |
163 | 209 | ||
164 | - let viewDrawer = Vue.ref(false) | ||
165 | - const handleView = ()=>{ | ||
166 | - viewDrawer.value = true; | 210 | + // 查询 |
211 | + const handleQuery = () => { | ||
212 | + getVulnerabilityList(); | ||
167 | } | 213 | } |
168 | - let viewManuResult = Vue.ref([ | ||
169 | - { | ||
170 | - manu:'厂商名', | ||
171 | - status:'已处理', | ||
172 | - user:'测试用户', | ||
173 | - time:'2020-12-22 17:00:00', | ||
174 | - info:'处理信息处理信息处理信息处理信息处理信息处理信息处理信息处理信息处理信息处理信息处理信息' | ||
175 | - },{ | ||
176 | - manu:'厂商名', | ||
177 | - status:'已处理', | ||
178 | - user:'测试用户', | ||
179 | - time:'2020-12-22 17:00:00', | ||
180 | - info:'处理信息处理信息处理信息处理信息处理信息处理信息处理信息处理信息处理信息处理信息处理信息' | ||
181 | - },{ | ||
182 | - manu:'厂商名', | ||
183 | - status:'已处理', | ||
184 | - user:'测试用户', | ||
185 | - time:'2020-12-22 17:00:00', | ||
186 | - info:'处理信息处理信息处理信息处理信息处理信息处理信息处理信息处理信息处理信息处理信息处理信息' | ||
187 | - } | ||
188 | - ]) | ||
189 | 214 | ||
190 | Vue.onMounted(() => { | 215 | Vue.onMounted(() => { |
191 | - | 216 | + getVulnerabilityList(); |
192 | }) | 217 | }) |
193 | 218 | ||
194 | return { | 219 | return { |
@@ -210,9 +235,12 @@ export default { | @@ -210,9 +235,12 @@ export default { | ||
210 | handleRefForm, | 235 | handleRefForm, |
211 | handleRulesForm, | 236 | handleRulesForm, |
212 | handleForm, | 237 | handleForm, |
213 | - handleView, | 238 | + handleDel, |
239 | + handleDetail, | ||
240 | + dataList, | ||
241 | + handleQuery, | ||
214 | viewDrawer, | 242 | viewDrawer, |
215 | - viewManuResult, | 243 | + detail |
216 | }; | 244 | }; |
217 | }, | 245 | }, |
218 | -} | ||
246 | +} |
1 | -<div class="cm-card" style="text-align: left;padding: 10px 15px;"> | ||
2 | - <ul> | ||
3 | - <li v-for="(item,index) in list" :key="index" style="padding: 20px 0px;border-bottom: 2px solid #ccc;"> | ||
4 | - <span style="color: red;border-bottom: 1px solid;cursor: pointer" @click="handleDetail">{{item.title}}</span> | ||
5 | - <div style="margin-top: 20px;"> | ||
6 | - <span style="margin-right: 20px;">漏洞级别:<span style="padding: 2px 4px;color: white;background-color: red;">{{item.level}}</span></span> | ||
7 | - <span>披露时间:{{item.time}}</span> | ||
8 | - </div> | ||
9 | - </li> | ||
10 | - </ul> | ||
11 | -</div> | ||
12 | - | ||
13 | -<cm-dialog :showDialogVisible="addDialogVisible" :showFooter="false" :title="addDialogTitle" @hidedialog="showFolder" | ||
14 | - width="600px"> | ||
15 | - | ||
16 | -</cm-dialog> | ||
17 | - | ||
18 | -<el-drawer | ||
19 | - v-model="drawer" | ||
20 | - title="I am the title" | ||
21 | - direction="rtl" | ||
22 | - > | ||
23 | - <span>Hi, there!</span> | ||
24 | -</el-drawer> |
1 | -export default { | ||
2 | - name: 'vulnerableilityList', | ||
3 | - template: '', | ||
4 | - setup(props, {attrs, slots, emit}) { | ||
5 | - const {proxy} = Vue.getCurrentInstance() | ||
6 | - | ||
7 | - let list = Vue.ref([ | ||
8 | - { | ||
9 | - title:'这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称', | ||
10 | - level:'高', | ||
11 | - time:'2023-12-20 18:00:00', | ||
12 | - }, | ||
13 | - { | ||
14 | - title:'这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称这是漏洞名称', | ||
15 | - level:'高', | ||
16 | - time:'2023-12-20 18:00:00', | ||
17 | - }, | ||
18 | - ]) | ||
19 | - | ||
20 | - let drawer = Vue.ref(false); | ||
21 | - const handleDetail = ()=>{ | ||
22 | - drawer.value = true; | ||
23 | - } | ||
24 | - | ||
25 | - Vue.onMounted(() => { | ||
26 | - | ||
27 | - }) | ||
28 | - | ||
29 | - return { | ||
30 | - list, | ||
31 | - handleDetail, | ||
32 | - drawer, | ||
33 | - }; | ||
34 | - }, | ||
35 | -} |
-
Please register or login to post a comment