赛事修改

fixLog
yujialong 1 year ago
parent 0c93095d1e
commit 90ed1f142d
  1. 2
      src/setting.js
  2. 38
      src/utils/editor.js
  3. 92
      src/views/match/add/set.vue
  4. 80
      src/views/match/add/step3.vue
  5. 4
      src/views/shop/addProduct/index.vue
  6. 336
      src/views/system/manageLog - 副本.vue

@ -10,7 +10,7 @@ let host = `${location.origin}/`
if (isDev) {
jumpPath = 'http://192.168.31.125:8087/' // 本地调试-需要启动本地判分点系统
host = 'http://121.37.12.51/'
// host = 'https://huorantech.cn/'
host = 'https://huorantech.cn/'
// host = 'http://192.168.31.152:9000/'// 榕
// host = 'http://192.168.31.51:9000/'// 赓
} else if (isPro) {

@ -315,10 +315,46 @@ export default {
powerpaste_allow_local_images: true,
powerpaste_word_import: 'clean',
powerpaste_html_import: 'clean',
extraPlugins: 'uploadimage',
imageUploadUrl: Api.fileUploadNakadai,
init_instance_callback: function (editor) {
editor.on('paste', (evt) => {
// 监听粘贴事件
// 实现图片粘贴上传
const items = (evt.clipboardData || window.clipboardData).items
if (items[0].type.indexOf('image') !== -1) {
const file = items[0].getAsFile()
const form = new FormData()
form.append('file', file)
// 自定义上传图片的方法
Axios({
method: 'post',
url: Api.fileUploadNakadai,
data: form,
headers: {
'Content-Type': 'multipart/form-data',
token: Util.local.get(Setting.tokenKey)
},
}).then(({ data }) => {
// 使用指令,在当前鼠标标光的位置插入元素
// img元素的src就是远程图片的链接地址
editor.execCommand(
"mceReplaceContent",
true,
`<img style="max-width:500px;" src="${data.filesResult.fileUrl}" >`
);
}).catch(res => {})
// 阻止默认事件,防止粘贴的图片进入富文本编辑器中
evt.preventDefault();
} else {
console.log('粘贴的不是图片,不能上传')
}
})
},
// 自定义上传
images_upload_handler: function (blobInfo, succFun, failFun) {
const form = new FormData()
form.append('file', blobInfo.blob()),
form.append('file', blobInfo.blob())
Axios({
method: 'post',
url: Api.fileUploadNakadai,

@ -1,19 +1,20 @@
<template>
<div>
<el-card shadow="hover" class="m-b-20">
<el-card shadow="hover"
class="m-b-20">
<div>
<p class="m-b-20">比赛名称</p>
{{ form.stageName }}
</div>
</el-card>
<el-card shadow="hover" class="m-b-20">
<el-card shadow="hover"
class="m-b-20">
<div>
<p class="m-b-20">比赛时间</p>
<div class="date-inputs">
起止时间
<div style="display: inline-flex;align-items: center;">
<el-date-picker
v-model="form.time"
<el-date-picker v-model="form.time"
type="datetimerange"
range-separator="~"
start-placeholder="开始日期"
@ -22,8 +23,7 @@
value-format="yyyy-MM-dd HH:mm:ss"
@change="timeChange">
</el-date-picker>
<el-alert
style="width: auto;padding: 4px 16px;margin-left: 10px;"
<el-alert style="width: auto;padding: 4px 16px;margin-left: 10px;"
:title="'(请设置在 ' + step1.playStartTime + ' ~ ' + step1.playEndTime + '间)'"
type="error"
:closable="false"
@ -33,50 +33,72 @@
</div>
</div>
</el-card>
<el-card shadow="hover" class="mgr20 m-b-20">
<el-card shadow="hover"
class="mgr20 m-b-20">
<div>
<p class="m-b-20">课程</p>
<div class="inline-input">
<el-select v-model="form.cid" @change="courseChange">
<el-option
v-for="item in curriculumList"
:key="item.cid"
:label="item.curriculumName"
:value="item.cid">
<el-select v-model="form.mallId"
@change="courseChange">
<el-option v-for="(item, i) in curriculumList"
:key="i"
:label="item.productName"
:value="item.mallId">
</el-option>
</el-select>
</div>
</div>
</el-card>
<el-card shadow="hover" class="m-b-20">
<el-card shadow="hover"
class="m-b-20">
<div class="flex-between m-b-20">
<span>实训项目</span>
<div style="display: inline-flex;">
<div>
<el-input placeholder="请输入项目名称" prefix-icon="el-icon-search" v-model.trim="keyword" clearable></el-input>
<el-input placeholder="请输入项目名称"
prefix-icon="el-icon-search"
v-model.trim="keyword"
clearable></el-input>
</div>
<el-button style="margin-left: 5px" type="primary" round @click="toProject">自定义实验项目</el-button>
<el-button style="margin-left: 5px"
type="primary"
round
@click="toProject">自定义实验项目</el-button>
</div>
</div>
<!-- 实训项目表格 -->
<el-table :data="projects" class="table" stripe header-align="center">
<el-table-column width="60" label="选择" align="center">
<el-table :data="projects"
class="table"
stripe
header-align="center">
<el-table-column width="60"
label="选择"
align="center">
<template slot-scope="scope">
<el-radio v-model="form.projectId" :label="scope.row.projectId">&nbsp;</el-radio>
<el-radio v-model="form.projectId"
:label="scope.row.projectId">&nbsp;</el-radio>
</template>
</el-table-column>
<el-table-column prop="projectName" label="项目名称" align="center"></el-table-column>
<el-table-column prop="auth" label="项目权限" align="center">
<el-table-column prop="projectName"
label="项目名称"
align="center"></el-table-column>
<el-table-column prop="auth"
label="项目权限"
align="center">
<template slot-scope="scope">
{{ permissionsKeys[scope.row.permissions] }}
</template>
</el-table-column>
<el-table-column prop="founder" label="创建人" align="center">
<el-table-column prop="founder"
label="创建人"
align="center">
<template slot-scope="scope">
{{ scope.row.founder ? '老师创建' : '系统内置' }}
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建时间" align="center"></el-table-column>
<el-table-column prop="createTime"
label="创建时间"
align="center"></el-table-column>
<!-- <el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button type="text" @click="showProject(scope.row)">查看</el-button>
@ -84,19 +106,18 @@
</el-table-column> -->
</el-table>
<div class="pagination">
<el-pagination
background
<el-pagination background
:page-size="pageSize"
@current-change="handleCurrentChange"
layout="total,prev, pager, next"
:total="total"
></el-pagination>
:total="total"></el-pagination>
</div>
</el-card>
<div style="text-align: center">
<el-button @click="back">返回</el-button>
<el-button type="primary" @click="save">保存</el-button>
<el-button type="primary"
@click="save">保存</el-button>
</div>
</div>
</template>
@ -142,16 +163,17 @@ export default {
//
getCourse () {
this.loadIns = Loading.service()
const sid = this.$store.state.dataPer.find(e => e.permissionName === '课程管理')
this.$post(this.api.curriculumList, {
isShelves: 1,
this.$post(this.api.listOfGoods, {
pageNum: 1,
pageSize: 10000,
supplierId: sid ? sid.supplierId : ''
hotTag: 1,
sort: 0,
isAssociatedProduct: 1,
}).then(({ page }) => {
const list = page.records
this.curriculumList = page.records
if (!this.form.cid && list.length) this.form.cid = list[0].cid
if (!this.form.mallId && list.length) this.form.mallId = list[0].mallId
this.courseChange()
}).catch(err => {
this.loadIns.close()
@ -159,8 +181,9 @@ export default {
},
//
courseChange (val) {
const { systemId } = this.curriculumList.find(e => e.cid == this.form.cid)
const { systemId, associatedProduct } = this.curriculumList.find(e => e.mallId == this.form.mallId)
this.sysId = systemId
this.form.cid = associatedProduct
if (val) this.loadIns = Loading.service()
this.getProject()
},
@ -252,5 +275,4 @@ export default {
</script>
<style scoped lang="scss">
</style>

@ -1,19 +1,29 @@
<template>
<div>
<div v-show="!setVisible" class="page">
<div v-show="!setVisible"
class="page">
<div class="page-content">
<div class="p-title">比赛内容设置</div>
<el-form label-width="170px" label-suffix=":" size="small" :disabled="!editing && id">
<div v-for="(item, i) in form" :key="i" class="step">
<el-form label-width="170px"
label-suffix=":"
size="small"
:disabled="!editing && id">
<div v-for="(item, i) in form"
:key="i"
class="step">
<div class="title">
<span>{{ item.stageName }}{{ nums[i] }}阶段 | {{ methods.find(e => e.id === item.method).name }} </span>
<el-button v-if="item.method !== 2" type="primary" @click="toSet(i)">设置</el-button>
<el-button v-if="item.method !== 2"
type="primary"
@click="toSet(i)">设置</el-button>
</div>
<el-form-item class="req" prop="time" label="比赛时间">
<el-form-item class="req"
prop="time"
label="比赛时间">
<span v-if="item.method !== 2 && item.startTime">{{ item.startTime + ' ' + item.endTime }}</span>
<div style="display: flex;align-items: center;" v-if="item.method === 2">
<el-date-picker
v-model="item.time"
<div style="display: flex;align-items: center;"
v-if="item.method === 2">
<el-date-picker v-model="item.time"
type="datetimerange"
range-separator="~"
start-placeholder="开始日期"
@ -22,8 +32,7 @@
value-format="yyyy-MM-dd HH:mm:ss"
@change="timeChange">
</el-date-picker>
<el-alert
style="width: auto;padding: 0px 16px;margin-left: 10px;"
<el-alert style="width: auto;padding: 0px 16px;margin-left: 10px;"
:title="'(请设置在 ' + step1.playStartTime + ' ~ ' + step1.playEndTime + '间)'"
type="error"
:closable="false"
@ -32,31 +41,53 @@
</div>
</el-form-item>
<template v-if="item.method === 2">
<el-form-item class="req" label="比赛地点">
<el-input v-model="item.offlineAddress" style="width: 80%"></el-input>
<el-form-item class="req"
label="比赛地点">
<el-input v-model="item.offlineAddress"
style="width: 80%"></el-input>
</el-form-item>
<el-form-item class="req" label="比赛内容">
<el-input v-model="item.contentDescription" type="textarea" style="width: 80%"></el-input>
<el-form-item class="req"
label="比赛内容">
<el-input v-model="item.contentDescription"
type="textarea"
style="width: 80%"></el-input>
</el-form-item>
<el-form-item class="req" label="评分规则">
<el-input v-model="item.scoreRule" type="textarea" style="width: 80%"></el-input>
<el-form-item class="req"
label="评分规则">
<el-input v-model="item.scoreRule"
type="textarea"
style="width: 80%"></el-input>
</el-form-item>
</template>
<template v-else>
<el-form-item class="req" prop="cid" label="课程系统">
<el-form-item class="req"
prop="cid"
label="课程系统">
{{ item.systemName }}
</el-form-item>
<el-form-item class="req" prop="assessmentId" label="已选择考核">
<el-form-item class="req"
prop="assessmentId"
label="已选择考核">
{{ item.projectName }}
</el-form-item>
<el-form-item class="req" prop="resultAnnouncementTime" label="比赛地点">
<el-form-item class="req"
prop="resultAnnouncementTime"
label="比赛地点">
<div class="line">
<el-checkbox v-model="item.onlineButton">线上</el-checkbox>
<el-input v-model="item.onlineAddress" clearable placeholder="请输入比赛网址" :disabled="!item.onlineButton" style="width: 400px;margin-left: 10px"></el-input>
<el-input v-model="item.onlineAddress"
clearable
placeholder="请输入比赛网址"
:disabled="!item.onlineButton"
style="width: 400px;margin-left: 10px"></el-input>
</div>
<div class="line">
<el-checkbox v-model="item.offlineButton">线下</el-checkbox>
<el-input v-model="item.offlineAddress" clearable placeholder="请输入地址" :disabled="!item.offlineButton" style="width: 400px;margin-left: 10px"></el-input>
<el-input v-model="item.offlineAddress"
clearable
placeholder="请输入地址"
:disabled="!item.offlineButton"
style="width: 400px;margin-left: 10px"></el-input>
</div>
</el-form-item>
</template>
@ -65,7 +96,10 @@
</div>
</div>
<set v-if="setVisible" :form.sync="form[curStep]" :step1.sync="step1" @hideSet="hideSet" />
<set v-if="setVisible"
:form.sync="form[curStep]"
:step1.sync="step1"
@hideSet="hideSet" />
</div>
</template>
@ -97,6 +131,7 @@ export default {
],
originForm: {
cid: '',
mallId: '',
contentDescription: '',
endTime: '',
scoreRule: '',
@ -150,6 +185,7 @@ export default {
} else {
form.time = []
}
if (!form.mallId) form.mallId = ''
form.offlineButton = !!form.offlineButton
form.onlineButton = !!form.onlineButton
form.method = e.method

@ -37,8 +37,8 @@
</div>
</el-form-item>
</el-col>
<!-- 关联产品选择了否才显示产品链接 -->
<el-col v-if="form.mall.isAssociatedProduct"
<!-- 关联产品选择了否或者产品分类是数据前瞻才显示产品链接 -->
<el-col v-if="form.mall.isAssociatedProduct || form.classificationIds == 5"
:span="14"
:offset="5">
<el-form-item label="产品链接">

@ -0,0 +1,336 @@
<template>
<div>
<el-card shadow="hover"
class="mgb20">
<div class="flex-between">
<div class="per_title"
v-preventReClick
@click="$router.back()">
<i class="el-icon-arrow-left"></i>
<span class="per_back">返回</span>
<span class="per_school">{{ platformName }}日志管理</span>
</div>
</div>
</el-card>
<div class="page">
<div class="inner">
<div class="tool">
<div class="filters">
<h6>日志更新</h6>
<div class="filter">
<label>版本查询</label>
<el-select v-model="versionName"
size="small"
placeholder="请选择版本"
filterable
@change="verChange">
<el-option v-for="item in vers"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
<div>
<el-button type="primary"
@click="add"
v-auth="'/system:日志更新:管理:新增日志'">新增日志</el-button>
</div>
</div>
<el-timeline class="timeline">
<el-timeline-item placement="top"
v-for="(item, i) in listData"
:key="i"
:class="['item' + i, {draft: item.draft}]">
<p class="sign">{{ item.draft ? '未发布' : item.draftTime }}</p>
<div class="ver">
<div>
{{ item.versionName + (item.draft ? '(草稿)' : '') }}
<span class="action">
<i class="el-icon-edit-outline"
@click="edit(item)"
v-auth="'/system:日志更新:管理:编辑日志'"></i>
<i class="el-icon-delete"
@click="del(item)"
v-auth="'/system:日志更新:管理:删除日志'"></i>
</span>
</div>
<div>
<template v-if="!i && item.withdrawNum !== 1 && item.draft !== 1">
<span class="withdraw"
v-if="item.withdraw && item.open">已撤回</span>
<el-button v-else
style="margin-right: 10px"
type="primary"
size="small"
@click="revoke(item)">撤销</el-button>
</template>
<el-switch v-model="item.open"
:active-value="0"
:inactive-value="1"
@change="switchOff($event, item)"
v-auth="'/system:日志更新:管理:开启日志'"></el-switch>
</div>
</div>
<ul class="detail">
<li v-for="(item, i) in item.logContents"
:key="i">
<p v-if="!isNaN(item.type)"
class="name"><img :src="require('@/assets/img/' + funcList.find(e => e.id === item.type).icon + '.png')"
alt=""> {{ funcList.find(e => e.id === item.type).name }}</p>
<div class="val">
<p class=""
v-for="(item, i) in item.content"
:key="i">{{ item }}</p>
</div>
</li>
</ul>
</el-timeline-item>
</el-timeline>
</div>
</div>
</div>
</template>
<script>
import Setting from '@/setting'
export default {
data () {
return {
platformId: this.$route.query.platformId,
platformName: '',
versionName: '',
vers: [],
listData: [],
funcList: [
{
id: 0,
name: '新功能',
icon: 'func'
},
{
id: 1,
name: '修复',
icon: 'bug'
},
{
id: 2,
name: '优化',
icon: 'optimize'
}
]
};
},
mounted () {
this.getData()
},
methods: {
//
getData () {
this.$get(`${this.api.platformLogList}?platformId=${this.platformId}&versionName=${this.versionName}`).then(res => {
const { logList } = res
this.listData = logList
if (logList.length) {
const vers = []
const platformName = Setting.platformList.find(e => e.id === logList[0].platformId).name
this.platformName = platformName
logList.map((e, i) => {
e.logContents.map(n => {
n.content = n.content.split('\n')
})
vers.push({
id: i,
name: e.versionName
})
})
this.vers = vers
}
}).catch(res => { })
},
//
add () {
if (this.listData.find(e => e.draft)) {
this.$confirm("当前有未发布的版本,是否要新增版本?", "提示", {
type: "warning"
}).then(() => {
this.$router.push(`/addLog?platformId=${this.platformId}`)
}).catch(() => { })
} else {
this.$router.push(`/addLog?platformId=${this.platformId}`)
}
},
//
edit (item) {
this.$router.push(`/addLog?platformId=${this.platformId}&id=${item.logId}&draft=${item.draft}`)
},
//
del (item) {
this.$confirm("确定要删除吗?", "提示", {
type: "warning"
}).then(() => {
this.$post(`${this.api.logDel}?logId=${item.logId}`).then(res => {
this.$message.success("删除成功")
this.getData()
}).catch(res => { })
}).catch(() => { })
},
//
revoke (item) {
this.$confirm("确定要撤销吗?", "提示", {
type: "warning"
}).then(() => {
this.$get(`${this.api.logWithdrawal}?platformId=${this.platformId}&logId=${item.logId}`).then(res => {
this.$message.success('撤销成功')
this.getData()
}).catch(res => { })
}).catch(() => { })
},
changeStatus (logId, open, draft) {
this.$post(this.api.listUpdate, {
logId,
open,
draft
}).then(res => {
this.$message.success(open ? '禁用成功' : '启用成功')
this.getData()
}).catch(res => { })
},
//
switchOff (val, row) {
const logId = row.logId
if (row.draft && !val) {
this.$confirm('是否要发布该日志?', '提示', {
type: 'success'
}).then(() => {
this.changeStatus(logId, val, 0)
}).catch(() => {
this.changeStatus(logId, val, 1)
})
} else {
this.changeStatus(logId, val, row.draft)
}
},
//
verChange (i) {
window.scrollTo({
top: document.querySelector(`.item${i}`).offsetTop,
behavior: 'smooth'
})
}
}
};
</script>
<style lang="scss" scoped>
.page {
min-height: calc(100vh - 300px);
padding: 24px 0;
.inner {
width: 900px;
margin: 0 auto;
}
}
.tool {
padding-bottom: 20px;
margin-bottom: 0;
border-bottom: 1px solid #f0f0f0;
}
.filters {
display: inline-flex;
align-items: center;
h6 {
margin-right: 100px;
font-size: 18px;
}
}
/deep/.timeline {
padding-left: 20%;
overflow: hidden;
.el-timeline-item__node--normal {
top: 30px;
}
.el-timeline-item__wrapper {
top: 15px;
padding-left: 40px;
}
.el-timeline-item__tail {
height: 250%;
border-left-width: 1px;
}
.sign {
position: relative;
display: inline-block;
margin-left: -22%;
font-size: 14px;
color: #9076ff;
}
.draft {
.ver,
.sign {
color: #b1b1b1;
}
}
.ver {
display: flex;
justify-content: space-between;
align-items: center;
padding-bottom: 10px;
margin: -19px 0 20px;
font-size: 18px;
color: #9076ff;
border-bottom: 1px dashed #bfbfbf;
}
.withdraw {
margin-right: 10px;
font-size: 13px;
color: #979797;
}
.action {
margin-left: 15px;
i {
margin-left: 8px;
font-size: 14px;
color: #9076ff;
cursor: pointer;
&:hover {
opacity: 0.9;
}
}
}
.detail {
li {
margin-bottom: 20px;
}
.name {
display: flex;
align-items: center;
margin-bottom: 5px;
font-size: 15px;
font-weight: 600;
img {
width: 20px;
margin-right: 5px;
}
}
.val {
font-size: 14px;
line-height: 1.8;
white-space: pre-wrap;
p {
position: relative;
color: #6a6a6a;
&:before {
content: '';
display: inline-block;
width: 5px;
height: 5px;
margin: 0 10px 0 5px;
vertical-align: middle;
border-radius: 20px;
background-color: #c5b8ff;
}
}
}
}
}
</style>
Loading…
Cancel
Save