|
|
@@ -1,192 +1,171 @@
|
|
|
<template>
|
|
|
<view class="page">
|
|
|
- <!-- 导航栏 -->
|
|
|
<NavBar title="我的" />
|
|
|
-
|
|
|
- <!-- 用户卡片 -->
|
|
|
- <view class="user-section">
|
|
|
- <view class="user-card">
|
|
|
- <view class="user-header">
|
|
|
- <view class="avatar">
|
|
|
- <view class="avatar-icon">
|
|
|
- <text class="avatar-text">{{ userInfo.nickname?.charAt(0) || 'A' }}</text>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
- <view class="user-info">
|
|
|
- <text class="user-name">{{ userInfo.nickname || '未登录' }}</text>
|
|
|
- <text class="user-role">{{ userInfo.roleName || '管理员' }}</text>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
-
|
|
|
- <view class="user-stats">
|
|
|
- <view class="stat-item">
|
|
|
- <text class="stat-value">12</text>
|
|
|
- <text class="stat-label">管理门店</text>
|
|
|
- </view>
|
|
|
- <view class="stat-divider"></view>
|
|
|
- <view class="stat-item">
|
|
|
- <text class="stat-value">48</text>
|
|
|
- <text class="stat-label">设备数量</text>
|
|
|
- </view>
|
|
|
- <view class="stat-divider"></view>
|
|
|
- <view class="stat-item">
|
|
|
- <text class="stat-value">156</text>
|
|
|
- <text class="stat-label">今日订单</text>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
+
|
|
|
+ <!-- Loading -->
|
|
|
+ <view class="load-tip" v-if="loading">
|
|
|
+ <view class="dot-row">
|
|
|
+ <view class="pulse-dot"></view>
|
|
|
+ <view class="pulse-dot"></view>
|
|
|
+ <view class="pulse-dot"></view>
|
|
|
</view>
|
|
|
</view>
|
|
|
-
|
|
|
- <!-- 菜单区域 -->
|
|
|
- <view class="menu-section">
|
|
|
- <!-- 补货员菜单 -->
|
|
|
- <view class="menu-card" v-if="isReplenisherUser">
|
|
|
- <text class="menu-title">补货管理</text>
|
|
|
- <view class="menu-list">
|
|
|
- <view class="menu-item" @click="handleReplenisherHome">
|
|
|
- <view class="menu-icon green">
|
|
|
- <view class="icon-device"></view>
|
|
|
+
|
|
|
+ <template v-else>
|
|
|
+ <!-- User card -->
|
|
|
+ <view class="user-section">
|
|
|
+ <view class="user-card">
|
|
|
+ <view class="user-header">
|
|
|
+ <view class="avatar">
|
|
|
+ <text class="avatar-text">{{ userInfo.nickname?.charAt(0) || 'A' }}</text>
|
|
|
</view>
|
|
|
- <view class="menu-content">
|
|
|
- <text class="menu-name">补货首页</text>
|
|
|
- <text class="menu-desc">查看设备和执行补货</text>
|
|
|
+ <view class="user-info">
|
|
|
+ <text class="user-name">{{ userInfo.nickname || '未登录' }}</text>
|
|
|
+ <text class="user-role">{{ userInfo.roleName || '管理员' }}</text>
|
|
|
</view>
|
|
|
- <view class="menu-arrow"></view>
|
|
|
</view>
|
|
|
</view>
|
|
|
</view>
|
|
|
|
|
|
- <!-- 管理员菜单 -->
|
|
|
- <view class="menu-card" v-if="!isReplenisherUser">
|
|
|
- <text class="menu-title">业务管理</text>
|
|
|
- <view class="menu-list">
|
|
|
- <view class="menu-item" @click="navigateTo('/pages/shop/list')">
|
|
|
- <view class="menu-icon amber">
|
|
|
- <view class="icon-shop"></view>
|
|
|
- </view>
|
|
|
- <view class="menu-content">
|
|
|
- <text class="menu-name">门店管理</text>
|
|
|
- <text class="menu-desc">查看和管理门店信息</text>
|
|
|
+ <!-- Menu sections -->
|
|
|
+ <view class="menu-section">
|
|
|
+ <!-- Replenisher menu -->
|
|
|
+ <view class="menu-card" v-if="isReplenisherUser">
|
|
|
+ <text class="menu-title">补货管理</text>
|
|
|
+ <view class="menu-list">
|
|
|
+ <view class="menu-item" @click="handleReplenisherHome">
|
|
|
+ <view class="menu-icon green">
|
|
|
+ <view class="icon-device"></view>
|
|
|
+ </view>
|
|
|
+ <view class="menu-content">
|
|
|
+ <text class="menu-name">补货首页</text>
|
|
|
+ <text class="menu-desc">查看设备和执行补货</text>
|
|
|
+ </view>
|
|
|
+ <view class="menu-arrow"></view>
|
|
|
</view>
|
|
|
- <view class="menu-arrow"></view>
|
|
|
</view>
|
|
|
+ </view>
|
|
|
|
|
|
- <view class="menu-item" @click="navigateTo('/pages/products/list')">
|
|
|
- <view class="menu-icon purple">
|
|
|
- <view class="icon-product"></view>
|
|
|
- </view>
|
|
|
- <view class="menu-content">
|
|
|
- <text class="menu-name">商品管理</text>
|
|
|
- <text class="menu-desc">管理商品和价格</text>
|
|
|
+ <!-- Admin menu -->
|
|
|
+ <view class="menu-card" v-if="!isReplenisherUser">
|
|
|
+ <text class="menu-title">业务管理</text>
|
|
|
+ <view class="menu-list">
|
|
|
+ <view class="menu-item" @click="navigateTo('/pages/shop/list')">
|
|
|
+ <view class="menu-icon amber">
|
|
|
+ <view class="icon-shop"></view>
|
|
|
+ </view>
|
|
|
+ <view class="menu-content">
|
|
|
+ <text class="menu-name">门店管理</text>
|
|
|
+ <text class="menu-desc">查看和管理门店信息</text>
|
|
|
+ </view>
|
|
|
+ <view class="menu-arrow"></view>
|
|
|
</view>
|
|
|
- <view class="menu-arrow"></view>
|
|
|
- </view>
|
|
|
|
|
|
- <view class="menu-item" @click="navigateTo('/pages/inventory/query')">
|
|
|
- <view class="menu-icon cyan">
|
|
|
- <view class="icon-chart"></view>
|
|
|
+ <view class="menu-item" @click="navigateTo('/pages/products/list')">
|
|
|
+ <view class="menu-icon purple">
|
|
|
+ <view class="icon-product"></view>
|
|
|
+ </view>
|
|
|
+ <view class="menu-content">
|
|
|
+ <text class="menu-name">商品管理</text>
|
|
|
+ <text class="menu-desc">管理商品和价格</text>
|
|
|
+ </view>
|
|
|
+ <view class="menu-arrow"></view>
|
|
|
</view>
|
|
|
- <view class="menu-content">
|
|
|
- <text class="menu-name">库存查询</text>
|
|
|
- <text class="menu-desc">查看库存情况</text>
|
|
|
- </view>
|
|
|
- <view class="menu-arrow"></view>
|
|
|
- </view>
|
|
|
|
|
|
- <view class="menu-item" @click="navigateTo('/pages/inventory/warning')">
|
|
|
- <view class="menu-icon rose">
|
|
|
- <view class="icon-warning"></view>
|
|
|
+ <view class="menu-item" @click="navigateTo('/pages/inventory/query')">
|
|
|
+ <view class="menu-icon cyan">
|
|
|
+ <view class="icon-chart"></view>
|
|
|
+ </view>
|
|
|
+ <view class="menu-content">
|
|
|
+ <text class="menu-name">库存查询</text>
|
|
|
+ <text class="menu-desc">查看库存情况</text>
|
|
|
+ </view>
|
|
|
+ <view class="menu-arrow"></view>
|
|
|
</view>
|
|
|
- <view class="menu-content">
|
|
|
- <text class="menu-name">库存预警</text>
|
|
|
- <text class="menu-desc">低库存和缺货提醒</text>
|
|
|
+
|
|
|
+ <view class="menu-item" @click="navigateTo('/pages/inventory/warning')">
|
|
|
+ <view class="menu-icon rose">
|
|
|
+ <view class="icon-warning"></view>
|
|
|
+ </view>
|
|
|
+ <view class="menu-content">
|
|
|
+ <text class="menu-name">库存预警</text>
|
|
|
+ <text class="menu-desc">低库存和缺货提醒</text>
|
|
|
+ </view>
|
|
|
+ <view class="menu-arrow"></view>
|
|
|
</view>
|
|
|
- <view class="menu-arrow"></view>
|
|
|
- </view>
|
|
|
|
|
|
- <view class="menu-item" @click="navigateTo('/pages/customer/list')">
|
|
|
- <view class="menu-icon green">
|
|
|
- <view class="icon-user"></view>
|
|
|
+ <view class="menu-item" @click="navigateTo('/pages/customer/list')">
|
|
|
+ <view class="menu-icon green">
|
|
|
+ <view class="icon-user"></view>
|
|
|
+ </view>
|
|
|
+ <view class="menu-content">
|
|
|
+ <text class="menu-name">客户管理</text>
|
|
|
+ <text class="menu-desc">查看客户信息和信用分</text>
|
|
|
+ </view>
|
|
|
+ <view class="menu-arrow"></view>
|
|
|
</view>
|
|
|
- <view class="menu-content">
|
|
|
- <text class="menu-name">客户管理</text>
|
|
|
- <text class="menu-desc">查看客户信息和信用分</text>
|
|
|
+
|
|
|
+ <view class="menu-item" @click="navigateTo('/pages/statistics/overview')">
|
|
|
+ <view class="menu-icon blue">
|
|
|
+ <view class="icon-stats"></view>
|
|
|
+ </view>
|
|
|
+ <view class="menu-content">
|
|
|
+ <text class="menu-name">数据统计</text>
|
|
|
+ <text class="menu-desc">经营数据和销售排行</text>
|
|
|
+ </view>
|
|
|
+ <view class="menu-arrow"></view>
|
|
|
</view>
|
|
|
- <view class="menu-arrow"></view>
|
|
|
</view>
|
|
|
+ </view>
|
|
|
|
|
|
- <view class="menu-item" @click="navigateTo('/pages/statistics/overview')">
|
|
|
- <view class="menu-icon blue">
|
|
|
- <view class="icon-stats"></view>
|
|
|
+ <!-- Replenisher system menu -->
|
|
|
+ <view class="menu-card" v-if="isReplenisherUser">
|
|
|
+ <text class="menu-title">系统设置</text>
|
|
|
+ <view class="menu-list">
|
|
|
+ <view class="menu-item" @click="handleAbout">
|
|
|
+ <view class="menu-icon blue">
|
|
|
+ <view class="icon-info"></view>
|
|
|
+ </view>
|
|
|
+ <view class="menu-content">
|
|
|
+ <text class="menu-name">关于我们</text>
|
|
|
+ <text class="menu-desc">版本信息</text>
|
|
|
+ </view>
|
|
|
+ <view class="menu-arrow"></view>
|
|
|
</view>
|
|
|
- <view class="menu-content">
|
|
|
- <text class="menu-name">数据统计</text>
|
|
|
- <text class="menu-desc">经营数据和销售排行</text>
|
|
|
- </view>
|
|
|
- <view class="menu-arrow"></view>
|
|
|
</view>
|
|
|
</view>
|
|
|
- </view>
|
|
|
-
|
|
|
- <!-- 补货员设置的关闭按钮 -->
|
|
|
- <view class="menu-card" v-if="isReplenisherUser">
|
|
|
- <text class="menu-title">系统设置</text>
|
|
|
- <view class="menu-list">
|
|
|
- <view class="menu-item" @click="handleAbout">
|
|
|
- <view class="menu-icon blue">
|
|
|
- <view class="icon-info"></view>
|
|
|
- </view>
|
|
|
- <view class="menu-content">
|
|
|
- <text class="menu-name">关于我们</text>
|
|
|
- <text class="menu-desc">版本信息</text>
|
|
|
+
|
|
|
+ <!-- Admin system menu -->
|
|
|
+ <view class="menu-card" v-if="!isReplenisherUser">
|
|
|
+ <text class="menu-title">系统设置</text>
|
|
|
+ <view class="menu-list">
|
|
|
+ <view class="menu-item" @click="handleAbout">
|
|
|
+ <view class="menu-icon blue">
|
|
|
+ <view class="icon-info"></view>
|
|
|
+ </view>
|
|
|
+ <view class="menu-content">
|
|
|
+ <text class="menu-name">关于我们</text>
|
|
|
+ <text class="menu-desc">版本信息</text>
|
|
|
+ </view>
|
|
|
+ <view class="menu-arrow"></view>
|
|
|
</view>
|
|
|
- <view class="menu-arrow"></view>
|
|
|
</view>
|
|
|
</view>
|
|
|
</view>
|
|
|
-
|
|
|
- <!-- 管理员菜单 -->
|
|
|
- <view class="menu-card" v-if="!isReplenisherUser">
|
|
|
- <text class="menu-title">系统设置</text>
|
|
|
- <view class="menu-list">
|
|
|
- <view class="menu-item" @click="handleChangePassword">
|
|
|
- <view class="menu-icon green">
|
|
|
- <view class="icon-lock"></view>
|
|
|
- </view>
|
|
|
- <view class="menu-content">
|
|
|
- <text class="menu-name">修改密码</text>
|
|
|
- <text class="menu-desc">更改登录密码</text>
|
|
|
- </view>
|
|
|
- <view class="menu-arrow"></view>
|
|
|
- </view>
|
|
|
-
|
|
|
- <view class="menu-item" @click="handleAbout">
|
|
|
- <view class="menu-icon blue">
|
|
|
- <view class="icon-info"></view>
|
|
|
- </view>
|
|
|
- <view class="menu-content">
|
|
|
- <text class="menu-name">关于我们</text>
|
|
|
- <text class="menu-desc">版本信息</text>
|
|
|
- </view>
|
|
|
- <view class="menu-arrow"></view>
|
|
|
- </view>
|
|
|
+
|
|
|
+ <!-- Logout -->
|
|
|
+ <view class="logout-section">
|
|
|
+ <view class="logout-btn" @click="handleLogout">
|
|
|
+ <text>退出登录</text>
|
|
|
</view>
|
|
|
</view>
|
|
|
- </view>
|
|
|
-
|
|
|
- <!-- 退出登录 -->
|
|
|
- <view class="logout-section">
|
|
|
- <button class="logout-btn" @click="handleLogout">
|
|
|
- <text>退出登录</text>
|
|
|
- </button>
|
|
|
- </view>
|
|
|
-
|
|
|
- <!-- 版本信息 -->
|
|
|
- <view class="version-info">
|
|
|
- <text>版本 1.0.0</text>
|
|
|
- </view>
|
|
|
-
|
|
|
- <!-- 自定义TabBar -->
|
|
|
+
|
|
|
+ <!-- Version -->
|
|
|
+ <view class="version-info">
|
|
|
+ <text>版本 1.0.0</text>
|
|
|
+ </view>
|
|
|
+ </template>
|
|
|
+
|
|
|
<CustomTabBar />
|
|
|
</view>
|
|
|
</template>
|
|
|
@@ -196,17 +175,22 @@ import { ref, onMounted } from 'vue';
|
|
|
import NavBar from '@/components/NavBar.vue';
|
|
|
import CustomTabBar from '@/components/CustomTabBar.vue';
|
|
|
import { getUserInfo, getReplenisherInfo, isReplenisher, clearAuth } from '@/utils/auth';
|
|
|
-import { showConfirm, showToast } from '@/utils/common';
|
|
|
+import { showConfirm } from '@/utils/common';
|
|
|
+
|
|
|
+interface UserInfo {
|
|
|
+ nickname?: string;
|
|
|
+ roleName?: string;
|
|
|
+ [key: string]: any;
|
|
|
+}
|
|
|
|
|
|
-const userInfo = ref<any>({});
|
|
|
+const userInfo = ref<UserInfo>({});
|
|
|
const isReplenisherUser = ref(false);
|
|
|
+const loading = ref(true);
|
|
|
|
|
|
const loadUserInfo = () => {
|
|
|
- // 判断用户类型
|
|
|
isReplenisherUser.value = isReplenisher();
|
|
|
-
|
|
|
+
|
|
|
if (isReplenisherUser.value) {
|
|
|
- // 补货员使用补货员信息
|
|
|
const info = getReplenisherInfo();
|
|
|
if (info) {
|
|
|
userInfo.value = {
|
|
|
@@ -215,7 +199,6 @@ const loadUserInfo = () => {
|
|
|
};
|
|
|
}
|
|
|
} else {
|
|
|
- // 管理员使用原有用户信息
|
|
|
const info = getUserInfo();
|
|
|
if (info) {
|
|
|
userInfo.value = info;
|
|
|
@@ -227,12 +210,8 @@ const navigateTo = (url: string) => {
|
|
|
uni.navigateTo({ url });
|
|
|
};
|
|
|
|
|
|
-const handleChangePassword = () => {
|
|
|
- showToast('修改密码功能开发中');
|
|
|
-};
|
|
|
-
|
|
|
const handleAbout = () => {
|
|
|
- showToast('哈哈运营平台 v1.0.0');
|
|
|
+ uni.showToast({ title: '哈哈运营平台 v1.0.0', icon: 'none' });
|
|
|
};
|
|
|
|
|
|
const handleReplenisherHome = () => {
|
|
|
@@ -249,131 +228,118 @@ const handleLogout = async () => {
|
|
|
|
|
|
onMounted(() => {
|
|
|
loadUserInfo();
|
|
|
+ loading.value = false;
|
|
|
});
|
|
|
</script>
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
+$font-stack: -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Helvetica Neue', system-ui, sans-serif;
|
|
|
+
|
|
|
.page {
|
|
|
min-height: 100vh;
|
|
|
+ width: 100vw;
|
|
|
+ overflow-x: hidden;
|
|
|
background: $bg-color-page;
|
|
|
- padding-bottom: 200rpx;
|
|
|
+ padding-bottom: calc(40rpx + constant(safe-area-inset-bottom));
|
|
|
+ padding-bottom: calc(40rpx + env(safe-area-inset-bottom));
|
|
|
+ font-family: $font-stack;
|
|
|
+}
|
|
|
+
|
|
|
+/* Loading */
|
|
|
+.load-tip {
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ padding: 120rpx 0;
|
|
|
}
|
|
|
|
|
|
-/* 用户区域 */
|
|
|
+.dot-row {
|
|
|
+ display: flex;
|
|
|
+ gap: $spacing-1;
|
|
|
+}
|
|
|
+
|
|
|
+.pulse-dot {
|
|
|
+ width: 9rpx;
|
|
|
+ height: 9rpx;
|
|
|
+ background: $text-color-placeholder;
|
|
|
+ border-radius: $radius-full;
|
|
|
+ animation: pulse 1.2s ease-in-out infinite;
|
|
|
+
|
|
|
+ &:nth-child(2) { animation-delay: 0.2s; }
|
|
|
+ &:nth-child(3) { animation-delay: 0.4s; }
|
|
|
+}
|
|
|
+
|
|
|
+@keyframes pulse {
|
|
|
+ 0%, 80%, 100% { transform: scale(0.5); opacity: 0.4; }
|
|
|
+ 40% { transform: scale(1); opacity: 1; }
|
|
|
+}
|
|
|
+
|
|
|
+/* User section */
|
|
|
.user-section {
|
|
|
- padding: 16rpx 24rpx;
|
|
|
+ padding: $spacing-2 $spacing-3;
|
|
|
}
|
|
|
|
|
|
.user-card {
|
|
|
background: $bg-color-card;
|
|
|
- border: 1rpx solid $border-color;
|
|
|
- border-radius: 20rpx;
|
|
|
- padding: 32rpx;
|
|
|
+ border-radius: $radius-lg;
|
|
|
+ padding: $spacing-4;
|
|
|
+ box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.05);
|
|
|
}
|
|
|
|
|
|
.user-header {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
- margin-bottom: 24rpx;
|
|
|
-
|
|
|
+
|
|
|
.avatar {
|
|
|
width: 96rpx;
|
|
|
height: 96rpx;
|
|
|
- background: $success-color-bg;
|
|
|
- border-radius: 24rpx;
|
|
|
+ background: $primary-color-bg;
|
|
|
+ border-radius: $radius-xl;
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
justify-content: center;
|
|
|
- margin-right: 24rpx;
|
|
|
- border: 2rpx solid $primary-color;
|
|
|
-
|
|
|
- .avatar-icon {
|
|
|
- width: 100%;
|
|
|
- height: 100%;
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- }
|
|
|
-
|
|
|
+ margin-right: $spacing-3;
|
|
|
+
|
|
|
.avatar-text {
|
|
|
- font-size: 40rpx;
|
|
|
+ font-size: $font-size-2xl;
|
|
|
font-weight: 700;
|
|
|
color: $primary-color;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
.user-info {
|
|
|
flex: 1;
|
|
|
-
|
|
|
+
|
|
|
.user-name {
|
|
|
display: block;
|
|
|
- font-size: 34rpx;
|
|
|
+ font-size: $font-size-lg;
|
|
|
font-weight: 700;
|
|
|
color: $text-color-primary;
|
|
|
margin-bottom: 4rpx;
|
|
|
}
|
|
|
-
|
|
|
- .user-role {
|
|
|
- font-size: 26rpx;
|
|
|
- color: $text-color-tertiary;
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
|
|
|
-.user-stats {
|
|
|
- display: flex;
|
|
|
- background: $bg-color-page;
|
|
|
- border-radius: 12rpx;
|
|
|
- padding: 20rpx 0;
|
|
|
-
|
|
|
- .stat-item {
|
|
|
- flex: 1;
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
-
|
|
|
- .stat-value {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- font-size: 32rpx;
|
|
|
- font-weight: 700;
|
|
|
- color: $text-color-primary;
|
|
|
- margin-bottom: 4rpx;
|
|
|
- }
|
|
|
-
|
|
|
- .stat-label {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- font-size: 22rpx;
|
|
|
+ .user-role {
|
|
|
+ font-size: $font-size-sm;
|
|
|
color: $text-color-tertiary;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- .stat-divider {
|
|
|
- width: 1rpx;
|
|
|
- background: $border-color;
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
-/* 菜单区域 */
|
|
|
+/* Menu section */
|
|
|
.menu-section {
|
|
|
- padding: 0 24rpx;
|
|
|
+ padding: 0 $spacing-3;
|
|
|
}
|
|
|
|
|
|
.menu-card {
|
|
|
background: $bg-color-card;
|
|
|
- border: 1rpx solid $border-color;
|
|
|
- border-radius: 20rpx;
|
|
|
- margin-bottom: 16rpx;
|
|
|
+ border-radius: $radius-lg;
|
|
|
+ margin-bottom: $spacing-2;
|
|
|
overflow: hidden;
|
|
|
-
|
|
|
+ box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.05);
|
|
|
+
|
|
|
.menu-title {
|
|
|
display: block;
|
|
|
- padding: 20rpx 24rpx 12rpx;
|
|
|
- font-size: 24rpx;
|
|
|
+ padding: $spacing-3 $spacing-3 $spacing-1;
|
|
|
+ font-size: $font-size-sm;
|
|
|
color: $text-color-muted;
|
|
|
font-weight: 600;
|
|
|
}
|
|
|
@@ -383,42 +349,43 @@ onMounted(() => {
|
|
|
.menu-item {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
- padding: 20rpx 24rpx;
|
|
|
- border-bottom: 1rpx solid $bg-color-secondary;
|
|
|
- transition: background 0.15s;
|
|
|
-
|
|
|
+ padding: $spacing-3;
|
|
|
+ border-bottom: 1rpx solid $border-color-light;
|
|
|
+ transition: opacity 0.15s ease;
|
|
|
+
|
|
|
&:last-child {
|
|
|
border-bottom: none;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
&:active {
|
|
|
- background: $bg-color-page;
|
|
|
+ opacity: 0.7;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/* Menu icons */
|
|
|
.menu-icon {
|
|
|
width: 56rpx;
|
|
|
height: 56rpx;
|
|
|
- border-radius: 14rpx;
|
|
|
+ border-radius: $radius-md;
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
justify-content: center;
|
|
|
- margin-right: 16rpx;
|
|
|
-
|
|
|
- &.green { background: $success-color-bg; }
|
|
|
- &.blue { background: $info-color-bg; }
|
|
|
- &.amber { background: $accent-color-bg; }
|
|
|
+ margin-right: $spacing-2;
|
|
|
+
|
|
|
+ &.green { background: $success-color-bg; }
|
|
|
+ &.blue { background: $info-color-bg; }
|
|
|
+ &.amber { background: $primary-color-bg; }
|
|
|
&.purple { background: $primary-color-bg; }
|
|
|
- &.cyan { background: $primary-color-bg; }
|
|
|
-
|
|
|
- /* 图标 - 纯CSS几何图形 */
|
|
|
+ &.cyan { background: $info-color-bg; }
|
|
|
+ &.rose { background: $warning-color-bg; }
|
|
|
+
|
|
|
.icon-shop {
|
|
|
width: 22rpx;
|
|
|
height: 22rpx;
|
|
|
background: $accent-color;
|
|
|
position: relative;
|
|
|
-
|
|
|
+
|
|
|
&::before {
|
|
|
content: '';
|
|
|
position: absolute;
|
|
|
@@ -432,14 +399,14 @@ onMounted(() => {
|
|
|
border-bottom: 10rpx solid $accent-color;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
.icon-product {
|
|
|
width: 20rpx;
|
|
|
height: 18rpx;
|
|
|
background: $primary-color;
|
|
|
- border-radius: 4rpx;
|
|
|
+ border-radius: $radius-xs;
|
|
|
position: relative;
|
|
|
-
|
|
|
+
|
|
|
&::before {
|
|
|
content: '';
|
|
|
position: absolute;
|
|
|
@@ -453,13 +420,13 @@ onMounted(() => {
|
|
|
border-bottom: 10rpx solid $primary-color;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
.icon-chart {
|
|
|
display: flex;
|
|
|
align-items: flex-end;
|
|
|
width: 24rpx;
|
|
|
height: 20rpx;
|
|
|
-
|
|
|
+
|
|
|
&::before, &, &::after {
|
|
|
content: '';
|
|
|
width: 6rpx;
|
|
|
@@ -471,65 +438,12 @@ onMounted(() => {
|
|
|
& { height: 18rpx; }
|
|
|
&::after { height: 14rpx; margin-right: 0; }
|
|
|
}
|
|
|
-
|
|
|
- .icon-lock {
|
|
|
- width: 16rpx;
|
|
|
- height: 20rpx;
|
|
|
- background: $primary-color;
|
|
|
- border-radius: 4rpx;
|
|
|
- position: relative;
|
|
|
-
|
|
|
- &::before {
|
|
|
- content: '';
|
|
|
- position: absolute;
|
|
|
- top: -6rpx;
|
|
|
- left: 50%;
|
|
|
- transform: translateX(-50%);
|
|
|
- width: 10rpx;
|
|
|
- height: 8rpx;
|
|
|
- border: 3rpx solid $primary-color;
|
|
|
- border-bottom: none;
|
|
|
- border-radius: 8rpx 8rpx 0 0;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- .icon-info {
|
|
|
- width: 20rpx;
|
|
|
- height: 20rpx;
|
|
|
- border: 3rpx solid $info-color;
|
|
|
- border-radius: 50%;
|
|
|
- position: relative;
|
|
|
-
|
|
|
- &::before {
|
|
|
- content: '';
|
|
|
- position: absolute;
|
|
|
- top: 4rpx;
|
|
|
- left: 50%;
|
|
|
- transform: translateX(-50%);
|
|
|
- width: 3rpx;
|
|
|
- height: 3rpx;
|
|
|
- background: $info-color;
|
|
|
- border-radius: 50%;
|
|
|
- }
|
|
|
-
|
|
|
- &::after {
|
|
|
- content: '';
|
|
|
- position: absolute;
|
|
|
- top: 10rpx;
|
|
|
- left: 50%;
|
|
|
- transform: translateX(-50%);
|
|
|
- width: 3rpx;
|
|
|
- height: 6rpx;
|
|
|
- background: $info-color;
|
|
|
- border-radius: 2rpx;
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
.icon-warning {
|
|
|
width: 24rpx;
|
|
|
height: 24rpx;
|
|
|
- border: 3rpx solid $error-color;
|
|
|
- border-radius: 50%;
|
|
|
+ border: 3rpx solid $warning-color;
|
|
|
+ border-radius: $radius-full;
|
|
|
position: relative;
|
|
|
|
|
|
&::before {
|
|
|
@@ -540,7 +454,7 @@ onMounted(() => {
|
|
|
transform: translate(-50%, -50%);
|
|
|
width: 3rpx;
|
|
|
height: 10rpx;
|
|
|
- background: $error-color;
|
|
|
+ background: $warning-color;
|
|
|
}
|
|
|
|
|
|
&::after {
|
|
|
@@ -551,16 +465,16 @@ onMounted(() => {
|
|
|
transform: translateX(-50%);
|
|
|
width: 3rpx;
|
|
|
height: 3rpx;
|
|
|
- background: $error-color;
|
|
|
- border-radius: 50%;
|
|
|
+ background: $warning-color;
|
|
|
+ border-radius: $radius-full;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
.icon-user {
|
|
|
width: 20rpx;
|
|
|
height: 20rpx;
|
|
|
- border: 3rpx solid $primary-color;
|
|
|
- border-radius: 50%;
|
|
|
+ border: 3rpx solid $success-color;
|
|
|
+ border-radius: $radius-full;
|
|
|
position: relative;
|
|
|
|
|
|
&::before {
|
|
|
@@ -571,8 +485,8 @@ onMounted(() => {
|
|
|
transform: translateX(-50%);
|
|
|
width: 10rpx;
|
|
|
height: 10rpx;
|
|
|
- border: 3rpx solid $primary-color;
|
|
|
- border-radius: 50%;
|
|
|
+ border: 3rpx solid $success-color;
|
|
|
+ border-radius: $radius-full;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -594,11 +508,43 @@ onMounted(() => {
|
|
|
&::after { height: 12rpx; }
|
|
|
}
|
|
|
|
|
|
+ .icon-info {
|
|
|
+ width: 20rpx;
|
|
|
+ height: 20rpx;
|
|
|
+ border: 3rpx solid $info-color;
|
|
|
+ border-radius: $radius-full;
|
|
|
+ position: relative;
|
|
|
+
|
|
|
+ &::before {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ top: 4rpx;
|
|
|
+ left: 50%;
|
|
|
+ transform: translateX(-50%);
|
|
|
+ width: 3rpx;
|
|
|
+ height: 3rpx;
|
|
|
+ background: $info-color;
|
|
|
+ border-radius: $radius-full;
|
|
|
+ }
|
|
|
+
|
|
|
+ &::after {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ top: 10rpx;
|
|
|
+ left: 50%;
|
|
|
+ transform: translateX(-50%);
|
|
|
+ width: 3rpx;
|
|
|
+ height: 6rpx;
|
|
|
+ background: $info-color;
|
|
|
+ border-radius: 2rpx;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
.icon-device {
|
|
|
width: 20rpx;
|
|
|
height: 16rpx;
|
|
|
- border: 3rpx solid $primary-color;
|
|
|
- border-radius: 4rpx;
|
|
|
+ border: 3rpx solid $success-color;
|
|
|
+ border-radius: $radius-xs;
|
|
|
position: relative;
|
|
|
|
|
|
&::before {
|
|
|
@@ -609,25 +555,46 @@ onMounted(() => {
|
|
|
transform: translateX(-50%);
|
|
|
width: 12rpx;
|
|
|
height: 6rpx;
|
|
|
- background: $primary-color;
|
|
|
+ background: $success-color;
|
|
|
border-radius: 0 0 4rpx 4rpx;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ .icon-lock {
|
|
|
+ width: 16rpx;
|
|
|
+ height: 20rpx;
|
|
|
+ background: $primary-color;
|
|
|
+ border-radius: $radius-xs;
|
|
|
+ position: relative;
|
|
|
+
|
|
|
+ &::before {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ top: -6rpx;
|
|
|
+ left: 50%;
|
|
|
+ transform: translateX(-50%);
|
|
|
+ width: 10rpx;
|
|
|
+ height: 8rpx;
|
|
|
+ border: 3rpx solid $primary-color;
|
|
|
+ border-bottom: none;
|
|
|
+ border-radius: 8rpx 8rpx 0 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
.menu-content {
|
|
|
flex: 1;
|
|
|
-
|
|
|
+
|
|
|
.menu-name {
|
|
|
display: block;
|
|
|
- font-size: 30rpx;
|
|
|
+ font-size: $font-size-md;
|
|
|
color: $text-color-primary;
|
|
|
font-weight: 500;
|
|
|
margin-bottom: 2rpx;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
.menu-desc {
|
|
|
- font-size: 24rpx;
|
|
|
+ font-size: $font-size-sm;
|
|
|
color: $text-color-muted;
|
|
|
}
|
|
|
}
|
|
|
@@ -640,42 +607,37 @@ onMounted(() => {
|
|
|
transform: rotate(45deg);
|
|
|
}
|
|
|
|
|
|
-/* 退出登录 */
|
|
|
+/* Logout */
|
|
|
.logout-section {
|
|
|
- padding: 24rpx 24rpx 0;
|
|
|
-
|
|
|
+ padding: $spacing-3 $spacing-3 0;
|
|
|
+
|
|
|
.logout-btn {
|
|
|
width: 100%;
|
|
|
height: 100rpx;
|
|
|
+ line-height: 100rpx;
|
|
|
+ padding: 0;
|
|
|
background: $error-color-bg;
|
|
|
- border: 1rpx solid $error-color-bg;
|
|
|
- border-radius: 16rpx;
|
|
|
- font-size: 32rpx;
|
|
|
+ border-radius: $radius-md;
|
|
|
+ font-size: $font-size-lg;
|
|
|
font-weight: 600;
|
|
|
color: $error-color;
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
justify-content: center;
|
|
|
- transition: all 0.2s;
|
|
|
-
|
|
|
- &::after {
|
|
|
- border: none;
|
|
|
- }
|
|
|
-
|
|
|
+
|
|
|
&:active {
|
|
|
- background: $error-color-bg;
|
|
|
- transform: scale(0.98);
|
|
|
+ opacity: 0.8;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/* 版本信息 */
|
|
|
+/* Version */
|
|
|
.version-info {
|
|
|
text-align: center;
|
|
|
- padding: 24rpx 0;
|
|
|
-
|
|
|
+ padding: $spacing-3 0;
|
|
|
+
|
|
|
text {
|
|
|
- font-size: 24rpx;
|
|
|
+ font-size: $font-size-sm;
|
|
|
color: $text-color-placeholder;
|
|
|
}
|
|
|
}
|