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. 14
      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({ mainWindow = new BrowserWindow({
minWidth: 1366, minWidth: 1366,
minHeight: 900, minHeight: 900,
height: 970, height: 1260,
show: false, show: false,
autoHideMenuBar: true, autoHideMenuBar: true,
icon: logoIcon, icon: logoIcon,

2
front/src/renderer/index.html

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

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

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

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

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

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

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

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

@ -1,6 +1,6 @@
<template> <template>
<div class="tableClass"> <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"> fit :row-key="getRowKeys" ref="tableRef">
<el-table-column type="selection" width="50" :reserve-selection="true" fixed="left"> <el-table-column type="selection" width="50" :reserve-selection="true" fixed="left">
</el-table-column> </el-table-column>
@ -10,11 +10,11 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-for="(headerItem, headerIndex) in tableHeader" :label="headerItem.label" show-overflow-tooltip <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 }"> <template #header="{ column, $index }">
<div> <div>
<span :style="`${column.label === '得分' ? 'color:#F56C6C' : ''}`">{{ column.label }}</span> <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" <el-popover :width="350" trigger="click" placement="bottom-start" :hide-after="50"
:visible="headerItem.popoverVisible"> :visible="headerItem.popoverVisible">
<template #reference> <template #reference>
@ -55,7 +55,7 @@
</div> </div>
</template> </template>
</el-popover> </el-popover>
</span> </span> -->
<span v-if="headerItem.isSort"> <span v-if="headerItem.isSort">
<span @click="headerSort(headerItem)"> <span @click="headerSort(headerItem)">
<el-icon style="position: relative;top: 2px;" v-if="headerItem.sort === ''"> <el-icon style="position: relative;top: 2px;" v-if="headerItem.sort === ''">
@ -77,7 +77,7 @@
<span>{{ row[headerItem.prop] }}</span> <span>{{ row[headerItem.prop] }}</span>
</template> </template>
<template v-else-if="headerItem.type === 'select'"> <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>
<template v-else-if="headerItem.type === 'date'"> <template v-else-if="headerItem.type === 'date'">
<span>{{ row[headerItem.prop] }}</span> <span>{{ row[headerItem.prop] }}</span>
@ -96,11 +96,11 @@
<Edit /> <Edit />
</el-icon> </el-icon>
</el-button> </el-button>
<el-button type="info" circle @click="optClick(scope.row, 'info')"> <!-- <el-button type="info" circle @click="optClick(scope.row, 'info')">
<el-icon> <el-icon>
<InfoFilled /> <InfoFilled />
</el-icon> </el-icon>
</el-button> </el-button> -->
<el-button type="danger" circle @click="optClick(scope.row, 'del')"> <el-button type="danger" circle @click="optClick(scope.row, 'del')">
<el-icon> <el-icon>
<Delete /> <Delete />

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

@ -1,6 +1,40 @@
<template> <template>
<div class="rightClass"> <div class="rightClass">
<div> <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-button type="primary" @click="addData">
<el-icon> <el-icon>
<Plus /> <Plus />
@ -56,6 +90,12 @@
<span>设置表头</span> <span>设置表头</span>
</el-button> </el-button>
</el-tooltip> </el-tooltip>
<el-button type="primary" @click="clearLocalstory">
<el-icon>
<Refresh />
</el-icon>
<span>清空缓存</span>
</el-button>
<!-- <div class="inputClass"> <!-- <div class="inputClass">
<el-input v-model.trim="searchParams.name" style="max-width: 600px" placeholder="请输入姓名" clearable <el-input v-model.trim="searchParams.name" style="max-width: 600px" placeholder="请输入姓名" clearable
@clear="searchData" @keyup.enter="searchData"> @clear="searchData" @keyup.enter="searchData">
@ -69,6 +109,51 @@
</el-input> </el-input>
</div> --> </div> -->
</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> <div>
<tablecomponent :tableHeader="tableHeader" :tableData="tableData" :searchParams="searchParams" <tablecomponent :tableHeader="tableHeader" :tableData="tableData" :searchParams="searchParams"
:pageSizes="pageSizes" :total="total" @selectChange="selectChange" @handleCurrentChange="handleCurrentChange" :pageSizes="pageSizes" :total="total" @selectChange="selectChange" @handleCurrentChange="handleCurrentChange"
@ -125,6 +210,7 @@ export default {
formHeader: [], formHeader: [],
exportHeader: [], exportHeader: [],
tableData: [], tableData: [],
allData: [],
currentPage: 1, currentPage: 1,
pageSize: 15, pageSize: 15,
pageSizes: [15, 50, 75, 100], pageSizes: [15, 50, 75, 100],
@ -205,7 +291,7 @@ export default {
// //
dealRow(row) { dealRow(row) {
row["addScore"] = 0 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","31", "32","33","41","42"]
let nianjicodeList = ["11", "12", "13", "14", "15", "16", "21", "22", "23"] let nianjicodeList = ["11", "12", "13", "14", "15", "16", "21", "22", "23"]
if (nianjicodeList.includes(`${row.nianjicode}`)) { if (nianjicodeList.includes(`${row.nianjicode}`)) {
@ -214,9 +300,9 @@ export default {
let scoreItem = {} let scoreItem = {}
for (let i = 0; i < value.list.length; i++) { for (let i = 0; i < value.list.length; i++) {
let item = value.list[i]; let item = value.list[i];
let rowValue = this.transTime(row[value.prop]) let rowValue = this.transTime(value, row[value.prop], true)
let itemValue = this.transTime(item[`${row.nianjicode}`]) let itemValue = this.transTime(value, item[`${row.nianjicode}`], false)
if (`${item.gender}` === `${row.gender}` && this.createComparator(value.fuhao)(rowValue, itemValue)) { 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] } scoreItem = { ...item, [`${key.slice(0, key.length - 5)}_org`]: row[value.prop] }
break break
} }
@ -265,7 +351,10 @@ export default {
} }
return row return row
}, },
transTime(value) { transTime(item, value, isReturn) {
if (item.prop === "fifty" && isReturn) {
return Number(value)
}
if (typeof (value) === "number") { if (typeof (value) === "number") {
return value return value
} else if (typeof (value) === "string") { } 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'])) allStudentList = _.cloneDeep(_.orderBy(allStudentList, [this.sortObj.prop], [_.get(this.sortObj, ["sort"], "") === 1 ? 'desc' : 'asc']))
} }
this.allData = _.cloneDeep(allStudentList)
this.total = allStudentList.length this.total = allStudentList.length
this.tableData = allStudentList.slice((this.currentPage - 1) * this.pageSize, this.currentPage * this.pageSize) this.tableData = allStudentList.slice((this.currentPage - 1) * this.pageSize, this.currentPage * this.pageSize)
}, },
@ -551,7 +641,16 @@ export default {
// //
setHeader() { setHeader() {
this.setHeaderVisible = true this.setHeaderVisible = true
} },
//
clearLocalstory() {
//
localStorage.clear()
ElMessage({
type: 'success',
message: '清除缓存成功',
})
},
}, },
async mounted() { async mounted() {
this.setTableHeader = [] this.setTableHeader = []

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

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

Loading…
Cancel
Save