Compare commits
46 Commits
393587848f
...
5808798b95
Author | SHA1 | Date |
---|---|---|
lyc | 5808798b95 | |
yangws | 57fb6b9c75 | |
小杨 | 1882fd0dae | |
yangws | 7f2cacffac | |
小杨 | e1caa441cb | |
zouyf | ca3f2658a7 | |
“zouyf” | cd1fc036a2 | |
zouyf | 727299aac9 | |
lyc | 27b0457eef | |
“zouyf” | 208f5d496f | |
“zouyf” | 122fb41690 | |
朱浩 | eb4a58b306 | |
朱浩 | a313a0e8b0 | |
“zouyf” | 630a7b4c50 | |
zhengdegang | 01dc5dc643 | |
zdg | 349bdbd181 | |
zdg | 8707b54420 | |
朱浩 | f08b5a8bee | |
朱浩 | e2255544da | |
zouyf | 748a3c4b86 | |
“zouyf” | c4c1115abb | |
zouyf | eefc4d75f8 | |
“zouyf” | db99dbf0d8 | |
“zouyf” | 3b6878ece5 | |
朱浩 | cbc6f21100 | |
朱浩 | cefc29df6a | |
朱浩 | cb3485f10f | |
朱浩 | cbb6a10c1d | |
zouyf | 95c93f19ee | |
“zouyf” | dcd1a3bb05 | |
“zouyf” | 5ac33bd1ca | |
yangws | dc36821366 | |
小杨 | 2641845ce0 | |
朱浩 | e1a12ff0e0 | |
“zouyf” | bd50a7cdf0 | |
“zouyf” | 94e609164a | |
朱浩 | 4fbd77c40c | |
baigl | dfe1a23327 | |
白了个白 | 437bff2cdd | |
白了个白 | 6a6d932852 | |
朱浩 | d3b5493810 | |
白了个白 | 2fd17df429 | |
lyc | fbf906f390 | |
朱浩 | 398de60dcd | |
zdg | 82091fbef5 | |
zdg | 76a14264d7 |
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "aix-win-ws",
|
"name": "aix-win-ws",
|
||||||
"version": "2.5.3",
|
"version": "2.5.4",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "./out/main/index.js",
|
"main": "./out/main/index.js",
|
||||||
"author": "上海交大重庆人工智能研究院",
|
"author": "上海交大重庆人工智能研究院",
|
||||||
|
|
|
@ -137,7 +137,7 @@ function createMainWindow() {
|
||||||
|
|
||||||
// mainWindow.setAlwaysOnTop(true, "screen-saver") // 将窗口设置为顶层窗口
|
// mainWindow.setAlwaysOnTop(true, "screen-saver") // 将窗口设置为顶层窗口
|
||||||
// mainWindow.setVisibleOnAllWorkspaces(true) // 如果窗口在所有工作区都可见
|
// mainWindow.setVisibleOnAllWorkspaces(true) // 如果窗口在所有工作区都可见
|
||||||
// mainWindow.maximize();
|
mainWindow.maximize();
|
||||||
// 第三步: 开启remote服务
|
// 第三步: 开启remote服务
|
||||||
remote.enable(mainWindow.webContents)
|
remote.enable(mainWindow.webContents)
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
http-equiv="Content-Security-Policy"
|
http-equiv="Content-Security-Policy"
|
||||||
content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:"
|
content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:"
|
||||||
/> -->
|
/> -->
|
||||||
<meta http-equiv="Content-Security-Policy" content="connect-src * blob: data:; default-src 'self'; script-src 'self' 'unsafe-eval' http://www.wiris.net; style-src 'self' 'unsafe-inline' http://www.wiris.net; media-src * blob:;img-src * 'self' data: blob:;font-src 'self' http://www.wiris.net;" />
|
<meta http-equiv="Content-Security-Policy" content="connect-src * blob: data:; default-src 'self'; script-src 'self' 'unsafe-eval' http://www.wiris.net 'unsafe-inline'; style-src 'self' 'unsafe-inline' http://www.wiris.net; media-src * blob:;img-src * 'self' data: blob:;font-src 'self' http://www.wiris.net;" />
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
|
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 700 B After Width: | Height: | Size: 700 B |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
@ -13,12 +13,12 @@
|
||||||
importPPTXFile(files)
|
importPPTXFile(files)
|
||||||
mainMenuVisible = false
|
mainMenuVisible = false
|
||||||
}">
|
}">
|
||||||
<PopoverMenuItem>导入 pptx 文件(测试版)</PopoverMenuItem>
|
<PopoverMenuItem>导入 pptx 文件</PopoverMenuItem>
|
||||||
</FileInput>
|
</FileInput>
|
||||||
<PopoverMenuItem @click="setDialogForExport('pptx')">导出文件</PopoverMenuItem>
|
<PopoverMenuItem @click="setDialogForExport('pptx')">导出文件</PopoverMenuItem>
|
||||||
<PopoverMenuItem @click="resetSlides(); mainMenuVisible = false">重置幻灯片</PopoverMenuItem>
|
<PopoverMenuItem @click="resetSlides(); mainMenuVisible = false">重置幻灯片</PopoverMenuItem>
|
||||||
<PopoverMenuItem @click="goLink('https://github.com/pipipi-pikachu/PPTist/issues')">意见反馈</PopoverMenuItem>
|
<!-- <PopoverMenuItem @click="goLink('https://github.com/pipipi-pikachu/PPTist/issues')">意见反馈</PopoverMenuItem> -->
|
||||||
<PopoverMenuItem @click="goLink('https://github.com/pipipi-pikachu/PPTist/blob/master/doc/Q&A.md')">常见问题</PopoverMenuItem>
|
<!-- <PopoverMenuItem @click="goLink('https://github.com/pipipi-pikachu/PPTist/blob/master/doc/Q&A.md')">常见问题</PopoverMenuItem> -->
|
||||||
<PopoverMenuItem @click="mainMenuVisible = false; hotkeyDrawerVisible = true">快捷操作</PopoverMenuItem>
|
<PopoverMenuItem @click="mainMenuVisible = false; hotkeyDrawerVisible = true">快捷操作</PopoverMenuItem>
|
||||||
</template>
|
</template>
|
||||||
<div class="menu-item"><IconHamburgerButton class="icon" /></div>
|
<div class="menu-item"><IconHamburgerButton class="icon" /></div>
|
||||||
|
|
|
@ -2,12 +2,21 @@
|
||||||
import request from '@/utils/request'
|
import request from '@/utils/request'
|
||||||
// 查询知识点列表
|
// 查询知识点列表
|
||||||
export function listKnowlegepoint(query) {
|
export function listKnowlegepoint(query) {
|
||||||
return request({
|
return request({
|
||||||
url: '/point/list',
|
url: '/point/list',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
params: query
|
params: query
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 查询知识点列表
|
||||||
|
export function listKnowlegepointFormat(query) {
|
||||||
|
return request({
|
||||||
|
url: '/point/formatList',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// 查询一级知识点查下级所有层级
|
// 查询一级知识点查下级所有层级
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: "iconfont"; /* Project id 4723712 */
|
font-family: "iconfont"; /* Project id 4723712 */
|
||||||
src: url('iconfont.woff2?t=1732173266977') format('woff2'),
|
src: url('iconfont.woff2?t=1732240267757') format('woff2'),
|
||||||
url('iconfont.woff?t=1732173266977') format('woff'),
|
url('iconfont.woff?t=1732240267757') format('woff'),
|
||||||
url('iconfont.ttf?t=1732173266977') format('truetype');
|
url('iconfont.ttf?t=1732240267757') format('truetype');
|
||||||
}
|
}
|
||||||
|
|
||||||
.iconfont {
|
.iconfont {
|
||||||
|
@ -13,6 +13,10 @@
|
||||||
-moz-osx-font-smoothing: grayscale;
|
-moz-osx-font-smoothing: grayscale;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.icon-shangchuan:before {
|
||||||
|
content: "\e61b";
|
||||||
|
}
|
||||||
|
|
||||||
.icon-jiqiren_o:before {
|
.icon-jiqiren_o:before {
|
||||||
content: "\eb62";
|
content: "\eb62";
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,13 @@
|
||||||
"css_prefix_text": "icon-",
|
"css_prefix_text": "icon-",
|
||||||
"description": "",
|
"description": "",
|
||||||
"glyphs": [
|
"glyphs": [
|
||||||
|
{
|
||||||
|
"icon_id": "4942656",
|
||||||
|
"name": "上传",
|
||||||
|
"font_class": "shangchuan",
|
||||||
|
"unicode": "e61b",
|
||||||
|
"unicode_decimal": 58907
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"icon_id": "5387814",
|
"icon_id": "5387814",
|
||||||
"name": "机器人_o",
|
"name": "机器人_o",
|
||||||
|
|
|
@ -0,0 +1,65 @@
|
||||||
|
<template>
|
||||||
|
<div id="aptContainer"></div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
modelValue:[Object,String], // json数据
|
||||||
|
width: { // 宽度
|
||||||
|
type: Number,
|
||||||
|
default: 0
|
||||||
|
},
|
||||||
|
height: { // 高度
|
||||||
|
type: Number,
|
||||||
|
default: 0
|
||||||
|
},
|
||||||
|
domId: { // 渲染元素ID
|
||||||
|
type: String,
|
||||||
|
default: 'aptContainer'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
description: 'apt预览组件-konva',
|
||||||
|
// konva相关对象 舞台 图层
|
||||||
|
konvaStage:null, konvaLayer:null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() { // 页面渲染完
|
||||||
|
this.initKonva()
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
modelValue: {
|
||||||
|
immediate: true, // 初始是否触发
|
||||||
|
handler(v) { // 参数1新值,参数2 旧值
|
||||||
|
!!v && this.loadJson()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
// 初始化Konva
|
||||||
|
initKonva() {
|
||||||
|
if(!this.width || !this.height) return false // 没有默认宽度高度直接使用数据中的
|
||||||
|
this.konvaStage = new Konva.Stage({
|
||||||
|
container: "aptContainer", // id of container <div>
|
||||||
|
width: this.width,
|
||||||
|
height: this.height,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
// 加载数据
|
||||||
|
loadJson(data = this.modelValue) {
|
||||||
|
if (!data) return false
|
||||||
|
this.konvaStage = Konva.Node.create(data, this.domId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.aptContainer{
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,27 @@
|
||||||
|
<template>
|
||||||
|
<el-link :href="href" target="_blank" type="primary">
|
||||||
|
<slot name="content">{{content}}</slot>
|
||||||
|
</el-link>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
href: { // 跳转地址
|
||||||
|
type: String,
|
||||||
|
default: 'https://beian.miit.gov.cn'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
description: '备案号-添加',
|
||||||
|
content: '备案号:苏ICP备2024097972号-1'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="less" scoped>
|
||||||
|
|
||||||
|
</style>
|
|
@ -1,6 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<!-- 表单-组件(自定义) -->
|
<!-- 表单-组件(自定义) -->
|
||||||
<slot>
|
|
||||||
<el-row v-bind="rows||{}">
|
<el-row v-bind="rows||{}">
|
||||||
<!-- 其他内容-start -->
|
<!-- 其他内容-start -->
|
||||||
<slot name="start"></slot>
|
<slot name="start"></slot>
|
||||||
|
@ -80,7 +79,6 @@
|
||||||
<!-- 其他内容-end -->
|
<!-- 其他内容-end -->
|
||||||
<slot name="end"></slot>
|
<slot name="end"></slot>
|
||||||
</el-row>
|
</el-row>
|
||||||
</slot>
|
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
export default {
|
export default {
|
||||||
|
@ -161,7 +159,9 @@ export default {
|
||||||
// 确定--提交
|
// 确定--提交
|
||||||
confirm() {
|
confirm() {
|
||||||
const formRefs = this.$refs.form
|
const formRefs = this.$refs.form
|
||||||
|
const isBool = this.$attrs.confirm && typeof this.$attrs.confirm === 'function'
|
||||||
this.$emit('confirm', formRefs)
|
this.$emit('confirm', formRefs)
|
||||||
|
if (isBool) this.$attrs.confirm(formRefs)
|
||||||
},
|
},
|
||||||
// 重置
|
// 重置
|
||||||
resetFields() {
|
resetFields() {
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<el-pagination v-bind="pageOpt"
|
||||||
|
@change="(...agrs) => $emit('pageChange',...agrs)"
|
||||||
|
v-model:current-page="curPage" v-model:page-size="limit" />
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
// 功能说明:自定义-分页器
|
||||||
|
export default {
|
||||||
|
name: 'cPage',
|
||||||
|
props: {
|
||||||
|
page: { type: Object, required: true },
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
def: {
|
||||||
|
// size: 'small',
|
||||||
|
background: false,
|
||||||
|
pageSizes: [10, 20, 30, 40, 50, 100],
|
||||||
|
layout: 'total, sizes, prev, pager, next',
|
||||||
|
// layout: 'total, sizes, prev, pager, next, jumper',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
pageOpt() {
|
||||||
|
return Object.assign({},this.def, this.page)
|
||||||
|
},
|
||||||
|
curPage: {
|
||||||
|
get() { return this.page.curPage },
|
||||||
|
set(val) { this.page.curPage = val }
|
||||||
|
},
|
||||||
|
limit: {
|
||||||
|
get() { return this.page.limit },
|
||||||
|
set(val) { this.page.limit = val }
|
||||||
|
},
|
||||||
|
},
|
||||||
|
created() {},
|
||||||
|
methods: {}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
|
||||||
|
</style>
|
|
@ -0,0 +1,280 @@
|
||||||
|
<template>
|
||||||
|
<!-- 组件 -->
|
||||||
|
<div>
|
||||||
|
<slot name="top">
|
||||||
|
<div class="c-search" :hide="!isFold||isDef" v-if="fItems.length" :style="$attrs.style">
|
||||||
|
<transition name="el-zoom-in-top">
|
||||||
|
<c-form v-show="isFold" ref="search" v-if="!noSearch && search" :form="search"
|
||||||
|
:itemOption="fItems" :option="fOption" :onEnter="fOnEnter" :rows="fRows" :cols="fCols">
|
||||||
|
<template v-for="item in formSlots" #[item]="data">
|
||||||
|
<slot :name="`f${item}`" v-bind="data"></slot>
|
||||||
|
</template>
|
||||||
|
<template #append>
|
||||||
|
<slot name="topAdd" v-if="$slots.topAdd"></slot>
|
||||||
|
<slot name="search" v-if="!$attrs.searchBtnNe">
|
||||||
|
<el-col style="text-align: center;margin: 5px 0 15px;">
|
||||||
|
<el-button icon="Search" type="primary" @click="$emit('change','query')">查询</el-button>
|
||||||
|
<el-button type="warning" @click="$emit('change','reset')">重置</el-button>
|
||||||
|
</el-col>
|
||||||
|
</slot>
|
||||||
|
</template>
|
||||||
|
</c-form>
|
||||||
|
</transition>
|
||||||
|
<div v-if="!isDef" :class="['fold',{hide:!isFold}]" @click="isFold=!isFold">
|
||||||
|
<!-- <i :class="'el-icon-arrow-' + (isFold?'down':'up')"></i> -->
|
||||||
|
<el-icon><component :is="isFold?'ArrowUp':'ArrowDown'"></component></el-icon>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</slot>
|
||||||
|
<slot name="start"></slot>
|
||||||
|
<div :class="['m-list',{'ne':!isMain, hide:!isFold}]">
|
||||||
|
<slot name="tStart"></slot>
|
||||||
|
<el-table ref="table" v-bind="tAttrs" v-on="tOns">
|
||||||
|
<template #empty><slot name="empty">{{emptyText}}</slot></template>
|
||||||
|
<template #append><slot name="append"></slot></template>
|
||||||
|
<slot>
|
||||||
|
<template v-for="(item, index) in optionItems" :key="index">
|
||||||
|
<el-table-column v-bind="item">
|
||||||
|
<!-- 列-表头-自定义 -->
|
||||||
|
<template #header="{column, $index}">
|
||||||
|
<slot :name="item.prop+'_header'" :column="column" :$index="$index">
|
||||||
|
<slot name="header" :column="column" :$index="$index">{{ item.label }}</slot>
|
||||||
|
</slot>
|
||||||
|
</template>
|
||||||
|
<!-- 列内容-自定义 -->
|
||||||
|
<template #default="{row, column, $index}" v-if="item.type!='selection'">
|
||||||
|
<slot :name="item.prop" :row="row" :column="column" :$index="$index" :value="row[item.prop]">
|
||||||
|
<span v-if="item.attrs" v-bind="item.attrs">{{ defVal(row,item, $index, $attrs, column) }}</span>
|
||||||
|
<slot v-else :row="row" :column="column" :$index="$index" :value="row[item.prop]">{{ defVal(row,item, $index, $attrs, column) }}</slot>
|
||||||
|
</slot>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</template>
|
||||||
|
</slot>
|
||||||
|
</el-table>
|
||||||
|
<slot name="end"></slot>
|
||||||
|
<slot name="page">
|
||||||
|
<c-page v-if="!noPage" :page="page" v-on="$attrs" class="c-page" border="false"></c-page>
|
||||||
|
</slot>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import cForm from './cForm.vue'
|
||||||
|
export default {
|
||||||
|
// inheritAttrs: false,
|
||||||
|
components: { cForm },
|
||||||
|
name: 'cTable',
|
||||||
|
props: {
|
||||||
|
option: Array, // 列配置
|
||||||
|
search: Object, // 搜索
|
||||||
|
fItems: { // 搜索字段配置
|
||||||
|
type: Array,
|
||||||
|
default: () => []
|
||||||
|
},
|
||||||
|
fOption: { // 搜索-表单配置
|
||||||
|
type: Object,
|
||||||
|
default: () => ({ labelW: '80px' })
|
||||||
|
// default: () => ({ inline: true, labelW: '80px', size: 'small' })
|
||||||
|
},
|
||||||
|
fOnEnter: Function, // 搜索--回车事件-公共
|
||||||
|
fRows: { // 搜索-行
|
||||||
|
type: Object,
|
||||||
|
default: _ => ({ gutter: 20 })
|
||||||
|
},
|
||||||
|
fCols: { // 搜索-非内联 inline
|
||||||
|
type: Object,
|
||||||
|
default: _ => ({ span: 8, xs: 24, sm: 12, md: 8, lg: 6 })
|
||||||
|
},
|
||||||
|
emptyText: {
|
||||||
|
type: String,
|
||||||
|
default: '暂无数据'
|
||||||
|
},
|
||||||
|
isDef: { // 默认样式-无美化
|
||||||
|
type: Boolean,
|
||||||
|
default: true
|
||||||
|
},
|
||||||
|
isMain: { // 间距
|
||||||
|
type: Boolean,
|
||||||
|
default: true
|
||||||
|
},
|
||||||
|
fold: { // 是否打开搜索
|
||||||
|
type: Boolean,
|
||||||
|
default: true
|
||||||
|
},
|
||||||
|
data: Object, // 数据
|
||||||
|
page: Object, // 分页
|
||||||
|
noSearch: Boolean, // 关闭搜索
|
||||||
|
noPage: Boolean, // 关闭分页
|
||||||
|
noDef: Boolean, // 取消默认配置
|
||||||
|
isMaxHeight: Boolean, // 是否最大高度
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
// 搜索-插槽 打开搜索
|
||||||
|
formSlots: [], isFold: this.fold, height: null,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
optionItems() { // 默认列
|
||||||
|
const list = this.option || []
|
||||||
|
return list.map(o => {
|
||||||
|
const def = { align: 'center', showOverflowTooltip: true }
|
||||||
|
if (o.width && o.showOverflowTooltip == undefined){
|
||||||
|
o.showOverflowTooltip = true // 设置宽度时,内容超出默认隐藏
|
||||||
|
}
|
||||||
|
return this.noDef ? o : Object.assign(def, o)
|
||||||
|
})
|
||||||
|
.filter(o => o.show ?? true) // 过滤掉隐藏的-show
|
||||||
|
.filter(o => o.visible ?? true) // 过滤掉隐藏的-visible
|
||||||
|
},
|
||||||
|
tAttrs() { // $attrs 过滤掉其他属性
|
||||||
|
const attrs = {...this.$attrs}
|
||||||
|
Object.keys(attrs).forEach(key => {
|
||||||
|
// 空值过滤掉
|
||||||
|
if (!attrs[key]??null) delete attrs[key]
|
||||||
|
// 分页相关属性 过滤掉
|
||||||
|
else if (/^page.*/.test(key)) delete attrs[key]
|
||||||
|
})
|
||||||
|
// 其他属性处理 如 'style', 'class', 't-style', 't-class'
|
||||||
|
const tArr = Object.keys(attrs).filter(k => k.startsWith('t-'))
|
||||||
|
if (tArr.length) tArr.forEach(k => attrs[k.slice(2)] = attrs[k])
|
||||||
|
else ['style', 'class'].forEach(k => delete attrs[k])
|
||||||
|
// 高度处理
|
||||||
|
const hArrs = ['height', 'max-height', 'maxHeight']
|
||||||
|
const isH = Object.keys(attrs).some(k => hArrs.includes(k))
|
||||||
|
// 默认高度 默认设置最大高度
|
||||||
|
if (!isH) attrs[this.isMaxHeight?'max-height':'height'] = 500
|
||||||
|
// 设置数据
|
||||||
|
if (this.data) attrs.data = this.data
|
||||||
|
return attrs
|
||||||
|
},
|
||||||
|
tOns() { // $on 过滤掉其他属性
|
||||||
|
const attrs = {...this.$attrs}
|
||||||
|
return Object.keys(attrs).reduce((p, c, a ) => {
|
||||||
|
if(typeof attrs[c]=='function')p[c]=attrs[c]; return p
|
||||||
|
}, {})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {},
|
||||||
|
mounted() {
|
||||||
|
this.getFormSlots()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
// 获取插槽名-搜索-插槽
|
||||||
|
getFormSlots() {
|
||||||
|
const props = this.fItems.map(o => o.prop)
|
||||||
|
const keys = Object.keys(this.$slots)
|
||||||
|
this.formSlots = keys.filter(k => {
|
||||||
|
const isForm = /^f.*/.test(k) // 是否为搜索插槽
|
||||||
|
const isProp = props.some(p => k.endsWith(p)) // 该配置是否在配置中存在-不存在过滤掉
|
||||||
|
return isForm && isProp
|
||||||
|
}).map(k => k.replace(/^f/, '')) // 返回表单内部自定义插槽名
|
||||||
|
},
|
||||||
|
// 默认值处理
|
||||||
|
defVal(row, item, rowInd, attr, column) {
|
||||||
|
switch (item.type) {
|
||||||
|
case 'index': { // 默认-ind
|
||||||
|
const { curPage, limit, offset } = attr.page || attr
|
||||||
|
const start = offset || (curPage - 1) * limit || 0
|
||||||
|
return rowInd + 1 + start
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return item.format ? item.format(row[item.prop], row, column, rowInd) : row[item.prop]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
// @import '~@/assets/styles/cmixin';
|
||||||
|
// $w 宽| $h 高| $bg 背景| $tBr 块圆角度 $tBg 块背景
|
||||||
|
@mixin scrollBar($w:8px,$h:8px,$tBr:20px,
|
||||||
|
$bg:#d3dce6,$tBg:#99a9bf, $tHbg: #409eff) {
|
||||||
|
|
||||||
|
&::-webkit-scrollbar-track-piece {
|
||||||
|
background: $bg;
|
||||||
|
}
|
||||||
|
&::-webkit-scrollbar {
|
||||||
|
width: $w;
|
||||||
|
height: $h;
|
||||||
|
}
|
||||||
|
&::-webkit-scrollbar-thumb {
|
||||||
|
background: $tBg;
|
||||||
|
border-radius: $tBr;
|
||||||
|
@if $tHbg {
|
||||||
|
&:hover{
|
||||||
|
background: $tHbg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-table){
|
||||||
|
|
||||||
|
.el-table__expand-column{
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.el-table__body-wrapper{
|
||||||
|
@include scrollBar;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// css调整
|
||||||
|
.c-search{
|
||||||
|
--bg: #fff;
|
||||||
|
padding-top: 10px;
|
||||||
|
// padding: 20px 20px 0;
|
||||||
|
background: var(--bg);
|
||||||
|
margin-bottom: 30px;
|
||||||
|
border-radius: 4px;
|
||||||
|
&[hide=true]{
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
.fold{
|
||||||
|
--box-color: rgba(24,144,255,0.2);
|
||||||
|
--box-hover-color: rgba(24,144,255,0.6);
|
||||||
|
width: 100px;
|
||||||
|
height: 20px;
|
||||||
|
cursor: pointer;
|
||||||
|
display: inline-block;
|
||||||
|
text-align: center;
|
||||||
|
position: absolute;
|
||||||
|
background: var(--bg);
|
||||||
|
border-radius: 0 0 50px 50px;
|
||||||
|
left: 50%;
|
||||||
|
transform: translate(-50%,5px);
|
||||||
|
box-shadow: 0px 3px 3px var(--box-color);
|
||||||
|
i{font-size: inherit;}
|
||||||
|
&:hover{
|
||||||
|
box-shadow: 0px 3px 3px var(--box-hover-color);
|
||||||
|
i{color: #1890ff;}
|
||||||
|
}
|
||||||
|
&.hide{
|
||||||
|
top: 12px;
|
||||||
|
border-radius: 50px 50px 0 0;
|
||||||
|
box-shadow: 0 -3px 3px var(--box-color);
|
||||||
|
&:hover{box-shadow: 0 -3px 3px var(--box-hover-color);}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
:deep(.el-form){
|
||||||
|
.el-form-item{
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 改样式
|
||||||
|
.m-list{
|
||||||
|
padding: 20px;
|
||||||
|
border-radius: 4px;
|
||||||
|
&.ne{padding: 0;}
|
||||||
|
&.hide{
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.c-page{
|
||||||
|
background: #fff;
|
||||||
|
margin-top: 10px;
|
||||||
|
justify-content: flex-end;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -71,4 +71,9 @@ defineExpose({
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:deep(.format-work-desc > :is(div):first-child){
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
|
@ -103,7 +103,7 @@ const getCompletion = async (val) => {
|
||||||
type: 'robot',
|
type: 'robot',
|
||||||
msg: answer,
|
msg: answer,
|
||||||
})
|
})
|
||||||
|
|
||||||
} finally {
|
} finally {
|
||||||
loaded.value = false
|
loaded.value = false
|
||||||
}
|
}
|
||||||
|
@ -121,11 +121,11 @@ onMounted(() => {
|
||||||
let data = sessionStore.get('subject.curNode')
|
let data = sessionStore.get('subject.curNode')
|
||||||
|
|
||||||
Object.assign(curNode, data);
|
Object.assign(curNode, data);
|
||||||
let text = props.modeType == 1 ? '课标': props.modeType == 2 ? '教材' : '考试'
|
let text = props.modeType == 1||props.modeType == 2 ? '课标' : '考试'
|
||||||
|
|
||||||
let jsonKey = `${text}-${data.edustage}-${data.edusubject}`
|
let jsonKey = `${text}-${data.edustage}-${data.edusubject}`
|
||||||
|
console.log(jsonKey)
|
||||||
params.dataset_id = dataSetJson[jsonKey]
|
params.dataset_id = dataSetJson[jsonKey]
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
@ -156,7 +156,7 @@ onMounted(() => {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|
||||||
}
|
}
|
||||||
.chart-item {
|
.chart-item {
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
|
@ -261,4 +261,4 @@ onMounted(() => {
|
||||||
transform: scale(0.01);
|
transform: scale(0.01);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -187,10 +187,10 @@ const init = reactive({
|
||||||
min_height: props.minHeight,
|
min_height: props.minHeight,
|
||||||
draggable_modal: true,
|
draggable_modal: true,
|
||||||
extended_valid_elements: '*[.*]',
|
extended_valid_elements: '*[.*]',
|
||||||
external_plugins: {
|
// external_plugins: {
|
||||||
tiny_mce_wiris: `/tinymce/tool/@wiris/mathtype-tinymce6/plugin.min.js`,
|
// tiny_mce_wiris: getStaticUrl('/tinymce/tool/wiris/mathtype-tinymce6/plugin.min.js'),
|
||||||
//tiny_mce_wiris: `https://www.wiris.net/demo/plugins/tiny_mce/plugin.js`,
|
// //tiny_mce_wiris: `https://www.wiris.net/demo/plugins/tiny_mce/plugin.js`,
|
||||||
},
|
// },
|
||||||
|
|
||||||
// setup: function (editor) {
|
// setup: function (editor) {
|
||||||
// },
|
// },
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
:style="type == 'design' ? ['top: 10px', 'justify-content: space-between'] : ['bottom: 10px', 'justify-content: center']">
|
:style="type == 'design' ? ['top: 10px', 'justify-content: space-between'] : ['bottom: 10px', 'justify-content: center']">
|
||||||
<div class="left">
|
<div class="left">
|
||||||
<!-- 前进回退 -->
|
<!-- 前进回退 -->
|
||||||
<div class="blockBox" v-if="!readonly && width >= 1000">
|
<div class="blockBox" v-if="!readonly && (width >= 1000 || width==='100%')">
|
||||||
<el-tooltip effect="light" content="回退" placement="top">
|
<el-tooltip effect="light" content="回退" placement="top">
|
||||||
<el-button :icon="RefreshLeft" circle :disabled="!canUndo" @click="undo" />
|
<el-button :icon="RefreshLeft" circle :disabled="!canUndo" @click="undo" />
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
|
@ -15,7 +15,7 @@
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
</div>
|
</div>
|
||||||
<div class="blockBox">
|
<div class="blockBox">
|
||||||
<el-button @click="currentType = 'selection'"><el-image src="/src/assets/images/mouse-pointer.png"
|
<el-button @click="currentType = 'selection'"><el-image src="../../../src/assets/images/mouse-pointer.png"
|
||||||
style="width: 14px; height: 14px; color: silver" /></el-button>
|
style="width: 14px; height: 14px; color: silver" /></el-button>
|
||||||
</div>
|
</div>
|
||||||
<template v-if="type == 'design'">
|
<template v-if="type == 'design'">
|
||||||
|
@ -123,7 +123,7 @@
|
||||||
<!-- 边框样式 -->
|
<!-- 边框样式 -->
|
||||||
<div class="blockBox">
|
<div class="blockBox">
|
||||||
<el-dropdown @command="updateStyle('lineDash', $event)" placement="top">
|
<el-dropdown @command="updateStyle('lineDash', $event)" placement="top">
|
||||||
<el-button><el-image src="/src/assets/images/borderstyle.png"
|
<el-button><el-image src="../../../src/assets/images/borderstyle.png"
|
||||||
style="width: 14px; height: 14px"></el-image></el-button>
|
style="width: 14px; height: 14px"></el-image></el-button>
|
||||||
<template #dropdown>
|
<template #dropdown>
|
||||||
<el-dropdown-menu>
|
<el-dropdown-menu>
|
||||||
|
@ -145,7 +145,7 @@
|
||||||
<!-- 边框粗细 -->
|
<!-- 边框粗细 -->
|
||||||
<div class="blockBox">
|
<div class="blockBox">
|
||||||
<el-dropdown @command="updateStyle('lineWidth', $event)" placement="top">
|
<el-dropdown @command="updateStyle('lineWidth', $event)" placement="top">
|
||||||
<el-button><el-image src="/src/assets/images/borderwidth.png"
|
<el-button><el-image src="../../../src/assets/images/borderwidth.png"
|
||||||
style="width: 14px; height: 14px"></el-image></el-button>
|
style="width: 14px; height: 14px"></el-image></el-button>
|
||||||
<template #dropdown>
|
<template #dropdown>
|
||||||
<el-dropdown-menu>
|
<el-dropdown-menu>
|
||||||
|
@ -180,7 +180,7 @@
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<!-- 滚动 -->
|
<!-- 滚动 -->
|
||||||
<div v-if="width >= 1000" class="blockBox">
|
<div v-if="width >= 1000 || width==='100%'" class="blockBox">
|
||||||
<template v-if="type == 'design'">
|
<template v-if="type == 'design'">
|
||||||
<el-tooltip effect="light" content="滚动至中心" placement="top">
|
<el-tooltip effect="light" content="滚动至中心" placement="top">
|
||||||
<el-button icon="Operation" @click="scrollToCenter" />
|
<el-button icon="Operation" @click="scrollToCenter" />
|
||||||
|
@ -202,7 +202,7 @@
|
||||||
</div> -->
|
</div> -->
|
||||||
|
|
||||||
<!-- 橡皮擦、显示网格、清空 -->
|
<!-- 橡皮擦、显示网格、清空 -->
|
||||||
<div v-if="width >= 1000" class="blockBox">
|
<div v-if="width >= 1000 || width==='100%'" class="blockBox">
|
||||||
<!-- 橡皮擦 -->
|
<!-- 橡皮擦 -->
|
||||||
<el-tooltip effect="light" :content="currentType === 'eraser' ? '关闭橡皮擦' : '橡皮擦'" placement="top">
|
<el-tooltip effect="light" :content="currentType === 'eraser' ? '关闭橡皮擦' : '橡皮擦'" placement="top">
|
||||||
<el-button v-if="!readonly" :icon="Remove" circle :type="currentType === 'eraser' ? 'primary' : null"
|
<el-button v-if="!readonly" :icon="Remove" circle :type="currentType === 'eraser' ? 'primary' : null"
|
||||||
|
|
|
@ -59,14 +59,14 @@ export const processList = (row, aloneOption=false) => {
|
||||||
for(; j<workDescArr.length; j++){
|
for(; j<workDescArr.length; j++){
|
||||||
const char = String.fromCharCode(65+j);
|
const char = String.fromCharCode(65+j);
|
||||||
if (aloneOption) {
|
if (aloneOption) {
|
||||||
tmp += `<div style='width:100%;display:flex;padding: 2px 0'>${char}.${workDescArr[j]}</div>`;
|
tmp += `<div class="format-work-desc" style='width:100%;display:flex;padding: 2px 0'>${char}.${workDescArr[j]}</div>`;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(j%2 == 0){
|
if(j%2 == 0){
|
||||||
tmp += `<div style='width:100%;display:flex;'>`;
|
tmp += `<div style='width:100%;display:flex;'>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp += `<div style='padding-left:10px;width:50%;overflow:hidden;text-overflow:ellipsis;font-size:0.9em;'>${char}.${workDescArr[j]}</div>`;
|
tmp += `<div class="format-work-desc" style='padding-left:10px;width:50%;overflow:hidden;text-overflow:ellipsis;font-size:0.9em;'>${char}.${workDescArr[j]}</div>`;
|
||||||
if(j%2 == 1){
|
if(j%2 == 1){
|
||||||
tmp += '</div>';
|
tmp += '</div>';
|
||||||
}
|
}
|
||||||
|
@ -153,14 +153,14 @@ export const processList = (row, aloneOption=false) => {
|
||||||
for(; j<optionsArr.length; j++){
|
for(; j<optionsArr.length; j++){
|
||||||
const char = String.fromCharCode(65+j);
|
const char = String.fromCharCode(65+j);
|
||||||
if (aloneOption) {
|
if (aloneOption) {
|
||||||
tmp += `<div style='width:100%;display:flex;padding: 2px 0'>${char}.${optionsArr[j]}</div>`;
|
tmp += `<div class="format-work-desc" style='width:100%;display:flex;padding: 2px 0'>${char}.${optionsArr[j]}</div>`;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(j%2 == 0){
|
if(j%2 == 0){
|
||||||
tmp += `<div style='width:100%;display:flex;'>`;
|
tmp += `<div style='width:100%;display:flex;'>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp += `<div style='padding-left: 10px; width: 50%'>${char}.${optionsArr[j]}</div>`;
|
tmp += `<div class="format-work-desc" style='padding-left: 10px; width: 50%'>${char}.${optionsArr[j]}</div>`;
|
||||||
if(j%2 == 1){
|
if(j%2 == 1){
|
||||||
tmp += '</div>';
|
tmp += '</div>';
|
||||||
}
|
}
|
||||||
|
@ -280,14 +280,14 @@ export const processList = (row, aloneOption=false) => {
|
||||||
for(; j<workDescArr.length; j++){
|
for(; j<workDescArr.length; j++){
|
||||||
const char = String.fromCharCode(65+j);
|
const char = String.fromCharCode(65+j);
|
||||||
if (aloneOption) {
|
if (aloneOption) {
|
||||||
tmp += `<div style='width:100%;display:flex;padding: 2px 0'>${char}.${workDescArr[j]}</div>`;
|
tmp += `<div class="format-work-desc" style='width:100%;display:flex;padding: 2px 0'>${char}.${workDescArr[j]}</div>`;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(j%2 == 0){
|
if(j%2 == 0){
|
||||||
tmp += `<div style='width:100%;display:flex;'>`;
|
tmp += `<div style='width:100%;display:flex;'>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp += `<div style='padding-left: 10px; width: 50%'>${char}.${workDescArr[j]}</div>`;
|
tmp += `<div class="format-work-desc" style='padding-left: 10px; width: 50%'>${char}.${workDescArr[j]}</div>`;
|
||||||
if(j%2 == 1){
|
if(j%2 == 1){
|
||||||
tmp += '</div>';
|
tmp += '</div>';
|
||||||
}
|
}
|
||||||
|
|
|
@ -117,4 +117,8 @@ export const coursewareTypeList = [
|
||||||
label:'素材',
|
label:'素材',
|
||||||
value:6
|
value:6
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label:'视频',
|
||||||
|
value:12
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|