Authored by 高磊

Merge branch 'wangfeng-500-dev' into 'master-500-dev'

Wangfeng 500 dev



See merge request !1233
@@ -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 -}