371 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			371 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
<template>
 | 
						|
  <view id="app">
 | 
						|
    <!-- 全局组件可以在这里添加 -->
 | 
						|
  </view>
 | 
						|
</template>
 | 
						|
 | 
						|
<script>
 | 
						|
import { useAuthStore } from "./src/store/authStore.js";
 | 
						|
import { initRouteGuard } from "./src/utils/routeGuard.js";
 | 
						|
 | 
						|
export default {
 | 
						|
  globalData: {
 | 
						|
    isWarmStart: false,
 | 
						|
    userInfo: null,
 | 
						|
    appConfig: {},
 | 
						|
    isMobile: false, // 是否为移动设备
 | 
						|
    systemInfo: null, // 系统信息
 | 
						|
  },
 | 
						|
  onLaunch: function () {
 | 
						|
    console.log("App启动");
 | 
						|
    this.initApp();
 | 
						|
  },
 | 
						|
  onShow: function () {
 | 
						|
    console.log("App显示");
 | 
						|
  },
 | 
						|
  onHide: function () {
 | 
						|
    console.log("App隐藏");
 | 
						|
  },
 | 
						|
  methods: {
 | 
						|
    initApp() {
 | 
						|
      // 初始化应用
 | 
						|
      this.detectDevice();
 | 
						|
      this.initAuth();
 | 
						|
      this.initRouteGuard();
 | 
						|
      this.initTheme();
 | 
						|
    },
 | 
						|
 | 
						|
    initAuth() {
 | 
						|
      // 初始化认证状态
 | 
						|
      const authStore = useAuthStore();
 | 
						|
      authStore.initAuth();
 | 
						|
    },
 | 
						|
 | 
						|
    initRouteGuard() {
 | 
						|
      // 初始化路由守卫
 | 
						|
      initRouteGuard();
 | 
						|
    },
 | 
						|
 | 
						|
    initTheme() {
 | 
						|
      // 初始化主题
 | 
						|
      // 这里可以设置全局主题
 | 
						|
    },
 | 
						|
 | 
						|
    detectDevice() {
 | 
						|
      // 全局设备检测
 | 
						|
      try {
 | 
						|
        const systemInfo = uni.getSystemInfoSync();
 | 
						|
        this.globalData.systemInfo = systemInfo;
 | 
						|
        
 | 
						|
        // 判断是否为移动设备
 | 
						|
        this.globalData.isMobile = systemInfo.platform !== 'devtools' && 
 | 
						|
                                 (systemInfo.platform === 'ios' || 
 | 
						|
                                  systemInfo.platform === 'android');
 | 
						|
        
 | 
						|
        console.log('设备信息:', systemInfo);
 | 
						|
        console.log('是否为移动设备:', this.globalData.isMobile);
 | 
						|
      } catch (e) {
 | 
						|
        // 备用检测方案
 | 
						|
        const userAgent = navigator.userAgent.toLowerCase();
 | 
						|
        this.globalData.isMobile = /android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(userAgent);
 | 
						|
        console.log('使用备用检测方案,是否为移动设备:', this.globalData.isMobile);
 | 
						|
      }
 | 
						|
    },
 | 
						|
  },
 | 
						|
};
 | 
						|
</script>
 | 
						|
 | 
						|
<style lang="scss">
 | 
						|
/* 引入 FontAwesome */
 | 
						|
@import "./static/css/all.css";
 | 
						|
@import "./static/css/style.scss";
 | 
						|
@import "./static/css/iconfont.css";
 | 
						|
@import "./static/css/index.css";
 | 
						|
 | 
						|
/* 全局样式 */
 | 
						|
page {
 | 
						|
  background-color: #f5f6fa;
 | 
						|
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC",
 | 
						|
    "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial,
 | 
						|
    sans-serif;
 | 
						|
}
 | 
						|
 | 
						|
/* 通用样式类 */
 | 
						|
.container {
 | 
						|
  padding: 30rpx;
 | 
						|
}
 | 
						|
 | 
						|
.section {
 | 
						|
  margin-bottom: 40rpx;
 | 
						|
}
 | 
						|
 | 
						|
.section-title {
 | 
						|
  font-size: 32rpx;
 | 
						|
  font-weight: 600;
 | 
						|
  color: #333;
 | 
						|
  margin-bottom: 20rpx;
 | 
						|
}
 | 
						|
 | 
						|
