manage.vue 24 KB

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