Browse Source

10.8

master
lichong 6 months ago
parent
commit
8ca535f104
  1. 2
      front/src/main/index.js
  2. 2
      front/src/renderer/index.html
  3. 2
      front/src/renderer/src/App.vue
  4. 162
      front/src/renderer/src/assets/json/jifen.json
  5. 23
      front/src/renderer/src/assets/json/student.json
  6. 38
      front/src/renderer/src/components/tablecomponent.vue
  7. 111
      front/src/renderer/src/views/student.vue
  8. 2
      jihuoqi/src/renderer/src/App.vue

2
front/src/main/index.js

@ -11,7 +11,7 @@ function createWindow() {
mainWindow = new BrowserWindow({
minWidth: 1366,
minHeight: 900,
height: 970,
height: 1260,
show: false,
autoHideMenuBar: true,
icon: logoIcon,

2
front/src/renderer/index.html

@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8" />
<title>数据统计</title>
<title>国家“体测”统计系统(义务教育阶段)</title>
<!-- <link rel="icon" href="/icon/icon.jpg" /> -->
<!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
<meta http-equiv="Content-Security-Policy"

2
front/src/renderer/src/App.vue

@ -90,7 +90,7 @@ export default {
type: 'error',
message: '激活码错误,请输入正确的激活码后使用',
showClose: true,
duration: 0
duration: 3000
})
}
let params = {

162
front/src/renderer/src/assets/json/jifen.json

@ -2045,7 +2045,7 @@
"41": -100000,
"42": -100000,
"score": 0,
"gender": "1"
"gender": 1
},
{
"11": 18.6,
@ -5430,131 +5430,131 @@
"fuhao": "<=",
"list": [
{
"21": "3‘20“",
"22": "3‘15”",
"23": "3’05“",
"31": "2‘55”",
"32": "2’50”",
"33": "2‘45“",
"41": "2’42”",
"42": "2‘40“",
"21": "3'20\"",
"22": "3'15\"",
"23": "3'05\"",
"31": "2'55\"",
"32": "2'50\"",
"33": "2'45\"",
"41": "2'42\"",
"42": "2'40\"",
"score": 100,
"add_score": 10,
"gender": 1
},
{
"21": "3’23”",
"22": "3’18”",
"23": "3’08”",
"31": "2’58”",
"32": "2’53”",
"33": "2’48”",
"41": "2’45”",
"42": "2’43”",
"21": "3'23\"",
"22": "3'18\"",
"23": "3'08\"",
"31": "2'58\"",
"32": "2'53\"",
"33": "2'48\"",
"41": "2'45\"",
"42": "2'43\"",
"score": 100,
"add_score": 9,
"gender": 1
},
{
"21": "3‘26“",
"22": "3‘21“",
"23": "3‘11“",
"31": "3‘01“",
"32": "2‘56“",
"33": "2‘51“",
"41": "2‘48“",
"42": "2‘46“",
"21": "3'26\"",
"22": "3'21\"",
"23": "3'11\"",
"31": "3'01\"",
"32": "2'56\"",
"33": "2'51\"",
"41": "2'48\"",
"42": "2'46\"",
"score": 100,
"add_score": 8,
"gender": 1
},
{
"21": "3‘29“",
"22": "3‘24“",
"23": "3‘14“",
"31": "3‘04“",
"32": "2‘59“",
"33": "2‘54“",
"41": "2‘51“",
"42": "2‘49“",
"21": "3'29\"",
"22": "3'24\"",
"23": "3'14\"",
"31": "3'04\"",
"32": "2'59\"",
"33": "2'54\"",
"41": "2'51\"",
"42": "2'49\"",
"score": 100,
"add_score": 7,
"gender": 1
},
{
"21": "3’32”",
"22": "3’27”",
"23": "3’17”",
"31": "3’07”",
"32": "3’02”",
"33": "2’57”",
"41": "2’54”",
"42": "2’52”",
"21": "3'32\"",
"22": "3'27\"",
"23": "3'17\"",
"31": "3'07\"",
"32": "3'02\"",
"33": "2'57\"",
"41": "2'54\"",
"42": "2'52\"",
"score": 100,
"add_score": 6,
"gender": 1
},
{
"21": "3‘35“",
"22": "3‘30“",
"23": "3‘20“",
"31": "3‘10“",
"32": "3‘05“",
"33": "3‘00“",
"41": "2‘57“",
"42": "2‘55“",
"21": "3'35\"",
"22": "3'30\"",
"23": "3'20\"",
"31": "3'10\"",
"32": "3'05\"",
"33": "3'00\"",
"41": "2'57\"",
"42": "2'55\"",
"score": 100,
"add_score": 5,
"gender": 1
},
{
"21": "3‘39“",
"22": "3‘34“",
"23": "3‘24“",
"31": "3‘14“",
"32": "3‘09“",
"33": "3‘04“",
"41": "3‘01“",
"42": "2‘59“",
"21": "3'39\"",
"22": "3'34\"",
"23": "3'24\"",
"31": "3'14\"",
"32": "3'09\"",
"33": "3'04\"",
"41": "3'01\"",
"42": "2'59\"",
"score": 100,
"add_score": 4,
"gender": 1
},
{
"21": "3‘43“",
"22": "3‘38“",
"23": "3‘28“",
"31": "3‘18“",
"32": "3‘13“",
"33": "3‘08“",
"41": "3‘05“",
"42": "3‘03“",
"21": "3'43\"",
"22": "3'38\"",
"23": "3'28\"",
"31": "3'18\"",
"32": "3'13\"",
"33": "3'08\"",
"41": "3'05\"",
"42": "3'03\"",
"score": 100,
"add_score": 3,
"gender": 1
},
{
"21": "3‘47“",
"22": "3‘42“",
"23": "3‘32“",
"31": "3‘22“",
"32": "3‘17“",
"33": "3‘12“",
"41": "3‘09“",
"42": "3‘07“",
"21": "3'47\"",
"22": "3'42\"",
"23": "3'32\"",
"31": "3'22\"",
"32": "3'17\"",
"33": "3'12\"",
"41": "3'09\"",
"42": "3'07\"",
"score": 100,
"add_score": 2,
"gender": 1
},
{
"21": "3‘51“",
"22": "3‘46“",
"23": "3‘36“",
"31": "3‘26“",
"32": "3‘21“",
"33": "3‘16“",
"41": "3‘13“",
"42": "3‘11“",
"21": "3'51\"",
"22": "3'46\"",
"23": "3'36\"",
"31": "3'26\"",
"32": "3'21\"",
"33": "3'16\"",
"41": "3'13\"",
"42": "3'11\"",
"score": 100,
"add_score": 1,
"gender": 1

23
front/src/renderer/src/assets/json/student.json

@ -208,7 +208,7 @@
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": true,
"formShow": false,
"export": false
},
{
@ -473,6 +473,17 @@
"formShow": false,
"export": false
},
{
"label": "加分项",
"prop": "addScore",
"type": "text",
"index": "-1",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"formShow": false,
"export": false
},
{
"label": "总分",
"prop": "totalScore",
@ -500,16 +511,6 @@
"formShow": false,
"export": false
},
{
"label": "备注1",
"prop": "nodt1",
"type": "text",
"index": "-1",
"fixed": false,
"tableShow": false,
"formShow": false,
"export": false
},
{
"label": "备注2",
"prop": "nodt2",

38
front/src/renderer/src/components/tablecomponent.vue

@ -1,6 +1,6 @@
<template>
<div class="tableClass">
<el-table :data="tableData" height="calc(100vh - 156px)" border @select="selectChange" @select-all="selectChange"
<el-table :data="tableData" height="calc(100vh - 355px)" border @select="selectChange" @select-all="selectChange"
fit :row-key="getRowKeys" ref="tableRef">
<el-table-column type="selection" width="50" :reserve-selection="true" fixed="left">
</el-table-column>
@ -10,11 +10,11 @@
</template>
</el-table-column>
<el-table-column v-for="(headerItem, headerIndex) in tableHeader" :label="headerItem.label" show-overflow-tooltip
:key="headerIndex" :min-width="`${headerItem.label.length * 23 + 38}px`" :fixed="!!headerItem.fixed">
:key="headerIndex" :min-width="`${headerItem.label.length * 23 + 22}px`" :fixed="!!headerItem.fixed">
<template #header="{ column, $index }">
<div>
<span :style="`${column.label === '得分' ? 'color:#F56C6C' : ''}`">{{ column.label }}</span>
<span v-if="headerItem.isSearch">
<!-- <span v-if="headerItem.isSearch">
<el-popover :width="350" trigger="click" placement="bottom-start" :hide-after="50"
:visible="headerItem.popoverVisible">
<template #reference>
@ -27,35 +27,35 @@
</el-icon>
</span>
</template>
<template #default>
<template #default>
<div>
<template v-if="headerItem.type === 'text'">
<el-input v-model="searchParams[headerItem.prop]" style="width: 200px;padding-right: 20px;"
clearable @keyup.enter="searchValue(headerItem)" />
</template>
<template v-if="headerItem.type === 'select'">
<template v-if="headerItem.type === 'select'">
<el-select v-model="searchParams[headerItem.prop]" size="large"
style="width: 200px;padding-right: 20px;" clearable @change="searchValue(headerItem)">
<el-option v-for="item in headerItem.tableDisplay" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</template>
<template v-else-if="headerItem.type === 'date'">
<template v-else-if="headerItem.type === 'date'">
<el-date-picker v-model="searchParams[headerItem.prop]" type="date"
:disabled="['create_at', 'update_at'].indexOf(headerItem.prop) !== -1"
:placeholder="`请选择${headerItem.label}`" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
style="width: 200px;padding-right: 20px;" clearable @change="searchValue(headerItem)" />
</template>
<el-button type="primary" @click="searchValue(headerItem)">
<el-icon>
<Search />
</el-icon>
<span>搜索</span>
</el-button>
</div>
</template>
</el-popover>
</span>
<el-button type="primary" @click="searchValue(headerItem)">
<el-icon>
<Search />
</el-icon>
<span>搜索</span>
</el-button>
</div>
</template>
</el-popover>
</span> -->
<span v-if="headerItem.isSort">
<span @click="headerSort(headerItem)">
<el-icon style="position: relative;top: 2px;" v-if="headerItem.sort === ''">
@ -77,7 +77,7 @@
<span>{{ row[headerItem.prop] }}</span>
</template>
<template v-else-if="headerItem.type === 'select'">
<span>{{ _.find(headerItem.tableDisplay, { value: `${row[headerItem.prop]}` }).label }}</span>
<span>{{ (_.find(headerItem.tableDisplay, { value: `${row[headerItem.prop]}` }) || {}).label }}</span>
</template>
<template v-else-if="headerItem.type === 'date'">
<span>{{ row[headerItem.prop] }}</span>
@ -96,11 +96,11 @@
<Edit />
</el-icon>
</el-button>
<el-button type="info" circle @click="optClick(scope.row, 'info')">
<!-- <el-button type="info" circle @click="optClick(scope.row, 'info')">
<el-icon>
<InfoFilled />
</el-icon>
</el-button>
</el-button> -->
<el-button type="danger" circle @click="optClick(scope.row, 'del')">
<el-icon>
<Delete />

111
front/src/renderer/src/views/student.vue

@ -1,6 +1,40 @@
<template>
<div class="rightClass">
<div>
<el-row>
<el-col v-for="(headerItem, headerIndex) in _.filter(tableHeader, item => item.isSearch)" :key="headerIndex"
:span="4">
<div>
<span>{{ headerItem.label }}:</span>
<template v-if="headerItem.type === 'text'">
<el-input v-model="searchParams[headerItem.prop]" style="width: 150px;padding-right: 8px;margin:8px 0"
clearable @keyup.enter="searchData()" />
</template>
<template v-if="headerItem.type === 'select'">
<el-select v-model="searchParams[headerItem.prop]" size="large"
style="width: 150px;padding-right: 8px;margin:8px 0" clearable @change="searchData()">
<el-option v-for="item in headerItem.tableDisplay" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</template>
<template v-else-if="headerItem.type === 'date'">
<el-date-picker v-model="searchParams[headerItem.prop]" type="date"
:disabled="['create_at', 'update_at'].indexOf(headerItem.prop) !== -1"
:placeholder="`请选择${headerItem.label}`" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
style="width: 150px;padding-right: 8px;margin:8px 0" size="large" clearable @change="searchData()" />
</template>
</div>
</el-col>
<el-col :span="6">
<el-button type="primary" @click="searchData()" size="large">
<el-icon>
<Search />
</el-icon>
<span>搜索</span>
</el-button>
</el-col>
</el-row>
<el-button type="primary" @click="addData">
<el-icon>
<Plus />
@ -56,6 +90,12 @@
<span>设置表头</span>
</el-button>
</el-tooltip>
<el-button type="primary" @click="clearLocalstory">
<el-icon>
<Refresh />
</el-icon>
<span>清空缓存</span>
</el-button>
<!-- <div class="inputClass">
<el-input v-model.trim="searchParams.name" style="max-width: 600px" placeholder="请输入姓名" clearable
@clear="searchData" @keyup.enter="searchData">
@ -69,6 +109,51 @@
</el-input>
</div> -->
</div>
<div>
<el-descriptions direction="vertical" :column="5" border style="margin: 8px 0;">
<el-descriptions-item label="总人数">{{ allData.length }}</el-descriptions-item>
<el-descriptions-item label="优秀人数(优秀率)">
<span style="margin: 0 8px 0 0;">
{{ _.filter(allData, { level: "优秀" }).length }}
</span>
<span>
<el-tag size="small" style="position: relative;top: -1px;">
{{ Number(((_.filter(allData, { level: "优秀" })) / (allData.length || 1)).toFixed(2)) * 100 }}%
</el-tag>
</span>
</el-descriptions-item>
<el-descriptions-item label="良好人数(良好率)">
<span style="margin: 0 8px 0 0;">
{{ _.filter(allData, { level: "良好" }).length }}
</span>
<span>
<el-tag size="small" style="position: relative;top: -1px;">
{{ Number(((_.filter(allData, { level: "良好" })).length / (allData.length || 1)).toFixed(2)) * 100 }}%
</el-tag>
</span>
</el-descriptions-item>
<el-descriptions-item label="及格人数(及格率)">
<span style="margin: 0 8px 0 0;">
{{ _.filter(allData, { level: "及格" }).length }}
</span>
<span>
<el-tag size="small" style="position: relative;top: -1px;">
{{ Number(((_.filter(allData, { level: "及格" })).length / (allData.length || 1)).toFixed(2)) * 100 }}%
</el-tag>
</span>
</el-descriptions-item>
<el-descriptions-item label="不及格人数(不及格率)">
<span style="margin: 0 8px 0 0;">
{{ _.filter(allData, { level: "不及格" }).length }}
</span>
<span>
<el-tag size="small" style="position: relative;top: -1px;">
{{ Number(((_.filter(allData, { level: "不及格" })).length / (allData.length || 1)).toFixed(2)) * 100 }}%
</el-tag>
</span>
</el-descriptions-item>
</el-descriptions>
</div>
<div>
<tablecomponent :tableHeader="tableHeader" :tableData="tableData" :searchParams="searchParams"
:pageSizes="pageSizes" :total="total" @selectChange="selectChange" @handleCurrentChange="handleCurrentChange"
@ -125,6 +210,7 @@ export default {
formHeader: [],
exportHeader: [],
tableData: [],
allData: [],
currentPage: 1,
pageSize: 15,
pageSizes: [15, 50, 75, 100],
@ -205,7 +291,7 @@ export default {
//
dealRow(row) {
row["addScore"] = 0
row["BMI"] = Number(Number(row.weight / (row.height * row.height / 10000)).toFixed(2))
row["BMI"] = Number(Number(row.weight / (row.height * row.height / 10000)).toFixed(2)) || 0
// let nianjicodeList = ["11", "12","13","14", "15","16","21", "22","23","31", "32","33","41","42"]
let nianjicodeList = ["11", "12", "13", "14", "15", "16", "21", "22", "23"]
if (nianjicodeList.includes(`${row.nianjicode}`)) {
@ -214,9 +300,9 @@ export default {
let scoreItem = {}
for (let i = 0; i < value.list.length; i++) {
let item = value.list[i];
let rowValue = this.transTime(row[value.prop])
let itemValue = this.transTime(item[`${row.nianjicode}`])
if (`${item.gender}` === `${row.gender}` && this.createComparator(value.fuhao)(rowValue, itemValue)) {
let rowValue = this.transTime(value, row[value.prop], true)
let itemValue = this.transTime(value, item[`${row.nianjicode}`], false)
if (`${item.gender}` === `${row.gender}` && `${item.gender}` === `${row.gender}` && this.createComparator(value.fuhao)(rowValue, itemValue)) {
scoreItem = { ...item, [`${key.slice(0, key.length - 5)}_org`]: row[value.prop] }
break
}
@ -265,7 +351,10 @@ export default {
}
return row
},
transTime(value) {
transTime(item, value, isReturn) {
if (item.prop === "fifty" && isReturn) {
return Number(value)
}
if (typeof (value) === "number") {
return value
} else if (typeof (value) === "string") {
@ -336,6 +425,7 @@ export default {
//
allStudentList = _.cloneDeep(_.orderBy(allStudentList, [this.sortObj.prop], [_.get(this.sortObj, ["sort"], "") === 1 ? 'desc' : 'asc']))
}
this.allData = _.cloneDeep(allStudentList)
this.total = allStudentList.length
this.tableData = allStudentList.slice((this.currentPage - 1) * this.pageSize, this.currentPage * this.pageSize)
},
@ -551,7 +641,16 @@ export default {
//
setHeader() {
this.setHeaderVisible = true
}
},
//
clearLocalstory() {
//
localStorage.clear()
ElMessage({
type: 'success',
message: '清除缓存成功',
})
},
},
async mounted() {
this.setTableHeader = []

2
jihuoqi/src/renderer/src/App.vue

@ -86,7 +86,7 @@ export default {
}
},
async mounted() {
let fiveDay = dayjs('2024-09-29T00:00:00').valueOf()
let fiveDay = dayjs('2024-10-15T00:00:00').valueOf()
if (!this.isVip) {
if (dayjs().valueOf() > fiveDay) {
this.isVip = false

Loading…
Cancel
Save