uniapp-app/pages_app/myApplication/myApplication.vue
2025-09-16 16:19:29 +08:00

421 lines
9.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="my-application-page">
<!-- 顶部导航栏 -->
<uni-nav-bar
left-icon="left"
title="我的应用"
@clickLeft="goBack"
fixed
color="#8B2316"
height="140rpx"
:border="false"
backgroundColor="#eeeeee"
>
<template #right>
<text class="edit-btn" @click="toggleEdit">{{
isEditMode ? "完成" : "编辑"
}}</text>
</template>
</uni-nav-bar>
<scroll-view class="content" scroll-y>
<!-- 我的应用部分 -->
<view class="section">
<view class="section-title">我的应用</view>
<view class="app-grid">
<view
class="app-item"
v-for="(app, index) in myApps"
:key="app.id"
@click="openApp(app)"
>
<view
class="iconbox"
v-if="isEditMode"
@click.stop="removeFromMyApps(index)"
>
<up-icon
name="minus-circle"
color="#fe0001"
size="40rpx"
></up-icon>
</view>
<view class="app-icon">
<image :src="app.icon" mode="aspectFit" class="icon-image" />
</view>
<text class="app-name">{{ app.name }}</text>
</view>
</view>
</view>
<!-- 常用功能部分 -->
<view class="section">
<view class="section-title">常用功能</view>
<view class="app-grid">
<view
class="app-item"
v-for="(app, index) in commonApps"
:key="app.id"
@click="openApp(app)"
>
<view
class="iconbox"
@click.stop="addToMyApps(app)"
v-if="isEditMode"
>
<up-icon
name="plus-circle"
color="#067fe6"
size="40rpx"
></up-icon>
</view>
<view class="app-icon">
<image :src="app.icon" mode="aspectFit" class="icon-image" />
</view>
<text class="app-name">{{ app.name }}</text>
</view>
</view>
</view>
</scroll-view>
</view>
</template>
<script setup>
import { ref } from 'vue';
import { onShow } from "@dcloudio/uni-app";
import api from "@/api/api";
import docUrl from '@/utils/docUrl';
import navTo from '@/utils/navTo';
// 编辑模式状态
const isEditMode = ref(false);
// 我的应用列表
const myApps = ref([]);
// 常用功能列表
const commonApps = ref([]);
const blackList=['临床研究','精品课程','名医名科','肝病学院','病例分享','科研项目','肝病检测','我的下载','病例讨论','临床研究']
// 页面路由映射
// 获取用户图标数据
const addUserIcon = () => {
api.addUserIcon({
idStr:myApps.value.map(item => item.id).join(',')
}).then(res => {
console.log('addUserIcon API响应:', res);
if(res.code === '200'){
uni.showToast({
title: '保存成功',
icon: 'none',
duration: 1500
});
}
});
};
const getUserIcon = () => {
api.getUserIcon({}).then(res => {
console.log('getUserIcon API响应:', res);
if (res.code === '200' && res.data && Array.isArray(res.data)) {
// 处理API数据先过滤黑名单
const sourceList = res.data.filter(item => !blackList.includes(item.name));
const allApps = sourceList.map(item => ({
id: item.id,
name: item.name,
icon: docUrl + item.img, // 使用docUrl拼接图片路径 // 使用预设颜色// 使用预设路由
selected: item.selected
}));
// 根据selected字段分离我的应用和常用功能
myApps.value = allApps.filter(app =>
app.selected !== 'false' && app.selected !== false
);
commonApps.value = allApps.filter(app =>
app.selected === 'false' || app.selected === false
);
console.log('我的应用:', myApps.value);
console.log('常用功能:', commonApps.value);
} else {
console.error('获取应用图标失败:', res.message || '未知错误');
uni.showToast({
title: res.message || '获取应用列表失败',
icon: 'error',
duration: 2000
});
}
}).catch(error => {
console.error('获取应用图标异常:', error);
uni.showToast({
title: '网络请求失败',
icon: 'error',
duration: 2000
});
});
};
// 返回上一页
const goBack = () => {
uni.navigateBack();
};
// 切换编辑模式
const toggleEdit = () => {
isEditMode.value = !isEditMode.value;
if(!isEditMode.value){
addUserIcon();
}
};
// 打开应用
const openApp = (app) => {
if (isEditMode.value) return;
let url='';
if(app.name=="肝胆课件"){
url='/pages_app/ppt/ppt'
navTo({
url:url
})
}else if(app.name=="精品课"){
url='/pages_course/course/course'
navTo({
url:url
})
}else if(app.name=="积分商城"){
url='/pages_goods/pointMall/pointMall'
navTo({
url:url
})
}else if(app.name=="肝病新闻"){
url='/pages_app/news/news'
navTo({
url:url
})
}else if(app.name=="我的福利"){
url='/pages_app/myWelfare/myWelfare'
navTo({
url:url
})
}else if(app.name=="专题e站"){
url='https://wx.igandan.com/Esite/index.htm#/home?fromtype=doctor'
// H5 端
// #ifdef H5
window.open(url, '_blank');
// #endif
// App 端
// #ifdef APP-PLUS
plus.runtime.openURL(url);
// #endif
// 小程序端:使用内嵌 webview 页面打开
// #ifdef MP
const encoded = encodeURIComponent(url)
uni.navigateTo({
url: `/pages_app/webview/webview?url=${encoded}`
})
// #endif
}
};
// 添加到我的应用
const addToMyApps = (app) => {
// 检查是否已存在
const exists = myApps.value.some(item => item.id === app.id);
if (exists) {
uni.showToast({
title: '已在我的应用中',
icon: 'none',
duration: 1500
});
return;
}
// 检查是否超过最大数量
if (myApps.value.length >= 3) {
uni.showToast({
title: '最多添加3个应用',
icon: 'none',
duration: 1500
});
return;
}
// 更新应用状态为已选中
app.selected = '1';
// 从常用功能中移除
const commonIndex = commonApps.value.findIndex(item => item.id === app.id);
if (commonIndex > -1) {
commonApps.value.splice(commonIndex, 1);
}
// 添加到我的应用
myApps.value.push(app);
};
// 从我的应用中移除
const removeFromMyApps = (index) => {
const app = myApps.value[index];
// 更新应用状态为未选中
app.selected = 'false';
// 从我的应用中移除
myApps.value.splice(index, 1);
// 添加到常用功能
commonApps.value.push(app);
};
onShow(() => {
// 页面显示时的逻辑
getUserIcon();
});
</script>
<style lang="scss" scoped>
.my-application-page {
background-color: #ffffff;
min-height: 100vh;
}
.content {
position: fixed;
top: calc(var(--status-bar-height) + 64px);
bottom: 0;
left: 0;
width: 100%;
right: 0;
box-sizing: border-box;
background-color: #fff;
}
.edit-btn {
color: #8b2316;
font-size: 28rpx;
font-weight: 500;
}
.section {
margin-bottom: 40rpx;
}
.section-title {
color: #666666;
font-size: 28rpx;
margin-bottom: 20rpx;
padding: 0 30rpx;
}
.app-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
.app-item {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
padding: 20rpx 10rpx;
border: 1rpx solid #e0e0e0;
border-right:none;
transition: all 0.3s ease;
.iconbox {
position: absolute;
top: 8rpx;
right: 8rpx;
}
&:active {
transform: scale(0.95);
}
// 右边框处理
&:nth-child(3n) {
}
// 下边框处理(最后一行)
&:nth-last-child(1){
border-right: 1rpx solid #e0e0e0;
}
}
.app-icon {
width: 100rpx;
height: 100rpx;
border-radius: 20rpx;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 16rpx;
}
.icon-image {
width: 60rpx;
height: 60rpx;
}
.app-name {
font-size: 24rpx;
color: #000;
text-align: center;
line-height: 1.2;
font-weight: 500;
}
.delete-btn {
position: absolute;
top: -8rpx;
right: -8rpx;
width: 32rpx;
height: 32rpx;
background-color: #ff4757;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 2rpx 8rpx rgba(255, 71, 87, 0.3);
}
.add-btn {
position: absolute;
top: -8rpx;
right: -8rpx;
width: 32rpx;
height: 32rpx;
background-color: #ffffff;
border: 2rpx solid #8b2316;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 2rpx 8rpx rgba(139, 35, 22, 0.2);
}
// 编辑模式下的样式调整
.app-item:has(.delete-btn) {
border-right-color: #ff4757;
border-bottom-color: #ff4757;
}
.app-item:has(.add-btn) {
border-right-color: #8b2316;
border-bottom-color: #8b2316;
}
</style>