.card {
 | 
						|
  background: #fff;
 | 
						|
  border-radius: 16rpx;
 | 
						|
  padding: 30rpx;
 | 
						|
  box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.08);
 | 
						|
}
 | 
						|
 | 
						|
.btn {
 | 
						|
  display: flex;
 | 
						|
  align-items: center;
 | 
						|
  justify-content: center;
 | 
						|
  padding: 20rpx 40rpx;
 | 
						|
  border-radius: 12rpx;
 | 
						|
  font-size: 28rpx;
 | 
						|
  font-weight: 500;
 | 
						|
  border: none;
 | 
						|
  outline: none;
 | 
						|
  cursor: pointer;
 | 
						|
  transition: all 0.3s ease;
 | 
						|
}
 | 
						|
 | 
						|
.btn-primary {
 | 
						|
  background: linear-gradient(135deg, #2b7ce9 0%, #1e5f99 100%);
 | 
						|
  color: #fff;
 | 
						|
}
 | 
						|
 | 
						|
.btn-primary:active {
 | 
						|
  transform: scale(0.98);
 | 
						|
  opacity: 0.9;
 | 
						|
}
 | 
						|
 | 
						|
.btn-secondary {
 | 
						|
  background: #f5f6fa;
 | 
						|
  color: #666;
 | 
						|
  border: 1rpx solid #e0e0e0;
 | 
						|
}
 | 
						|
 | 
						|
.btn-secondary:active {
 | 
						|
  background: #e8e8e8;
 | 
						|
}
 | 
						|
 | 
						|
.text-primary {
 | 
						|
  color: #2b7ce9;
 | 
						|
}
 | 
						|
 | 
						|
.text-secondary {
 | 
						|
  color: #666;
 | 
						|
}
 | 
						|
 | 
						|
.text-muted {
 | 
						|
  color: #999;
 | 
						|
}
 | 
						|
 | 
						|
.text-success {
 | 
						|
  color: #4ecdc4;
 | 
						|
}
 | 
						|
 | 
						|
.text-warning {
 | 
						|
  color: #feca57;
 | 
						|
}
 | 
						|
 | 
						|
.text-danger {
 | 
						|
  color: #ff6b6b;
 | 
						|
}
 | 
						|
 | 
						|
.flex {
 | 
						|
  display: flex;
 | 
						|
}
 | 
						|
 | 
						|
.flex-center {
 | 
						|
  display: flex;
 | 
						|
  align-items: center;
 | 
						|
  justify-content: center;
 | 
						|
}
 | 
						|
 | 
						|
.flex-between {
 | 
						|
  display: flex;
 | 
						|
  align-items: center;
 | 
						|
  justify-content: space-between;
 | 
						|
}
 | 
						|
 | 
						|
.flex-column {
 | 
						|
  display: flex;
 | 
						|
  flex-direction: column;
 | 
						|
}
 | 
						|
 | 
						|
.flex-1 {
 | 
						|
  flex: 1;
 | 
						|
}
 | 
						|
 | 
						|
.text-center {
 | 
						|
  text-align: center;
 | 
						|
}
 | 
						|
 | 
						|
.text-left {
 | 
						|
  text-align: left;
 | 
						|
}
 | 
						|
 | 
						|
.text-right {
 | 
						|
  text-align: right;
 | 
						|
}
 | 
						|
 | 
						|
.mt-10 {
 | 
						|
  margin-top: 10rpx;
 | 
						|
}
 | 
						|
.mt-20 {
 | 
						|
  margin-top: 20rpx;
 | 
						|
}
 | 
						|
.mt-30 {
 | 
						|
  margin-top: 30rpx;
 | 
						|
}
 | 
						|
.mt-40 {
 | 
						|
  margin-top: 40rpx;
 | 
						|
}
 | 
						|
 | 
						|
.mb-10 {
 | 
						|
  margin-bottom: 10rpx;
 | 
						|
}
 | 
						|
.mb-20 {
 | 
						|
  margin-bottom: 20rpx;
 | 
						|
}
 | 
						|
.mb-30 {
 | 
						|
  margin-bottom: 30rpx;
 | 
						|
}
 | 
						|
.mb-40 {
 | 
						|
  margin-bottom: 40rpx;
 | 
						|
}
 | 
						|
 | 
						|
.ml-10 {
 | 
						|
  margin-left: 10rpx;
 | 
						|
}
 | 
						|
.ml-20 {
 | 
						|
  margin-left: 20rpx;
 | 
						|
}
 | 
						|
.ml-30 {
 | 
						|
  margin-left: 30rpx;
 | 
						|
}
 | 
						|
 | 
						|
.mr-10 {
 | 
						|
  margin-right: 10rpx;
 | 
						|
}
 | 
						|
.mr-20 {
 | 
						|
  margin-right: 20rpx;
 | 
						|
}
 | 
						|
.mr-30 {
 | 
						|
  margin-right: 30rpx;
 | 
						|
}
 | 
						|
 | 
						|
.p-10 {
 | 
						|
  padding: 10rpx;
 | 
						|
}
 | 
						|
.p-20 {
 | 
						|
  padding: 20rpx;
 | 
						|
}
 | 
						|
.p-30 {
 | 
						|
  padding: 30rpx;
 | 
						|
}
 | 
						|
 | 
						|
.pt-10 {
 | 
						|
  padding-top: 10rpx;
 | 
						|
}
 | 
						|
.pt-20 {
 | 
						|
  padding-top: 20rpx;
 | 
						|
}
 | 
						|
.pt-30 {
 | 
						|
  padding-top: 30rpx;
 | 
						|
}
 | 
						|
 | 
						|
.pb-10 {
 | 
						|
  padding-bottom: 10rpx;
 | 
						|
}
 | 
						|
.pb-20 {
 | 
						|
  padding-bottom: 20rpx;
 | 
						|
}
 | 
						|
.pb-30 {
 | 
						|
  padding-bottom: 30rpx;
 | 
						|
}
 | 
						|
 | 
						|
.pl-10 {
 | 
						|
  padding-left: 10rpx;
 | 
						|
}
 | 
						|
.pl-20 {
 | 
						|
  padding-left: 20rpx;
 | 
						|
}
 | 
						|
.pl-30 {
 | 
						|
  padding-left: 30rpx;
 | 
						|
}
 | 
						|
 | 
						|
.pr-10 {
 | 
						|
  padding-right: 10rpx;
 | 
						|
}
 | 
						|
.pr-20 {
 | 
						|
  padding-right: 20rpx;
 | 
						|
}
 | 
						|
.pr-30 {
 | 
						|
  padding-right: 30rpx;
 | 
						|
}
 | 
						|
 | 
						|
/* 滚动条样式 */
 | 
						|
::-webkit-scrollbar {
 | 
						|
  width: 0;
 | 
						|
  background: transparent;
 | 
						|
}
 | 
						|
 | 
						|
/* 安全区域适配 */
 | 
						|
.safe-area-top {
 | 
						|
  padding-top: constant(safe-area-inset-top);
 | 
						|
  padding-top: env(safe-area-inset-top);
 | 
						|
}
 | 
						|
 | 
						|
.safe-area-bottom {
 | 
						|
  padding-bottom: constant(safe-area-inset-bottom);
 | 
						|
  padding-bottom: env(safe-area-inset-bottom);
 | 
						|
}
 | 
						|
 | 
						|
/* 动画 */
 | 
						|
.fade-in {
 | 
						|
  animation: fadeIn 0.3s ease-in-out;
 | 
						|
}
 | 
						|
 | 
						|
@keyframes fadeIn {
 | 
						|
  from {
 | 
						|
    opacity: 0;
 | 
						|
    transform: translateY(20rpx);
 | 
						|
  }
 | 
						|
  to {
 | 
						|
    opacity: 1;
 | 
						|
    transform: translateY(0);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
.slide-in-right {
 | 
						|
  animation: slideInRight 0.3s ease-out;
 | 
						|
}
 | 
						|
 | 
						|
@keyframes slideInRight {
 | 
						|
  from {
 | 
						|
    opacity: 0;
 | 
						|
    transform: translateX(100%);
 | 
						|
  }
 | 
						|
  to {
 | 
						|
    opacity: 1;
 | 
						|
    transform: translateX(0);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/* 响应式设计 */
 | 
						|
@media screen and (max-width: 750rpx) {
 | 
						|
  .container {
 | 
						|
    padding: 20rpx;
 | 
						|
  }
 | 
						|
 | 
						|
  .section {
 | 
						|
    margin-bottom: 30rpx;
 | 
						|
  }
 | 
						|
 | 
						|
  .section-title {
 | 
						|
    font-size: 28rpx;
 | 
						|
    margin-bottom: 15rpx;
 | 
						|
  }
 | 
						|
}
 | 
						|
</style>
 |