liuhairui 4 mesi fa
parent
commit
0f441ff02b
100 ha cambiato i file con 1783 aggiunte e 674 eliminazioni
  1. 9 0
      .hbuilderx/launch.json
  2. 194 54
      App.vue
  3. 21 5
      api/index.js
  4. 0 148
      components/luch-request/custom/service.js
  5. 1 1
      pages.json
  6. 383 198
      pages/index/index.vue
  7. 6 8
      pages/login/login.vue
  8. 244 260
      pages/mine/manage.vue
  9. BIN
      static/123.png
  10. 0 0
      unpackage/cache/wgt/__UNI__9F8B139/__uniappchooselocation.js
  11. BIN
      unpackage/cache/wgt/__UNI__9F8B139/__uniapperror.png
  12. 0 0
      unpackage/cache/wgt/__UNI__9F8B139/__uniappes6.js
  13. 0 0
      unpackage/cache/wgt/__UNI__9F8B139/__uniappopenlocation.js
  14. 0 0
      unpackage/cache/wgt/__UNI__9F8B139/__uniapppicker.js
  15. 6 0
      unpackage/cache/wgt/__UNI__9F8B139/__uniappquill.js
  16. 0 0
      unpackage/cache/wgt/__UNI__9F8B139/__uniappquillimageresize.js
  17. 0 0
      unpackage/cache/wgt/__UNI__9F8B139/__uniappscan.js
  18. BIN
      unpackage/cache/wgt/__UNI__9F8B139/__uniappsuccess.png
  19. 25 0
      unpackage/cache/wgt/__UNI__9F8B139/__uniappview.html
  20. 8 0
      unpackage/cache/wgt/__UNI__9F8B139/app-config-service.js
  21. 1 0
      unpackage/cache/wgt/__UNI__9F8B139/app-config.js
  22. 0 0
      unpackage/cache/wgt/__UNI__9F8B139/app-service.js
  23. 0 0
      unpackage/cache/wgt/__UNI__9F8B139/app-view.js
  24. 0 0
      unpackage/cache/wgt/__UNI__9F8B139/manifest.json
  25. BIN
      unpackage/cache/wgt/__UNI__9F8B139/nativeplugins/Alvin-CBZUhfModule/android/UhfChengBangZi-release.aar
  26. BIN
      unpackage/cache/wgt/__UNI__9F8B139/nativeplugins/Alvin-CBZUhfModule/android/libs/armeabi-v7a/libserial_port.so
  27. 25 0
      unpackage/cache/wgt/__UNI__9F8B139/nativeplugins/Alvin-CBZUhfModule/package.json
  28. 25 0
      unpackage/cache/wgt/__UNI__9F8B139/nativeplugins/Alvin-CBZUhfModule/使用说明.md
  29. BIN
      unpackage/cache/wgt/__UNI__9F8B139/static/123.png
  30. BIN
      unpackage/cache/wgt/__UNI__9F8B139/static/empty.png
  31. BIN
      unpackage/cache/wgt/__UNI__9F8B139/static/logo.png
  32. BIN
      unpackage/cache/wgt/__UNI__9F8B139/static/menu_mine.png
  33. BIN
      unpackage/cache/wgt/__UNI__9F8B139/static/menu_mine_selected.png
  34. BIN
      unpackage/cache/wgt/__UNI__9F8B139/static/menu_search.png
  35. BIN
      unpackage/cache/wgt/__UNI__9F8B139/static/menu_search_selected.png
  36. BIN
      unpackage/cache/wgt/__UNI__9F8B139/static/nologin.png
  37. BIN
      unpackage/cache/wgt/__UNI__9F8B139/static/scan.png
  38. BIN
      unpackage/cache/wgt/__UNI__9F8B139/static/workbench/archive.png
  39. BIN
      unpackage/cache/wgt/__UNI__9F8B139/static/workbench/inspection.png
  40. BIN
      unpackage/cache/wgt/__UNI__9F8B139/static/workbench/maintenance.png
  41. BIN
      unpackage/cache/wgt/__UNI__9F8B139/static/workbench/repair.png
  42. BIN
      unpackage/cache/wgt/__UNI__9F8B139/static/workbench/repair1.png
  43. BIN
      unpackage/cache/wgt/__UNI__9F8B139/static/workbench/repair_pool.png
  44. BIN
      unpackage/cache/wgt/__UNI__9F8B139/static/workbench/scrapped.png
  45. 0 0
      unpackage/cache/wgt/__UNI__9F8B139/view.css
  46. 0 0
      unpackage/cache/wgt/__UNI__9F8B139/view.umd.min.js
  47. BIN
      unpackage/debug/android_debug.apk
  48. 0 0
      unpackage/dist/build/.automator/app-plus/.automator.json
  49. 0 0
      unpackage/dist/build/app-plus/__uniappchooselocation.js
  50. BIN
      unpackage/dist/build/app-plus/__uniapperror.png
  51. 0 0
      unpackage/dist/build/app-plus/__uniappes6.js
  52. 0 0
      unpackage/dist/build/app-plus/__uniappopenlocation.js
  53. 0 0
      unpackage/dist/build/app-plus/__uniapppicker.js
  54. 6 0
      unpackage/dist/build/app-plus/__uniappquill.js
  55. 0 0
      unpackage/dist/build/app-plus/__uniappquillimageresize.js
  56. 0 0
      unpackage/dist/build/app-plus/__uniappscan.js
  57. BIN
      unpackage/dist/build/app-plus/__uniappsuccess.png
  58. 25 0
      unpackage/dist/build/app-plus/__uniappview.html
  59. 8 0
      unpackage/dist/build/app-plus/app-config-service.js
  60. 1 0
      unpackage/dist/build/app-plus/app-config.js
  61. 0 0
      unpackage/dist/build/app-plus/app-service.js
  62. 0 0
      unpackage/dist/build/app-plus/app-view.js
  63. 0 0
      unpackage/dist/build/app-plus/manifest.json
  64. BIN
      unpackage/dist/build/app-plus/static/123.png
  65. BIN
      unpackage/dist/build/app-plus/static/empty.png
  66. BIN
      unpackage/dist/build/app-plus/static/logo.png
  67. BIN
      unpackage/dist/build/app-plus/static/menu_mine.png
  68. BIN
      unpackage/dist/build/app-plus/static/menu_mine_selected.png
  69. BIN
      unpackage/dist/build/app-plus/static/menu_search.png
  70. BIN
      unpackage/dist/build/app-plus/static/menu_search_selected.png
  71. BIN
      unpackage/dist/build/app-plus/static/nologin.png
  72. BIN
      unpackage/dist/build/app-plus/static/scan.png
  73. BIN
      unpackage/dist/build/app-plus/static/workbench/archive.png
  74. BIN
      unpackage/dist/build/app-plus/static/workbench/inspection.png
  75. BIN
      unpackage/dist/build/app-plus/static/workbench/maintenance.png
  76. BIN
      unpackage/dist/build/app-plus/static/workbench/repair.png
  77. BIN
      unpackage/dist/build/app-plus/static/workbench/repair1.png
  78. BIN
      unpackage/dist/build/app-plus/static/workbench/repair_pool.png
  79. BIN
      unpackage/dist/build/app-plus/static/workbench/scrapped.png
  80. 0 0
      unpackage/dist/build/app-plus/view.css
  81. 0 0
      unpackage/dist/build/app-plus/view.umd.min.js
  82. 0 0
      unpackage/dist/dev/.automator/app-plus/.automator.json
  83. 0 0
      unpackage/dist/dev/app-plus/__uniappchooselocation.js
  84. BIN
      unpackage/dist/dev/app-plus/__uniapperror.png
  85. 0 0
      unpackage/dist/dev/app-plus/__uniappes6.js
  86. 0 0
      unpackage/dist/dev/app-plus/__uniappopenlocation.js
  87. 0 0
      unpackage/dist/dev/app-plus/__uniapppicker.js
  88. 6 0
      unpackage/dist/dev/app-plus/__uniappquill.js
  89. 0 0
      unpackage/dist/dev/app-plus/__uniappquillimageresize.js
  90. 0 0
      unpackage/dist/dev/app-plus/__uniappscan.js
  91. BIN
      unpackage/dist/dev/app-plus/__uniappsuccess.png
  92. 25 0
      unpackage/dist/dev/app-plus/__uniappview.html
  93. 8 0
      unpackage/dist/dev/app-plus/app-config-service.js
  94. 154 0
      unpackage/dist/dev/app-plus/app-config.js
  95. 9 0
      unpackage/dist/dev/app-plus/app-service.js
  96. 593 0
      unpackage/dist/dev/app-plus/app-view.js
  97. 0 0
      unpackage/dist/dev/app-plus/manifest.json
  98. BIN
      unpackage/dist/dev/app-plus/static/123.png
  99. BIN
      unpackage/dist/dev/app-plus/static/empty.png
  100. BIN
      unpackage/dist/dev/app-plus/static/logo.png

+ 9 - 0
.hbuilderx/launch.json

@@ -0,0 +1,9 @@
+{
+    "version" : "1.0",
+    "configurations" : [
+        {
+            "playground" : "custom",
+            "type" : "uni-app:app-android"
+        }
+    ]
+}

+ 194 - 54
App.vue

@@ -1,17 +1,17 @@
 <script>
 	export default {
 		onLaunch: function() {
-			console.log('App Launch');
+			// console.log('App Launch');
 			// 检查登录状态
 			this.checkLoginStatus();
 		},
 		onShow: function() {
-			console.log('App Show');
+			// console.log('App Show');
 			// 每次显示应用时检查登录状态
 			this.checkLoginStatus();
 		},
 		onHide: function() {
-			console.log('App Hide');
+			// console.log('App Hide');
 			// 应用进入后台时释放资源
 			this.releaseGlobalResources();
 		},
@@ -127,54 +127,187 @@
 			},
 			
 
