lichong 7 months ago
parent
commit
38d8e06e6b
  1. BIN
      dataDeal/自动算分(附分秒转换)(1).xlsx
  2. 3
      front/src/main/index.js
  3. 6
      front/src/renderer/src/App.vue
  4. 2
      front/src/renderer/src/assets/js/db.js
  5. 2
      front/src/renderer/src/assets/json/jifen.json
  6. 182
      front/src/renderer/src/assets/json/student.json
  7. 9
      front/src/renderer/src/components/formcomponent.vue
  8. 137
      front/src/renderer/src/components/tablecomponent.vue
  9. 252
      front/src/renderer/src/views/student.vue
  10. 2
      jihuoqi/src/renderer/src/App.vue

BIN
dataDeal/自动算分(附分秒转换)(1).xlsx

Binary file not shown.

3
front/src/main/index.js

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

6
front/src/renderer/src/App.vue

@ -108,11 +108,7 @@ export default {
this.zhucema = localStorage.getItem('zhucema')
let isVipObj = JSON.parse(localStorage.getItem('isVip') || "{}")
if (!_.isEmpty(isVipObj)) {
if (dayjs().isBefore(dayjs(isVipObj.endTime)) && dayjs().isAfter(dayjs(isVipObj.startTime))) {
this.isVip = isVipObj.isVip
} else {
this.isVip = false
}
this.isVip = isVipObj.isVip
}
if (!this.isVip) {
this.zhuce()

2
front/src/renderer/src/assets/js/db.js

@ -4,6 +4,6 @@ export const myDatabase = new Dexie('myDatabase');
// 定义数据库版本
myDatabase.version(1).stores({
student: '++id, nianjicode, banjicode, nianji, banji, &xuejihao, minzudaima, minzu, name, gender, birth, address, height, weight, BMI, BMIscore, lungs, lungsccore, fifty, fiftyscore, sitforward, sitforwardscore, jump, jumpscore, situp, situpscore, fiftyeight, fiftyeightscore, stand, standscore, eighty, eightyscore, thousand ,thousandscore, pullup, pullupscore, totalscore, level, note1, nodt2, create_at, update_at',
student: '++id, nianjicode, banjicode, nianji, banji, &xuejihao, minzudaima, minzu, name, gender, birth, address, height, weight, BMI, BMIscore, lungs, lungsscore, fifty, fiftyscore, sitforward, sitforwardscore, jump, jumpscore, situp, situpscore, fiftyeight, fiftyeightscore, stand, standscore, eighty, eightyscore, thousand ,thousandscore, pullup, pullupscore, totalScore, level, note1, nodt2, create_at, update_at',
jihuoshijian: '++id, jihuoma, isVip, zhucema, create_at, update_at'
});

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

@ -141,7 +141,7 @@
}
]
},
"lungsccore": {
"lungsscore": {
"prop": "lungs",
"fuhao": ">=",
"list": [

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

@ -4,8 +4,14 @@
"prop": "nianjicode",
"type": "text",
"index": "0",
"fixed": true,
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"isSort": true,
"isSearch": true,
"openPopoverVisible": false,
"searchValue": "",
"formShow": true,
"export": true
},
@ -14,7 +20,14 @@
"prop": "banjicode",
"type": "text",
"index": "1",
"tableShow": false,
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"isSort": true,
"isSearch": true,
"openPopoverVisible": false,
"searchValue": "",
"formShow": false,
"export": true
},
@ -23,7 +36,9 @@
"prop": "nianji",
"type": "text",
"index": "-1",
"fixed": false,
"tableShow": false,
"setTableShow": false,
"formShow": false,
"export": false
},
@ -32,8 +47,14 @@
"prop": "banji",
"type": "text",
"index": "2",
"fixed": true,
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"isSort": true,
"isSearch": true,
"openPopoverVisible": false,
"searchValue": "",
"formShow": true,
"export": true
},
@ -42,7 +63,14 @@
"prop": "xuejihao",
"type": "text",
"index": "3",
"tableShow": false,
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"isSort": true,
"isSearch": true,
"openPopoverVisible": false,
"searchValue": "",
"formShow": false,
"export": true
},
@ -51,7 +79,14 @@
"prop": "minzudaima",
"type": "text",
"index": "4",
"tableShow": false,
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"isSort": true,
"isSearch": true,
"openPopoverVisible": false,
"searchValue": "",
"formShow": false,
"export": true
},
@ -60,6 +95,7 @@
"prop": "minzu",
"type": "text",
"index": "-1",
"fixed": false,
"tableShow": false,
"formShow": false,
"export": false
@ -69,8 +105,14 @@
"prop": "name",
"type": "text",
"index": "5",
"fixed": true,
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"isSort": true,
"isSearch": true,
"openPopoverVisible": false,
"searchValue": "",
"formShow": true,
"export": true
},
@ -87,9 +129,16 @@
"value": "2"
}
],
"type": "text",
"type": "select",
"index": "6",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"isSort": true,
"isSearch": true,
"openPopoverVisible": false,
"searchValue": "",
"formShow": true,
"export": true
},
@ -99,7 +148,14 @@
"type": "date",
"default": 10,
"index": "7",
"tableShow": false,
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"isSort": true,
"isSearch": true,
"openPopoverVisible": false,
"searchValue": "",
"formShow": false,
"export": true
},
@ -108,7 +164,14 @@
"prop": "address",
"type": "text",
"index": "8",
"tableShow": false,
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"isSort": true,
"isSearch": true,
"openPopoverVisible": false,
"searchValue": "",
"formShow": false,
"export": true
},
@ -117,7 +180,10 @@
"prop": "height",
"type": "number",
"index": "9",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": true,
"export": true
},
@ -126,7 +192,10 @@
"prop": "weight",
"type": "number",
"index": "10",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": true,
"export": true
},
@ -135,7 +204,10 @@
"prop": "BMI",
"type": "number",
"index": "11",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": true,
"export": false
},
@ -144,7 +216,10 @@
"prop": "BMIscore",
"type": "number",
"index": "12",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": false,
"export": false
},
@ -153,16 +228,23 @@
"prop": "lungs",
"type": "number",
"index": "13",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": true,
"export": true
},
{
"label": "得分",
"prop": "lungsccore",
"label1": "肺活量得分",
"prop": "lungsscore",
"type": "number",
"index": "14",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": false,
"export": false
},
@ -171,16 +253,23 @@
"prop": "fifty",
"type": "text",
"index": "15",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": true,
"export": true
},
{
"label": "得分",
"label1": "50米跑得分",
"prop": "fiftyscore",
"type": "number",
"index": "16",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": false,
"export": false
},
@ -189,16 +278,23 @@
"prop": "sitforward",
"type": "number",
"index": "17",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": true,
"export": true
},
{
"label": "得分",
"label1": "坐位体前屈得分",
"prop": "sitforwardscore",
"type": "number",
"index": "18",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": false,
"export": false
},
@ -207,16 +303,23 @@
"prop": "jump",
"type": "number",
"index": "19",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": true,
"export": true
},
{
"label": "得分",
"label1": "一分钟跳绳得分",
"prop": "jumpscore",
"type": "number",
"index": "20",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": false,
"export": false
},
@ -225,16 +328,23 @@
"prop": "situp",
"type": "number",
"index": "21",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": true,
"export": true
},
{
"label": "得分",
"label1": "一分钟仰卧起坐得分",
"prop": "situpscore",
"type": "number",
"index": "22",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": false,
"export": false
},
@ -243,16 +353,23 @@
"prop": "fiftyeight",
"type": "text",
"index": "23",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": true,
"export": true
},
{
"label": "得分",
"label1": "50米×8往返跑得分",
"prop": "fiftyeightscore",
"type": "number",
"index": "24",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": false,
"export": false
},
@ -261,16 +378,23 @@
"prop": "stand",
"type": "number",
"index": "25",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": true,
"export": true
},
{
"label": "得分",
"label1": "立定跳远得分",
"prop": "standscore",
"type": "number",
"index": "26",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": false,
"export": false
},
@ -279,16 +403,23 @@
"prop": "eighty",
"type": "text",
"index": "27",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": true,
"export": true
},
{
"label": "得分",
"label1": "800米跑得分",
"prop": "eightyscore",
"type": "number",
"index": "28",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": false,
"export": false
},
@ -297,16 +428,23 @@
"prop": "thousand",
"type": "text",
"index": "29",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": true,
"export": true
},
{
"label": "得分",
"label1": "1000米跑得分",
"prop": "thousandscore",
"type": "number",
"index": "30",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": false,
"export": false
},
@ -315,25 +453,35 @@
"prop": "pullup",
"type": "number",
"index": "31",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": true,
"export": true
},
{
"label": "得分",
"label1": "引体向上得分",
"prop": "pullupscore",
"type": "number",
"index": "32",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": false,
"export": false
},
{
"label": "总分",
"prop": "totalscore",
"prop": "totalScore",
"type": "number",
"index": "33",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"formShow": false,
"export": false
},
@ -342,7 +490,13 @@
"prop": "level",
"type": "text",
"index": "34",
"fixed": false,
"tableShow": true,
"setTableShow": true,
"sort": "",
"isSearch": true,
"openPopoverVisible": false,
"searchValue": "",
"formShow": false,
"export": false
},
@ -350,7 +504,8 @@
"label": "备注1",
"prop": "nodt1",
"type": "text",
"index": "35",
"index": "-1",
"fixed": false,
"tableShow": false,
"formShow": false,
"export": false
@ -359,7 +514,8 @@
"label": "备注2",
"prop": "nodt2",
"type": "text",
"index": "36",
"index": "-1",
"fixed": false,
"tableShow": false,
"formShow": false,
"export": false

