..
This commit is contained in:
@@ -239,7 +239,6 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
$(document).on("pjax:complete", function () {
|
||||
NProgress.done()
|
||||
$("#sub-app-container-main-content").show()
|
||||
setContentTitle()
|
||||
})
|
||||
|
||||
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
<!--g2plot-->
|
||||
<script src="${base!}/assets/platform/plugins/g2plot/g2plot.min.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/goober@2.1.10/dist/goober.umd.js"></script>
|
||||
<!-- <script src="https://cdn.jsdelivr.net/npm/goober@2.1.10/dist/goober.umd.js"></script>-->
|
||||
|
||||
<script>
|
||||
window._AMapSecurityConfig = {
|
||||
|
||||
@@ -604,7 +604,7 @@
|
||||
<header class="v4-header">
|
||||
<div class="v4-left-section">
|
||||
<div class="v4-logo-container">
|
||||
<img src="https://i.cug.edu.cn/data/sys-attach/download/1i843ts1nwl3w2n5iw31ohn2n10cripk3gw0" alt="Logo" class="v4-logo" />
|
||||
<img src="${AppLogo!}" alt="Logo" class="v4-logo" />
|
||||
</div>
|
||||
|
||||
<nav class="v4-nav">
|
||||
|
||||
@@ -318,7 +318,7 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
|
||||
/* 右侧活动列表 */
|
||||
.oa-activity-content {
|
||||
padding: 20px;
|
||||
/*padding: 20px;*/
|
||||
background: #ffffff;
|
||||
max-height: 410px;
|
||||
display: flex;
|
||||
@@ -354,7 +354,7 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
}
|
||||
|
||||
.oa-activity-tab:hover {
|
||||
color: #4a90e2;
|
||||
color: #4a90e2;
|
||||
}
|
||||
|
||||
.oa-activity-tab.active {
|
||||
@@ -377,10 +377,10 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
/* 活动轮播样式 */
|
||||
.oa-activity-carousel {
|
||||
flex: 1;
|
||||
margin-top: 15px;
|
||||
/*margin-top: 15px;*/
|
||||
}
|
||||
|
||||
.oa-activity-carousel .el-carousel,.oa-activity-carousel .el-carousel .el-carousel__container {
|
||||
.oa-activity-carousel .el-carousel, .oa-activity-carousel .el-carousel .el-carousel__container {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
@@ -481,17 +481,26 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
|
||||
/* box2 - 系统通知公告 */
|
||||
.oa-box-2-section {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 400px;
|
||||
gap: 30px;
|
||||
border-radius: 6px;
|
||||
width: 1500px;
|
||||
margin: 30px auto 0;
|
||||
background: #ffffff;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.oa-box-2-section-act {
|
||||
background: #ffffff;
|
||||
}
|
||||
|
||||
|
||||
.oa-notice-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 20px;
|
||||
background: #ffffff;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
@@ -509,17 +518,19 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
left: 0;
|
||||
right: 0;
|
||||
height: 2px;
|
||||
background-color: #000000;
|
||||
background-color: var(--color-primary);
|
||||
}
|
||||
|
||||
.oa-notice-header-icon {
|
||||
font-size: 24px;
|
||||
color: var(--color-primary);
|
||||
}
|
||||
|
||||
.oa-notice-header-title {
|
||||
font-size: 20px;
|
||||
font-weight: 600;
|
||||
margin: 0;
|
||||
color: var(--color-primary);
|
||||
}
|
||||
|
||||
.oa-notice-header-more {
|
||||
@@ -556,7 +567,16 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
|
||||
|
||||
.oa-notice-content {
|
||||
padding: 10px;
|
||||
padding: 20px;
|
||||
background: #ffffff;
|
||||
max-height: 400px;
|
||||
overflow-y: auto;
|
||||
scrollbar-width: none; /* Firefox */
|
||||
-ms-overflow-style: none; /* IE and Edge */
|
||||
}
|
||||
|
||||
.oa-notice-content::-webkit-scrollbar {
|
||||
display: none; /* Chrome, Safari and Opera */
|
||||
}
|
||||
|
||||
.oa-notice-list {
|
||||
@@ -591,9 +611,28 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.oa-notice-item-img {
|
||||
width: 300px;
|
||||
height: 150px;
|
||||
flex-shrink: 0;
|
||||
margin-right: 12px;
|
||||
}
|
||||
|
||||
.oa-notice-item-img img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
.oa-notice-item-content {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
height: 150px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
/*padding: 10px 0;*/
|
||||
}
|
||||
|
||||
.oa-notice-item-title {
|
||||
@@ -612,10 +651,40 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
font-size: 14px;
|
||||
color: #666;
|
||||
line-height: 1.5;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 2;
|
||||
-webkit-box-orient: vertical;
|
||||
overflow: hidden;
|
||||
margin-bottom: 8px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.oa-notice-item-desc i {
|
||||
/*color: var(--color-primary);*/
|
||||
font-size: 14px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.oa-notice-item-detail {
|
||||
margin-top: auto;
|
||||
}
|
||||
|
||||
.oa-detail-link {
|
||||
color: var(--color-primary);
|
||||
font-size: 14px;
|
||||
cursor: pointer;
|
||||
transition: color 0.2s ease;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.oa-detail-link i {
|
||||
font-size: 12px;
|
||||
transition: transform 0.2s ease;
|
||||
}
|
||||
|
||||
.oa-detail-link:hover i {
|
||||
transform: translateX(2px);
|
||||
}
|
||||
|
||||
.oa-notice-item-date {
|
||||
@@ -625,6 +694,157 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
/*推荐服务*/
|
||||
.oa-box-2-section-recommend {
|
||||
padding: 20px;
|
||||
background: #ffffff;
|
||||
}
|
||||
|
||||
.oa-recommend-tabs {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.oa-recommend-tab-header {
|
||||
display: flex;
|
||||
border-bottom: 2px solid #f0f0f0;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.oa-recommend-tab-btn {
|
||||
background: none;
|
||||
border: none;
|
||||
padding: 12px 24px;
|
||||
font-size: 16px;
|
||||
color: #666;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
border-bottom: 2px solid transparent;
|
||||
margin-bottom: -2px;
|
||||
}
|
||||
|
||||
.oa-recommend-tab-btn:hover {
|
||||
color: var(--color-primary);
|
||||
}
|
||||
|
||||
.oa-recommend-tab-btn.active {
|
||||
color: var(--color-primary);
|
||||
border-bottom-color: var(--color-primary);
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.oa-recommend-tab-btn i {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.oa-recommend-tab-content {
|
||||
min-height: 200px;
|
||||
}
|
||||
|
||||
.oa-recommend-content {
|
||||
width: 100%;
|
||||
max-height: 400px;
|
||||
overflow-y: auto;
|
||||
scrollbar-width: none; /* Firefox */
|
||||
-ms-overflow-style: none; /* IE and Edge */
|
||||
}
|
||||
|
||||
.oa-recommend-content::-webkit-scrollbar {
|
||||
display: none; /* Chrome, Safari and Opera */
|
||||
}
|
||||
|
||||
.oa-recommend-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.oa-recommend-item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
padding: 20px 16px;
|
||||
background: #f8f9fa;
|
||||
border-radius: 8px;
|
||||
transition: all 0.2s ease;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.oa-recommend-item:hover {
|
||||
background: #e9ecef;
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.oa-recommend-item-icon {
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
background: var(--color-primary);
|
||||
border-radius: 8px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin-bottom: 12px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.oa-recommend-item-icon i {
|
||||
color: white;
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
.oa-recommend-item-info {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.oa-recommend-item-info h4 {
|
||||
margin: 0;
|
||||
font-size: 16px;
|
||||
font-weight: 500;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.oa-recommend-item-info p {
|
||||
margin: 0;
|
||||
font-size: 14px;
|
||||
color: #666;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
/* 空数据提示样式 */
|
||||
.oa-empty-state {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 60px 20px;
|
||||
text-align: center;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.oa-empty-state-icon {
|
||||
font-size: 48px;
|
||||
color: #ddd;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.oa-empty-state-title {
|
||||
font-size: 16px;
|
||||
color: #666;
|
||||
margin-bottom: 8px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.oa-empty-state-desc {
|
||||
font-size: 14px;
|
||||
color: #999;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
|
||||
</style>
|
||||
|
||||
<div class="oa-container" id="v4-home-app">
|
||||
@@ -634,10 +854,7 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
<div class="oa-hero-section">
|
||||
<!-- 背景图 -->
|
||||
<div class="oa-background-image">
|
||||
<img
|
||||
src="https://i.cpu.edu.cn/mnews/_upload/article/images/ed/dc/eff0e4b84ee6b2d7e770ed1de071/0f515087-45e3-4dbf-acf4-e7096d6cbdc0.jpg"
|
||||
alt=""
|
||||
/>
|
||||
<img src="${config.AppHomeImg!}" alt=""/>
|
||||
</div>
|
||||
|
||||
<!-- 搜索和统计区域 -->
|
||||
@@ -647,7 +864,7 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
<!-- <h1 class="oa-search-title">精业济群</h1>-->
|
||||
<div class="oa-search-container">
|
||||
<input type="text" class="oa-search-input" placeholder="请输入您要查询的关键字"
|
||||
v-model="searchQuery" />
|
||||
v-model="searchQuery"/>
|
||||
<button class="oa-search-btn" @click="performSearch">搜索</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -739,16 +956,16 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
|
||||
<!-- 右侧活动列表 -->
|
||||
<div class="oa-activity-content">
|
||||
<div class="oa-activity-header">
|
||||
<div class="oa-activity-tabs">
|
||||
<div class="oa-activity-tab" :class="{active: activeTab === 'recent'}"
|
||||
@click="setActiveTab('recent')">最新活动
|
||||
</div>
|
||||
<div class="oa-activity-tab" :class="{active: activeTab === 'history'}"
|
||||
@click="setActiveTab('history')">历史活动
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="oa-activity-header">-->
|
||||
<!-- <div class="oa-activity-tabs">-->
|
||||
<!-- <div class="oa-activity-tab" :class="{active: activeTab === 'recent'}"-->
|
||||
<!-- @click="setActiveTab('recent')">最新活动-->
|
||||
<!-- </div>-->
|
||||
<!-- <div class="oa-activity-tab" :class="{active: activeTab === 'history'}"-->
|
||||
<!-- @click="setActiveTab('history')">历史活动-->
|
||||
<!-- </div>-->
|
||||
<!-- </div>-->
|
||||
<!-- </div>-->
|
||||
<div class="oa-activity-carousel">
|
||||
<div v-if="currentActivityList.length === 0" class="oa-no-activity">
|
||||
<div class="oa-no-activity-icon">
|
||||
@@ -763,9 +980,7 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
<el-carousel-item v-for="activity in currentActivityList" :key="activity.id">
|
||||
<div class="oa-activity-card">
|
||||
<div class="oa-activity-image">
|
||||
<img
|
||||
src="https://images.unsplash.com/photo-1517245386807-bb43f82c33c4?w=800&auto=format&fit=crop"
|
||||
:alt="activity.name" />
|
||||
<img :src="activity.cover" :alt="activity.name"/>
|
||||
<div class="oa-activity-overlay">
|
||||
<div class="oa-activity-title">{{ activity.name }}</div>
|
||||
<div class="oa-activity-meta">{{ activity.startDate }} ~ {{ activity.endDate
|
||||
@@ -782,31 +997,121 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
|
||||
<!-- box2 - 系统通知公告 -->
|
||||
<div class="oa-box-2-section">
|
||||
<div class="oa-notice-header">
|
||||
<div class="oa-notice-header-content">
|
||||
<div class="oa-notice-header-icon">
|
||||
<i class="fa fa-bullhorn"></i>
|
||||
<div class="oa-box-2-section-act">
|
||||
<div class="oa-notice-header">
|
||||
<div class="oa-notice-header-content">
|
||||
<div class="oa-notice-header-icon">
|
||||
<i class="fa fa-users"></i>
|
||||
</div>
|
||||
<h2 class="oa-notice-header-title">工会活动</h2>
|
||||
</div>
|
||||
<div class="oa-notice-header-more">
|
||||
<!-- <button class="oa-header-more-btn">-->
|
||||
<!-- 更多-->
|
||||
<!-- <i class="fa fa-angle-right"></i>-->
|
||||
<!-- </button>-->
|
||||
</div>
|
||||
<h2 class="oa-notice-header-title">系统通知公告</h2>
|
||||
</div>
|
||||
<div class="oa-notice-header-more">
|
||||
<button class="oa-header-more-btn">
|
||||
更多
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="oa-notice-content">
|
||||
<div class="oa-notice-list">
|
||||
<div v-for="notice in noticeList" :key="notice.id" class="oa-notice-item" @click="viewNotice(notice)">
|
||||
<div class="oa-notice-item-icon">
|
||||
<div class="oa-notice-content">
|
||||
<div v-if="recentActivities && recentActivities.length > 0" class="oa-notice-list">
|
||||
<div v-for="notice in recentActivities" :key="notice.id" class="oa-notice-item"
|
||||
@click="viewNotice(notice)">
|
||||
<!-- <div class="oa-notice-item-icon">
|
||||
<i class="fa fa-bullhorn"></i>
|
||||
</div> -->
|
||||
<div class="oa-notice-item-img">
|
||||
<img :src="notice.cover" alt="">
|
||||
</div>
|
||||
<div class="oa-notice-item-content">
|
||||
<div class="oa-notice-item-title">{{ notice.name }}</div>
|
||||
<div class="oa-notice-item-desc">
|
||||
<i class="fa fa-calendar-o"></i>
|
||||
开始时间:{{ formatDate(notice.startDate) }}
|
||||
</div>
|
||||
<div class="oa-notice-item-desc">
|
||||
<i class="fa fa-calendar-check-o"></i>
|
||||
结束时间:{{ formatDate(notice.endDate) }}
|
||||
</div>
|
||||
<div class="oa-notice-item-detail">
|
||||
<span class="oa-detail-link" @click.stop="openActivity(notice)">
|
||||
立即前往
|
||||
<i class="fa fa-arrow-right"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="oa-notice-item-date">{{ notice.publishDate }}</div> -->
|
||||
</div>
|
||||
</div>
|
||||
<div v-else class="oa-empty-state">
|
||||
<div class="oa-empty-state-icon">
|
||||
<i class="fa fa-bullhorn"></i>
|
||||
</div>
|
||||
<div class="oa-notice-item-content">
|
||||
<div class="oa-notice-item-title">{{ notice.title }}</div>
|
||||
<div class="oa-notice-item-desc">{{ notice.content }}</div>
|
||||
<div class="oa-empty-state-title">暂无通知公告</div>
|
||||
<div class="oa-empty-state-desc">当前没有可显示的通知公告内容<br>请稍后再来查看</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="oa-box-2-section-recommend">
|
||||
<div class="oa-recommend-tabs">
|
||||
<div class="oa-recommend-tab-header">
|
||||
<button
|
||||
class="oa-recommend-tab-btn"
|
||||
:class="{ active: recommendTab === 'service' }"
|
||||
@click="setRecommendTab('service')">
|
||||
<i class="fa fa-cogs"></i>
|
||||
推荐服务
|
||||
</button>
|
||||
<button
|
||||
class="oa-recommend-tab-btn"
|
||||
:class="{ active: recommendTab === 'app' }"
|
||||
@click="setRecommendTab('app')">
|
||||
<i class="fa fa-th-large"></i>
|
||||
推荐应用
|
||||
</button>
|
||||
</div>
|
||||
<div class="oa-recommend-tab-content">
|
||||
<div v-if="recommendTab === 'service'" class="oa-recommend-content">
|
||||
<div v-if="recommendServices && recommendServices.length > 0" class="oa-recommend-grid">
|
||||
<div class="oa-recommend-item" v-for="service in recommendServices" :key="service.id" @click="openService(service)">
|
||||
<div class="oa-recommend-item-icon">
|
||||
<img v-if="service.picIcon" :src="service.picIcon" :alt="service.name" style="width: 32px; height: 32px; object-fit: cover;">
|
||||
<i v-else-if="service.icon" :class="service.icon"></i>
|
||||
<i v-else class="fa fa-cog"></i>
|
||||
</div>
|
||||
<div class="oa-recommend-item-info">
|
||||
<h4>{{ service.name }}</h4>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else class="oa-empty-state">
|
||||
<div class="oa-empty-state-icon">
|
||||
<i class="fa fa-cog"></i>
|
||||
</div>
|
||||
<div class="oa-empty-state-title">暂无推荐服务</div>
|
||||
<div class="oa-empty-state-desc">当前没有可用的推荐服务<br>请联系管理员添加服务内容</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="recommendTab === 'app'" class="oa-recommend-content">
|
||||
<div v-if="recommendApps && recommendApps.length > 0" class="oa-recommend-grid">
|
||||
<div class="oa-recommend-item" v-for="app in recommendApps" :key="app.id" @click="openApp(app)">
|
||||
<div class="oa-recommend-item-icon">
|
||||
<img v-if="app.picIcon" :src="app.picIcon" :alt="app.name" style="width: 32px; height: 32px; object-fit: cover;">
|
||||
<i v-else-if="app.icon" :class="app.icon"></i>
|
||||
<i v-else class="fa fa-cube"></i>
|
||||
</div>
|
||||
<div class="oa-recommend-item-info">
|
||||
<h4>{{ app.name }}</h4>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else class="oa-empty-state">
|
||||
<div class="oa-empty-state-icon">
|
||||
<i class="fa fa-cube"></i>
|
||||
</div>
|
||||
<div class="oa-empty-state-title">暂无推荐应用</div>
|
||||
<div class="oa-empty-state-desc">当前没有可用的推荐应用<br>请联系管理员添加应用内容</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="oa-notice-item-date">{{ notice.publishDate }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -822,6 +1127,7 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
searchQuery: "",
|
||||
activeTab: "recent",
|
||||
noticeTab: "system",
|
||||
recommendTab: "service",
|
||||
currentIndex: 0,
|
||||
stats: {
|
||||
todo: 3,
|
||||
@@ -830,30 +1136,130 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
started: 9
|
||||
},
|
||||
activityList: [],
|
||||
noticeList: [
|
||||
noticeList: [],
|
||||
recommendServices: [
|
||||
{
|
||||
id: 1,
|
||||
type: 'system',
|
||||
title: '系统维护通知',
|
||||
content: '系统将于本周六晚上22:00-24:00进行例行维护,期间可能影响正常使用,请提前做好相关准备。',
|
||||
publishDate: '2024-01-15',
|
||||
isRead: false
|
||||
name: "人事服务",
|
||||
description: "员工信息管理、考勤统计、薪资查询",
|
||||
icon: "fa fa-users",
|
||||
picIcon: "/static/assets/platform/images/service-hr.png"
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
type: 'announcement',
|
||||
title: '新功能上线公告',
|
||||
content: '移动端应用已正式上线,支持手机端办公审批,欢迎大家下载使用。',
|
||||
publishDate: '2024-01-14',
|
||||
isRead: true
|
||||
name: "财务服务",
|
||||
description: "报销申请、费用审批、财务报表",
|
||||
icon: "fa fa-calculator"
|
||||
},
|
||||
{
|
||||
id: 3,
|
||||
type: 'urgent',
|
||||
title: '紧急安全提醒',
|
||||
content: '近期发现钓鱼邮件攻击,请勿点击可疑链接,如有疑问请联系IT部门。',
|
||||
publishDate: '2024-01-13',
|
||||
isRead: false
|
||||
name: "IT服务",
|
||||
description: "设备申请、故障报修、系统支持",
|
||||
icon: "fa fa-laptop",
|
||||
picIcon: "/static/assets/platform/images/service-it.png"
|
||||
},
|
||||
{
|
||||
id: 4,
|
||||
name: "行政服务",
|
||||
description: "会议室预订、办公用品申请、车辆管理",
|
||||
icon: "fa fa-building"
|
||||
},
|
||||
{
|
||||
id: 5,
|
||||
name: "培训服务",
|
||||
description: "员工培训、技能提升、证书管理",
|
||||
icon: "fa fa-graduation-cap"
|
||||
},
|
||||
{
|
||||
id: 6,
|
||||
name: "法务服务",
|
||||
description: "合同审核、法律咨询、风险评估",
|
||||
icon: "fa fa-gavel"
|
||||
},
|
||||
{
|
||||
id: 7,
|
||||
name: "采购服务",
|
||||
description: "供应商管理、采购申请、合同管理",
|
||||
icon: "fa fa-shopping-cart"
|
||||
},
|
||||
{
|
||||
id: 8,
|
||||
name: "质量服务",
|
||||
description: "质量检测、标准制定、改进建议",
|
||||
icon: "fa fa-check-circle"
|
||||
},
|
||||
{
|
||||
id: 9,
|
||||
name: "安全服务",
|
||||
description: "安全培训、风险评估、应急预案"
|
||||
},
|
||||
{
|
||||
id: 10,
|
||||
name: "客服服务",
|
||||
description: "客户咨询、投诉处理、满意度调查",
|
||||
icon: "fa fa-headphones"
|
||||
}
|
||||
],
|
||||
recommendApps: [
|
||||
{
|
||||
id: 1,
|
||||
name: "移动办公",
|
||||
description: "随时随地处理工作事务",
|
||||
icon: "fa fa-mobile",
|
||||
picIcon: "/static/assets/platform/images/app-mobile.png"
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
name: "项目管理",
|
||||
description: "高效协作,项目进度一目了然",
|
||||
icon: "fa fa-tasks"
|
||||
},
|
||||
{
|
||||
id: 3,
|
||||
name: "文档中心",
|
||||
description: "企业知识库,文档共享平台",
|
||||
picIcon: "/static/assets/platform/images/app-docs.png"
|
||||
},
|
||||
{
|
||||
id: 4,
|
||||
name: "视频会议",
|
||||
description: "高清视频通话,远程协作无障碍",
|
||||
icon: "fa fa-video-camera"
|
||||
},
|
||||
{
|
||||
id: 5,
|
||||
name: "邮件系统",
|
||||
description: "企业邮箱,高效沟通协作",
|
||||
icon: "fa fa-envelope"
|
||||
},
|
||||
{
|
||||
id: 6,
|
||||
name: "考勤打卡",
|
||||
description: "智能考勤,工时统计管理"
|
||||
},
|
||||
{
|
||||
id: 7,
|
||||
name: "报销系统",
|
||||
description: "便捷报销,财务审批流程",
|
||||
icon: "fa fa-credit-card"
|
||||
},
|
||||
{
|
||||
id: 8,
|
||||
name: "通讯录",
|
||||
description: "企业通讯录,联系人管理",
|
||||
icon: "fa fa-address-book"
|
||||
},
|
||||
{
|
||||
id: 9,
|
||||
name: "日程管理",
|
||||
description: "日程安排,时间管理助手",
|
||||
icon: "fa fa-calendar"
|
||||
},
|
||||
{
|
||||
id: 10,
|
||||
name: "数据分析",
|
||||
description: "数据可视化,业务分析报表",
|
||||
icon: "fa fa-bar-chart"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -879,6 +1285,8 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
// 初始化数据
|
||||
this.getActivity()
|
||||
this.getStatistics()
|
||||
this.getRecommendService()
|
||||
this.getRecommendApp()
|
||||
},
|
||||
methods: {
|
||||
performSearch() {
|
||||
@@ -887,10 +1295,24 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
// 实现搜索逻辑
|
||||
}
|
||||
},
|
||||
formatDate(dateStr) {
|
||||
if (!dateStr) return ''
|
||||
const date = new Date(dateStr)
|
||||
return date.toLocaleDateString('zh-CN', {
|
||||
year: 'numeric',
|
||||
month: '2-digit',
|
||||
day: '2-digit'
|
||||
})
|
||||
},
|
||||
setActiveTab(tab) {
|
||||
this.activeTab = tab
|
||||
this.currentIndex = 0 // 切换标签时重置索引
|
||||
},
|
||||
setRecommendTab(tab) {
|
||||
this.recommendTab = tab
|
||||
},
|
||||
|
||||
// 获取活动列表
|
||||
getActivity() {
|
||||
$.get("/platform/home/listHomeActivity").then((res) => {
|
||||
if (res.code === 0) {
|
||||
@@ -905,16 +1327,19 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
// 这里可以添加查看详情的逻辑
|
||||
},
|
||||
|
||||
handleStatClick(val){
|
||||
if(['todo', 'done', 'application']){
|
||||
// 待办、已办、消息、我的点击
|
||||
handleStatClick(val) {
|
||||
if (['todo', 'done', 'application']) {
|
||||
window.open('/flow/todoCenter?status=' + val)
|
||||
}
|
||||
},
|
||||
|
||||
// 获取流程统计
|
||||
async getStatistics() {
|
||||
try {
|
||||
const res = await $.post("/flow/todoCenter/statistics")
|
||||
if (res.code === 0) {
|
||||
const { todoCount, doneCount, startedCount } = res.data
|
||||
const {todoCount, doneCount, startedCount} = res.data
|
||||
this.stats.todo = todoCount
|
||||
this.stats.done = doneCount
|
||||
this.stats.started = startedCount
|
||||
@@ -925,6 +1350,48 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
}
|
||||
},
|
||||
|
||||
// 活动点击
|
||||
openActivity(act) {
|
||||
if (!act.url) {
|
||||
this.$message.warning("管理员未配置活动链接")
|
||||
return
|
||||
}
|
||||
window.open(act.url)
|
||||
},
|
||||
|
||||
// 查询推荐服务
|
||||
async getRecommendService() {
|
||||
|
||||
|
||||
this.$axios.post('/platform/home/listRecommendService', {platform: "PC"}).then(res => {
|
||||
if (res.code === 0) {
|
||||
this.recommendServices = res.data
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
// 获取推荐应用
|
||||
async getRecommendApp() {
|
||||
this.$axios.post('/platform/home/listRecommendApp', {platform: "PC"}).then(res => {
|
||||
if (res.code === 0) {
|
||||
this.recommendApps = res.data
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
// 推荐服务点击事件
|
||||
openService(service) {
|
||||
window.open(service.href)
|
||||
},
|
||||
|
||||
// 推荐应用点击事件
|
||||
openApp(app) {
|
||||
// 储存到缓存
|
||||
window.sessionStorage.setItem("zhgh_sub_app", JSON.stringify(app))
|
||||
// 新标签页打开
|
||||
window.open("/platform/v4/subApp?appId=" + app.id, "_blank")
|
||||
}
|
||||
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
@@ -322,17 +322,17 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
|
||||
<div class="apps-wrapper" id="app">
|
||||
<div class="apps-hero">
|
||||
<img src="https://i.cug.edu.cn/data/sys-attach/download/1i8hmpaqdwmvwajjvw2c8isi61jj0gkmosw0" alt="应用中心" />
|
||||
<img src="https://i.cug.edu.cn/data/sys-attach/download/1i8hmpaqdwmvwajjvw2c8isi61jj0gkmosw0" alt="应用中心"/>
|
||||
</div>
|
||||
|
||||
<div class="apps-container">
|
||||
<!-- Left Sidebar -->
|
||||
<div class="apps-sidebar">
|
||||
<div
|
||||
v-for="category in allCategories"
|
||||
:key="category.id"
|
||||
:class="['apps-sidebar-item', activeCategory === category.id ? 'active' : '']"
|
||||
@click="changeCategory(category.id)"
|
||||
v-for="category in allCategories"
|
||||
:key="category.id"
|
||||
:class="['apps-sidebar-item', activeCategory === category.id ? 'active' : '']"
|
||||
@click="changeCategory(category.id)"
|
||||
>
|
||||
<i :class="category.icon"></i>
|
||||
{{ category.name }}
|
||||
@@ -344,7 +344,7 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
<div class="apps-header">
|
||||
<div class="apps-search-container">
|
||||
<div class="apps-search">
|
||||
<input type="text" v-model="searchKeyword" @keyup.enter="search" placeholder="请输入内容" />
|
||||
<input type="text" v-model="searchKeyword" @keyup.enter="search" placeholder="请输入内容"/>
|
||||
<i class="el-icon-search search-icon" @click="search"></i>
|
||||
</div>
|
||||
</div>
|
||||
@@ -353,12 +353,14 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
<div class="apps-filter">
|
||||
<div class="apps-filter-title">首字母:</div>
|
||||
<div class="apps-filter-tags alphabet-filter">
|
||||
<div :class="['filter-tag', activeAlphabet === '' ? 'active' : '']" @click="changeAlphabet('')">全部</div>
|
||||
<div :class="['filter-tag', activeAlphabet === '' ? 'active' : '']" @click="changeAlphabet('')">
|
||||
全部
|
||||
</div>
|
||||
<div
|
||||
v-for="letter in alphabets"
|
||||
:key="letter"
|
||||
:class="['alphabet-item', activeAlphabet === letter ? 'active' : '']"
|
||||
@click="changeAlphabet(letter)"
|
||||
v-for="letter in alphabets"
|
||||
:key="letter"
|
||||
:class="['alphabet-item', activeAlphabet === letter ? 'active' : '']"
|
||||
@click="changeAlphabet(letter)"
|
||||
>
|
||||
{{ letter }}
|
||||
</div>
|
||||
@@ -404,7 +406,7 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
// 应用列表
|
||||
applications: [],
|
||||
// 分类列表
|
||||
categories: [{ id: "all", name: "全部服务", icon: "fa fa-th-large" }],
|
||||
categories: [{id: "all", name: "全部服务", icon: "fa fa-th-large"}],
|
||||
// 动态加载的分类
|
||||
dynamicCategories: [],
|
||||
// 当前选中的分类
|
||||
@@ -486,8 +488,8 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
this.activeCategory === "all"
|
||||
? ""
|
||||
: this.activeCategory === "favorites" || this.activeCategory === "recommended"
|
||||
? this.activeCategory
|
||||
: this.activeCategory,
|
||||
? this.activeCategory
|
||||
: this.activeCategory,
|
||||
letter: this.activeAlphabet,
|
||||
keyword: this.searchKeyword
|
||||
}
|
||||
@@ -541,7 +543,7 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
if (!app) return
|
||||
|
||||
const url = app.isFavorite ? "/platform/v4/serv/removeFavorite" : "/platform/v4/serv/addFavorite"
|
||||
const params = { appId: appId }
|
||||
const params = {appId: appId}
|
||||
|
||||
$.post(url, params)
|
||||
.then((result) => {
|
||||
@@ -585,8 +587,11 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
// 打开应用
|
||||
openApp(app) {
|
||||
console.log(app)
|
||||
// 新标签页打开
|
||||
window.open("/flow/common/approval/form?defineKey=" + app.name, "_blank")
|
||||
if (!app.instanceUrl) {
|
||||
this.$message.warning("管理员未配置服务地址")
|
||||
return
|
||||
}
|
||||
window.open(app.instanceUrl, "_blank")
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user