+			// Vue2风格的checkLoginStatus方法实现 - 优化版
 			checkLoginStatus: function() {
-				try {
-					const token = uni.getStorageSync('equipment_token');
-					// 获取当前页面路径
-					const pages = getCurrentPages();
-					let currentPath = '';
-					if (pages && pages.length > 0) {
-						const currentPage = pages[pages.length - 1];
-						currentPath = currentPage.route;
-					}
-
-					if (!token) {
-						// 未登录,跳转到登录页面
-						// 检查当前是否已经在登录页面,避免重复跳转
-						if (currentPath !== 'pages/login/login') {
-							uni.redirectTo({
-								url: '/pages/login/login'
-							});
-						}
-					} else {
-						// 已登录,设置全局登录状态
-						const equipmentManage = uni.getStorageSync('equipment_manage');
-						const userInfo = uni.getStorageSync('user_info') || {};
-						this.globalData.isLoggedIn = true;
-						this.globalData.token = token;
-						this.globalData.equipmentManage = equipmentManage;
-						this.globalData.userInfo = userInfo;
-					}
-				} catch (e) {
-					// 错误处理
-					console.error('检查登录状态失败:', e);
-					// 跳转到登录页面
-					// 获取当前页面路径
-					const pages = getCurrentPages();
-					let currentPath = '';
-					if (pages && pages.length > 0) {
-						const currentPage = pages[pages.length - 1];
-						currentPath = currentPage.route;
-					}
-
-					// 检查当前是否已经在登录页面,避免重复跳转
-					if (currentPath !== 'pages/login/login') {
-						uni.redirectTo({
-							url: '/pages/login/login'
-						});
-					}
-				}
-			},
+			// 防止短时间内重复导航到登录页面
+			if (this.isNavigatingToLogin) {
+			console.log('正在导航到登录页面,忽略重复调用');
+			return;
+			}
+			
+			try {
+			// 1. 首先尝试从全局数据获取
+			let token = this.globalData.token;
+			let expireAt = this.globalData.expireAt;
+			let userInfo = this.globalData.userInfo;
+			
+			// 2. 如果全局数据不可用,尝试从本地存储恢复
+			if (!token || !expireAt) {
+			token = uni.getStorageSync('equipment_token');
+			expireAt = uni.getStorageSync('token_expire_time');
+			userInfo = uni.getStorageSync('user_info');
+			
+			// 添加详细日志,帮助调试
+			console.log('从本地存储获取登录信息 - token:', !!token, 'expireAt:', !!expireAt);
+			
+			// 如果从本地存储恢复成功,更新全局数据
+			if (token && expireAt) {
+			this.globalData.token = token;
+			this.globalData.expireAt = expireAt;
+			this.globalData.userInfo = userInfo;
+			this.globalData.isLoggedIn = true;
+			console.log('从本地存储恢复登录信息成功');
+			}
+			}
+			
+			// 获取当前页面路径
+			const pages = getCurrentPages();
+			let currentPath = '';
+			if (pages && pages.length > 0) {
+			const currentPage = pages[pages.length - 1];
+			currentPath = currentPage.route;
+			console.log('当前页面路径:', currentPath);
+			}
+		
+			// 移除特殊账号处理逻辑,统一按token和过期时间判断
+			if (!token || !expireAt) {
+			// 未登录或缺少过期时间,跳转到登录页面
+			// 检查当前是否已经在登录页面,避免重复跳转
+			if (currentPath !== 'pages/login/login') {
+			console.log('未登录或缺少过期时间,跳转到登录页面');
+			this.isNavigatingToLogin = true;
+			uni.redirectTo({
+			url: '/pages/login/login',
+			success: function() {
+			console.log('导航到登录页面成功');
+			// 导航成功后重置标志
+			setTimeout(function() {
+			this.isNavigatingToLogin = false;
+			}.bind(this), 1000);
+			}.bind(this),
+			fail: function(err) {
+			console.error('导航到登录页面失败:', err);
+			this.isNavigatingToLogin = false;
+			}.bind(this)
+			});
+			} else {
+			console.log('已经在登录页面,无需跳转');
+			}
+			} else {
+			// 检查token是否过期
+			let expireTime;
+			try {
+			// 健壮的过期时间解析逻辑
+			if (typeof expireAt === 'string') {
+			// 尝试直接解析为数字
+			const timestamp = parseInt(expireAt);
+			if (!isNaN(timestamp)) {
+			expireTime = timestamp;
+			} else {
+			// 如果不是数字字符串,尝试作为日期字符串解析
+			expireTime = new Date(expireAt).getTime();
+			}
+			} else if (typeof expireAt === 'number') {
+			// 如果已经是数字类型,直接使用
+			expireTime = expireAt;
+			}
+			} catch (e) {
+			console.error('解析过期时间失败:', e);
+			}
+		
+			// 添加详细日志,记录过期时间解析结果
+			console.log('过期时间解析结果 - expireAt:', expireAt, 'expireTime:', expireTime);
+			
+			// 确保过期时间有效
+			if (isNaN(expireTime)) {
+			console.error('无效的过期时间:', expireAt);
+			// 跳转到登录页
+			if (currentPath !== 'pages/login/login') {
+			this.isNavigatingToLogin = true;
+			uni.redirectTo({
+			url: '/pages/login/login',
+			success: function() {
+			setTimeout(function() {
+			this.isNavigatingToLogin = false;
+			}.bind(this), 1000);
+			}.bind(this),
+			fail: function(err) {
+			console.error('导航到登录页面失败:', err);
+			this.isNavigatingToLogin = false;
+			}.bind(this)
+			});
+			}
+			return;
+			}
+		
+			const currentTime = new Date().getTime();
+		
+			// 提前1分钟检查过期,给用户预留时间
+			if (currentTime + 60 * 1000 > expireTime) {
+			console.log('登录即将过期或已过期,需要重新登录 - 当前时间:', currentTime, '过期时间:', expireTime);
+			// 清除登录信息
+			this.globalData.token = '';
+			this.globalData.expireAt = '';
+			this.globalData.userInfo = {};
+			this.globalData.isLoggedIn = false;
+			uni.removeStorageSync('equipment_token');
+			uni.removeStorageSync('token_expire_time');
+			uni.removeStorageSync('user_info');
+		
+			// 跳转到登录页面
+			if (currentPath !== 'pages/login/login') {
+			this.isNavigatingToLogin = true;
+			uni.redirectTo({
+			url: '/pages/login/login',
+			success: function() {
+			console.log('导航到登录页面成功');
+			// 导航成功后重置标志
+			setTimeout(function() {
+			this.isNavigatingToLogin = false;
+			}.bind(this), 1000);
+			}.bind(this),
+			fail: function(err) {
+			console.error('导航到登录页面失败:', err);
+			this.isNavigatingToLogin = false;
+			}.bind(this)
+			});
+			}
+			} else {
+			// 已登录且token有效,设置全局登录状态
+			this.globalData.isLoggedIn = true;
+			this.globalData.token = token;
+			this.globalData.expireAt = expireAt;
+			this.globalData.equipmentManage = this.globalData.equipmentManage || 0;
+			this.globalData.userInfo = userInfo;
+		
+			// 计算剩余时间并记录日志,帮助调试
+			const remainingTime = (expireTime - currentTime) / 1000 / 60; // 转换为分钟
+			console.log('登录状态有效,无需重新登录 - 剩余时间约:', Math.round(remainingTime), '分钟');
+		
+			// 如果已经在登录页面,自动跳转到首页
+			if (currentPath === 'pages/login/login') {
+			console.log('登录状态有效但当前在登录页面,自动跳转到首页');
+			this.isNavigatingToLogin = true;
+			setTimeout(function() {
+			uni.switchTab({
+			url: '/pages/index/index',
+			success: function() {
+			console.log('从登录页跳转到首页成功');
+			this.isNavigatingToLogin = false;
+			}.bind(this),
+			fail: function(err) {
+			console.error('从登录页跳转到首页失败:', err);
+			this.isNavigatingToLogin = false;
+			}.bind(this)
+			});
+			}.bind(this), 500);
+			}
+			}
+			}
+		} catch (e) {
+			console.error('检查登录状态时发生错误:', e);
+		}
+	},
 			
 			// 重置插件实例
 			resetPluginInstance: function() {
@@ -192,12 +325,19 @@
 			}
 		},
 		globalData: {
-			isLoggedIn: false,
-			token: '',
-			equipmentManage: 0,
-			userInfo: {}
+		isLoggedIn: false,
+		token: '',
+		expireAt: '',
+		equipmentManage: 0,
+		userInfo: {}
+	},
+	// 导航状态控制
+	data() {
+		return {
+			isNavigatingToLogin: false
 		}
 	}
+	}
 </script>
 
 <style>

+ 21 - 5
api/index.js

@@ -1,21 +1,37 @@
 // api/index.js - 集中管理API接口
 
 // 基础URL
-const BASE_URL = getApp().globalData.apiUrl || 'http://dev-rfid.7in6.com/index.php/api/index';
+// 确保URL格式正确,包含完整协议前缀
+
+// 本地地址 
+const BASE_URL = getApp().globalData.apiUrl || 'http://120.202.56.6:23611/api';
+
 
 // API接口集合
 const API = {
+  // 通过提交的用户id保存当前编号信息
+  postUserSetup: `${BASE_URL}/rfidApp/postUserSetup`,
+
   // 获取栋舍列表
-  getBuilding: `${BASE_URL}/get_building`,
+  getBuilding: `${BASE_URL}/rfidApp/getBuilding`,
   
   // 获取房间列表
-  getRoom: `${BASE_URL}/get_room`,
+  getRoom: `${BASE_URL}/rfidApp/getRoom`,
   
   // 获取栏位列表
-  getField: `${BASE_URL}/get_field`,
+  getPen: `${BASE_URL}/rfidApp/getPen`,
+  
+  //获取用户信息
+  userList: `${BASE_URL}/rfidApp/userList`,
   
   // 提交数据
-  postListAdd: `${BASE_URL}/post_listadd`,
+  postListAdd: `${BASE_URL}/rfidApp/postListAdd`,
+  
+  // 用户登录 - 直接使用完整URL避免拼接问题
+  Login: `${BASE_URL}/clientUser/login`,
+  
+  // 获取当前用户信息/rfidApp/userList
+  // userList: `${BASE_URL}/clientuser/getUserInfo`,
 };
 
 export default API;

+ 0 - 148
components/luch-request/custom/service.js

@@ -1,148 +0,0 @@
-/**
- * @version 3.0.7
- * @Author lu-ch
- * @Date 2021-09-04
- * @Email webwork.s@qq.com
- * 文档: https://www.quanzhan.co/luch-request/
- * github: https://github.com/lei-mu/luch-request
- * DCloud: http://ext.dcloud.net.cn/plugin?id=392
- * HBuilderX: beat-3.0.4 alpha-3.0.4
- */
-
-import { // 局部引入
-	auth
-} from './api.js'
-import Config from '@/utils/config.js'
-import Request from '../index.js'
-
-const http = new Request({
-	validateStatus: (statusCode) => { // statusCode 必存在。此处示例为全局默认配置
-		return (statusCode >= 200 && statusCode < 300) || statusCode == 401
-	}
-})
-http.setConfig((config) => { /* 设置全局配置 */
-	config.baseURL = Config.apiUrl
-	config.header = {
-		...config.header,
-		ContentType: 'application/json;charset=UTF-8',
-		ContentType: 'application/x-www-form-urlencoded',
-		'Accept-Language': 'zh-CN,zh',
-		'X-Requested-With': 'XMLHttpRequest'
-	}
-	return config
-})
-
-http.interceptors.request.use((config) => { /* 请求之前拦截器。可以使用async await 做异步操作 */
-	config.header = {
-		...config.header,
-		'token': getTokenStorage()
-	}
-	/*
-	 if (!token) { // 如果token不存在,return Promise.reject(config) 会取消本次请求
-	   return Promise.reject(config)
-	 }
-	 */
-	return config
-}, (config) => {
-	return Promise.reject(config)
-})
-
-http.interceptors.response.use(async (response) => { /* 请求之后拦截器。可以使用async await 做异步操作  */
-	// if (response.data.code !== 200) { // 服务端返回的状态码不等于200,则reject()
-	//   return Promise.reject(response)
-	// }
-
-	const {
-		statusCode,
-		config
-	} = response
-	try {
-		return await handleCode(response, statusCode, config)
-	} catch (err) {
-		return Promise.reject(err)
-	}
-
-	return response
-}, (response) => { // 请求错误做点什么。可以使用async await 做异步操作
-	console.log(response)
-	return Promise.reject(response)
-})
-
-
-/**
- * 获取 token
- * @return {string}
- */
-const getTokenStorage = () => {
-	return uni.getStorageSync('equipment_token') || ''
-}
-
-/**
- * 重新请求更新获取 `token`
- * @param {number} uid
- * @return {Promise}
- */
-const getApiToken = () => {
-	let params = { // 重新授权登录
-		code: uni.getStorageSync('equipment_code') || '',
-		openid: uni.getStorageSync('equipment_openid') || '',
-		token: uni.getStorageSync('equipment_token') || '', 
-	}
-	return auth(params).then((res) => {
-		return res.data
-	})
-}
-
-/**
- * 保存 token 到 localStorage
- * @param {object} data
- */
-const saveTokenOpenid = (data) => {
-	uni.setStorageSync('equipment_token', data.token)
-	if (data.openid != '') {
-		uni.setStorageSync('equipment_openid', data.openid)
-	}
-}
-
-/**
- * 处理 http状态码
- * @param {object} o
- * @param {object} o.res 请求返回的数据
- * @param {object} o.config 本次请求的config数据
- * @param {string|number} o.statusCode http状态码
- * @return {object|Promise<reject>}
- */
-const handleCode = (res, statusCode, config) => {
-	const STATUS = {
-		'200'() {
-			if (res.data.code == 1) {
-				return res.data
-			} else {
-				return Promise.reject(res.data)
-			}
-		},
-		'401'() {
-			// 定义实例发送次数
-			if (!config.hasOwnProperty("count")) {
-				config.count = 0
-			}
-
-			// 只让这个实例发送一次请求,如果code还是401则抛出错误
-			if (config.count === 1) {
-				return Promise.reject(res)
-			}
-
-			config.count++; // count字段自增,可以用来判断请求次数,避免多次发送重复的请求
-
-			return getApiToken()
-				.then(saveTokenOpenid)
-				.then(() => http.request(config))
-		}
-	}
-
-	return STATUS[statusCode] ? STATUS[statusCode]() : Promise.reject(res) // 有状态码但不在这个封装的配置里,就直接进入 `fail`
-}
-
-export {
-	http
-}

+ 1 - 1
pages.json

@@ -10,7 +10,7 @@
 		{
 			"path": "pages/index/index",
 			"style": {
-				"navigationBarTitleText": "养猪场数据采集系统"
+				"navigationBarTitleText": "今楚联合育种种猪智能选留系统"
 			}
 		},
 		{

+ 383 - 198
pages/index/index.vue

@@ -21,12 +21,14 @@
             <button class="manual-btn" @click="init" :disabled="isDisable">
               <text class="fa fa-power-off"></text> {{ isDeviceReady ? '已开启' : '开启设备' }}
             </button>
-			<!-- <button class="btn" type="primary" @click="release" :disabled="isReDisabled">release</button> -->
-            <button class="scan-btn" @click="scan" :disabled="!isDisable">
-              <text class="fa fa-camera"></text> 扫描耳标签
+            <!-- 释放端口按钮 -->
+			      <!-- <button class="btn" type="primary" @click="release" :disabled="isReDisabled">release</button> -->
+            <button class="scan-btn" @click="toggleContinuousScan" :disabled="!isDisable">
+              <text class="fa fa-camera"></text> {{ isContinuousScanning ? '停止持续扫描' : '开始持续扫描' }}
             </button>
           </view>
           <input class="input-box" v-model="form.earId" disabled placeholder="当前FID标签号码将显示在这里" style="height: 30px;width: 95%;" />
+
           <!-- 存储的FID标签数据 -->
           <scroll-view scroll-y class="sv">
             <view v-for="(item, index) in dataList" :key="index" class="data-item">
@@ -41,7 +43,7 @@
           </scroll-view>
         </view>
 
-        <!-- 操作按钮 -->
+        <!-- 操作按钮部分 -->
         <view class="btn-group">
           <button class="manual-btn" @click="resetForm">重置</button>
           <button class="scan-btn" @click="submitForm">提交数据</button>
@@ -72,6 +74,8 @@ export default {
         retryTimeout: null,     // 重试计时器
         maxScanTimer: null,     // 最大扫描时间计时器
         settingChangeListener: null, // 设置变化监听器
+        isContinuousScanning: false, // 是否正在持续扫描
+        continuousScanInterval: null, // 持续扫描间隔计时器
         
         // 列表数据
         buildingList: [],       // 栋舍列表
@@ -123,6 +127,7 @@ export default {
     
     // 监听全局设置变化
     this.settingChangeListener = uni.$on('settingsUpdated', (settings) => {
+      console.log('监听到设置更新事件,更新设置:', settings);
       this.loadSavedSettings(settings);
     });
   },
@@ -132,68 +137,29 @@ export default {
    * @param {number} retryCount - 当前重试次数
    */
   initializePluginWithRetry(retryCount = 0) {
-	
-	console.log('设备初始化成功');
-      this.isDisable = false;
-      uni.showToast({
-        title: '设备初始化成功',
-        icon: 'success',
-        duration: 2000
-      });
-
-	//如果开启设备 初始化失败,重试,请打开下面代码,上方代码可以删除掉
-    const MAX_RETRIES = 1;
-    const RETRY_DELAY = 2000; // 2秒
-    const isPluginInitialized = this.initPluginInstance();
-    // if (!isPluginInitialized) {
-    //   console.warn(`Plugin initialization failed (attempt ${retryCount + 1}/${MAX_RETRIES})`);
-    //   this.isDisable = true; // 禁用依赖插件的按钮
-      
-    //   // 如果未达到最大重试次数,继续重试
-    //   if (retryCount < MAX_RETRIES) {
-    //     console.log(`Retrying plugin initialization after ${RETRY_DELAY}ms`);
-    //     setTimeout(() => {
-    //       if (this._isMounted) {
-    //         this.initializePluginWithRetry(retryCount + 1);
-    //       }
-    //     }, RETRY_DELAY);
-    //   } else {
-    //     console.error('Max retries reached for plugin initialization');
-    //     uni.showToast({
-    //       title: '设备初始化失败,请重启应用',
-    //       icon: 'none',
-    //       duration: 3000
-    //     });
-    //   }
-    // } else {
-    //   console.log('Plugin initialized successfully');
-    //   this.isDisable = false;
-    //   uni.showToast({
-    //     title: '设备初始化成功',
-    //     icon: 'success',
-    //     duration: 2000
-    //   });
-    // }
+	  console.log('设备初始化成功');
+    this.isDisable = false;
   },
 
   beforeUnmount() {
     // 标记组件已卸载
     this._isMounted = false;
-    
+    // 停止持续扫描
+    this.isContinuousScanning = false;
+    if (this.continuousScanInterval) {
+      clearTimeout(this.continuousScanInterval);
+      this.continuousScanInterval = null;
+    }
     // 清除所有计时器
     this.cancelScan();
-    
     // 释放设备
     this.releaseDevice();
-    
     // 清理插件实例
     this.uhfSFHelper = null;
-    
     // 移除事件监听
     if (this.settingChangeListener) {
       uni.$off('settingsUpdated', this.settingChangeListener);
     }
-    
     // 移除登录成功事件监听
     if (this.reloadUserSettingsListener) {
       uni.$off('reloadUserSettings', this.reloadUserSettingsListener);
@@ -201,23 +167,81 @@ export default {
   },
   
   /**
-   * 页面显示时触发,确保获取最新的编号信息
+   * 页面显示时触发,确保获取最新的编号信息并检查登录状态
    */
   onShow() {
     this.loadSavedSettings();
+    this.checkTokenExpiration();
   },
   
   methods: {
+    /**
+     * 检查token是否过期
+     */
+    checkTokenExpiration() {
+      const app = getApp();
+
+      // 获取过期时间和token
+      let expireAt = app.globalData.expireAt || uni.getStorageSync('token_expire_time') || '';
+      const token = app.globalData.token || uni.getStorageSync('equipment_token') || '';
+
+      // 如果没有token或过期时间,视为未登录
+      if (!token || !expireAt) {
+        console.log('未登录或缺少登录信息');
+        // 不要直接跳转登录页,让App.vue的checkLoginStatus来处理
+        return;
+      }
+
+      try {
+        // 解析过期时间和当前时间
+        let expireTime;
+        
+        // 处理不同类型的expireAt
+        if (typeof expireAt === 'string') {
+          // 尝试直接解析为数字
+          const timestamp = parseInt(expireAt);
+          if (!isNaN(timestamp)) {
+            expireTime = timestamp;
+          } else {
+            // 如果不是数字字符串,尝试作为日期字符串解析
+            expireTime = new Date(expireAt).getTime();
+          }
+        } else if (typeof expireAt === 'number') {
+          // 如果已经是数字类型,直接使用
+          expireTime = expireAt;
+        }
+
+        // 确保过期时间有效
+        if (isNaN(expireTime)) {
+          console.error('无效的过期时间:', expireAt);
+          return;
+        }
+
+        const currentTime = new Date().getTime();
+
+        // 提前1分钟检查过期,给用户预留时间
+      const earlyCheckTime = 60 * 1000;
+      if (currentTime + earlyCheckTime > expireTime) {
+        console.log('登录即将过期或已过期');
+        // 不要直接跳转登录页,让App.vue的checkLoginStatus来处理
+      }
+      } catch (error) {
+        console.error('检查token过期时发生错误:', error);
+      }
+    },
     /**
    * 带重试的插件初始化
    * @param {number} retryCount - 当前重试次数
    */
   initializePluginWithRetry(retryCount = 0) {
-    const MAX_RETRIES = 1;
+    const MAX_RETRIES = 3; // 增加重试次数到3次
     const RETRY_DELAY = 2000; // 2秒
+    
+    console.log(`开始插件初始化尝试 ${retryCount + 1}/${MAX_RETRIES}`);
+    
     const isPluginInitialized = this.initPluginInstance();
     if (!isPluginInitialized) {
-      console.warn(`Plugin initialization failed (attempt ${retryCount + 1}/${MAX_RETRIES})`);
+      console.warn(`插件初始化失败 (attempt ${retryCount + 1}/${MAX_RETRIES})`);
       this.isDisable = true; // 禁用依赖插件的按钮
       
       // 如果未达到最大重试次数,继续重试
@@ -251,82 +275,116 @@ export default {
      * @param {number} retryCount - 当前重试次数(默认0)
      */
     fetchBuildingList(retryCount = 0) {
+      const MAX_RETRIES = 2; // 最大重试次数
+      
       // 显示加载提示
       if (retryCount === 0) {
         uni.showLoading({ title: '加载栋舍列表...', mask: true });
       }
       
-      // 发送请求到API获取栋舍列表
+      //获取栋舍列表
       uni.request({
         url: API.getBuilding,
         method: 'GET',
         timeout: 10000, // 增加超时时间到10秒
+        header: {
+          'content-type': 'application/x-www-form-urlencoded',
+          "x-token": uni.getStorageSync('equipment_token') || ''
+        },
         success: (res) => {
           // 隐藏加载提示
           if (retryCount === 0) {
             uni.hideLoading();
           }
-		// 更新栋舍列表
-		this.buildingList = res.data.data || [];
+          this.buildingList = res.data.data || [];
+        },
+
+        complete: () => {
+          // 确保最终隐藏loading
+          if (retryCount === MAX_RETRIES) {
+            uni.hideLoading();
+          }
         }
       });
     },
 
     /**
      * 加载已保存的设置
-     * @param {object} settings - 可选的设置参数
      */
     loadSavedSettings(settings = null) {
-      const app = getApp();
-      
-      let buildingName, roomName, penNo;
-      
-      // 如果提供了设置参数,优先使用参数值
-      if (settings && typeof settings === 'object') {
-        buildingName = settings.building || '';
-        roomName = settings.room || '';
-        penNo = settings.pen || '';
-        
-        // 更新全局数据
-        app.globalData.buildingName = buildingName;
-        app.globalData.roomName = roomName;
-        app.globalData.penNo = penNo;
-        
-        // 更新本地存储
-        uni.setStorageSync('buildingName', buildingName);
-        uni.setStorageSync('roomName', roomName);
-        uni.setStorageSync('penNo', penNo);
-      } else {
-        // 从全局数据或本地存储获取编号信息
-        buildingName = app.globalData.buildingName || uni.getStorageSync('buildingName') || '';
-        roomName = app.globalData.roomName || uni.getStorageSync('roomName') || '';
-        penNo = app.globalData.penNo || uni.getStorageSync('penNo') || '';
-      }
       
-      // 更新表单数据
-      this.form.buildingName = buildingName;
-      this.form.roomName = roomName;
-      this.form.penNo = penNo;
-      
-      // 如果栋舍不为空且房间列表为空,加载房间列表
-      if (buildingName && this.roomList.length === 0) {
-        this.fetchRoomList(buildingName);
-      } else if (buildingName && this.roomList.length > 0 && roomName) {
-        // 如果房间已变更,更新房间列表
-        this.fetchRoomList(buildingName);
-      }
+    const app = getApp();
+    console.log('当前全局数据完整内容:', JSON.stringify(app.globalData));
+    
+    const buildingName = uni.getStorageSync('building') || '';
+    const roomName = uni.getStorageSync('room') || '';
+    const penNo = uni.getStorageSync('pen') || '';
+
+    this.form.buildingName = buildingName;
+    this.form.roomName = roomName;
+    this.form.penNo = penNo;
+
+    console.log('表单最终赋值结果', this.form.buildingName);
+    console.log('表单最终赋值结果', this.form.roomName);
+    console.log('表单最终赋值结果', this.form.penNo);
+    
+    // 如果栋舍不为空且房间列表为空,加载房间列表
+    if (buildingName && this.roomList.length === 0) {
+      this.fetchRoomList(buildingName);
+    } else if (buildingName && this.roomList.length > 0 && roomName) {
+      // 如果房间已变更,更新房间列表
+      this.fetchRoomList(buildingName);
+    }
+    
+    // 如果房间不为空且栏位列表为空,加载栏位列表
+    if (roomName && this.Fieldnumber.length === 0) {
+      this.fetchFieldList(roomName);
+    } else if (roomName && this.Fieldnumber.length > 0 && penNo) {
+      // 如果栏位已变更,更新栏位列表
+      this.fetchFieldList(roomName);
+    }
+  },
+  
+  /**
+     * 手动刷新全局数据
+     */
+  refreshGlobalData() {
+    console.log('手动刷新全局数据');
+    
+    // 尝试从本地存储恢复最新数据到全局数据
+    try {
+      const app = getApp();
+      const token = uni.getStorageSync('equipment_token') || '';
+      const expireAt = uni.getStorageSync('token_expire_time') || '';
+      const userInfo = uni.getStorageSync('user_info') || {};
+      const building = uni.getStorageSync('building') || '';
+      const room = uni.getStorageSync('room') || '';
+      const pen = uni.getStorageSync('pen') || '';
       
-      // 如果房间不为空且栏位列表为空,加载栏位列表
-      if (roomName && this.Fieldnumber.length === 0) {
-        this.fetchFieldList(roomName);
-      } else if (roomName && this.Fieldnumber.length > 0 && penNo) {
-        // 如果栏位已变更,更新栏位列表
-        this.fetchFieldList(roomName);
+      if (token && expireAt) {
+        app.globalData.token = token;
+        app.globalData.expireAt = expireAt;
+        app.globalData.userInfo = userInfo;
+        app.globalData.isLoggedIn = true;
+        app.globalData.building = building;
+        app.globalData.room = room;
+        app.globalData.pen = pen;
+        app.globalData.buildingName = building;
+        app.globalData.roomName = room;
+        app.globalData.penNo = pen;
+        console.log('从本地存储恢复全局数据成功');
       }
-    },
+    } catch (e) {
+      console.error('从本地存储恢复全局数据失败:', e);
+    }
+    
+    this.loadSavedSettings();
+    // 刷新栋舍列表
+    this.fetchBuildingList();
+  },
     
     /**
-     * 根据栋舍获取房间列表(带重试机制)
+     * 根据栋舍获取房间列表
      * @param {string} buildingName - 栋舍名称
      * @param {number} retryCount - 当前重试次数
      */
@@ -342,6 +400,9 @@ export default {
         method: 'GET',
         data: { building: buildingName },
         timeout: 10000, // 增加超时时间到10秒
+        header: {
+          "x-token": uni.getStorageSync('equipment_token') || ''
+        },
         success: (res) => {
           // 隐藏加载提示
           if (retryCount === 0) {
@@ -358,7 +419,7 @@ export default {
     },
     
     /**
-     * 根据房间名称获取栏位列表(带重试机制)
+     * 根据房间名称获取栏位列表
      * @param {string} roomName - 房间名称
      * @param {number} retryCount - 当前重试次数(默认0)
      */
@@ -373,19 +434,21 @@ export default {
 
       // 发送请求到API获取栏位列表
       uni.request({
-        url: API.getField,
+        url: API.getPen,
         method: 'GET',
-        data: { room: roomName },
         timeout: 10000, // 增加超时时间到10秒
+        header: {
+          "x-token": uni.getStorageSync('equipment_token') || ''
+        },
         success: (res) => {
           // 隐藏加载提示
           if (retryCount === 0) {
-            uni.hideLoading();
+          uni.hideLoading();
           }
-		// 更新栏位列表
-		this.Fieldnumber = res.data.data || [];
-		// 重置栏位选择
-		this.form.penNo = '';
+          // 更新栏位列表
+          this.Fieldnumber = res.data.data || [];
+          // 重置栏位选择
+          this.form.penNo = ''; 
         },
         fail: (err) => {
           // 隐藏加载提示
@@ -429,25 +492,14 @@ export default {
         
         // 验证插件实例是否有效
         if (!this.uhfSFHelper) {
-          console.error('插件实例为空或未定义');
-          // 检查插件是否存在于项目中
-          console.log('检查插件是否存在于项目中...');
-          // 提示可能的解决方案
-          console.warn('可能的解决方案:');
-          console.warn('1. 验证插件名称是否正确:Alvin-CBZUhfModule');
-          console.warn('2. 检查插件是否正确安装在nativeplugins目录中');
-          console.warn('3. 确保您的开发环境支持原生插件');
           return false;
         }
         
         if (typeof this.uhfSFHelper.doInitDevice !== 'function') {
-          console.error('插件实例缺少必要方法: doInitDevice');
-          // 输出插件实例的所有方法,帮助调试
-          console.log('插件实例可用方法:', Object.keys(this.uhfSFHelper));
+          //插件实例缺少必要方法: doInitDevice
           this.uhfSFHelper = null;
           return false;
         }
-        
         console.log('UHF插件实例创建成功');
         return true;
       } catch (e) {
@@ -497,7 +549,6 @@ export default {
       
       if (missingMethods.length > 0) {
         console.error(`插件实例缺少必要方法: ${missingMethods.join(', ')}`);
-        console.log('插件实例可用方法:', Object.keys(this.uhfSFHelper));
         this.uhfSFHelper = null;
         
         // 如果未达到最大重试次数,尝试重新初始化
@@ -540,7 +591,6 @@ export default {
       uni.hideLoading();
       
       console.log('扫描已取消');
-      uni.showToast({ title: '扫描已取消', icon: 'none' });
     },
     
     /**
@@ -613,7 +663,50 @@ export default {
     },
     
     /**
-     * 开始扫描耳标
+     * 切换持续扫描状态
+     */
+    toggleContinuousScan() {
+      // 确保插件实例已初始化且有效
+      if (!this.checkAndRestorePluginInstance()) {
+        return;
+      }
+      
+      if (!this.isDeviceReady) {
+        return uni.showToast({ title: '请先开启设备', icon: 'none' })
+      }
+      
+      if (this.isContinuousScanning) {
+        // 停止持续扫描
+        this.isContinuousScanning = false;
+        
+        // 调用cancelScan方法清除所有计时器和加载提示
+        this.cancelScan();
+        
+        // 清除持续扫描间隔计时器(双重保障)
+        if (this.continuousScanInterval) {
+          clearTimeout(this.continuousScanInterval);
+          this.continuousScanInterval = null;
+        }
+        
+        // 显示扫描停止提示
+        uni.showToast({ title: '已停止扫描', icon: 'none' });
+      } else {
+        // 开始持续扫描
+        this.isContinuousScanning = true;
+        
+        // 显示持续扫描提示
+        uni.showLoading({
+          title: '持续扫描中...',
+          mask: true
+        });
+        
+        // 开始持续扫描
+        this.performContinuousScan();
+      }
+    },
+    
+    /**
+     * 开始扫描耳标(单次)
      */
     scan() {
       // 确保插件实例已初始化且有效
@@ -625,13 +718,19 @@ export default {
         return uni.showToast({ title: '请先开启设备', icon: 'none' })
       }
       
+      // 如果正在持续扫描,先停止
+      if (this.isContinuousScanning) {
+        this.toggleContinuousScan();
+      }
+      
       // 设置扫描参数 - 优化参数以提高成功率
       const scanConfig = {
         retryCount: 3,  // 增加重试次数
         currentRetry: 0,
         timeout: 2000,  // 增加超时时间
         interval: 400,  // 增加间隔,给设备恢复时间
-        signalThreshold: 0.5  // 降低信号阈值,接受更多信号
+        signalThreshold: 0.5,  // 降低信号阈值,接受更多信号
+        continuous: false  // 非持续扫描模式
       };
       
       // 初始化扫描进度变量
@@ -647,10 +746,39 @@ export default {
       // 执行扫描函数
       this.performScan(scanConfig);
     },
-	// release() {
-	// 	this.isDeviceReady = false;
-	// 	this.isDisable = false;
-	// },
+    
+    /**
+     * 执行持续扫描
+     */
+    performContinuousScan() {
+      // 检查是否仍在持续扫描状态
+      if (!this.isContinuousScanning || !this._isMounted || !this.isDeviceReady) {
+        if (this.isContinuousScanning) {
+          uni.hideLoading();
+        }
+        return;
+      }
+      
+      // 检查并恢复插件实例
+      if (!this.checkAndRestorePluginInstance()) {
+        uni.hideLoading();
+        this.isContinuousScanning = false;
+        return uni.showToast({ title: '设备功能异常,无法持续扫描', icon: 'none' });
+      }
+      
+      // 设置持续扫描参数
+      const scanConfig = {
+        retryCount: 100,  //重试次数
+        currentRetry: 0,
+        timeout: 1500,  // 增加超时时间到1.5秒
+        interval: 300,  // 减少重试间隔到300ms
+        signalThreshold: 0.3,  // 降低信号阈值,提高扫描成功率
+        continuous: true  // 持续扫描模式
+      };
+      
+      // 执行扫描
+      this.performScan(scanConfig);
+    },
     
     /**
      * 执行扫描(带重试机制)
@@ -689,27 +817,30 @@ export default {
         return;
       }
       
-      if (config.currentRetry >= config.retryCount) {
+      // 非持续扫描模式下才检查最大重试次数
+      if (!config.continuous && config.currentRetry >= config.retryCount) {
         uni.hideLoading();
         console.log('Scan failed after maximum retries');
         return uni.showToast({ title: '扫描失败,请调整位置重试', icon: 'none' });
       }
       
-      // 添加最大扫描时间限制 (总时间 = 超时时间 * 重试次数)
-      const maxScanTime = config.timeout * config.retryCount;
-      if (!this.maxScanTimer) {
-        this.maxScanTimer = setTimeout(() => {
-          console.log('Maximum scan time exceeded');
-          this.cancelScan();
-        }, maxScanTime);
+      // 非持续扫描模式下才添加最大扫描时间限制
+      if (!config.continuous) {
+        const maxScanTime = config.timeout * config.retryCount;
+        if (!this.maxScanTimer) {
+          this.maxScanTimer = setTimeout(() => {
+            console.log('Maximum scan time exceeded');
+            this.cancelScan();
+          }, maxScanTime);
+        }
       }
       
       // 增加重试计数
       config.currentRetry++;
       this.scanProgress = config.currentRetry;
       
-      // 更新加载提示(简化提示,避免频繁更新)
-      if (config.currentRetry % 2 === 0 || config.currentRetry === config.retryCount) {
+      // 持续扫描模式下不更新加载提示,以避免干扰停止操作
+      if (!config.continuous && (config.currentRetry % 2 === 0 || config.currentRetry === config.retryCount)) {
         uni.hideLoading();
         uni.showLoading({
           title: `扫描中 (${Math.round(config.currentRetry/config.retryCount*100)}%)...`,
@@ -758,10 +889,10 @@ export default {
           }
           
           console.error('Invalid plugin instance for scanning after restore attempt');
-          // 尝试重新初始化设备
-          this.initDevice();
-          uni.hideLoading();
-          return uni.showToast({ title: '设备功能异常,正在重新初始化', icon: 'none' });
+      // 尝试重新初始化设备
+      this.init();  // 修复:使用init而不是不存在的initDevice方法
+      uni.hideLoading();
+      return uni.showToast({ title: '设备功能异常,正在重新初始化', icon: 'none' });
         }
         
         // 保存当前实例引用,防止闭包中实例变化
@@ -790,8 +921,7 @@ export default {
             }
             
             if (result) {
-              // 假设result是一个包含id和signalStrength的对象
-              // 如果result只是ID字符串,我们将其包装成对象
+              // 如果result只是ID字符串,将其包装成对象
               const scanResult = typeof result === 'string' ? { id: result, signalStrength: 1 } : result;
               
               // 检查信号强度是否足够
@@ -806,7 +936,9 @@ export default {
                   this.retryTimeout = null;
                 }
                 
-                uni.hideLoading();
+                if (!config.continuous) {
+                  uni.hideLoading();
+                }
                 console.log('扫描成功:', scanResult);
                 this.form.earId = scanResult.id;
                 
@@ -815,11 +947,37 @@ export default {
                 
                 if (isDuplicate) {
                   console.log('耳标已存在:', scanResult.id);
-                  uni.showToast({ title: '该耳标已扫描过', icon: 'none' });
+                  // 持续扫描模式下也显示重复提示,但持续时间较短
+                  uni.showToast({
+                    title: '该耳标已扫描过',
+                    icon: 'none',
+                    duration: config.continuous ? 500 : 2000
+                  });
                 } else {
                   // 默认添加为'正常'类型
                   this.dataList.push({ id: scanResult.id, typeIndex: 0 });
-                  uni.showToast({ title: '扫描成功', icon: 'success' });
+                  if (!config.continuous) {
+                    uni.showToast({ title: '扫描成功', icon: 'success' });
+                  } else {
+                    // 持续扫描模式下,短暂提示后继续
+                  uni.showToast({ title: '扫描到耳标', icon: 'success', duration: 500 });
+                }
+                }
+                
+                // 持续扫描模式下,确保继续扫描
+                if (config.continuous && this.isContinuousScanning) {
+                  // 清除可能存在的旧计时器
+                  if (this.continuousScanInterval) {
+                    clearTimeout(this.continuousScanInterval);
+                    this.continuousScanInterval = null;
+                  }
+                  // 设置新的计时器,确保持续扫描
+                  this.continuousScanInterval = setTimeout(() => {
+                    // 再次检查持续扫描状态
+                    if (this.isContinuousScanning && this.isDeviceReady) {
+                      this.performContinuousScan();
+                    }
+                  }, 500); // 短暂延迟后继续扫描
                 }
               } else {
                 console.log(`Scan result with weak signal (${scanResult.signalStrength}), retrying`);
@@ -856,8 +1014,12 @@ export default {
             this.scanTimeout = null;
           }
           
-          // 检查是否是实例不可用错误
-          if (e.message && e.message.includes('instance is not available')) {
+          // 检查是否是实例不可用错误,增强检测逻辑
+      if (e.message && (
+            e.message.includes('instance is not available') || 
+            e.message.includes('receiveTasks') || 
+            e.message.includes('Failed to receiveTasks')
+          )) {
             console.error('Plugin instance not available during scan');
             // 尝试重新初始化
             this.uhfSFHelper = null;
@@ -885,8 +1047,12 @@ export default {
         }
         
         console.error('Error during scan setup:', e);
-        // 检查错误是否与实例不可用相关
-        if (e.message && e.message.includes('instance is not available')) {
+        // 检查错误是否与实例不可用相关,增强检测逻辑
+      if (e.message && (
+            e.message.includes('instance is not available') || 
+            e.message.includes('receiveTasks') || 
+            e.message.includes('Failed to receiveTasks')
+          )) {
           console.error('Plugin instance not available during scan setup');
           // 清除当前实例
           this.uhfSFHelper = null;
@@ -913,9 +1079,10 @@ export default {
      * 提交表单数据
      */
     submitForm() {
-      // 确保加载最新的设置
+      // 在验证前先尝试重新加载设置
       this.loadSavedSettings();
-
+      console.log('提交表单数据:', this.form);
+      
       // 验证编号是否已选择
       let missingField = '';
       if (!this.form.buildingName) missingField = '栋舍';
@@ -933,33 +1100,43 @@ export default {
 
       // 验证用户ID是否存在
       const app = getApp();
-      const userInfo = app.globalData.userInfo || uni.getStorageSync('user_info') || {};
-      const userId = userInfo.id || '';
+      const userInfo = app.globalData.userInfo;
+      console.log('用户信息:', userInfo);
+
+      // 更安全地获取用户ID,增加多重检查
+      const userId = userInfo.ID;
       if (!userId) {
         return uni.showToast({ title: '用户未登录', icon: 'none', duration: 3000 })
       }
 
-      // 显示加载提示
       uni.showLoading({ title: '提交中...', mask: true });
 
-      // 将dataList数组转换为包含类型的逗号分隔字符串
-      // 格式: id:type,id:type,...
       const rfidString = this.dataList.map(item => {
         return `${item.id}:${this.types[item.typeIndex]}`;
       }).join(',');
 
+      // 获取设备信息
+      let deviceInfo = {};
+      try {
+        deviceInfo = uni.getSystemInfoSync();
+      } catch (e) {
+        console.error('获取设备信息失败:', e);
+      }
+
       // 准备提交数据
       const submitData = {
+		token: uni.getStorageSync('equipment_token'),
         rfid: rfidString,
         buildingName: this.form.buildingName,
         roomName: this.form.roomName,
         penNo: this.form.penNo,
         userId: userId,
         username: userInfo.username || '',
-        time: new Date().toISOString()
+        time: new Date().toISOString(),
+        deviceModel: deviceInfo.model || '未获取到设备型号', // 设备型号
+        deviceVersion: deviceInfo.system || '未获取到设备版本号' // 设备版本号
       };
 
-      console.log('准备提交的数据:', submitData);
 
       // 发送请求到API
       this.submitData(submitData);
@@ -970,6 +1147,8 @@ export default {
      * @param {object} data - 要提交的数据
      */
     submitData(data) {
+	  console.log('token',uni.getStorageSync('equipment_token'))
+      console.log('提交的数据',data)
       // 设置独立的提交加载状态标志
       this.isSubmitting = true;
       
@@ -977,9 +1156,10 @@ export default {
         url: API.postListAdd,
         method: 'POST',
         data: data,
-        timeout: 10000, // 设置10秒超时
-        method: 'POST',
-        data: data,
+        header: {
+          'content-type': 'application/json',
+          'x-token': uni.getStorageSync('equipment_token') // 将token添加到请求头中
+        },
         timeout: 10000, // 设置10秒超时
         success: (res) => {
           console.log('API响应:', res);
@@ -992,7 +1172,6 @@ export default {
           
           if (res.data) {
             console.log('服务器返回数据:', res.data);
-            // 显示结果提示
             const message = res.data.msg || '提交成功';
             console.log('显示提示:', message);
             
@@ -1012,6 +1191,13 @@ export default {
                 userId: data.userId,
                 time: new Date().toLocaleTimeString()
               });
+              
+              // 停止持续扫描
+              if (this.isContinuousScanning) {
+                this.toggleContinuousScan();
+              }
+              
+              // 清空扫描数据
               this.resetForm();
             }
           } else {
@@ -1061,7 +1247,6 @@ export default {
       // 清除扫描结果列表
       this.dataList = []
     },
-    
 
     // 选择
     onBuildingChange(e) {
@@ -1104,15 +1289,34 @@ export default {
       // 释放设备资源
       this.releaseDevice();
       
-      // 清除用户信息
+      // 清除全局用户信息和登录状态
       const app = getApp();
       app.globalData.userInfo = null;
-      uni.removeStorageSync('user_info');
-      
-      // 跳转到登录页面
-      uni.redirectTo({ url: '/pages/login/login' });
+      app.globalData.token = '';
+      app.globalData.expireAt = '';
+      app.globalData.isLoggedIn = false;
+      app.globalData.building = '';
+      app.globalData.room = '';
+      app.globalData.pen = '';
+      app.globalData.buildingName = '';
+      app.globalData.roomName = '';
+      app.globalData.penNo = '';
       
-      uni.showToast({ title: '已退出登录', icon: 'none' })
+      // 清除本地缓存中的所有登录相关信息
+      try {
+        uni.removeStorageSync('user_info');
+        uni.removeStorageSync('equipment_token');
+        uni.removeStorageSync('token_expire_time');
+        // 可选:清除编号相关的缓存
+        // uni.removeStorageSync('building');
+        // uni.removeStorageSync('room');
+        // uni.removeStorageSync('pen');
+        // uni.removeStorageSync('buildingName');
+        // uni.removeStorageSync('roomName');
+        // uni.removeStorageSync('penNo');
+      } catch (e) {
+        console.error('清除登录信息失败:', e);
+      }
     },
     
     toggleServerConfig() {
@@ -1121,33 +1325,20 @@ export default {
   }
 }
 </script>
-
 <style>
 .page { display: flex; flex-direction: column; height: 100vh; width: 100%; box-sizing: border-box; padding: 0 10rpx; }
-
 .data-item { display: flex; justify-content: space-between; align-items: center; padding: 10rpx; margin-bottom: 10rpx; background-color: #f5f5f5; border-radius: 5rpx; }
-
-.picker { padding: 5rpx 10rpx; 
-	margin-left: 20px;
-	background-color: #fff; border: 1px solid #ddd; border-radius: 5rpx; min-width: 120rpx; text-align: center; }
-
+.picker { padding: 5rpx 10rpx; margin-left: 20px;background-color: #fff; border: 1px solid #ddd; border-radius: 5rpx; min-width: 120rpx; text-align: center; }
 .arrow::after { content: '▾'; font-size: 12rpx; margin-left: 5rpx; }
-
 .delete-btn { background-color: #ff4d4f; color: white; font-size: 24rpx; padding: 5rpx 10rpx; min-width: 80rpx; line-height: normal; }
-.nav-bar {
-  display: flex; justify-content: space-between; align-items: center;
-  background: #007aff; color: white; padding: 15rpx 30rpx;
-}
+.nav-bar {display: flex; justify-content: space-between; align-items: center;background: #007aff; color: white; padding: 15rpx 30rpx;}
 .nav-title { font-weight: bold; font-size: 32rpx; }
 .nav-btn { background: transparent; border: none; font-size: 32rpx; }
 .scroll-area { flex: 1;  }
 .section-title { display: flex; justify-content: space-between; margin-bottom: 20rpx; }
 .section-title .title { font-weight: bold; font-size: 30rpx; }
 .section-title .date { font-size: 24rpx; color: #666; }
-.rfid-card {
-  background: #f6f6f6; border: 2rpx dashed #ccc; 
-  border-radius: 20rpx; text-align: center; 
-}
+.rfid-card {background: #f6f6f6; border: 2rpx dashed #ccc; border-radius: 20rpx; text-align: center; }
 .scan-icon { font-size: 50rpx; color: #007aff; margin-bottom: 10rpx; display: block; }
 .btn-group { display: flex; gap: 20rpx; margin: 20rpx 0; flex-wrap: wrap; justify-content: center; }
 .scan-btn { background: #007aff; color: white; flex: 1; min-width: 200rpx; padding: 20rpx; border-radius: 12rpx; font-size: 28rpx; }
@@ -1156,13 +1347,7 @@ export default {
 .form-item .label { display: block; font-weight: bold; margin-bottom: 10rpx; }
 .input-box { width: 100%; border: 1rpx solid #ccc; border-radius: 10rpx; background: #fff; }
 .status-options { display: flex; gap: 20rpx; margin-top: 10rpx; }
-.status-option {
-  flex: 1; border: 1rpx solid #ccc; border-radius: 10rpx;
-  padding: 20rpx; text-align: center; color: #666;
-}
+.status-option {flex: 1; border: 1rpx solid #ccc; border-radius: 10rpx;padding: 20rpx; text-align: center; color: #666;}
 .status-option.active { border-color: #007aff; color: #007aff; }
-.sv {
-  height: 300rpx;
-  margin-top: 20rpx;
-}
+.sv {height: 300rpx;margin-top: 20rpx;}
 </style>

File diff suppressed because it is too large
+ 6 - 8
pages/login/login.vue


+ 244 - 260
pages/mine/manage.vue

@@ -7,7 +7,7 @@
 					
 					<view class="content">
 						<view class="username">用户名: {{user.username}}</view>
-						<view class="user-id" v-if="user.id">ID: {{user.id}}</view>
+						<view class="user-id" v-if="user.ID">ID: {{user.ID}}</view>
 					</view>
 				</view>
 			</view>
@@ -60,6 +60,7 @@
 </template>
 
 <script>
+import API from '../../api/index';
 	// 移除全局变量声明,改为在方法内使用const声明
 	export default {
 		data() {
@@ -85,25 +86,6 @@
 		onShow() {
 			const _self = this;
 			const app = getApp();
-			if (!_self.login) {
-				const isLogin = !!app.globalData.token;
-				if (isLogin) {
-					_self.login = isLogin;
-					// 获取栋舍列表
-					_self.fetchBuildingList();
-					// 获取最新用户信息
-					_self.fetchUserInfo();
-				}
-			} else {
-				// 获取栋舍列表
-				_self.fetchBuildingList();
-				// 确保已登录时始终有最新的用户信息
-				_self.fetchUserInfo();
-			}
-		},
-		onLoad(e) {
-			const _self = this;
-			const app = getApp();
 
 			const isLogin = !!app.globalData.token;
 			_self.login = isLogin;
@@ -130,18 +112,17 @@
 
 				// 从服务器获取栋舍列表
 				uni.request({
-					url: 'http://dev-rfid.7in6.com/index.php/api/index/get_building',
+					url: API.getBuilding,
 					method: 'GET',
 					header: {
-						'content-type': 'application/x-www-form-urlencoded',
-						token: app.globalData.token || ''
+						"x-token": app.globalData.token || ''
 					},
 					success: (res) => {
-
+          console.log(res.data.data)
 						if (res.data && res.data.code === 0 && res.data.data && res.data.data.length > 0) {
 							// 更新栋舍列表
 							_self.buildingList = res.data.data.map(item => item.name || item.building_name);
-							console.log('更新后的栋舍列表:', _self.buildingList);
+							console.log('获取栋舍编号:', _self.buildingList);
 
 							// 如果表单中没有选择栋舍,尝试使用全局数据或本地存储
 							if (!_self.form.buildingName) {
@@ -163,144 +144,154 @@
 			},
 
 			// 新增方法:获取最新用户信息
+			// 修复fetchUserInfo方法,确保用户信息正确获取
 			fetchUserInfo() {
-				const _self = this;
-				const app = getApp();
-
-				// 检查用户是否已登录且有用户ID
-				const userInfo = app.globalData.userInfo || uni.getStorageSync('user_info') || {};
-				const userId = userInfo.id || '';
-
-				if (!userId) {
-					console.error('用户ID不存在,无法获取用户信息');
-					// 尝试从本地存储加载
-					_self.loadFromStorage();
-					return;
-				}
-
-				// 显示加载提示
-				uni.showLoading({
-					title: '加载中...'
-				});
-
-				// 从服务器获取最新用户信息
-				uni.request({
-					url: 'http://dev-rfid.7in6.com/index.php/api/index/userlist',
-					method: 'GET',
-					data: {
-						userid: userId // 传递用户ID
-					},
-					header: {
-						'content-type': 'application/x-www-form-urlencoded',
-						token: app.globalData.token || ''
-					},
-					success: (res) => {
-						console.log('userlist接口响应:', res);
-								
-						if (res.data && res.data.code === 0) {
-							// 从数据库获取用户信息
-							// 确保数据是对象格式
-							const dbUserInfo = typeof res.data.data === 'object' && res.data.data !== null ? res.data.data : {};
-
-							// 检查是否包含编号信息
-							if (!dbUserInfo.building || !dbUserInfo.room || !dbUserInfo.pen) {
-								console.warn('用户信息中缺少编号数据:', dbUserInfo);
-							}
-								
-							// 合并用户信息
-							const mergedUserInfo = {
-								...userInfo,
-								...dbUserInfo
-							};
-
-							// 更新全局用户信息
-							app.globalData.userInfo = mergedUserInfo;
-							// 更新编号信息
-							app.globalData.building = dbUserInfo.building || userInfo.building || '';
-							app.globalData.room = dbUserInfo.room || userInfo.room || '';
-							app.globalData.pen = dbUserInfo.pen || userInfo.pen || '';
-
-							console.log('更新后的全局building:', app.globalData.building);
-							console.log('更新后的全局room:', app.globalData.room);
-							console.log('更新后的全局pen:', app.globalData.pen);
-
-							// 更新本地存储
-							uni.setStorageSync('user_info', mergedUserInfo);
-							uni.setStorageSync('building', app.globalData.building);
-							uni.setStorageSync('room', app.globalData.room);
-							uni.setStorageSync('pen', app.globalData.pen);
-
-							// 更新页面数据
-							_self.user = mergedUserInfo;
-							_self.avatar = _self.user.avatar || '';
-
-							// 更新表单数据
-							_self.form.buildingName = app.globalData.building || '';
-							_self.form.roomName = app.globalData.room || '';
-							_self.form.penNo = app.globalData.pen || '';
-
-							console.log('更新后的表单buildingName:', _self.form.buildingName);
-							console.log('更新后的表单roomName:', _self.form.roomName);
-							console.log('更新后的表单penNo:', _self.form.penNo);
+			  const _self = this;
+			  const app = getApp();
+			  
+			  // 从多个来源获取用户信息,增加可靠性
+			  let userInfo = {};
+			  
+			  // 1. 优先从全局数据获取
+			  if (app.globalData.userInfo && Object.keys(app.globalData.userInfo).length > 0) {
+			    userInfo = app.globalData.userInfo;
+			    console.log('从全局数据获取用户信息:', userInfo);
+			  }
+			  
+			  // 2. 如果全局数据不可用,尝试从本地存储获取
+			  if (!userInfo.username || !userInfo.ID) {
+			    try {
+			      const storedUserInfo = uni.getStorageSync('user_info') || {};
+			      if (storedUserInfo && Object.keys(storedUserInfo).length > 0) {
+			        userInfo = { ...userInfo, ...storedUserInfo };
+			        console.log('从本地存储补充用户信息:', storedUserInfo);
+			      }
+			    } catch (e) {
+			      console.error('读取本地存储用户信息失败:', e);
+			    }
+			  }
+			  
+			  // 3. 如果仍然缺少关键信息,尝试从token相关信息中提取
+			  if (!userInfo.username) {
+			    userInfo.username = app.globalData.username || '';
+			  }
+			  
+			  if (!userInfo.ID) {
+			    userInfo.ID = app.globalData.ID || '';
+			  }
+			  
+			  // 记录获取到的用户信息,便于调试
+			  console.log('最终获取的用户信息:', userInfo);
+			  
+			  // 更新页面数据
+			  _self.user = userInfo;
+			  
+			  // 确保即使没有头像也不会出错
+			  _self.avatar = userInfo.avatar || '';
+			  
+			  // 更新表单数据
+			  _self.form.buildingName = app.globalData.building || app.globalData.buildingName || '';
+			  _self.form.roomName = app.globalData.room || app.globalData.roomName || '';
+			  _self.form.penNo = app.globalData.pen || app.globalData.penNo || '';
+			  
+			  console.log('更新后的表单数据:', _self.form);
+			  
+			  // 触发设置更新事件,通知其他组件
+			  uni.$emit('settingsUpdated', {
+			    building: _self.form.buildingName,
+			    room: _self.form.roomName,
+			    pen: _self.form.penNo
+			  });
+			},
 
-							// 更新全局数据中的名称字段
-							app.globalData.buildingName = _self.form.buildingName;
-							app.globalData.roomName = _self.form.roomName;
-							app.globalData.penNo = _self.form.penNo;
+			data() {
+			  return {
+			    login: false,
+			    user: {
+			      username: '', // 提供默认的用户名属性
+			      ID: ''        // 提供默认的ID属性
+			    },
+			    avatar: '',
+			    managePhone: '',
+			    
+			    // 表单数据
+			    form: {
+			      buildingName: '',
+			      roomName: '',
+			      penNo: ''
+			    },
+			
+			    // 动态从接口获取数据
+			    buildingList: [],
+			    roomList: [],
+			    Fieldnumber: []
+			  }
+			},
 
-							// 更新本地存储的名称字段
-							uni.setStorageSync('buildingName', _self.form.buildingName);
-							uni.setStorageSync('roomName', _self.form.roomName);
-							uni.setStorageSync('penNo', _self.form.penNo);
+			// 增强onShow方法中的用户信息获取逻辑
+			onShow() {
+			  const _self = this;
+			  const app = getApp();
+			  
+			  // 首先检查登录状态
+			  const isLogin = !!app.globalData.token;
+			  _self.login = isLogin;
+			  
+			  if (isLogin) {
+			    // 获取栋舍列表
+			    _self.fetchBuildingList();
+			    // 获取最新用户信息
+			    _self.fetchUserInfo();
+			  } else {
+			    // 尝试从本地存储恢复登录信息
+			    const token = uni.getStorageSync('equipment_token') || '';
+			    const expireAt = uni.getStorageSync('token_expire_time') || '';
+			    const userInfo = uni.getStorageSync('user_info') || {};
+			    
+			    if (token && expireAt) {
+			      // 恢复登录信息到全局数据
+			      app.globalData.token = token;
+			      app.globalData.expireAt = expireAt;
+			      app.globalData.userInfo = userInfo;
+			      app.globalData.isLoggedIn = true;
+			      _self.login = true;
+			      _self.fetchBuildingList();
+			      _self.fetchUserInfo();
+			      console.log('从本地存储恢复登录状态成功');
+			    }
+			  }
+			},
 
-							// 触发设置更新事件,通知其他组件
-							uni.$emit('settingsUpdated', {
-								building: _self.form.buildingName,
-								room: _self.form.roomName,
-								pen: _self.form.penNo
-							});
-						} else {
-							console.error('userlist响应数据无效:', res.data);
-							// 响应无效时,尝试从全局或本地存储加载
-							_self.loadFromStorage();
-						}
-					},
-					fail: (err) => {
-						console.error('获取用户信息失败:', err);
-						// 失败时,从全局或本地存储加载
-						_self.loadFromStorage();
-					},
-					complete: () => {
-						uni.hideLoading();
-					}
-				});
+			// 新增一个方法,用于手动刷新用户信息
+			refreshUserInfo() {
+			  const app = getApp();
+			  console.log('手动刷新用户信息 - 当前全局数据:', app.globalData);
+			  console.log('手动刷新用户信息 - 当前本地存储:', uni.getStorageSync('user_info'));
+			  
+			  this.fetchUserInfo();
+			  this.fetchBuildingList();
 			},
 			// 获取房间列表
 			fetchRoomList() {
 				const _self = this;
 				const app = getApp();
 
-				console.log('开始获取房间列表...');
-				console.log('当前选择的栋舍:', _self.form.buildingName);
-
-				// 从服务器获取房间列表
+				// 获取房间列表
 				uni.request({
-					url: 'http://dev-rfid.7in6.com/index.php/api/index/get_room',
+					url: API.getRoom,
 					method: 'GET',
 					data: {
 						building: _self.form.buildingName // 传递当前选择的栋舍
 					},
-					header: {
-						'content-type': 'application/x-www-form-urlencoded',
-						token: app.globalData.token || ''
-					},
+          header: {
+            "x-token": app.globalData.token || ''
+          },
 					success: (res) => {
-						console.log('get_room接口响应:', res);
+						console.log('获取房间编号:', res);
 
 						if (res.data && res.data.code === 0 && res.data.data && res.data.data.length > 0) {
 							// 更新房间列表
 							_self.roomList = res.data.data.map(item => item.name || item.room_name);
-							console.log('更新后的房间列表:', _self.roomList);
 
 							// 如果表单中没有选择房间,尝试使用全局数据或本地存储
 							if (!_self.form.roomName) {
@@ -325,31 +316,24 @@
 			fetchPenList() {
 				const _self = this;
 				const app = getApp();
-
-				console.log('开始获取栏位列表...');
-				console.log('当前选择的栋舍:', _self.form.buildingName);
-				console.log('当前选择的房间:', _self.form.roomName);
-
-				// 从服务器获取栏位列表
+				// 获取栏位列表
 				uni.request({
-					url: 'http://dev-rfid.7in6.com/index.php/api/index/get_pen',
+					url: API.getPen,
 					method: 'GET',
 					data: {
 						building: _self.form.buildingName,
-						room: _self.form.roomName // 传递当前选择的房间
+						room: _self.form.roomName // 当前选择的房间
 					},
 					header: {
 						'content-type': 'application/x-www-form-urlencoded',
-						token: app.globalData.token || ''
+						"x-token": app.globalData.token || ''
 					},
 					success: (res) => {
-						console.log('get_pen接口响应:', res);
+						console.log('获取栏位编号:', res);
 
 						if (res.data && res.data.code === 0 && res.data.data && res.data.data.length > 0) {
 							// 更新栏位列表
 							_self.Fieldnumber = res.data.data.map(item => item.name || item.pen_name || item.pen_no);
-							console.log('更新后的栏位列表:', _self.Fieldnumber);
-
 							// 如果表单中没有选择栏位,尝试使用全局数据或本地存储
 							if (!_self.form.penNo) {
 								_self.form.penNo = app.globalData.pen || uni.getStorageSync('pen') || '';
@@ -357,7 +341,7 @@
 						} else {
 							console.error('get_pen响应数据无效或为空:', res.data);
 							// 使用默认栏位列表
-						_self.Fieldnumber = [];
+							_self.Fieldnumber = [];
 						}
 					},
 					fail: (err) => {
@@ -366,62 +350,52 @@
 				});
 			},
 
-			// 从存储加载数据的辅助方法
 			loadFromStorage() {
-				const _self = this;
-				const app = getApp();
-					
-				console.log('从存储加载数据...');
-					
-				// 失败时,仍然使用本地数据
-				_self.user = app.globalData.userInfo || {};
-				_self.avatar = _self.user.avatar || '';
-
-				// 从全局或本地存储加载已保存的设置
-				// 优先使用全局的building/room/pen,然后是本地存储的,最后是名称字段
-				_self.form.buildingName = app.globalData.building || uni.getStorageSync('building') || app.globalData.buildingName || uni.getStorageSync('buildingName') || '';
-				_self.form.roomName = app.globalData.room || uni.getStorageSync('room') || app.globalData.roomName || uni.getStorageSync('roomName') || '';
-				_self.form.penNo = app.globalData.pen || uni.getStorageSync('pen') || app.globalData.penNo || uni.getStorageSync('penNo') || '';
-
-				console.log('从存储加载的表单buildingName:', _self.form.buildingName);
-				console.log('从存储加载的表单roomName:', _self.form.roomName);
-				console.log('从存储加载的表单penNo:', _self.form.penNo);
-
-				// 更新全局数据中的名称字段
-				app.globalData.buildingName = _self.form.buildingName;
-				app.globalData.roomName = _self.form.roomName;
-				app.globalData.penNo = _self.form.penNo;
+			    const _self = this;
+			    const app = getApp();
+			    const globalUserInfo = app.globalData.userInfo;
+			    _self.user = globalUserInfo;
+			    _self.form.buildingName = app.globalData.building;
+			    _self.form.roomName = app.globalData.room;
+			    _self.form.penNo = app.globalData.pen;
+			    console.log('从存储加载的表单buildingName:', _self.form.buildingName);
+			    console.log('从存储加载的表单roomName:', _self.form.roomName);
+			    console.log('从存储加载的表单penNo:', _self.form.penNo);
 			},
+
 			// 选择器方法
 			onBuildingChange(e) {
-				this.form.buildingName = this.buildingList[e.detail.value];
-				// 保存到全局或本地存储
-				getApp().globalData.buildingName = this.form.buildingName;
-				uni.setStorageSync('buildingName', this.form.buildingName);
-				// 触发全局事件通知设置更新
-				uni.$emit('settingsUpdated');
-				// 获取对应栋舍的房间列表
-				this.fetchRoomList();
+			  const selectedValue = this.buildingList[e.detail.value];
+			  this.form.buildingName = selectedValue;
+			  console.log('栋舍选择已更新:', this.form.buildingName);
+			  // 保存到login中定义的全局变量
+			  getApp().globalData.building = selectedValue;
+			  // 触发全局事件通知设置更新
+			  uni.$emit('settingsUpdated');
+			  // 获取对应栋舍的房间列表
+			  this.fetchRoomList();
 			},
-
+			
 			onRoomChange(e) {
-				this.form.roomName = this.roomList[e.detail.value];
-				// 保存到全局或本地存储
-				getApp().globalData.roomName = this.form.roomName;
-				uni.setStorageSync('roomName', this.form.roomName);
-				// 触发全局事件通知设置更新
-				uni.$emit('settingsUpdated');
-				// 获取对应房间的栏位列表
-				this.fetchPenList();
+			  const selectedValue = this.roomList[e.detail.value];
+			  this.form.roomName = selectedValue;
+			  console.log('房间选择已更新:', this.form.roomName);
+			  // 保存到login中定义的全局变量
+			  getApp().globalData.room = selectedValue;
+			  // 触发全局事件通知设置更新
+			  uni.$emit('settingsUpdated');
+			  // 获取对应房间的栏位列表
+			  this.fetchPenList();
 			},
-
+			
 			onFieldChange(e) {
-				this.form.penNo = this.Fieldnumber[e.detail.value];
-				// 保存到全局或本地存储
-				getApp().globalData.penNo = this.form.penNo;
-				uni.setStorageSync('penNo', this.form.penNo);
-				// 触发全局事件通知设置更新
-				uni.$emit('settingsUpdated');
+			  const selectedValue = this.Fieldnumber[e.detail.value];
+			  this.form.penNo = selectedValue;
+			  console.log('栏位选择已更新:', this.form.penNo);
+			  // 保存到login中定义的全局变量
+			  getApp().globalData.pen = selectedValue;
+			  // 触发全局事件通知设置更新
+			  uni.$emit('settingsUpdated');
 			},
 
 			// 保存设置到API
@@ -435,7 +409,7 @@
 
 				const app = getApp();
 				// 获取用户ID(优先从全局数据,其次从本地存储)
-				const userId = app.globalData.userInfo?.id || uni.getStorageSync('user_info')?.id || '';
+				const userId = app.globalData.userInfo?.ID || uni.getStorageSync('user_info')?.ID || '';
 				const username = app.globalData.userInfo?.username || uni.getStorageSync('user_info')?.username || '';
 
 				if (!userId) {
@@ -444,15 +418,12 @@
 						title: '请先登录',
 						icon: 'none'
 					});
-				}
-
-				// 显示加载提示
+				};
 				uni.showLoading({
 					title: '保存中...',
 					mask: true
 				});
 
-				// 准备提交数据
 				const submitData = {
 					username: username,
 					userid: userId,
@@ -460,43 +431,33 @@
 					room: this.form.roomName,
 					pen: this.form.penNo
 				};
-
-				console.log('提交的设置数据:', submitData);
+				console.log('提交的数据:', submitData);
 
 				// 发送请求到API
 				uni.request({
-					url: 'http://dev-rfid.7in6.com/index.php/api/index/post_usersetup',
+					url: API.postUserSetup,
 					method: 'POST',
 					data: submitData,
 					header: {
-						'content-type': 'application/x-www-form-urlencoded',
-						token: app.globalData.token || uni.getStorageSync('token') || ''
+						'content-type': 'application/json',
+						"x-token": app.globalData.token || uni.getStorageSync('token') || ''
 					},
 					timeout: 10000, // 设置10秒超时
 					success: (res) => {
-						console.log('保存设置响应:', res);
-						if (res.data && res.data.code === 0) {
+						if (res.data.code === 0) {
 							uni.showToast({
 								title: '保存成功',
-								icon: 'success'
+								icon: 'success',
+								duration: 3000 
 							});
-
 							// 更新全局数据
 							app.globalData.building = submitData.building;
 							app.globalData.room = submitData.room;
 							app.globalData.pen = submitData.pen;
-							app.globalData.buildingName = submitData.building;
-							app.globalData.roomName = submitData.room;
-							app.globalData.penNo = submitData.pen;
-
 							// 更新本地存储
 							uni.setStorageSync('building', submitData.building);
 							uni.setStorageSync('room', submitData.room);
 							uni.setStorageSync('pen', submitData.pen);
-							uni.setStorageSync('buildingName', submitData.building);
-							uni.setStorageSync('roomName', submitData.room);
-							uni.setStorageSync('penNo', submitData.pen);
-
 							// 触发设置更新事件
 							uni.$emit('settingsUpdated', {
 								building: submitData.building,
@@ -511,20 +472,12 @@
 							});
 						}
 					},
-					// fail: (err) => {
-					// 	console.error('保存设置网络失败:', err);
-					// 	uni.showToast({
-					// 		title: '网络异常,请检查网络后重试',
-					// 		icon: 'none'
-					// 	});
-					// },
 					complete: () => {
 						uni.hideLoading();
 					}
 				});
 			},
 
-		// getStaffInfo方法已移除,直接从全局状态获取用户信息
 			goWeLogin(code) {
 				const _self = this;
 				_self.$api.welogin({
@@ -532,6 +485,8 @@
 				}).then((res) => {
 					getApp().globalData.token = res.data.token
 					getApp().globalData.equipmentManage = res.data.equipment_manage
+					
+					// 保存到本地存储
 					uni.setStorageSync('equipment_token', res.data.token)
 					uni.setStorageSync('equipment_openid', res.data.openid)
 					uni.setStorageSync('equipment_manage', res.data.equipment_manage)
@@ -540,8 +495,12 @@
 					// 登录成功后从全局状态获取用户信息
 					_self.user = getApp().globalData.userInfo || {};
 					_self.avatar = _self.user.avatar || '';
+					
+					// 登录成功后刷新数据
+					_self.fetchBuildingList();
+					_self.fetchUserInfo();
 				}).catch((err) => {
-					console.error('微信登录失败:', err);
+					console.error('登录失败:', err);
 					uni.showToast({
 						title: '登录失败,请稍后重试',
 						icon: 'none'
@@ -556,7 +515,7 @@
 					// 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据
 					isLoginFromLogin: function(data) {
 						if (data && data.isLogin) {
-							_self.login = true
+							_self.isLoggedIn = true
 							// 登录成功后从全局状态获取用户信息
 							_self.user = getApp().globalData.userInfo || {};
 							_self.avatar = _self.user.avatar || '';
@@ -565,32 +524,57 @@
 				}
 			})
 			},
+			// 添加退出登录方法
 			logout() {
-				const _self = this;
-				uni.showModal({
-					title: '提示',
-					content: '是否确认要操作退出登录?',
-					success: function(res) {
-						if (res.confirm) {
-							_self.doLogout()
-						}
-					}
-				});
+			  try {
+			    // 清除全局数据
+			    const app = getApp();
+			    app.globalData.ID = '';
+			    app.globalData.token = '';
+			    app.globalData.userInfo = {};
+			    app.globalData.isLoggedIn = false;
+			    app.globalData.expireAt = '';
+			    app.globalData.building = '';
+			    app.globalData.room = '';
+			    app.globalData.pen = '';
+			    app.globalData.buildingName = '';
+			    app.globalData.roomName = '';
+			    app.globalData.penNo = '';
+			    
+			    // 清除本地存储
+			    uni.removeStorageSync('equipment_token');
+			    uni.removeStorageSync('token_expire_time');
+			    uni.removeStorageSync('user_info');
+			    uni.removeStorageSync('building');
+			    uni.removeStorageSync('room');
+			    uni.removeStorageSync('pen');
+			    
+			    console.log('退出登录成功,已清除所有登录信息');
+			    
+			    // 重置页面状态
+			    this.login = false;
+			    this.user = { username: '', ID: '' };
+			    this.form = {
+			      buildingName: '',
+			      roomName: '',
+			      penNo: ''
+			    };
+			    
+			    // 跳转到登录页面
+			    uni.redirectTo({
+			      url: '/pages/login/login',
+			      success: function() {
+			        console.log('跳转到登录页面成功');
+			      }
+			    });
+			  } catch (e) {
+			    console.error('退出登录过程中发生错误:', e);
+			    uni.showToast({
+			      title: '退出登录失败,请重试',
+			      icon: 'none'
+			    });
+			  }
 			},
-			doLogout() {
-			const _self = this;
-			// 显示加载提示
-			uni.showLoading({
-				title: '退出中...'
-			})
-			
-			// 延迟1.5秒后跳转
-			setTimeout(() => {
-				uni.hideLoading()
-				// 清除本地存储
-				_self.clearStorage()
-			}, 1500)
-		},
 			clearStorage() {
 			const _self = this;
 			try {

BIN
static/123.png


File diff suppressed because it is too large
+ 0 - 0
unpackage/cache/wgt/__UNI__9F8B139/__uniappchooselocation.js


BIN
unpackage/cache/wgt/__UNI__9F8B139/__uniapperror.png


File diff suppressed because it is too large
+ 0 - 0
unpackage/cache/wgt/__UNI__9F8B139/__uniappes6.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/cache/wgt/__UNI__9F8B139/__uniappopenlocation.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/cache/wgt/__UNI__9F8B139/__uniapppicker.js


File diff suppressed because it is too large
+ 6 - 0
unpackage/cache/wgt/__UNI__9F8B139/__uniappquill.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/cache/wgt/__UNI__9F8B139/__uniappquillimageresize.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/cache/wgt/__UNI__9F8B139/__uniappscan.js


BIN
unpackage/cache/wgt/__UNI__9F8B139/__uniappsuccess.png


+ 25 - 0
unpackage/cache/wgt/__UNI__9F8B139/__uniappview.html

@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+
+  <head>
+    <meta charset="UTF-8" />
+    <script>
+      var __UniViewStartTime__ = Date.now();
+      var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
+        CSS.supports('top: constant(a)'))
+      document.write(
+        '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
+        (coverSupport ? ', viewport-fit=cover' : '') + '" />')
+    </script>
+    <title>View</title>
+    <link rel="stylesheet" href="view.css" />
+  </head>
+
+  <body>
+    <div id="app"></div>
+    <script src="__uniappes6.js"></script>
+    <script src="view.umd.min.js"></script>
+    <script src="app-view.js"></script>
+  </body>
+
+</html>

+ 8 - 0
unpackage/cache/wgt/__UNI__9F8B139/app-config-service.js

@@ -0,0 +1,8 @@
+
+var isReady=false;var onReadyCallbacks=[];
+var isServiceReady=false;var onServiceReadyCallbacks=[];
+var __uniConfig = {"pages":["pages/login/login","pages/index/index","pages/mine/manage"],"window":{"navigationBarTextStyle":"black","navigationBarTitleText":"uni-app","navigationBarBackgroundColor":"#F8F8F8","backgroundColor":"#F8F8F8"},"tabBar":{"color":"#999999","selectedColor":"#ff0000","backgroundColor":"#ffffff","list":[{"pagePath":"pages/index/index","text":"首页","iconPath":"static/menu_search.png","selectedIconPath":"static/menu_search_selected.png"},{"pagePath":"pages/mine/manage","text":"我的","iconPath":"static/menu_mine.png","selectedIconPath":"static/menu_mine_selected.png"}]},"darkmode":false,"nvueCompiler":"uni-app","nvueStyleCompiler":"uni-app","renderer":"auto","splashscreen":{"alwaysShowBeforeRender":true,"autoclose":false},"appname":"UhfChengBangZi","compilerVersion":"4.76","entryPagePath":"pages/login/login","networkTimeout":{"request":60000,"connectSocket":60000,"uploadFile":60000,"downloadFile":60000}};
+var __uniRoutes = [{"path":"/pages/login/login","meta":{"isQuit":true},"window":{"navigationBarTitleText":"登录","navigationStyle":"custom"}},{"path":"/pages/index/index","meta":{"isQuit":true,"isTabBar":true},"window":{"navigationBarTitleText":"今楚联合育种种猪智能选留系统"}},{"path":"/pages/mine/manage","meta":{"isQuit":true,"isTabBar":true},"window":{"navigationBarTitleText":"个人中心"}}];
+__uniConfig.onReady=function(callback){if(__uniConfig.ready){callback()}else{onReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"ready",{get:function(){return isReady},set:function(val){isReady=val;if(!isReady){return}const callbacks=onReadyCallbacks.slice(0);onReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
+__uniConfig.onServiceReady=function(callback){if(__uniConfig.serviceReady){callback()}else{onServiceReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"serviceReady",{get:function(){return isServiceReady},set:function(val){isServiceReady=val;if(!isServiceReady){return}const callbacks=onServiceReadyCallbacks.slice(0);onServiceReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
+service.register("uni-app-config",{create(a,b,c){if(!__uniConfig.viewport){var d=b.weex.config.env.scale,e=b.weex.config.env.deviceWidth,f=Math.ceil(e/d);Object.assign(__uniConfig,{viewport:f,defaultFontSize:Math.round(f/20)})}return{instance:{__uniConfig:__uniConfig,__uniRoutes:__uniRoutes,global:void 0,window:void 0,document:void 0,frames:void 0,self:void 0,location:void 0,navigator:void 0,localStorage:void 0,history:void 0,Caches:void 0,screen:void 0,alert:void 0,confirm:void 0,prompt:void 0,fetch:void 0,XMLHttpRequest:void 0,WebSocket:void 0,webkit:void 0,print:void 0}}}});

+ 1 - 0
unpackage/cache/wgt/__UNI__9F8B139/app-config.js

@@ -0,0 +1 @@
+(function(e){function r(r){for(var n,l,i=r[0],p=r[1],a=r[2],c=0,s=[];c<i.length;c++)l=i[c],Object.prototype.hasOwnProperty.call(o,l)&&o[l]&&s.push(o[l][0]),o[l]=0;for(n in p)Object.prototype.hasOwnProperty.call(p,n)&&(e[n]=p[n]);f&&f(r);while(s.length)s.shift()();return u.push.apply(u,a||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,i=1;i<t.length;i++){var p=t[i];0!==o[p]&&(n=!1)}n&&(u.splice(r--,1),e=l(l.s=t[0]))}return e}var n={},o={"app-config":0},u=[];function l(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,l),t.l=!0,t.exports}l.m=e,l.c=n,l.d=function(e,r,t){l.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},l.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(e,r){if(1&r&&(e=l(e)),8&r)return e;if(4&r&&"object"===typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(l.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)l.d(t,n,function(r){return e[r]}.bind(null,n));return t},l.n=function(e){var r=e&&e.__esModule?function(){return e["default"]}:function(){return e};return l.d(r,"a",r),r},l.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},l.p="/";var i=this["webpackJsonp"]=this["webpackJsonp"]||[],p=i.push.bind(i);i.push=r,i=i.slice();for(var a=0;a<i.length;a++)r(i[a]);var f=p;t()})([]);

File diff suppressed because it is too large
+ 0 - 0
unpackage/cache/wgt/__UNI__9F8B139/app-service.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/cache/wgt/__UNI__9F8B139/app-view.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/cache/wgt/__UNI__9F8B139/manifest.json


BIN
unpackage/cache/wgt/__UNI__9F8B139/nativeplugins/Alvin-CBZUhfModule/android/UhfChengBangZi-release.aar


BIN
unpackage/cache/wgt/__UNI__9F8B139/nativeplugins/Alvin-CBZUhfModule/android/libs/armeabi-v7a/libserial_port.so


+ 25 - 0
unpackage/cache/wgt/__UNI__9F8B139/nativeplugins/Alvin-CBZUhfModule/package.json

@@ -0,0 +1,25 @@
+{
+	"name": "Alvin-CBZUhfModule",
+	"id": "Alvin-CBZUhfModule",
+	"version": "1.0.0",
+	"description": "Alvin-CBZUhfModule",
+	"_dp_type": "nativeplugin",
+	"_dp_nativeplugin": {
+		"android": {
+			"plugins": [{
+				"type": "module",
+				"name": "Alvin-CBZUhfModule",
+				"class": "cn.wm.chengbangzi.UhfModule"
+			}],
+			"compileOptions": {
+				"sourceCompatibility": "1.8",
+				"targetCompatibility": "1.8"
+			},
+			"abis": [
+				"armeabi-v7a"
+			],
+			"integrateType": "aar",
+			"minSdkVersion": 21
+		}
+	}
+}

+ 25 - 0
unpackage/cache/wgt/__UNI__9F8B139/nativeplugins/Alvin-CBZUhfModule/使用说明.md

@@ -0,0 +1,25 @@
+**使用方法**
+
+1. 引用原生插件:
+	const uhfModule = uni.requireNativePlugin("Alvin-CBZUhfModule");
+
+2. 具体使用api:
+	/**
+	 * 初始化设备;
+	 * result:返回值,初始化成功或失败
+	 */
+	(1).init:uhfModule.doInitDevice(result => {})
+	
+	/**
+	 * 开始扫描
+	 * result:扫描到的结果
+	 */
+	(2).扫描:uhfModule.doStartScan(result => {});
+	
+	/**
+	 * 释放
+	 */
+	(3).扫描:uhfModule.doReleaseDevice();
+	
+
+	

BIN
unpackage/cache/wgt/__UNI__9F8B139/static/123.png


BIN
unpackage/cache/wgt/__UNI__9F8B139/static/empty.png


BIN
unpackage/cache/wgt/__UNI__9F8B139/static/logo.png


BIN
unpackage/cache/wgt/__UNI__9F8B139/static/menu_mine.png


BIN
unpackage/cache/wgt/__UNI__9F8B139/static/menu_mine_selected.png


BIN
unpackage/cache/wgt/__UNI__9F8B139/static/menu_search.png


BIN
unpackage/cache/wgt/__UNI__9F8B139/static/menu_search_selected.png


BIN
unpackage/cache/wgt/__UNI__9F8B139/static/nologin.png


BIN
unpackage/cache/wgt/__UNI__9F8B139/static/scan.png


BIN
unpackage/cache/wgt/__UNI__9F8B139/static/workbench/archive.png


BIN
unpackage/cache/wgt/__UNI__9F8B139/static/workbench/inspection.png


BIN
unpackage/cache/wgt/__UNI__9F8B139/static/workbench/maintenance.png


BIN
unpackage/cache/wgt/__UNI__9F8B139/static/workbench/repair.png


BIN
unpackage/cache/wgt/__UNI__9F8B139/static/workbench/repair1.png


BIN
unpackage/cache/wgt/__UNI__9F8B139/static/workbench/repair_pool.png


BIN
unpackage/cache/wgt/__UNI__9F8B139/static/workbench/scrapped.png


File diff suppressed because it is too large
+ 0 - 0
unpackage/cache/wgt/__UNI__9F8B139/view.css


File diff suppressed because it is too large
+ 0 - 0
unpackage/cache/wgt/__UNI__9F8B139/view.umd.min.js


BIN
unpackage/debug/android_debug.apk


+ 0 - 0
unpackage/dist/build/.automator/app-plus/.automator.json


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/app-plus/__uniappchooselocation.js


BIN
unpackage/dist/build/app-plus/__uniapperror.png


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/app-plus/__uniappes6.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/app-plus/__uniappopenlocation.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/app-plus/__uniapppicker.js


File diff suppressed because it is too large
+ 6 - 0
unpackage/dist/build/app-plus/__uniappquill.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/app-plus/__uniappquillimageresize.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/app-plus/__uniappscan.js


BIN
unpackage/dist/build/app-plus/__uniappsuccess.png


+ 25 - 0
unpackage/dist/build/app-plus/__uniappview.html

@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+
+  <head>
+    <meta charset="UTF-8" />
+    <script>
+      var __UniViewStartTime__ = Date.now();
+      var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
+        CSS.supports('top: constant(a)'))
+      document.write(
+        '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
+        (coverSupport ? ', viewport-fit=cover' : '') + '" />')
+    </script>
+    <title>View</title>
+    <link rel="stylesheet" href="view.css" />
+  </head>
+
+  <body>
+    <div id="app"></div>
+    <script src="__uniappes6.js"></script>
+    <script src="view.umd.min.js"></script>
+    <script src="app-view.js"></script>
+  </body>
+
+</html>

+ 8 - 0
unpackage/dist/build/app-plus/app-config-service.js

@@ -0,0 +1,8 @@
+
+var isReady=false;var onReadyCallbacks=[];
+var isServiceReady=false;var onServiceReadyCallbacks=[];
+var __uniConfig = {"pages":["pages/login/login","pages/index/index","pages/mine/manage"],"window":{"navigationBarTextStyle":"black","navigationBarTitleText":"uni-app","navigationBarBackgroundColor":"#F8F8F8","backgroundColor":"#F8F8F8"},"tabBar":{"color":"#999999","selectedColor":"#ff0000","backgroundColor":"#ffffff","list":[{"pagePath":"pages/index/index","text":"首页","iconPath":"static/menu_search.png","selectedIconPath":"static/menu_search_selected.png"},{"pagePath":"pages/mine/manage","text":"我的","iconPath":"static/menu_mine.png","selectedIconPath":"static/menu_mine_selected.png"}]},"darkmode":false,"nvueCompiler":"uni-app","nvueStyleCompiler":"uni-app","renderer":"auto","splashscreen":{"alwaysShowBeforeRender":true,"autoclose":false},"appname":"UhfChengBangZi","compilerVersion":"4.76","entryPagePath":"pages/login/login","networkTimeout":{"request":60000,"connectSocket":60000,"uploadFile":60000,"downloadFile":60000}};
+var __uniRoutes = [{"path":"/pages/login/login","meta":{"isQuit":true},"window":{"navigationBarTitleText":"登录","navigationStyle":"custom"}},{"path":"/pages/index/index","meta":{"isQuit":true,"isTabBar":true},"window":{"navigationBarTitleText":"今楚联合育种种猪智能选留系统"}},{"path":"/pages/mine/manage","meta":{"isQuit":true,"isTabBar":true},"window":{"navigationBarTitleText":"个人中心"}}];
+__uniConfig.onReady=function(callback){if(__uniConfig.ready){callback()}else{onReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"ready",{get:function(){return isReady},set:function(val){isReady=val;if(!isReady){return}const callbacks=onReadyCallbacks.slice(0);onReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
+__uniConfig.onServiceReady=function(callback){if(__uniConfig.serviceReady){callback()}else{onServiceReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"serviceReady",{get:function(){return isServiceReady},set:function(val){isServiceReady=val;if(!isServiceReady){return}const callbacks=onServiceReadyCallbacks.slice(0);onServiceReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
+service.register("uni-app-config",{create(a,b,c){if(!__uniConfig.viewport){var d=b.weex.config.env.scale,e=b.weex.config.env.deviceWidth,f=Math.ceil(e/d);Object.assign(__uniConfig,{viewport:f,defaultFontSize:Math.round(f/20)})}return{instance:{__uniConfig:__uniConfig,__uniRoutes:__uniRoutes,global:void 0,window:void 0,document:void 0,frames:void 0,self:void 0,location:void 0,navigator:void 0,localStorage:void 0,history:void 0,Caches:void 0,screen:void 0,alert:void 0,confirm:void 0,prompt:void 0,fetch:void 0,XMLHttpRequest:void 0,WebSocket:void 0,webkit:void 0,print:void 0}}}});

+ 1 - 0
unpackage/dist/build/app-plus/app-config.js

@@ -0,0 +1 @@
+(function(e){function r(r){for(var n,l,i=r[0],p=r[1],a=r[2],c=0,s=[];c<i.length;c++)l=i[c],Object.prototype.hasOwnProperty.call(o,l)&&o[l]&&s.push(o[l][0]),o[l]=0;for(n in p)Object.prototype.hasOwnProperty.call(p,n)&&(e[n]=p[n]);f&&f(r);while(s.length)s.shift()();return u.push.apply(u,a||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,i=1;i<t.length;i++){var p=t[i];0!==o[p]&&(n=!1)}n&&(u.splice(r--,1),e=l(l.s=t[0]))}return e}var n={},o={"app-config":0},u=[];function l(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,l),t.l=!0,t.exports}l.m=e,l.c=n,l.d=function(e,r,t){l.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},l.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(e,r){if(1&r&&(e=l(e)),8&r)return e;if(4&r&&"object"===typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(l.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)l.d(t,n,function(r){return e[r]}.bind(null,n));return t},l.n=function(e){var r=e&&e.__esModule?function(){return e["default"]}:function(){return e};return l.d(r,"a",r),r},l.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},l.p="/";var i=this["webpackJsonp"]=this["webpackJsonp"]||[],p=i.push.bind(i);i.push=r,i=i.slice();for(var a=0;a<i.length;a++)r(i[a]);var f=p;t()})([]);

File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/app-plus/app-service.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/app-plus/app-view.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/app-plus/manifest.json


BIN
unpackage/dist/build/app-plus/static/123.png


BIN
unpackage/dist/build/app-plus/static/empty.png


BIN
unpackage/dist/build/app-plus/static/logo.png


BIN
unpackage/dist/build/app-plus/static/menu_mine.png


BIN
unpackage/dist/build/app-plus/static/menu_mine_selected.png


BIN
unpackage/dist/build/app-plus/static/menu_search.png


BIN
unpackage/dist/build/app-plus/static/menu_search_selected.png


BIN
unpackage/dist/build/app-plus/static/nologin.png


BIN
unpackage/dist/build/app-plus/static/scan.png


BIN
unpackage/dist/build/app-plus/static/workbench/archive.png


BIN
unpackage/dist/build/app-plus/static/workbench/inspection.png


BIN
unpackage/dist/build/app-plus/static/workbench/maintenance.png


BIN
unpackage/dist/build/app-plus/static/workbench/repair.png


BIN
unpackage/dist/build/app-plus/static/workbench/repair1.png


BIN
unpackage/dist/build/app-plus/static/workbench/repair_pool.png


BIN
unpackage/dist/build/app-plus/static/workbench/scrapped.png


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/app-plus/view.css


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/app-plus/view.umd.min.js


+ 0 - 0
unpackage/dist/dev/.automator/app-plus/.automator.json


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/app-plus/__uniappchooselocation.js


BIN
unpackage/dist/dev/app-plus/__uniapperror.png


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/app-plus/__uniappes6.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/app-plus/__uniappopenlocation.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/app-plus/__uniapppicker.js


File diff suppressed because it is too large
+ 6 - 0
unpackage/dist/dev/app-plus/__uniappquill.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/app-plus/__uniappquillimageresize.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/app-plus/__uniappscan.js


BIN
unpackage/dist/dev/app-plus/__uniappsuccess.png


+ 25 - 0
unpackage/dist/dev/app-plus/__uniappview.html

@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+
+  <head>
+    <meta charset="UTF-8" />
+    <script>
+      var __UniViewStartTime__ = Date.now();
+      var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
+        CSS.supports('top: constant(a)'))
+      document.write(
+        '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
+        (coverSupport ? ', viewport-fit=cover' : '') + '" />')
+    </script>
+    <title>View</title>
+    <link rel="stylesheet" href="view.css" />
+  </head>
+
+  <body>
+    <div id="app"></div>
+    <script src="__uniappes6.js"></script>
+    <script src="view.umd.min.js"></script>
+    <script src="app-view.js"></script>
+  </body>
+
+</html>

+ 8 - 0
unpackage/dist/dev/app-plus/app-config-service.js

@@ -0,0 +1,8 @@
+
+var isReady=false;var onReadyCallbacks=[];
+var isServiceReady=false;var onServiceReadyCallbacks=[];
+var __uniConfig = {"pages":["pages/login/login","pages/index/index","pages/mine/manage"],"window":{"navigationBarTextStyle":"black","navigationBarTitleText":"uni-app","navigationBarBackgroundColor":"#F8F8F8","backgroundColor":"#F8F8F8"},"tabBar":{"color":"#999999","selectedColor":"#ff0000","backgroundColor":"#ffffff","list":[{"pagePath":"pages/index/index","text":"首页","iconPath":"static/menu_search.png","selectedIconPath":"static/menu_search_selected.png"},{"pagePath":"pages/mine/manage","text":"我的","iconPath":"static/menu_mine.png","selectedIconPath":"static/menu_mine_selected.png"}]},"darkmode":false,"nvueCompiler":"uni-app","nvueStyleCompiler":"uni-app","renderer":"auto","splashscreen":{"alwaysShowBeforeRender":true,"autoclose":false},"appname":"UhfChengBangZi","compilerVersion":"4.76","entryPagePath":"pages/login/login","networkTimeout":{"request":60000,"connectSocket":60000,"uploadFile":60000,"downloadFile":60000}};
+var __uniRoutes = [{"path":"/pages/login/login","meta":{"isQuit":true},"window":{"navigationBarTitleText":"登录","navigationStyle":"custom"}},{"path":"/pages/index/index","meta":{"isQuit":true,"isTabBar":true},"window":{"navigationBarTitleText":"今楚联合育种种猪智能选留系统"}},{"path":"/pages/mine/manage","meta":{"isQuit":true,"isTabBar":true},"window":{"navigationBarTitleText":"个人中心"}}];
+__uniConfig.onReady=function(callback){if(__uniConfig.ready){callback()}else{onReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"ready",{get:function(){return isReady},set:function(val){isReady=val;if(!isReady){return}const callbacks=onReadyCallbacks.slice(0);onReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
+__uniConfig.onServiceReady=function(callback){if(__uniConfig.serviceReady){callback()}else{onServiceReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"serviceReady",{get:function(){return isServiceReady},set:function(val){isServiceReady=val;if(!isServiceReady){return}const callbacks=onServiceReadyCallbacks.slice(0);onServiceReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
+service.register("uni-app-config",{create(a,b,c){if(!__uniConfig.viewport){var d=b.weex.config.env.scale,e=b.weex.config.env.deviceWidth,f=Math.ceil(e/d);Object.assign(__uniConfig,{viewport:f,defaultFontSize:Math.round(f/20)})}return{instance:{__uniConfig:__uniConfig,__uniRoutes:__uniRoutes,global:void 0,window:void 0,document:void 0,frames:void 0,self:void 0,location:void 0,navigator:void 0,localStorage:void 0,history:void 0,Caches:void 0,screen:void 0,alert:void 0,confirm:void 0,prompt:void 0,fetch:void 0,XMLHttpRequest:void 0,WebSocket:void 0,webkit:void 0,print:void 0}}}});

+ 154 - 0
unpackage/dist/dev/app-plus/app-config.js

@@ -0,0 +1,154 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ 	// install a JSONP callback for chunk loading
+/******/ 	function webpackJsonpCallback(data) {
+/******/ 		var chunkIds = data[0];
+/******/ 		var moreModules = data[1];
+/******/ 		var executeModules = data[2];
+/******/
+/******/ 		// add "moreModules" to the modules object,
+/******/ 		// then flag all "chunkIds" as loaded and fire callback
+/******/ 		var moduleId, chunkId, i = 0, resolves = [];
+/******/ 		for(;i < chunkIds.length; i++) {
+/******/ 			chunkId = chunkIds[i];
+/******/ 			if(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {
+/******/ 				resolves.push(installedChunks[chunkId][0]);
+/******/ 			}
+/******/ 			installedChunks[chunkId] = 0;
+/******/ 		}
+/******/ 		for(moduleId in moreModules) {
+/******/ 			if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
+/******/ 				modules[moduleId] = moreModules[moduleId];
+/******/ 			}
+/******/ 		}
+/******/ 		if(parentJsonpFunction) parentJsonpFunction(data);
+/******/
+/******/ 		while(resolves.length) {
+/******/ 			resolves.shift()();
+/******/ 		}
+/******/
+/******/ 		// add entry modules from loaded chunk to deferred list
+/******/ 		deferredModules.push.apply(deferredModules, executeModules || []);
+/******/
+/******/ 		// run deferred modules when all chunks ready
+/******/ 		return checkDeferredModules();
+/******/ 	};
+/******/ 	function checkDeferredModules() {
+/******/ 		var result;
+/******/ 		for(var i = 0; i < deferredModules.length; i++) {
+/******/ 			var deferredModule = deferredModules[i];
+/******/ 			var fulfilled = true;
+/******/ 			for(var j = 1; j < deferredModule.length; j++) {
+/******/ 				var depId = deferredModule[j];
+/******/ 				if(installedChunks[depId] !== 0) fulfilled = false;
+/******/ 			}
+/******/ 			if(fulfilled) {
+/******/ 				deferredModules.splice(i--, 1);
+/******/ 				result = __webpack_require__(__webpack_require__.s = deferredModule[0]);
+/******/ 			}
+/******/ 		}
+/******/
+/******/ 		return result;
+/******/ 	}
+/******/
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+/******/
+/******/ 	// object to store loaded and loading chunks
+/******/ 	// undefined = chunk not loaded, null = chunk preloaded/prefetched
+/******/ 	// Promise = chunk loading, 0 = chunk loaded
+/******/ 	var installedChunks = {
+/******/ 		"app-config": 0
+/******/ 	};
+/******/
+/******/ 	var deferredModules = [];
+/******/
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId]) {
+/******/ 			return installedModules[moduleId].exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			i: moduleId,
+/******/ 			l: false,
+/******/ 			exports: {}
+/******/ 		};
+/******/
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ 		// Flag the module as loaded
+/******/ 		module.l = true;
+/******/
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/
+/******/
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+/******/
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+/******/
+/******/ 	// define getter function for harmony exports
+/******/ 	__webpack_require__.d = function(exports, name, getter) {
+/******/ 		if(!__webpack_require__.o(exports, name)) {
+/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ 		}
+/******/ 	};
+/******/
+/******/ 	// define __esModule on exports
+/******/ 	__webpack_require__.r = function(exports) {
+/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ 		}
+/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
+/******/ 	};
+/******/
+/******/ 	// create a fake namespace object
+/******/ 	// mode & 1: value is a module id, require it
+/******/ 	// mode & 2: merge all properties of value into the ns
+/******/ 	// mode & 4: return value when already ns object
+/******/ 	// mode & 8|1: behave like require
+/******/ 	__webpack_require__.t = function(value, mode) {
+/******/ 		if(mode & 1) value = __webpack_require__(value);
+/******/ 		if(mode & 8) return value;
+/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ 		var ns = Object.create(null);
+/******/ 		__webpack_require__.r(ns);
+/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ 		return ns;
+/******/ 	};
+/******/
+/******/ 	// getDefaultExport function for compatibility with non-harmony modules
+/******/ 	__webpack_require__.n = function(module) {
+/******/ 		var getter = module && module.__esModule ?
+/******/ 			function getDefault() { return module['default']; } :
+/******/ 			function getModuleExports() { return module; };
+/******/ 		__webpack_require__.d(getter, 'a', getter);
+/******/ 		return getter;
+/******/ 	};
+/******/
+/******/ 	// Object.prototype.hasOwnProperty.call
+/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "/";
+/******/
+/******/ 	var jsonpArray = this["webpackJsonp"] = this["webpackJsonp"] || [];
+/******/ 	var oldJsonpFunction = jsonpArray.push.bind(jsonpArray);
+/******/ 	jsonpArray.push = webpackJsonpCallback;
+/******/ 	jsonpArray = jsonpArray.slice();
+/******/ 	for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);
+/******/ 	var parentJsonpFunction = oldJsonpFunction;
+/******/
+/******/
+/******/ 	// run deferred modules from other chunks
+/******/ 	checkDeferredModules();
+/******/ })
+/************************************************************************/
+/******/ ([]);

File diff suppressed because it is too large
+ 9 - 0
unpackage/dist/dev/app-plus/app-service.js


File diff suppressed because it is too large
+ 593 - 0
unpackage/dist/dev/app-plus/app-view.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/app-plus/manifest.json


BIN
unpackage/dist/dev/app-plus/static/123.png


BIN
unpackage/dist/dev/app-plus/static/empty.png


BIN
unpackage/dist/dev/app-plus/static/logo.png


Some files were not shown because too many files changed in this diff