Compare commits

..

5 Commits

  1. 1
      package.json
  2. 8212
      pnpm-lock.yaml
  3. 40
      src/api/courseChaptersApi.ts
  4. 550
      src/views/course/CourseObjectives.vue
  5. 476
      src/views/course/CourseObjectives111.vue
  6. 8
      src/views/course/basicCourseInformation.vue
  7. 40
      vite.config.ts.timestamp-1718268044772-4deaaf3aeef01.mjs

@ -30,6 +30,7 @@
"echarts-liquidfill": "^3.1.0", "echarts-liquidfill": "^3.1.0",
"form-data": "^4.0.0", "form-data": "^4.0.0",
"jquery": "^3.7.1", "jquery": "^3.7.1",
"nanoid": "^5.0.7",
"nprogress": "^0.2.0", "nprogress": "^0.2.0",
"pinia": "^2.1.7", "pinia": "^2.1.7",
"three": "^0.163.0", "three": "^0.163.0",

File diff suppressed because it is too large Load Diff

@ -65,4 +65,42 @@ export function getOrogramObjectiveApi() {
setTimeout(() => resolve(data), 500 * Math.random()) setTimeout(() => resolve(data), 500 * Math.random())
}) })
} }
// 获取课程列表
export const getCourseList = (params:any) => {
return request({
url: '/course_objectives/list/' + params.id,
params
})
}
// 添加分目标
export const addCourse = (data:any) => {
return request({
url:'/objective_contents/addcontent',
method:"POST",
data
})
}
// 编辑目标
export const editCourse = (data: any) => {
return request({
url: '/objective_contents/update',
method: "PUT",
data
})
}
//删除课程目标
export const deleteCourse = (params: any) => {
return request({
url: '/objective_contents/' + params.id,
method: "DELETE",
})
}
// /objective_contents/
// 获取详情
export const getCourseInfo = (params: any) => {
return request({
url: '/objective_contents/' + params.id,
method: "get",
params
})
}

