Przeglądaj źródła

登录已完成;基本信息模块基本完成

Huanyi 3 tygodni temu
rodzic
commit
46ce82c505
42 zmienionych plików z 790 dodań i 200 usunięć
  1. 7 0
      api/auth/index.js
  2. 39 0
      api/resource/oss.js
  3. 8 0
      api/system/complaint.js
  4. 15 0
      api/system/customer.js
  5. 8 0
      api/system/dict.js
  6. 29 27
      pages/login/index.vue
  7. 67 18
      pages/mine/complaint/index.vue
  8. 30 8
      pages/mine/index.vue
  9. 114 24
      pages/mine/settings/index.vue
  10. 45 5
      pages/order/index.vue
  11. 1 1
      unpackage/dist/dev/.sourcemap/mp-weixin/api/auth/index.js.map
  12. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/api/resource/oss.js.map
  13. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/api/system/complaint.js.map
  14. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/api/system/customer.js.map
  15. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/api/system/dict.js.map
  16. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/api/system/resource/oss.js.map
  17. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/login/index.js.map
  18. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/complaint/index.js.map
  19. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/index.js.map
  20. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/settings/index.js.map
  21. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/order/index.js.map
  22. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/utils/request.js.map
  23. 7 0
      unpackage/dist/dev/mp-weixin/api/auth/index.js
  24. 35 0
      unpackage/dist/dev/mp-weixin/api/resource/oss.js
  25. 7 0
      unpackage/dist/dev/mp-weixin/api/system/complaint.js
  26. 11 0
      unpackage/dist/dev/mp-weixin/api/system/customer.js
  27. 7 0
      unpackage/dist/dev/mp-weixin/api/system/dict.js
  28. 35 0
      unpackage/dist/dev/mp-weixin/api/system/resource/oss.js
  29. 1 1
      unpackage/dist/dev/mp-weixin/common/vendor.js
  30. 37 36
      unpackage/dist/dev/mp-weixin/pages/login/index.js
  31. 0 0
      unpackage/dist/dev/mp-weixin/pages/login/index.wxml
  32. 7 0
      unpackage/dist/dev/mp-weixin/pages/login/index.wxss
  33. 67 14
      unpackage/dist/dev/mp-weixin/pages/mine/complaint/index.js
  34. 43 16
      unpackage/dist/dev/mp-weixin/pages/mine/index.js
  35. 0 0
      unpackage/dist/dev/mp-weixin/pages/mine/index.wxml
  36. 91 29
      unpackage/dist/dev/mp-weixin/pages/mine/settings/index.js
  37. 1 1
      unpackage/dist/dev/mp-weixin/pages/mine/settings/index.wxml
  38. 22 1
      unpackage/dist/dev/mp-weixin/pages/mine/settings/index.wxss
  39. 49 17
      unpackage/dist/dev/mp-weixin/pages/order/index.js
  40. 0 0
      unpackage/dist/dev/mp-weixin/pages/order/index.wxml
  41. 1 1
      unpackage/dist/dev/mp-weixin/utils/request.js
  42. 1 1
      utils/request.js

+ 7 - 0
api/auth/index.js

@@ -27,3 +27,10 @@ export function wechatRegister(data) {
     data
   });
 }
+
+export function logout() {
+  return request({
+    url: '/auth/logout',
+    method: 'post'
+  });
+}

+ 39 - 0
api/resource/oss.js

@@ -0,0 +1,39 @@
+import request from '@/utils/request';
+
+const BASE_URL = 'http://127.0.0.1:8080';
+const CLIENT_ID = 'e48ac397bff4f031b14d6e671eee49c3';
+
+/**
+ * 上传文件至OSS
+ * @param {string} filePath 本地临时文件路径
+ * @returns {Promise} 解析结果含 { ossId, url, fileName }
+ */
+export function uploadFile(filePath) {
+	return new Promise((resolve, reject) => {
+		const token = uni.getStorageSync('token') || '';
+		uni.uploadFile({
+			url: BASE_URL + '/resource/oss/upload',
+			filePath,
+			name: 'file',
+			header: {
+				clientid: CLIENT_ID,
+				Authorization: 'Bearer ' + token
+			},
+			success(res) {
+				try {
+					const result = JSON.parse(res.data);
+					if (result.code === 200) {
+						resolve(result.data);
+					} else {
+						reject(new Error(result.msg || '上传失败'));
+					}
+				} catch (e) {
+					reject(new Error('响应解析失败'));
+				}
+			},
+			fail(err) {
+				reject(new Error(err.errMsg || '上传失败'));
+			}
+		});
+	});
+}

+ 8 - 0
api/system/complaint.js

@@ -0,0 +1,8 @@
+import request from '@/utils/request';
+
+/**
+ * 提交投诉建议
+ */
+export function submitComplaint(data) {
+	return request({ url: '/system/complaint', method: 'POST', data });
+}

+ 15 - 0
api/system/customer.js

@@ -0,0 +1,15 @@
+import request from '@/utils/request';
+
+/**
+ * 获取当前登录客户信息
+ */
+export function getMyInfo() {
+	return request({ url: '/system/customer/getInfo', method: 'GET' });
+}
+
+/**
+ * 更新当前登录客户信息
+ */
+export function updateMyInfo(data) {
+	return request({ url: '/system/customer/updateProfile', method: 'PUT', data });
+}

+ 8 - 0
api/system/dict.js

@@ -0,0 +1,8 @@
+import request from '@/utils/request';
+
+/**
+ * 根据字典类型获取字典数据
+ */
+export function getDictByType(dictType) {
+	return request({ url: '/system/dict/data/type/' + dictType, method: 'GET' });
+}

+ 29 - 27
pages/login/index.vue

@@ -62,7 +62,7 @@
 					<!-- 使用微信原生头像选择能力 -->
 					<button class="avatar-wrapper-btn" open-type="chooseAvatar" @chooseavatar="onChooseAvatar">
 						<image class="current-avatar"
-							:src="avatarBase64 || 'https://img.icons8.com/color/144/user.png'"></image>
+							:src="avatarPreviewUrl || 'https://img.icons8.com/color/144/user.png'"></image>
 						<view class="camera-icon">
 							<image src="https://img.icons8.com/ios-glyphs/30/999999/camera.png" mode="aspectFit">
 							</image>
@@ -93,14 +93,7 @@
 			</view>
 			<view class="p-body">
 				<text class="p-title">获取您的手机号</text>
-				<view class="p-number-card">
-					<view class="p-card-left">
-						<text class="p-real-num">{{ phoneNumber || '获取中...' }}</text>
-						<text class="p-num-hint">微信绑定号码</text>
-					</view>
-					<icon type="success" size="18" color="#C1001C" />
-				</view>
-				<text class="p-other-link">使用其他手机号码</text>
+				<text class="p-phone-hint">是否允许我们获取您的手机号,用于登录和订单通知?</text>
 			</view>
 			<view class="p-footer-btns">
 				<button class="p-btn-fixed p-deny" @click="activeModal = ''">拒绝</button>
@@ -131,11 +124,12 @@
 import assets from '@/utils/assets.js';
 import { getAgreement } from '@/api/system/agreement.js';
 import { wechatLogin, getWechatPhone, wechatRegister } from '@/api/auth/index.js';
