candidate search

This commit is contained in:
caoqianming 2020-09-02 12:09:32 +08:00
parent 0053c1d52e
commit ec81c5b3e2
9 changed files with 224 additions and 108 deletions

View File

@ -875,75 +875,6 @@
"to-fast-properties": "^2.0.0"
}
},
"@ckeditor/ckeditor5-build-classic": {
"version": "18.0.0",
"resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-build-classic/-/ckeditor5-build-classic-18.0.0.tgz",
"integrity": "sha512-7nyaDU5sUSl+7wXPwr0d5bOlO2e0LRQh2iJJCJfAjjuUESwtiBGoFC+Ql5dEht0xlfARoSWQMlkUvGuHOVja7A=="
},
"@ckeditor/ckeditor5-core": {
"version": "18.0.0",
"resolved": "https://registry.npm.taobao.org/@ckeditor/ckeditor5-core/download/@ckeditor/ckeditor5-core-18.0.0.tgz",
"integrity": "sha1-71NcvrPEgY1GPkXnhEY/k3vy1js=",
"requires": {
"@ckeditor/ckeditor5-engine": "^18.0.0",
"@ckeditor/ckeditor5-utils": "^18.0.0",
"lodash-es": "^4.17.10"
}
},
"@ckeditor/ckeditor5-editor-classic": {
"version": "18.0.0",
"resolved": "https://registry.npm.taobao.org/@ckeditor/ckeditor5-editor-classic/download/@ckeditor/ckeditor5-editor-classic-18.0.0.tgz",
"integrity": "sha1-YquzsVFShohUzoJJ/8MKRT8k/ek=",
"requires": {
"@ckeditor/ckeditor5-core": "^18.0.0",
"@ckeditor/ckeditor5-engine": "^18.0.0",
"@ckeditor/ckeditor5-ui": "^18.0.0",
"@ckeditor/ckeditor5-utils": "^18.0.0",
"lodash-es": "^4.17.10"
}
},
"@ckeditor/ckeditor5-engine": {
"version": "18.0.0",
"resolved": "https://registry.npm.taobao.org/@ckeditor/ckeditor5-engine/download/@ckeditor/ckeditor5-engine-18.0.0.tgz",
"integrity": "sha1-iKtK8/zggGuQ/drZjJDRYkFlst4=",
"requires": {
"@ckeditor/ckeditor5-utils": "^18.0.0",
"lodash-es": "^4.17.10"
}
},
"@ckeditor/ckeditor5-ui": {
"version": "18.0.0",
"resolved": "https://registry.npm.taobao.org/@ckeditor/ckeditor5-ui/download/@ckeditor/ckeditor5-ui-18.0.0.tgz",
"integrity": "sha1-GSlSk6IwAR3tU/5OYgQFppwMsRU=",
"requires": {
"@ckeditor/ckeditor5-core": "^18.0.0",
"@ckeditor/ckeditor5-utils": "^18.0.0",
"lodash-es": "^4.17.10"
}
},
"@ckeditor/ckeditor5-upload": {
"version": "18.0.0",
"resolved": "https://registry.npm.taobao.org/@ckeditor/ckeditor5-upload/download/@ckeditor/ckeditor5-upload-18.0.0.tgz",
"integrity": "sha1-ay1FTh3+rcKQQW7UrkJNGGQktfo=",
"requires": {
"@ckeditor/ckeditor5-core": "^18.0.0",
"@ckeditor/ckeditor5-ui": "^18.0.0",
"@ckeditor/ckeditor5-utils": "^18.0.0"
}
},
"@ckeditor/ckeditor5-utils": {
"version": "18.0.0",
"resolved": "https://registry.npm.taobao.org/@ckeditor/ckeditor5-utils/download/@ckeditor/ckeditor5-utils-18.0.0.tgz",
"integrity": "sha1-lc1mYcAA6RV+u3BSoUKp2qNLU4g=",
"requires": {
"lodash-es": "^4.17.10"
}
},
"@ckeditor/ckeditor5-vue": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-vue/-/ckeditor5-vue-1.0.1.tgz",
"integrity": "sha512-4MaQwZ04cWwqYW0732sg2aqx9ILeHIP0LSLKUuLCLR21qYONZPvxY/V/czh1DH99toaL/iwPvEoJtO2ldriPaA=="
},
"@hapi/address": {
"version": "2.1.4",
"resolved": "https://registry.npm.taobao.org/@hapi/address/download/@hapi/address-2.1.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40hapi%2Faddress%2Fdownload%2F%40hapi%2Faddress-2.1.4.tgz",
@ -3485,12 +3416,11 @@
"dev": true
},
"cfb": {
"version": "1.1.3",
"resolved": "https://registry.npm.taobao.org/cfb/download/cfb-1.1.3.tgz",
"integrity": "sha1-Bd5oFiWcjovDJxOrqQVgjuOF32Y=",
"version": "1.2.0",
"resolved": "https://registry.npm.taobao.org/cfb/download/cfb-1.2.0.tgz",
"integrity": "sha1-ak0IcrUl7WA0nh71H7Swv3Psqag=",
"requires": {
"adler-32": "~1.2.0",
"commander": "^2.16.0",
"crc-32": "~1.2.0",
"printj": "~1.1.2"
}
@ -3577,14 +3507,6 @@
"dev": true,
"optional": true
},
"ckeditor4-vue": {
"version": "0.2.0",
"resolved": "https://registry.npm.taobao.org/ckeditor4-vue/download/ckeditor4-vue-0.2.0.tgz",
"integrity": "sha1-blzFN9dsQEm31CPYapeqFBivUQA=",
"requires": {
"load-script": "^1.0.0"
}
},
"class-utils": {
"version": "0.3.6",
"resolved": "https://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz",
@ -3735,7 +3657,7 @@
"dependencies": {
"commander": {
"version": "2.14.1",
"resolved": "https://registry.npm.taobao.org/commander/download/commander-2.14.1.tgz?cache=0&sync_timestamp=1580710597193&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.14.1.tgz",
"resolved": "https://registry.npm.taobao.org/commander/download/commander-2.14.1.tgz?cache=0&sync_timestamp=1598576046744&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.14.1.tgz",
"integrity": "sha1-IjUSPjevjKPGXfRbAm29NXsBuao="
}
}
@ -3797,7 +3719,8 @@
"commander": {
"version": "2.20.3",
"resolved": "https://registry.npm.taobao.org/commander/download/commander-2.20.3.tgz",
"integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM="
"integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=",
"dev": true
},
"commondir": {
"version": "1.0.1",
@ -9860,11 +9783,6 @@
}
}
},
"load-script": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz",
"integrity": "sha1-BJGTngvuVkPuSUp+PaPSuscMbKQ="
},
"loader-fs-cache": {
"version": "1.0.2",
"resolved": "https://registry.npm.taobao.org/loader-fs-cache/download/loader-fs-cache-1.0.2.tgz",
@ -9966,11 +9884,6 @@
"integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=",
"dev": true
},
"lodash-es": {
"version": "4.17.15",
"resolved": "https://registry.npm.taobao.org/lodash-es/download/lodash-es-4.17.15.tgz",
"integrity": "sha1-Ib2Wg5NUQS8j16EDQOXqxu5FXXg="
},
"lodash.defaultsdeep": {
"version": "4.6.1",
"resolved": "https://registry.npm.taobao.org/lodash.defaultsdeep/download/lodash.defaultsdeep-4.6.1.tgz?cache=0&sync_timestamp=1562718178896&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash.defaultsdeep%2Fdownload%2Flodash.defaultsdeep-4.6.1.tgz",
@ -13930,9 +13843,9 @@
"dev": true
},
"ssf": {
"version": "0.10.2",
"resolved": "https://registry.npm.taobao.org/ssf/download/ssf-0.10.2.tgz",
"integrity": "sha1-ZbK0/N/ZZ7yOg4OkE0kAmJMRWXY=",
"version": "0.10.3",
"resolved": "https://registry.npm.taobao.org/ssf/download/ssf-0.10.3.tgz?cache=0&sync_timestamp=1593298770773&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fssf%2Fdownload%2Fssf-0.10.3.tgz",
"integrity": "sha1-jq4fwpyQpVLnkhII+BiS1vd6yys=",
"requires": {
"frac": "~1.1.2"
}
@ -16124,6 +16037,11 @@
"string-width": "^1.0.2 || 2"
}
},
"wmf": {
"version": "1.0.2",
"resolved": "https://registry.npm.taobao.org/wmf/download/wmf-1.0.2.tgz",
"integrity": "sha1-fRnWIQcaCMK9xrfmiKnENSmMwto="
},
"word-wrap": {
"version": "1.2.3",
"resolved": "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz",
@ -16229,22 +16147,23 @@
}
},
"xlsx": {
"version": "0.15.5",
"resolved": "https://registry.npm.taobao.org/xlsx/download/xlsx-0.15.5.tgz?cache=0&sync_timestamp=1580176264177&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxlsx%2Fdownload%2Fxlsx-0.15.5.tgz",
"integrity": "sha1-N9W7gHbeczfluwdps61V0Y1o6uw=",
"version": "0.15.6",
"resolved": "https://registry.npm.taobao.org/xlsx/download/xlsx-0.15.6.tgz",
"integrity": "sha1-Rh+EHW2eoag3XizSRr8jrs4IodU=",
"requires": {
"adler-32": "~1.2.0",
"cfb": "^1.1.3",
"cfb": "^1.1.4",
"codepage": "~1.14.0",
"commander": "~2.17.1",
"crc-32": "~1.2.0",
"exit-on-epipe": "~1.0.1",
"ssf": "~0.10.2"
"ssf": "~0.10.3",
"wmf": "~1.0.1"
},
"dependencies": {
"commander": {
"version": "2.17.1",
"resolved": "https://registry.npm.taobao.org/commander/download/commander-2.17.1.tgz?cache=0&sync_timestamp=1580710597193&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.17.1.tgz",
"resolved": "https://registry.npm.taobao.org/commander/download/commander-2.17.1.tgz?cache=0&sync_timestamp=1598576046744&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.17.1.tgz",
"integrity": "sha1-vXerfebelCBc6sxy8XFtKfIKd78="
}
}

View File

@ -27,7 +27,7 @@
"vue-count-to": "^1.0.13",
"vue-router": "3.0.6",
"vuex": "3.1.0",
"xlsx": "^0.15.5"
"xlsx": "^0.15.6"
},
"devDependencies": {
"@babel/core": "7.0.0",

View File

@ -7,3 +7,10 @@ export function getBasicCount() {
})
}
export function searchCandidates(data) {
return request({
url: '/analyse/searchcandidates/',
method: 'post',
data
})
}

