develoop
ww 4 months ago
commit f77b4afe40
  1. 12414
      pnpm-lock.yaml
  2. 8
      src/api/user/user.js
  3. 11
      src/views/MyCourseStudy/learningProcess.vue
  4. 158
      src/views/course/components/KnowledgeGraphUi/foldInfoUi.vue
  5. 53
      src/views/course/courseChapters.vue
  6. 28
      src/views/courseResources/componse/resourceAdd.vue
  7. 14
      src/views/courseResources/index.vue
  8. 24
      src/views/home/components/ConHeader.vue
  9. 2
      src/views/home/components/Echart/Echarts.vue
  10. 24
      src/views/home/components/Echarts.vue
  11. 72
      src/views/home/components/Lessonlist.vue
  12. 34
      src/views/home/components/Status.vue
  13. 120
      src/views/home/components/Student1.vue
  14. 104
      src/views/home/components/Welcome.vue
  15. 292
      src/views/home/index.vue
  16. 1
      src/views/login/index.vue

File diff suppressed because it is too large Load Diff

@ -58,3 +58,11 @@ export const userToplessonService = () => request.get('#')
export const userNewLikeService = (id) => { export const userNewLikeService = (id) => {
return request.post('/api/course_favour/newCollect?userId=' + id) return request.post('/api/course_favour/newCollect?userId=' + id)
} }
//获取学生列表
export const userStudentListService = (id) => {
return request.post('/api/coursesteacher/studentList?userId=' + id)
}
//获取课程列表
export const userLessonListService = (id) => {
return request.post('/api/coursesteacher/studentList?userId=' + id)
}