@ -1,121 +1,475 @@
<script lang="ts" setup> <script setup>
import {} from 'vue' import { ref, onMounted } from 'vue'
// import allclass from '@/assets/images/allclass.png' import { ElMessage, ElMessageBox } from 'element-plus'
import { id } from 'element-plus/es/locales.mjs'
import * as echarts from 'echarts'
import { useRoute } from 'vue-router'
import { getCourseList, addCourse, editCourse, deleteCourse, getCourseInfo } from '@/api/courseChaptersApi'
const route = useRoute()
// id id
// targetId
const targetList = ref([
{
label: '课程目标一',
id: 1,
disabled: false,
},
{
label: '课程目标二',
disabled: false,
id: 2,
},
{
label: '课程目标三',
id: 3,
disabled: false,
},
])
const formData = ref({
description: '',
})
const activeIndex = ref(0)
const addBook = (id) => {
activeIndex.value = id
dialogVisible.value = true
flog.value = false
// updateDisabledStatus()
}
const text = ref('我是后台获取的值')
const textChange = (val) => {
console.log(text.value)
}
//
const dialogVisible = ref(false)
//
const handleClose = () => {
dialogVisible.value = false
}
//
const submit = async () => {
if (flog.value) {
await editCourse({ id: activeIndex.value, content: formData.value.description })
} else {
await addCourse({ objectiveId: activeIndex.value, content: formData.value.description })
}
getList()
dialogVisible.value = false
formData.value.description = ''
activeIndex.value = ''
// //
// if (flog.value) {
// console.log('', formData.value.target)
// //
// const index = booksList.value.findIndex(
// (item) => formData.value.id == item.id,
// )
// console.log(index, 'index')
// console.log(booksList.value[index])
// booksList.value[index].id = formData.value.id
// booksList.value[index].targetId = formData.value.target
// booksList.value[index].introduce = formData.value.description
// close()
// } else {
// courseList.value[activeIndex.value].booklist.push({
// id: booksList.value.length + 1,
// targetId: formData.value.target,
// introduce: formData.value.description,
// })
// close()
// flog.value = false
}
const close = () => {
formData.value = {
id: null,
target: '',
description: '',
}
dialogVisible.value = false
}
//
const filterTarger = (target) => {
const res = targetList.value.find((item) => {
if (item.id === target) {
console.log(item)
return item
}
})
return res.label
}
//
const flog = ref(false)
const editBook = async (obj) => {
const res = await getCourseInfo({ id: obj.id })
flog.value = true
console.log(obj)
activeIndex.value = res.data.id
// formData.value.id = obj.id
// formData.value.target = obj.targetId
formData.value.description = res.data.content
dialogVisible.value = true
}
const del = async (obj) => {
await ElMessageBox.confirm('你确认要删除该课程目标吗', '温馨提示', {
type: 'warning',
confirmButtonText: '确认',
cancelButtonText: '取消'
})
await deleteCourse({ id: obj.id })
ElMessage.success('删除成功')
getList()
// console.log(id);
// activeIndex.value = id
// courseList.booksList.value = booksList.value.filter((item) => item.id !== id)
}
// const disableChange = (id) => {
// const index = booksList.value.findIndex((item,index) => item.id === id)
// console.log(index);
// if(index){
// targetList.value[index].disabled = false
// }
// }
// targetList disabled
const getList = async () => {
const res = await getCourseList({ id: courseId.value })
data.value = res.data[0]
text.value = res.data[0].name
}
const data = ref({})
const courseId = ref(0)
onMounted(async () => {
courseId.value = route.query.id
console.log(courseId.value);
getList()
console.log(data.value);
let chartDom = document.getElementById('main')
let myChart = echarts.init(chartDom)
let option
option = {
title: {
text: '分目标',
},
legend: {
data: ['Allocated Budget', 'Actual Spending'],
},
radar: {
// shape: 'circle',
indicator: [
{ name: 'Sales', max: 6500 },
{ name: 'Administration', max: 16000 },
{ name: 'Information Technology', max: 30000 },
{ name: 'Customer Support', max: 38000 },
{ name: 'Development', max: 52000 },
{ name: 'Marketing', max: 25000 },
],
},
series: [
{
name: 'Budget vs spending',
type: 'radar',
data: [
{
value: [4200, 3000, 20000, 35000, 50000, 18000],
name: 'Allocated Budget',
},
{
value: [5000, 14000, 28000, 26000, 42000, 21000],
name: 'Actual Spending',
},
],
},
],
}
option && myChart.setOption(option)
})
</script> </script>
<template> <template>
<el-row :gutter="20"> <div class="container">
<el-col :span="8"> <div class="leftContent">
<div class="grid-content main"> <div class="topContent">
<div class="title"><p>|&nbsp;&nbsp;课程总目标</p></div> <div class="title">| 课程总目标</div>
<div class="ac_content"> <div class="content1">
<div class="ma_content"> <textarea class="textarea" @change="textChange" v-model="text">文本内容</textarea>
通过本课程的学习使学生进一步了解计算机的工作原理更好地理解和应用计算机
握用计算机处理问题的方法和技能:培养学生分析问题解决问题的能力以及编制程序实现算
法的能力
</div> </div>
</div> </div>
<div class="footContent">
<div class="title">| 分目标雷达图</div>
<div class="content3">
<div id="main"></div>
</div> </div>
<div class="grid-content picture">
<div class="title"><p>|&nbsp;&nbsp;课程总目标</p></div>
<div class="ac_pic"></div>
</div> </div>
</el-col>
<el-col :span="16">
<div class="grid-content object">
<div class="title"><p>|&nbsp;&nbsp;课程分目标</p></div>
<div class="slice"></div>
</div> </div>
</el-col> <div class="rightContent">
</el-row> <div class="title" style="
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 20px;
height: 60px;">
<div class="left2">| 课程分目标</div>
<div class="right2">
<!-- <el-button type="primary" @click="addBook">新增</el-button> -->
</div>
</div>
<div class="content2">
<el-scrollbar height="600px">
<ul class="objectLi">
<li v-for="(item, index) in data.courseObjectivesTrees" :key="item.id">
<div class="courseObject">
<!-- {{ filterTarger(item.targetId) }} -->
<div class="courseObject1">{{ item.name }}</div>
<div class="courseObject2">
<!-- <el-button class="edit" type="text" @click="editBook(item)">
编辑
</el-button> -->
<el-button type="primary" @click="addBook(item.id)">新增</el-button>
</div>
</div>
<div class="smallContent">
<el-scrollbar height="250px">
<ul class="small">
<li v-for="(obj, i) in item.contents" :key="obj.id">
<div class="partObject">
<div class="partObject1">
<!-- {{ item.content }} -->
<!-- {{ item.introduce }} -->
课程目标{{ i + 1 }}
<!-- {{ filterTarger(obj.targetId) }} -->
</div>
<div class="partObject2">
<el-button class="edit" type="text" @click="editBook(obj)">
编辑
</el-button>
<el-button class="destroy" type="text" @click="del(obj)">
删除
</el-button>
</div>
</div>
<div class="partObjectIntroduce">
{{ obj.content }}
</div>
</li>
</ul>
</el-scrollbar>
</div>
</li>
</ul>
</el-scrollbar>
</div>
</div>
</div>
<el-dialog v-if="dialogVisible" v-model="dialogVisible" :title="flog ? '编辑' : '新增'" width="500"
:before-close="handleClose">
<el-form :model="formData" label-width="auto" style="max-width: 600px">
<!-- <el-form-item label="目标" prop="target">
<el-select v-model="formData.target" placeholder="Select" size="large" style="width: 240px">
<el-option v-for="item in targetList" :key="item.id" :label="item.label" :value="item.id"
:disabled="item.disabled" />
</el-select>
</el-form-item> -->
<el-form-item label="内容" prop="description">
<el-input v-model="formData.description" placeholder="请输入内容"></el-input>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="close">取消</el-button>
<el-button type="primary" @click="submit">确定</el-button>
</div>
</template>
</el-dialog>
</template> </template>
<!-- <script setup>
import {ref} 'vue'
const li
</script> -->
<style scoped> <style lang="scss" scoped>
.el-row { #main {
margin-bottom: 20px; padding: 15px;
} width: 100%;
.el-col { height: 100%;
border-radius: 4px;
}
.bg-purple {
background: #d3dce6;
}
.bg-purple-light {
background: #e5e9f2;
} }
.grid-content {
border-radius: 4px; .container {
display: flex;
flex-direction: column;
}
.ac_content {
background: linear-gradient(180deg, #c7e3ff 0%, #ffffff 100%);
border-radius: 29px 29px 29px 29px;
display: flex; display: flex;
align-items: center; flex-direction: row;
justify-content: center; flex-wrap: nowrap;
height: 206px; width: 100%;
padding: 0 10px 0 10px;
justify-content: space-around;
} }
.ma_content {
height: 160px; .leftContent {
font-family: Inter, Inter; width: 450px;
font-weight: 400; height: 730px;
font-size: 16px; margin: 10px;
color: #333333;
line-height: 20px; .topContent {
text-align: left; border-radius: 20px 20px 0 0px;
font-style: normal; height: 280px;
text-transform: none; background-color: #74deff;
margin-left: 33px; margin-button: 5px;
margin-right: 33px; background-image: linear-gradient(to right, #4984ff, #74deff);
} }
.ac_pic {
height: 488px; .footContent {
background: linear-gradient(180deg, #ffe9c7 0%, #ffffff 100%); border-radius: 20px;
border-radius: 29px 29px 29px 29px; margin-top: 20px;
} height: 430px;
img { background-color: #ffa674;
order: -1;
}
.object {
height: 857px;
background: linear-gradient(180deg, #4984ff 0%, #74deff 100%);
border-radius: 29px 29px 29px 29px;
}
.slice {
height: 791px;
background: linear-gradient(180deg, #c7e3ff 0%, #ffffff 100%);
border-radius: 29px 29px 29px 29px;
}
.picture {
height: 553px;
margin-top: 28px;
border-radius: 29px 29px 29px 29px;
background-image: linear-gradient(to right, #f9e397, #ffa674); background-image: linear-gradient(to right, #f9e397, #ffa674);
}
} }
.main {
height: 272px; .rightContent {
border-radius: 29px 29px 29px 29px; margin: 10px;
width: 950px;
height: 730px;
background-image: linear-gradient(to right, #4984ff, #74deff); background-image: linear-gradient(to right, #4984ff, #74deff);
display: flex; border-radius: 20px;
justify-content: end;
} }
.title { .title {
flex: 1; padding-left: 30px;
font-size: 24px;
font-weight: 600;
color: #fff;
height: 40px;
line-height: 40px;
padding-top: 10px;
}
.content1 {
border-radius: 20px 20px 0 0px;
margin-top: 20px;
width: 100%;
height: 220px;
background-color: #fff;
background-image: linear-gradient(#c7e3ff, #ffffff);
.textarea {
width: 100%;
border: none;
background: transparent;
padding: 20px;
height: 215px;
}
p {
padding: 30px;
font-size: 16px;
}
}
.content2 {
border-radius: 20px;
padding: 10px;
width: 100%;
height: 670px;
background-color: #fff;
background-image: linear-gradient(#c7e3ff, #ffffff);
.objectLi>li {
width: 845px;
height: 250px;
// margin: 40px;
// background-color: #ffffff;
border-radius: 5px;
margin: 20px;
.courseObject {
height: 45px;
line-height: 40px;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 20px;
border-bottom: 1px solid #e7e7e7;
.courseObject1 {
height: 30px;
line-height: 30px;
font-size: 14px;
background-color: #6093ff;
padding: 0px 16px;
color: #fff;
}
.courseObject2 {
font-size: 14px;
color: #0052d9;
}
}
}
// overflow-y: auto
.smallContent {
// border-radius: 20px;
padding: 10px;
width: 100%;
height: 200px;
background-color: #fff;
background-image: linear-gradient(#c7e3ff, #ffffff);
}
.small>li {
// display: inline-flex;
width: 650px;
height: 150px;
// margin: 40px;
background-color: #ffffff;
border-radius: 5px;
margin: 20px;
.partObject {
height: 45px;
line-height: 40px;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between;
padding: 0 20px;
border-bottom: 1px solid #e7e7e7;
.partObject1 {
height: 30px;
line-height: 30px;
font-size: 14px;
background-color: #6093ff;
padding: 0px 16px;
color: #fff;
}
.partObject2 {
font-size: 14px;
color: #0052d9;
}
}
.partObjectIntroduce {
height: 149px;
font-size: 16px;
padding: 15px;
}
}
} }
p {
height: 29px; .content3 {
font-family: Inter, Inter; border-radius: 20px;
font-weight: bold; margin-top: 20px;
margin-left: 34px; width: 100%;
font-size: 24px; height: 370px;
color: #ffffff; background-color: #fff;
line-height: 28px; background-image: linear-gradient(#ffe9c7, #ffffff);
text-align: left;
font-style: normal;
text-transform: none;
} }
</style> </style>

@ -0,0 +1,476 @@
<script setup>
import { ref, onMounted } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { id } from 'element-plus/es/locales.mjs'
import * as echarts from 'echarts'
import {useRoute } from 'vue-router'
import { getCourseList } from '@/api/courseChaptersApi'
const route = useRoute()
// id id
// targetId
const booksList = ref([
{ id: 1, targetId: 1, introduce: '内容111111' },
// { id: 3, introduce: '333333' },
// { id: 4, introduce: '333333' },
])
const courseList = ref([
{ id: 1, specific: '思政目标', booklist: [{ id: 1, targetId: 1, introduce: '内容111111' }] },
{ id: 2, specific: '知识目标', booklist: [{ id: 1, targetId: 1, introduce: '内容222222' }] },
{ id: 3, specific: '能力目标', booklist: [{ id: 1, targetId: 1, introduce: '内容333333' }] },
{ id: 4, specific: '素质目标', booklist: [{ id: 1, targetId: 1, introduce: '内容444444' }] },
])
const targetList = ref([
{
label: '课程目标一',
id: 1,
disabled: false,
},
{
label: '课程目标二',
disabled: false,
id: 2,
},
{
label: '课程目标三',
id: 3,
disabled: false,
},
])
const formData = ref({
id: null,
target: '',
description: '',
})
const activeIndex = ref(0)
const addBook = (index) => {
activeIndex.value = index
dialogVisible.value = true
updateDisabledStatus()
}
const text = ref('我是后台获取的值')
const textChange = (val) => {
console.log(text.value)
}
//
const dialogVisible = ref(false)
//
const handleClose = () => {
dialogVisible.value = false
}
//
const submit = () => {
//
if (flog.value) {
console.log('编辑', formData.value.target)
//
const index = booksList.value.findIndex(
(item) => formData.value.id == item.id,
)
console.log(index, 'index')
console.log(booksList.value[index])
booksList.value[index].id = formData.value.id
booksList.value[index].targetId = formData.value.target
booksList.value[index].introduce = formData.value.description
close()
} else {
courseList.value[activeIndex.value].booklist.push({
id: booksList.value.length + 1,
targetId: formData.value.target,
introduce: formData.value.description,
})
close()
flog.value = false
}
}
const close = () => {
formData.value = {
id: null,
target: '',
description: '',
}
dialogVisible.value = false
}
//
const filterTarger = (target) => {
const res = targetList.value.find((item) => {
if (item.id === target) {
console.log(item)
return item
}
})
return res.label
}
//
const flog = ref(false)
const editBook = (obj) => {
updateDisabledStatus()
flog.value = true
console.log(obj)
formData.value.id = obj.id
formData.value.target = obj.targetId
formData.value.description = obj.introduce
dialogVisible.value = true
}
const del = (id) => {
// console.log(id);
courseList.booksList.value = booksList.value.filter((item) => item.id !== id)
}
// const disableChange = (id) => {
// const index = booksList.value.findIndex((item,index) => item.id === id)
// console.log(index);
// if(index){
// targetList.value[index].disabled = false
// }
// }
// targetList disabled
const updateDisabledStatus = () => {
// targetList
targetList.value.forEach((targetItem) => {
// booksList id
const hasIdInBooks = booksList.value.some(
(bookItem) => bookItem.id === targetItem.id,
)
// disabled true
if (hasIdInBooks) {
targetItem.disabled = true
}
})
}
const list=ref([])
const content88=ref()
const courseId = ref(0)
onMounted(async() => {
courseId.value = route.query.id
console.log(courseId.value);
const res = await getCourseList({ id: courseId.value })
console.log(res);
list.value=res.data
console.log(list.value);
content88.value = list.value[0].contents[0].content
console.log(list.value[0].contents[0].content);
console.log(content88.value);
let chartDom = document.getElementById('main')
let myChart = echarts.init(chartDom)
let option
option = {
title: {
text: '分目标',
},
legend: {
data: ['Allocated Budget', 'Actual Spending'],
},
radar: {
// shape: 'circle',
indicator: [
{ name: 'Sales', max: 6500 },
{ name: 'Administration', max: 16000 },
{ name: 'Information Technology', max: 30000 },
{ name: 'Customer Support', max: 38000 },
{ name: 'Development', max: 52000 },
{ name: 'Marketing', max: 25000 },
],
},
series: [
{
name: 'Budget vs spending',
type: 'radar',
data: [
{
value: [4200, 3000, 20000, 35000, 50000, 18000],
name: 'Allocated Budget',
},
{
value: [5000, 14000, 28000, 26000, 42000, 21000],
name: 'Actual Spending',
},
],
},
],
}
option && myChart.setOption(option)
})
</script>
<!-- v-model="text" -->
<template>
<div class="container">
<div class="leftContent">
<div class="topContent">
<div class="title">| 课程总目标</div>
<div class="content1">
<textarea class="textarea" @change="textChange">{{ content88 }}</textarea>
</div>
</div>
<div class="footContent">
<div class="title">| 分目标雷达图</div>
<div class="content3">
<div id="main"></div>
</div>
</div>
</div>
<div class="rightContent">
<div class="title" style="
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 20px;
height: 60px;">
<div class="left2">| 课程分目标</div>
<div class="right2">
<!-- <el-button type="primary" @click="addBook">新增</el-button> -->
</div>
</div>
<div class="content2">
<el-scrollbar height="600px">
<ul class="objectLi">
<li v-for="(item, index) in courseList" :key="item.id">
<div class="courseObject">
<!-- {{ filterTarger(item.targetId) }} -->
<div class="courseObject1">{{ item.specific }}</div>
<div class="courseObject2">
<!-- <el-button class="edit" type="text" @click="editBook(item)">
编辑
</el-button> -->
<el-button type="primary" @click="addBook(index)">新增</el-button>
</div>
</div>
<div class="smallContent">
<el-scrollbar height="250px">
<ul class="small">
<li v-for="(obj, i) in item.booklist" :key="obj.id">
<div class="partObject">
<div class="partObject1">
<!-- {{ item.introduce }} -->
课程目标{{ i+1 }}
<!-- {{ filterTarger(obj.targetId) }} -->
</div>
<div class="partObject2">
<el-button class="edit" type="text" @click="editBook(obj)">
编辑
</el-button>
<el-button class="destroy" type="text" @click="del(obj.id)">
删除
</el-button>
</div>
</div>
<div class="partObjectIntroduce">
{{ obj.introduce }}
</div>
</li>
</ul>
</el-scrollbar>
</div>
</li>
</ul>
</el-scrollbar>
</div>
</div>
</div>
<el-dialog v-if="dialogVisible" v-model="dialogVisible" title="新增目标" width="500" :before-close="handleClose">
<el-form :model="formData" label-width="auto" style="max-width: 600px">
<!-- <el-form-item label="目标" prop="target">
<el-select v-model="formData.target" placeholder="Select" size="large" style="width: 240px">
<el-option v-for="item in targetList" :key="item.id" :label="item.label" :value="item.id"
:disabled="item.disabled" />
</el-select>
</el-form-item> -->
<el-form-item label="内容" prop="description">
<el-input v-model="formData.description" placeholder="请输入内容"></el-input>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="close">取消</el-button>
<el-button type="primary" @click="submit">确定</el-button>
</div>
</template>
</el-dialog>
</template>
<!-- <script setup>
import {ref} 'vue'
const li
</script> -->
<style lang="scss" scoped>
#main {
padding: 15px;
width: 100%;
height: 100%;
}
.container {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
width: 100%;
padding: 0 10px 0 10px;
justify-content: space-around;
}
.leftContent {
width: 450px;
height: 730px;
margin: 10px;
.topContent {
border-radius: 20px 20px 0 0px;
height: 280px;
background-color: #74deff;
margin-button: 5px;
background-image: linear-gradient(to right, #4984ff, #74deff);
}
.footContent {
border-radius: 20px;
margin-top: 20px;
height: 430px;
background-color: #ffa674;
background-image: linear-gradient(to right, #f9e397, #ffa674);
}
}
.rightContent {
margin: 10px;
width: 950px;
height: 730px;
background-image: linear-gradient(to right, #4984ff, #74deff);
border-radius: 20px;
}
.title {
padding-left: 30px;
font-size: 24px;
font-weight: 600;
color: #fff;
height: 40px;
line-height: 40px;
padding-top: 10px;
}
.content1 {
border-radius: 20px 20px 0 0px;
margin-top: 20px;
width: 100%;
height: 220px;
background-color: #fff;
background-image: linear-gradient(#c7e3ff, #ffffff);
.textarea {
width: 100%;
border: none;
background: transparent;
padding: 20px;
height: 215px;
}
p {
padding: 30px;
font-size: 16px;
}
}
.content2 {
border-radius: 20px;
padding: 10px;
width: 100%;
height: 670px;
background-color: #fff;
background-image: linear-gradient(#c7e3ff, #ffffff);
.objectLi > li {
width: 845px;
height: 250px;
// margin: 40px;
// background-color: #ffffff;
border-radius: 5px;
margin: 20px;
.courseObject {
height: 45px;
line-height: 40px;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 20px;
border-bottom: 1px solid #e7e7e7;
.courseObject1 {
height: 30px;
line-height: 30px;
font-size: 14px;
background-color: #6093ff;
padding: 0px 16px;
color: #fff;
}
.courseObject2 {
font-size: 14px;
color: #0052d9;
}
}
}
// overflow-y: auto
.smallContent {
// border-radius: 20px;
padding: 10px;
width: 100%;
height: 200px;
background-color: #fff;
background-image: linear-gradient(#c7e3ff, #ffffff);
}
.small > li {
// display: inline-flex;
width: 750px;
height: 150px;
// margin: 40px;
background-color: #ffffff;
border-radius: 5px;
margin: 20px;
.partObject {
height: 45px;
line-height: 40px;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 20px;
border-bottom: 1px solid #e7e7e7;
.partObject1 {
height: 30px;
line-height: 30px;
font-size: 14px;
background-color: #6093ff;
padding: 0px 16px;
color: #fff;
}
.partObject2 {
font-size: 14px;
color: #0052d9;
}
}
.partObjectIntroduce {
height: 149px;
font-size: 16px;
padding: 15px;
}
}
}
.content3 {
border-radius: 20px;
margin-top: 20px;
width: 100%;
height: 370px;
background-color: #fff;
background-image: linear-gradient(#ffe9c7, #ffffff);
}
</style>

@ -15,7 +15,6 @@ import { useRouter, useRoute } from 'vue-router'
const router = useRouter() const router = useRouter()
// const route = useRoute() // const route = useRoute()
// console.log(route) // console.log(route)
// import { client } from '@/utils/alioss.js' // import { client } from '@/utils/alioss.js'
// //
const courseList = ref([]) const courseList = ref([])
@ -163,7 +162,6 @@ const CloseCouresNameChangeEvent = () => {
<div class="btn"> <div class="btn">
<!-- <el-button type="primary" round size="large">全部课程</el-button> <!-- <el-button type="primary" round size="large">全部课程</el-button>
<el-button type="primary" round plain size="large">我的文件夹</el-button> --> <el-button type="primary" round plain size="large">我的文件夹</el-button> -->
<el-form inline> <el-form inline>
<el-form-item label="课程教师:" class="short-form-item"> <el-form-item label="课程教师:" class="short-form-item">
<el-select v-model="params.teacher"> <el-select v-model="params.teacher">
@ -190,13 +188,11 @@ const CloseCouresNameChangeEvent = () => {
<el-option label="考察" value="2"></el-option> <el-option label="考察" value="2"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="onSearch">搜索</el-button> <el-button type="primary" @click="onSearch">搜索</el-button>
<el-button type="primary" plain @click="onReset">重置</el-button> <el-button type="primary" plain @click="onReset">重置</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<div class="course"> <div class="course">
<ul class="course_list"> <ul class="course_list">
<li @click="onAddCourse()"> <li @click="onAddCourse()">
@ -205,7 +201,6 @@ const CloseCouresNameChangeEvent = () => {
<Plus /> <Plus />
</el-icon> </el-icon>
</div> </div>
<h2 class="course_name">{{ course_name }}</h2> <h2 class="course_name">{{ course_name }}</h2>
<!-- <p class="teacher_name">讲师{{ courseList.teacher }}</p> <!-- <p class="teacher_name">讲师{{ courseList.teacher }}</p>
<p class="credit"> <p class="credit">
@ -220,7 +215,6 @@ const CloseCouresNameChangeEvent = () => {
<h2 class="course_name" @click="onEditCourse(item)"> <h2 class="course_name" @click="onEditCourse(item)">
{{ item.name }} {{ item.name }}
</h2> </h2>
<p class="teacher_name">讲师{{ item.teacher }}</p> <p class="teacher_name">讲师{{ item.teacher }}</p>
<p class="credit"> <p class="credit">
<span>{{ item.classhours }}</span> <span>{{ item.classhours }}</span>
@ -231,7 +225,6 @@ const CloseCouresNameChangeEvent = () => {
<el-icon class="del" @click="onDeleteCourse(item.id)"> <el-icon class="del" @click="onDeleteCourse(item.id)">
<Delete /> <Delete />
</el-icon> </el-icon>
<el-button class="object" round plain @click="onGetCourseObject(item.id)"> <el-button class="object" round plain @click="onGetCourseObject(item.id)">
查看课程目标 查看课程目标
</el-button> </el-button>
@ -274,7 +267,6 @@ const CloseCouresNameChangeEvent = () => {
// // margin: 20px; // // margin: 20px;
// // padding-left: 50px; // // padding-left: 50px;
// } // }
.search { .search {
width: 50%; width: 50%;
display: flex; display: flex;

@ -0,0 +1,40 @@
// vite.config.ts
import vue from "file:///D:/aaa/teaching/Teaching_integration_platform_admin_template/node_modules/.pnpm/@vitejs+plugin-vue@5.0.4_vite@5.1.4_vue@3.4.19/node_modules/@vitejs/plugin-vue/dist/index.mjs";
import path from "path";
import { viteMockServe } from "file:///D:/aaa/teaching/Teaching_integration_platform_admin_template/node_modules/.pnpm/vite-plugin-mock@3.0.1_esbuild@0.19.12_mockjs@1.1.0_vite@5.1.4/node_modules/vite-plugin-mock/dist/index.mjs";
import { createSvgIconsPlugin } from "file:///D:/aaa/teaching/Teaching_integration_platform_admin_template/node_modules/.pnpm/vite-plugin-svg-icons@2.0.1_vite@5.1.4/node_modules/vite-plugin-svg-icons/dist/index.mjs";
var vite_config_default = ({ command }) => {
return {
plugins: [
vue(),
viteMockServe({
enable: command === "serve"
}),
createSvgIconsPlugin({
// Specify the icon folder to be cached
iconDirs: [path.resolve(process.cwd(), "src/assets/icons")],
// Specify symbolId format
symbolId: "icon-[dir]-[name]"
})
],
resolve: {
alias: {
"@": path.resolve("./src")
// 相对路径别名配置,使用 @ 代替 src
}
},
// 配置scss
css: {
preprocessorOptions: {
scss: {
javascriptEnabled: true,
additionalData: '@import "./src/styles/variable.scss";'
}
}
}
};
};
export {
vite_config_default as default
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJEOlxcXFxhYWFcXFxcdGVhY2hpbmdcXFxcVGVhY2hpbmdfaW50ZWdyYXRpb25fcGxhdGZvcm1fYWRtaW5fdGVtcGxhdGVcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkQ6XFxcXGFhYVxcXFx0ZWFjaGluZ1xcXFxUZWFjaGluZ19pbnRlZ3JhdGlvbl9wbGF0Zm9ybV9hZG1pbl90ZW1wbGF0ZVxcXFx2aXRlLmNvbmZpZy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vRDovYWFhL3RlYWNoaW5nL1RlYWNoaW5nX2ludGVncmF0aW9uX3BsYXRmb3JtX2FkbWluX3RlbXBsYXRlL3ZpdGUuY29uZmlnLnRzXCI7aW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZSdcclxuaW1wb3J0IHZ1ZSBmcm9tICdAdml0ZWpzL3BsdWdpbi12dWUnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbi8vIFx1NUJGQ1x1NTE2NW1vY2tcdTYzRDJcdTRFRjZcclxuaW1wb3J0IHsgdml0ZU1vY2tTZXJ2ZSB9IGZyb20gJ3ZpdGUtcGx1Z2luLW1vY2snXHJcbi8vIFx1NUJGQ1x1NTE2NXN2Z1x1OTE0RFx1N0Y2RVx1NjNEMlx1NEVGNlxyXG5pbXBvcnQgeyBjcmVhdGVTdmdJY29uc1BsdWdpbiB9IGZyb20gJ3ZpdGUtcGx1Z2luLXN2Zy1pY29ucydcclxuLy8gaHR0cHM6Ly92aXRlanMuZGV2L2NvbmZpZy9cclxuZXhwb3J0IGRlZmF1bHQgKHsgY29tbWFuZCB9OiBhbnkpID0+IHtcclxuICByZXR1cm4ge1xyXG4gICAgcGx1Z2luczogW1xyXG4gICAgICB2dWUoKSxcclxuICAgICAgdml0ZU1vY2tTZXJ2ZSh7XHJcbiAgICAgICAgZW5hYmxlOiBjb21tYW5kID09PSAnc2VydmUnLFxyXG4gICAgICB9KSxcclxuICAgICAgY3JlYXRlU3ZnSWNvbnNQbHVnaW4oe1xyXG4gICAgICAgIC8vIFNwZWNpZnkgdGhlIGljb24gZm9sZGVyIHRvIGJlIGNhY2hlZFxyXG4gICAgICAgIGljb25EaXJzOiBbcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksICdzcmMvYXNzZXRzL2ljb25zJyldLFxyXG4gICAgICAgIC8vIFNwZWNpZnkgc3ltYm9sSWQgZm9ybWF0XHJcbiAgICAgICAgc3ltYm9sSWQ6ICdpY29uLVtkaXJdLVtuYW1lXScsXHJcbiAgICAgIH0pLFxyXG4gICAgXSxcclxuICAgIHJlc29sdmU6IHtcclxuICAgICAgYWxpYXM6IHtcclxuICAgICAgICAnQCc6IHBhdGgucmVzb2x2ZSgnLi9zcmMnKSwgLy8gXHU3NkY4XHU1QkY5XHU4REVGXHU1Rjg0XHU1MjJCXHU1NDBEXHU5MTREXHU3RjZFXHVGRjBDXHU0RjdGXHU3NTI4IEAgXHU0RUUzXHU2NkZGIHNyY1xyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICAgIC8vIFx1OTE0RFx1N0Y2RXNjc3NcclxuICAgIGNzczoge1xyXG4gICAgICBwcmVwcm9jZXNzb3JPcHRpb25zOiB7XHJcbiAgICAgICAgc2Nzczoge1xyXG4gICAgICAgICAgamF2YXNjcmlwdEVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogJ0BpbXBvcnQgXCIuL3NyYy9zdHlsZXMvdmFyaWFibGUuc2Nzc1wiOycsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgfVxyXG59XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFDQSxPQUFPLFNBQVM7QUFDaEIsT0FBTyxVQUFVO0FBRWpCLFNBQVMscUJBQXFCO0FBRTlCLFNBQVMsNEJBQTRCO0FBRXJDLElBQU8sc0JBQVEsQ0FBQyxFQUFFLFFBQVEsTUFBVztBQUNuQyxTQUFPO0FBQUEsSUFDTCxTQUFTO0FBQUEsTUFDUCxJQUFJO0FBQUEsTUFDSixjQUFjO0FBQUEsUUFDWixRQUFRLFlBQVk7QUFBQSxNQUN0QixDQUFDO0FBQUEsTUFDRCxxQkFBcUI7QUFBQTtBQUFBLFFBRW5CLFVBQVUsQ0FBQyxLQUFLLFFBQVEsUUFBUSxJQUFJLEdBQUcsa0JBQWtCLENBQUM7QUFBQTtBQUFBLFFBRTFELFVBQVU7QUFBQSxNQUNaLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFDQSxTQUFTO0FBQUEsTUFDUCxPQUFPO0FBQUEsUUFDTCxLQUFLLEtBQUssUUFBUSxPQUFPO0FBQUE7QUFBQSxNQUMzQjtBQUFBLElBQ0Y7QUFBQTtBQUFBLElBRUEsS0FBSztBQUFBLE1BQ0gscUJBQXFCO0FBQUEsUUFDbkIsTUFBTTtBQUFBLFVBQ0osbUJBQW1CO0FBQUEsVUFDbkIsZ0JBQWdCO0FBQUEsUUFDbEI7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
Loading…
Cancel
Save