Compare commits

...

2 Commits

Author SHA1 Message Date
yujialong 2af18aa23c fix 2 weeks ago
yujialong fe4a1b7900 fix 2 weeks ago
  1. 28
      src/components/upload/config.js
  2. 25
      src/views/Login.vue
  3. 286
      src/views/serve/projectAdd.vue

@ -1,32 +1,12 @@
/**
* 阿里云oss配置
* */
import { get } from '@/utils/http'
import api from '@/utils/api'
import CryptoJS from 'crypto-js'
import JSEncrypt from 'jsencrypt'
const A = (key, encryptedData) => {
const keyHex = CryptoJS.enc.Base64.parse(key)
const decrypted = CryptoJS.AES.decrypt(encryptedData, keyHex, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
})
return decrypted.toString(CryptoJS.enc.Utf8)
}
const R = (encryptedKey, privateKey) => {
const decrypt = new JSEncrypt()
decrypt.setPrivateKey(privateKey)
const decryptedKey = decrypt.decrypt(encryptedKey)
return decryptedKey
}
export default async function () {
try {
const res = await get(api.encrypt)
const RE = A(R(res.encryptedKey, res.privateKey), res.encryptedData).split('/')
return {
let RE = localStorage.getItem('osc')
if (RE) RE = JSON.parse(RE)
return RE ? {
// oss账号信息
config: {
region: 'oss-cn-shenzhen',
@ -36,6 +16,6 @@ export default async function () {
},
// 上传成功url前置部分(成功回调没有返回url)
preUrl: 'https://huoran.oss-cn-shenzhen.aliyuncs.com/'
}
} : {}
} catch (e) { }
}

@ -103,6 +103,8 @@
import vFooter from '../components/Footer'
import Setting from '@/setting'
import addRoutes from '@/libs/route/addRoutes'
import CryptoJS from 'crypto-js'
import JSEncrypt from 'jsencrypt'
export default {
data: function () {
var regPhoneOrEmail = (rule, value, callback) => {//
@ -201,6 +203,7 @@ export default {
this.$post(this.api.logins, param).then(({ status, data, message }) => {
localStorage.removeItem('examPath')
localStorage.removeItem('reviewPath')
this.getOss()
if (status == 200) {
const accounts = data.userAccounts
//
@ -229,6 +232,28 @@ export default {
}
});
},
// oss
async getOss () {
const A = (key, encryptedData) => {
const keyHex = CryptoJS.enc.Base64.parse(key)
const decrypted = CryptoJS.AES.decrypt(encryptedData, keyHex, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
})
return decrypted.toString(CryptoJS.enc.Utf8)
}
const R = (encryptedKey, privateKey) => {
const decrypt = new JSEncrypt()
decrypt.setPrivateKey(privateKey)
const decryptedKey = decrypt.decrypt(encryptedKey)
return decryptedKey
}
const res = await this.$get(this.api.encrypt)
const RE = A(R(res.encryptedKey, res.privateKey), res.encryptedData).split('/')
localStorage.setItem('osc', JSON.stringify(RE))
},
//
chooseUser (user) {
user.isEnable && this.$post(`${this.api.getToken}?id=${user.id}`).then(({ data }) => {

@ -1,28 +1,20 @@
<template>
<div ref="main"
class="main"
v-loading="loading">
<div ref="main" class="main" v-loading="loading">
<el-row :gutter="20">
<el-col :span="24">
<el-card shadow="hover"
class="mgb20">
<el-card shadow="hover" class="mgb20">
<div class="flex-between">
<el-page-header @back="back"
content="项目配置"></el-page-header>
<el-page-header @back="back" content="项目配置"></el-page-header>
<div v-if="!isDetail">
<el-button type="success"
:loading="submiting === 0"
@click="handleSubmit(0,projectManage.isOpen=1,projectManage.ztOpen = 1)">保存为草稿
<el-button type="success" :loading="submiting === 0"
@click="handleSubmit(0, projectManage.isOpen = 1, projectManage.ztOpen = 1)">保存为草稿
</el-button>
<el-button type="primary"
:loading="submiting === 1"
@click="handleSubmit(1)">确定并发布</el-button>
<el-button type="primary" :loading="submiting === 1" @click="handleSubmit(1)">确定并发布</el-button>
</div>
</div>
</el-card>
<el-card shadow="hover"
class="mgb20">
<el-card shadow="hover" class="mgb20">
<div class="flex-center mgb20">
<p class="addhr_tag"></p>
<span>课程信息</span>
@ -33,26 +25,18 @@
<el-form label-width="80px">
<div style="display: flex">
<el-form-item label="项目名称">
<el-input :disabled="isDetail"
v-model.trim="projectManage.projectName"
placeholder="20个字符以内"
<el-input :disabled="isDetail" v-model.trim="projectManage.projectName" placeholder="20个字符以内"
@blur="projectNameExistis"></el-input>
</el-form-item>
<el-form-item label="备注">
<el-input v-model.trim="projectManage.remark"
placeholder="20个字符以内"></el-input>
<el-input v-model.trim="projectManage.remark" placeholder="20个字符以内"></el-input>
</el-form-item>
<el-form-item label="项目用途">
<el-select :disabled="isDetail"
v-model="projectManage.permissions"
placeholder="请选择"
<el-select :disabled="isDetail" v-model="projectManage.permissions" placeholder="请选择"
@change="permissionChange">
<el-option label="练习"
:value="0"></el-option>
<el-option label="考核"
:value="1"></el-option>
<el-option label="竞赛"
:value="2"></el-option>
<el-option label="练习" :value="0"></el-option>
<el-option label="考核" :value="1"></el-option>
<el-option label="竞赛" :value="2"></el-option>
</el-select>
</el-form-item>
</div>
@ -60,8 +44,7 @@
</div>
</el-card>
<el-card shadow="hover"
class="mgb20">
<el-card shadow="hover" class="mgb20">
<div class="flex-center mgb20">
<p class="addhr_tag"></p>
<span>实验目标</span>
@ -70,20 +53,14 @@
<div>
<el-form label-width="0">
<el-form-item>
<quill :border="true"
:readonly="isDetail"
v-model="projectManage.experimentTarget"
:type.sync="projectManage.experimentTargetType"
radio
:minHeight="150"
:height="150" />
<quill :border="true" :readonly="isDetail" v-model="projectManage.experimentTarget"
:type.sync="projectManage.experimentTargetType" radio :minHeight="150" :height="150" />
</el-form-item>
</el-form>
</div>
</el-card>
<el-card shadow="hover"
class="mgb20">
<el-card shadow="hover" class="mgb20">
<div class="flex-center mgb20">
<p class="addhr_tag"></p>
<span>项目背景</span>
@ -92,30 +69,22 @@
<div>
<el-form label-width="0">
<el-form-item>
<quill :border="true"
:readonly="isDetail"
v-model="projectManage.experimentDescription"
:type.sync="projectManage.experimentDescriptionType"
radio
:minHeight="150"
:height="150"
<quill :border="true" :readonly="isDetail" v-model="projectManage.experimentDescription"
:type.sync="projectManage.experimentDescriptionType" radio :minHeight="150" :height="150"
:index="1" />
</el-form-item>
</el-form>
</div>
</el-card>
<el-card shadow="hover"
class="mgb20">
<el-card shadow="hover" class="mgb20">
<div class="flex-between mgb20">
<div class="flex-center">
<p class="addhr_tag"></p>
<span>实验任务</span>
</div>
<div>
<el-button :disabled="isDetail"
type="primary"
@click="toJudgePoint('home')">进入判分点
<el-button :disabled="isDetail" type="primary" @click="toJudgePoint('home')">进入判分点
</el-button>
</div>
</div>
@ -123,120 +92,67 @@
<div class="mgb20 flex-between">
<div class="flex-center">
<div class="m-r-20"
style="color: #f00">项目总分值100</div>
<div class="m-r-20" style="color: #f00">项目总分值100</div>
<!-- <div>权重&emsp;<div class="dib"><el-input></el-input></div></div> -->
</div>
<div>
<el-button :disabled="isDetail"
class="m-r-20"
type="text"
@click="avgDistributionScore">
<el-button :disabled="isDetail" class="m-r-20" type="text" @click="avgDistributionScore">
平均分配分值
</el-button>
<el-button :disabled="isDetail"
class="m-r-20"
type="text"
@click="manualDistributionScore">
<el-button :disabled="isDetail" class="m-r-20" type="text" @click="manualDistributionScore">
手动分配分值
</el-button>
<span>(待分配分值: {{ handDistributionScore }}/100)</span>
</div>
</div>
<el-button :disabled="isDetail"
type="primary"
icon="el-icon-plus"
round
@click="handleAddJudgment"
<el-button :disabled="isDetail" type="primary" icon="el-icon-plus" round @click="handleAddJudgment"
style="margin-bottom: 10px">判分点
</el-button>
<el-button :disabled="isDetail"
type="primary"
icon="el-icon-delete"
round
@click="batchDeleteProjectJudgment"
<el-button :disabled="isDetail" type="primary" icon="el-icon-delete" round @click="batchDeleteProjectJudgment"
style="margin-bottom: 10px">批量删除
</el-button>
<div class="draggable">
<u-table ref="projectJudgementTable"
:data="projectJudgmentData"
class="table"
stripe
header-align="center"
:use-virtual="isLc"
:max-height="600"
:row-height="60"
:border="false"
@selection-change="handleSelectionProjectJudgment"
row-key="judgmentId"
v-loading="listLoading">
<u-table-column type="selection"
width="55"
align="center"></u-table-column>
<u-table-column prop="sort"
label="序号"
width="80"
align="center">
<el-table ref="projectJudgementTable" :data="projectJudgmentData" class="table" stripe header-align="center"
:use-virtual="isLc" :max-height="600" :row-height="60" :border="false"
@selection-change="handleSelectionProjectJudgment" row-key="judgmentId" v-loading="listLoading">
<el-table-column type="selection" width="55" align="center"></el-table-column>
<el-table-column prop="sort" label="序号" width="80" align="center">
<template slot-scope="scope">
{{ scope.row.sort }}
</template>
</u-table-column>
<u-table-column prop="name"
label="判分指标"
align="center"
show-overflow-tooltip
min-width="140"></u-table-column>
<u-table-column prop="name"
label="判分点名称"
align="center"
show-overflow-tooltip
min-width="140"></u-table-column>
<u-table-column label="实验要求"
align="center"
width="600">
</el-table-column>
<el-table-column prop="name" label="判分指标" align="center" show-overflow-tooltip
min-width="140"></el-table-column>
<el-table-column prop="name" label="判分点名称" align="center" show-overflow-tooltip
min-width="140"></el-table-column>
<el-table-column label="实验要求" align="center" width="600">
<template slot-scope="scope">
<quill :readonly="true"
elseRead="true"
v-model="scope.row.experimentalRequirements"
:index="2" />
<quill :readonly="true" elseRead="true" v-model="scope.row.experimentalRequirements" :index="2" />
</template>
</u-table-column>
<u-table-column prop="score"
label="分数"
align="center"
width="120">
</el-table-column>
<el-table-column prop="score" label="分数" align="center" width="120">
<template slot-scope="scope">
<el-input :disabled="isDetail"
:key="scope.$index"
type="number"
step="0.1"
<el-input :disabled="isDetail" :key="scope.$index" type="number" step="0.1"
v-model.trim="scope.row.score"></el-input>
<!--
@input="scoreChange(scope.row, scope.$index)" -->
</template>
</u-table-column>
<u-table-column label="操作"
width="140"
align="center">
</el-table-column>
<el-table-column label="操作" width="140" align="center">
<template slot-scope="scope">
<el-button :disabled="isDetail"
type="text"
style="margin-right: 10px"
<el-button :disabled="isDetail" type="text" style="margin-right: 10px"
@click="toJudgePoint('edit', scope.row)">自定义</el-button>
<el-button :disabled="isDetail"
type="text"
@click="delJudgePoint(scope.$index)">
<el-button :disabled="isDetail" type="text" @click="delJudgePoint(scope.$index)">
删除
</el-button>
</template>
</u-table-column>
</u-table>
</el-table-column>
</el-table>
</div>
</el-card>
<el-card shadow="hover"
class="mgb20">
<el-card shadow="hover" class="mgb20">
<div class="flex-between mgb20">
<div class="flex-center">
<p class="addhr_tag"></p>
@ -244,25 +160,16 @@
</div>
<div>
启用
<el-switch :disabled="isDetail"
:active-value="0"
:inactive-value="1"
<el-switch :disabled="isDetail" :active-value="0" :inactive-value="1"
v-model="projectManage.hintOpen"></el-switch>
</div>
</div>
<div class="border-b-dashed"></div>
<div>
<el-form label-width="0">
<el-form-item prop="tips"
label="">
<quill :border="true"
:readonly="isDetail"
v-model="projectManage.experimentHint"
:type.sync="projectManage.experimentHintType"
radio
:minHeight="150"
:height="400"
:index="3" />
<el-form-item prop="tips" label="">
<quill :border="true" :readonly="isDetail" v-model="projectManage.experimentHint"
:type.sync="projectManage.experimentHintType" radio :minHeight="150" :height="400" :index="3" />
</el-form-item>
</el-form>
</div>
@ -271,62 +178,34 @@
</el-row>
<!--选择判分点对话框-->
<el-dialog title="添加判分点"
:visible.sync="dialogVisible"
width="40%"
:close-on-click-modal="false"
<el-dialog title="添加判分点" :visible.sync="dialogVisible" width="40%" :close-on-click-modal="false"
@close="closeJudgment">
<div class="text-right mgb10">
<div>
<el-input placeholder="请输入需要查找的判分点"
prefix-icon="el-icon-search"
v-model.trim="judgementpointsquery"
<el-input placeholder="请输入需要查找的判分点" prefix-icon="el-icon-search" v-model.trim="judgementpointsquery"
clearable></el-input>
</div>
</div>
<u-table v-loading="visibleLoading"
:data="judgementData"
ref="judgementTable"
class="table"
stripe
header-align="center"
use-virtual
:row-height="45"
:max-height="400"
:border="false"
@selection-change="handleSelectionJudgment"
:row-key="rowKey">
<u-table-column type="selection"
width="55"
align="center"
:reserve-selection="true"></u-table-column>
<u-table-column prop="id"
label="序号"
align="center"
width="100">
<el-table v-loading="visibleLoading" :data="judgementData" ref="judgementTable" class="table" stripe
header-align="center" use-virtual :row-height="45" :max-height="400" :border="false"
@selection-change="handleSelectionJudgment" :row-key="rowKey">
<el-table-column type="selection" width="55" align="center" :reserve-selection="true"></el-table-column>
<el-table-column prop="id" label="序号" align="center" width="100">
<template slot-scope="scope">
{{ scope.$index + 1 }}
</template>
</u-table-column>
<u-table-column prop="name"
label="判分点名称"
align="center"></u-table-column>
<u-table-column label="操作"
align="center"
width="100">
</el-table-column>
<el-table-column prop="name" label="判分点名称" align="center"></el-table-column>
<el-table-column label="操作" align="center" width="100">
<template slot-scope="scope">
<el-button size="mini"
@click="toJudgePoint('view', scope.row)">查看</el-button>
<el-button size="mini" @click="toJudgePoint('view', scope.row)">查看</el-button>
</template>
</u-table-column>
</u-table>
<div slot="footer"
class="dialog-footer">
</el-table-column>
</el-table>
<div slot="footer" class="dialog-footer">
<el-button @click="closeJudgment"> </el-button>
<el-button type="primary"
:loading="savingJud"
@click="saveJudgment"> </el-button>
<el-button type="primary" :loading="savingJud" @click="saveJudgment"> </el-button>
</div>
</el-dialog>
</div>
@ -440,6 +319,8 @@ export default {
if (this.$route.query.projectId) {
this.projectId = this.$route.query.projectId;
this.getInfoData();
} else {
this.rowDrop()
}
//
if (JSON.stringify(this.projectFields) != "{}") {
@ -447,7 +328,6 @@ export default {
this.projectManage = projectManage;
this.projectJudgmentData = projectJudgmentData;
}
this.rowDrop();
this.$refs.main.scrollTop = 0;
},
beforeDestroy () {
@ -482,6 +362,7 @@ export default {
this.$nextTick(() => {
this.updateTime = 0
this.$refs.main.scrollTop = 0;
this.rowDrop();
});
}).catch(err => {
this.loading = false
@ -785,24 +666,16 @@ export default {
//
rowDrop () {
//
const tbody = document.querySelector(".draggable .el-table__body-wrapper tbody");
const _this = this;
Sortable.create(tbody, {
const tbody = document.querySelector(".el-table__body tbody");
const that = this;
this.$refs.projectJudgementTable && Sortable.create(tbody, {
//
draggable: ".draggable .el-table__row",
onEnd ({ newIndex, oldIndex }) {
// : vue$nextTick
_this.projectJudgmentData.splice(newIndex, 0, _this.projectJudgmentData.splice(oldIndex, 1)[0]);
let newArray = _this.projectJudgmentData.slice(0);
_this.projectJudgmentData = [];
_this.$nextTick(function () {
newArray.forEach((e, i) => {
_this.$set(e, "sort", i + 1);//
_this.$set(e, "name", e.name + "?");
_this.$set(e, "name", e.name.slice(0, e.name.length - 1)); //
});
_this.projectJudgmentData = newArray;
});
// draggable: ".draggable .el-table__row",
onUpdate ({ newIndex, oldIndex }) {
console.log("🚀 ~ onEnd ~ newIndex, oldIndex:", newIndex, oldIndex)
if (newIndex == oldIndex) return false
const currentRow = that.projectJudgmentData.splice(oldIndex, 1)[0]
that.projectJudgmentData.splice(newIndex, 0, currentRow)
}
});
},
@ -915,6 +788,7 @@ export default {
padding: 0;
border-bottom: 0;
}
.main {
overflow: auto;
overflow-x: hidden;

Loading…
Cancel
Save