style:换图片

This commit is contained in:
Wxp 2025-08-19 23:40:22 +08:00
parent f06aef9913
commit 2ddc067ebc
28 changed files with 214 additions and 126 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 724 B

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 438 B

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 858 B

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 808 B

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 364 B

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 479 B

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 392 B

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -19,6 +19,6 @@
</template>
<script setup lang="ts">
function open() {
window.location.href = 'http://110.42.96.65:55613/demo/'
window.location.href = 'http://103.40.14.23:25538/demo/'
}
</script>

View File

@ -19,6 +19,6 @@
</template>
<script setup lang="ts">
function open() {
window.location.href = 'http://110.42.96.65:55611/'
window.location.href = 'http://103.40.14.23:25539/'
}
</script>

View File

@ -22,6 +22,6 @@
</template>
<script setup lang="ts">
function open() {
window.location.href = 'http://110.42.96.65:55612/'
window.location.href = 'http://103.40.14.23:25537/'
}
</script>

View File

@ -22,6 +22,6 @@
</template>
<script setup lang="ts">
function open() {
window.location.href = 'http://110.42.96.65:55610/'
window.location.href = 'http://103.40.14.23:25540/llm'
}
</script>

View File

@ -64,7 +64,8 @@
<div class="header-actions">
<!-- 切换语言 -->
<div class="action-item language-switcher" @click="toggleLanguageDropdown" ref="languageSwitcherRef">
<img src="/nav-icons/矩形.png" alt="" class="action-icon" />
<img src="/nav-icons/矩形.png" alt="" class="action-icon default-icon" />
<img src="/nav-icons/矩形-选中.png" alt="" class="action-icon hover-icon" />
<span>{{ t('header.languageSwitch') }}</span>
<div v-if="showLanguageDropdown" class="language-dropdown">
<div class="language-option" @click.stop="switchLanguage('zh')">
@ -78,13 +79,15 @@
<!-- 学习中心 -->
<div class="action-item" @click="handleLearningCenter">
<img src="/nav-icons/学习中心.png" alt="" class="action-icon" />
<img src="/nav-icons/学习中心.png" alt="" class="action-icon default-icon" />
<img src="/nav-icons/学习中心-选中.png" alt="" class="action-icon hover-icon" />
<span>{{ t('header.learningCenter') }}</span>
</div>
<!-- 管理端 -->
<div class="action-item">
<img src="/nav-icons/管理端.png" alt="" class="action-icon" />
<img src="/nav-icons/管理端.png" alt="" class="action-icon default-icon" />
<img src="/nav-icons/管理端-选中.png" alt="" class="action-icon hover-icon" />
<span>{{ t('header.management') }}</span>
</div>
@ -101,8 +104,11 @@
<div v-else class="user-menu">
<n-dropdown :options="userMenuOptions" @select="handleUserMenuSelect">
<div class="user-info">
<SafeAvatar :src="userStore.user?.avatar" :name="userStore.user?.profile?.realName || userStore.user?.nickname || userStore.user?.username" :size="32" />
<span class="username">{{ userStore.user?.profile?.realName || userStore.user?.nickname || userStore.user?.username }}</span>
<SafeAvatar :src="userStore.user?.avatar"
:name="userStore.user?.profile?.realName || userStore.user?.nickname || userStore.user?.username"
:size="32" />
<span class="username">{{ userStore.user?.profile?.realName || userStore.user?.nickname ||
userStore.user?.username }}</span>
</div>
</n-dropdown>
</div>
@ -331,58 +337,71 @@ onUnmounted(() => {
height: 64px;
background: white;
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 1001;
}
top: 0;
left: 0;
right: 0;
z-index: 1001;
}
/* Logo区域 */
.logo-section {
flex-shrink: 0;
margin-right: 40px;
}
/* Logo区域 */
.logo-section {
flex-shrink: 0;
margin-right: 40px;
}
.logo {
display: flex;
align-items: center;
cursor: pointer;
gap: 8px;
}
.logo {
display: flex;
align-items: center;
cursor: pointer;
gap: 8px;
}
.logo:hover {
opacity: 0.8;
}
.logo:hover {
opacity: 0.8;
}
.logo-image {
width: 72px;
height: 61px;
object-fit: contain;
}
.logo-image {
width: 72px;
height: 61px;
object-fit: contain;
}
.nav-icon {
max-width: 12px;
max-height: 12px;
width: auto;
height: auto;
margin-right: 4px;
object-fit: contain;
}
.nav-icon {
max-width: 12px;
max-height: 12px;
width: auto;
height: auto;
margin-right: 4px;
object-fit: contain;
}
/* AI图标样式 */
.ai-icon {
max-width: 34px;
max-height: 34px;
margin-right: 0;
}
/* AI图标样式 */
.ai-icon {
max-width: 34px;
max-height: 34px;
margin-right: 0;
}
.action-icon {
max-width: 18px;
max-height: 18px;
width: auto;
height: auto;
object-fit: contain;
}
.action-icon {
max-width: 18px;
max-height: 18px;
width: auto;
height: auto;
object-fit: contain;
}
/* 图标悬停效果 */
.action-item .hover-icon {
display: none;
}
.action-item:hover .default-icon {
display: none;
}
.action-item:hover .hover-icon {
display: block;
}