9
front/src/renderer/src/components/formcomponent.vue

@ -5,6 +5,12 @@
<template v-if="formItem.type === 'text'">
<el-input v-model="formData[formItem.prop]" />
</template>
<template v-if="formItem.type === 'select'">
<el-select v-model="formData[formItem.prop]" size="large" style="width: 240px">
<el-option v-for="item in formItem.tableDisplay" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</template>
<template v-else-if="formItem.type === 'number'">
<el-input-number v-model="formData[formItem.prop]" :min="formItem.min" :max="formItem.max">
<template #decrease-icon>
@ -21,7 +27,8 @@
</template>
<template v-else-if="formItem.type === 'date'">
<el-date-picker v-model="formData[formItem.prop]" type="date"
:disabled="['create_at', 'update_at'].indexOf(formItem.prop) !== -1" :placeholder="`请选择${formItem.label}`" />
:disabled="['create_at', 'update_at'].indexOf(formItem.prop) !== -1"
:placeholder="`请选择${formItem.label}`" />
</template>
</el-form-item>
</el-form>

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

@ -1,7 +1,7 @@
<template>
<div class="tableClass">
<el-table :data="tableData" height="calc(100vh - 96px)" border @select="selectChange" @select-all="selectChange" fit
:row-key="getRowKeys" ref="tableRef">
<el-table :data="tableData" height="calc(100vh - 156px)" 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>
<el-table-column type="index" v-if="hiddenXuhao" width="60" :reserve-selection="true" fixed="left" label="序号">
@ -10,18 +10,83 @@
</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 + 8}px`" :fixed="!!headerItem.fixed">
<template #default="scope">
<template v-if="headerItem.type === 'text'">
<span>{{ scope.row[headerItem.prop] }}</span>
</template>
<template v-else-if="headerItem.type === 'date'">
<span>{{ scope.row[headerItem.prop] }}</span>
</template>
<template v-else-if="headerItem.type === 'number'">
<span>{{ scope.row[headerItem.prop] }}</span>
</template>
<template v-else>{{ scope.row[headerItem.prop] }}</template>
:key="headerIndex" :min-width="`${headerItem.label.length * 23 + 38}px`" :fixed="!!headerItem.fixed">
<template #header="{ column, $index }">
<div>
<span :style="`${column.label === '得分' ? 'color:#F56C6C' : ''}`">{{ column.label }}</span>
<span v-if="headerItem.isSearch">
<el-popover :width="350" trigger="click" placement="bottom-start" :hide-after="50"
:visible="headerItem.popoverVisible">
<template #reference>
<span @click="openPopoverVisible(headerItem)">
<el-icon style="position: relative;top: 2px;" v-if="!searchParams[headerItem.prop]">
<Filter />
</el-icon>
<el-icon style="position: relative;top: 2px;" v-else>
<Checked />
</el-icon>
</span>
</template>
<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'">
<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'">
<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>
<span v-if="headerItem.isSort">
<span @click="headerSort(headerItem)">
<el-icon style="position: relative;top: 2px;" v-if="headerItem.sort === ''">
<Sort />
</el-icon>
<el-icon style="position: relative;top: 2px;" v-else-if="headerItem.sort === 1">
<SortUp />
</el-icon>
<el-icon style="position: relative;top: 2px;" v-else-if="headerItem.sort === -1">
<SortDown />
</el-icon>
</span>
</span>
</div>
</template>
<template #default="{ row, column, $index }">
<div :style="`${column.label === '得分' ? 'color:#F56C6C' : ''}`">
<template v-if="headerItem.type === 'text'">
<span>{{ row[headerItem.prop] }}</span>
</template>
<template v-else-if="headerItem.type === 'select'">
<span>{{ _.find(headerItem.tableDisplay, { value: `${row[headerItem.prop]}` }).label }}</span>
</template>
<template v-else-if="headerItem.type === 'date'">
<span>{{ row[headerItem.prop] }}</span>
</template>
<template v-else-if="headerItem.type === 'number'">
<span>{{ row[headerItem.prop] }}</span>
</template>
<template v-else>{{ row[headerItem.prop] }}</template>
</div>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="145">
@ -57,7 +122,7 @@ import { ElMessage, ElMessageBox } from 'element-plus'
export default {
name: 'tablecomponent',
components: {},
emits: ["selectChange", "handleCurrentChange", "handleSizeChange", "edit", "info", "del"],
emits: ["selectChange", "handleCurrentChange", "handleSizeChange", "edit", "info", "del", "searchValue", "headerSort"],
props: {
tableHeader: {
type: Array,
@ -74,7 +139,7 @@ export default {
pageSizes: {
type: Array,
default: () => {
return [12, 50, 100, 200]
return [15, 50, 75, 100]
}
},
total: {
@ -83,6 +148,12 @@ export default {
return 0
}
},
searchParams: {
type: Object,
default: () => {
return {}
}
},
hiddenXuhao: {
type: Boolean,
default: () => {
@ -96,7 +167,7 @@ export default {
_: _,
dayjs: dayjs,
currentPage: 1,
pageSize: 12,
pageSize: 15,
}
},
methods: {
@ -118,7 +189,37 @@ export default {
},
clearSelection() {
this.$refs.tableRef.clearSelection()
}
},
searchValue(item) {
item.popoverVisible = false
this.$emit("searchValue")
},
// popoverp
openPopoverVisible(item) {
for (let i = 0; i < this.tableHeader.length; i++) {
let headerItem = this.tableHeader[i];
headerItem.popoverVisible = false
}
item.popoverVisible = true
},
headerSort(headerItem) {
for (let i = 0; i < this.tableHeader.length; i++) {
let item = this.tableHeader[i];
if (headerItem.prop !== item.prop) {
item.sort = ""
}
}
let sortOld = headerItem.sort
if (sortOld === "") {
headerItem.sort = 1
} else if (sortOld === 1) {
headerItem.sort = -1
} else if (sortOld === -1) {
headerItem.sort = ""
}
this.$emit("headerSort", headerItem)
},
},
async mounted() { },
watch: {

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

@ -42,7 +42,21 @@
</el-icon>
<span>刷新</span>
</el-button>
<div class="inputClass">
<el-button type="primary" @click="clearSelection">
<el-icon>
<Refresh />
</el-icon>
<span>清空搜索</span>
</el-button>
<el-tooltip effect="dark" content="设置表头" placement="top">
<el-button type="primary" @click="setHeader">
<el-icon>
<Setting />
</el-icon>
<span>设置表头</span>
</el-button>
</el-tooltip>
<!-- <div class="inputClass">
<el-input v-model.trim="searchParams.name" style="max-width: 600px" placeholder="请输入姓名" clearable
@clear="searchData" @keyup.enter="searchData">
<template #append>
@ -52,15 +66,19 @@
</el-icon>
</el-button>
</template>
</el-input>
</div>
</el-input>
</div> -->
</div>
<div>
<tablecomponent :tableHeader="tableHeader" :tableData="tableData" :pageSizes="pageSizes" :total="total"
@selectChange="selectChange" @handleCurrentChange="handleCurrentChange" @handleSizeChange="handleSizeChange"
@edit="edit" @info="info" @del="del" ref="tableComponentRef">
<tablecomponent :tableHeader="tableHeader" :tableData="tableData" :searchParams="searchParams"
:pageSizes="pageSizes" :total="total" @selectChange="selectChange" @handleCurrentChange="handleCurrentChange"
@handleSizeChange="handleSizeChange" @edit="edit" @info="info" @del="del" @searchValue="searchData"
ref="tableComponentRef" @headerSort="headerSort">
</tablecomponent>
</div>
<div style="text-align: center;line-height: 60px;font-size: 1.2em">
<span>守望者网络科技有限公司 Copyright@{{ dayjs().format("YYYY") }} 版权所有北京市房山区 资深教育工作者 李竞飞</span>
</div>
<el-dialog v-model="dialogFrom.visible" :title="dialogFrom.title" width="80%">
<formcomponent :formHeader="dialogFrom.formHeader" :formData="dialogFrom.formData"
:disabled="dialogFrom.disabled">
@ -72,6 +90,14 @@
</div>
</template>
</el-dialog>
<el-dialog v-model="setHeaderVisible" title="设置表头" width="80%">
<el-row>
<el-col v-for="(item, index) in setTableHeader" :key="index" :span="8">
<el-checkbox v-model="item.setTableShow" :label="item.label1 || item.label" size="large" />
<el-checkbox v-model="item.fixed" label="固定在左侧" size="large" />
</el-col>
</el-row>
</el-dialog>
</div>
</template>
@ -88,22 +114,23 @@ import { ElMessage, ElMessageBox } from 'element-plus'
export default {
name: 'student',
components: { tablecomponent, formcomponent },
watch: {},
computed: {},
data() {
return {
_: _,
dayjs: dayjs,
tableHeader: [],
setTableHeader: [],
formHeader: [],
exportHeader: [],
tableData: [],
currentPage: 1,
pageSize: 12,
pageSizes: [12, 50, 100, 200],
pageSize: 15,
pageSizes: [15, 50, 75, 100],
total: 0,
fileOriData: null,
searchParams: {
name: ""
},
searchParams: {},
selectionData: [],
dialogFrom: {
visible: false,
@ -112,6 +139,8 @@ export default {
formHeader: [],
formData: {}
},
setHeaderVisible: false,
sortObj: {},
}
},
methods: {
@ -145,7 +174,9 @@ export default {
let dealItem = {}
for (let key in element) {
let headerItem = _.find(tableHeaderLocal, o => o.label === key)
dealItem[headerItem.prop] = element[key]
if (headerItem) {
dealItem[headerItem.prop] = element[key]
}
}
try {
await myDatabase.student.add({
@ -184,9 +215,9 @@ export default {
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)) {
scoreItem = { ...item }
let itemValue = this.transTime(item[`${row.nianjicode}`])
if (`${item.gender}` === `${row.gender}` && this.createComparator(value.fuhao)(rowValue, itemValue)) {
scoreItem = { ...item, [`${key.slice(0, key.length - 5)}_org`]: row[value.prop] }
break
}
}
@ -195,7 +226,43 @@ export default {
}
}
// todo
// G2_M2_BMIo2_q2_50s2_u2_w2_y2_50X8AA2_Ac2_800AE2_1000Ag2_
//
// =M2 * 0.15 + O2 * 0.15 + Q2 * 0.2 + S2 * 0.3 + U2 * 0.2
//
// =M2 * 0.15 + O2 * 0.15 + Q2 * 0.2 + S2 * 0.2 + U2 * 0.2 + W2 * 0.1
//
// =M2 * 0.15 + O2 * 0.15 + Q2 * 0.2 + S2 * 0.1 + U2 * 0.1 + W2 * 0.2 + Y2 * 0.1
//
// =IF(G2 = 1, M2 * 0.15 + O2 * 0.15 + Q2 * 0.2 + S2 * 0.1 + AA2 * 0.1 + AG2 * 0.1 + AE2 * 0.2, IF(G2 = 2, M2 * 0.15 + O2 * 0.15 + Q2 * 0.2 + S2 * 0.1 + AA2 * 0.1 + W2 * 0.1 + AC2 * 0.2))
if (["11", "12"].indexOf(`${row.nianjicode}`) !== -1) {
row["totalScore"] = Number(Number(row.BMIscore * 0.15 + row.lungsscore * 0.15 + row.fiftyscore * 0.2 + row.sitforwardscore * 0.3 + row.jumpscore * 0.2).toFixed(2))
} else if (["13", "14"].indexOf(`${row.nianjicode}`) !== -1) {
row["totalScore"] = Number(Number(row.BMIscore * 0.15 + row.lungsscore * 0.15 + row.fiftyscore * 0.2 + row.sitforwardscore * 0.2 + row.jumpscore * 0.2 + row.situpscore * 0.1).toFixed(2))
} else if (["15", "16"].indexOf(`${row.nianjicode}`) !== -1) {
row["totalScore"] = Number(Number(row.BMIscore * 0.15 + row.lungsscore * 0.15 + row.fiftyscore * 0.2 + row.sitforwardscore * 0.1 + row.jumpscore * 0.1 + row.situpscore * 0.2 + row.fiftyeightscore * 0.1).toFixed(2))
} else if (["21", "22", "23"].indexOf(`${row.nianjicode}`) !== -1) {
if (`${row.gender}` === "1") {
row["totalScore"] = Number(Number(row.BMIscore * 0.15 + row.lungsscore * 0.15 + row.fiftyscore * 0.2 + row.sitforwardscore * 0.1 + row.standscore * 0.1 + row.pullupscore * 0.1 + row.thousandscore * 0.2).toFixed(2))
} else if (`${row.gender}` === "2") {
row["totalScore"] = Number(Number(row.BMIscore * 0.15 + row.lungsscore * 0.15 + row.fiftyscore * 0.2 + row.sitforwardscore * 0.1 + row.standscore * 0.1 + row.situpscore * 0.1 + row.eightyscore * 0.2).toFixed(2))
}
}
row["totalScore"] = Number(Number(row["totalScore"] + row["addScore"]).toFixed(2))
//
// = IF(AH2 >= 90, "", IF(AH2 >= 80, "", IF(AH2 >= 60, "", "")))
let totalScoreNumber = Number(row.totalScore)
if (totalScoreNumber >= 90) {
row["level"] = "优秀"
} else if (totalScoreNumber >= 80) {
row["level"] = "良好"
} else if (totalScoreNumber >= 60) {
row["level"] = "及格"
} else if (totalScoreNumber >= 0) {
row["level"] = "不及格"
} else {
row["level"] = ""
}
return row
},
transTime(value) {
@ -241,88 +308,57 @@ export default {
}
},
//
async successSubmit11(opts) {
let that = this
let file = opts.file
this.fileDealData = []
let fileReader = new FileReader()
fileReader.onload = async function () {
let data = this.result
let dataObj = {}
let workbook = XLSX.read(data, { type: 'binary' })
for (let i = 0; i < workbook.SheetNames.length; i++) {
let sheetName = workbook.SheetNames[i];
let sheetData = XLSX.utils.sheet_to_json(workbook.Sheets[sheetName])
let sheetDataList = []
let noKey = ["prop", "fuhao"]
for (let i = 0; i < sheetData.length; i++) {
let element = sheetData[i];
let item = {}
for (let key in element) {
if (element[key] === "-Infinity") {
element[key] = -100000
} else if (element[key] === "Infinity") {
element[key] = 999999
}
if (element[key] !== "无") {
if (noKey.indexOf(key) === -1) {
item[key] = element[key]
}
if (key === "score") {
if (element[key] > 100) {
item[key] = 100
item[`add_${key}`] = element[key] - 100
}
}
//
async updateSeach(params = {}) {
let allStudentList = _.cloneDeep(await myDatabase.student.toArray())
if (!_.isEmpty(params)) {
let paramsTemp = {}
for (let key in params) {
let value = params[key]
if (["undefined", "", "null"].indexOf(`${value}`) === -1) {
paramsTemp[key] = [`${value}`, Number(value)]
}
}
let dataTemp = []
if (!_.isEmpty(paramsTemp)) {
for (let i = 0; i < allStudentList.length; i++) {
let element = allStudentList[i];
for (let key in paramsTemp) {
if (paramsTemp[key].includes(element[key])) {
dataTemp.push({ ...element })
}
}
sheetDataList.push(item)
}
dataObj[sheetName] = {
prop: sheetData[0].prop,
fuhao: sheetData[0].fuhao,
list: sheetDataList
}
allStudentList = _.cloneDeep(dataTemp)
}
console.log(774444, dataObj)
// let sheetName = workbook.SheetNames[0]
// let sheetData = XLSX.utils.sheet_to_json(workbook.Sheets[sheetName], { header: 1, defval: '' })
// console.log(11174444, sheetData)
// let list = []
}
fileReader.onerror = function (error) {
ElMessage({
message: `Error reading file:, ${error}`,
type: 'error',
})
if (_.get(this.sortObj, ["sort"], "")) {
//
allStudentList = _.cloneDeep(_.orderBy(allStudentList, [this.sortObj.prop], [_.get(this.sortObj, ["sort"], "") === 1 ? 'desc' : 'asc']))
}
fileReader.readAsArrayBuffer(file)
},
//
async updateSeach(params = {}) {
let studentList = []
let totalList = 0
if (params.name) {
studentList = await myDatabase.student.where('name').anyPass(studentItem => studentItem.includes(params.name)).offset((this.currentPage - 1) * this.pageSize).limit(this.pageSize).toArray()
totalList = await myDatabase.student.where('name').anyPass(studentItem => studentItem.includes(params.name)).toArray()
} else {
studentList = await myDatabase.student.offset((this.currentPage - 1) * this.pageSize).limit(this.pageSize).toArray()
totalList = await myDatabase.student.toArray()
}
this.total = totalList.length
this.tableData = _.cloneDeep(studentList)
this.total = allStudentList.length
this.tableData = allStudentList.slice((this.currentPage - 1) * this.pageSize, this.currentPage * this.pageSize)
},
//
async searchData() {
let params = {}
if (this.searchParams.name) {
params["name"] = { $regex: `${_.trim(this.searchParams.name)}`, $options: 'i' }
await this.updateSeach(this.searchParams)
},
//
async headerSort(headerSort) {
this.sortObj = headerSort
await this.updateSeach(this.searchParams)
},
//
async clearSelection() {
for (let key in this.searchParams) {
this.searchParams[key] = ""
}
for (let i = 0; i < this.tableHeader.length; i++) {
let item = this.tableHeader;
item.sort = ""
}
await this.updateSeach(params)
this.sortObj = {}
await this.searchData()
},
//
selectChange(selection) {
@ -358,13 +394,13 @@ export default {
}
}
let params = {
...this.dialogFrom.formData, create_at: dayjs().format('YYYY-MM-DD HH:mm:ss'), update_at: dayjs().format('YYYY-MM-DD HH:mm:ss')
...this.dialogFrom.formData, ...this.dealRow(this.dialogFrom.formData), create_at: dayjs().format('YYYY-MM-DD HH:mm:ss'), update_at: dayjs().format('YYYY-MM-DD HH:mm:ss')
}
if (this.dialogFrom.type === "put") {
delete params.create_at
}
try {
await myDatabase.student[this.dialogFrom.type]({ ...this.dialogFrom.formData, update_at: dayjs().format('YYYY-MM-DD HH:mm:ss') })
await myDatabase.student[this.dialogFrom.type]({ ...params, update_at: dayjs().format('YYYY-MM-DD HH:mm:ss') })
await this.searchData()
this.cancelDialog()
} catch (e) {
@ -383,6 +419,8 @@ export default {
let element = this.formHeader[i];
if (element.type === "text") {
formData[element.prop] = ""
} else if (element.type === "select") {
formData[element.prop] = ""
} else if (element.type === "date") {
formData[element.prop] = dayjs().subtract(element.default || 0, 'year').format("YYYY-MM-DD")
} else if (element.type === "number") {
@ -489,9 +527,9 @@ export default {
for (let i = 0; i < listCopy.length; i++) {
let item = listCopy[i];
let listItem = {}
for (let j = 0; j < tableHeaderLocal.length; j++) {
let headerItem = tableHeaderLocal[j];
listItem[headerItem.label] = item[headerItem.prop]
for (let j = 0; j < this.exportHeader.length; j++) {
let headerItem = this.exportHeader[j];
listItem[headerItem.label] = item[`${headerItem.prop}_org`] || item[`${headerItem.prop}`]
}
lilstLocal.push(listItem)
}
@ -510,16 +548,36 @@ export default {
})
}
},
//
setHeader() {
this.setHeaderVisible = true
}
},
async mounted() {
this.tableHeader = _.filter(tableHeaderLocal, o => o.tableShow)
this.setTableHeader = []
if (!localStorage.getItem('setTableHeader')) {
for (let i = 0; i < tableHeaderLocal.length; i++) {
let headerItem = tableHeaderLocal[i];
if (headerItem.isSearch) {
this.searchParams[headerItem.prop] = ""
}
if (headerItem.setTableShow) {
this.setTableHeader.push(headerItem)
}
}
localStorage.setItem('setTableHeader', JSON.stringify(this.setTableHeader))
} else {
this.setTableHeader = JSON.parse(localStorage.getItem('setTableHeader'))
}
this.tableHeader = _.filter(this.setTableHeader, o => o.setTableShow)
this.formHeader = _.filter(tableHeaderLocal, o => o.formShow)
this.exportHeader = _.filter(tableHeaderLocal, o => o.export)
await this.updateSeach()
this.$watch("setTableHeader", (val) => {
this.tableHeader = _.filter(val, o => o.setTableShow)
localStorage.setItem('setTableHeader', JSON.stringify(val))
}, { deep: true })
},
watch: {},
computed: {}
}
</script>
<style scoped>

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

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

Loading…
Cancel
Save