前端代码部分修改

feature/wy
王勇 1 month ago
parent ab46dd349a
commit 7e604b1cb6

@ -14,16 +14,26 @@ import store from '../../store'
*
* @see https://github.com/sendya/ant-design-pro-vue/pull/53
*/
/**
* 创建一个 Vue 自定义指令 'action'用于控制元素基于用户权限的显示
*/
const action = Vue.directive('action', {
inserted: function (el, binding, vnode) {
// 获取指令的参数,即动作名称
const actionName = binding.arg
// 从 Vuex store 中获取当前用户的角色信息
const roles = store.getters.roles
// 获取当前路由的权限配置
const elVal = vnode.context.$route.meta.permission
// 确保权限配置为数组形式
const permissionId = elVal instanceof String && [elVal] || elVal
// 遍历用户角色的权限列表
roles.permissions.forEach(p => {
// 如果当前权限ID不在元素的权限配置中直接返回
if (!permissionId.includes(p.permissionId)) {
return
}
// 如果当前权限有动作列表限制,且动作列表中不包含指令的参数,移除或隐藏元素
if (p.actionList && !p.actionList.includes(actionName)) {
el.parentNode && el.parentNode.removeChild(el) || (el.style.display = 'none')
}

@ -1,16 +1,20 @@
<template>
<!-- 主要用于渲染子路由组件 -->
<div>
<router-view />
</div>
</template>
<script>
/**
* 定义一个名为 BlankLayout Vue 组件
* 该组件用作空白布局通常用于需要一个干净的页面来进行特定的功能或展示
*/
export default {
name: 'BlankLayout'
}
</script>
<style scoped>
/* 此处添加特定于组件的样式,使用 scoped 属性确保样式仅在本组件内生效 */
</style>

@ -1,10 +1,16 @@
<template>
<!-- 根据路由元数据决定是否显示页面头部内容 -->
<div :style="!$route.meta.hiddenHeaderContent ? 'margin: -24px -24px 0px;' : null">
<!-- pageHeader , route meta :true on hide -->
<!-- 条件渲染页面头部组件 -->
<page-header v-if="!$route.meta.hiddenHeaderContent" :title="pageTitle" :logo="logo" :avatar="avatar">
<!-- 插槽用于自定义操作按钮 -->
<slot slot="action" name="action"></slot>
<!-- 插槽用于自定义头部内容 -->
<slot slot="content" name="headerContent"></slot>
<!-- 默认头部内容当没有自定义头部内容且存在描述时显示 -->
<div slot="content" v-if="!this.$slots.headerContent && description">
<!-- 显示链接列表 -->
<p style="font-size: 14px;color: rgba(0,0,0,.65)">{{ description }}</p>
<div class="link">
<template v-for="(link, index) in linkList">
@ -15,12 +21,15 @@
</template>
</div>
</div>
<!-- 插槽用于自定义额外内容 -->
<slot slot="extra" name="extra">
<div class="extra-img">
<img v-if="typeof extraImage !== 'undefined'" :src="extraImage"/>
</div>
</slot>
<!-- 页面菜单区域 -->
<div slot="pageMenu">
<!-- 条件渲染搜索框 -->
<div class="page-menu-search" v-if="search">
<a-input-search
style="width: 80%; max-width: 522px;"
@ -29,6 +38,7 @@
enterButton="搜索"
/>
</div>
<!-- 条件渲染标签页 -->
<div class="page-menu-tabs" v-if="tabs && tabs.items">
<!-- @change="callback" :activeKey="activeKey" -->
<a-tabs :tabBarStyle="{margin: 0}" :activeKey="tabs.active()" @change="tabs.callback">
@ -37,10 +47,13 @@
</div>
</div>
</page-header>
<!-- 主要内容区域 -->
<div class="content">
<!-- 插槽用于自定义页面内容 -->
<div class="page-header-index-wide">
<slot>
<!-- keep-alive -->
<!-- 条件渲染路由视图支持多页签 -->
<keep-alive v-if="multiTab">
<router-view ref="content" />
</keep-alive>
@ -96,15 +109,19 @@ export default {
this.getPageMeta()
},
methods: {
//
getPageMeta () {
// eslint-disable-next-line
// title
this.pageTitle = (typeof(this.title) === 'string' || !this.title) ? this.title : this.$route.meta.title
const content = this.$refs.content
if (content) {
if (content.pageMeta) {
// pageMeta
Object.assign(this, content.pageMeta)
} else {
//
this.description = content.description
this.linkList = content.linkList
this.extraImage = content.extraImage

@ -1,22 +1,32 @@
<script>
/**
* 定义一个名为 RouteView Vue 组件
* 该组件根据路由的 meta 信息和 store 中的 multiTab 状态决定是否缓存路由视图
*/
export default {
//
name: 'RouteView',
props: {
// true
keepAlive: {
type: Boolean,
default: true
}
},
//
data () {
return {}
},
//
render () {
// meta store getters
const { $route: { meta }, $store: { getters } } = this
const inKeep = (
<keep-alive>
<router-view />
</keep-alive>
)
//
const notKeep = (
<router-view />
)
@ -26,6 +36,7 @@ export default {
if (!getters.multiTab && meta.keepAlive === false) {
return notKeep
}
// keepAlive multiTab keepAlive
return this.keepAlive || getters.multiTab || meta.keepAlive ? inKeep : notKeep
}
}

@ -1,34 +1,39 @@
<template>
<!-- 用户布局模板根据设备类型调整样式 -->
<div id="userLayout" :class="['user-layout-wrapper', device]">
<div class="container">
<div class="top">
<div class="header">
<!-- 顶部标题和logo -->
<a href="/">
<img src="../assets/logo.svg" class="logo" alt="logo">
<span class="title">Online Exam</span>
</a>
</div>
<div class="desc">
<!-- 系统描述 -->
基于SpringBoot+Vue实现的在线考试系统
</div>
</div>
<!-- 路由视图用于显示子路由的内容 -->
<route-view></route-view>
<div class="footer">
<div class="links">
<!-- 底部链接 -->
<a href="https://github.com/19920625lsg/spring-boot-online-exam" target="_blank">代码仓</a>
<a href="https://19920625lsg.github.io" target="_blank">关于我</a>
<a href="mailto:liangshanguang2@gmail.com">联系我</a>
</div>
<div class="copyright">
<!-- 版权信息 -->
Copyright &copy; 2020 Liang Shan Guang
</div>
</div>
</div>
</div>
</template>
// RouteView
<script>
import RouteView from './RouteView'
import { mixinDevice } from '../utils/mixin'
@ -41,9 +46,11 @@ export default {
return {}
},
mounted () {
// bodyuserLayout
document.body.classList.add('userLayout')
},
beforeDestroy () {
// bodyuserLayout
document.body.classList.remove('userLayout')
}
}
@ -52,7 +59,7 @@ export default {
<style lang="less" scoped>
#userLayout.user-layout-wrapper {
height: 100%;
//
&.mobile {
.container {
.main {

@ -1,11 +1,14 @@
<template>
<!-- 使用 ExceptionPage 组件来显示 404 错误页面 -->
<exception-page type="404" />
</template>
<script>
// ../../componentsExceptionPage
import { ExceptionPage } from '../../components'
// components
export default {
//
components: {
ExceptionPage
}
@ -13,5 +16,5 @@ export default {
</script>
<style scoped>
/* 此处写入组件的样式scoped属性确保样式仅在本组件生效 */
</style>

@ -1,10 +1,12 @@
<template>
<!-- 使用 ExceptionPage 组件来显示 500 错误页面 -->
<exception-page type="500" />
</template>
<script>
// ExceptionPage
import { ExceptionPage } from '../../components'
// components ExceptionPage
export default {
components: {
ExceptionPage
@ -13,5 +15,5 @@ export default {
</script>
<style scoped>
>/* 此处添加组件的样式,由于没有样式内容,所以留空 */
</style>

@ -1,24 +1,35 @@
<template>
<!-- 头部区域 -->
<div class="banner-wrapper">
<!-- 标题区域 -->
<div class="banner-title-wrapper">
<!-- 标题线动画效果 -->
<div class="title-line-wrapper" style="opacity: 1; transform: translate(0px, 0px);">
<div class="title-line" style="transform: translateX(-64px);"></div>
</div>
<!-- 主标题 -->
<h1 class="" style="opacity: 1; transform: translate(0px, 0px);">Online Exam</h1>
<!-- 副标题 -->
<p style="opacity: 1; transform: translate(0px, 0px);">
<span>基于SpringBoot+Vue技术栈开发的在线考试系统</span>
</p>
<!-- 按钮区域 -->
<div class="button-wrapper">
<!-- 预览按钮链接到GitHub页面 -->
<a href="https://github.com/19920625lsg">
<a-button type="primary">预览</a-button>
</a>
<!-- 开始使用按钮点击后导航到文档页面 -->
<a @click="$router.push({ name: 'docs' })">
<a-button style="margin: 0 16px;">开始使用</a-button>
</a>
</div>
</div>
<!-- 图片轮播区域 -->
<div class="banner-image-wrapper" style="opacity: 1;">
<!-- 图片轮播组件设置自动播放和显示箭头 -->
<a-carousel arrows autoplay>
<!-- 动态生成轮播图片 -->
<div v-for="i in 5" :key="i">
<img :src="`/home/cover${i}.jpg`" style="height: 324px"/>
</div>
@ -28,11 +39,12 @@
</template>
<script>
// 'Banner'
export default {
name: 'Banner'
}
</script>
//
<style lang="less">
@import "home";
</style>

@ -1,6 +1,8 @@
<template>
<!-- 使用 v-for 遍历 dataSource 数组为每个列表生成一个 ul 元素 -->
<div>
<ul class="page1-box-wrapper" v-for="(list, index) in dataSource" :key="index">
<!-- 使用 v-for 遍历当前列表为每个项生成一个 listItem 组件 -->
<template v-for="item in list">
<list-item :item="item" :key="item.title"/>
</template>
@ -9,14 +11,18 @@
</template>
<script>
// ListItem
import ListItem from './ListItem'
// List Vue
export default {
name: 'List',
components: {
// ListItem
ListItem
},
props: {
// dataSource
dataSource: {
type: Array,
requited: true,
@ -26,6 +32,7 @@ export default {
}
},
watch: {
// dataSource
dataSource (val) {
console.log('dataSource::update', val)
}
@ -34,5 +41,5 @@ export default {
</script>
<style scoped>
/* 此处添加组件的样式,使用 scoped 属性限制样式仅在当前组件生效 */
</style>

@ -1,19 +1,28 @@
<template>
<!-- 使用 :key 动态绑定列表项的唯一键值以优化渲染性能 -->
<li :key="item.title">
<div class="page1-box">
<!-- 用于装饰或布局的 div可能包含一些样式或动画效果 -->
<div class="page1-point-wrapper"></div>
<!-- 使用 :style 动态绑定图片框的阴影颜色增强视觉效果 -->
<div class="page1-image" :style="{ boxShadow: `${item.shadowColor} 0px 6px 12px` }">
<!-- 动态加载图片资源 -->
<img :src="item.src" />
</div>
<!-- 显示列表项的标题 -->
<h3>{{ item.title }}</h3>
<!-- 显示列表项的内容 -->
<p>{{ item.content }}</p>
</div>
</li>
</template>
<script>
// Vue ListItem
export default {
//
name: 'ListItem',
// item
props: {
item: {
type: Object,

@ -1,17 +1,26 @@
<template>
<!-- HomePage的主布局 -->
<div class="home-page page1">
<!-- 内容包装器用于承载页面元素 -->
<div class="home-page-wrapper" id="page1-wrapper">
<!-- 背景文本通过样式进行位置调整 -->
<div class="page1-bg" style="transform: translate(0px, 200.953px);">Feature</div>
<!-- 主标题描述页面核心内容 -->
<h2>What can <span>Online System</span> do for you </h2>
<!-- 标题下装饰线 -->
<div class="title-line-wrapper page1-line"></div>
<!-- 使用List组件展示特性列表 -->
<list :data-source="features" />
</div>
</div>
</template>
<script>
// List
import List from './List'
//
const featuresCN = [
//
{
title: '优雅美观',
content: '基于 Ant Design 体系精心设计',
@ -19,6 +28,7 @@ const featuresCN = [
color: '#13C2C2',
shadowColor: 'rgba(19,194,194,.12)'
},
//
{
title: '常见设计模式',
content: '提炼自中后台应用的典型页面和场景',
@ -26,6 +36,7 @@ const featuresCN = [
color: '#2F54EB',
shadowColor: 'rgba(47,84,235,.12)'
},
//
{
title: '最新技术栈',
content: '使用 Vue/vuex/antd 等前端前沿技术开发',
@ -33,6 +44,7 @@ const featuresCN = [
color: '#F5222D',
shadowColor: 'rgba(245,34,45,.12)'
},
//
{
title: '响应式',
content: '针对不同屏幕大小设计',
@ -40,6 +52,7 @@ const featuresCN = [
color: '#1AC44D',
shadowColor: 'rgba(26,196,77,.12)'
},
//
{
title: '最佳实践',
content: '良好的工程实践助你持续产出高质量代码',
@ -47,6 +60,7 @@ const featuresCN = [
color: '#FA8C16',
shadowColor: 'rgba(250,140,22,.12)'
},
// UI
{
title: 'UI 测试',
content: '自动化测试保障前端产品质量',
@ -57,19 +71,25 @@ const featuresCN = [
]
export default {
//
name: 'Page1',
//
components: {
List
},
//
data () {
return {
features: featuresCN
}
},
//
created () {
this.updateFeatures()
},
//
methods: {
// 便
updateFeatures () {
const arr = featuresCN
const newArr = [[], [], []]

@ -1,7 +1,11 @@
<template>
<!-- 使用Ant Design的a-card组件作为外层容器设置无边框 -->
<a-card :bordered="false">
<!-- 定义操作按钮的工具栏区域 -->
<div id="toolbar">
<!-- 新建按钮类型为主要按钮primary带有加号图标点击时调用$refs.createQuestionModal.create()方法来触发新建操作 -->
<a-button type="primary" icon="plus" @click="$refs.createQuestionModal.create()"></a-button>&nbsp;
<!-- 全量刷新按钮类型为主要按钮primary带有刷新图标点击时调用loadAll()方法来重新加载所有题目数据 -->
<a-button type="primary" icon="reload" @click="loadAll()"></a-button>
</div>
<BootstrapTable
@ -12,8 +16,11 @@
/>
<!-- ref是为了方便用this.$refs.modal直接引用下同 -->
<step-by-step-question-modal ref="createQuestionModal" @ok="handleOk" />
<!-- 更新题目模态框 -->
<summernote-update-modal ref="questionUpdateModal" @ok="handleOk" />
<!-- 查看题目模态框 -->
<question-view-modal ref="modalView" @ok="handleOk" />
<!-- 编辑题目模态框 -->
<question-edit-modal ref="modalEdit" @ok="handleOk" />
</a-card>
</template>
@ -28,6 +35,15 @@ import SummernoteUpdateModal from '@views/list/modules/SummernoteUpdateModal'
import $ from 'jquery'
export default {
/**
* 名称QuestionTableList 组件
* 描述此组件用于显示问题表格列表并提供对问题进行详细操作的功能
* 组件包含
* - SummernoteUpdateModal: 用于更新问题描述的模态框
* - StepByStepQuestionModal: 用于逐步解答问题的模态框
* - QuestionViewModal: 用于查看问题详情的模态框
* - QuestionEditModal: 用于编辑问题的模态框
*/
name: 'QuestionTableList',
components: {
SummernoteUpdateModal,
@ -44,69 +60,113 @@ export default {
title: '序号',
field: 'serial',
formatter: function (value, row, index) {
//
// :
// value:
// row:
// index:
return index + 1 // 1
//
}
},
//
{
//
title: '题干',
//
field: 'name',
//
width: 200,
formatter: (value, row) => {
// HTMLdiv
return '<div class="question-name" style="height: 100%;width: 100%">' + value + '</div>'
},
//
events: {
'click .question-name': function (e, value, row, index) {
//
that.$refs.questionUpdateModal.edit('summernote-question-name-update', row, 'name', '更新题干', questionUpdate)
}
}
},
{
//
title: '解析',
//
field: 'description',
//
width: 200,
formatter: (value, row) => {
// question-descdiv
return '<div class="question-desc">' + value + '</div>'
},
//
events: {
// question-desc
'click .question-desc': function (e, value, row, index) {
that.$refs.questionUpdateModal.edit('summernote-question-desc-update', row, 'description', '更新题目解析', questionUpdate)
}
}
},
{
//
title: '分数',
//
field: 'score',
//
formatter: (value, row) => {
// div便
return '<div class="question-score">' + value + '</div>'
},
//
events: {
//
'click .question-score': function (e, value, row, index) {
// jQuery便使jQuery
const $element = $(e.target) // html
$element.html('<input type="text" value="' + value + '">')
}
}
},
{
/**
* 配置表格列标题和数据字段
*
* @param {String} title - 表格列的标题用于显示在表头
* @param {String} field - 表格列的数据字段用于绑定数据源中的属性
*/
title: '创建人',
field: 'creator'
},
{
//
title: '难度',
//
field: 'level',
formatter: (value, row) => {
//
// value:
// row:
return '<div class="question-level">' + value + '</div>'
},
events: {
'click .question-level': function (e, value, row, index) {
//
// e:
// value:
// row:
// index:
const $element = $(e.target) // html
if ($element.children().length > 0) return //
getQuestionSelection().then(res => {
//
console.log(res)
if (res.code === 0) {
console.log(res.data)
const levels = res.data.levels
let inner = '<select>'
for (let i = 0; i < levels.length; i++) {
//
if (levels[i].description === value) {
//
inner += '<option value ="' + levels[i].id + '" name="' + levels[i].name + '" selected="selected">' + levels[i].description + '</option>'
@ -117,6 +177,7 @@ export default {
inner += '</select>'
$element.html(inner)
} else {
//
that.$notification.error({
message: '获取问题下拉选项失败',
description: res.msg
@ -127,16 +188,27 @@ export default {
}
},
{
//
title: '题型',
//
field: 'type',
formatter: (value, row) => {
//
// value:
// row:
return '<div class="question-type">' + value + '</div>'
},
events: {
'click .question-type': function (e, value, row, index) {
//
// e:
// value:
// row:
// index:
const $element = $(e.target) // html
if ($element.children().length > 0) return //
getQuestionSelection().then(res => {
//
console.log(res)
if (res.code === 0) {
console.log(res.data)
@ -163,21 +235,27 @@ export default {
}
},
{
//
title: '学科',
//
field: 'category',
formatter: (value, row) => {
//
// HTML
return '<div class="question-category">' + value + '</div>'
},
events: {
'click .question-category': function (e, value, row, index) {
const $element = $(e.target) // html
if ($element.children().length > 0) return //
//
getQuestionSelection().then(res => {
console.log(res)
if (res.code === 0) {
console.log(res.data)
const categories = res.data.categories
let inner = '<select>'
// <option>
for (let i = 0; i < categories.length; i++) {
if (categories[i].name === value) { //
//
@ -189,6 +267,7 @@ export default {
inner += '</select>'
$element.html(inner)
} else {
//
that.$notification.error({
message: '获取问题下拉选项失败',
description: res.msg
@ -199,22 +278,32 @@ export default {
}
},
{
//
title: '更新时间',
//
field: 'updateTime'
},
{
//
title: '操作',
//
field: 'action',
//
align: 'center',
//
formatter: (value, row) => {
// HTML
return '<button type="button" class="btn btn-success view-question">详情</button>' +
'&nbsp;&nbsp;' +
'<button type="button" class="btn btn-success edit-question">编辑</button>'
},
//
events: {
//
'click .view-question': function (e, value, row, index) {
that.handleSub(row)
},
//
'click .edit-question': function (e, value, row, index) {
that.handleEdit(row)
}
@ -223,14 +312,20 @@ export default {
],
tableData: [], // bootstrap-table
// custom bootstrap-table
// bootstrap-table
options: {
//
search: true,
//
showColumns: true,
//
showExport: true,
//
pagination: true,
toolbar: '#toolbar',
//
advancedSearch: true,
//
idTable: 'advancedTable',
// http://www.itxst.com/bootstrap-table-events/tutorial.html
// onClickRow: that.clickRow,
@ -243,17 +338,35 @@ export default {
this.loadAll() //
},
methods: {
/**
* 编辑问题
* @param {Object} record - 问题记录
*/
handleEdit (record) {
this.$refs.modalEdit.edit(record)
},
handleSub (record) {
//
/**
* 查看问题
* @param {Object} record - 问题记录
*/
console.log(record)
this.$refs.modalView.edit(record)
},
/**
* 确认操作后重新加载数据
*/
handleOk () {
this.loadAll() //
},
/**
* 双击表格单元格进行编辑
* @param {String} field - 字段名
* @param {String} value - 字段值
* @param {Object} row - 行记录
* @param {Object} $element - DOM元素
*/
dblClickCell (field, value, row, $element) {
if (field === 'score') { //
const childrenInput = $element.children('.question-score').children('input') //
@ -274,18 +387,24 @@ export default {
}
if (field === 'level') { //
//
const childrenSelect = $element.children('.question-level').children('select') //
if (childrenSelect.length === 0) return
//
const optionSelected = $(childrenSelect[0]).find('option:selected')
// ID
row.levelId = optionSelected.val()
console.log(row.levelId)
// API
row.level = optionSelected.text()
//
console.log(row.level)
const that = this
questionUpdate(row).then(res => {
//
console.log(res)
if (res.code === 0) {
//
$element.children('.question-level').text(row.level)
that.$notification.success({
message: '更新成功',
@ -296,17 +415,24 @@ export default {
}
if (field === 'type') { //
//
const childrenSelect = $element.children('.question-type').children('select') //
if (childrenSelect.length === 0) return
//
const optionSelected = $(childrenSelect[0]).find('option:selected')
// rowtypeIdtype
row.typeId = optionSelected.val()
row.type = optionSelected.text()
// this便promise使
const that = this
// questionUpdate
questionUpdate(row).then(res => {
//
console.log(res)
if (res.code === 0) {
//
$element.children('.question-type').text(row.type)
//
that.$notification.success({
message: '更新成功',
description: '更新成功'
@ -316,18 +442,24 @@ export default {
}
if (field === 'category') { //
//
const childrenSelect = $element.children('.question-category').children('select') //
console.log(childrenSelect)
if (childrenSelect.length === 0) return
//
const optionSelected = $(childrenSelect[0]).find('option:selected')
// ID
row.categoryId = optionSelected.val()
row.category = optionSelected.text()
const that = this
// API
questionUpdate(row).then(res => {
//
console.log(res)
if (res.code === 0) {
//
$element.children('.question-category').text(row.category)
//
that.$notification.success({
message: '更新成功',
description: '更新成功'
@ -336,14 +468,24 @@ export default {
})
}
},
/**
* 加载所有问题数据
* 此方法通过调用后端API来获取所有问题的列表并将其用于更新表格数据
*/
loadAll () {
// 使this
const that = this
// API
getQuestionAll()
.then(res => {
//
if (res.code === 0) {
//
that.tableData = res.data
//
that.$refs.table._initTable()
} else {
//
that.$notification.error({
message: '获取全部问题的列表失败',
description: res.msg

@ -1,6 +1,9 @@
<!-- 问题编辑模态框组件 -->
<template>
<!-- 模态框主体 -->
<a-modal title="编辑题目" :width="640" :visible="visible" :confirmLoading="confirmLoading" @cancel="handleCancel">
<a-spin :spinning="confirmLoading">
<!-- 问题编辑表单 -->
<a-form :form="form">
<h3><b>题干</b></h3>
<div id="summernote-question-name-edit" />
@ -48,6 +51,7 @@
<div id="summernote-question-desc-edit" />
</a-form>
</a-spin>
<!-- 模态框底部按钮区域 -->
<template slot="footer">
<a-button key="cancel" @click="handleCancel"></a-button>
<a-button key="update" type="primary" @click="handleUpdate"></a-button>
@ -56,6 +60,7 @@
</template>
<script>
// API
import '../../../plugins/summernote'
import $ from 'jquery'
import { questionUpdate } from '../../../api/exam'
@ -65,10 +70,13 @@ export default {
name: 'QuestionEditModal',
data () {
return {
//
visible: false,
//
size: 'default',
//
confirmLoading: false,
//
form: this.$form.createForm(this),
//
question: {},
@ -85,7 +93,7 @@ export default {
desc: ''
}
},
//
updated () {
this.initSummernote('summernote-question-name-edit')
this.initSummernote('summernote-question-desc-edit')
@ -93,6 +101,7 @@ export default {
this.setSummernoteContent('summernote-question-desc-edit', this.desc)
},
methods: {
//
initSummernote (divId) {
console.log('初始化富文本插件:' + divId)
$('#' + divId).summernote({
@ -120,9 +129,11 @@ export default {
}
})
},
//
getSummernoteContent (divId) {
return $('#' + divId).summernote('code')
},
//
setSummernoteContent (divId, content) {
return $('#' + divId).summernote('code', content)
},
@ -166,7 +177,7 @@ export default {
}
console.log(`Selected: ${value}`)
},
//
handleMultiChange (values) {
console.log(values)
// id
@ -191,11 +202,11 @@ export default {
}
}
},
//
popupScroll () {
console.log('popupScroll')
},
//
handleUpdate () {
const that = this
that.question.name = that.getSummernoteContent('summernote-question-name-edit')

@ -1,24 +1,32 @@
<template>
<!-- 题目信息模态框 -->
<a-modal title="题目信息" :width="640" :visible="visible" :confirmLoading="confirmLoading" @cancel="handleCancel">
<!-- 加载状态 -->
<a-spin :spinning="confirmLoading">
<!-- 表单 -->
<a-form :form="form">
<!-- 题干 -->
<h3><b>题干</b></h3>
<div v-html="question.name"></div>
<br>
<!-- 选项 -->
<h3><b>选项</b></h3>
<ul>
<li v-for="option in question.options" :key="option.id" v-html="option.content"/>
</ul>
<br>
<!-- 答案 -->
<h3><b>答案</b></h3>
<ul>
<li v-for="option in question.options" :key="option.id" v-show="option.answer===true" v-html="option.content"/>
</ul>
<br>
<!-- 解析 -->
<h3><b>解析</b></h3>
<div v-html="question.description"></div>
</a-form>
</a-spin>
<!-- 模态框底部按钮 -->
<template slot="footer">
<a-button key="cancel" @click="handleCancel"></a-button>
</template>
@ -32,23 +40,28 @@ export default {
name: 'QuestionViewModal',
data () {
return {
//
visible: false,
//
confirmLoading: false,
//
form: this.$form.createForm(this),
//
question: {},
//
options: [],
//
answerOption: ''
}
},
methods: {
//
edit (record) {
this.visible = true
// data
this.question = record
},
//
handleCancel () {
// clear form & currentStep
this.visible = false

Loading…
Cancel
Save