+import { uploadFile } from '@/api/resource/oss.js';
 export default {
 	data() {
 		return {
 			assets, isAgreed: false, activeModal: '',
-			avatarBase64: '', userName: '微信用户',
+			avatarOssId: null, avatarPreviewUrl: '', userName: '微信用户',
 			currentProtocol: { title: '', content: '' },
 			protocols: {
 				user: { title: '', content: '' },
@@ -177,8 +171,8 @@ export default {
 
 				uni.hideLoading();
 
-				if (res.data && res.data.accessToken) {
-					uni.setStorageSync('token', res.data.accessToken);
+				if (res.data && res.data.access_token) {
+					uni.setStorageSync('token', res.data.access_token);
 					uni.setStorageSync('isLogin', true);
 					uni.showToast({ title: '登录成功', icon: 'success' });
 					setTimeout(() => {
@@ -197,22 +191,22 @@ export default {
 				uni.showToast({ title: '登录失败,请重试', icon: 'none' });
 			}
 		},
-		onChooseAvatar(e) {
+		async onChooseAvatar(e) {
 			const tempPath = e.detail.avatarUrl;
 			console.log('[微信信息] 头像临时路径:', tempPath);
-			const fs = uni.getFileSystemManager();
-			fs.readFile({
-				filePath: tempPath,
-				encoding: 'base64',
-				success: (res) => {
-					console.log('[微信信息] 头像 base64 长度:', res.data.length);
-					this.avatarBase64 = 'data:image/jpeg;base64,' + res.data;
-					console.log('[微信信息] avatarBase64 已赋值,前缀:', this.avatarBase64.substring(0, 30));
-				},
-				fail: (err) => {
-					console.error('[微信信息] 读取头像 base64 失败:', err);
-				}
-			});
+			this.avatarPreviewUrl = tempPath;
+			try {
+				uni.showLoading({ title: '上传头像...' });
+				const res = await uploadFile(tempPath);
+				uni.hideLoading();
+				this.avatarOssId = res.ossId;
+				this.avatarPreviewUrl = res.url;
+				console.log('[微信信息] 头像OSS上传成功, ossId:', this.avatarOssId);
+			} catch (err) {
+				uni.hideLoading();
+				console.error('[微信信息] 头像上传失败:', err);
+				uni.showToast({ title: '头像上传失败', icon: 'none' });
+			}
 		},
 		onNicknameBlur(e) {
 			this.userName = e.detail.value;
@@ -251,7 +245,7 @@ export default {
 					unionId: this.unionId,
 					phone: this.phoneNumber,
 					nickname: this.userName,
-					avatar: this.avatarBase64
+					avatar: this.avatarOssId
 				});
 
 				uni.hideLoading();
@@ -684,6 +678,14 @@ button::after {
 	display: block;
 }
 
+.p-phone-hint {
+	font-size: 30rpx;
+	color: #666;
+	line-height: 1.5;
+	display: block;
+	margin-bottom: 60rpx;
+}
+
 .p-number-card {
 	background: #fbfbfb;
 	padding: 36rpx;

+ 67 - 18
pages/mine/complaint/index.vue

@@ -55,17 +55,18 @@
 
 <script>
 import ErpNavBar from '@/components/erp-nav-bar.vue';
+import { submitComplaint } from '@/api/system/complaint.js';
+import { getDictByType } from '@/api/system/dict.js';
+import { uploadFile } from '@/api/resource/oss.js';
 export default {
 	components: { ErpNavBar },
 	data() {
 		return {
-			types: [
-				{ label: '系统投诉', value: 'complaint' },
-				{ label: '改进建议', value: 'suggestion' },
-				{ label: '其他反馈', value: 'other' }
-			],
+			types: [],
+			uploading: false,
+			imageOssMap: [],
 			formData: {
-				type: 'complaint',
+				type: '',
 				content: '',
 				images: []
 			}
@@ -73,23 +74,63 @@ export default {
 	},
 	computed: {
 		isFormValid() {
-			return this.formData.content && this.formData.content.trim().length >= 5;
+			return !this.uploading && this.formData.type && this.formData.content && this.formData.content.trim().length >= 5;
 		}
 	},
+	onLoad() {
+		this.loadTypes();
+	},
 	methods: {
+		async loadTypes() {
+			try {
+				const res = await getDictByType('sys_complaint_type');
+				if (res && res.data) {
+					this.types = res.data.map(d => ({ label: d.dictLabel, value: d.dictValue }));
+					if (this.types.length) this.formData.type = this.types[0].value;
+				}
+			} catch (e) {
+				this.types = [
+					{ label: '系统投诉', value: 'complaint' },
+					{ label: '改进建议', value: 'suggestion' },
+					{ label: '其他反馈', value: 'other' }
+				];
+				this.formData.type = 'complaint';
+			}
+		},
 		goBack() { uni.navigateBack(); },
 		chooseImage() {
 			const count = 6 - this.formData.images.length;
 			uni.chooseImage({
-				count: count,
+				count,
 				sizeType: ['compressed'],
-				success: (res) => {
-					this.formData.images = [...this.formData.images, ...res.tempFilePaths];
+				success: async (res) => {
+					const paths = res.tempFilePaths;
+					this.uploading = true;
+					try {
+						for (const path of paths) {
+							const preview = path;
+							const placeholderIndex = this.formData.images.length;
+							this.formData.images.push(preview);
+							this.imageOssMap.push(null);
+							try {
+								const uploadRes = await uploadFile(path);
+								this.formData.images.splice(placeholderIndex, 1, uploadRes.url);
+								this.imageOssMap.splice(placeholderIndex, 1, uploadRes.ossId);
+							} catch (err) {
+								this.formData.images.splice(placeholderIndex, 1);
+								this.imageOssMap.splice(placeholderIndex, 1);
+								uni.showToast({ title: '图片上传失败', icon: 'none' });
+							}
+						}
+					} finally {
+						this.uploading = false;
+					}
 				}
 			});
 		},
 		removeImage(index) {
 			this.formData.images.splice(index, 1);
+			this.imageOssMap.splice(index, 1);
 		},
 		previewImage(index) {
 			uni.previewImage({
@@ -97,15 +138,23 @@ export default {
 				current: index
 			});
 		},
-		handleSubmit() {
-			uni.showLoading({ title: '提交中' });
-			setTimeout(() => {
+		async handleSubmit() {
+			if (!this.isFormValid) return;
+			try {
+				uni.showLoading({ title: '提交中' });
+				const payload = {
+					feedbackType: this.formData.type,
+					content: this.formData.content,
+					images: this.imageOssMap.filter(id => id !== null).join(',')
+				};
+				await submitComplaint(payload);
+				uni.hideLoading();
+				uni.showToast({ title: '反馈成功', icon: 'success' });
+				setTimeout(() => { uni.navigateBack(); }, 1500);
+			} catch (e) {
 				uni.hideLoading();
-				uni.showToast({ title: '反馈成功' });
-				setTimeout(() => {
-					uni.navigateBack();
-				}, 1500);
-			}, 1000);
+				uni.showToast({ title: e.message || '提交失败', icon: 'none' });
+			}
 		}
 	}
 }

+ 30 - 8
pages/mine/index.vue

@@ -12,15 +12,17 @@
 				<!-- 1. 登录状态卡片 -->
 				<view class="user-card" v-if="isLogin">
 					<view class="avatar-box">
-						<image class="avatar-img" src="https://img.icons8.com/color/144/user.png" mode="aspectFill">
+						<image class="avatar-img"
+							:src="customerInfo && customerInfo.avatarUrl ? customerInfo.avatarUrl : 'https://img.icons8.com/color/144/user.png'"
+							mode="aspectFill">
 						</image>
 					</view>
 					<view class="info-box">
-						<text class="nickname">张经理</text>
-						<view class="tags-row">
-							<text class="customer-tag">授权客户: 广东铝材实业</text>
+						<text class="nickname">{{ customerInfo ? customerInfo.userName : '' }}</text>
+						<view class="tags-row" v-if="customerInfo">
+							<text class="customer-tag">授权客户: {{ customerInfo.authClientName || '无' }}</text>
 						</view>
-						<text class="phone-text">138-8888-8888</text>
+						<text class="phone-text">{{ customerInfo ? customerInfo.phone : '' }}</text>
 					</view>
 					<!-- 新增:右侧设置图标 -->
 					<view class="settings-btn" @click="goToSettings">
@@ -88,13 +90,16 @@
 import ErpTabBar from '@/components/erp-tab-bar.vue';
 import ErpNavBar from '@/components/erp-nav-bar.vue';
 import assets from '@/utils/assets.js';
+import { getMyInfo } from '@/api/system/customer.js';
+import { logout } from '@/api/auth/index.js';
 
 export default {
 	components: { ErpTabBar, ErpNavBar },
 	data() {
 		return {
 			assets,
-			isLogin: false, // 控制登录状态
+			isLogin: false,
+			customerInfo: null,
 			orderStates: [
 				{ label: '待审核', icon: assets.minePendingReview },
 				{ label: '待签批', icon: assets.minePendingSign },
@@ -110,10 +115,20 @@ export default {
 		}
 	},
 	onShow() {
-		// 页面显示时检查登录状态
 		this.isLogin = !!uni.getStorageSync('isLogin');
+		if (this.isLogin) {
+			this.loadCustomerInfo();
+		}
 	},
 	methods: {
+		async loadCustomerInfo() {
+			try {
+				const res = await getMyInfo();
+				this.customerInfo = res.data;
+			} catch (e) {
+				console.error('[mine] 加载客户信息失败', e);
+			}
+		},
 		goToLogin() {
 			uni.reLaunch({ url: '/pages/login/index' });
 		},
@@ -139,10 +154,17 @@ export default {
 				title: '退出提示',
 				content: '确认退出当前账号吗?',
 				confirmColor: '#C1001C',
-				success: (res) => {
+				success: async (res) => {
 					if (res.confirm) {
+						try {
+							await logout();
+						} catch (e) {
+							console.error('[mine] 退出登录接口失败', e);
+						}
+						uni.removeStorageSync('token');
 						uni.removeStorageSync('isLogin');
 						this.isLogin = false;
+						uni.reLaunch({ url: '/pages/login/index' });
 					}
 				}
 			});

+ 114 - 24
pages/mine/settings/index.vue

@@ -2,12 +2,18 @@
 	<view class="settings-root">
 		<erp-nav-bar title="个人资料设置" />
 
-		<!-- 2. 资料列表 -->
+		<!-- 资料列表 -->
 		<view class="settings-list" :style="{ marginTop: '10px' }">
 			<view class="item-row avatar-row" @click="doChooseImage">
 				<text class="item-label">头像</text>
 				<view class="item-right">
-					<image class="avatar-img" :src="myInfo.avatarUrl" mode="aspectFill"></image>
+					<view class="avatar-wrapper">
+						<image class="avatar-img" :src="myInfo.avatarUrl || 'https://img.icons8.com/color/144/user.png'"
+							mode="aspectFill"></image>
+						<view class="avatar-uploading" v-if="uploading">
+							<text class="uploading-text">上传中...</text>
+						</view>
+					</view>
 					<text class="icon-more"></text>
 				</view>
 			</view>
@@ -15,7 +21,7 @@
 			<view class="item-row" @click="doEditName">
 				<text class="item-label">用户昵称</text>
 				<view class="item-right">
-					<text class="item-value">{{ myInfo.nickName }}</text>
+					<text class="item-value">{{ myInfo.userName }}</text>
 					<text class="icon-more"></text>
 				</view>
 			</view>
@@ -25,68 +31,128 @@
 			<view class="item-row no-tap">
 				<text class="item-label">手机号码</text>
 				<view class="item-right">
-					<text class="item-value readonly">{{ myInfo.phoneNum }}</text>
+					<text class="item-value readonly">{{ myInfo.phone }}</text>
 				</view>
 			</view>
 			<view class="item-row no-tap">
 				<text class="item-label">授权客户</text>
 				<view class="item-right">
-					<text class="item-value readonly">{{ myInfo.orgName }}</text>
+					<text class="item-value readonly">{{ myInfo.authClientName || myInfo.authClientFNum || '无' }}</text>
 				</view>
 			</view>
 		</view>
 
 		<view class="footer-bar">
-			<button class="btn-confirm" @click="saveProfile">确认保存</button>
+			<button class="btn-confirm" @click="saveProfile" :disabled="uploading">确认保存</button>
 		</view>
 	</view>
 </template>
 
 <script>
 import ErpNavBar from '@/components/erp-nav-bar.vue';
+import { getMyInfo, updateMyInfo } from '@/api/system/customer.js';
+import { uploadFile } from '@/api/resource/oss.js';
 export default {
 	components: { ErpNavBar },
 	data() {
 		return {
+			uploading: false,
+			pendingAvatarOssId: null,
 			myInfo: {
-				avatarUrl: 'https://img.icons8.com/clouds/200/manager.png',
-				nickName: '张经理',
-				phoneNum: '138-8888-8888',
-				orgName: '广东粤铝材实业有限公司'
+				avatarUrl: '',
+				userName: '',
+				phone: '',
+				avatar: null,
+				authClientFNum: '',
+				authClientName: ''
 			}
 		}
 	},
+	async onLoad() {
+		await this.loadInfo();
+	},
 	methods: {
-		goBack() { uni.navigateBack(); },
+		async loadInfo() {
+			try {
+				uni.showLoading({ title: '加载中' });
+				const res = await getMyInfo();
+				uni.hideLoading();
+				const d = res.data;
+				this.myInfo = {
+					avatarUrl: d.avatarUrl || '',
+					userName: d.userName || '',
+					phone: d.phone || '',
+					avatar: d.avatar || null,
+					authClientFNum: d.authClientFNum || '',
+					authClientName: d.authClientName || ''
+				};
+				this.pendingAvatarOssId = null;
+			} catch (e) {
+				uni.hideLoading();
+				uni.showToast({ title: '加载失败', icon: 'none' });
+			}
+		},
 		doChooseImage() {
 			uni.chooseImage({
 				count: 1,
-				success: (res) => {
-					this.myInfo.avatarUrl = res.tempFilePaths[0];
-					uni.showToast({ title: '头像已选好', icon: 'none' });
+				sizeType: ['compressed'],
+				sourceType: ['album', 'camera'],
+				success: async (res) => {
+					const tempPath = res.tempFilePaths[0];
+					this.myInfo.avatarUrl = tempPath;
+					this.uploading = true;
+					try {
+						const uploadRes = await uploadFile(tempPath);
+						this.pendingAvatarOssId = uploadRes.ossId;
+						uni.showToast({ title: '头像上传成功', icon: 'success' });
+					} catch (e) {
+						uni.showToast({ title: '头像上传失败', icon: 'none' });
+						this.myInfo.avatarUrl = '';
+					} finally {
+						this.uploading = false;
+					}
 				}
 			});
 		},
 		doEditName() {
 			uni.showModal({
 				title: '设置昵称',
-				content: this.myInfo.nickName,
+				content: this.myInfo.userName,
 				editable: true,
-				confirmColor: '#C1001C', // 重点修复点:弹窗确认按钮强制采用主题红
+				confirmColor: '#C1001C',
 				success: (res) => {
 					if (res.confirm) {
-						this.myInfo.nickName = res.content || '未命名';
+						this.myInfo.userName = res.content || this.myInfo.userName;
 					}
 				}
 			});
 		},
 		saveProfile() {
-			uni.showLoading({ title: '保存中' });
-			setTimeout(() => {
-				uni.hideLoading();
-				uni.showToast({ title: '保存成功' });
-				setTimeout(() => { uni.navigateBack(); }, 1200);
-			}, 600);
+			if (this.uploading) return;
+			uni.showModal({
+				title: '确认保存',
+				content: `昵称:${this.myInfo.userName}\n手机:${this.myInfo.phone}\n请确认以上信息是否填写正确?`,
+				confirmText: '确认',
+				cancelText: '取消',
+				confirmColor: '#C1001C',
+				success: async (res) => {
+					if (!res.confirm) return;
+					try {
+						uni.showLoading({ title: '保存中' });
+						const payload = { userName: this.myInfo.userName };
+						if (this.pendingAvatarOssId !== null) {
+							payload.avatar = this.pendingAvatarOssId;
+						}
+						await updateMyInfo(payload);
+						uni.hideLoading();
+						uni.showToast({ title: '保存成功', icon: 'success' });
+						setTimeout(() => { uni.navigateBack(); }, 1200);
+					} catch (e) {
+						uni.hideLoading();
+						uni.showToast({ title: e.message || '保存失败', icon: 'none' });
+					}
+				}
+			});
 		}
 	}
 }
@@ -136,12 +202,36 @@ export default {
 	align-items: center;
 }
 
+.avatar-wrapper {
+	position: relative;
+	width: 110rpx;
+	height: 110rpx;
+	margin-right: 20rpx;
+}
+
 .avatar-img {
 	width: 110rpx;
 	height: 110rpx;
 	border-radius: 50%;
 	background: #eee;
-	margin-right: 20rpx;
+}
+
+.avatar-uploading {
+	position: absolute;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	border-radius: 50%;
+	background: rgba(0, 0, 0, 0.45);
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+
+.uploading-text {
+	font-size: 20rpx;
+	color: #fff;
 }
 
 .item-value {

+ 45 - 5
pages/order/index.vue

@@ -1,19 +1,29 @@
 <template>
 	<view class="order-container">
 		<erp-nav-bar title="ERP 下单" :show-back="false" />
-		<!-- 1. 待管理员授权状态 -->
-		<view class="auth-waiting-full" v-if="!isAuthorized">
+		<!-- 1. 未登录状态 -->
+		<view class="auth-waiting-full" v-if="!isLoggedIn">
+			<view class="auth-card">
+				<image class="auth-icon" src="https://img.icons8.com/color/192/hourglass-sand-top.png" mode="aspectFit">
+				</image>
+				<text class="auth-title">未登录</text>
+				<text class="auth-desc">您还未登录账号,请先登录以后在进行下单操作</text>
+				<button class="contact-btn" @click="goToLogin">前往登录</button>
+			</view>
+		</view>
+
+		<!-- 2. 已登录但未分配授权客户 -->
+		<view class="auth-waiting-full" v-else-if="authorizedClients.length === 0">
 			<view class="auth-card">
 				<image class="auth-icon" src="https://img.icons8.com/color/192/hourglass-sand-top.png" mode="aspectFit">
 				</image>
 				<text class="auth-title">待管理员授权</text>
 				<text class="auth-desc">您的账户尚未获得下单权限,请联系管理员核准授权后即可进行下单操作。</text>
 				<button class="contact-btn" @click="contactAdmin">联系管理员</button>
-				<button class="authorized-btn" @click="isAuthorized = true">我已授权</button>
 			</view>
 		</view>
 
-		<!-- 2. 已授权状态:已选型号列表 (参考草图2) -->
+		<!-- 3. 已登录且已分配授权客户:显示下单页面 -->
 		<template v-else>
 			<scroll-view scroll-y class="order-scroll-list" :show-scrollbar="false" :enhanced="true">
 				<view class="list-wrapper">
@@ -83,11 +93,13 @@
 <script>
 import ErpTabBar from '@/components/erp-tab-bar.vue';
 import ErpNavBar from '@/components/erp-nav-bar.vue';
+import { getMyInfo } from '@/api/system/customer.js';
 export default {
 	components: { ErpNavBar, ErpTabBar },
 	data() {
 		return {
-			isAuthorized: false,
+			isLoggedIn: false,
+			authorizedClients: [],
 			selectedModels: []
 		}
 	},
@@ -110,11 +122,39 @@ export default {
 			}
 		});
 	},
+	onShow() {
+		this.checkLoginStatus();
+	},
 	onUnload() {
 		uni.$off('add_order_item');
 		uni.$off('update_order_item');
 	},
 	methods: {
+		async checkLoginStatus() {
+			const token = uni.getStorageSync('token');
+			if (!token) {
+				this.isLoggedIn = false;
+				this.authorizedClients = [];
+				return;
+			}
+			try {
+				await getMyInfo();
+				this.isLoggedIn = true;
+				this.loadAuthorizedClients();
+			} catch (e) {
+				uni.removeStorageSync('token');
+				uni.removeStorageSync('isLogin');
+				this.isLoggedIn = false;
+				this.authorizedClients = [];
+			}
+		},
+		loadAuthorizedClients() {
+			const clients = uni.getStorageSync('authorizedClients');
+			this.authorizedClients = clients || [];
+		},
+		goToLogin() {
+			uni.reLaunch({ url: '/pages/login/index' });
+		},
 		contactAdmin() { uni.showModal({ title: '联系管理员', content: '管理员电话:138-0000-0000', showCancel: false, confirmColor: '#C1001C' }); },
 		goToAddModel() {
 			uni.navigateTo({

+ 1 - 1
unpackage/dist/dev/.sourcemap/mp-weixin/api/auth/index.js.map

@@ -1 +1 @@
-{"version":3,"file":"index.js","sources":["api/auth/index.js"],"sourcesContent":["import request from '@/utils/request';\n\nexport function wechatLogin(data) {\n  return request({\n    url: '/auth/login',\n    method: 'post',\n    data: {\n      ...data,\n      clientId: 'e48ac397bff4f031b14d6e671eee49c3',\n      grantType: 'wechatApplet'\n    }\n  });\n}\n\nexport function getWechatPhone(data) {\n  return request({\n    url: '/auth/wechat/phone',\n    method: 'post',\n    data\n  });\n}\n\nexport function wechatRegister(data) {\n  return request({\n    url: '/auth/wechat/register',\n    method: 'post',\n    data\n  });\n}\n"],"names":["request"],"mappings":";;AAEO,SAAS,YAAY,MAAM;AAChC,SAAOA,sBAAQ;AAAA,IACb,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,MACJ,GAAG;AAAA,MACH,UAAU;AAAA,MACV,WAAW;AAAA,IACZ;AAAA,EACL,CAAG;AACH;AAEO,SAAS,eAAe,MAAM;AACnC,SAAOA,sBAAQ;AAAA,IACb,KAAK;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,EACJ,CAAG;AACH;AAEO,SAAS,eAAe,MAAM;AACnC,SAAOA,sBAAQ;AAAA,IACb,KAAK;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,EACJ,CAAG;AACH;;;;"}
+{"version":3,"file":"index.js","sources":["api/auth/index.js"],"sourcesContent":["import request from '@/utils/request';\n\nexport function wechatLogin(data) {\n  return request({\n    url: '/auth/login',\n    method: 'post',\n    data: {\n      ...data,\n      clientId: 'e48ac397bff4f031b14d6e671eee49c3',\n      grantType: 'wechatApplet'\n    }\n  });\n}\n\nexport function getWechatPhone(data) {\n  return request({\n    url: '/auth/wechat/phone',\n    method: 'post',\n    data\n  });\n}\n\nexport function wechatRegister(data) {\n  return request({\n    url: '/auth/wechat/register',\n    method: 'post',\n    data\n  });\n}\n\nexport function logout() {\n  return request({\n    url: '/auth/logout',\n    method: 'post'\n  });\n}\n"],"names":["request"],"mappings":";;AAEO,SAAS,YAAY,MAAM;AAChC,SAAOA,sBAAQ;AAAA,IACb,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,MACJ,GAAG;AAAA,MACH,UAAU;AAAA,MACV,WAAW;AAAA,IACZ;AAAA,EACL,CAAG;AACH;AAEO,SAAS,eAAe,MAAM;AACnC,SAAOA,sBAAQ;AAAA,IACb,KAAK;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,EACJ,CAAG;AACH;AAEO,SAAS,eAAe,MAAM;AACnC,SAAOA,sBAAQ;AAAA,IACb,KAAK;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,EACJ,CAAG;AACH;AAEO,SAAS,SAAS;AACvB,SAAOA,sBAAQ;AAAA,IACb,KAAK;AAAA,IACL,QAAQ;AAAA,EACZ,CAAG;AACH;;;;;"}

+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/api/resource/oss.js.map

@@ -0,0 +1 @@
+{"version":3,"file":"oss.js","sources":["api/resource/oss.js"],"sourcesContent":["import request from '@/utils/request';\n\nconst BASE_URL = 'http://127.0.0.1:8080';\nconst CLIENT_ID = 'e48ac397bff4f031b14d6e671eee49c3';\n\n/**\n * 上传文件至OSS\n * @param {string} filePath 本地临时文件路径\n * @returns {Promise} 解析结果含 { ossId, url, fileName }\n */\nexport function uploadFile(filePath) {\n\treturn new Promise((resolve, reject) => {\n\t\tconst token = uni.getStorageSync('token') || '';\n\t\tuni.uploadFile({\n\t\t\turl: BASE_URL + '/resource/oss/upload',\n\t\t\tfilePath,\n\t\t\tname: 'file',\n\t\t\theader: {\n\t\t\t\tclientid: CLIENT_ID,\n\t\t\t\tAuthorization: 'Bearer ' + token\n\t\t\t},\n\t\t\tsuccess(res) {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = JSON.parse(res.data);\n\t\t\t\t\tif (result.code === 200) {\n\t\t\t\t\t\tresolve(result.data);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treject(new Error(result.msg || '上传失败'));\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\treject(new Error('响应解析失败'));\n\t\t\t\t}\n\t\t\t},\n\t\t\tfail(err) {\n\t\t\t\treject(new Error(err.errMsg || '上传失败'));\n\t\t\t}\n\t\t});\n\t});\n}\n"],"names":["uni"],"mappings":";;AAEA,MAAM,WAAW;AACjB,MAAM,YAAY;AAOX,SAAS,WAAW,UAAU;AACpC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACvC,UAAM,QAAQA,cAAG,MAAC,eAAe,OAAO,KAAK;AAC7CA,kBAAAA,MAAI,WAAW;AAAA,MACd,KAAK,WAAW;AAAA,MAChB;AAAA,MACA,MAAM;AAAA,MACN,QAAQ;AAAA,QACP,UAAU;AAAA,QACV,eAAe,YAAY;AAAA,MAC3B;AAAA,MACD,QAAQ,KAAK;AACZ,YAAI;AACH,gBAAM,SAAS,KAAK,MAAM,IAAI,IAAI;AAClC,cAAI,OAAO,SAAS,KAAK;AACxB,oBAAQ,OAAO,IAAI;AAAA,UACzB,OAAY;AACN,mBAAO,IAAI,MAAM,OAAO,OAAO,MAAM,CAAC;AAAA,UACtC;AAAA,QACD,SAAQ,GAAG;AACX,iBAAO,IAAI,MAAM,QAAQ,CAAC;AAAA,QAC1B;AAAA,MACD;AAAA,MACD,KAAK,KAAK;AACT,eAAO,IAAI,MAAM,IAAI,UAAU,MAAM,CAAC;AAAA,MACtC;AAAA,IACJ,CAAG;AAAA,EACH,CAAE;AACF;;"}

+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/api/system/complaint.js.map

@@ -0,0 +1 @@
+{"version":3,"file":"complaint.js","sources":["api/system/complaint.js"],"sourcesContent":["import request from '@/utils/request';\n\n/**\n * 提交投诉建议\n */\nexport function submitComplaint(data) {\n\treturn request({ url: '/system/complaint', method: 'POST', data });\n}\n"],"names":["request"],"mappings":";;AAKO,SAAS,gBAAgB,MAAM;AACrC,SAAOA,cAAAA,QAAQ,EAAE,KAAK,qBAAqB,QAAQ,QAAQ,KAAI,CAAE;AAClE;;"}

+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/api/system/customer.js.map

@@ -0,0 +1 @@
+{"version":3,"file":"customer.js","sources":["api/system/customer.js"],"sourcesContent":["import request from '@/utils/request';\n\n/**\n * 获取当前登录客户信息\n */\nexport function getMyInfo() {\n\treturn request({ url: '/system/customer/getInfo', method: 'GET' });\n}\n\n/**\n * 更新当前登录客户信息\n */\nexport function updateMyInfo(data) {\n\treturn request({ url: '/system/customer/updateProfile', method: 'PUT', data });\n}\n"],"names":["request"],"mappings":";;AAKO,SAAS,YAAY;AAC3B,SAAOA,cAAAA,QAAQ,EAAE,KAAK,4BAA4B,QAAQ,MAAK,CAAE;AAClE;AAKO,SAAS,aAAa,MAAM;AAClC,SAAOA,cAAAA,QAAQ,EAAE,KAAK,kCAAkC,QAAQ,OAAO,KAAI,CAAE;AAC9E;;;"}

+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/api/system/dict.js.map

@@ -0,0 +1 @@
+{"version":3,"file":"dict.js","sources":["api/system/dict.js"],"sourcesContent":["import request from '@/utils/request';\n\n/**\n * 根据字典类型获取字典数据\n */\nexport function getDictByType(dictType) {\n\treturn request({ url: '/system/dict/data/type/' + dictType, method: 'GET' });\n}\n"],"names":["request"],"mappings":";;AAKO,SAAS,cAAc,UAAU;AACvC,SAAOA,cAAAA,QAAQ,EAAE,KAAK,4BAA4B,UAAU,QAAQ,MAAK,CAAE;AAC5E;;"}

+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/api/system/resource/oss.js.map

@@ -0,0 +1 @@
+{"version":3,"file":"oss.js","sources":["api/system/resource/oss.js"],"sourcesContent":["import request from '@/utils/request';\n\nconst BASE_URL = 'http://127.0.0.1:8080';\nconst CLIENT_ID = 'e48ac397bff4f031b14d6e671eee49c3';\n\n/**\n * 上传文件至OSS\n * @param {string} filePath 本地临时文件路径\n * @returns {Promise} 解析结果含 { ossId, url, fileName }\n */\nexport function uploadFile(filePath) {\n\treturn new Promise((resolve, reject) => {\n\t\tconst token = uni.getStorageSync('token') || '';\n\t\tuni.uploadFile({\n\t\t\turl: BASE_URL + '/resource/oss/upload',\n\t\t\tfilePath,\n\t\t\tname: 'file',\n\t\t\theader: {\n\t\t\t\tclientid: CLIENT_ID,\n\t\t\t\t...(token ? { Authorization: 'Bearer ' + token } : {})\n\t\t\t},\n\t\t\tsuccess(res) {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = JSON.parse(res.data);\n\t\t\t\t\tif (result.code === 200) {\n\t\t\t\t\t\tresolve(result.data);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treject(new Error(result.msg || '上传失败'));\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\treject(new Error('响应解析失败'));\n\t\t\t\t}\n\t\t\t},\n\t\t\tfail(err) {\n\t\t\t\treject(new Error(err.errMsg || '上传失败'));\n\t\t\t}\n\t\t});\n\t});\n}\n"],"names":["uni"],"mappings":";;AAEA,MAAM,WAAW;AACjB,MAAM,YAAY;AAOX,SAAS,WAAW,UAAU;AACpC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACvC,UAAM,QAAQA,cAAG,MAAC,eAAe,OAAO,KAAK;AAC7CA,kBAAAA,MAAI,WAAW;AAAA,MACd,KAAK,WAAW;AAAA,MAChB;AAAA,MACA,MAAM;AAAA,MACN,QAAQ;AAAA,QACP,UAAU;AAAA,QACV,GAAI,QAAQ,EAAE,eAAe,YAAY,MAAO,IAAG,CAAE;AAAA,MACrD;AAAA,MACD,QAAQ,KAAK;AACZ,YAAI;AACH,gBAAM,SAAS,KAAK,MAAM,IAAI,IAAI;AAClC,cAAI,OAAO,SAAS,KAAK;AACxB,oBAAQ,OAAO,IAAI;AAAA,UACzB,OAAY;AACN,mBAAO,IAAI,MAAM,OAAO,OAAO,MAAM,CAAC;AAAA,UACtC;AAAA,QACD,SAAQ,GAAG;AACX,iBAAO,IAAI,MAAM,QAAQ,CAAC;AAAA,QAC1B;AAAA,MACD;AAAA,MACD,KAAK,KAAK;AACT,eAAO,IAAI,MAAM,IAAI,UAAU,MAAM,CAAC;AAAA,MACtC;AAAA,IACJ,CAAG;AAAA,EACH,CAAE;AACF;;"}

Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/login/index.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/complaint/index.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/index.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/settings/index.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/order/index.js.map


Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/utils/request.js.map


+ 7 - 0
unpackage/dist/dev/mp-weixin/api/auth/index.js

@@ -25,7 +25,14 @@ function wechatRegister(data) {
     data
   });
 }
+function logout() {
+  return utils_request.request({
+    url: "/auth/logout",
+    method: "post"
+  });
+}
 exports.getWechatPhone = getWechatPhone;
+exports.logout = logout;
 exports.wechatLogin = wechatLogin;
 exports.wechatRegister = wechatRegister;
 //# sourceMappingURL=../../../.sourcemap/mp-weixin/api/auth/index.js.map

+ 35 - 0
unpackage/dist/dev/mp-weixin/api/resource/oss.js

@@ -0,0 +1,35 @@
+"use strict";
+const common_vendor = require("../../common/vendor.js");
+const BASE_URL = "http://127.0.0.1:8080";
+const CLIENT_ID = "e48ac397bff4f031b14d6e671eee49c3";
+function uploadFile(filePath) {
+  return new Promise((resolve, reject) => {
+    const token = common_vendor.index.getStorageSync("token") || "";
+    common_vendor.index.uploadFile({
+      url: BASE_URL + "/resource/oss/upload",
+      filePath,
+      name: "file",
+      header: {
+        clientid: CLIENT_ID,
+        Authorization: "Bearer " + token
+      },
+      success(res) {
+        try {
+          const result = JSON.parse(res.data);
+          if (result.code === 200) {
+            resolve(result.data);
+          } else {
+            reject(new Error(result.msg || "上传失败"));
+          }
+        } catch (e) {
+          reject(new Error("响应解析失败"));
+        }
+      },
+      fail(err) {
+        reject(new Error(err.errMsg || "上传失败"));
+      }
+    });
+  });
+}
+exports.uploadFile = uploadFile;
+//# sourceMappingURL=../../../.sourcemap/mp-weixin/api/resource/oss.js.map

+ 7 - 0
unpackage/dist/dev/mp-weixin/api/system/complaint.js

@@ -0,0 +1,7 @@
+"use strict";
+const utils_request = require("../../utils/request.js");
+function submitComplaint(data) {
+  return utils_request.request({ url: "/system/complaint", method: "POST", data });
+}
+exports.submitComplaint = submitComplaint;
+//# sourceMappingURL=../../../.sourcemap/mp-weixin/api/system/complaint.js.map

+ 11 - 0
unpackage/dist/dev/mp-weixin/api/system/customer.js

@@ -0,0 +1,11 @@
+"use strict";
+const utils_request = require("../../utils/request.js");
+function getMyInfo() {
+  return utils_request.request({ url: "/system/customer/getInfo", method: "GET" });
+}
+function updateMyInfo(data) {
+  return utils_request.request({ url: "/system/customer/updateProfile", method: "PUT", data });
+}
+exports.getMyInfo = getMyInfo;
+exports.updateMyInfo = updateMyInfo;
+//# sourceMappingURL=../../../.sourcemap/mp-weixin/api/system/customer.js.map

+ 7 - 0
unpackage/dist/dev/mp-weixin/api/system/dict.js

@@ -0,0 +1,7 @@
+"use strict";
+const utils_request = require("../../utils/request.js");
+function getDictByType(dictType) {
+  return utils_request.request({ url: "/system/dict/data/type/" + dictType, method: "GET" });
+}
+exports.getDictByType = getDictByType;
+//# sourceMappingURL=../../../.sourcemap/mp-weixin/api/system/dict.js.map

+ 35 - 0
unpackage/dist/dev/mp-weixin/api/system/resource/oss.js

@@ -0,0 +1,35 @@
+"use strict";
+const common_vendor = require("../../../common/vendor.js");
+const BASE_URL = "http://127.0.0.1:8080";
+const CLIENT_ID = "e48ac397bff4f031b14d6e671eee49c3";
+function uploadFile(filePath) {
+  return new Promise((resolve, reject) => {
+    const token = common_vendor.index.getStorageSync("token") || "";
+    common_vendor.index.uploadFile({
+      url: BASE_URL + "/resource/oss/upload",
+      filePath,
+      name: "file",
+      header: {
+        clientid: CLIENT_ID,
+        ...token ? { Authorization: "Bearer " + token } : {}
+      },
+      success(res) {
+        try {
+          const result = JSON.parse(res.data);
+          if (result.code === 200) {
+            resolve(result.data);
+          } else {
+            reject(new Error(result.msg || "上传失败"));
+          }
+        } catch (e) {
+          reject(new Error("响应解析失败"));
+        }
+      },
+      fail(err) {
+        reject(new Error(err.errMsg || "上传失败"));
+      }
+    });
+  });
+}
+exports.uploadFile = uploadFile;
+//# sourceMappingURL=../../../../.sourcemap/mp-weixin/api/system/resource/oss.js.map

+ 1 - 1
unpackage/dist/dev/mp-weixin/common/vendor.js

@@ -7086,7 +7086,7 @@ function isConsoleWritable() {
 function initRuntimeSocketService() {
   const hosts = "198.18.0.1,10.0.0.254,127.0.0.1,192.168.1.118";
   const port = "8090";
-  const id = "mp-weixin_alL6lY";
+  const id = "mp-weixin_Z_rbjH";
   const lazy = typeof swan !== "undefined";
   let restoreError = lazy ? () => {
   } : initOnError();

+ 37 - 36
unpackage/dist/dev/mp-weixin/pages/login/index.js

@@ -3,13 +3,15 @@ const common_vendor = require("../../common/vendor.js");
 const utils_assets = require("../../utils/assets.js");
 const api_system_agreement = require("../../api/system/agreement.js");
 const api_auth_index = require("../../api/auth/index.js");
+const api_resource_oss = require("../../api/resource/oss.js");
 const _sfc_main = {
   data() {
     return {
       assets: utils_assets.assets,
       isAgreed: false,
       activeModal: "",
-      avatarBase64: "",
+      avatarOssId: null,
+      avatarPreviewUrl: "",
       userName: "微信用户",
       currentProtocol: { title: "", content: "" },
       protocols: {
@@ -51,8 +53,8 @@ const _sfc_main = {
         }
         const res = await api_auth_index.wechatLogin({ loginCode: loginRes.code });
         common_vendor.index.hideLoading();
-        if (res.data && res.data.accessToken) {
-          common_vendor.index.setStorageSync("token", res.data.accessToken);
+        if (res.data && res.data.access_token) {
+          common_vendor.index.setStorageSync("token", res.data.access_token);
           common_vendor.index.setStorageSync("isLogin", true);
           common_vendor.index.showToast({ title: "登录成功", icon: "success" });
           setTimeout(() => {
@@ -67,34 +69,34 @@ const _sfc_main = {
         }
       } catch (error) {
         common_vendor.index.hideLoading();
-        common_vendor.index.__f__("error", "at pages/login/index.vue:196", "登录错误:", error);
+        common_vendor.index.__f__("error", "at pages/login/index.vue:190", "登录错误:", error);
         common_vendor.index.showToast({ title: "登录失败,请重试", icon: "none" });
       }
     },
-    onChooseAvatar(e) {
+    async onChooseAvatar(e) {
       const tempPath = e.detail.avatarUrl;
-      common_vendor.index.__f__("log", "at pages/login/index.vue:202", "[微信信息] 头像临时路径:", tempPath);
-      const fs = common_vendor.index.getFileSystemManager();
-      fs.readFile({
-        filePath: tempPath,
-        encoding: "base64",
-        success: (res) => {
-          common_vendor.index.__f__("log", "at pages/login/index.vue:208", "[微信信息] 头像 base64 长度:", res.data.length);
-          this.avatarBase64 = "data:image/jpeg;base64," + res.data;
-          common_vendor.index.__f__("log", "at pages/login/index.vue:210", "[微信信息] avatarBase64 已赋值,前缀:", this.avatarBase64.substring(0, 30));
-        },
-        fail: (err) => {
-          common_vendor.index.__f__("error", "at pages/login/index.vue:213", "[微信信息] 读取头像 base64 失败:", err);
-        }
-      });
+      common_vendor.index.__f__("log", "at pages/login/index.vue:196", "[微信信息] 头像临时路径:", tempPath);
+      this.avatarPreviewUrl = tempPath;
+      try {
+        common_vendor.index.showLoading({ title: "上传头像..." });
+        const res = await api_resource_oss.uploadFile(tempPath);
+        common_vendor.index.hideLoading();
+        this.avatarOssId = res.ossId;
+        this.avatarPreviewUrl = res.url;
+        common_vendor.index.__f__("log", "at pages/login/index.vue:204", "[微信信息] 头像OSS上传成功, ossId:", this.avatarOssId);
+      } catch (err) {
+        common_vendor.index.hideLoading();
+        common_vendor.index.__f__("error", "at pages/login/index.vue:207", "[微信信息] 头像上传失败:", err);
+        common_vendor.index.showToast({ title: "头像上传失败", icon: "none" });
+      }
     },
     onNicknameBlur(e) {
       this.userName = e.detail.value;
-      common_vendor.index.__f__("log", "at pages/login/index.vue:219", "[微信信息] 昵称(blur):", this.userName);
+      common_vendor.index.__f__("log", "at pages/login/index.vue:213", "[微信信息] 昵称(blur):", this.userName);
     },
     onNicknameChange(e) {
       this.userName = e.detail.value;
-      common_vendor.index.__f__("log", "at pages/login/index.vue:223", "[微信信息] 昵称(input):", this.userName);
+      common_vendor.index.__f__("log", "at pages/login/index.vue:217", "[微信信息] 昵称(input):", this.userName);
     },
     async goToPhoneAuth() {
       this.phoneNumber = "";
@@ -119,13 +121,13 @@ const _sfc_main = {
           unionId: this.unionId,
           phone: this.phoneNumber,
           nickname: this.userName,
-          avatar: this.avatarBase64
+          avatar: this.avatarOssId
         });
         common_vendor.index.hideLoading();
         this.performLogin();
       } catch (error) {
         common_vendor.index.hideLoading();
-        common_vendor.index.__f__("error", "at pages/login/index.vue:262", "注册错误:", error);
+        common_vendor.index.__f__("error", "at pages/login/index.vue:256", "注册错误:", error);
         common_vendor.index.showToast({ title: "注册失败,请重试", icon: "none" });
       }
     },
@@ -146,7 +148,7 @@ const _sfc_main = {
       this.protocols.user = { title: userRes.data.title, content: userRes.data.content };
       this.protocols.privacy = { title: privacyRes.data.title, content: privacyRes.data.content };
     } catch (e) {
-      common_vendor.index.__f__("error", "at pages/login/index.vue:281", "[协议] 加载失败", e);
+      common_vendor.index.__f__("error", "at pages/login/index.vue:275", "[协议] 加载失败", e);
     }
   }
 };
@@ -172,26 +174,25 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
   }, $data.activeModal === "profile" ? {
     n: common_vendor.o(($event) => $data.activeModal = "", "c9"),
     o: common_vendor.o(($event) => $data.activeModal = "phone", "14"),
-    p: $data.avatarBase64 || "https://img.icons8.com/color/144/user.png",
+    p: $data.avatarPreviewUrl || "https://img.icons8.com/color/144/user.png",
     q: common_vendor.o((...args) => $options.onChooseAvatar && $options.onChooseAvatar(...args), "14"),
     r: $data.userName,
-    s: common_vendor.o((...args) => $options.onNicknameBlur && $options.onNicknameBlur(...args), "60"),
-    t: common_vendor.o((...args) => $options.onNicknameChange && $options.onNicknameChange(...args), "df"),
-    v: common_vendor.o((...args) => $options.goToPhoneAuth && $options.goToPhoneAuth(...args), "65")
+    s: common_vendor.o((...args) => $options.onNicknameBlur && $options.onNicknameBlur(...args), "64"),
+    t: common_vendor.o((...args) => $options.onNicknameChange && $options.onNicknameChange(...args), "dc"),
+    v: common_vendor.o((...args) => $options.goToPhoneAuth && $options.goToPhoneAuth(...args), "c4")
   } : {}, {
     w: $data.activeModal === "phone"
   }, $data.activeModal === "phone" ? {
     x: $data.assets.logo,
-    y: common_vendor.t($data.phoneNumber || "获取中..."),
-    z: common_vendor.o(($event) => $data.activeModal = "", "8c"),
-    A: common_vendor.o((...args) => $options.handleGetPhoneNumber && $options.handleGetPhoneNumber(...args), "f8")
+    y: common_vendor.o(($event) => $data.activeModal = "", "9a"),
+    z: common_vendor.o((...args) => $options.handleGetPhoneNumber && $options.handleGetPhoneNumber(...args), "c5")
   } : {}, {
-    B: $data.activeModal === "protocol"
+    A: $data.activeModal === "protocol"
   }, $data.activeModal === "protocol" ? {
-    C: common_vendor.t($data.currentProtocol.title),
-    D: common_vendor.o(($event) => $data.activeModal = "", "d4"),
-    E: $data.currentProtocol.content,
-    F: common_vendor.o(($event) => $data.activeModal = "", "7e")
+    B: common_vendor.t($data.currentProtocol.title),
+    C: common_vendor.o(($event) => $data.activeModal = "", "4d"),
+    D: $data.currentProtocol.content,
+    E: common_vendor.o(($event) => $data.activeModal = "", "4e")
   } : {});
 }
 const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-d08ef7d4"]]);

Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages/login/index.wxml


+ 7 - 0
unpackage/dist/dev/mp-weixin/pages/login/index.wxss

@@ -354,6 +354,13 @@ button.data-v-d08ef7d4::after {
 	margin-bottom: 44rpx;
 	display: block;
 }
+.p-phone-hint.data-v-d08ef7d4 {
+	font-size: 30rpx;
+	color: #666;
+	line-height: 1.5;
+	display: block;
+	margin-bottom: 60rpx;
+}
 .p-number-card.data-v-d08ef7d4 {
 	background: #fbfbfb;
 	padding: 36rpx;

+ 67 - 14
unpackage/dist/dev/mp-weixin/pages/mine/complaint/index.js

@@ -1,17 +1,18 @@
 "use strict";
 const common_vendor = require("../../../common/vendor.js");
+const api_system_complaint = require("../../../api/system/complaint.js");
+const api_system_dict = require("../../../api/system/dict.js");
+const api_resource_oss = require("../../../api/resource/oss.js");
 const ErpNavBar = () => "../../../components/erp-nav-bar.js";
 const _sfc_main = {
   components: { ErpNavBar },
   data() {
     return {
-      types: [
-        { label: "系统投诉", value: "complaint" },
-        { label: "改进建议", value: "suggestion" },
-        { label: "其他反馈", value: "other" }
-      ],
+      types: [],
+      uploading: false,
+      imageOssMap: [],
       formData: {
-        type: "complaint",
+        type: "",
         content: "",
         images: []
       }
@@ -19,10 +20,30 @@ const _sfc_main = {
   },
   computed: {
     isFormValid() {
-      return this.formData.content && this.formData.content.trim().length >= 5;
+      return !this.uploading && this.formData.type && this.formData.content && this.formData.content.trim().length >= 5;
     }
   },
+  onLoad() {
+    this.loadTypes();
+  },
   methods: {
+    async loadTypes() {
+      try {
+        const res = await api_system_dict.getDictByType("sys_complaint_type");
+        if (res && res.data) {
+          this.types = res.data.map((d) => ({ label: d.dictLabel, value: d.dictValue }));
+          if (this.types.length)
+            this.formData.type = this.types[0].value;
+        }
+      } catch (e) {
+        this.types = [
+          { label: "系统投诉", value: "complaint" },
+          { label: "改进建议", value: "suggestion" },
+          { label: "其他反馈", value: "other" }
+        ];
+        this.formData.type = "complaint";
+      }
+    },
     goBack() {
       common_vendor.index.navigateBack();
     },
@@ -31,13 +52,34 @@ const _sfc_main = {
       common_vendor.index.chooseImage({
         count,
         sizeType: ["compressed"],
-        success: (res) => {
-          this.formData.images = [...this.formData.images, ...res.tempFilePaths];
+        success: async (res) => {
+          const paths = res.tempFilePaths;
+          this.uploading = true;
+          try {
+            for (const path of paths) {
+              const preview = path;
+              const placeholderIndex = this.formData.images.length;
+              this.formData.images.push(preview);
+              this.imageOssMap.push(null);
+              try {
+                const uploadRes = await api_resource_oss.uploadFile(path);
+                this.formData.images.splice(placeholderIndex, 1, uploadRes.url);
+                this.imageOssMap.splice(placeholderIndex, 1, uploadRes.ossId);
+              } catch (err) {
+                this.formData.images.splice(placeholderIndex, 1);
+                this.imageOssMap.splice(placeholderIndex, 1);
+                common_vendor.index.showToast({ title: "图片上传失败", icon: "none" });
+              }
+            }
+          } finally {
+            this.uploading = false;
+          }
         }
       });
     },
     removeImage(index) {
       this.formData.images.splice(index, 1);
+      this.imageOssMap.splice(index, 1);
     },
     previewImage(index) {
       common_vendor.index.previewImage({
@@ -45,15 +87,26 @@ const _sfc_main = {
         current: index
       });
     },
-    handleSubmit() {
-      common_vendor.index.showLoading({ title: "提交中" });
-      setTimeout(() => {
+    async handleSubmit() {
+      if (!this.isFormValid)
+        return;
+      try {
+        common_vendor.index.showLoading({ title: "提交中" });
+        const payload = {
+          feedbackType: this.formData.type,
+          content: this.formData.content,
+          images: this.imageOssMap.filter((id) => id !== null).join(",")
+        };
+        await api_system_complaint.submitComplaint(payload);
         common_vendor.index.hideLoading();
-        common_vendor.index.showToast({ title: "反馈成功" });
+        common_vendor.index.showToast({ title: "反馈成功", icon: "success" });
         setTimeout(() => {
           common_vendor.index.navigateBack();
         }, 1500);
-      }, 1e3);
+      } catch (e) {
+        common_vendor.index.hideLoading();
+        common_vendor.index.showToast({ title: e.message || "提交失败", icon: "none" });
+      }
     }
   }
 };

+ 43 - 16
unpackage/dist/dev/mp-weixin/pages/mine/index.js

@@ -1,6 +1,8 @@
 "use strict";
 const common_vendor = require("../../common/vendor.js");
 const utils_assets = require("../../utils/assets.js");
+const api_system_customer = require("../../api/system/customer.js");
+const api_auth_index = require("../../api/auth/index.js");
 const ErpTabBar = () => "../../components/erp-tab-bar.js";
 const ErpNavBar = () => "../../components/erp-nav-bar.js";
 const _sfc_main = {
@@ -9,7 +11,7 @@ const _sfc_main = {
     return {
       assets: utils_assets.assets,
       isLogin: false,
-      // 控制登录状态
+      customerInfo: null,
       orderStates: [
         { label: "待审核", icon: utils_assets.assets.minePendingReview },
         { label: "待签批", icon: utils_assets.assets.minePendingSign },
@@ -26,8 +28,19 @@ const _sfc_main = {
   },
   onShow() {
     this.isLogin = !!common_vendor.index.getStorageSync("isLogin");
+    if (this.isLogin) {
+      this.loadCustomerInfo();
+    }
   },
   methods: {
+    async loadCustomerInfo() {
+      try {
+        const res = await api_system_customer.getMyInfo();
+        this.customerInfo = res.data;
+      } catch (e) {
+        common_vendor.index.__f__("error", "at pages/mine/index.vue:129", "[mine] 加载客户信息失败", e);
+      }
+    },
     goToLogin() {
       common_vendor.index.reLaunch({ url: "/pages/login/index" });
     },
@@ -53,10 +66,17 @@ const _sfc_main = {
         title: "退出提示",
         content: "确认退出当前账号吗?",
         confirmColor: "#C1001C",
-        success: (res) => {
+        success: async (res) => {
           if (res.confirm) {
+            try {
+              await api_auth_index.logout();
+            } catch (e) {
+              common_vendor.index.__f__("error", "at pages/mine/index.vue:162", "[mine] 退出登录接口失败", e);
+            }
+            common_vendor.index.removeStorageSync("token");
             common_vendor.index.removeStorageSync("isLogin");
             this.isLogin = false;
+            common_vendor.index.reLaunch({ url: "/pages/login/index" });
           }
         }
       });
@@ -102,16 +122,23 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
       ["title-color"]: "#ffffff"
     }),
     b: $data.isLogin
-  }, $data.isLogin ? {
-    c: $data.assets.mineSettings,
-    d: common_vendor.o((...args) => $options.goToSettings && $options.goToSettings(...args), "ee")
-  } : {
-    e: $data.assets.mineArrow,
-    f: common_vendor.o((...args) => $options.goToLogin && $options.goToLogin(...args), "17")
+  }, $data.isLogin ? common_vendor.e({
+    c: $data.customerInfo && $data.customerInfo.avatarUrl ? $data.customerInfo.avatarUrl : "https://img.icons8.com/color/144/user.png",
+    d: common_vendor.t($data.customerInfo ? $data.customerInfo.userName : ""),
+    e: $data.customerInfo
+  }, $data.customerInfo ? {
+    f: common_vendor.t($data.customerInfo.authCustomerId || "无")
+  } : {}, {
+    g: common_vendor.t($data.customerInfo ? $data.customerInfo.phone : ""),
+    h: $data.assets.mineSettings,
+    i: common_vendor.o((...args) => $options.goToSettings && $options.goToSettings(...args), "0d")
+  }) : {
+    j: $data.assets.mineArrow,
+    k: common_vendor.o((...args) => $options.goToLogin && $options.goToLogin(...args), "09")
   }, {
-    g: $data.assets.mineArrow,
-    h: common_vendor.o(($event) => $options.goToOrderList(0), "7c"),
-    i: common_vendor.f($data.orderStates, (item, index, i0) => {
+    l: $data.assets.mineArrow,
+    m: common_vendor.o(($event) => $options.goToOrderList(0), "18"),
+    n: common_vendor.f($data.orderStates, (item, index, i0) => {
       return {
         a: item.icon,
         b: common_vendor.t(item.label),
@@ -119,7 +146,7 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
         d: common_vendor.o(($event) => $options.goToOrderList(index + 1), index)
       };
     }),
-    j: common_vendor.f($data.menuList, (menu, index, i0) => {
+    o: common_vendor.f($data.menuList, (menu, index, i0) => {
       return {
         a: menu.icon,
         b: common_vendor.t(menu.label),
@@ -127,12 +154,12 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
         d: common_vendor.o(($event) => $options.handleMenuClick(menu), index)
       };
     }),
-    k: $data.assets.mineArrow,
-    l: $data.isLogin
+    p: $data.assets.mineArrow,
+    q: $data.isLogin
   }, $data.isLogin ? {
-    m: common_vendor.o((...args) => $options.handleLogout && $options.handleLogout(...args), "33")
+    r: common_vendor.o((...args) => $options.handleLogout && $options.handleLogout(...args), "be")
   } : {}, {
-    n: common_vendor.p({
+    s: common_vendor.p({
       active: "mine"
     })
   });

Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages/mine/index.wxml


+ 91 - 29
unpackage/dist/dev/mp-weixin/pages/mine/settings/index.js

@@ -1,54 +1,113 @@
 "use strict";
 const common_vendor = require("../../../common/vendor.js");
+const api_system_customer = require("../../../api/system/customer.js");
+const api_resource_oss = require("../../../api/resource/oss.js");
 const ErpNavBar = () => "../../../components/erp-nav-bar.js";
 const _sfc_main = {
   components: { ErpNavBar },
   data() {
     return {
+      uploading: false,
+      pendingAvatarOssId: null,
       myInfo: {
-        avatarUrl: "https://img.icons8.com/clouds/200/manager.png",
-        nickName: "张经理",
-        phoneNum: "138-8888-8888",
-        orgName: "广东粤铝材实业有限公司"
+        avatarUrl: "",
+        userName: "",
+        phone: "",
+        avatar: null,
+        authCustomerId: ""
       }
     };
   },
+  async onLoad() {
+    await this.loadInfo();
+  },
   methods: {
-    goBack() {
-      common_vendor.index.navigateBack();
+    async loadInfo() {
+      try {
+        common_vendor.index.showLoading({ title: "加载中" });
+        const res = await api_system_customer.getMyInfo();
+        common_vendor.index.hideLoading();
+        const d = res.data;
+        this.myInfo = {
+          avatarUrl: d.avatarUrl || "",
+          userName: d.userName || "",
+          phone: d.phone || "",
+          avatar: d.avatar || null,
+          authCustomerId: d.authCustomerId || ""
+        };
+        this.pendingAvatarOssId = null;
+      } catch (e) {
+        common_vendor.index.hideLoading();
+        common_vendor.index.showToast({ title: "加载失败", icon: "none" });
+      }
     },
     doChooseImage() {
       common_vendor.index.chooseImage({
         count: 1,
-        success: (res) => {
-          this.myInfo.avatarUrl = res.tempFilePaths[0];
-          common_vendor.index.showToast({ title: "头像已选好", icon: "none" });
+        sizeType: ["compressed"],
+        sourceType: ["album", "camera"],
+        success: async (res) => {
+          const tempPath = res.tempFilePaths[0];
+          this.myInfo.avatarUrl = tempPath;
+          this.uploading = true;
+          try {
+            const uploadRes = await api_resource_oss.uploadFile(tempPath);
+            this.pendingAvatarOssId = uploadRes.ossId;
+            common_vendor.index.showToast({ title: "头像上传成功", icon: "success" });
+          } catch (e) {
+            common_vendor.index.showToast({ title: "头像上传失败", icon: "none" });
+            this.myInfo.avatarUrl = "";
+          } finally {
+            this.uploading = false;
+          }
         }
       });
     },
     doEditName() {
       common_vendor.index.showModal({
         title: "设置昵称",
-        content: this.myInfo.nickName,
+        content: this.myInfo.userName,
         editable: true,
         confirmColor: "#C1001C",
-        // 重点修复点:弹窗确认按钮强制采用主题红
         success: (res) => {
           if (res.confirm) {
-            this.myInfo.nickName = res.content || "未命名";
+            this.myInfo.userName = res.content || this.myInfo.userName;
           }
         }
       });
     },
     saveProfile() {
-      common_vendor.index.showLoading({ title: "保存中" });
-      setTimeout(() => {
-        common_vendor.index.hideLoading();
-        common_vendor.index.showToast({ title: "保存成功" });
-        setTimeout(() => {
-          common_vendor.index.navigateBack();
-        }, 1200);
-      }, 600);
+      if (this.uploading)
+        return;
+      common_vendor.index.showModal({
+        title: "确认保存",
+        content: `昵称:${this.myInfo.userName}
+手机:${this.myInfo.phone}
+请确认以上信息是否填写正确?`,
+        confirmText: "确认",
+        cancelText: "取消",
+        confirmColor: "#C1001C",
+        success: async (res) => {
+          if (!res.confirm)
+            return;
+          try {
+            common_vendor.index.showLoading({ title: "保存中" });
+            const payload = { userName: this.myInfo.userName };
+            if (this.pendingAvatarOssId !== null) {
+              payload.avatar = this.pendingAvatarOssId;
+            }
+            await api_system_customer.updateMyInfo(payload);
+            common_vendor.index.hideLoading();
+            common_vendor.index.showToast({ title: "保存成功", icon: "success" });
+            setTimeout(() => {
+              common_vendor.index.navigateBack();
+            }, 1200);
+          } catch (e) {
+            common_vendor.index.hideLoading();
+            common_vendor.index.showToast({ title: e.message || "保存失败", icon: "none" });
+          }
+        }
+      });
     }
   }
 };
@@ -57,18 +116,21 @@ if (!Array) {
   _component_erp_nav_bar();
 }
 function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
-  return {
+  return common_vendor.e({
     a: common_vendor.p({
       title: "个人资料设置"
     }),
-    b: $data.myInfo.avatarUrl,
-    c: common_vendor.o((...args) => $options.doChooseImage && $options.doChooseImage(...args), "3d"),
-    d: common_vendor.t($data.myInfo.nickName),
-    e: common_vendor.o((...args) => $options.doEditName && $options.doEditName(...args), "24"),
-    f: common_vendor.t($data.myInfo.phoneNum),
-    g: common_vendor.t($data.myInfo.orgName),
-    h: common_vendor.o((...args) => $options.saveProfile && $options.saveProfile(...args), "cb")
-  };
+    b: $data.myInfo.avatarUrl || "https://img.icons8.com/color/144/user.png",
+    c: $data.uploading
+  }, $data.uploading ? {} : {}, {
+    d: common_vendor.o((...args) => $options.doChooseImage && $options.doChooseImage(...args), "b5"),
+    e: common_vendor.t($data.myInfo.userName),
+    f: common_vendor.o((...args) => $options.doEditName && $options.doEditName(...args), "f1"),
+    g: common_vendor.t($data.myInfo.phone),
+    h: common_vendor.t($data.myInfo.authCustomerId || "无"),
+    i: common_vendor.o((...args) => $options.saveProfile && $options.saveProfile(...args), "d6"),
+    j: $data.uploading
+  });
 }
 const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-2f058983"]]);
 wx.createPage(MiniProgramPage);

+ 1 - 1
unpackage/dist/dev/mp-weixin/pages/mine/settings/index.wxml

@@ -1 +1 @@
-<view class="settings-root data-v-2f058983"><erp-nav-bar wx:if="{{a}}" class="data-v-2f058983" u-i="2f058983-0" bind:__l="__l" u-p="{{a}}"/><view class="settings-list data-v-2f058983" style="{{'margin-top:' + '10px'}}"><view class="item-row avatar-row data-v-2f058983" bindtap="{{c}}"><text class="item-label data-v-2f058983">头像</text><view class="item-right data-v-2f058983"><image class="avatar-img data-v-2f058983" src="{{b}}" mode="aspectFill"></image><text class="icon-more data-v-2f058983"></text></view></view><view class="item-row data-v-2f058983" bindtap="{{e}}"><text class="item-label data-v-2f058983">用户昵称</text><view class="item-right data-v-2f058983"><text class="item-value data-v-2f058983">{{d}}</text><text class="icon-more data-v-2f058983"></text></view></view></view><view class="settings-list mt-30 data-v-2f058983"><view class="item-row no-tap data-v-2f058983"><text class="item-label data-v-2f058983">手机号码</text><view class="item-right data-v-2f058983"><text class="item-value readonly data-v-2f058983">{{f}}</text></view></view><view class="item-row no-tap data-v-2f058983"><text class="item-label data-v-2f058983">授权客户</text><view class="item-right data-v-2f058983"><text class="item-value readonly data-v-2f058983">{{g}}</text></view></view></view><view class="footer-bar data-v-2f058983"><button class="btn-confirm data-v-2f058983" bindtap="{{h}}">确认保存</button></view></view>
+<view class="settings-root data-v-2f058983"><erp-nav-bar wx:if="{{a}}" class="data-v-2f058983" u-i="2f058983-0" bind:__l="__l" u-p="{{a}}"/><view class="settings-list data-v-2f058983" style="{{'margin-top:' + '10px'}}"><view class="item-row avatar-row data-v-2f058983" bindtap="{{d}}"><text class="item-label data-v-2f058983">头像</text><view class="item-right data-v-2f058983"><view class="avatar-wrapper data-v-2f058983"><image class="avatar-img data-v-2f058983" src="{{b}}" mode="aspectFill"></image><view wx:if="{{c}}" class="avatar-uploading data-v-2f058983"><text class="uploading-text data-v-2f058983">上传中...</text></view></view><text class="icon-more data-v-2f058983"></text></view></view><view class="item-row data-v-2f058983" bindtap="{{f}}"><text class="item-label data-v-2f058983">用户昵称</text><view class="item-right data-v-2f058983"><text class="item-value data-v-2f058983">{{e}}</text><text class="icon-more data-v-2f058983"></text></view></view></view><view class="settings-list mt-30 data-v-2f058983"><view class="item-row no-tap data-v-2f058983"><text class="item-label data-v-2f058983">手机号码</text><view class="item-right data-v-2f058983"><text class="item-value readonly data-v-2f058983">{{g}}</text></view></view><view class="item-row no-tap data-v-2f058983"><text class="item-label data-v-2f058983">授权客户</text><view class="item-right data-v-2f058983"><text class="item-value readonly data-v-2f058983">{{h}}</text></view></view></view><view class="footer-bar data-v-2f058983"><button class="btn-confirm data-v-2f058983" bindtap="{{i}}" disabled="{{j}}">确认保存</button></view></view>

+ 22 - 1
unpackage/dist/dev/mp-weixin/pages/mine/settings/index.wxss

@@ -34,12 +34,33 @@
 	display: flex;
 	align-items: center;
 }
+.avatar-wrapper.data-v-2f058983 {
+	position: relative;
+	width: 110rpx;
+	height: 110rpx;
+	margin-right: 20rpx;
+}
 .avatar-img.data-v-2f058983 {
 	width: 110rpx;
 	height: 110rpx;
 	border-radius: 50%;
 	background: #eee;
-	margin-right: 20rpx;
+}
+.avatar-uploading.data-v-2f058983 {
+	position: absolute;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	border-radius: 50%;
+	background: rgba(0, 0, 0, 0.45);
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+.uploading-text.data-v-2f058983 {
+	font-size: 20rpx;
+	color: #fff;
 }
 .item-value.data-v-2f058983 {
 	font-size: 30rpx;

+ 49 - 17
unpackage/dist/dev/mp-weixin/pages/order/index.js

@@ -1,12 +1,14 @@
 "use strict";
 const common_vendor = require("../../common/vendor.js");
+const api_system_customer = require("../../api/system/customer.js");
 const ErpTabBar = () => "../../components/erp-tab-bar.js";
 const ErpNavBar = () => "../../components/erp-nav-bar.js";
 const _sfc_main = {
   components: { ErpNavBar, ErpTabBar },
   data() {
     return {
-      isAuthorized: false,
+      isLoggedIn: false,
+      authorizedClients: [],
       selectedModels: []
     };
   },
@@ -27,11 +29,39 @@ const _sfc_main = {
       }
     });
   },
+  onShow() {
+    this.checkLoginStatus();
+  },
   onUnload() {
     common_vendor.index.$off("add_order_item");
     common_vendor.index.$off("update_order_item");
   },
   methods: {
+    async checkLoginStatus() {
+      const token = common_vendor.index.getStorageSync("token");
+      if (!token) {
+        this.isLoggedIn = false;
+        this.authorizedClients = [];
+        return;
+      }
+      try {
+        await api_system_customer.getMyInfo();
+        this.isLoggedIn = true;
+        this.loadAuthorizedClients();
+      } catch (e) {
+        common_vendor.index.removeStorageSync("token");
+        common_vendor.index.removeStorageSync("isLogin");
+        this.isLoggedIn = false;
+        this.authorizedClients = [];
+      }
+    },
+    loadAuthorizedClients() {
+      const clients = common_vendor.index.getStorageSync("authorizedClients");
+      this.authorizedClients = clients || [];
+    },
+    goToLogin() {
+      common_vendor.index.reLaunch({ url: "/pages/login/index" });
+    },
     contactAdmin() {
       common_vendor.index.showModal({ title: "联系管理员", content: "管理员电话:138-0000-0000", showCancel: false, confirmColor: "#C1001C" });
     },
@@ -81,16 +111,17 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
       title: "ERP 下单",
       ["show-back"]: false
     }),
-    b: !$data.isAuthorized
-  }, !$data.isAuthorized ? {
-    c: common_vendor.o((...args) => $options.contactAdmin && $options.contactAdmin(...args), "1b"),
-    d: common_vendor.o(($event) => $data.isAuthorized = true, "9e")
+    b: !$data.isLoggedIn
+  }, !$data.isLoggedIn ? {
+    c: common_vendor.o((...args) => $options.goToLogin && $options.goToLogin(...args), "93")
+  } : $data.authorizedClients.length === 0 ? {
+    e: common_vendor.o((...args) => $options.contactAdmin && $options.contactAdmin(...args), "e2")
   } : common_vendor.e({
-    e: $data.selectedModels.length > 0
-  }, $data.selectedModels.length > 0 ? {} : {}, {
     f: $data.selectedModels.length > 0
+  }, $data.selectedModels.length > 0 ? {} : {}, {
+    g: $data.selectedModels.length > 0
   }, $data.selectedModels.length > 0 ? {
-    g: common_vendor.f($data.selectedModels, (item, index, i0) => {
+    h: common_vendor.f($data.selectedModels, (item, index, i0) => {
       return {
         a: common_vendor.o(($event) => $options.removeItem(index), index),
         b: common_vendor.t(item.type),
@@ -101,20 +132,21 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
       };
     })
   } : {
-    h: common_vendor.o((...args) => $options.goToAddModel && $options.goToAddModel(...args), "57")
+    i: common_vendor.o((...args) => $options.goToAddModel && $options.goToAddModel(...args), "7a")
   }, {
-    i: $data.selectedModels.length > 0
+    j: $data.selectedModels.length > 0
   }, $data.selectedModels.length > 0 ? {
-    j: common_vendor.o((...args) => $options.goToAddModel && $options.goToAddModel(...args), "2d")
+    k: common_vendor.o((...args) => $options.goToAddModel && $options.goToAddModel(...args), "6d")
   } : {}, {
-    k: $data.selectedModels.length > 0
+    l: $data.selectedModels.length > 0
   }, $data.selectedModels.length > 0 ? {
-    l: common_vendor.t($data.selectedModels.length),
-    m: common_vendor.t($options.totalCount),
-    n: $data.selectedModels.length === 0,
-    o: common_vendor.o((...args) => $options.submitFinalOrder && $options.submitFinalOrder(...args), "35")
+    m: common_vendor.t($data.selectedModels.length),
+    n: common_vendor.t($options.totalCount),
+    o: $data.selectedModels.length === 0,
+    p: common_vendor.o((...args) => $options.submitFinalOrder && $options.submitFinalOrder(...args), "7e")
   } : {}), {
-    p: common_vendor.p({
+    d: $data.authorizedClients.length === 0,
+    q: common_vendor.p({
       active: "order"
     })
   });

Plik diff jest za duży
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages/order/index.wxml


+ 1 - 1
unpackage/dist/dev/mp-weixin/utils/request.js

@@ -22,7 +22,7 @@ function request(options = {}) {
   const headers = {
     "Content-Type": "application/json",
     "clientid": CLIENT_ID,
-    ...token ? { Authorization: "Bearer " + token } : {},
+    "Authorization": "Bearer " + token,
     ...header
   };
   return new Promise((resolve, reject) => {

+ 1 - 1
utils/request.js

@@ -25,7 +25,7 @@ function request(options = {}) {
 	const headers = {
 		'Content-Type': 'application/json',
 		'clientid': CLIENT_ID,
-		...(token ? { Authorization: 'Bearer ' + token } : {}),
+		'Authorization': 'Bearer ' + token,
 		...header
 	};
 

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików