diff --git a/xinlidsj/App.vue b/xinlidsj/App.vue
index 057b6f9..ecc52d9 100644
--- a/xinlidsj/App.vue
+++ b/xinlidsj/App.vue
@@ -89,4 +89,13 @@
diff --git a/xinlidsj/components/LoginModal.vue b/xinlidsj/components/LoginModal.vue
new file mode 100644
index 0000000..1bd8ec6
--- /dev/null
+++ b/xinlidsj/components/LoginModal.vue
@@ -0,0 +1,439 @@
+
+
+
+
+
+
+
+
+
+ 账号
+
+
+
+
+ 密码
+
+
+
+
+
+ ⚠️
+ {{ errorMsg }}
+
+
+
+
+ ✓
+ {{ successMsg }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/xinlidsj/custom-tab-bar/index.vue b/xinlidsj/custom-tab-bar/index.vue
deleted file mode 100644
index 8c23a79..0000000
--- a/xinlidsj/custom-tab-bar/index.vue
+++ /dev/null
@@ -1,167 +0,0 @@
-
-
-
-
-
-
- 面板
-
-
-
-
-
- 通知
-
-
-
-
-
- 我的
-
-
-
-
-
-
-
diff --git a/xinlidsj/package-lock.json b/xinlidsj/package-lock.json
new file mode 100644
index 0000000..ce6078b
--- /dev/null
+++ b/xinlidsj/package-lock.json
@@ -0,0 +1,6 @@
+{
+ "name": "xinlidsj",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {}
+}
diff --git a/xinlidsj/pages.json b/xinlidsj/pages.json
index ca3097d..93988a2 100644
--- a/xinlidsj/pages.json
+++ b/xinlidsj/pages.json
@@ -190,29 +190,11 @@
"backgroundColor": "#050b18"
},
"tabBar": {
- "custom": true,
- "color": "#646a73",
- "selectedColor": "#1677ff",
- "backgroundColor": "#ffffff",
- "borderStyle": "black",
+ "custom": false,
"list": [
{
"pagePath": "pages/index/index",
- "text": "面板",
- "iconPath": "static/home.png",
- "selectedIconPath": "static/home.png"
- },
- {
- "pagePath": "pages/message/notice",
- "text": "通知",
- "iconPath": "static/notice.png",
- "selectedIconPath": "static/notice.png"
- },
- {
- "pagePath": "pages/settings/index",
- "text": "我的",
- "iconPath": "static/my_light.png",
- "selectedIconPath": "static/my_light.png"
+ "text": "首页"
}
]
},
diff --git a/xinlidsj/pages/dashboard/index.vue b/xinlidsj/pages/dashboard/index.vue
index 2b2b108..6b9af6c 100644
--- a/xinlidsj/pages/dashboard/index.vue
+++ b/xinlidsj/pages/dashboard/index.vue
@@ -982,9 +982,9 @@
content: '';
position: absolute;
left: 0;
- top: 6rpx;
+ top: 10rpx;
width: 6rpx;
- height: 24rpx;
+ height: 100rpx;
border-radius: 6rpx;
background: linear-gradient(180deg, rgba(116, 216, 255, 0.95) 0%, rgba(43, 107, 255, 0.85) 100%);
}
diff --git a/xinlidsj/pages/index/index.vue b/xinlidsj/pages/index/index.vue
index df80191..47875c4 100644
--- a/xinlidsj/pages/index/index.vue
+++ b/xinlidsj/pages/index/index.vue
@@ -1,5 +1,6 @@
-
+
+
核心功能
@@ -124,6 +125,9 @@
+
+
+
@@ -231,6 +235,13 @@
+
+
+
+
+
+
diff --git a/xinlidsj/pages/profile/tagFilter.vue b/xinlidsj/pages/profile/tagFilter.vue
index b69867d..353390e 100644
--- a/xinlidsj/pages/profile/tagFilter.vue
+++ b/xinlidsj/pages/profile/tagFilter.vue
@@ -1,8 +1,13 @@
- 标签筛选
- 按标签快速定位重点人员
+
+
+
+
+ 标签筛选
+ 按标签快速定位重点人员
+
@@ -81,6 +86,11 @@
}
},
methods: {
+ goBack() {
+ uni.navigateBack({
+ delta: 1
+ })
+ },
fetchTagOptions() {
this.tagLoading = true
const defaultOptions = [
@@ -208,11 +218,36 @@
background: linear-gradient(90deg, rgba(2, 8, 22, 0.86) 0%, rgba(2, 8, 22, 0.40) 50%, rgba(2, 8, 22, 0.86) 100%);
box-shadow: 0 10rpx 22rpx rgba(0, 0, 0, 0.35), 0 0 24rpx rgba(0, 166, 255, 0.14);
display: flex;
- flex-direction: column;
+ flex-direction: row;
align-items: center;
justify-content: center;
gap: 6rpx;
margin-bottom: 18rpx;
+ position: relative;
+ }
+ .page.big .big-back {
+ position: absolute;
+ left: 20rpx;
+ top: 50%;
+ transform: translateY(-50%);
+ width: 60rpx;
+ height: 60rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 12rpx;
+ background: rgba(0, 188, 255, 0.12);
+ border: 1px solid rgba(0, 188, 255, 0.22);
+ cursor: pointer;
+ }
+ .page.big .big-back:active {
+ background: rgba(0, 188, 255, 0.20);
+ }
+ .page.big .big-top-content {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 6rpx;
}
.page.big .big-title {
font-size: 34rpx;
diff --git a/xinlidsj/static/7.png b/xinlidsj/static/7.png
new file mode 100644
index 0000000..9631c25
Binary files /dev/null and b/xinlidsj/static/7.png differ
diff --git a/xinlidsj/utils/auth.js b/xinlidsj/utils/auth.js
index 7abfce5..5eb3165 100644
--- a/xinlidsj/utils/auth.js
+++ b/xinlidsj/utils/auth.js
@@ -11,3 +11,4 @@ export function setToken(token) {
export function clearToken() {
uni.removeStorageSync(STORAGE_KEYS.token)
}
+
diff --git a/xinlidsj/登录弹窗实现说明.md b/xinlidsj/登录弹窗实现说明.md
new file mode 100644
index 0000000..eaf3f3d
--- /dev/null
+++ b/xinlidsj/登录弹窗实现说明.md
@@ -0,0 +1,106 @@
+# 登录弹窗实现说明
+
+## 功能概述
+实现了用户访问系统时,如果未登录则自动弹出登录弹窗,要求用户登录后才能使用系统功能。
+
+## 实现方式
+
+### 1. 创建登录弹窗组件
+**文件**: `xinlidsj/components/LoginModal.vue`
+
+**功能特点**:
+- 美观的弹窗UI设计
+- 支持账号密码登录
+- 登录状态加载提示
+- 登录成功后自动关闭弹窗并刷新页面
+- 可配置是否允许关闭(`closable`属性)
+- 自动记住上次登录的账号
+
+**使用方法**:
+```vue
+
+```
+
+**Props**:
+- `show`: Boolean - 是否显示弹窗
+- `closable`: Boolean - 是否允许关闭弹窗(默认false,强制登录)
+
+**Events**:
+- `success`: 登录成功时触发
+- `close`: 关闭弹窗时触发
+
+### 2. 首页集成登录弹窗
+**文件**: `xinlidsj/pages/index/index.vue`
+
+**修改内容**:
+1. 引入 `LoginModal` 组件
+2. 添加 `showLoginModal` 数据属性
+3. 在 `onLoad` 和 `onShow` 生命周期中检查登录状态
+4. 未登录时显示登录弹窗
+5. 登录成功后初始化应用数据
+
+**核心逻辑**:
+```javascript
+onLoad() {
+ // 检查登录状态
+ const token = getToken()
+ if (!token) {
+ this.showLoginModal = true // 显示登录弹窗
+ return
+ }
+ this.initApp() // 已登录,初始化应用
+}
+```
+
+### 3. 登录成功处理
+登录成功后的流程:
+1. 保存token到本地存储
+2. 触发 `success` 事件
+3. 父组件调用 `onLoginSuccess()` 方法
+4. 初始化应用数据(加载视频、消息、数据等)
+5. 自动关闭登录弹窗
+6. 刷新当前页面
+
+## 用户体验
+
+### 未登录状态
+- 访问首页时自动弹出登录弹窗
+- 弹窗遮罩层阻止用户操作页面内容
+- 不允许关闭弹窗(`closable=false`),必须登录
+- 点击遮罩层会提示"请先登录后才能使用"
+
+### 登录过程
+- 输入账号密码
+- 点击登录按钮或按回车键提交
+- 显示"登录中..."加载状态
+- 登录失败显示错误提示
+- 登录成功显示成功提示并自动关闭弹窗
+
+### 已登录状态
+- 直接进入系统,不显示登录弹窗
+- 正常使用所有功能
+
+## 样式特点
+- 现代化的弹窗设计
+- 半透明黑色遮罩层
+- 圆角卡片式弹窗
+- 输入框聚焦时高亮效果
+- 响应式布局,适配不同屏幕尺寸
+
+## 扩展性
+如果需要在其他页面也使用登录弹窗,只需:
+1. 引入 `LoginModal` 组件
+2. 添加 `showLoginModal` 数据属性
+3. 在页面加载时检查登录状态
+4. 根据需要设置 `closable` 属性
+
+## 注意事项
+1. 登录弹窗使用 `z-index: 9999` 确保在最上层显示
+2. 弹窗不可关闭时,点击遮罩层会有友好提示
+3. 登录成功后会自动刷新当前页面数据
+4. 密码输入框使用 `password` 类型,确保安全性