manage.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895
  1. <template>
  2. <view class="container">
  3. <view class="lists" v-if="login">
  4. <!-- 用户信息卡片 -->
  5. <view class="cu-card case user-card">
  6. <view class="cu-item">
  7. <view class="content">
  8. <view class="username">用户名: {{user.username}}</view>
  9. <view class="user-id" v-if="user.ID">ID: {{user.ID}}</view>
  10. </view>
  11. </view>
  12. </view>
  13. <!-- 功能列表 -->
  14. <view class="cu-list menu sm-border card-menu function-list">
  15. <view class="form-section">
  16. <picker :range="buildingList" @change="onBuildingChange">
  17. <view class="form-item">
  18. <text class="label"><text class="fa fa-home"></text> 栋舍编号</text>
  19. <text class="value">{{ form.buildingName || '请选择栋舍' }}</text>
  20. </view>
  21. </picker>
  22. <picker :range="roomList" @change="onRoomChange">
  23. <view class="form-item">
  24. <text class="label"><text class="fa fa-door-open"></text> 房间编号</text>
  25. <text class="value">{{ form.roomName || '请选择房间' }}</text>
  26. </view>
  27. </picker>
  28. <picker :range="Fieldnumber" @change="onFieldChange">
  29. <view class="form-item">
  30. <text class="label"><text class="fa fa-th-large"></text> 栏位编号</text>
  31. <text class="value">{{ form.penNo || '请选择栏位' }}</text>
  32. </view>
  33. </picker>
  34. </view>
  35. <view class="save-btn-container">
  36. <button class="cu-btn block save-btn" @click="saveSettings" style="background-color: #07c160;">
  37. <text class="fa fa-save margin-right-xs"></text> 保存设置
  38. </button>
  39. <button class="cu-btn block save-btn" @click="logout()" style="background-color: red;">
  40. <text class="fa fa-save margin-right-xs"></text> 退出登录
  41. </button>
  42. </view>
  43. </view>
  44. </view>
  45. <view v-else>
  46. <view class="empty nologin-content">
  47. <image src="../../static/nologin.png" mode="widthFix"></image>
  48. <view class="text-gray">请先登录账号</view>
  49. <button class="cu-btn block bg-black lg" @click="goLogin()">
  50. <text class="cuIcon-lock margin-right-xs"></text> 登录账号</button>
  51. </view>
  52. </view>
  53. </view>
  54. </template>
  55. <script>
  56. import API from '../../api/index';
  57. // 移除全局变量声明,改为在方法内使用const声明
  58. export default {
  59. data() {
  60. return {
  61. login: false,
  62. user: {},
  63. avatar: '',
  64. managePhone: '',
  65. // 表单数据
  66. form: {
  67. buildingName: '',
  68. roomName: '',
  69. penNo: ''
  70. },
  71. // 动态从接口获取数据
  72. buildingList: [],
  73. roomList: [],
  74. Fieldnumber: []
  75. }
  76. },
  77. onShow() {
  78. const _self = this;
  79. const app = getApp();
  80. const isLogin = !!app.globalData.token;
  81. _self.login = isLogin;
  82. if (!isLogin) {
  83. wx.login({
  84. success(res) {
  85. if (res.code) {
  86. _self.goWeLogin(res.code);
  87. }
  88. }
  89. });
  90. } else {
  91. // 直接从全局状态获取用户信息
  92. _self.user = app.globalData.userInfo || {};
  93. _self.avatar = _self.user.avatar || '';
  94. }
  95. },
  96. methods: {
  97. // 获取栋舍列表
  98. fetchBuildingList() {
  99. const _self = this;
  100. const app = getApp();
  101. // 从服务器获取栋舍列表
  102. uni.request({
  103. url: API.getBuilding,
  104. method: 'GET',
  105. header: {
  106. "x-token": app.globalData.token || ''
  107. },
  108. success: (res) => {
  109. console.log(res.data.data)
  110. if (res.data && res.data.code === 0 && res.data.data && res.data.data.length > 0) {
  111. // 更新栋舍列表
  112. _self.buildingList = res.data.data.map(item => item.name || item.building_name);
  113. console.log('获取栋舍编号:', _self.buildingList);
  114. // 如果表单中没有选择栋舍,尝试使用全局数据或本地存储
  115. if (!_self.form.buildingName) {
  116. _self.form.buildingName = app.globalData.building || uni.getStorageSync('building') || '';
  117. }
  118. // 获取对应栋舍的房间列表
  119. _self.fetchRoomList();
  120. } else {
  121. console.error('get_building响应数据无效或为空:', res.data);
  122. // 使用默认栋舍列表
  123. _self.buildingList = [];
  124. }
  125. },
  126. fail: (err) => {
  127. console.error('获取栋舍列表失败:', err);
  128. }
  129. });
  130. },
  131. // 新增方法:获取最新用户信息
  132. // 修复fetchUserInfo方法,确保用户信息正确获取
  133. fetchUserInfo() {
  134. const _self = this;
  135. const app = getApp();
  136. // 从多个来源获取用户信息,增加可靠性
  137. let userInfo = {};
  138. // 1. 优先从全局数据获取
  139. if (app.globalData.userInfo && Object.keys(app.globalData.userInfo).length > 0) {
  140. userInfo = app.globalData.userInfo;
  141. console.log('从全局数据获取用户信息:', userInfo);
  142. }
  143. // 2. 如果全局数据不可用,尝试从本地存储获取
  144. if (!userInfo.username || !userInfo.ID) {
  145. try {
  146. const storedUserInfo = uni.getStorageSync('user_info') || {};
  147. if (storedUserInfo && Object.keys(storedUserInfo).length > 0) {
  148. userInfo = { ...userInfo, ...storedUserInfo };
  149. console.log('从本地存储补充用户信息:', storedUserInfo);
  150. }
  151. } catch (e) {
  152. console.error('读取本地存储用户信息失败:', e);
  153. }
  154. }
  155. // 3. 如果仍然缺少关键信息,尝试从token相关信息中提取
  156. if (!userInfo.username) {
  157. userInfo.username = app.globalData.username || '';
  158. }
  159. if (!userInfo.ID) {
  160. userInfo.ID = app.globalData.ID || '';
  161. }
  162. // 记录获取到的用户信息,便于调试
  163. console.log('最终获取的用户信息:', userInfo);
  164. // 更新页面数据
  165. _self.user = userInfo;
  166. // 确保即使没有头像也不会出错
  167. _self.avatar = userInfo.avatar || '';
  168. // 更新表单数据
  169. _self.form.buildingName = app.globalData.building || app.globalData.buildingName || '';
  170. _self.form.roomName = app.globalData.room || app.globalData.roomName || '';
  171. _self.form.penNo = app.globalData.pen || app.globalData.penNo || '';
  172. console.log('更新后的表单数据:', _self.form);
  173. // 触发设置更新事件,通知其他组件
  174. uni.$emit('settingsUpdated', {
  175. building: _self.form.buildingName,
  176. room: _self.form.roomName,
  177. pen: _self.form.penNo
  178. });
  179. },
  180. data() {
  181. return {
  182. login: false,
  183. user: {
  184. username: '', // 提供默认的用户名属性
  185. ID: '' // 提供默认的ID属性
  186. },
  187. avatar: '',
  188. managePhone: '',
  189. // 表单数据
  190. form: {
  191. buildingName: '',
  192. roomName: '',
  193. penNo: ''
  194. },
  195. // 动态从接口获取数据
  196. buildingList: [],
  197. roomList: [],
  198. Fieldnumber: []
  199. }
  200. },
  201. // 增强onShow方法中的用户信息获取逻辑
  202. onShow() {
  203. const _self = this;
  204. const app = getApp();
  205. // 首先检查登录状态
  206. const isLogin = !!app.globalData.token;
  207. _self.login = isLogin;
  208. if (isLogin) {
  209. // 获取栋舍列表
  210. _self.fetchBuildingList();
  211. // 获取最新用户信息
  212. _self.fetchUserInfo();
  213. } else {
  214. // 尝试从本地存储恢复登录信息
  215. const token = uni.getStorageSync('equipment_token') || '';
  216. const expireAt = uni.getStorageSync('token_expire_time') || '';
  217. const userInfo = uni.getStorageSync('user_info') || {};
  218. if (token && expireAt) {
  219. // 恢复登录信息到全局数据
  220. app.globalData.token = token;
  221. app.globalData.expireAt = expireAt;
  222. app.globalData.userInfo = userInfo;
  223. app.globalData.isLoggedIn = true;
  224. _self.login = true;
  225. _self.fetchBuildingList();
  226. _self.fetchUserInfo();
  227. console.log('从本地存储恢复登录状态成功');
  228. }
  229. }
  230. },
  231. // 新增一个方法,用于手动刷新用户信息
  232. refreshUserInfo() {
  233. const app = getApp();
  234. console.log('手动刷新用户信息 - 当前全局数据:', app.globalData);
  235. console.log('手动刷新用户信息 - 当前本地存储:', uni.getStorageSync('user_info'));
  236. this.fetchUserInfo();
  237. this.fetchBuildingList();
  238. },
  239. // 获取房间列表
  240. fetchRoomList() {
  241. const _self = this;
  242. const app = getApp();
  243. // 获取房间列表
  244. uni.request({
  245. url: API.getRoom,
  246. method: 'GET',
  247. data: {
  248. building: _self.form.buildingName // 传递当前选择的栋舍
  249. },
  250. header: {
  251. "x-token": app.globalData.token || ''
  252. },
  253. success: (res) => {
  254. console.log('获取房间编号:', res);
  255. if (res.data && res.data.code === 0 && res.data.data && res.data.data.length > 0) {
  256. // 更新房间列表
  257. _self.roomList = res.data.data.map(item => item.name || item.room_name);
  258. // 如果表单中没有选择房间,尝试使用全局数据或本地存储
  259. if (!_self.form.roomName) {
  260. _self.form.roomName = app.globalData.room || uni.getStorageSync('room') || '';
  261. }
  262. // 获取对应房间的栏位列表
  263. _self.fetchPenList();
  264. } else {
  265. console.error('get_room响应数据无效或为空:', res.data);
  266. // 使用默认房间列表
  267. _self.roomList = [];
  268. }
  269. },
  270. fail: (err) => {
  271. console.error('获取房间列表失败:', err);
  272. }
  273. });
  274. },
  275. // 获取栏位列表
  276. fetchPenList() {
  277. const _self = this;
  278. const app = getApp();
  279. // 获取栏位列表
  280. uni.request({
  281. url: API.getPen,
  282. method: 'GET',
  283. data: {
  284. building: _self.form.buildingName,
  285. room: _self.form.roomName // 当前选择的房间
  286. },
  287. header: {
  288. 'content-type': 'application/x-www-form-urlencoded',
  289. "x-token": app.globalData.token || ''
  290. },
  291. success: (res) => {
  292. console.log('获取栏位编号:', res);
  293. if (res.data && res.data.code === 0 && res.data.data && res.data.data.length > 0) {
  294. // 更新栏位列表
  295. _self.Fieldnumber = res.data.data.map(item => item.name || item.pen_name || item.pen_no);
  296. // 如果表单中没有选择栏位,尝试使用全局数据或本地存储
  297. if (!_self.form.penNo) {
  298. _self.form.penNo = app.globalData.pen || uni.getStorageSync('pen') || '';
  299. }
  300. } else {
  301. console.error('get_pen响应数据无效或为空:', res.data);
  302. // 使用默认栏位列表
  303. _self.Fieldnumber = [];
  304. }
  305. },
  306. fail: (err) => {
  307. console.error('获取栏位列表失败:', err);
  308. }
  309. });
  310. },
  311. loadFromStorage() {
  312. const _self = this;
  313. const app = getApp();
  314. const globalUserInfo = app.globalData.userInfo;
  315. _self.user = globalUserInfo;
  316. _self.form.buildingName = app.globalData.building;
  317. _self.form.roomName = app.globalData.room;
  318. _self.form.penNo = app.globalData.pen;
  319. console.log('从存储加载的表单buildingName:', _self.form.buildingName);
  320. console.log('从存储加载的表单roomName:', _self.form.roomName);
  321. console.log('从存储加载的表单penNo:', _self.form.penNo);
  322. },
  323. // 选择器方法
  324. onBuildingChange(e) {
  325. const selectedValue = this.buildingList[e.detail.value];
  326. this.form.buildingName = selectedValue;
  327. console.log('栋舍选择已更新:', this.form.buildingName);
  328. // 保存到login中定义的全局变量
  329. getApp().globalData.building = selectedValue;
  330. // 触发全局事件通知设置更新
  331. uni.$emit('settingsUpdated');
  332. // 获取对应栋舍的房间列表
  333. this.fetchRoomList();
  334. },
  335. onRoomChange(e) {
  336. const selectedValue = this.roomList[e.detail.value];
  337. this.form.roomName = selectedValue;
  338. console.log('房间选择已更新:', this.form.roomName);
  339. // 保存到login中定义的全局变量
  340. getApp().globalData.room = selectedValue;
  341. // 触发全局事件通知设置更新
  342. uni.$emit('settingsUpdated');
  343. // 获取对应房间的栏位列表
  344. this.fetchPenList();
  345. },
  346. onFieldChange(e) {
  347. const selectedValue = this.Fieldnumber[e.detail.value];
  348. this.form.penNo = selectedValue;
  349. console.log('栏位选择已更新:', this.form.penNo);
  350. // 保存到login中定义的全局变量
  351. getApp().globalData.pen = selectedValue;
  352. // 触发全局事件通知设置更新
  353. uni.$emit('settingsUpdated');
  354. },
  355. // 保存设置到API
  356. saveSettings() {
  357. if (!this.form.buildingName || !this.form.roomName || !this.form.penNo) {
  358. return uni.showToast({
  359. title: '请选择完整的栋舍、房间和栏位信息',
  360. icon: 'none'
  361. });
  362. }
  363. const app = getApp();
  364. // 获取用户ID(优先从全局数据,其次从本地存储)
  365. const userId = app.globalData.userInfo?.ID || uni.getStorageSync('user_info')?.ID || '';
  366. const username = app.globalData.userInfo?.username || uni.getStorageSync('user_info')?.username || '';
  367. if (!userId) {
  368. console.error('用户ID不存在,无法保存设置');
  369. return uni.showToast({
  370. title: '请先登录',
  371. icon: 'none'
  372. });
  373. };
  374. uni.showLoading({
  375. title: '保存中...',
  376. mask: true
  377. });
  378. const submitData = {
  379. username: username,
  380. userid: userId,
  381. building: this.form.buildingName,
  382. room: this.form.roomName,
  383. pen: this.form.penNo
  384. };
  385. console.log('提交的数据:', submitData);
  386. // 发送请求到API
  387. uni.request({
  388. url: API.postUserSetup,
  389. method: 'POST',
  390. data: submitData,
  391. header: {
  392. 'content-type': 'application/json',
  393. "x-token": app.globalData.token || uni.getStorageSync('token') || ''
  394. },
  395. timeout: 10000, // 设置10秒超时
  396. success: (res) => {
  397. if (res.data.code === 0) {
  398. uni.showToast({
  399. title: '保存成功',
  400. icon: 'success',
  401. duration: 3000
  402. });
  403. // 更新全局数据
  404. app.globalData.building = submitData.building;
  405. app.globalData.room = submitData.room;
  406. app.globalData.pen = submitData.pen;
  407. // 更新本地存储
  408. uni.setStorageSync('building', submitData.building);
  409. uni.setStorageSync('room', submitData.room);
  410. uni.setStorageSync('pen', submitData.pen);
  411. // 触发设置更新事件
  412. uni.$emit('settingsUpdated', {
  413. building: submitData.building,
  414. room: submitData.room,
  415. pen: submitData.pen
  416. });
  417. } else {
  418. console.error('保存设置失败:', res.data);
  419. uni.showToast({
  420. title: res.data?.msg || '保存失败,请稍后重试',
  421. icon: 'none'
  422. });
  423. }
  424. },
  425. complete: () => {
  426. uni.hideLoading();
  427. }
  428. });
  429. },
  430. goWeLogin(code) {
  431. const _self = this;
  432. _self.$api.welogin({
  433. code
  434. }).then((res) => {
  435. getApp().globalData.token = res.data.token
  436. getApp().globalData.equipmentManage = res.data.equipment_manage
  437. // 保存到本地存储
  438. uni.setStorageSync('equipment_token', res.data.token)
  439. uni.setStorageSync('equipment_openid', res.data.openid)
  440. uni.setStorageSync('equipment_manage', res.data.equipment_manage)
  441. _self.login = true
  442. // 登录成功后从全局状态获取用户信息
  443. _self.user = getApp().globalData.userInfo || {};
  444. _self.avatar = _self.user.avatar || '';
  445. // 登录成功后刷新数据
  446. _self.fetchBuildingList();
  447. _self.fetchUserInfo();
  448. }).catch((err) => {
  449. console.error('登录失败:', err);
  450. uni.showToast({
  451. title: '登录失败,请稍后重试',
  452. icon: 'none'
  453. });
  454. })
  455. },
  456. goLogin() {
  457. const _self = this;
  458. uni.navigateTo({
  459. url: '/pages/login/login',
  460. events: {
  461. // 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据
  462. isLoginFromLogin: function(data) {
  463. if (data && data.isLogin) {
  464. _self.isLoggedIn = true
  465. // 登录成功后从全局状态获取用户信息
  466. _self.user = getApp().globalData.userInfo || {};
  467. _self.avatar = _self.user.avatar || '';
  468. }
  469. }
  470. }
  471. })
  472. },
  473. // 添加退出登录方法
  474. logout() {
  475. try {
  476. // 清除全局数据
  477. const app = getApp();
  478. app.globalData.ID = '';
  479. app.globalData.token = '';
  480. app.globalData.userInfo = {};
  481. app.globalData.isLoggedIn = false;
  482. app.globalData.expireAt = '';
  483. app.globalData.building = '';
  484. app.globalData.room = '';
  485. app.globalData.pen = '';
  486. app.globalData.buildingName = '';
  487. app.globalData.roomName = '';
  488. app.globalData.penNo = '';
  489. // 清除本地存储
  490. uni.removeStorageSync('equipment_token');
  491. uni.removeStorageSync('token_expire_time');
  492. uni.removeStorageSync('user_info');
  493. uni.removeStorageSync('building');
  494. uni.removeStorageSync('room');
  495. uni.removeStorageSync('pen');
  496. console.log('退出登录成功,已清除所有登录信息');
  497. // 重置页面状态
  498. this.login = false;
  499. this.user = { username: '', ID: '' };
  500. this.form = {
  501. buildingName: '',
  502. roomName: '',
  503. penNo: ''
  504. };
  505. // 跳转到登录页面
  506. uni.redirectTo({
  507. url: '/pages/login/login',
  508. success: function() {
  509. console.log('跳转到登录页面成功');
  510. }
  511. });
  512. } catch (e) {
  513. console.error('退出登录过程中发生错误:', e);
  514. uni.showToast({
  515. title: '退出登录失败,请重试',
  516. icon: 'none'
  517. });
  518. }
  519. },
  520. clearStorage() {
  521. const _self = this;
  522. try {
  523. _self.login = false
  524. const app = getApp();
  525. // 清空全局数据
  526. app.globalData.token = '';
  527. app.globalData.equipmentManage = 0;
  528. app.globalData.userInfo = {};
  529. app.globalData.building = '';
  530. app.globalData.room = '';
  531. app.globalData.pen = '';
  532. app.globalData.buildingName = '';
  533. app.globalData.roomName = '';
  534. app.globalData.penNo = '';
  535. app.globalData.isLoggedIn = false;
  536. // 清空本地存储
  537. uni.setStorageSync('equipment_token', '');
  538. uni.setStorageSync('equipment_openid', '');
  539. uni.setStorageSync('equipment_manage', '');
  540. uni.setStorageSync('user_info', {});
  541. uni.setStorageSync('building', '');
  542. uni.setStorageSync('room', '');
  543. uni.setStorageSync('pen', '');
  544. uni.setStorageSync('buildingName', '');
  545. uni.setStorageSync('roomName', '');
  546. uni.setStorageSync('penNo', '');
  547. uni.$emit('loginStatusEvent', {
  548. isLogin: false
  549. })
  550. uni.showToast({
  551. title: '退出登录成功',
  552. icon: 'success'
  553. })
  554. // 直接跳转到登录页面,避免延迟导致的重复导航
  555. setTimeout(function() {
  556. uni.redirectTo({
  557. url: '/pages/login/login'
  558. })
  559. }, 500);
  560. } catch (e) {
  561. console.error('清除存储失败:', e);
  562. uni.showToast({
  563. title: '退出失败,请稍后再试',
  564. icon: 'none'
  565. })
  566. }
  567. },
  568. callManage() {
  569. const _self = this;
  570. let managePhone = _self.managePhone
  571. if (managePhone == '') {
  572. uni.showToast({
  573. title: '暂无管理员联系方式',
  574. icon: 'none'
  575. })
  576. return;
  577. }
  578. uni.makePhoneCall({
  579. phoneNumber: managePhone
  580. })
  581. }
  582. }
  583. }
  584. </script>
  585. <style lang="scss">
  586. .container {
  587. min-height: 100vh;
  588. background-color: #f5f5f5;
  589. // padding-bottom: 120rpx; /* 增加底部内边距确保按钮可见 */
  590. box-sizing: border-box;
  591. overflow: auto;
  592. }
  593. /* 用户信息卡片样式 */
  594. .user-card {
  595. margin: 20rpx;
  596. border-radius: 20rpx;
  597. box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.08);
  598. transition: all 0.3s ease;
  599. overflow: hidden;
  600. }
  601. .user-card:hover {
  602. box-shadow: 0 10rpx 30rpx rgba(0, 0, 0, 0.12);
  603. transform: translateY(-5rpx);
  604. }
  605. .cu-item {
  606. display: flex;
  607. align-items: center;
  608. padding: 30rpx;
  609. }
  610. .avatar-container {
  611. width: 120rpx;
  612. height: 100rpx;
  613. border-radius: 50%;
  614. overflow: hidden;
  615. background-color: #f0f0f0;
  616. margin-right: 30rpx;
  617. }
  618. .avatar {
  619. width: 100%;
  620. height: 100%;
  621. }
  622. .avatar-placeholder {
  623. width: 100%;
  624. height: 100%;
  625. display: flex;
  626. align-items: center;
  627. justify-content: center;
  628. background-color: #f0f0f0;
  629. color: #999;
  630. font-size: 60rpx;
  631. }
  632. .content {
  633. flex: 1;
  634. }
  635. .username {
  636. font-size: 36rpx;
  637. font-weight: bold;
  638. color: #333;
  639. margin-bottom: 10rpx;
  640. }
  641. .user-id {
  642. font-size: 28rpx;
  643. color: #666;
  644. }
  645. .cu-list.menu-avatar>.cu-item:after {
  646. border: 0;
  647. }
  648. /* 表单区域样式 */
  649. .form-section {
  650. margin: 0px 20rpx;
  651. padding: 25rpx;
  652. background-color: #ffffff;
  653. border-radius: 16rpx;
  654. box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
  655. }
  656. .form-item {
  657. display: flex;
  658. justify-content: space-between;
  659. align-items: center;
  660. padding: 25rpx 0;
  661. border-bottom: 1rpx solid #f0f0f0;
  662. }
  663. .form-item:last-child {
  664. border-bottom: none;
  665. }
  666. .label {
  667. font-size: 28rpx;
  668. color: #333;
  669. }
  670. .value {
  671. font-size: 28rpx;
  672. color: #666;
  673. }
  674. /* 保存按钮样式 */
  675. .save-btn-container {
  676. padding: 20rpx;
  677. }
  678. .save-btn {
  679. background-color: #07c160;
  680. color: white;
  681. border-radius: 44rpx;
  682. height: 88rpx;
  683. line-height: 88rpx;
  684. font-size: 32rpx;
  685. margin: 30rpx 20rpx;
  686. transition: all 0.3s ease;
  687. width: calc(100% - 40rpx);
  688. }
  689. .save-btn:hover {
  690. background-color: #06ad56;
  691. transform: scale(1.02);
  692. }
  693. .save-btn:active {
  694. transform: scale(0.98);
  695. }
  696. /* 功能列表样式 */
  697. .function-list {
  698. margin: 0 20rpx 20rpx; /* 减小边距 */
  699. border-radius: 16rpx;
  700. box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.03);
  701. }
  702. .cu-list.card-menu .cu-item {
  703. padding: 20rpx; /* 减小内边距适应小屏幕 */
  704. transition: all 0.2s ease;
  705. }
  706. .cu-list.card-menu .cu-item:hover {
  707. background-color: #f9f9f9;
  708. }
  709. /* 退出登录按钮样式 */
  710. .logout-container {
  711. position: fixed;
  712. bottom: 120rpx; /* 增加底部距离避开导航栏 */
  713. left: 0;
  714. width: 100%;
  715. padding: 0 20rpx;
  716. box-sizing: border-box;
  717. }
  718. .logout-btn {
  719. background-color: #e64340;
  720. color: white;
  721. border-radius: 35rpx;
  722. height: 70rpx; /* 减小按钮高度 */
  723. line-height: 70rpx;
  724. font-size: 26rpx; /* 减小按钮字体 */
  725. transition: all 0.3s ease;
  726. width: 100%;
  727. }
  728. .logout-btn:hover {
  729. background-color: #d43835;
  730. transform: scale(1.02);
  731. }
  732. .logout-btn:active {
  733. transform: scale(0.98);
  734. }
  735. /* 未登录状态样式 */
  736. .empty {
  737. display: flex;
  738. flex-direction: column;
  739. align-items: center;
  740. justify-content: center;
  741. height: 100vh;
  742. text-align: center;
  743. background-color: #ffffff;
  744. overflow: hidden; /* 防止未登录状态下滚动 */
  745. image {
  746. width: 35%;
  747. margin-bottom: 30rpx;
  748. }
  749. .text-gray {
  750. font-size: 28rpx;
  751. color: #999;
  752. margin-bottom: 40rpx;
  753. }
  754. .cu-btn {
  755. width: 65%;
  756. border-radius: 70rpx;
  757. height: 80rpx;
  758. line-height: 80rpx;
  759. font-size: 28rpx;
  760. background-color: #000000;
  761. color: white;
  762. transition: all 0.3s ease;
  763. }
  764. .cu-btn:hover {
  765. background-color: #333333;
  766. transform: scale(1.03);
  767. }
  768. .cu-btn:active {
  769. transform: scale(0.97);
  770. }
  771. }
  772. .nologin-content {
  773. text-align: center;
  774. padding: 80rpx 0; /* 减小上下内边距 */
  775. height: 100vh;
  776. margin-top: 0;
  777. background-color: #FFFFFF;
  778. image {
  779. width: 240rpx; /* 减小图片尺寸 */
  780. height: 240rpx;
  781. margin-bottom: 30rpx; /* 减小图片与文本间距 */
  782. }
  783. .text-gray {
  784. font-size: 28rpx; /* 减小文本大小 */
  785. margin-bottom: 30rpx; /* 减小文本与按钮间距 */
  786. }
  787. button {
  788. width: 70%; /* 增加按钮宽度占比 */
  789. margin: 0 auto;
  790. font-size: 28rpx; /* 减小按钮字体 */
  791. height: 70rpx; /* 减小按钮高度 */
  792. line-height: 70rpx;
  793. }
  794. }
  795. </style>