@ -4,19 +4,26 @@ import { ref } from 'vue'
import { ElMessageBox, ElMessage } from 'element-plus' import { ElMessageBox, ElMessage } from 'element-plus'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import useUserStore from '@/store/modules/user'
import { onMounted } from 'vue'
// //
import { LearningRecordsControllerService } from '../../../generated/services/LearningRecordsControllerService' import { LearningRecordsControllerService } from '../../../generated/services/LearningRecordsControllerService'
const total = ref(0) const total = ref(0)
const userStore = useUserStore()
const recordList = ref([]) const recordList = ref([])
const selectedIds = ref([]) const selectedIds = ref([])
const loading = ref(false) const loading = ref(false)
const showCheckbox = ref(false) const showCheckbox = ref(false)
onMounted(()=>{
userStore.getUserInfo()
})
const params = ref({ const params = ref({
// pagesize: '10', // pagesize: '10',
// pagenum: '1', // pagenum: '1',
userId: '1', userId: userStore.data.id,
}) })
console.log(userStore.data.id);
// //
const getrecordList = async () => { const getrecordList = async () => {
//console.log(1111111) //console.log(1111111)

@ -2,46 +2,89 @@
<div class="fold-info-ui"> <div class="fold-info-ui">
<div class="demo-collapse"> <div class="demo-collapse">
<el-collapse class="collapse"> <el-collapse class="collapse">
<button class="my-button" style="position: absolute;left: 0;top: 0;" @click.stop="emits('add')">新增</button> <button
class="my-button"
style="position: absolute; left: 0; top: 0"
@click.stop="emits('add')"
>
新增
</button>
<el-collapse-item v-for="item in foldInfoData" :key="item.id"> <el-collapse-item v-for="item in foldInfoData" :key="item.id">
<template #title> <template #title>
<div class="title"> <div class="title">
<div class="icon"> <div class="icon">
<img src="@/assets/images/minus-circle-filled.png" alt=""> <img src="@/assets/images/minus-circle-filled.png" alt="" />
</div>
<div class="index" v-if="String(item.numshow).length == 1">
0{{ item.numshow }} /
</div> </div>
<div class="index" v-if="String(item.numshow).length == 1"> 0{{ item.numshow }} /</div>
<div class="index" v-else>{{ item.numshow }} /</div> <div class="index" v-else>{{ item.numshow }} /</div>
<div class="text">{{ item.name }}</div> <div class="text">{{ item.name }}</div>
<div class="title-tag-box"> <div class="title-tag-box">
<div class="my-tag" type="warning">{{ item.totalclasshours }}学时</div> <div class="my-tag" type="warning">
{{ item.totalclasshours }}学时
</div>
<div class="my-tag">本章资源</div> <div class="my-tag">本章资源</div>
</div> </div>
<button class="my-button" @click.stop="emits('edit', item)" style="margin-right: 10px;">编辑</button> <button
<el-button type="danger" class="is-el-button" :loading="loading&&item.id===activeData.id" @click.stop="hanDel(item)" style="margin-right: 10px;">删除</el-button> class="my-button"
@click.stop="emits('edit', item)"
style="margin-right: 10px"
>
编辑
</button>
<my-btn
:id="item.id"
type="danger"
class="is-el-button"
style="margin-right: 10px"
>
删除
</my-btn>
</div> </div>
</template> </template>
<template #default> <template #default>
<div class="titile-box-knowledge chapter-knowledge"> <div class="titile-box-knowledge chapter-knowledge">
<div class="my-tag">知识点1</div> <div class="my-tag">知识点1</div>
<div class="my-tag">知识点1</div> <div class="my-tag">知识点1</div>
</div> </div>
<div class="main-box"> <div class="main-box">
<div class="left"></div> <div class="left"></div>
<div class="right"> <div class="right">
<div class="structure-item"> <div class="structure-item">
<div class="structure-item-titile-box" v-for="obj, ind in item.chapterSection" :key="item.id"> <div
class="structure-item-titile-box"
v-for="(obj, ind) in item.chapterSection"
:key="item.id"
>
<div class="titile-box-titile"> <div class="titile-box-titile">
<div class="sequence">{{ ind + 1 }}</div> <div class="sequence">{{ ind + 1 }}</div>
<div class="tit-box"> <div class="tit-box">
<div class="tit-box-left">{{ obj.numshow }} {{ obj.name }}</div> <div class="tit-box-left">
{{ obj.numshow }} {{ obj.name }}
</div>
<div class="tit-box-right my-tag">资源</div> <div class="tit-box-right my-tag">资源</div>
<div class="title-tag-box"> <div class="title-tag-box">
<div class="my-tag" type="warning">{{ obj.totalclasshours }}学时</div> <div class="my-tag" type="warning">
{{ obj.totalclasshours }}学时
</div>
</div> </div>
<div class="tit-box-edit"> <div class="tit-box-edit">
<button class="my-button" @click.stop="emits('edit', obj)" style="margin-right: 10px;">编辑</button> <button
<el-button type="danger" class="is-el-button" :loading="loading&&obj.id==activeData.id" my-type="error" @click.stop="hanDel(obj)">删除</el-button> class="my-button"
@click.stop="emits('edit', obj)"
style="margin-right: 10px"
>
编辑
</button>
<my-btn
:id="obj.id"
type="danger"
class="is-el-button"
style="margin-right: 10px"
>
删除
</my-btn>
</div> </div>
</div> </div>
</div> </div>
@ -54,7 +97,6 @@
</div> </div>
</div> </div>
</template> </template>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
</div> </div>
@ -62,17 +104,35 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue' import { ElButton } from 'element-plus'
defineProps(['foldInfoData','loading']) import { ref, h, type SetupContext, withModifiers } from 'vue'
defineProps(['foldInfoData'])
const emits = defineEmits(['add', 'del', 'edit']) const emits = defineEmits(['add', 'del', 'edit'])
const activeData = ref({id:undefined})
function hanDel(o:any){ const MyBtn = {
activeData.value = o props: ['id'],
emits('del', o.id) setup(props: { id: string }, context: SetupContext) {
const loading = ref(false)
const setLoading = (bool: boolean) => (loading.value = bool)
return () =>
h(
ElButton,
{
loading: loading.value,
onClick: withModifiers(
function () {
emits('del', props.id, setLoading)
},
['stop'],
),
...context.attrs,
},
context.slots,
)
},
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
::v-deep .collapse { ::v-deep .collapse {
border-top: none; border-top: none;
@ -90,13 +150,11 @@ function hanDel(o:any){
background: #fff; background: #fff;
position: relative; position: relative;
.demo-collapse { .demo-collapse {
$title-icon-width: 15px; $title-icon-width: 15px;
$title--icon-m-r: 34px; $title--icon-m-r: 34px;
$title-index-width: 60px; $title-index-width: 60px;
.title { .title {
display: flex; display: flex;
height: 22px; height: 22px;
@ -112,7 +170,6 @@ function hanDel(o:any){
& img { & img {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
} }
@ -138,17 +195,17 @@ function hanDel(o:any){
display: flex; display: flex;
column-gap: 16px; column-gap: 16px;
} }
} }
.main-box { .main-box {
width: 100%; width: 100%;
display: flex; display: flex;
$line: 1px dashed #D9D9D9; $line: 1px dashed #d9d9d9;
.left { .left {
width: calc($title-icon-width + $title--icon-m-r + $title-index-width / 2); width: calc(
$title-icon-width + $title--icon-m-r + $title-index-width / 2
);
border-right: $line; border-right: $line;
} }
@ -159,7 +216,7 @@ function hanDel(o:any){
width: 100%; width: 100%;
.structure-item-titile-box { .structure-item-titile-box {
&>* { & > * {
padding-left: 42px; padding-left: 42px;
} }
@ -190,7 +247,7 @@ function hanDel(o:any){
top: 50%; top: 50%;
transform: translate(-50%, -50%); transform: translate(-50%, -50%);
border-radius: 50%; border-radius: 50%;
background: #FFB21E; background: #ffb21e;
text-align: center; text-align: center;
line-height: $height; line-height: $height;
font-weight: 400; font-weight: 400;
@ -217,9 +274,7 @@ function hanDel(o:any){
} }
} }
} }
} }
} }
} }
} }
@ -231,11 +286,11 @@ function hanDel(o:any){
gap: 38px; gap: 38px;
flex-wrap: wrap; flex-wrap: wrap;
&>* { & > * {
border: 1px solid #0052D9; border: 1px solid #0052d9;
font-weight: bold; font-weight: bold;
font-size: 12px; font-size: 12px;
color: #0052D9; color: #0052d9;
} }
} }
@ -249,9 +304,9 @@ function hanDel(o:any){
padding: 2px 8px; padding: 2px 8px;
font-weight: 400; font-weight: 400;
font-size: 12px; font-size: 12px;
color: #0052D9; color: #0052d9;
line-height: 20px; line-height: 20px;
background: #F2F3FF; background: #f2f3ff;
cursor: pointer; cursor: pointer;
border-radius: 3px; border-radius: 3px;
} }
@ -260,17 +315,16 @@ function hanDel(o:any){
white-space: nowrap; white-space: nowrap;
} }
[type=warning].my-tag { [type='warning'].my-tag {
color: #E37318; color: #e37318;
background: #FFF1E9; background: #fff1e9;
} }
} }
.my-button { .my-button {
all: initial; all: initial;
$color-start: #52A1FF; $color-start: #52a1ff;
$color-end: #4255FF; $color-end: #4255ff;
padding: 8px 24px; padding: 8px 24px;
background: linear-gradient(128deg, $color-start 0%, $color-end 100%); background: linear-gradient(128deg, $color-start 0%, $color-end 100%);
box-shadow: 0px 4px 7px 0px rgba(0, 82, 255, 0.27); box-shadow: 0px 4px 7px 0px rgba(0, 82, 255, 0.27);
@ -283,15 +337,27 @@ function hanDel(o:any){
cursor: pointer; cursor: pointer;
&:hover { &:hover {
background: linear-gradient(128deg, lighten($color-start, 5%) 0%, lighten($color-end, 5%) 100%); background: linear-gradient(
128deg,
lighten($color-start, 5%) 0%,
lighten($color-end, 5%) 100%
);
} }
&:active { &:active {
background: linear-gradient(128deg, darken($color-start, 10%) 0%, darken($color-end, 10%) 100%); background: linear-gradient(
128deg,
darken($color-start, 10%) 0%,
darken($color-end, 10%) 100%
);
} }
&:disabled { &:disabled {
background: linear-gradient(128deg, lighten($color-start, 20%) 0%, lighten($color-end, 20%) 100%); background: linear-gradient(
128deg,
lighten($color-start, 20%) 0%,
lighten($color-end, 20%) 100%
);
} }
} }
@ -306,7 +372,5 @@ function hanDel(o:any){
line-height: 24px; line-height: 24px;
text-align: center; text-align: center;
cursor: pointer; cursor: pointer;
} }
</style> </style>