View File

@ -126,7 +126,7 @@ export const asyncRoutes = [
path: 'candidate',
name: 'Candidate',
component: () => import('@/views/analyse/candidate.vue'),
meta: { title: '成绩单查询', icon: '', perms: ['candidate_view'] }
meta: { title: '报告单查询', icon: '', perms: ['candidate_search'] }
},
{
path: 'consumerrule',

View File

@ -61,5 +61,12 @@ div:focus {
// main-container global css
.app-container {
padding: 20px;
padding: 10px;
}
.el-card__body {
padding: 6px;
}
.el-card__header {
padding: 6px;
}

View File

@ -1,14 +1,101 @@
<template>
<div class="app-container">
<el-row :gutter="6">
<el-col :xs="24" :md="8">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>查询报告单</span>
</div>
<div class="clearfix" style="color:gray">
可从excel复制过来,手动输入用回车间隔
</div>
<el-form
ref="elForm"
:model="formData"
:rules="rules"
size="medium"
label-width="80px"
style="margin-top:2px"
label-position="left"
>
<el-row>
<el-form-item label="姓名列" prop="names">
<el-input
v-model="formData.names"
type="textarea"
:autosize="{ minRows: 8, maxRows: 12}"
></el-input>
</el-form-item>
</el-row>
<el-row >
<el-form-item label="身份证列" prop="numbers">
<el-input
v-model="formData.numbers"
type="textarea"
:autosize="{ minRows: 8, maxRows: 12}"
></el-input>
</el-form-item>
</el-row>
<div style="text-align:center">
<el-button type="primary" @click="searchB" >开始查询</el-button>
</div>
</el-form>
</el-card>
</el-col>
<el-col :xs="24" :md="16">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>查询结果</span>
</div>
<el-button type="primary" @click="exportExcel" >导出结果</el-button>
<el-table
:data="tableData"
border
fit
highlight-current-row
style="margin-top:2px"
id="out-table"
>
<el-table-column label="姓名">
<template slot-scope="scope">{{ scope.row.name }}</template>
</el-table-column>
<el-table-column label="身份证号">
<template slot-scope="scope">{{ scope.row.ID_number }}</template>
</el-table-column>
<el-table-column label="报告单号">
<template slot-scope="scope">
<el-link :href="scope.row.url" target="_blank" type="primary">{{ scope.row.report_number }}</el-link>
</template>
</el-table-column>
<el-table-column label="获得时间">
<template slot-scope="scope">{{ scope.row.issue_date }}</template>
</el-table-column>
<el-table-column label="报告单网址" show-overflow-tooltip>
<template slot-scope="scope">
<el-link :href="scope.row.url" target="_blank" type="primary">{{ scope.row.url }}</el-link>
</template>
</el-table-column>
</el-table>
</el-card>
</el-col>
</el-row>
</div>
</template>
<script>
import { searchCandidates } from "@/api/analyse"
import { genTree, deepClone } from "@/utils";
import checkPermission from "@/utils/permission";
import Pagination from "@/components/Pagination"; // secondary package based on el-pagination
import FileSaver from "file-saver";
import XLSX from "xlsx";
export default {
components: { Pagination },
@ -16,7 +103,24 @@ export default {
},
data() {
return {
formData:{}
formData:{},
rules:{
names: [
{
required: true,
message: "请填写姓名列",
trigger: "change",
},
],
numbers: [
{
required: true,
message: "请填写身份证列",
trigger: "change",
},
],
},
tableData:[]
};
},
computed: {},
@ -27,6 +131,36 @@ export default {
},
methods: {
searchB(){
const loading = this.$loading({
text: '拼命查询中..',
});
searchCandidates(this.formData).then(res=>{
this.tableData = res.data
loading.close()
}).catch(e=>{
loading.close()
})
},
exportExcel() {
var xlsxParam = { raw: true };//excel使
var wb = XLSX.utils.table_to_book(document.querySelector("#out-table"),xlsxParam);
var wbout = XLSX.write(wb, {
bookType: "xlsx",
bookSST: true,
type: "array"
});
try {
FileSaver.saveAs(
new Blob([wbout], { type: "application/octet-stream;charset=utf-8" }),
"报告单.xlsx"
);
} catch (e) {
if (typeof console !== "undefined") console.log(e, wbout);
}
return wbout;
}
},
};
</script>

View File

@ -6,5 +6,6 @@ from .views import *
urlpatterns = [
path('basic/', BasicCount.as_view()),
path('quota/', Quota.as_view())
path('quota/', Quota.as_view()),
path('searchcandidates/', SearchCandidates.as_view())
]

View File

@ -1,4 +1,5 @@
from django.shortcuts import render
from requests.api import request
from rest_framework.views import APIView
from rest_framework.response import Response
@ -7,6 +8,8 @@ from examtest.models import ExamTest
from question.models import Question
import pickle
import requests
from lxml import etree
# Create your views here.
class BasicCount(APIView):
@ -29,3 +32,48 @@ class Quota(APIView):
with open('quota.dat','rb') as f:
data = pickle.load(f)
return Response(data)
class SearchCandidates(APIView):
perms_map = [
{'post': 'candidate_search'}]
def post(self, request, *args, **kwargs):
names = request.data['names']
numbers = request.data['numbers']
names_ = names.split('\n')
numbers_ = numbers.split('\n')
names_l = [i.replace(' ', '') for i in names_ if i!='']
numbers_l = [i.replace(' ', '') for i in numbers_ if i!='']
candidates = []
if len(names_l)>60:
return Response({'error':'单次批量查询不允许超过60'})
if len(names_l) == len(numbers_l):
for i in range(len(names_l)):
payload = {'IndexModel[name]': names_l[i], 'IndexModel[identityNumber]': numbers_l[i], 'IndexModel[certNumber]':'', 'IndexModel[candidateNumber]':''}
try:
r = requests.post('https://fushe.chinansc.cn/open/candidate-list',data=payload, timeout=5)
r.raise_for_status()
r.close()
html = etree.HTML(r.text)
results = html.xpath("//table[@class='cert-table']")
try:
for i in results:
url = i.xpath('tr/td/a/@href')
name = i.xpath('tr[1]/td[1]/text()')
ID_number = i.xpath('tr[1]/td[2]/text()')
report_number = i.xpath('tr[2]/td[1]/text()')
issue_date = i.xpath('tr[2]/td[2]/text()')
jsondata = {
'name':name[0],
'ID_number':ID_number[0],
'report_number':report_number[0],
'issue_date':issue_date[0],
'url':'https://fushe.chinansc.cn'+ url[0]
}
candidates.append(jsondata)
except:
pass
except:
pass
return Response(candidates)
else:
return Response({'error':'姓名列和身份证列不匹配!'})

BIN
test_server/quota.dat Normal file

Binary file not shown.