568 lines
18 KiB
JavaScript
568 lines
18 KiB
JavaScript
const app = new Vue({
|
||
el: '#app',
|
||
data() {
|
||
return {
|
||
jsString: '',
|
||
result: {
|
||
column: [],
|
||
filter: [],
|
||
data: [],
|
||
},
|
||
excelRawList: [],
|
||
activeName: '历年分数',
|
||
isIndeterminate1: false,
|
||
isIndeterminate2: false,
|
||
checkAll1: true,
|
||
checkAll2: false,
|
||
fileTemp: null,
|
||
form: {
|
||
column: [],
|
||
filter: [],
|
||
},
|
||
columns: [],
|
||
historyColumns: [
|
||
{ label: '年份', value: '年份' },
|
||
{ label: '省份', value: '省份' },
|
||
{ label: '层次', value: '层次' },
|
||
{ label: '招生类型', value: '招生类型' },
|
||
{ label: '科类', value: '科类' },
|
||
{ label: '批次', value: '批次' },
|
||
{ label: '专业名称', value: '专业名称' },
|
||
{ label: '最低分', value: '最低分' },
|
||
{ label: '最低分位次', value: '最低分位次' },
|
||
{ label: '最高分', value: '最高分' },
|
||
{ label: '最高分位次', value: '最高分位次' },
|
||
{ label: '平均分', value: '平均分' },
|
||
{ label: '省控线', value: '省控线' },
|
||
{ label: '人数', value: '人数' },
|
||
{ label: '专业组', value: '专业组' },
|
||
],
|
||
enrollmentColumns: [
|
||
{ label: '年份', value: '年份' },
|
||
{ label: '省份', value: '省份' },
|
||
{ label: '层次', value: '层次' },
|
||
{ label: '科类', value: '科类' },
|
||
{ label: '批次', value: '批次' },
|
||
{ label: '专业名称', value: '专业名称' },
|
||
{ label: '专业类别', value: '专业类别' },
|
||
{ label: '计划性质', value: '计划性质' },
|
||
{ label: '计划类别', value: '计划类别' },
|
||
{ label: '计划数', value: '计划数' },
|
||
{ label: '专业代码', value: '专业代码' },
|
||
{ label: '专业代号', value: '专业代号' },
|
||
{ label: '招考方向', value: '招考方向' },
|
||
{ label: '学制代码', value: '学制代码' },
|
||
{ label: '收费标准', value: '收费标准' },
|
||
{ label: '院系部门名称', value: '院系部门名称' },
|
||
{ label: '办学地点', value: '办学地点' },
|
||
{ label: '专业备注', value: '专业备注' },
|
||
{ label: '招考类型名称', value: '招考类型名称' },
|
||
{ label: '专业组', value: '专业组' },
|
||
{ label: '备注', value: '备注' },
|
||
],
|
||
filters: [],
|
||
historyFilters: [
|
||
{ label: '年份', value: '年份' },
|
||
{ label: '省份', value: '省份' },
|
||
{ label: '层次', value: '层次' },
|
||
{ label: '招生类型', value: '招生类型' },
|
||
{ label: '科类', value: '科类' },
|
||
{ label: '批次', value: '批次' },
|
||
],
|
||
enrollmentFilters: [
|
||
{ label: '年份', value: '年份' },
|
||
{ label: '省份', value: '省份' },
|
||
{ label: '层次', value: '层次' },
|
||
{ label: '科类', value: '科类' },
|
||
{ label: '批次', value: '批次' },
|
||
{ label: '专业类别', value: '专业类别' },
|
||
{ label: '计划性质', value: '计划性质' },
|
||
{ label: '计划类别', value: '计划类别' },
|
||
],
|
||
// 考生分数列
|
||
candidateScoreColumns: [
|
||
{ label: '年份', value: '年份' },
|
||
{ label: '姓名', value: '姓名' },
|
||
{ label: '考生号', value: '考生号' },
|
||
{ label: '录取批次', value: '录取批次' },
|
||
{ label: '录取专业', value: '录取专业' },
|
||
{ label: '快递单号', value: '快递单号' },
|
||
],
|
||
candidateScoreFilters: [],
|
||
}
|
||
},
|
||
computed: {
|
||
excelRawString() {
|
||
return JSON.stringify(this.excelRawList)
|
||
},
|
||
},
|
||
watch: {
|
||
'form.column': {
|
||
handler(newVal) {
|
||
if (this.activeName === '历年分数') {
|
||
if (!newVal.length) {
|
||
this.isIndeterminate1 = false
|
||
this.checkAll1 = false
|
||
} else if (newVal.length === this.historyColumns.length) {
|
||
this.isIndeterminate1 = false
|
||
this.checkAll1 = true
|
||
} else {
|
||
this.isIndeterminate1 = true
|
||
this.checkAll1 = false
|
||
}
|
||
} else if (this.activeName === '招生计划'){
|
||
// 招生计划
|
||
if (!newVal.length) {
|
||
this.isIndeterminate1 = false
|
||
this.checkAll1 = false
|
||
} else if (newVal.length === this.enrollmentColumns.length) {
|
||
this.isIndeterminate1 = false
|
||
this.checkAll1 = true
|
||
} else {
|
||
this.isIndeterminate1 = true
|
||
this.checkAll1 = false
|
||
}
|
||
}else{
|
||
if (!newVal.length) {
|
||
this.isIndeterminate1 = false
|
||
this.checkAll1 = false
|
||
} else if (newVal.length === this.candidateScoreColumns.length) {
|
||
this.isIndeterminate1 = false
|
||
this.checkAll1 = true
|
||
} else {
|
||
this.isIndeterminate1 = true
|
||
this.checkAll1 = false
|
||
}
|
||
}
|
||
this.updateAll()
|
||
},
|
||
deep: true,
|
||
immediate: true,
|
||
},
|
||
'form.filter': {
|
||
handler(newVal) {
|
||
if (this.activeName === '历年分数') {
|
||
if (!newVal.length) {
|
||
this.isIndeterminate2 = false
|
||
this.checkAll2 = false
|
||
} else if (newVal.length === this.historyFilters.length) {
|
||
this.isIndeterminate2 = false
|
||
this.checkAll2 = true
|
||
} else {
|
||
this.isIndeterminate2 = true
|
||
this.checkAll2 = false
|
||
}
|
||
} else if (this.activeName === '招生计划'){
|
||
// 招生计划
|
||
if (!newVal.length) {
|
||
this.isIndeterminate2 = false
|
||
this.checkAll2 = false
|
||
} else if (newVal.length === this.enrollmentFilters.length) {
|
||
this.isIndeterminate2 = false
|
||
this.checkAll2 = true
|
||
} else {
|
||
this.isIndeterminate2 = true
|
||
this.checkAll2 = false
|
||
}
|
||
}
|
||
this.updateAll()
|
||
},
|
||
deep: true,
|
||
immediate: true,
|
||
},
|
||
},
|
||
mounted() {
|
||
if (this.activeName === '历年分数') {
|
||
this.columns = [...this.historyColumns]
|
||
this.filters = [...this.historyFilters]
|
||
setTimeout(() => {
|
||
// this.handleCheckAllChange1(true)
|
||
this.handleTab({name:'历年分数'})
|
||
|
||
}, 300)
|
||
}
|
||
},
|
||
methods: {
|
||
clearAll() {
|
||
this.form.filter = []
|
||
this.checkAll1 = false
|
||
this.form.column = []
|
||
this.checkAll2 = false
|
||
},
|
||
updateAll() {
|
||
// form.column
|
||
console.log('this.form.column: ', this.form.column);
|
||
|
||
this.result.column = [...this.form.column]
|
||
this.form.filter.forEach((item) => {
|
||
if (!this.form.column.includes(item)) {
|
||
this.form.filter = this.form.filter.filter((i) => item !== i)
|
||
}
|
||
})
|
||
// form.filter
|
||
let data = [...this.result.data]
|
||
let data1 = this.form.filter.map((item) => {
|
||
const newItem = {}
|
||
newItem[item] = []
|
||
return newItem
|
||
})
|
||
for (const iterator of data1) {
|
||
let key = Object.keys(iterator)[0]
|
||
for (const dataItem of data) {
|
||
iterator[key].push(dataItem[key])
|
||
}
|
||
iterator[key] = [...new Set(iterator[key])]
|
||
iterator[key].sort((a, b) => a - b)
|
||
}
|
||
this.result.filter = data1
|
||
// updateData
|
||
this.updateData()
|
||
// createJsString()
|
||
this.createJsString()
|
||
},
|
||
createJsString() {
|
||
this.jsString = `var columnList = ${JSON.stringify(this.result.column)};
|
||
|
||
var filterList = ${JSON.stringify(this.result.filter)};
|
||
|
||
var dataList = ${JSON.stringify(this.result.data)};`
|
||
},
|
||
updateData() {
|
||
// console.log(this.form,'====', this.excelRawList);
|
||
let temp = this.excelRawList.map((item) => {
|
||
const newItem = {}
|
||
for (const iterator of this.form.column) {
|
||
newItem[iterator] = item[iterator]
|
||
}
|
||
return newItem
|
||
})
|
||
if (temp[0] && Object.keys(temp[0]).length) this.result.data = [...temp]
|
||
else this.result.data = []
|
||
},
|
||
download() {
|
||
console.log(this.activeName)
|
||
let blob = new Blob([this.jsString], { type: 'text/javascript' })
|
||
let objectURL = window.URL.createObjectURL(blob)
|
||
const link = document.createElement('a')
|
||
link.href = objectURL
|
||
if (this.activeName == '招生计划') {
|
||
link.download = 'shaixuanandcolumn-jihua.js'
|
||
} else if (this.activeName == '历年分数') {
|
||
link.download = 'shaixuanandcolumn-fenshu.js'
|
||
} else {
|
||
link.download = 'shaixuanandcolumn-luqu.js'
|
||
}
|
||
// link.click()
|
||
|
||
let fileName = '';
|
||
if (this.activeName === '招生计划') {
|
||
fileName = 'shaixuanandcolumn-jihua.js';
|
||
} else if (this.activeName === '历年分数') {
|
||
fileName = 'shaixuanandcolumn-fenshu.js';
|
||
} else {
|
||
fileName = 'shaixuanandcolumn-luqu.js';
|
||
}
|
||
|
||
const payload = {
|
||
fileName,
|
||
content: this.jsString,
|
||
};
|
||
|
||
// 使用 fetch 或 axios 发送请求
|
||
fetch('/api/files/save', {
|
||
method: 'POST',
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
},
|
||
body: JSON.stringify(payload),
|
||
})
|
||
.then((response) => response.text())
|
||
.then((result) => {
|
||
console.log(result); // 显示服务器返回的结果
|
||
this.$message({
|
||
type: 'success',
|
||
message: '保存成功!',
|
||
})
|
||
})
|
||
.catch((error) => {
|
||
this.$message({
|
||
type: 'error',
|
||
message: '保存失败!',
|
||
})
|
||
});
|
||
|
||
|
||
|
||
const payload2 = {
|
||
fileName:`json-${fileName}`,
|
||
content: JSON.stringify({
|
||
columnList:this.form.column,
|
||
filterList:this.form.filter,
|
||
dataList:this.result.data,
|
||
}),
|
||
};
|
||
|
||
// 使用 fetch 或 axios 发送请求
|
||
fetch('/api/files/save', {
|
||
method: 'POST',
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
},
|
||
body: JSON.stringify(payload2),
|
||
})
|
||
.then((response) => response.text())
|
||
.then((result) => {
|
||
console.log(result); // 显示服务器返回的结果
|
||
|
||
})
|
||
.catch((error) => {
|
||
|
||
});
|
||
|
||
|
||
},
|
||
downloadTemplate() {
|
||
const link = document.createElement('a')
|
||
if (this.activeName == '招生计划') {
|
||
link.href = '/resource/tools/file/enrollment-plan.xlsx'
|
||
link.download = '招生计划.xlsx'
|
||
} else if (this.activeName == '历年分数') {
|
||
link.href = '/resource/tools/file/score-history.xlsx'
|
||
link.download = '历年分数.xlsx'
|
||
}else{
|
||
link.href = '/resource/tools/file/candidate-score.xlsx'
|
||
link.download = '考生分数.xlsx'
|
||
}
|
||
link.click()
|
||
},
|
||
copy() {
|
||
navigator.clipboard.writeText(this.jsString)
|
||
this.$message({
|
||
type: 'success',
|
||
message: '复制成功!',
|
||
})
|
||
},
|
||
//上传文件时处理方法
|
||
handleChange(file, fileList) {
|
||
this.fileTemp = file.raw
|
||
if (this.fileTemp) {
|
||
if (this.fileTemp.type == 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' || this.fileTemp.type == 'application/vnd.ms-excel') {
|
||
this.importfxx(this.fileTemp)
|
||
} else {
|
||
this.$message({
|
||
type: 'warning',
|
||
message: '附件格式错误,请删除后重新上传!',
|
||
})
|
||
}
|
||
} else {
|
||
this.$message({
|
||
type: 'warning',
|
||
message: '请上传附件!',
|
||
})
|
||
}
|
||
},
|
||
//超出最大上传文件数量时的处理方法
|
||
handleExceed() {
|
||
this.$message({
|
||
type: 'warning',
|
||
message: '超出最大上传文件数量的限制!',
|
||
})
|
||
return
|
||
},
|
||
//移除文件的操作方法
|
||
handleRemove(file, fileList) {
|
||
this.fileTemp = null
|
||
},
|
||
handleTemplate() {
|
||
window.open('/documents/历年分数导入模板.xlsx')
|
||
},
|
||
importfxx(obj) {
|
||
let _this = this
|
||
let inputDOM = this.$refs.inputer
|
||
// 通过DOM取文件数据
|
||
|
||
this.file = event.currentTarget.files[0]
|
||
|
||
var rABS = false //是否将文件读取为二进制字符串
|
||
var f = this.file
|
||
|
||
var reader = new FileReader()
|
||
//if (!FileReader.prototype.readAsBinaryString) {
|
||
FileReader.prototype.readAsBinaryString = function (f) {
|
||
var binary = ''
|
||
var rABS = false //是否将文件读取为二进制字符串
|
||
var pt = this
|
||
var wb //读取完成的数据
|
||
var outdata
|
||
var reader = new FileReader()
|
||
reader.onload = function (e) {
|
||
var bytes = new Uint8Array(reader.result)
|
||
var length = bytes.byteLength
|
||
for (var i = 0; i < length; i++) {
|
||
binary += String.fromCharCode(bytes[i])
|
||
}
|
||
//此处引入,用于解析excel
|
||
// var XLSX = require("xlsx");
|
||
if (rABS) {
|
||
wb = XLSX.read(btoa(fixdata(binary)), {
|
||
//手动转化
|
||
type: 'base64',
|
||
})
|
||
} else {
|
||
wb = XLSX.read(binary, {
|
||
type: 'binary',
|
||
})
|
||
}
|
||
outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]])
|
||
console.log('outdata: ', outdata)
|
||
// let outdata1 = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[1]])
|
||
// let outdata2 = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[2]])
|
||
// console.log(outdata, outdata1, outdata2);
|
||
// console.log(outdata, JSON.stringify(outdata));
|
||
_this.excelRawList = JSON.parse(JSON.stringify(outdata))
|
||
_this.result.data = [...outdata]
|
||
console.log('_this.result.data: ', _this.result.data)
|
||
_this.updateAll()
|
||
_this.$message({
|
||
type: 'success',
|
||
message: '解析成功!',
|
||
})
|
||
}
|
||
reader.readAsArrayBuffer(f)
|
||
}
|
||
if (rABS) {
|
||
reader.readAsArrayBuffer(f)
|
||
} else {
|
||
reader.readAsBinaryString(f)
|
||
}
|
||
},
|
||
handleCheckAllChange1(value) {
|
||
console.log('value: ', value,this.activeName);
|
||
this.isIndeterminate1 = false
|
||
const result = []
|
||
if (value) {
|
||
if (this.activeName === '历年分数') {
|
||
this.historyColumns.forEach((item) => {
|
||
result.push(item.value)
|
||
})
|
||
} else if (this.activeName === '招生计划') {
|
||
this.enrollmentColumns.forEach((item) => {
|
||
result.push(item.value)
|
||
})
|
||
} else {
|
||
this.candidateScoreColumns.forEach((item) => {
|
||
result.push(item.value)
|
||
})
|
||
}
|
||
}
|
||
console.log('result: ', JSON.stringify(result));
|
||
|
||
this.form.column = result
|
||
},
|
||
handleCheckAllChange2(value) {
|
||
this.isIndeterminate1 = false
|
||
const result = []
|
||
if (value) {
|
||
if (this.activeName === '历年分数') {
|
||
this.historyFilters.forEach((item) => {
|
||
if (this.form.column.includes(item.value)) result.push(item.value)
|
||
})
|
||
} else if (this.activeName === '招生计划') {
|
||
this.enrollmentFilters.forEach((item) => {
|
||
if (this.form.column.includes(item.value)) result.push(item.value)
|
||
})
|
||
} else {
|
||
this.candidateScoreFilters.forEach((item) => {
|
||
if (this.form.column.includes(item.value)) result.push(item.value)
|
||
})
|
||
}
|
||
}
|
||
this.form.filter = result
|
||
},
|
||
change1(value) {
|
||
// console.log(this.form);
|
||
},
|
||
loadScript(src) {
|
||
return new Promise((resolve, reject) => {
|
||
fetch(src)
|
||
.then((response) => {
|
||
if (!response.ok) {
|
||
return reject(new Error(`Failed to load script: ${src}`));
|
||
}
|
||
return response.text(); // 获取脚本内容
|
||
})
|
||
.then((scriptContent) => resolve(scriptContent))
|
||
.catch((err) => reject(err));
|
||
});
|
||
},
|
||
exportExcel(){
|
||
const ws = XLSX.utils.json_to_sheet(this.result.data); // 将数据转换为工作表
|
||
const wb = XLSX.utils.book_new(); // 创建新的工作簿
|
||
XLSX.utils.book_append_sheet(wb, ws, 'Sheet1'); // 将工作表添加到工作簿
|
||
XLSX.writeFile(wb, `${this.activeName}.xlsx`); // 导出为 Excel 文件
|
||
},
|
||
handleTab({ name }) {
|
||
this.clearAll()
|
||
|
||
window.columnList=[];
|
||
window.filterList=[]
|
||
if (name === '历年分数') {
|
||
this.columns = [...this.historyColumns]
|
||
this.filters = [...this.historyFilters]
|
||
//
|
||
} else if (name === '招生计划') {
|
||
this.columns = [...this.enrollmentColumns]
|
||
this.filters = [...this.enrollmentFilters]
|
||
} else {
|
||
this.columns = [...this.candidateScoreColumns]
|
||
this.filters = [...this.candidateScoreFilters]
|
||
}
|
||
let origin = location.origin
|
||
|
||
// 定义加载文件路径
|
||
let scriptPath = '';
|
||
if (name === '历年分数') {
|
||
scriptPath = origin+'/resources/templates/default_v2/web/json-shaixuanandcolumn-fenshu.js';
|
||
} else if (name === '招生计划') {
|
||
scriptPath = origin+'/resources/templates/default_v2/web/json-shaixuanandcolumn-jihua.js';
|
||
} else {
|
||
scriptPath = origin+'/resources/templates/default_v2/web/json-shaixuanandcolumn-luqu.js';
|
||
}
|
||
this.result.data = []
|
||
this.excelRawList= []
|
||
|
||
this.form.column = []
|
||
this.form.filter = []
|
||
// 动态加载新脚本
|
||
this.loadScript(scriptPath)
|
||
.then((scriptContent) => {
|
||
console.log(scriptContent)
|
||
try {
|
||
let res = JSON.parse(scriptContent)
|
||
|
||
// 使用动态加载的变量更新 columns 和 filters
|
||
this.result.data = [...(res.dataList || [])];
|
||
this.excelRawList= [...(res.dataList || [])];
|
||
|
||
this.form.column = [...(res.columnList || [])];
|
||
this.form.filter = [...(res.filterList || [])];
|
||
} catch (error) {
|
||
|
||
}
|
||
|
||
})
|
||
.catch((err) => {
|
||
console.error(`加载脚本失败: ${err}`);
|
||
setTimeout(() => {
|
||
this.handleCheckAllChange1(true);
|
||
}, 300);
|
||
});
|
||
|
||
|
||
// setTimeout(() => {
|
||
// this.handleCheckAllChange1(true)
|
||
// }, 300)
|
||
},
|
||
},
|
||
})
|