@ -1,4 +1,12 @@
<template> <template>
<<<<<<< HEAD
<div class="course-chapters">
<div class="flex-layout">
<div class="flex-left">
<div class="left" ref="atlasCon">
<!-- 知识图谱 -->
<atlas-ui @hadRouter="handle" />
=======
<div class="course-chapters"> <div class="course-chapters">
<div class="flex-layout"> <div class="flex-layout">
<div class="flex-left"> <div class="flex-left">
@ -14,6 +22,34 @@
<!-- 课程目标 --> <!-- 课程目标 -->
<objective-ui :orogramObjective="orogramObjective" /> <objective-ui :orogramObjective="orogramObjective" />
</div> </div>
<div class="bottom">
<!-- 可折叠基本概念 -->
<fold-info-ui :foldInfoData="foldInfoData" @add="showHide = true" @edit="hanEdit" @del="flodDel" />
<FoldAdd v-model:is-d="showHide" v-if="showHide" :data="foldInfoData" @submit="foldAddSubmit" />
<FoldEdit v-model:is-d="showHide1" v-if="showHide1" :editData="activeEditData" :data="foldInfoData"
@submit="foldEditSubmit" />
</div>
</div>
<div class="flex_right">
<div class="top-container">
<img src="" alt="">
</div>
<div class="bottom-container radius-10">
<!-- 查看资源 -->
<look-resource-ui :lookResource="lookResource" />
</div>
</div>
>>>>>>> d7b4e7a9c5db447232028c52d0cc49bb8a28830e
</div>
<div class="right-top radius-10 vertical-line">
<!-- 计算机导论 -->
<theory-ui :learnInfo="learnInfo" />
</div>
<div class="right-bottom radius-10 vertical-line">
<!-- 课程目标 -->
<objective-ui :orogramObjective="orogramObjective" />
</div>
<div class="bottom"> <div class="bottom">
<!-- 可折叠基本概念 --> <!-- 可折叠基本概念 -->
<fold-info-ui <fold-info-ui
@ -123,6 +159,7 @@ function foldAddSubmit(data: any, updLoading: Function) {
.finally(() => updLoading(false)) .finally(() => updLoading(false))
} }
// //
<<<<<<< HEAD
const foldDelLoading = ref(false) const foldDelLoading = ref(false)
function flodDel(id: string) { function flodDel(id: string) {
foldDelLoading.value = true foldDelLoading.value = true
@ -141,6 +178,22 @@ function flodDel(id: string) {
}) })
}) })
.finally(() => (foldDelLoading.value = false)) .finally(() => (foldDelLoading.value = false))
=======
function flodDel(id: string,setLoading:Function) {
setLoading(true)
deleteSectionApi(id).then(() => {
ElMessage({
message: `删除成功`,
type: 'success'
})
getFold()
}).catch(() => {
ElMessage({
message: `删除失败`,
type: 'error'
})
}).finally(() =>setLoading(false))
>>>>>>> d7b4e7a9c5db447232028c52d0cc49bb8a28830e
} }
// //
const showHide1 = ref(false) const showHide1 = ref(false)