View File

@ -12,9 +12,11 @@
<!-- 左侧侧边栏 -->
<div class="block_14">
<!-- 用户头像和姓名 -->
<SafeAvatar class="image_7" :src="userStore.user?.avatar" :name="userStore.user?.profile?.realName || userStore.user?.nickname || userStore.user?.username || '用户'" :size="96"
alt="用户头像" />
<span class="text_72">{{ userStore.user?.profile?.realName || userStore.user?.nickname || userStore.user?.username || '用户名' }}</span>
<SafeAvatar class="image_7" :src="userStore.user?.avatar"
:name="userStore.user?.profile?.realName || userStore.user?.nickname || userStore.user?.username || '用户'"
:size="96" alt="用户头像" />
<span class="text_72">{{ userStore.user?.profile?.realName || userStore.user?.nickname ||
userStore.user?.username || '用户名' }}</span>
<!-- 菜单项容器 -->
<div class="box_22">
@ -23,73 +25,66 @@
<!-- 我的课程 -->
<div :class="['image-text_19', { active: activeTab === 'courses' }]" @click="handleMenuSelect('courses')">
<img class="image_8" referrerpolicy="no-referrer" :src="activeTab === 'courses'
? '/images/profile/course-active.png'
: '/images/profile/course.png'" />
<img class="image_8 default-icon" referrerpolicy="no-referrer" src="/images/profile/course.png" />
<img class="image_8 hover-icon" referrerpolicy="no-referrer" src="/images/profile/course-active.png" />
<span class="text-group_19">我的课程</span>
</div>
<!-- 我的作业 -->
<div :class="['image-text_20', { active: activeTab === 'homework' }]" @click="handleMenuSelect('homework')">
<img class="label_4" referrerpolicy="no-referrer" :src="activeTab === 'homework'
? '/images/profile/grade-active.png'
: '/images/profile/grade.png'" />
<img class="label_4 default-icon" referrerpolicy="no-referrer" src="/images/profile/grade.png" />
<img class="label_4 hover-icon" referrerpolicy="no-referrer" src="/images/profile/grade-active.png" />
<span class="text-group_20">我的作业</span>
</div>
<!-- 我的考试 -->
<div :class="['image-text_21', { active: activeTab === 'exam' }]" @click="handleMenuSelect('exam')">
<img class="label_5" referrerpolicy="no-referrer" :src="activeTab === 'exam'
? '/images/profile/checklist-active.png'
: '/images/profile/checklist.png'" />
<img class="label_5 default-icon" referrerpolicy="no-referrer" src="/images/profile/checklist.png" />
<img class="label_5 hover-icon" referrerpolicy="no-referrer" src="/images/profile/checklist-active.png" />
<span class="text-group_21">我的考试</span>
</div>
<!-- 我的练习 -->
<div :class="['image-text_22', { active: activeTab === 'practice' }]" @click="handleMenuSelect('practice')">
<img class="label_6" referrerpolicy="no-referrer" :src="activeTab === 'practice'
? '/images/profile/bookmark-active.png'
: '/images/profile/bookmark.png'" />
<img class="label_6 default-icon" referrerpolicy="no-referrer" src="/images/profile/bookmark.png" />
<img class="label_6 hover-icon" referrerpolicy="no-referrer" src="/images/profile/bookmark-active.png" />
<span class="text-group_22">我的练习</span>
</div>
<!-- 我的活动 -->
<div :class="['image-text_23', { active: activeTab === 'activity' }]" @click="handleMenuSelect('activity')">
<img class="thumbnail_40" referrerpolicy="no-referrer" :src="activeTab === 'activity'
? '/images/profile/gift-active.png'
: '/images/profile/gift.png'" />
<img class="thumbnail_40 default-icon" referrerpolicy="no-referrer" src="/images/profile/gift.png" />
<img class="thumbnail_40 hover-icon" referrerpolicy="no-referrer" src="/images/profile/gift-active.png" />
<span class="text-group_23">我的活动</span>
</div>
<!-- 我的关注 -->
<div :class="['image-text_27', { active: activeTab === 'follows' }]" @click="handleMenuSelect('follows')">
<img class="thumbnail_42" referrerpolicy="no-referrer" :src="activeTab === 'follows'
? '/images/profile/concern-active.png'
: '/images/profile/concern.png'" />
<img class="thumbnail_42 default-icon" referrerpolicy="no-referrer" src="/images/profile/concern.png" />
<img class="thumbnail_42 hover-icon" referrerpolicy="no-referrer"
src="/images/profile/concern-active.png" />
<span class="text-group_27">我的关注</span>
</div>
<!-- 我的消息 -->
<div :class="['image-text_24', { active: activeTab === 'message' }]" @click="handleMenuSelect('message')">
<img class="label_7" referrerpolicy="no-referrer" :src="activeTab === 'message'
? '/images/profile/message-active.png'
: '/images/profile/message.png'" />
<img class="label_7 default-icon" referrerpolicy="no-referrer" src="/images/profile/message.png" />
<img class="label_7 hover-icon" referrerpolicy="no-referrer" src="/images/profile/message-active.png" />
<span class="text-group_24">我的消息</span>
</div>
<!-- 我的资料 -->
<div :class="['image-text_25', { active: activeTab === 'materials' }]" @click="handleMenuSelect('materials')">
<img class="image_9" referrerpolicy="no-referrer" :src="activeTab === 'materials'
? '/images/profile/profile-active.png'
: '/images/profile/profile.png'" />
<img class="image_9 default-icon" referrerpolicy="no-referrer" src="/images/profile/profile.png" />
<img class="image_9 hover-icon" referrerpolicy="no-referrer" src="/images/profile/profile-active.png" />
<span class="text-group_25">我的资料</span>
</div>
<!-- 我的下载 -->
<div :class="['image-text_26', { active: activeTab === 'download' }]" @click="handleMenuSelect('download')">
<img class="thumbnail_41" referrerpolicy="no-referrer" :src="activeTab === 'download'
? '/images/profile/download-active.png'
: '/images/profile/download.png'" />
<img class="thumbnail_41 default-icon" referrerpolicy="no-referrer" src="/images/profile/download.png" />
<img class="thumbnail_41 hover-icon" referrerpolicy="no-referrer"
src="/images/profile/download-active.png" />
<span class="text-group_26">我的下载</span>
</div>
</div>
@ -187,7 +182,7 @@
<!-- 作业内容 -->
<div v-else-if="isHomeworkTab" class="homework-content">
<!-- 作业筛选标签 -->
<div class="text-wrapper_1 flex-row">
<div v-if="!showDraftBoxView" class="text-wrapper_1 flex-row">
<span class="text_12" :class="{ active: activeHomeworkTab === 'all' }"
@click="handleHomeworkTabChange('all')">全部作业</span>
<span class="text_13" :class="{ active: activeHomeworkTab === 'pending' }"
@ -200,7 +195,7 @@
</span>
</div>
<!-- 分割线 -->
<div class="course-divider"></div>
<div v-if="!showDraftBoxView" class="course-divider"></div>
<!-- 面包屑 -->
<!-- <div class="breadcrumb-wrapper flex-row">
@ -211,13 +206,13 @@
<!-- 作业详情视图 -->
<div v-if="showDetailView && detailAssignment">
<div class="detail-header">
<!-- <div class="detail-header">
<div class="breadcrumb-nav">
<span class="breadcrumb-item" @click="backToAssignmentList">全部作业</span>
<span class="breadcrumb-separator">></span>
<span class="breadcrumb-current">作业名称</span>
</div>
</div>
</div> -->
<div class="group_11">
<!-- 头部信息 -->
@ -238,13 +233,14 @@
fontSize: '14px'
}">
{{ detailAssignment.status === '未完成' || detailAssignment.status === '待提交' ? '未完成' :
(detailAssignment.status === '已完成' ? '已完成' : '541人已完成') }}
(detailAssignment.status === '已完成' ? '已完成' : '541人已完成') }}
</span>
</span>
</div>
<!-- 作业内容 -->
<div class="text-group_4">
<div class="course-divider"></div>
<span class="text_33">{{ detailAssignment.title }}</span>
<div class="description-container">
<span class="text_34 description-full-view">
@ -854,12 +850,10 @@
<div class="avatar-section">
<div class="avatar-container">
<SafeAvatar :src="userStore.user?.avatar"
:name="userStore.user?.profile?.realName || userStore.user?.nickname || userStore.user?.username || '用户'" :size="68" alt="用户头像"
class="user-avatar-large" />
:name="userStore.user?.profile?.realName || userStore.user?.nickname || userStore.user?.username || '用户'"
:size="68" alt="用户头像" class="user-avatar-large" />
<div class="avatar-edit-btn">
<img
src="https://lanhu-oss-2537-2.lanhuapp.com/SketchPngf31d99a65996c8c8ed0d6b2446b4176a30b16838933c10b800a735d092717c57"
alt="编辑头像" class="edit-icon" />
<img src="/images/auth/revise.png" alt="编辑头像" class="edit-icon" />
</div>
</div>
</div>
@ -957,8 +951,8 @@
<!-- 面包屑导航或筛选和操作区域 -->
<div v-if="isInSubDirectory" class="breadcrumb-controls">
<div class="breadcrumb-nav">
<span class="breadcrumb-text" @click="goBack">课件&gt;图片&gt;</span>
<span class="breadcrumb-current">风景图片</span>
<span class="breadcrumb-text" @click="goBack">{{ currentPath.join(' > ') }} ></span>
<span class="breadcrumb-current">{{ currentPath[currentPath.length - 1] || '文件夹' }}</span>
</div>
</div>
@ -979,7 +973,7 @@
<input v-model="downloadFilter.keyword" type="text" class="search-input" placeholder="请输入文件名称" />
<button class="search-btn">
<img
src="https://lanhu-oss-2537-2.lanhuapp.com/SketchPng870a86da8af58a60f35fcb27ef4822e645d2ad5aaabe6416e4179342a53a5a60"
src="/images/profile/search.png"
alt="搜索图标" class="search-icon" />
</button>
</div>
@ -997,7 +991,8 @@
<div class="files-grid"
:class="{ 'subdirectory-grid': isInSubDirectory, 'certificate-grid': activeDownloadTab === 'certificate', 'homework-grid': activeDownloadTab === 'homework' }">
<div v-for="file in filteredDownloadFiles" :key="file.id" class="file-item"
:class="{ 'subdirectory-item': isInSubDirectory }" @click="handleFileClick(file)">
:class="{ 'subdirectory-item': isInSubDirectory }" @dblclick="handleFolderDoubleClick(file)"
@click="handleFileClick(file)">
<div class="file-menu">
<button class="file-menu-btn" @click.stop="toggleFileMenu(file.id)">
<img src="/images/profile/more.png" alt="更多操作" class="more-icon" />
@ -2486,6 +2481,11 @@ const handleDownloadTabChange = (tab: string) => {
//
const filteredDownloadFiles = computed(() => {
//
if (isInSubDirectory.value) {
return []
}
let files = downloadFiles.filter(file => file.category === activeDownloadTab.value)
if (downloadFilter.type !== 'all') {
@ -2507,10 +2507,16 @@ const toggleFileMenu = (fileId: number) => {
}
const handleFileClick = (file: any) => {
if (file.type === 'folder' && file.name === '图片') {
//
//
console.log('单击文件:', file.name)
}
const handleFolderDoubleClick = (file: any) => {
if (file.type === 'folder') {
//
isInSubDirectory.value = true
currentPath.value = ['课件', '图片']
currentPath.value = ['课件', file.name]
console.log('进入文件夹:', file.name)
}
}
@ -2541,7 +2547,7 @@ const getFileIcon = (fileId?: number) => {
return 'https://lanhu-oss-2537-2.lanhuapp.com/SketchPngf45333052202c303acc2c06223c26b820d330459ce2d452a21a3132fbbeab442'
} else {
//
return 'https://lanhu-oss-2537-2.lanhuapp.com/SketchPng5548891b00234027dbe6dadafbd83596d616261421c0587a85652dc194b2d5ef'
return '/images/profile/folder.png'
}
}
@ -2689,10 +2695,10 @@ const viewAssignmentDetail = (assignment: Assignment) => {
}
//
const backToAssignmentList = () => {
showDetailView.value = false
detailAssignment.value = null
}
// const backToAssignmentList = () => {
// showDetailView.value = false
// detailAssignment.value = null
// }
//
const showUploadFromDetail = () => {
@ -2967,7 +2973,7 @@ onActivated(() => {
/* 自适应高度 */
min-height: 3vh;
/* 设置最小高度,让盒子更大 */
margin: 1.5vh;
margin: .5vh;
/* 减小间距从2.34vh减少到1.5vh */
display: flex;
align-items: center;
@ -3076,6 +3082,68 @@ onActivated(() => {
/* 悬停时蓝色 */
}
/* 菜单项图标悬停效果 */
.image-text_19 .hover-icon,
.image-text_20 .hover-icon,
.image-text_21 .hover-icon,
.image-text_22 .hover-icon,
.image-text_23 .hover-icon,
.image-text_24 .hover-icon,
.image-text_25 .hover-icon,
.image-text_26 .hover-icon,
.image-text_27 .hover-icon {
display: none;
}
.image-text_19:hover .default-icon,
.image-text_20:hover .default-icon,
.image-text_21:hover .default-icon,
.image-text_22:hover .default-icon,
.image-text_23:hover .default-icon,
.image-text_24:hover .default-icon,
.image-text_25:hover .default-icon,
.image-text_26:hover .default-icon,
.image-text_27:hover .default-icon {
display: none;
}
.image-text_19:hover .hover-icon,
.image-text_20:hover .hover-icon,
.image-text_21:hover .hover-icon,
.image-text_22:hover .hover-icon,
.image-text_23:hover .hover-icon,
.image-text_24:hover .hover-icon,
.image-text_25:hover .hover-icon,
.image-text_26:hover .hover-icon,
.image-text_27:hover .hover-icon {
display: block;
}
/* 激活状态的图标显示 */
.image-text_19.active .default-icon,
.image-text_20.active .default-icon,
.image-text_21.active .default-icon,
.image-text_22.active .default-icon,
.image-text_23.active .default-icon,
.image-text_24.active .default-icon,
.image-text_25.active .default-icon,
.image-text_26.active .default-icon,
.image-text_27.active .default-icon {
display: none;
}
.image-text_19.active .hover-icon,
.image-text_20.active .hover-icon,
.image-text_21.active .hover-icon,
.image-text_22.active .hover-icon,
.image-text_23.active .hover-icon,
.image-text_24.active .hover-icon,
.image-text_25.active .hover-icon,
.image-text_26.active .hover-icon,
.image-text_27.active .hover-icon {
display: block;
}
/* 右侧课程列表区域 */
.group_5 {
width: 65vw;
@ -4186,9 +4254,8 @@ onActivated(() => {
}
.course-name {
margin-top: 10px;
margin-left: 83px;
color: #999999;
margin-left: 0px;
color: #497087;
}
.course-name span {
@ -5745,6 +5812,7 @@ onActivated(() => {
line-height: 1.4;
padding: 0 1.04vw;
/* 添加左右内边距 */
font-weight: 600;
}
.activity-details {
@ -6172,7 +6240,7 @@ onActivated(() => {
/* height: 5.21vh; */
padding: 0.52vh 0.57vw;
/* 100px转换为vh进一步增加高度 */
background: url('https://lanhu-oss-2537-2.lanhuapp.com/SketchPng9491a7fe5bdac8e8a88de63907163bd6b8a259824f56a3c76784ba6cdc7bc32b') 100% no-repeat;
background: #F5F8FB;
background-size: 100% 100%;
margin-top: 0.26vh;
/* 5px转换为vh */
@ -7043,6 +7111,7 @@ onActivated(() => {
}
.account-display {
padding-left: 15px;
width: 100%;
height: 41px;
background: #F5F8FB;
@ -7609,7 +7678,7 @@ onActivated(() => {
/* 4px转换为vw减小图标和文字间距 */
padding: 0.52vh 0.73vw;
/* 10px 14px转换 */
font-size: 10px;
font-size: 14px;
/* 14px转换为vw */
font-family: Helvetica, 'Microsoft YaHei', Arial, sans-serif;
color: #000;
@ -7620,9 +7689,9 @@ onActivated(() => {
}
.menu-icon {
width: 12px;
/* 24px转换为vw增加一倍 */
height: 12px;
width: 18px;
/* 84px转换为vw增加一倍 */
height: 18px;
/* 24px转换为vh增加一倍 */
object-fit: contain;
flex-shrink: 0;
@ -7643,13 +7712,13 @@ onActivated(() => {
}
.file-icon {
width: 5.21vw;
width: 131px;
/* 100px转换为vw */
height: 5.21vw;
height: 131px;
/* 100px转换为vw */
margin-top: 4.56vh;
margin-left: 0.5vw;
margin-top: 1.5vh;
/* 30px转换为vh增加顶部间距图片下移 */
margin-left: 1.26vh;
display: flex;
align-items: center;
justify-content: center;