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>
|