@ -3,23 +3,37 @@ import { ref } from 'vue'
const visibilerDrawer = ref(false) const visibilerDrawer = ref(false)
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { CourseResourceControllerService } from '../../../../generated/services/CourseResourceControllerService' import { CourseResourceControllerService } from '../../../../generated/services/CourseResourceControllerService'
import tool from '@/utils/oss.js'
import { id } from 'element-plus/es/locales.mjs';
// //
const defaultForm = { const defaultForm = {
description: '', description: '',
id: '', id:'',
img: '', // img: '', //
name: '', name: '',
type: '', // type: '', //
path: '', path: '',
} }
const imageUrl = ref('') const imageUrl = ref('')
const onSelectFile = (uploadFile) => { //oss
// console.log(uploadFile) const upload = async (option) =>{
// //
imageUrl.value = URL.createObjectURL(uploadFile.raw) imageUrl.value = URL.createObjectURL(option.raw)
// const res = await tool.oss.upload(option.raw);//
formModel.value.img = uploadFile.raw const url = "https://wenyu132.oss-cn-beijing.aliyuncs.com/" + res.name;//url
console.log(url);
//url
formModel.value.img = url
} }
// const onSelectFile = (uploadFile) => {
// // console.log(uploadFile)
// //
// imageUrl.value = URL.createObjectURL(uploadFile.raw)
// //
// formModel.value.img = uploadFile.raw
// }
// //
const formModel = ref({ const formModel = ref({
@ -184,7 +198,7 @@ defineExpose({
:show-file-list="false" :show-file-list="false"
:auto-upload="false" :auto-upload="false"
:before-upload="beforeAvatarUpload" :before-upload="beforeAvatarUpload"
:on-change="onSelectFile" :on-change="upload"
> >
<img v-if="imageUrl" :src="imageUrl" class="avatar" /> <img v-if="imageUrl" :src="imageUrl" class="avatar" />
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon> <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>

@ -14,6 +14,9 @@ import { LearningRecordsControllerService } from '../../../generated/services/Le
import { CourseResourceControllerService } from '../../../generated/services/CourseResourceControllerService' import { CourseResourceControllerService } from '../../../generated/services/CourseResourceControllerService'
import resourceAdd from './componse/resourceAdd.vue' import resourceAdd from './componse/resourceAdd.vue'
import useUserStore from '@/store/modules/user'
import { onMounted } from 'vue'
const total = ref(0) const total = ref(0)
const pptresourceList = ref([]) const pptresourceList = ref([])
@ -77,20 +80,25 @@ const onDeleteResource = async (ids) => {
ElMessage({ type: 'success', message: '删除成功' }) ElMessage({ type: 'success', message: '删除成功' })
getpptresourceList() getpptresourceList()
} }
const userStore = useUserStore()
onMounted(()=>{
userStore.getUserInfo()
})
const param = ref({ const param = ref({
coursesId: '', coursesId: '',
userId: '1', coursesName: '',
userId: userStore.data.id,
open: '1', open: '1',
download: '0', download: '0',
content: '', content: '',
address: '/portal', address: '/portal',
type: '1', type: '4',
}) })
// //
const generateRecords = async (rescource) => { const generateRecords = async (rescource) => {
param.value.content = rescource.img param.value.content = rescource.img
param.value.coursesId = rescource.id.toString() param.value.coursesId = rescource.id.toString()
param.value.coursesName = rescource.name
await LearningRecordsControllerService.saveRecordsUsingPost1(param.value) await LearningRecordsControllerService.saveRecordsUsingPost1(param.value)
// console.log(param) // console.log(param)
} }

@ -1,9 +1,13 @@
<template> <template>
<div class="info_title"> <div class="info_title">
<div class="title_name">{{ props.title }}</div> <div class="title_name">{{ props.title }}</div>
<!-- <router-link to="`${props.router}`"> -->
<div class="icon"> <div class="icon">
<img :src="ellipsis" @click="handleClick" /> <img :src="ellipsis" @click="router.push(urouter)" />
<!-- <p style="text-decoration: none">查看更多</p> -->
</div> </div>
<!-- </router-link> -->
</div> </div>
<slot name="drawer"></slot> <slot name="drawer"></slot>
</template> </template>
@ -14,18 +18,21 @@ import ellipsis from '@/assets/images/ellipsis.png'
const props = defineProps({ const props = defineProps({
title: String, title: String,
modelValue: Boolean, modelValue: Boolean,
urouter: String,
}) })
const emit = defineEmits(['update:modelValue']) console.log(props.urouter, 'router111')
function handleClick() { import { useRouter } from 'vue-router'
emit('update:modelValue', true) const router = useRouter()
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.info_title { .info_title {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
width: 98%; width: 100%;
height: 32px;
text-decoration: none;
// background-color: blue;
.title_name { .title_name {
font-family: Inter, Inter; font-family: Inter, Inter;
font-weight: 400; font-weight: 400;
@ -39,10 +46,13 @@ function handleClick() {
} }
.icon { .icon {
width: 32px;
height: 32px; height: 32px;
border-radius: 3px 3px 3px 3px; border-radius: 3px 3px 3px 3px;
display: flex; display: flex;
text-decoration: none;
// color: rgba(0, 0, 0, 0.9);
// background-color: #f5f5f5;
font-size: small;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
} }

@ -115,6 +115,6 @@ onMounted(() => {
<style scoped> <style scoped>
.main { .main {
width: 100%; width: 100%;
height: 352px; height: 335px;
} }
</style> </style>

@ -4,9 +4,15 @@ import conheader from '@/views/home/components/ConHeader.vue'
defineProps(['sum']) defineProps(['sum'])
</script> </script>
<template> <template>
<div class="info_container" style="width: 95%; height: 384px"> <div
class="info_container"
style="width: 95%; height: 85%; background: #fff; align-items: center"
>
<conheader :title="`主页访问数据(${sum}次)`"></conheader> <conheader :title="`主页访问数据(${sum}次)`"></conheader>
<div class="info_content" style="width: 75%; height: 100%"> <div
class="info_content"
style="width: 95%; margin-top: 10px; height: 90%; margin-left: -30px"
>
<echarts></echarts> <echarts></echarts>
</div> </div>
</div> </div>
@ -16,14 +22,22 @@ defineProps(['sum'])
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: space-between; justify-content: space-between;
margin-bottom: 20px;
/* justify-content: flex-start; */
} }
.echarts { /* .echarts {
background: #ffffff; background: #ffffff;
box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1); box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1);
border-radius: 6px 6px 6px 6px; border-radius: 6px 6px 6px 6px;
margin-bottom: 16px;
display: flex; display: flex;
justify-content: center; justify-content: start;
align-items: center; align-items: center;
} */
.info_content {
display: flex;
justify-content: start;
align-items: bottom;
background: #fff;
} }
</style> </style>

@ -1,17 +1,30 @@
<script setup> <script setup>
import conheader from '@/views/home/components/ConHeader.vue' import conheader from '@/views/home/components/ConHeader.vue'
import fe from '@/assets/images/fe.jpg' import fe from '@/assets/images/fe.jpg'
import { userLessonListService } from '@/api/user/user.js'
const getLesList = async () => {
const res = await userLessonListService()
console.log(res)
}
getLesList()
</script> </script>
<template> <template>
<div class="lesson_container" style="width: 95%"> <div class="lesson_container" style="width: 95%; height: 90%">
<conheader :title="`课程列表`"></conheader> <conheader
:title="`课程列表`"
:urouter="'/curriculumCenter/basicCourseInformation'"
></conheader>
<div class="lessonlist-content"> <div class="lessonlist-content">
<div class="lessonlist-item" v-for="item in 3" :key="item"> <div class="lessonlist-item" v-for="item in 4" :key="item">
<div class="lessonlist-item-img"> <div class="lessonlist-item-img">
<img :src="fe" alt="" style="width: 100%; height: 140px" /> <img
src="https://wenyu132.oss-cn-beijing.aliyuncs.com/wenyu/UyiQwGiIAHT_3D6dBcGhf.png"
alt=""
style="width: 100%; height: 125px; border-radius: 10px 10px 0px 0px"
/>
</div> </div>
<div class="lessonlist-item-info"> <div class="lessonlist-item-info">
<h3>课程名称</h3> <h3>软件构造</h3>
<div class="p"><p>编辑</p></div> <div class="p"><p>编辑</p></div>
</div> </div>
</div> </div>
@ -21,42 +34,44 @@ import fe from '@/assets/images/fe.jpg'
<style scoped> <style scoped>
.lesson_container { .lesson_container {
/* background-color: purple; */
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: space-between; justify-content: space-between;
margin: 0 auto; margin: 0 auto;
padding: 20px 0; padding: 5px 0;
} }
.lessonlist-content { .lessonlist-content {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: space-between; justify-content: space-between;
margin: 10px 0; margin: 10px 0px;
} }
.lesson_container { .lessonlist-item {
width: 23%;
height: 175px;
border-radius: 10px 10px 0px 0px;
background-color: #fff;
/* background-color: #aeb1b5; */
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: space-between; justify-content: space-between;
margin: 0 auto; border: 1px solid #e8e8f2;
padding: 5px 0; /* border-radius: 6px 6px 6px 6px; */
} /* box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); */
.lessonlist-item {
width: 270px;
height: 200px;
border-radius: 10px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
.lessonlist-item-img {
width: 100%;
height: 140px;
} }
.lessonlist-item-info { .lessonlist-item-info {
padding: 10px; box-sizing: border-box;
display: flex; padding: 6px 5px;
/* background-color: pink; */
/* padding: 10px; */
/* display: flex;
flex-direction: column; flex-direction: column;
justify-content: space-between; justify-content: space-between;
border: 1px solid #e8e8f2; */
/* border: 1px solid #e8e8f2; */
} }
.lessonlist-item-info h3 { .lessonlist-item-info h3 {
font-size: 16px; font-size: 16px;
@ -64,21 +79,24 @@ import fe from '@/assets/images/fe.jpg'
margin-bottom: 5px; margin-bottom: 5px;
} }
.lessonlist-item-info .p { .lessonlist-item-info .p {
width: 100%; /* font-size: 14px;
color: #858689; */
/* width: 100%; */
display: flex; display: flex;
justify-content: end; justify-content: end;
} }
.lessonlist-item-info p { .lessonlist-item-info p {
font-size: 12px; font-size: 12px;
color: #a7c4f7; color: #a7c4f7;
line-height: 1.5; /* line-height: 1.5; */
box-sizing: border-box; box-sizing: border-box;
border: 2px solid #a7c4f7; border: 2px solid #a7c4f7;
border-radius: 10px; border-radius: 10px;
margin-bottom: 5px; /* margin-bottom: 5px; */
width: 50px; width: 50px;
margin: 5px; /* margin: 5px; */
text-align: center; text-align: center;
cursor: pointer; /* cursor: pointer; */
} }
</style> </style>

@ -14,10 +14,11 @@ const props = defineProps({
}, },
}) })
console.log(props.userData, 'props.infoData') // console.log(props.userData.professionalTitle, 'props.infoData')
const imageUrl = ref() const imageUrl = ref()
// //
imageUrl.value = props.data.icon imageUrl.value = props.data.icon
console.log(imageUrl.value, 'img')
// //
const upload = async (option) => { const upload = async (option) => {
const res = await tool.oss.upload(option.file) const res = await tool.oss.upload(option.file)
@ -61,8 +62,8 @@ const formLabelWidth = '60px'
const loading = ref(false) const loading = ref(false)
</script> </script>
<template> <template>
<div class="ident" style="width: 100%; height: 274px; background: #375fff"> <div class="ident" style="width: 100%; height: 100%; background: #375fff">
<div class="info_container" style="width: 201px; height: 178px"> <div class="info_container" style="width: 60%; height: 65%">
<div class="avater"> <div class="avater">
<img <img
:src="imageUrl" :src="imageUrl"
@ -83,7 +84,7 @@ const loading = ref(false)
</el-upload> </el-upload>
<div class="info_content" style="height: 58px" @click="openInfo"> <div class="info_content" style="height: 58px" @click="openInfo">
<div class="name">{{ props.data.username }}</div> <div class="name">{{ props.data.username }}</div>
<!-- <div class="na">{{ props.data.professionalTitle }}</div> --> <div class="na">{{ props.userData.professionalTitle }}</div>
</div> </div>
</div> </div>
</div> </div>
@ -145,6 +146,17 @@ const loading = ref(false)
font-style: normal; font-style: normal;
text-transform: none; text-transform: none;
} }
.na {
/* height: 28px; */
font-family: Inter, Inter;
font-weight: normal;
font-size: 18px;
color: rgba(255, 255, 255, 0.9);
line-height: 24px;
text-align: left;
font-style: normal;
text-transform: none;
}
.iden { .iden {
width: 126px; width: 126px;
height: 22px; height: 22px;
@ -158,10 +170,10 @@ const loading = ref(false)
text-transform: none; text-transform: none;
} }
.avater { .avater {
width: 80px; width: 90px;
height: 80px; height: 90px;
background: #b5c7ff; background: #b5c7ff;
border-radius: 40px 40px 40px 40px; border-radius: 50px 50px 50px 50px;
display: flex; display: flex;
} }
span { span {
@ -180,8 +192,8 @@ span {
top: 18px; top: 18px;
} }
.click { .click {
width: 24px; width: 13%;
height: 24px; height: 13%;
border-radius: 100px 100px 100px 100px; border-radius: 100px 100px 100px 100px;
border: 2px solid #ffffff; border: 2px solid #ffffff;
background: #0052d9; background: #0052d9;
@ -189,7 +201,7 @@ span {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
margin-left: 60px; margin-left: 65px;
margin-top: -60px; margin-top: -50px;
} }
</style> </style>

@ -1,23 +1,35 @@
<script setup> <script setup>
import conheader from '@/views/home/components/ConHeader.vue' import conheader from '@/views/home/components/ConHeader.vue'
import { ref } from 'vue' import { ref, computed } from 'vue'
const name = ['Aa', 'Bb', 'Cc', 'Dd'] import { useRouter } from 'vue-router'
const getRandomColor = () => { import { userStudentListService } from '@/api/user/user'
// import useUserStore from '@/store/modules/user'
return '#' + Math.floor(Math.random() * 16777215).toString(16) const userStore = useUserStore()
} const router = useRouter()
const drawer2 = ref(false) // const router1 = '/studentManagement/student'
const direction = ref('rtl') const loading = ref(false)
function cancelClick() { const stuList = ref([])
drawer2.value = false const img = ref()
} const getStuList = async () => {
function confirmClick() { loading.value = true
drawer2.value = false const res = await userStudentListService(userStore.data.id)
// console.log(res, 'userRes')
stuList.value = res.data
console.log(stuList.value[0].icon, 'rrr')
loading.value = false
} }
getStuList()
</script> </script>
<template> <template>
<div class="info_container" style="width: 90%"> <div
<conheader :title="`学生分组`"></conheader> class="info_container"
style="width: 85%; height: 90%; background: #fff; align-items: center"
>
<conheader
:title="`学生`"
:urouter="'/studentManagement/student'"
></conheader>
<!-- <div>编辑</div> <!-- <div>编辑</div>
<template #drawer> <template #drawer>
<el-drawer v-model="drawer2" :direction="direction"> <el-drawer v-model="drawer2" :direction="direction">
@ -38,21 +50,17 @@ function confirmClick() {
</el-drawer> </el-drawer>
</template> --> </template> -->
<div class="stu_content"> <div class="stu_content" v-loading="loading">
<ul> <ul>
<li v-for="item in 10" :key="item"></li> <li class="stu-item" v-for="(item, index) in stuList" :key="index">
</ul> <img :src="item.icon" class="stu-item-img" />
<div class="stu-item-info">
<h4>{{ item.name }}</h4>
<h4 style="color: #a7a9aa">{{ item.number }}</h4>
</div> </div>
<!-- <div class="info_content" style="width: 194px; height: 112px"> </li>
<div </ul>
v-for="(item, index) in name"
:key="index"
class="stu_color"
:style="{ backgroundColor: getRandomColor() }"
>
{{ item }}
</div> </div>
</div> -->
</div> </div>
</template> </template>
<style scoped> <style scoped>
@ -65,22 +73,56 @@ function confirmClick() {
align-items: center; align-items: center;
} */ } */
.info_container { .info_container {
/* display: flex;
justify-content: space-between; */
}
.stu_content {
height: 86%;
overflow: hidden;
text-overflow: ellipsis;
font-family: 'Microsoft YaHei';
/* background-color: rgb(100, 100, 64); */
}
.stu-item {
margin-top: 20px;
/* height: 100%; */
/* border-radius: 10px; */
/* background-color: #0080ff; */
border-bottom: 1px solid #ededed;
/* border-radius: 10px; */
/* box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); */
box-shadow: 0 0 1px 0 rgba(0, 0, 0, 0.07);
display: flex; display: flex;
padding: 5px;
/* margin: 10px; */
justify-content: space-between; justify-content: space-between;
} }
.stu_content { .stu-item-img {
height: 200px; background-color: yellow;
border-radius: 50%;
width: 40px;
height: 40px;
justify-content: center;
align-items: center;
}
.stu-item-info {
/* margin-left: 15px; */
width: 80%;
height: 40px;
background-color: #ffffff;
display: flex;
flex-direction: column;
justify-content: space-between;
} }
.info_content { h4 {
width: 194px; margin-left: 15px;
height: 112px; font-weight: bold;
flex-wrap: wrap; font-size: 14px;
display: grid; /* font-family: 'soft'; */
grid-template-columns: repeat(3, 1fr); /* color: #000000 */
gap: 24px; /* 设置元素之间的间隔 */
grid-row-gap: 16px;
} }
.stu_color { /* */
/* .stu_color {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
@ -96,7 +138,7 @@ function confirmClick() {
font-style: normal; font-style: normal;
text-transform: none; text-transform: none;
transition: background-color 0.3s; transition: background-color 0.3s;
} } */
.stu_color:hover { .stu_color:hover {
background-color: #f2f2f2; /* 鼠标移入时的背景色变化 */ background-color: #f2f2f2; /* 鼠标移入时的背景色变化 */
filter: brightness(1.1); filter: brightness(1.1);

@ -35,22 +35,35 @@ const dialogFormVisible = ref(false)
const passFormVisible = ref(false) const passFormVisible = ref(false)
//dialog //dialog
const form = ref() const form = ref({})
// { const formLabelWidth = '80px'
// username: '',
// nickName: '',
// phone: '',
// }
form.value = { ...props.userData }
const formLabelWidth = '70px'
//dialog //dialog
const openInfo = () => { const openInfo = () => {
dialogFormVisible.value = true dialogFormVisible.value = true
form.value = { ...props.userData }
} }
const openPass = () => { const openPass = () => {
passFormVisible.value = true passFormVisible.value = true
} }
//
const infoRules = {
phone: [
{ required: true, message: '请输入手机号', trigger: 'blur' },
{
pattern: /^1[3-9]\d{9}$/,
message: '手机号格式不正确',
trigger: 'blur',
},
],
nickName: [
{ required: true, message: '请输入昵称', trigger: 'blur' },
{
pattern: /^[\u4e00-\u9fa5a-zA-Z0-9_]{1,10}$/,
message: '昵称格式不正确',
trigger: 'blur',
},
],
}
// //
const rules = { const rules = {
// //
@ -83,6 +96,8 @@ const rules = {
// { validator: checkNewSame, trigger: 'blur' }, // { validator: checkNewSame, trigger: 'blur' },
], ],
} }
const infoRef = ref()
// //
const emit = defineEmits(['get-message']) const emit = defineEmits(['get-message'])
const changeInfo = async () => { const changeInfo = async () => {
@ -92,13 +107,17 @@ const changeInfo = async () => {
nickName: form.value.nickName, nickName: form.value.nickName,
} }
const jsonData = JSON.stringify(userInfo) const jsonData = JSON.stringify(userInfo)
// const valid = await infoRef.value.validate()
await userChangeService(jsonData).then(() => { await userChangeService(jsonData).then(() => {
ElMessage.success('修改成功') ElMessage.success('修改成功')
// console.log(form.value.nickName, 'nickN') emit('get-message', form.value.nickName)
// emit('get-message', form.value.nickName)
}) })
dialogFormVisible.value = false dialogFormVisible.value = false
} }
const cancleInfo = () => {
dialogFormVisible.value = false
}
// //
const userStore = useUserStore() const userStore = useUserStore()
const onSubmit = async () => { const onSubmit = async () => {
@ -109,21 +128,35 @@ const onSubmit = async () => {
username: props.userData.username, username: props.userData.username,
}) })
await userChangePasswordService(passData.value) await userChangePasswordService(passData.value)
.then(() => {
ElMessage.success('密码修改成功') ElMessage.success('密码修改成功')
pwdForm.value = {}
passFormVisible.value = false passFormVisible.value = false
})
.catch((error) => {
console.log(error, 'error')
ElMessage.error(error.response.data.message)
})
pwdForm.value = {}
} }
// //
const onReset = () => { const onReset = () => {
pwdForm.value = {} pwdForm.value = {}
} }
const cancleInfo = () => { //
dialogFormVisible.value = false const checkOldSame = (rule, value, callback) => {
form.value = { if (value === props.userData.password) {
...props.data, callback(new Error('新密码不能与旧密码相同'))
} else {
callback()
}
}
const checkNewSame = (rule, value, cb) => {
if (value !== pwdForm.value.new_pwd) {
cb(new Error('新密码和确认再次输入的新密码不一样!'))
} else {
cb()
} }
} }
const username = computed(() => { const username = computed(() => {
if (props.userData.nickName) { if (props.userData.nickName) {
return props.userData.nickName return props.userData.nickName
@ -148,7 +181,6 @@ onMounted(() => {
const millisecondsPerDay = 1000 * 60 * 60 * 24 const millisecondsPerDay = 1000 * 60 * 60 * 24
daysOnJob.value = Math.floor((currentDate - hireDate) / millisecondsPerDay) daysOnJob.value = Math.floor((currentDate - hireDate) / millisecondsPerDay)
}) })
//
</script> </script>
<template> <template>
<div class="nav_info"> <div class="nav_info">
@ -178,14 +210,18 @@ onMounted(() => {
title="登录信息" title="登录信息"
style="width: 800px; text-align: center" style="width: 800px; text-align: center"
> >
<el-form :model="form" :data="form" :rules="rules"> <el-form :rules="infoRules" ref="infoRef" :model="form">
<el-form-item label="用户名" :label-width="formLabelWidth"> <el-form-item
label="用户名"
:label-width="formLabelWidth"
prop="username"
>
<el-input :disabled="true" v-model="form.username" autocomplete="off" /> <el-input :disabled="true" v-model="form.username" autocomplete="off" />
</el-form-item> </el-form-item>
<el-form-item label="昵称" :label-width="formLabelWidth"> <el-form-item label="昵称" :label-width="formLabelWidth" porp="nickName">
<el-input v-model="form.nickName" autocomplete="off" /> <el-input v-model="form.nickName" autocomplete="off" />
</el-form-item> </el-form-item>
<el-form-item label="手机" :label-width="formLabelWidth"> <el-form-item label="手机" :label-width="formLabelWidth" porp="phone">
<el-input v-model="form.phone" autocomplete="off" /> <el-input v-model="form.phone" autocomplete="off" />
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -199,16 +235,28 @@ onMounted(() => {
<el-dialog <el-dialog
v-model="passFormVisible" v-model="passFormVisible"
title="修改密码" title="修改密码"
style="width: 700px; text-align: center" style="width: 800px; text-align: center"
> >
<el-form :rules="rules" ref="formRef" :data="pwdForm"> <el-form :rules="rules" ref="formRef" :data="pwdForm">
<el-form-item label="原密码"> <el-form-item label="原密码" prop="old_pwd" :label-width="formLabelWidth">
<el-input type="password" v-model="pwdForm.old_pwd"></el-input> <el-input
type="password"
v-model="pwdForm.old_pwd"
show-password
></el-input>
</el-form-item> </el-form-item>
<el-form-item label="新密码" prop="new_pwd"> <el-form-item label="新密码" prop="new_pwd" :label-width="formLabelWidth">
<el-input type="password" v-model="pwdForm.new_pwd"></el-input> <el-input
type="password"
v-model="pwdForm.new_pwd"
show-password
></el-input>
</el-form-item> </el-form-item>
<el-form-item label="确认新密码" prop="re_pwd"> <el-form-item
label="确认密码"
prop="re_pwd"
:label-width="formLabelWidth"
>
<el-input type="password" v-model="pwdForm.re_pwd"></el-input> <el-input type="password" v-model="pwdForm.re_pwd"></el-input>
</el-form-item> </el-form-item>
</el-form> </el-form>

@ -13,12 +13,15 @@ import { userNewLikeService } from '@/api/user/user'
import useUserStore from '@/store/modules/user' import useUserStore from '@/store/modules/user'
import fe from '@/assets/images/fe.jpg' import fe from '@/assets/images/fe.jpg'
import { ref, onMounted } from 'vue' import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'
const router = useRouter()
const userStore = useUserStore() const userStore = useUserStore()
const username = ref() const username = ref()
const data = ref({}) const data = ref({})
const infoData = ref() const infoData = ref()
const flag = ref(false) const flag = ref(false)
const role = ref(null) const role = ref(null)
const loading = ref(false)
const rightVisible = ref(false) const rightVisible = ref(false)
userStore.getUserInfo().catch((error) => { userStore.getUserInfo().catch((error) => {
console.log(error) console.log(error)
@ -34,8 +37,10 @@ const getAvater = (avater) => {
userStore.data.icon = avater userStore.data.icon = avater
// console.log(data.value.icon, 'icon') // console.log(data.value.icon, 'icon')
} }
const courselist = ref([])
const img = ref() const img = ref()
const courseName = ref() const courseName = ref()
const courseTea = ref()
onMounted(() => { onMounted(() => {
// getData() // getData()
sum = parseInt(sum) + 1 sum = parseInt(sum) + 1
@ -60,19 +65,13 @@ onMounted(() => {
// // console.log(res, '') // // console.log(res, '')
// }) // })
// //
// const courselist = ref({ img: '', name: '' }) const res = userNewLikeService(userStore.data.id).then((res) => {
// const img = ref() console.log(res.data.id, '最新收藏的课程')
// const courseName = ref() courselist.value = res.data
// console.log(courselist.value.id, 'course')
userNewLikeService(userStore.data.id).then((res) => {
console.log(res.data, '最新收藏的课程')
// courselist.value = res.data
// courselist.value.img = res.data.img
// courselist.value.name = res.data.name
img.value = res.data.img img.value = res.data.img
courseName.value = res.data.name courseName.value = res.data.name
console.log(img.value, 'img') courseTea.value = res.data.teacher
console.log(courseName.value, 'courseName')
}) })
}) })
</script> </script>
@ -112,11 +111,23 @@ onMounted(() => {
<div class="lesson"> <div class="lesson">
<a <a
href="#" href="#"
style="width: 90%; font-size: 14px; display: flex; margin: 0 auto" style="
font-size: 14px;
display: flex;
margin: 0px auto;
margin: 0px 30px;
"
> >
<conheader :title="`最多收藏知识点`"></conheader> <conheader
:title="`学习最多知识点`"
:urouter="'/curriculumCenter/knowledgePoints'"
></conheader>
</a> </a>
<p class="button" round v-for="item in 10" :key="item">Ro</p> <div class="con">
<p class="button" round v-for="item in 30" :key="item">
Spring clould
</p>
</div>
</div> </div>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
@ -127,7 +138,9 @@ onMounted(() => {
> >
<conheader :title="`推荐知识点`"></conheader> <conheader :title="`推荐知识点`"></conheader>
</a> </a>
<p class="button" round v-for="item in 20" :key="item">Round</p> <div class="con">
<p class="button" round v-for="item in 30" :key="item">Roshabei</p>
</div>
</div> </div>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
@ -138,36 +151,37 @@ onMounted(() => {
> >
<conheader :title="`推荐课程`"></conheader> <conheader :title="`推荐课程`"></conheader>
</a> </a>
<div class="con">
<div class="lessonlist-content"> <ul>
<div class="lessonlist-item"> <li class="lessonlist-item" v-for="item in 4" :key="item">
<div class="lessonlist-item-img"> <img :src="img" class="lessonlist-item-img" />
<img :src="fe" alt="" style="width: 100%; height: 140px" />
</div>
<div class="lessonlist-item-info"> <div class="lessonlist-item-info">
<h3>课程名称</h3> <h5>{{ courseName }}</h5>
</div> <p>{{ courseTea }}</p>
</div> </div>
</li>
</ul>
</div> </div>
</div> </div>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<div class="lesson"> <div class="lesson" v-loading="loading">
<a <a
href="#" href="#"
style="width: 90%; font-size: 14px; display: flex; margin: 0 auto" style="width: 90%; font-size: 12px; display: flex; margin: 0 auto"
> >
<conheader :title="`最新收藏课程`"></conheader> <conheader :title="`最新收藏课程`"></conheader>
</a> </a>
<div class="lessonlist-content"> <div class="con">
<div class="lessonlist-item"> <ul>
<div class="lessonlist-item-img"> <li class="lessonlist-item" v-for="item in courselist" :key="item">
<img :src="img" alt="" style="width: 100%; height: 140px" /> <img :src="img" class="lessonlist-item-img" />
</div>
<div class="lessonlist-item-info"> <div class="lessonlist-item-info">
<h3>{{ courseName }}</h3> <h5>{{ courseName }}</h5>
</div> <p>{{ courseTea }}</p>
</div> </div>
</li>
</ul>
</div> </div>
</div> </div>
</el-col> </el-col>
@ -184,42 +198,11 @@ onMounted(() => {
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
<!-- <div class="left">
<div class="nav">
<welcome
:data="infoData"
:userData="data"
:name="name"
v-if="flag"
></welcome>
</div>
<div class="info" style="width: 100%; height: 368px">
<Info :data="infoData" v-if="flag"></Info>
</div>
<div class="echarts" style="width: 100%; height: 444px">
<echarts :sum="sum"></echarts>
</div>
</div>
<div v-if="rightVisible" class="right">
<status :data="data" @get-message="getMessage" v-if="flag"></status>
<div class="class" style="width: 100%; height: 388px">
<Class1></Class1>
</div>
<div class="stu" style="width: 100%; height: 236px">
<Student1></Student1>
</div>
</div>
<div v-else class="right">
<status :data="data" v-if="flag"></status>
<div class="class" style="width: 100%; height: 388px">
<Class2></Class2>
</div>
<div class="stu" style="width: 100%; height: 236px">
<Student2></Student2>
</div>
</div> -->
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
* {
box-sizing: border-box;
}
.nav { .nav {
height: 92px; height: 92px;
background: #ffffff; background: #ffffff;
@ -233,11 +216,13 @@ onMounted(() => {
} }
.classList, .classList,
.info { .info {
// background-color: yellow;
height: 270px; height: 270px;
background: #ffffff; background: #ffffff;
box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1); box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1);
border-radius: 6px 6px 6px 6px; border-radius: 6px 6px 6px 6px;
justify-content: space-between; justify-content: space-between;
align-items: center;
margin-bottom: 16px; margin-bottom: 16px;
} }
.classList { .classList {
@ -245,107 +230,156 @@ onMounted(() => {
justify-content: space-between; justify-content: space-between;
} }
.lesson { .lesson {
// background-color: pink;
padding-top: 5px;
margin-bottom: 16px; margin-bottom: 16px;
height: 280px; height: 290px;
background: #ffffff; background: #ffffff;
box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1); box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1);
border-radius: 6px 6px 6px 6px; border-radius: 6px 6px 6px 6px;
overflow: hidden;
text-overflow: ellipsis;
// flex-direction: column;
}
.con {
display: flex; display: flex;
// justify-content: center; // justify-content: space-between;
align-items: center; // height: 100%;
// align-items: center;
// margin: 0 auto; // margin: 0 auto;
// background-color: yellow;
padding: 5px;
margin-top: 5px;
flex-wrap: wrap; flex-wrap: wrap;
// flex-direction: column; justify-content: space-evenly;
.button { padding-bottom: 30px;
margin-top: 10px; }
.button {
justify-content: space-between;
margin-bottom: 5px;
height: 30px; height: 30px;
border-radius: 10px; border-radius: 10px;
color: #0080ff; // color: #0080ff;
text-align: center; text-align: center;
line-height: 30px; line-height: 30px;
margin: 0 10px; margin: 5px 10px;
border: 2px solid #ccc; border: 2px solid #ccc;
} }
a { a {
text-decoration: none; text-decoration: none;
}
} }
.some, .some,
.stu { .stu {
height: 384px; padding-top: 5px;
height: 380px;
// background: #9f7b7b;
background: #ffffff; background: #ffffff;
box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1); box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1);
border-radius: 6px 6px 6px 6px; border-radius: 6px 6px 6px 6px;
justify-content: space-between; justify-content: space-between;
display: flex; display: flex;
justify-content: center; justify-content: center;
}
.lessonlist-content {
display: flex;
justify-content: center;
align-items: center; align-items: center;
margin: 0 auto;
flex-direction: column;
}
.lessonlist-item {
width: 270px;
height: 180px;
border-radius: 10px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
} }
.lessonlist-item-img { // .lessonlist-content {
// display: flex;
// justify-content: center;
// align-items: center;
// margin: 0 auto;
// flex-direction: column;
// }
ul {
width: 100%; width: 100%;
height: 140px; height: 100%;
display: flex;
flex-direction: column;
// justify-content: center; // justify-content: center;
align-items: center; // align-items: center;
margin: 0 auto;
} }
.lessonlist-item-info { .lessonlist-item {
padding: 10px; height: 50px;
// margin: 0 auto;
border-radius: 10px;
// background-color: #0080ff;
box-shadow: 0 0 2px rgba(0, 0, 0, 0.1);
display: flex; display: flex;
padding: 5px;
margin: 5px;
justify-content: space-between; justify-content: space-between;
// align-items: center;
} }
.lessonlist-item-img {
.lesson_container { width: 17%;
display: flex; height: 40px;
flex-direction: column; justify-content: center;
justify-content: space-between; align-items: center;
margin: 0 auto;
padding: 5px 0;
} }
.lessonlist-item-info { .lessonlist-item-info {
padding: 10px; margin-left: 5px;
width: 80%;
height: 40px;
background-color: #ffffff;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: space-between; justify-content: space-evenly;
} h3 {
.lessonlist-item-info h3 {
font-size: 16px;
font-weight: bold; font-weight: bold;
margin-bottom: 5px; }
} p {
.lessonlist-item-info .p { // display: flex;
width: 100%; // justify-content: end;
display: flex; font-size: small;
justify-content: end; color: #a0a5ab;
} }
.lessonlist-item-info p {
font-size: 12px;
color: #a7c4f7;
line-height: 1.5;
box-sizing: border-box;
border: 2px solid #a7c4f7;
border-radius: 10px;
margin-bottom: 5px;
width: 50px;
margin: 5px;
text-align: center;
cursor: pointer;
} }
// .lesson_container {
// display: flex;
// flex-direction: column;
// justify-content: space-between;
// margin: 0 auto;
// padding: 5px 0;
//
// .lesson_container {
// display: flex;
// flex-direction: column;
// justify-content: space-between;
// margin: 0 auto;
// padding: 5px 0;
// }
// .lessonlist-item-info {
// padding: 10px;
// display: flex;
// flex-direction: column;
// justify-content: space-between;
// }
// .lessonlist-item-info h3 {
// font-size: 16px;
// font-weight: bold;
// margin-bottom: 5px;
// }
// .lessonlist-item-info .p {
// width: 100%;
// display: flex;
// justify-content: end;
// }
// .lessonlist-item-info p {
// font-size: 12px;
// color: #a7c4f7;
// line-height: 1.5;
// box-sizing: border-box;
// border: 2px solid #a7c4f7;
// border-radius: 10px;
// margin-bottom: 5px;
// width: 50px;
// margin: 5px;
// text-align: center;
// cursor: pointer;
// }
// .container { // .container {
// display: flex; // display: flex;
// width: 100%; // width: 100%;

@ -399,7 +399,6 @@ watch(isToggle, () => {
const passwordMatchError = ref('') const passwordMatchError = ref('')
const checkPasswordMatch = () => { const checkPasswordMatch = () => {
if (formModel.value.password !== formModel.value.repassword) { if (formModel.value.password !== formModel.value.repassword) {
// passwordMatchError.value = ''
ElMessage('两次输入的密码不一致') ElMessage('两次输入的密码不一致')
} else { } else {
passwordMatchError.value = '' passwordMatchError.value = ''

Loading…
Cancel
Save