Browse Source

协议基本完成、登录完成一半

Huanyi 1 tháng trước cách đây
mục cha
commit
a175ac7e03
100 tập tin đã thay đổi với 7170 bổ sung3268 xóa
  1. 29 0
      api/auth/index.js
  2. 9 0
      api/system/agreement.js
  3. 81 0
      components/erp-nav-bar.vue
  4. 13 56
      pages.json
  5. 402 134
      pages/index/index.vue
  6. 613 129
      pages/login/index.vue
  7. 68 54
      pages/mine/agreement/index.vue
  8. 284 116
      pages/mine/complaint/index.vue
  9. 364 155
      pages/mine/index.vue
  10. 68 52
      pages/mine/privacy/index.vue
  11. 135 85
      pages/mine/settings/index.vue
  12. 346 130
      pages/order/add-model/index.vue
  13. 287 153
      pages/order/detail/index.vue
  14. 360 145
      pages/order/edit-model/index.vue
  15. 473 218
      pages/order/index.vue
  16. 457 219
      pages/order/list/index.vue
  17. 107 94
      pages/order/success/index.vue
  18. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/api/auth/index.js.map
  19. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/api/system/agreement.js.map
  20. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map
  21. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/erp-nav-bar.js.map
  22. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/index.js.map
  23. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/login/index.js.map
  24. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/agreement/index.js.map
  25. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/complaint/index.js.map
  26. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/index.js.map
  27. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/privacy/index.js.map
  28. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/settings/index.js.map
  29. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/order/add-model/index.js.map
  30. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/order/detail/index.js.map
  31. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/order/edit-model/index.js.map
  32. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/order/index.js.map
  33. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/order/list/index.js.map
  34. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/order/success/index.js.map
  35. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/utils/request.js.map
  36. 31 0
      unpackage/dist/dev/mp-weixin/api/auth/index.js
  37. 7 0
      unpackage/dist/dev/mp-weixin/api/system/agreement.js
  38. 2 1
      unpackage/dist/dev/mp-weixin/common/vendor.js
  39. 41 0
      unpackage/dist/dev/mp-weixin/components/erp-nav-bar.js
  40. 0 0
      unpackage/dist/dev/mp-weixin/components/erp-nav-bar.json
  41. 1 0
      unpackage/dist/dev/mp-weixin/components/erp-nav-bar.wxml
  42. 40 0
      unpackage/dist/dev/mp-weixin/components/erp-nav-bar.wxss
  43. 0 44
      unpackage/dist/dev/mp-weixin/components/erp-tab-bar/erp-tab-bar.js
  44. 0 1
      unpackage/dist/dev/mp-weixin/components/erp-tab-bar/erp-tab-bar.wxml
  45. 0 51
      unpackage/dist/dev/mp-weixin/components/erp-tab-bar/erp-tab-bar.wxss
  46. 0 44
      unpackage/dist/dev/mp-weixin/components/erp-tab-bar/index.js
  47. 0 4
      unpackage/dist/dev/mp-weixin/components/erp-tab-bar/index.json
  48. 0 1
      unpackage/dist/dev/mp-weixin/components/erp-tab-bar/index.wxml
  49. 0 51
      unpackage/dist/dev/mp-weixin/components/erp-tab-bar/index.wxss
  50. 14 8
      unpackage/dist/dev/mp-weixin/pages/index/index.js
  51. 3 4
      unpackage/dist/dev/mp-weixin/pages/index/index.json
  52. 0 0
      unpackage/dist/dev/mp-weixin/pages/index/index.wxml
  53. 286 108
      unpackage/dist/dev/mp-weixin/pages/index/index.wxss
  54. 126 32
      unpackage/dist/dev/mp-weixin/pages/login/index.js
  55. 0 1
      unpackage/dist/dev/mp-weixin/pages/login/index.json
  56. 0 0
      unpackage/dist/dev/mp-weixin/pages/login/index.wxml
  57. 387 122
      unpackage/dist/dev/mp-weixin/pages/login/index.wxss
  58. 23 17
      unpackage/dist/dev/mp-weixin/pages/mine/agreement/index.js
  59. 3 2
      unpackage/dist/dev/mp-weixin/pages/mine/agreement/index.json
  60. 1 1
      unpackage/dist/dev/mp-weixin/pages/mine/agreement/index.wxml
  61. 34 25
      unpackage/dist/dev/mp-weixin/pages/mine/agreement/index.wxss
  62. 18 20
      unpackage/dist/dev/mp-weixin/pages/mine/complaint/index.js
  63. 3 2
      unpackage/dist/dev/mp-weixin/pages/mine/complaint/index.json
  64. 0 0
      unpackage/dist/dev/mp-weixin/pages/mine/complaint/index.wxml
  65. 200 57
      unpackage/dist/dev/mp-weixin/pages/mine/complaint/index.wxss
  66. 23 17
      unpackage/dist/dev/mp-weixin/pages/mine/index.js
  67. 3 4
      unpackage/dist/dev/mp-weixin/pages/mine/index.json
  68. 0 0
      unpackage/dist/dev/mp-weixin/pages/mine/index.wxml
  69. 233 93
      unpackage/dist/dev/mp-weixin/pages/mine/index.wxss
  70. 23 15
      unpackage/dist/dev/mp-weixin/pages/mine/privacy/index.js
  71. 3 2
      unpackage/dist/dev/mp-weixin/pages/mine/privacy/index.json
  72. 1 1
      unpackage/dist/dev/mp-weixin/pages/mine/privacy/index.wxml
  73. 33 23
      unpackage/dist/dev/mp-weixin/pages/mine/privacy/index.wxss
  74. 16 14
      unpackage/dist/dev/mp-weixin/pages/mine/settings/index.js
  75. 3 2
      unpackage/dist/dev/mp-weixin/pages/mine/settings/index.json
  76. 1 1
      unpackage/dist/dev/mp-weixin/pages/mine/settings/index.wxml
  77. 74 41
      unpackage/dist/dev/mp-weixin/pages/mine/settings/index.wxss
  78. 57 48
      unpackage/dist/dev/mp-weixin/pages/order/add-model/index.js
  79. 4 3
      unpackage/dist/dev/mp-weixin/pages/order/add-model/index.json
  80. 0 0
      unpackage/dist/dev/mp-weixin/pages/order/add-model/index.wxml
  81. 231 100
      unpackage/dist/dev/mp-weixin/pages/order/add-model/index.wxss
  82. 24 19
      unpackage/dist/dev/mp-weixin/pages/order/detail/index.js
  83. 3 2
      unpackage/dist/dev/mp-weixin/pages/order/detail/index.json
  84. 0 0
      unpackage/dist/dev/mp-weixin/pages/order/detail/index.wxml
  85. 156 79
      unpackage/dist/dev/mp-weixin/pages/order/detail/index.wxss
  86. 57 48
      unpackage/dist/dev/mp-weixin/pages/order/edit-model/index.js
  87. 4 3
      unpackage/dist/dev/mp-weixin/pages/order/edit-model/index.json
  88. 0 0
      unpackage/dist/dev/mp-weixin/pages/order/edit-model/index.wxml
  89. 231 100
      unpackage/dist/dev/mp-weixin/pages/order/edit-model/index.wxss
  90. 23 17
      unpackage/dist/dev/mp-weixin/pages/order/index.js
  91. 3 4
      unpackage/dist/dev/mp-weixin/pages/order/index.json
  92. 0 0
      unpackage/dist/dev/mp-weixin/pages/order/index.wxml
  93. 340 160
      unpackage/dist/dev/mp-weixin/pages/order/index.wxss
  94. 17 16
      unpackage/dist/dev/mp-weixin/pages/order/list/index.js
  95. 2 2
      unpackage/dist/dev/mp-weixin/pages/order/list/index.json
  96. 0 0
      unpackage/dist/dev/mp-weixin/pages/order/list/index.wxml
  97. 270 111
      unpackage/dist/dev/mp-weixin/pages/order/list/index.wxss
  98. 12 3
      unpackage/dist/dev/mp-weixin/pages/order/success/index.js
  99. 4 3
      unpackage/dist/dev/mp-weixin/pages/order/success/index.json
  100. 1 1
      unpackage/dist/dev/mp-weixin/pages/order/success/index.wxml

+ 29 - 0
api/auth/index.js

@@ -0,0 +1,29 @@
+import request from '@/utils/request';
+
+export function wechatLogin(data) {
+  return request({
+    url: '/auth/login',
+    method: 'post',
+    data: {
+      ...data,
+      clientId: 'e48ac397bff4f031b14d6e671eee49c3',
+      grantType: 'wechatApplet'
+    }
+  });
+}
+
+export function getWechatPhone(data) {
+  return request({
+    url: '/auth/wechat/phone',
+    method: 'post',
+    data
+  });
+}
+
+export function wechatRegister(data) {
+  return request({
+    url: '/auth/wechat/register',
+    method: 'post',
+    data
+  });
+}

+ 9 - 0
api/system/agreement.js

@@ -0,0 +1,9 @@
+import request from '@/utils/request';
+
+/**
+ * 根据ID查询协议信息
+ * @param {number} id 1=用户协议 2=隐私政策
+ */
+export function getAgreement(id) {
+	return request({ url: `/system/agreement/${id}`, method: 'GET' });
+}

+ 81 - 0
components/erp-nav-bar.vue

@@ -0,0 +1,81 @@
+<template>
+	<view class="erp-nav-bar" :style="{ paddingTop: statusBarHeight + 'px', backgroundColor: bgColor }">
+		<view class="erp-nav-content">
+			<view class="erp-nav-left" @click="handleBack">
+				<view v-if="showBack" class="erp-back-arrow" :style="{ borderColor: titleColor }"></view>
+			</view>
+			<text class="erp-nav-title" :style="{ color: titleColor }">{{ title }}</text>
+			<view class="erp-nav-right">
+				<slot name="right"></slot>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	name: 'ErpNavBar',
+	props: {
+		title: { type: String, default: '' },
+		showBack: { type: Boolean, default: true },
+		bgColor: { type: String, default: '#ffffff' },
+		titleColor: { type: String, default: '#333333' }
+	},
+	data() {
+		return { statusBarHeight: 20 }
+	},
+	mounted() {
+		this.statusBarHeight = uni.getSystemInfoSync().statusBarHeight || 20;
+	},
+	methods: {
+		handleBack() {
+			if (this.showBack) {
+				this.$emit('back');
+				uni.navigateBack();
+			}
+		}
+	}
+}
+</script>
+
+<style scoped>
+.erp-nav-bar {
+	width: 100%;
+	flex-shrink: 0;
+}
+.erp-nav-content {
+	height: 44px;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 0 30rpx;
+}
+.erp-nav-left {
+	width: 60rpx;
+	height: 44px;
+	display: flex;
+	align-items: center;
+}
+.erp-back-arrow {
+	width: 20rpx;
+	height: 20rpx;
+	border-left: 4rpx solid #333;
+	border-bottom: 4rpx solid #333;
+	transform: rotate(45deg);
+	margin-left: 8rpx;
+}
+.erp-nav-title {
+	flex: 1;
+	text-align: center;
+	font-size: 34rpx;
+	font-weight: bold;
+	color: #333333;
+}
+.erp-nav-right {
+	width: 60rpx;
+	height: 44px;
+	display: flex;
+	align-items: center;
+	justify-content: flex-end;
+}
+</style>

+ 13 - 56
pages.json

@@ -2,98 +2,55 @@
 	"pages": [
 		{
 			"path": "pages/index/index",
-			"style": {
-				"navigationBarTitleText": "华晟型材",
-				"navigationBarBackgroundColor": "#FFFFFF",
-				"navigationBarTextStyle": "black"
-			}
+			"style": { "navigationStyle": "custom" }
 		},
 		{
 			"path": "pages/login/index",
-			"style": {
-				"navigationBarTitleText": "登录",
-				"navigationStyle": "custom"
-			}
+			"style": { "navigationStyle": "custom" }
 		},
 		{
 			"path": "pages/order/index",
-			"style": {
-				"navigationBarTitleText": "ERP 下单",
-				"navigationBarBackgroundColor": "#FFFFFF",
-				"navigationBarTextStyle": "black"
-			}
+			"style": { "navigationStyle": "custom" }
 		},
 		{
 			"path": "pages/order/success/index",
-			"style": {
-				"navigationBarTitleText": "下单成功",
-				"navigationBarBackgroundColor": "#FFFFFF"
-			}
+			"style": { "navigationStyle": "custom" }
 		},
 		{
 			"path": "pages/order/add-model/index",
-			"style": {
-				"navigationBarTitleText": "添加型号",
-				"navigationBarBackgroundColor": "#FFFFFF"
-			}
+			"style": { "navigationStyle": "custom" }
 		},
 		{
 			"path": "pages/order/edit-model/index",
-			"style": {
-				"navigationBarTitleText": "编辑型号",
-				"navigationBarBackgroundColor": "#FFFFFF"
-			}
+			"style": { "navigationStyle": "custom" }
 		},
 		{
 			"path": "pages/order/list/index",
-			"style": {
-				"navigationBarTitleText": "我的订单",
-				"navigationStyle": "custom",
-				"enablePullDownRefresh": false
-			}
+			"style": { "navigationStyle": "custom", "enablePullDownRefresh": false }
 		},
 		{
 			"path": "pages/order/detail/index",
-			"style": {
-				"navigationBarTitleText": "订单详情",
-				"navigationStyle": "custom"
-			}
+			"style": { "navigationStyle": "custom" }
 		},
 		{
 			"path": "pages/mine/settings/index",
-			"style": {
-				"navigationBarTitleText": "个人资料设置",
-				"navigationStyle": "custom"
-			}
+			"style": { "navigationStyle": "custom" }
 		},
 		{
 			"path": "pages/mine/agreement/index",
-			"style": {
-				"navigationBarTitleText": "用户协议",
-				"navigationStyle": "custom"
-			}
+			"style": { "navigationStyle": "custom" }
 		},
 		{
 			"path": "pages/mine/privacy/index",
-			"style": {
-				"navigationBarTitleText": "隐私政策",
-				"navigationStyle": "custom"
-			}
+			"style": { "navigationStyle": "custom" }
 		},
 		{
 			"path": "pages/mine/complaint/index",
-			"style": {
-				"navigationBarTitleText": "投诉与建议",
-				"navigationStyle": "custom"
-			}
+			"style": { "navigationStyle": "custom" }
 		},
 		{
 			"path": "pages/mine/index",
-			"style": {
-				"navigationBarTitleText": "个人中心",
-				"navigationBarBackgroundColor": "#C1001C",
-				"navigationBarTextStyle": "white"
-			}
+			"style": { "navigationStyle": "custom" }
 		}
 	],
 	"globalStyle": {

+ 402 - 134
pages/index/index.vue

@@ -1,25 +1,27 @@
 <template>
 	<view class="home-page">
+		<erp-nav-bar title="华晶型材" :show-back="false" />
 		<scroll-view class="main-scroll" scroll-y :show-scrollbar="false" :enhanced="true">
 			<!-- 1. 灵动大屏轮播 (无缝全屏感) -->
 			<view class="hero-section">
-				<swiper class="hero-swiper" circular autoplay interval="5000" duration="800" @change="handleBannerChange">
+				<swiper class="hero-swiper" circular autoplay interval="5000" duration="800"
+					@change="handleBannerChange">
 					<swiper-item v-for="(item, index) in banners" :key="index">
 						<view class="hero-card">
 							<image :src="item.url" mode="aspectFill" class="hero-img"></image>
 							<view class="hero-overlay"></view>
 							<view class="hero-text-content">
-								<text class="hero-tag">{{item.tag}}</text>
-								<text class="hero-main-title">{{item.title}}</text>
-								<text class="hero-sub-title">{{item.subTitle}}</text>
+								<text class="hero-tag">{{ item.tag }}</text>
+								<text class="hero-main-title">{{ item.title }}</text>
+								<text class="hero-sub-title">{{ item.subTitle }}</text>
 							</view>
 						</view>
 					</swiper-item>
 				</swiper>
 				<!-- 胶囊样式指示器 -->
 				<view class="hero-indicators">
-					<view v-for="(item, index) in banners" :key="index" 
-						class="indicator-pill" :class="{ active: currentBanner === index }"></view>
+					<view v-for="(item, index) in banners" :key="index" class="indicator-pill"
+						:class="{ active: currentBanner === index }"></view>
 				</view>
 			</view>
 
@@ -47,16 +49,16 @@
 						<text class="en">CATEGORIES</text>
 					</view>
 				</view>
-				
+
 				<view class="cube-container">
 					<view class="cube-grid">
 						<view class="cube-card" v-for="(item, index) in cubeProducts" :key="index" @click="goToOrder">
 							<image :src="item.image" mode="aspectFill" class="cube-bg"></image>
 							<view class="cube-mask"></view>
 							<view class="cube-content">
-								<text class="cube-title">{{item.name}}</text>
+								<text class="cube-title">{{ item.name }}</text>
 								<view class="cube-line"></view>
-								<text class="cube-desc">{{item.desc}}</text>
+								<text class="cube-desc">{{ item.desc }}</text>
 							</view>
 							<view class="cube-arrow">→</view>
 						</view>
@@ -103,138 +105,404 @@
 </template>
 
 <script>
-	import ErpTabBar from '@/components/erp-tab-bar.vue';
-	import assets from '@/utils/assets.js';
-
-	export default {
-		components: { ErpTabBar },
-		data() {
-			return {
-				assets,
-				statusBarHeight: 0,
-				currentBanner: 0,
-				banners: [
-					{ 
-						url: '/static/index/banner1.jpg', 
-						tag: '领航品质', 
-						title: '工业铝型材定制', 
-						subTitle: '提供一站式工业型材解决方案' 
-					},
-					{ 
-						url: '/static/index/banner2.jpg', 
-						tag: '建筑美学', 
-						title: '高端系统门窗', 
-						subTitle: '智造美好生活空间' 
+import ErpTabBar from '@/components/erp-tab-bar.vue';
+import ErpNavBar from '@/components/erp-nav-bar.vue';
+import assets from '@/utils/assets.js';
+
+export default {
+	components: { ErpTabBar, ErpNavBar },
+	data() {
+		return {
+			assets,
+			statusBarHeight: 0,
+			currentBanner: 0,
+			banners: [
+				{
+					url: '/static/index/banner1.jpg',
+					tag: '领航品质',
+					title: '工业铝型材定制',
+					subTitle: '提供一站式工业型材解决方案'
+				},
+				{
+					url: '/static/index/banner2.jpg',
+					tag: '建筑美学',
+					title: '高端系统门窗',
+					subTitle: '智造美好生活空间'
+				}
+			],
+			cubeProducts: [
+				{ name: '建筑铝材', desc: '门窗/幕墙/家装', image: '/static/index/cube1.jpg' },
+				{ name: '工业型材', desc: '光伏/轨道/汽配', image: '/static/index/cube2.jpg' },
+				{ name: '特种定制', desc: '精密开模/特种合金', image: '/static/index/cube3.jpg' },
+				{ name: '深加工', desc: '切割/冲压/CNC', image: '/static/index/cube4.jpg' }
+			]
+		}
+	},
+	onLoad() {
+	},
+	methods: {
+		handleBannerChange(e) { this.currentBanner = e.detail.current; },
+		callService() {
+			uni.showModal({
+				title: '管家式服务',
+				content: '即将为您拨打华晟型材专家电话 13888888888',
+				confirmText: '立即咨询',
+				confirmColor: '#C1001C',
+				cancelText: '稍后再说',
+				cancelColor: '#999',
+				success: (res) => {
+					if (res.confirm) {
+						uni.makePhoneCall({ phoneNumber: '13888888888' });
 					}
-				],
-				cubeProducts: [
-					{ name: '建筑铝材', desc: '门窗/幕墙/家装', image: '/static/index/cube1.jpg' },
-					{ name: '工业型材', desc: '光伏/轨道/汽配', image: '/static/index/cube2.jpg' },
-					{ name: '特种定制', desc: '精密开模/特种合金', image: '/static/index/cube3.jpg' },
-					{ name: '深加工', desc: '切割/冲压/CNC', image: '/static/index/cube4.jpg' }
-				]
-			}
-		},
-		onLoad() {
+				}
+			});
 		},
-		methods: {
-			handleBannerChange(e) { this.currentBanner = e.detail.current; },
-			callService() { 
-				uni.showModal({
-					title: '管家式服务',
-					content: '即将为您拨打华晟型材专家电话 13888888888',
-					confirmText: '立即咨询',
-					confirmColor: '#C1001C',
-					cancelText: '稍后再说',
-					cancelColor: '#999',
-					success: (res) => {
-						if (res.confirm) {
-							uni.makePhoneCall({ phoneNumber: '13888888888' });
-						}
-					}
-				});
-			},
-			goToOrder() { uni.reLaunch({ url: '/pages/order/index' }); }
-		}
+		goToOrder() { uni.reLaunch({ url: '/pages/order/index' }); }
 	}
+}
 </script>
 
 <style scoped>
-	.home-page { width: 100vw; height: 100vh; background-color: #F8FAFC; display: flex; flex-direction: column; }
-	.main-scroll { flex: 1; height: 0; }
-
-	/* 英雄轮播区 */
-	.hero-section { position: relative; width: 100%; height: 500rpx; overflow: hidden; }
-	.hero-swiper { height: 100%; }
-	.hero-card { position: relative; width: 100%; height: 100%; }
-	.hero-img { width: 100%; height: 100%; }
-	.hero-overlay { position: absolute; inset: 0; background: linear-gradient(to bottom, rgba(0,0,0,0.1), rgba(0,0,0,0.5)); }
-	
-	.hero-text-content { position: absolute; left: 40rpx; bottom: 80rpx; color: #fff; z-index: 2; }
-	.hero-tag { font-size: 20rpx; background: rgba(193,0,28,0.8); padding: 4rpx 16rpx; border-radius: 4rpx; margin-bottom: 12rpx; display: inline-block; }
-	.hero-main-title { font-size: 44rpx; font-weight: bold; display: block; margin-bottom: 8rpx; }
-	.hero-sub-title { font-size: 24rpx; opacity: 0.8; letter-spacing: 1rpx; }
-
-	.hero-indicators { position: absolute; bottom: 40rpx; right: 40rpx; display: flex; gap: 8rpx; }
-	.indicator-pill { width: 12rpx; height: 6rpx; background: rgba(255,255,255,0.3); border-radius: 4rpx; transition: 0.3s; }
-	.indicator-pill.active { width: 32rpx; background: #fff; }
-
-	/* 咨询卡片 */
-	.contact-card {
-		margin: -40rpx 40rpx 40rpx; position: relative; z-index: 10;
-		background: rgba(255,255,255,0.9); backdrop-filter: blur(20px);
-		border-radius: 24rpx; padding: 32rpx 40rpx; display: flex; align-items: center; 
-		justify-content: space-between; border: 1rpx solid #fff;
-		box-shadow: 0 12rpx 40rpx rgba(0,0,0,0.06);
-	}
-	.contact-info { display: flex; align-items: center; }
-	.contact-icon-box { width: 88rpx; height: 88rpx; background: #FFF1F2; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin-right: 24rpx; }
-	.contact-icon-box image { width: 44rpx; height: 44rpx; }
-	.main-txt { font-size: 30rpx; font-weight: bold; color: #1a1a1a; display: block; margin-bottom: 4rpx; }
-	.sub-txt { font-size: 22rpx; color: #7a7a7a; }
-	.call-btn-circle { width: 72rpx; height: 72rpx; background: #C1001C; border-radius: 50%; display: flex; align-items: center; justify-content: center; box-shadow: 0 6rpx 12rpx rgba(193,0,28,0.3); }
-	.call-btn-circle image { width: 32rpx; height: 32rpx; }
-
-	/* 魔方布局 */
-	.cube-section { padding: 20rpx 40rpx; }
-	.section-header { margin-bottom: 30rpx; }
-	.title-with-line { display: flex; align-items: baseline; gap: 16rpx; }
-	.title-with-line .zh { font-size: 36rpx; font-weight: 800; color: #1a1a1a; }
-	.title-with-line .en { font-size: 20rpx; color: #999; font-family: 'Georgia'; letter-spacing: 2rpx; }
-
-	.cube-container { width: 100%; }
-	.cube-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 20rpx; }
-	.cube-card { 
-		position: relative; height: 320rpx; border-radius: 20rpx; overflow: hidden;
-		background: #eee; transition: 0.3s;
-	}
-	.cube-bg { width: 100%; height: 100%; }
-	.cube-mask { position: absolute; inset: 0; background: rgba(0,0,0,0.3); }
-	.cube-content { position: absolute; left: 30rpx; top: 30rpx; z-index: 2; }
-	.cube-title { font-size: 32rpx; font-weight: bold; color: #fff; margin-bottom: 12rpx; display: block; }
-	.cube-line { width: 40rpx; height: 4rpx; background: #C1001C; margin-bottom: 12rpx; }
-	.cube-desc { font-size: 20rpx; color: rgba(255,255,255,0.8); max-width: 240rpx; line-height: 1.4; display: block; }
-	.cube-arrow { position: absolute; right: 30rpx; bottom: 30rpx; color: #fff; font-size: 30rpx; opacity: 0.6; }
-
-	/* 企业实力 */
-	.brand-strength { padding: 40rpx; margin-bottom: 40rpx; }
-	.strength-card { 
-		background: #1a1a1a; border-radius: 32rpx; padding: 48rpx 40rpx; color: #fff;
-		box-shadow: 0 20rpx 60rpx rgba(0,0,0,0.15);
-	}
-	.s-header { margin-bottom: 50rpx; }
-	.s-title { font-size: 34rpx; font-weight: bold; display: block; margin-bottom: 8rpx; color: #fff; letter-spacing: 4rpx; }
-	.s-subtitle { font-size: 18rpx; color: #666; font-family: 'Arial'; text-transform: uppercase; }
+.home-page {
+	width: 100vw;
+	height: 100vh;
+	background-color: #F8FAFC;
+	display: flex;
+	flex-direction: column;
+}
+
+.main-scroll {
+	flex: 1;
+	height: 0;
+}
+
+/* 英雄轮播区 */
+.hero-section {
+	position: relative;
+	width: 100%;
+	height: 500rpx;
+	overflow: hidden;
+}
+
+.hero-swiper {
+	height: 100%;
+}
+
+.hero-card {
+	position: relative;
+	width: 100%;
+	height: 100%;
+}
+
+.hero-img {
+	width: 100%;
+	height: 100%;
+}
+
+.hero-overlay {
+	position: absolute;
+	inset: 0;
+	background: linear-gradient(to bottom, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.5));
+}
+
+.hero-text-content {
+	position: absolute;
+	left: 40rpx;
+	bottom: 80rpx;
+	color: #fff;
+	z-index: 2;
+}
+
+.hero-tag {
+	font-size: 20rpx;
+	background: rgba(193, 0, 28, 0.8);
+	padding: 4rpx 16rpx;
+	border-radius: 4rpx;
+	margin-bottom: 12rpx;
+	display: inline-block;
+}
+
+.hero-main-title {
+	font-size: 44rpx;
+	font-weight: bold;
+	display: block;
+	margin-bottom: 8rpx;
+}
+
+.hero-sub-title {
+	font-size: 24rpx;
+	opacity: 0.8;
+	letter-spacing: 1rpx;
+}
+
+.hero-indicators {
+	position: absolute;
+	bottom: 40rpx;
+	right: 40rpx;
+	display: flex;
+	gap: 8rpx;
+}
+
+.indicator-pill {
+	width: 12rpx;
+	height: 6rpx;
+	background: rgba(255, 255, 255, 0.3);
+	border-radius: 4rpx;
+	transition: 0.3s;
+}
+
+.indicator-pill.active {
+	width: 32rpx;
+	background: #fff;
+}
+
+/* 咨询卡片 */
+.contact-card {
+	margin: -40rpx 40rpx 40rpx;
+	position: relative;
+	z-index: 10;
+	background: rgba(255, 255, 255, 0.9);
+	backdrop-filter: blur(20px);
+	border-radius: 24rpx;
+	padding: 32rpx 40rpx;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	border: 1rpx solid #fff;
+	box-shadow: 0 12rpx 40rpx rgba(0, 0, 0, 0.06);
+}
+
+.contact-info {
+	display: flex;
+	align-items: center;
+}
+
+.contact-icon-box {
+	width: 88rpx;
+	height: 88rpx;
+	background: #FFF1F2;
+	border-radius: 50%;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	margin-right: 24rpx;
+}
+
+.contact-icon-box image {
+	width: 44rpx;
+	height: 44rpx;
+}
+
+.main-txt {
+	font-size: 30rpx;
+	font-weight: bold;
+	color: #1a1a1a;
+	display: block;
+	margin-bottom: 4rpx;
+}
+
+.sub-txt {
+	font-size: 22rpx;
+	color: #7a7a7a;
+}
+
+.call-btn-circle {
+	width: 72rpx;
+	height: 72rpx;
+	background: #C1001C;
+	border-radius: 50%;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	box-shadow: 0 6rpx 12rpx rgba(193, 0, 28, 0.3);
+}
+
+.call-btn-circle image {
+	width: 32rpx;
+	height: 32rpx;
+}
+
+/* 魔方布局 */
+.cube-section {
+	padding: 20rpx 40rpx;
+}
+
+.section-header {
+	margin-bottom: 30rpx;
+}
+
+.title-with-line {
+	display: flex;
+	align-items: baseline;
+	gap: 16rpx;
+}
+
+.title-with-line .zh {
+	font-size: 36rpx;
+	font-weight: 800;
+	color: #1a1a1a;
+}
+
+.title-with-line .en {
+	font-size: 20rpx;
+	color: #999;
+	font-family: 'Georgia';
+	letter-spacing: 2rpx;
+}
+
+.cube-container {
+	width: 100%;
+}
+
+.cube-grid {
+	display: grid;
+	grid-template-columns: repeat(2, 1fr);
+	gap: 20rpx;
+}
+
+.cube-card {
+	position: relative;
+	height: 320rpx;
+	border-radius: 20rpx;
+	overflow: hidden;
+	background: #eee;
+	transition: 0.3s;
+}
+
+.cube-bg {
+	width: 100%;
+	height: 100%;
+}
+
+.cube-mask {
+	position: absolute;
+	inset: 0;
+	background: rgba(0, 0, 0, 0.3);
+}
+
+.cube-content {
+	position: absolute;
+	left: 30rpx;
+	top: 30rpx;
+	z-index: 2;
+}
+
+.cube-title {
+	font-size: 32rpx;
+	font-weight: bold;
+	color: #fff;
+	margin-bottom: 12rpx;
+	display: block;
+}
+
+.cube-line {
+	width: 40rpx;
+	height: 4rpx;
+	background: #C1001C;
+	margin-bottom: 12rpx;
+}
+
+.cube-desc {
+	font-size: 20rpx;
+	color: rgba(255, 255, 255, 0.8);
+	max-width: 240rpx;
+	line-height: 1.4;
+	display: block;
+}
+
+.cube-arrow {
+	position: absolute;
+	right: 30rpx;
+	bottom: 30rpx;
+	color: #fff;
+	font-size: 30rpx;
+	opacity: 0.6;
+}
+
+/* 企业实力 */
+.brand-strength {
+	padding: 40rpx;
+	margin-bottom: 40rpx;
+}
+
+.strength-card {
+	background: #1a1a1a;
+	border-radius: 32rpx;
+	padding: 48rpx 40rpx;
+	color: #fff;
+	box-shadow: 0 20rpx 60rpx rgba(0, 0, 0, 0.15);
+}
+
+.s-header {
+	margin-bottom: 50rpx;
+}
+
+.s-title {
+	font-size: 34rpx;
+	font-weight: bold;
+	display: block;
+	margin-bottom: 8rpx;
+	color: #fff;
+	letter-spacing: 4rpx;
+}
+
+.s-subtitle {
+	font-size: 18rpx;
+	color: #666;
+	font-family: 'Arial';
+	text-transform: uppercase;
+}
+
+.s-stats {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	margin-bottom: 40rpx;
+}
+
+.stat-box {
+	text-align: center;
+	flex: 1;
+}
+
+.stat-box .num {
+	font-size: 44rpx;
+	font-weight: 800;
+	color: #FFD700;
+	display: block;
+	margin-bottom: 4rpx;
+}
+
+.stat-box .unit {
+	font-size: 20rpx;
+	margin-left: 4rpx;
+	font-weight: normal;
+}
+
+.stat-box .label {
+	font-size: 22rpx;
+	color: #ababab;
+}
+
+.stat-divider {
+	width: 1rpx;
+	height: 50rpx;
+	background: rgba(255, 255, 255, 0.1);
+}
 
-	.s-stats { display: flex; justify-content: space-between; align-items: center; margin-bottom: 40rpx; }
-	.stat-box { text-align: center; flex: 1; }
-	.stat-box .num { font-size: 44rpx; font-weight: 800; color: #FFD700; display: block; margin-bottom: 4rpx; }
-	.stat-box .unit { font-size: 20rpx; margin-left: 4rpx; font-weight: normal; }
-	.stat-box .label { font-size: 22rpx; color: #ababab; }
-	.stat-divider { width: 1rpx; height: 50rpx; background: rgba(255,255,255,0.1); }
+.s-footer {
+	border-top: 1rpx solid rgba(255, 255, 255, 0.05);
+	padding-top: 30rpx;
+	text-align: center;
+}
 
-	.s-footer { border-top: 1rpx solid rgba(255,255,255,0.05); padding-top: 30rpx; text-align: center; }
-	.s-footer text { font-size: 18rpx; color: #555; letter-spacing: 6rpx; }
+.s-footer text {
+	font-size: 18rpx;
+	color: #555;
+	letter-spacing: 6rpx;
+}
 
-	.safe-bottom-gap { height: 140rpx; }
+.safe-bottom-gap {
+	height: 140rpx;
+}
 </style>

+ 613 - 129
pages/login/index.vue

@@ -23,8 +23,8 @@
 				<view class="agreement-box">
 					<label class="checkbox-label" @click="toggleAgreed">
 						<checkbox :checked="isAgreed" color="#C1001C" style="transform:scale(0.7)" />
-						<text class="agreement-text">我已阅读并同意 
-							<text class="link" @click.stop="showProtocol('user')">《用户协议》</text> 与 
+						<text class="agreement-text">我已阅读并同意
+							<text class="link" @click.stop="showProtocol('user')">《用户协议》</text> 与
 							<text class="link" @click.stop="showProtocol('privacy')">《隐私政策》</text>
 						</text>
 					</label>
@@ -61,9 +61,11 @@
 				<view class="avatar-edit-box">
 					<!-- 使用微信原生头像选择能力 -->
 					<button class="avatar-wrapper-btn" open-type="chooseAvatar" @chooseavatar="onChooseAvatar">
-						<image class="current-avatar" :src="userAvatar || 'https://img.icons8.com/color/144/user.png'"></image>
+						<image class="current-avatar"
+							:src="avatarBase64 || '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>
+							<image src="https://img.icons8.com/ios-glyphs/30/999999/camera.png" mode="aspectFit">
+							</image>
 						</view>
 					</button>
 					<text class="edit-hint">点击修改头像</text>
@@ -71,14 +73,15 @@
 				<view class="nickname-edit-box">
 					<text class="label">昵称</text>
 					<!-- 使用微信原生昵称填写能力 -->
-					<input class="nickname-input" type="nickname" :value="userName" placeholder="请输入昵称" @blur="onNicknameBlur" @input="onNicknameChange" />
+					<input class="nickname-input" type="nickname" :value="userName" placeholder="请输入昵称"
+						@blur="onNicknameBlur" @input="onNicknameChange" />
 				</view>
 				<view class="auth-notice-box">
 					<text class="notice-text">授权后,开发者将获得您的头像和昵称,用于展示您的个人资料。</text>
 				</view>
 			</view>
 			<view class="bottom-action">
-				<button class="confirm-btn-fixed" @click="activeModal = 'phone'">确定</button>
+				<button class="confirm-btn-fixed" @click="goToPhoneAuth">确定</button>
 			</view>
 		</view>
 
@@ -92,7 +95,7 @@
 				<text class="p-title">获取您的手机号</text>
 				<view class="p-number-card">
 					<view class="p-card-left">
-						<text class="p-real-num">138****8888</text>
+						<text class="p-real-num">{{ phoneNumber || '获取中...' }}</text>
 						<text class="p-num-hint">微信绑定号码</text>
 					</view>
 					<icon type="success" size="18" color="#C1001C" />
@@ -101,7 +104,8 @@
 			</view>
 			<view class="p-footer-btns">
 				<button class="p-btn-fixed p-deny" @click="activeModal = ''">拒绝</button>
-				<button class="p-btn-fixed p-allow" @click="completeLogin">允许</button>
+				<button class="p-btn-fixed p-allow" open-type="getPhoneNumber"
+					@getphonenumber="handleGetPhoneNumber">允许</button>
 			</view>
 		</view>
 
@@ -124,133 +128,613 @@
 </template>
 
 <script>
-	import assets from '@/utils/assets.js';
-	export default {
-		data() {
-			return {
-				assets, isAgreed: false, activeModal: '', 
-				userAvatar: '', userName: '微信用户',
-				currentProtocol: { title: '', content: '' },
-				protocols: {
-					user: { title: '用户服务协议', content: '<div style="line-height:1.8;"><h4 style="margin-bottom:10px;">服务内容</h4><p>欢迎使用ERP系统,我们将为您提供高效的下单管理服务。本协议旨在明确双方权利与义务...</p></div>' },
-					privacy: { title: '隐私政策', content: '<div style="line-height:1.8;"><h4 style="margin-bottom:10px;">隐私保护</h4><p>我们非常重视您的个人信息保护。我们会按照法律法规要求,采取相应的安全保护措施...</p></div>' }
-				}
-			}
-		},
-		methods: {
-			toggleAgreed() { this.isAgreed = !this.isAgreed; },
-			startLoginFlow() {
-				if (!this.isAgreed) this.activeModal = 'confirm';
-				else this.activeModal = 'profile';
+import assets from '@/utils/assets.js';
+import { getAgreement } from '@/api/system/agreement.js';
+import { wechatLogin, getWechatPhone, wechatRegister } from '@/api/auth/index.js';
+export default {
+	data() {
+		return {
+			assets, isAgreed: false, activeModal: '',
+			avatarBase64: '', userName: '微信用户',
+			currentProtocol: { title: '', content: '' },
+			protocols: {
+				user: { title: '', content: '' },
+				privacy: { title: '', content: '' }
 			},
-			agreeAndClose() {
-				this.isAgreed = true;
-				this.activeModal = '';
-			},
-			completeLogin() {
+			openId: '',
+			unionId: '',
+			phoneNumber: ''
+		}
+	},
+	methods: {
+		toggleAgreed() { this.isAgreed = !this.isAgreed; },
+		startLoginFlow() {
+			if (!this.isAgreed) this.activeModal = 'confirm';
+			else this.performLogin();
+		},
+		agreeAndClose() {
+			this.isAgreed = true;
+			this.activeModal = '';
+		},
+		async performLogin() {
+			try {
 				uni.showLoading({ title: '登录中...' });
-				uni.setStorageSync('isLogin', true);
-				setTimeout(() => {
+
+				const loginRes = await new Promise((resolve, reject) => {
+					wx.login({
+						success: resolve,
+						fail: reject
+					});
+				});
+
+				if (!loginRes.code) {
 					uni.hideLoading();
-					this.activeModal = '';
-					uni.reLaunch({ url: '/pages/order/index' });
-				}, 1000);
-			},
-			onChooseAvatar(e) {
-				this.userAvatar = e.detail.avatarUrl;
-				// 这里通常需要将临时路径上传到服务器
-			},
-			onNicknameBlur(e) {
-				this.userName = e.detail.value;
-			},
-			onNicknameChange(e) {
-				this.userName = e.detail.value;
-			},
-			showProtocol(type) { this.currentProtocol = this.protocols[type]; this.activeModal = 'protocol'; },
-			closeAllModals() { this.activeModal = ''; }
+					uni.showToast({ title: '获取登录凭证失败', icon: 'none' });
+					return;
+				}
+
+				const res = await wechatLogin({ loginCode: loginRes.code });
+
+				uni.hideLoading();
+
+				if (res.data && res.data.accessToken) {
+					uni.setStorageSync('token', res.data.accessToken);
+					uni.setStorageSync('isLogin', true);
+					uni.showToast({ title: '登录成功', icon: 'success' });
+					setTimeout(() => {
+						uni.reLaunch({ url: '/pages/order/index' });
+					}, 1000);
+				} else if (res.data && res.data.openid) {
+					this.openId = res.data.openid;
+					this.unionId = res.data.unionid || '';
+					this.activeModal = 'profile';
+				} else {
+					uni.showToast({ title: '登录失败', icon: 'none' });
+				}
+			} catch (error) {
+				uni.hideLoading();
+				console.error('登录错误:', error);
+				uni.showToast({ title: '登录失败,请重试', icon: 'none' });
+			}
+		},
+		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);
+				}
+			});
+		},
+		onNicknameBlur(e) {
+			this.userName = e.detail.value;
+			console.log('[微信信息] 昵称(blur):', this.userName);
+		},
+		onNicknameChange(e) {
+			this.userName = e.detail.value;
+			console.log('[微信信息] 昵称(input):', this.userName);
+		},
+		async goToPhoneAuth() {
+			this.phoneNumber = '';
+			this.activeModal = 'phone';
+		},
+		async handleGetPhoneNumber(e) {
+			if (e.detail.errMsg !== 'getPhoneNumber:ok') {
+				uni.showToast({ title: '获取手机号失败,请重试', icon: 'none' });
+				return;
+			}
+
+			try {
+				uni.showLoading({ title: '获取手机号中...' });
+
+				const phoneRes = await getWechatPhone({
+					phoneCode: e.detail.code,
+					openId: this.openId
+				});
+
+				uni.hideLoading();
+
+				this.phoneNumber = phoneRes.data;
+
+				uni.showLoading({ title: '注册中...' });
+
+				const registerRes = await wechatRegister({
+					openId: this.openId,
+					unionId: this.unionId,
+					phone: this.phoneNumber,
+					nickname: this.userName,
+					avatar: this.avatarBase64
+				});
+
+				uni.hideLoading();
+
+				this.performLogin();
+			} catch (error) {
+				uni.hideLoading();
+				console.error('注册错误:', error);
+				uni.showToast({ title: '注册失败,请重试', icon: 'none' });
+			}
+		},
+		showProtocol(type) {
+			this.currentProtocol = this.protocols[type];
+			this.activeModal = 'protocol';
+		},
+		closeAllModals() { this.activeModal = ''; }
+	},
+	async mounted() {
+		try {
+			const [userRes, privacyRes] = await Promise.all([
+				getAgreement(1),
+				getAgreement(2)
+			]);
+			this.protocols.user = { title: userRes.data.title, content: userRes.data.content };
+			this.protocols.privacy = { title: privacyRes.data.title, content: privacyRes.data.content };
+		} catch (e) {
+			console.error('[协议] 加载失败', e);
 		}
 	}
+}
 </script>
 
 <style scoped>
-	/* 基础容器 */
-	.login-container { width: 100%; min-height: 100vh; background: #fff; position: relative; display: flex; flex-direction: column; }
-	.gradient-bg { position: absolute; top: 0; left: 0; right: 0; height: 600rpx; background: linear-gradient(180deg, rgba(193, 0, 28, 0.12) 0%, rgba(255, 255, 255, 0) 100%); z-index: 1; }
-	.content-wrapper { position: relative; z-index: 2; flex: 1; display: flex; flex-direction: column; padding: 0 80rpx; box-sizing: border-box; }
-	.logo-section { display: flex; flex-direction: column; align-items: center; margin-top: 360rpx; margin-bottom: 120rpx; }
-	.logo-outer { width: 200rpx; height: 200rpx; background: #fff; border-radius: 48rpx; box-shadow: 0 40rpx 80rpx rgba(193, 0, 28, 0.35), 0 10rpx 30rpx rgba(0, 0, 0, 0.1), inset 0 4rpx 10rpx rgba(255,255,255,0.8); display: flex; align-items: center; justify-content: center; overflow: hidden; margin-bottom: 40rpx; }
-	.logo-img { width: 100%; height: 100%; }
-	.app-title { font-size: 48rpx; font-weight: bold; color: #1a1a1a; letter-spacing: 2rpx; }
-	.app-subtitle { font-size: 26rpx; color: #999; margin-top: 10rpx; letter-spacing: 6rpx; }
-	.main-btn { width: 100%; height: 100rpx; background: linear-gradient(135deg, #C1001C 0%, #FF4D4F 100%); border-radius: 50rpx; color: #fff; display: flex; align-items: center; justify-content: center; font-size: 32rpx; font-weight: bold; box-shadow: 0 12rpx 30rpx rgba(193, 0, 28, 0.2); border: none; margin-bottom: 40rpx; }
-	.btn-icon { width: 48rpx; height: 48rpx; margin-right: 16rpx; }
-	.agreement-text { font-size: 24rpx; color: #999; }
-	.link { color: #C1001C; margin: 0 4rpx; font-weight: 500; }
-	.footer-section { margin-top: auto; padding-bottom: 60rpx; text-align: center; font-size: 20rpx; color: #dcdcdc; }
-
-	/* 弹窗通用基础 */
-	.global-mask { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.5); z-index: 998; }
-	.center-card { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 620rpx; background: #fff; border-radius: 32rpx; z-index: 1000; box-shadow: 0 30rpx 80rpx rgba(0,0,0,0.15); padding: 50rpx 40rpx; display: flex; flex-direction: column; }
-	.bottom-pop { position: fixed; bottom: 0; left: 0; right: 0; background: #fff; border-radius: 40rpx 40rpx 0 0; z-index: 1001; padding: 40rpx; padding-bottom: calc(50rpx + env(safe-area-inset-bottom)); box-shadow: 0 -10rpx 40rpx rgba(0,0,0,0.05); }
-
-	/* 按钮对齐辅助 */
-	button { display: flex !important; align-items: center !important; justify-content: center !important; padding: 0 !important; line-height: normal !important; }
-	button::after { border: none; }
-
-	/* 协议拦截弹窗 */
-	.card-title { font-size: 38rpx; font-weight: bold; text-align: center; margin-bottom: 30rpx; }
-	.card-body { font-size: 28rpx; color: #666; line-height: 1.6; text-align: center; margin-bottom: 50rpx; }
-	.card-footer-btns { display: flex; gap: 24rpx; }
-	.btn-item { flex: 1; height: 90rpx; border-radius: 45rpx; font-size: 30rpx; display: flex !important; align-items: center !important; justify-content: center !important; text-align: center; line-height: 90rpx; }
-	.btn-item.cancel { background: #f8f8f8; color: #999; }
-	.btn-item.agree { background: #C1001C; color: #fff; font-weight: bold; }
-
-	/* 协议内容弹窗专项修复 */
-	.p-pop-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 30rpx; }
-	.p-pop-title { font-size: 36rpx; font-weight: bold; color: #1a1a1a; }
-	.p-pop-close { font-size: 48rpx; color: #ccc; padding: 10rpx; }
-	.p-pop-scroll { max-height: 55vh; margin-bottom: 30rpx; }
-	.rich-text-wrapper { padding: 10rpx 0; color: #444; font-size: 28rpx; }
-	.p-pop-footer { padding-top: 20rpx; }
-	.p-pop-btn { width: 100%; height: 90rpx; background: #C1001C; color: #fff; border-radius: 45rpx; font-size: 30rpx; font-weight: bold; }
-
-	/* 头像授权弹窗 */
-	.pop-header-bar { display: flex; justify-content: space-between; align-items: center; margin-bottom: 60rpx; }
-	.pop-cancel { font-size: 30rpx; color: #999; }
-	.pop-main-title { font-size: 32rpx; font-weight: bold; }
-	.pop-done { font-size: 30rpx; color: #C1001C; font-weight: bold; }
-	.profile-edit-content { display: flex; flex-direction: column; align-items: center; }
-	.avatar-wrapper-btn { 
-		width: 170rpx; height: 170rpx; border-radius: 85rpx; background: #f8f8f8; 
-		position: relative; margin-bottom: 24rpx; padding: 0 !important; overflow: visible;
-		display: flex !important; align-items: center; justify-content: center;
-		border: none;
-	}
-	.current-avatar { width: 100%; height: 100%; border-radius: 85rpx; border: 4rpx solid #fff; box-shadow: 0 4rpx 15rpx rgba(0,0,0,0.05); }
-	.camera-icon { 
-		position: absolute; bottom: 0; right: 0; background: #fff; width: 56rpx; height: 56rpx; 
-		border-radius: 28rpx; display: flex; align-items: center; justify-content: center; 
-		box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.12); z-index: 5;
-	}
-	.camera-icon image { width: 30rpx; height: 30rpx; }
-	.edit-hint { font-size: 24rpx; color: #999; margin-bottom: 70rpx; width: 100%; text-align: center; display: block; }
-	.nickname-edit-box { width: 100%; display: flex; align-items: center; padding: 36rpx 0; border-top: 1rpx solid #f0f0f0; border-bottom: 1rpx solid #f0f0f0; margin-bottom: 40rpx; }
-	.nickname-edit-box .label { width: 130rpx; font-size: 32rpx; }
-	.nickname-input { flex: 1; font-size: 32rpx; }
-	.notice-text { font-size: 24rpx; color: #bfbfbf; text-align: center; display: block; margin-bottom: 60rpx; }
-	.confirm-btn-fixed { width: 100%; height: 96rpx; background: #C1001C; color: #fff; border-radius: 16rpx; font-size: 32rpx; font-weight: bold; }
-
-	/* 手机号授权弹窗 */
-	.p-header { display: flex; align-items: center; margin-bottom: 50rpx; }
-	.p-mini-logo { width: 44rpx; height: 44rpx; border-radius: 8rpx; margin-right: 16rpx; }
-	.p-app-name { font-size: 28rpx; color: #7f7f7f; }
-	.p-title { font-size: 40rpx; font-weight: bold; color: #000; margin-bottom: 44rpx; display: block; }
-	.p-number-card { background: #fbfbfb; padding: 36rpx; border-radius: 20rpx; display: flex; justify-content: space-between; align-items: center; margin-bottom: 30rpx; border: 1rpx solid #f0f0f0; }
-	.p-real-num { font-size: 36rpx; font-weight: bold; color: #1a1a1a; display: block; }
-	.p-num-hint { font-size: 24rpx; color: #999; }
-	.p-other-link { font-size: 28rpx; color: #576b95; display: block; margin-bottom: 60rpx; }
-	.p-footer-btns { display: flex; gap: 30rpx; }
-	.p-btn-fixed { flex: 1; height: 96rpx; border-radius: 16rpx; font-size: 32rpx; border: none; }
-	.p-deny { background: #f2f2f2; color: #C1001C; }
-	.p-allow { background: #C1001C; color: #fff; font-weight: bold; }
+/* 基础容器 */
+.login-container {
+	width: 100%;
+	min-height: 100vh;
+	background: #fff;
+	position: relative;
+	display: flex;
+	flex-direction: column;
+}
+
+.gradient-bg {
+	position: absolute;
+	top: 0;
+	left: 0;
+	right: 0;
+	height: 600rpx;
+	background: linear-gradient(180deg, rgba(193, 0, 28, 0.12) 0%, rgba(255, 255, 255, 0) 100%);
+	z-index: 1;
+}
+
+.content-wrapper {
+	position: relative;
+	z-index: 2;
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	padding: 0 80rpx;
+	box-sizing: border-box;
+}
+
+.logo-section {
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	margin-top: 360rpx;
+	margin-bottom: 120rpx;
+}
+
+.logo-outer {
+	width: 200rpx;
+	height: 200rpx;
+	background: #fff;
+	border-radius: 48rpx;
+	box-shadow: 0 40rpx 80rpx rgba(193, 0, 28, 0.35), 0 10rpx 30rpx rgba(0, 0, 0, 0.1), inset 0 4rpx 10rpx rgba(255, 255, 255, 0.8);
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	overflow: hidden;
+	margin-bottom: 40rpx;
+}
+
+.logo-img {
+	width: 100%;
+	height: 100%;
+}
+
+.app-title {
+	font-size: 48rpx;
+	font-weight: bold;
+	color: #1a1a1a;
+	letter-spacing: 2rpx;
+}
+
+.app-subtitle {
+	font-size: 26rpx;
+	color: #999;
+	margin-top: 10rpx;
+	letter-spacing: 6rpx;
+}
+
+.main-btn {
+	width: 100%;
+	height: 100rpx;
+	background: linear-gradient(135deg, #C1001C 0%, #FF4D4F 100%);
+	border-radius: 50rpx;
+	color: #fff;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 32rpx;
+	font-weight: bold;
+	box-shadow: 0 12rpx 30rpx rgba(193, 0, 28, 0.2);
+	border: none;
+	margin-bottom: 40rpx;
+}
+
+.btn-icon {
+	width: 48rpx;
+	height: 48rpx;
+	margin-right: 16rpx;
+}
+
+.agreement-text {
+	font-size: 24rpx;
+	color: #999;
+}
+
+.link {
+	color: #C1001C;
+	margin: 0 4rpx;
+	font-weight: 500;
+}
+
+.footer-section {
+	margin-top: auto;
+	padding-bottom: 60rpx;
+	text-align: center;
+	font-size: 20rpx;
+	color: #dcdcdc;
+}
+
+/* 弹窗通用基础 */
+.global-mask {
+	position: fixed;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	background: rgba(0, 0, 0, 0.5);
+	z-index: 998;
+}
+
+.center-card {
+	position: fixed;
+	top: 50%;
+	left: 50%;
+	transform: translate(-50%, -50%);
+	width: 620rpx;
+	background: #fff;
+	border-radius: 32rpx;
+	z-index: 1000;
+	box-shadow: 0 30rpx 80rpx rgba(0, 0, 0, 0.15);
+	padding: 50rpx 40rpx;
+	display: flex;
+	flex-direction: column;
+}
+
+.bottom-pop {
+	position: fixed;
+	bottom: 0;
+	left: 0;
+	right: 0;
+	background: #fff;
+	border-radius: 40rpx 40rpx 0 0;
+	z-index: 1001;
+	padding: 40rpx;
+	padding-bottom: calc(50rpx + env(safe-area-inset-bottom));
+	box-shadow: 0 -10rpx 40rpx rgba(0, 0, 0, 0.05);
+}
+
+/* 按钮对齐辅助 */
+button {
+	display: flex !important;
+	align-items: center !important;
+	justify-content: center !important;
+	padding: 0 !important;
+	line-height: normal !important;
+}
+
+button::after {
+	border: none;
+}
+
+/* 协议拦截弹窗 */
+.card-title {
+	font-size: 38rpx;
+	font-weight: bold;
+	text-align: center;
+	margin-bottom: 30rpx;
+}
+
+.card-body {
+	font-size: 28rpx;
+	color: #666;
+	line-height: 1.6;
+	text-align: center;
+	margin-bottom: 50rpx;
+}
+
+.card-footer-btns {
+	display: flex;
+	gap: 24rpx;
+}
+
+.btn-item {
+	flex: 1;
+	height: 90rpx;
+	border-radius: 45rpx;
+	font-size: 30rpx;
+	display: flex !important;
+	align-items: center !important;
+	justify-content: center !important;
+	text-align: center;
+	line-height: 90rpx;
+}
+
+.btn-item.cancel {
+	background: #f8f8f8;
+	color: #999;
+}
+
+.btn-item.agree {
+	background: #C1001C;
+	color: #fff;
+	font-weight: bold;
+}
+
+/* 协议内容弹窗专项修复 */
+.p-pop-header {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	margin-bottom: 30rpx;
+}
+
+.p-pop-title {
+	font-size: 36rpx;
+	font-weight: bold;
+	color: #1a1a1a;
+}
+
+.p-pop-close {
+	font-size: 48rpx;
+	color: #ccc;
+	padding: 10rpx;
+}
+
+.p-pop-scroll {
+	max-height: 55vh;
+	margin-bottom: 30rpx;
+}
+
+.rich-text-wrapper {
+	padding: 10rpx 0;
+	color: #444;
+	font-size: 28rpx;
+}
+
+.p-pop-footer {
+	padding-top: 20rpx;
+}
+
+.p-pop-btn {
+	width: 100%;
+	height: 90rpx;
+	background: #C1001C;
+	color: #fff;
+	border-radius: 45rpx;
+	font-size: 30rpx;
+	font-weight: bold;
+}
+
+/* 头像授权弹窗 */
+.pop-header-bar {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	margin-bottom: 60rpx;
+}
+
+.pop-cancel {
+	font-size: 30rpx;
+	color: #999;
+}
+
+.pop-main-title {
+	font-size: 32rpx;
+	font-weight: bold;
+}
+
+.pop-done {
+	font-size: 30rpx;
+	color: #C1001C;
+	font-weight: bold;
+}
+
+.profile-edit-content {
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+}
+
+.avatar-wrapper-btn {
+	width: 170rpx;
+	height: 170rpx;
+	border-radius: 85rpx;
+	background: #f8f8f8;
+	position: relative;
+	margin-bottom: 24rpx;
+	padding: 0 !important;
+	overflow: visible;
+	display: flex !important;
+	align-items: center;
+	justify-content: center;
+	border: none;
+}
+
+.current-avatar {
+	width: 100%;
+	height: 100%;
+	border-radius: 85rpx;
+	border: 4rpx solid #fff;
+	box-shadow: 0 4rpx 15rpx rgba(0, 0, 0, 0.05);
+}
+
+.camera-icon {
+	position: absolute;
+	bottom: 0;
+	right: 0;
+	background: #fff;
+	width: 56rpx;
+	height: 56rpx;
+	border-radius: 28rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.12);
+	z-index: 5;
+}
+
+.camera-icon image {
+	width: 30rpx;
+	height: 30rpx;
+}
+
+.edit-hint {
+	font-size: 24rpx;
+	color: #999;
+	margin-bottom: 70rpx;
+	width: 100%;
+	text-align: center;
+	display: block;
+}
+
+.nickname-edit-box {
+	width: 100%;
+	display: flex;
+	align-items: center;
+	padding: 36rpx 0;
+	border-top: 1rpx solid #f0f0f0;
+	border-bottom: 1rpx solid #f0f0f0;
+	margin-bottom: 40rpx;
+}
+
+.nickname-edit-box .label {
+	width: 130rpx;
+	font-size: 32rpx;
+}
+
+.nickname-input {
+	flex: 1;
+	font-size: 32rpx;
+}
+
+.notice-text {
+	font-size: 24rpx;
+	color: #bfbfbf;
+	text-align: center;
+	display: block;
+	margin-bottom: 60rpx;
+}
+
+.confirm-btn-fixed {
+	width: 100%;
+	height: 96rpx;
+	background: #C1001C;
+	color: #fff;
+	border-radius: 16rpx;
+	font-size: 32rpx;
+	font-weight: bold;
+}
+
+/* 手机号授权弹窗 */
+.p-header {
+	display: flex;
+	align-items: center;
+	margin-bottom: 50rpx;
+}
+
+.p-mini-logo {
+	width: 44rpx;
+	height: 44rpx;
+	border-radius: 8rpx;
+	margin-right: 16rpx;
+}
+
+.p-app-name {
+	font-size: 28rpx;
+	color: #7f7f7f;
+}
+
+.p-title {
+	font-size: 40rpx;
+	font-weight: bold;
+	color: #000;
+	margin-bottom: 44rpx;
+	display: block;
+}
+
+.p-number-card {
+	background: #fbfbfb;
+	padding: 36rpx;
+	border-radius: 20rpx;
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	margin-bottom: 30rpx;
+	border: 1rpx solid #f0f0f0;
+}
+
+.p-real-num {
+	font-size: 36rpx;
+	font-weight: bold;
+	color: #1a1a1a;
+	display: block;
+}
+
+.p-num-hint {
+	font-size: 24rpx;
+	color: #999;
+}
+
+.p-other-link {
+	font-size: 28rpx;
+	color: #576b95;
+	display: block;
+	margin-bottom: 60rpx;
+}
+
+.p-footer-btns {
+	display: flex;
+	gap: 30rpx;
+}
+
+.p-btn-fixed {
+	flex: 1;
+	height: 96rpx;
+	border-radius: 16rpx;
+	font-size: 32rpx;
+	border: none;
+}
+
+.p-deny {
+	background: #f2f2f2;
+	color: #C1001C;
+}
+
+.p-allow {
+	background: #C1001C;
+	color: #fff;
+	font-weight: bold;
+}
 </style>

+ 68 - 54
pages/mine/agreement/index.vue

@@ -1,73 +1,87 @@
 <template>
 	<view class="agreement-page">
-		<!-- 1. 自定义导航栏:解决蓝线 -->
-		<view class="custom-navbar" :style="{ paddingTop: statusBarHeight + 'px' }">
-			<view class="nav-content">
-				<view class="back-area" @click="goBack">
-					<text class="back-arrow"></text>
-				</view>
-				<view class="nav-title">用户协议</view>
-				<view class="right-placeholder"></view>
-			</view>
-		</view>
+		<erp-nav-bar :title="title" />
 
 		<scroll-view scroll-y class="content-scroll" :style="{ height: scrollHeight }">
 			<view class="article-body">
-				<view class="title">ERP 系统用户服务协议</view>
-				<view class="update-time">最近更新日期:2024年04月28日</view>
 				<rich-text :nodes="agreementNodes"></rich-text>
-				<view class="footer-tip">本协议由广东粤铝材实业有限公司负责解释。</view>
 			</view>
 		</scroll-view>
 	</view>
 </template>
 
 <script>
-	export default {
-		data() {
-			return {
-				statusBarHeight: 20,
-				agreementNodes: `
-					<div style="line-height: 1.8; color: #444; font-size: 14px;">
-						<h3 style="color: #000; margin-top: 20px;">1. 账户注册与安全</h3>
-						<p>您必须使用真实手机号进行授权登录。您应对账号下的所有活动负责,严禁将账号转借或转让他人使用。</p>
-						<h3 style="color: #000; margin-top: 20px;">2. 订购规范</h3>
-						<p>用户在提交订单前应核实型号、规格及数量。订单一旦系统确认进入生产环节,不可随意撤回。</p>
-						<h3 style="color: #000; margin-top: 20px;">3. 知识产权</h3>
-						<p>本平台所有技术文档、图纸及界面设计均受法律保护,未经许可不得擅自抓取或仿造。</p>
-					</div>
-				`
-			}
-		},
-		computed: {
-			scrollHeight() {
-				return `calc(100vh - ${this.statusBarHeight + 44}px)`;
-			}
-		},
-		onLoad() {
-			const info = uni.getSystemInfoSync();
-			this.statusBarHeight = info.statusBarHeight;
-		},
-		methods: {
-			goBack() { uni.navigateBack(); }
+import { getAgreement } from '@/api/system/agreement.js';
+import ErpNavBar from '@/components/erp-nav-bar.vue';
+export default {
+	components: { ErpNavBar },
+	data() {
+		return {
+			statusBarHeight: 20,
+			title: '',
+			agreementNodes: ''
+		}
+	},
+	computed: {
+		scrollHeight() {
+			return `calc(100vh - ${this.statusBarHeight + 44}px)`;
 		}
+	},
+	async onLoad() {
+		this.statusBarHeight = uni.getSystemInfoSync().statusBarHeight || 20;
+		try {
+			const res = await getAgreement(1);
+			this.title = res.data.title;
+			this.agreementNodes = res.data.content;
+		} catch (e) {
+			console.error('[用户协议] 加载失败', e);
+		}
+	},
+	methods: {
+		goBack() { uni.navigateBack(); }
 	}
+}
 </script>
 
 <style scoped>
-	.agreement-page { width: 100vw; height: 100vh; background: #ffffff; display: flex; flex-direction: column; }
-	
-	/* 自定义导航栏样式 */
-	.custom-navbar { background: #fff; flex-shrink: 0; }
-	.nav-content { height: 44px; display: flex; align-items: center; justify-content: space-between; padding: 0 30rpx; }
-	.back-area { width: 60rpx; height: 44px; display: flex; align-items: center; }
-	.back-arrow { width: 22rpx; height: 22rpx; border-left: 4rpx solid #333; border-bottom: 4rpx solid #333; transform: rotate(45deg); margin-left: 10rpx; }
-	.nav-title { font-size: 34rpx; font-weight: bold; color: #333; }
-	.right-placeholder { width: 60rpx; }
+.agreement-page {
+	width: 100vw;
+	height: 100vh;
+	background: #ffffff;
+	display: flex;
+	flex-direction: column;
+}
+
+.content-scroll {
+	width: 100%;
+}
+
+.article-body {
+	padding: 40rpx;
+	padding-top: 20rpx;
+}
+
+.title {
+	font-size: 40rpx;
+	font-weight: bold;
+	color: #1a1a1a;
+	margin-bottom: 16rpx;
+	text-align: center;
+}
+
+.update-time {
+	font-size: 24rpx;
+	color: #999;
+	margin-bottom: 40rpx;
+	text-align: center;
+}
 
-	.content-scroll { width: 100%; }
-	.article-body { padding: 40rpx; padding-top: 20rpx; }
-	.title { font-size: 40rpx; font-weight: bold; color: #1a1a1a; margin-bottom: 16rpx; text-align: center; }
-	.update-time { font-size: 24rpx; color: #999; margin-bottom: 40rpx; text-align: center; }
-	.footer-tip { margin-top: 60rpx; padding: 30rpx; background: #f8fafc; font-size: 24rpx; color: #888; text-align: center; }
+.footer-tip {
+	margin-top: 60rpx;
+	padding: 30rpx;
+	background: #f8fafc;
+	font-size: 24rpx;
+	color: #888;
+	text-align: center;
+}
 </style>

+ 284 - 116
pages/mine/complaint/index.vue

@@ -1,15 +1,6 @@
 <template>
 	<view class="complaint-root">
-		<!-- 1. 自定义导航栏 -->
-		<view class="custom-navbar" :style="{ paddingTop: statusBarHeight + 'px' }">
-			<view class="nav-content">
-				<view class="back-area" @click="goBack">
-					<view class="back-arrow"></view>
-				</view>
-				<view class="nav-title">投诉与建议</view>
-				<view class="right-placeholder"></view>
-			</view>
-		</view>
+		<erp-nav-bar title="投诉与建议" />
 
 		<view class="scroll-container">
 			<scroll-view scroll-y class="scroll-content" :show-scrollbar="false">
@@ -18,13 +9,9 @@
 					<view class="section-card">
 						<view class="section-title">反馈类型</view>
 						<view class="type-grid">
-							<view 
-								class="type-item" 
-								v-for="item in types" 
-								:key="item.value"
-								:class="{active: formData.type === item.value}"
-								@click="formData.type = item.value">
-								<text>{{item.label}}</text>
+							<view class="type-item" v-for="item in types" :key="item.value"
+								:class="{ active: formData.type === item.value }" @click="formData.type = item.value">
+								<text>{{ item.label }}</text>
 							</view>
 						</view>
 					</view>
@@ -32,12 +19,9 @@
 					<!-- 3. 问题描述 -->
 					<view class="section-card">
 						<view class="section-title">反馈内容</view>
-						<textarea 
-							class="content-input" 
-							v-model="formData.content"
-							placeholder="请详细描述您遇到的问题或改进建议..."
+						<textarea class="content-input" v-model="formData.content" placeholder="请详细描述您遇到的问题或改进建议..."
 							maxlength="500"></textarea>
-						<view class="word-count">{{formData.content.length}}/500</view>
+						<view class="word-count">{{ formData.content.length }}/500</view>
 					</view>
 
 					<!-- 4. 图片上传 -->
@@ -57,7 +41,7 @@
 						</view>
 					</view>
 				</view>
-				
+
 				<view class="bottom-placeholder"></view>
 			</scroll-view>
 		</view>
@@ -70,107 +54,291 @@
 </template>
 
 <script>
-	export default {
-		data() {
-			return {
-				statusBarHeight: 20,
-				types: [
-					{ label: '系统投诉', value: 'complaint' },
-					{ label: '改进建议', value: 'suggestion' },
-					{ label: '其他反馈', value: 'other' }
-				],
-				formData: {
-					type: 'complaint',
-					content: '',
-					images: []
-				}
+import ErpNavBar from '@/components/erp-nav-bar.vue';
+export default {
+	components: { ErpNavBar },
+	data() {
+		return {
+			types: [
+				{ label: '系统投诉', value: 'complaint' },
+				{ label: '改进建议', value: 'suggestion' },
+				{ label: '其他反馈', value: 'other' }
+			],
+			formData: {
+				type: 'complaint',
+				content: '',
+				images: []
 			}
+		}
+	},
+	computed: {
+		isFormValid() {
+			return this.formData.content && this.formData.content.trim().length >= 5;
+		}
+	},
+	methods: {
+		goBack() { uni.navigateBack(); },
+		chooseImage() {
+			const count = 6 - this.formData.images.length;
+			uni.chooseImage({
+				count: count,
+				sizeType: ['compressed'],
+				success: (res) => {
+					this.formData.images = [...this.formData.images, ...res.tempFilePaths];
+				}
+			});
 		},
-		computed: {
-			isFormValid() {
-				return this.formData.content && this.formData.content.trim().length >= 5;
-			}
+		removeImage(index) {
+			this.formData.images.splice(index, 1);
 		},
-		onLoad() {
-			try {
-				const info = uni.getSystemInfoSync();
-				this.statusBarHeight = info.statusBarHeight || 20;
-			} catch (e) {
-				this.statusBarHeight = 20;
-			}
+		previewImage(index) {
+			uni.previewImage({
+				urls: this.formData.images,
+				current: index
+			});
 		},
-		methods: {
-			goBack() { uni.navigateBack(); },
-			chooseImage() {
-				const count = 6 - this.formData.images.length;
-				uni.chooseImage({
-					count: count,
-					sizeType: ['compressed'],
-					success: (res) => {
-						this.formData.images = [...this.formData.images, ...res.tempFilePaths];
-					}
-				});
-			},
-			removeImage(index) {
-				this.formData.images.splice(index, 1);
-			},
-			previewImage(index) {
-				uni.previewImage({
-					urls: this.formData.images,
-					current: index
-				});
-			},
-			handleSubmit() {
-				uni.showLoading({ title: '提交中' });
+		handleSubmit() {
+			uni.showLoading({ title: '提交中' });
+			setTimeout(() => {
+				uni.hideLoading();
+				uni.showToast({ title: '反馈成功' });
 				setTimeout(() => {
-					uni.hideLoading();
-					uni.showToast({ title: '反馈成功' });
-					setTimeout(() => {
-						uni.navigateBack();
-					}, 1500);
-				}, 1000);
-			}
+					uni.navigateBack();
+				}, 1500);
+			}, 1000);
 		}
 	}
+}
 </script>
 
 <style scoped>
-	.complaint-root { width: 100vw; height: 100vh; background: #f8fafb; display: flex; flex-direction: column; overflow: hidden; }
-	
-	.custom-navbar { background: #fff; width: 100%; flex-shrink: 0; border-bottom: 1rpx solid #f0f0f0; }
-	.nav-content { height: 44px; display: flex; align-items: center; justify-content: space-between; padding: 0 30rpx; }
-	.back-area { width: 60rpx; height: 44px; display: flex; align-items: center; }
-	.back-arrow { width: 22rpx; height: 22rpx; border-left: 4rpx solid #333; border-bottom: 4rpx solid #333; transform: rotate(45deg); margin-left: 10rpx; }
-	.nav-title { font-size: 34rpx; font-weight: bold; color: #333; }
-	.right-placeholder { width: 60rpx; }
-
-	.scroll-container { flex: 1; height: 0; width: 100%; position: relative; }
-	.scroll-content { width: 100%; height: 100%; }
-	.form-body { padding: 30rpx; }
-
-	.section-card { background: #fff; border-radius: 24rpx; padding: 40rpx 30rpx; margin-bottom: 30rpx; box-shadow: 0 4rpx 20rpx rgba(0,0,0,0.02); }
-	.section-title { font-size: 30rpx; font-weight: bold; color: #1a1a1a; margin-bottom: 30rpx; border-left: 8rpx solid #C1001C; padding-left: 20rpx; line-height: 1.2; }
-
-	.type-grid { display: flex; gap: 20rpx; }
-	.type-item { flex: 1; height: 80rpx; background: #f5f6f8; border-radius: 12rpx; display: flex; align-items: center; justify-content: center; font-size: 28rpx; color: #666; border: 2rpx solid #f5f6f8; transition: all 0.2s; }
-	.type-item.active { background: rgba(193, 0, 28, 0.05); color: #C1001C; border-color: #C1001C; font-weight: bold; }
-
-	.content-input { width: 100%; height: 300rpx; background: #f9fafb; border-radius: 16rpx; padding: 24rpx; box-sizing: border-box; font-size: 30rpx; color: #333; }
-	.word-count { text-align: right; font-size: 24rpx; color: #ccc; margin-top: 12rpx; }
-
-	.upload-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20rpx; }
-	.img-item { position: relative; width: 100%; padding-top: 100%; }
-	.img-item image { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border-radius: 16rpx; }
-	.del-btn { position: absolute; top: -10rpx; right: -10rpx; width: 40rpx; height: 40rpx; background: rgba(0,0,0,0.5); border-radius: 50%; display: flex; align-items: center; justify-content: center; z-index: 10; }
-	.close-icon { color: #fff; font-size: 30rpx; line-height: 1; }
-	
-	.add-btn { width: 100%; padding-top: 100%; border: 2rpx dashed #ddd; border-radius: 16rpx; display: flex; flex-direction: column; align-items: center; justify-content: center; position: relative; background: #fcfcfc; }
-	.add-icon { position: absolute; top: 35%; left: 50%; transform: translateX(-50%); font-size: 60rpx; color: #bbb; }
-	.add-txt { position: absolute; bottom: 20%; left: 50%; transform: translateX(-50%); font-size: 22rpx; color: #999; }
-
-	.footer-bar { background: #fff; padding: 30rpx 40rpx calc(30rpx + env(safe-area-inset-bottom)); flex-shrink: 0; border-top: 1rpx solid #f0f0f0; }
-	.submit-btn { width: 100%; height: 96rpx; background: #C1001C; color: #fff; border-radius: 48rpx; display: flex; align-items: center; justify-content: center; font-size: 32rpx; font-weight: bold; border: none; }
-	.submit-btn[disabled] { background: #edb3bb !important; color: rgba(255,255,255,0.6) !important; }
-
-	.bottom-placeholder { height: 40rpx; }
+.complaint-root {
+	width: 100vw;
+	height: 100vh;
+	background: #f8fafb;
+	display: flex;
+	flex-direction: column;
+	overflow: hidden;
+}
+
+.custom-navbar {
+	background: #fff;
+	width: 100%;
+	flex-shrink: 0;
+	border-bottom: 1rpx solid #f0f0f0;
+}
+
+.nav-content {
+	height: 44px;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 0 30rpx;
+}
+
+.back-area {
+	width: 60rpx;
+	height: 44px;
+	display: flex;
+	align-items: center;
+}
+
+.back-arrow {
+	width: 22rpx;
+	height: 22rpx;
+	border-left: 4rpx solid #333;
+	border-bottom: 4rpx solid #333;
+	transform: rotate(45deg);
+	margin-left: 10rpx;
+}
+
+.nav-title {
+	font-size: 34rpx;
+	font-weight: bold;
+	color: #333;
+}
+
+.right-placeholder {
+	width: 60rpx;
+}
+
+.scroll-container {
+	flex: 1;
+	height: 0;
+	width: 100%;
+	position: relative;
+}
+
+.scroll-content {
+	width: 100%;
+	height: 100%;
+}
+
+.form-body {
+	padding: 30rpx;
+}
+
+.section-card {
+	background: #fff;
+	border-radius: 24rpx;
+	padding: 40rpx 30rpx;
+	margin-bottom: 30rpx;
+	box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.02);
+}
+
+.section-title {
+	font-size: 30rpx;
+	font-weight: bold;
+	color: #1a1a1a;
+	margin-bottom: 30rpx;
+	border-left: 8rpx solid #C1001C;
+	padding-left: 20rpx;
+	line-height: 1.2;
+}
+
+.type-grid {
+	display: flex;
+	gap: 20rpx;
+}
+
+.type-item {
+	flex: 1;
+	height: 80rpx;
+	background: #f5f6f8;
+	border-radius: 12rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 28rpx;
+	color: #666;
+	border: 2rpx solid #f5f6f8;
+	transition: all 0.2s;
+}
+
+.type-item.active {
+	background: rgba(193, 0, 28, 0.05);
+	color: #C1001C;
+	border-color: #C1001C;
+	font-weight: bold;
+}
+
+.content-input {
+	width: 100%;
+	height: 300rpx;
+	background: #f9fafb;
+	border-radius: 16rpx;
+	padding: 24rpx;
+	box-sizing: border-box;
+	font-size: 30rpx;
+	color: #333;
+}
+
+.word-count {
+	text-align: right;
+	font-size: 24rpx;
+	color: #ccc;
+	margin-top: 12rpx;
+}
+
+.upload-grid {
+	display: grid;
+	grid-template-columns: repeat(3, 1fr);
+	gap: 20rpx;
+}
+
+.img-item {
+	position: relative;
+	width: 100%;
+	padding-top: 100%;
+}
+
+.img-item image {
+	position: absolute;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	border-radius: 16rpx;
+}
+
+.del-btn {
+	position: absolute;
+	top: -10rpx;
+	right: -10rpx;
+	width: 40rpx;
+	height: 40rpx;
+	background: rgba(0, 0, 0, 0.5);
+	border-radius: 50%;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	z-index: 10;
+}
+
+.close-icon {
+	color: #fff;
+	font-size: 30rpx;
+	line-height: 1;
+}
+
+.add-btn {
+	width: 100%;
+	padding-top: 100%;
+	border: 2rpx dashed #ddd;
+	border-radius: 16rpx;
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	justify-content: center;
+	position: relative;
+	background: #fcfcfc;
+}
+
+.add-icon {
+	position: absolute;
+	top: 35%;
+	left: 50%;
+	transform: translateX(-50%);
+	font-size: 60rpx;
+	color: #bbb;
+}
+
+.add-txt {
+	position: absolute;
+	bottom: 20%;
+	left: 50%;
+	transform: translateX(-50%);
+	font-size: 22rpx;
+	color: #999;
+}
+
+.footer-bar {
+	background: #fff;
+	padding: 30rpx 40rpx calc(30rpx + env(safe-area-inset-bottom));
+	flex-shrink: 0;
+	border-top: 1rpx solid #f0f0f0;
+}
+
+.submit-btn {
+	width: 100%;
+	height: 96rpx;
+	background: #C1001C;
+	color: #fff;
+	border-radius: 48rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 32rpx;
+	font-weight: bold;
+	border: none;
+}
+
+.submit-btn[disabled] {
+	background: #edb3bb !important;
+	color: rgba(255, 255, 255, 0.6) !important;
+}
+
+.bottom-placeholder {
+	height: 40rpx;
+}
 </style>

+ 364 - 155
pages/mine/index.vue

@@ -1,5 +1,6 @@
 <template>
 	<view class="mine-page">
+		<erp-nav-bar title="个人中心" :show-back="false" bg-color="#C1001C" title-color="#ffffff" />
 		<scroll-view class="mine-scroll" scroll-y enable-back-to-top :show-scrollbar="false" :enhanced="true">
 			<!-- 顶部大气定制背景 (带柔和渐变与底部圆角弧度) -->
 			<view class="header-bg-shape">
@@ -11,7 +12,8 @@
 				<!-- 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>
+						<image class="avatar-img" src="https://img.icons8.com/color/144/user.png" mode="aspectFill">
+						</image>
 					</view>
 					<view class="info-box">
 						<text class="nickname">张经理</text>
@@ -29,7 +31,8 @@
 				<!-- 1. 未登录状态卡片 -->
 				<view class="user-card unlogged" v-else @click="goToLogin">
 					<view class="avatar-box gray-avatar">
-						<image class="avatar-img" src="https://img.icons8.com/material-outlined/100/cccccc/user.png" mode="aspectFit"></image>
+						<image class="avatar-img" src="https://img.icons8.com/material-outlined/100/cccccc/user.png"
+							mode="aspectFit"></image>
 					</view>
 					<view class="info-box">
 						<text class="nickname login-hint">未登录</text>
@@ -48,7 +51,8 @@
 						</view>
 					</view>
 					<view class="stat-grid">
-						<view class="stat-item" v-for="(item, index) in orderStates" :key="index" @click="goToOrderList(index + 1)">
+						<view class="stat-item" v-for="(item, index) in orderStates" :key="index"
+							@click="goToOrderList(index + 1)">
 							<image class="stat-icon" :src="item.icon" mode="aspectFit"></image>
 							<text class="stat-label">{{ item.label }}</text>
 						</view>
@@ -57,7 +61,8 @@
 
 				<!-- 3. 功能菜单列表 (线性图标) -->
 				<view class="section-card menu-card">
-					<view class="menu-item" v-for="(menu, index) in menuList" :key="index" @click="handleMenuClick(menu)">
+					<view class="menu-item" v-for="(menu, index) in menuList" :key="index"
+						@click="handleMenuClick(menu)">
 						<view class="menu-left">
 							<image class="menu-icon" :src="menu.icon" mode="aspectFit"></image>
 							<text class="menu-label">{{ menu.label }}</text>
@@ -70,7 +75,7 @@
 				<view class="logout-section" v-if="isLogin">
 					<button class="logout-btn" @click="handleLogout">退出登录</button>
 				</view>
-				
+
 				<view class="bottom-placeholder"></view>
 			</view>
 		</scroll-view>
@@ -80,174 +85,378 @@
 </template>
 
 <script>
-	import ErpTabBar from '@/components/erp-tab-bar.vue';
-	import assets from '@/utils/assets.js';
+import ErpTabBar from '@/components/erp-tab-bar.vue';
+import ErpNavBar from '@/components/erp-nav-bar.vue';
+import assets from '@/utils/assets.js';
 
-	export default {
-		components: {
-			ErpTabBar
+export default {
+	components: { ErpTabBar, ErpNavBar },
+	data() {
+		return {
+			assets,
+			isLogin: false, // 控制登录状态
+			orderStates: [
+				{ label: '待审核', icon: assets.minePendingReview },
+				{ label: '待签批', icon: assets.minePendingSign },
+				{ label: '生产中', icon: assets.mineProducing },
+				{ label: '已完成', icon: assets.mineCompleted }
+			],
+			menuList: [
+				{ label: '用户协议', icon: assets.mineProtocol, id: 'agreement' },
+				{ label: '隐私政策', icon: assets.minePrivacy, id: 'privacy' },
+				{ label: '投诉与建议', icon: assets.mineComplaint, id: 'complaint' },
+				{ label: '联系客服', icon: assets.mineService, id: 'service' }
+			]
+		}
+	},
+	onShow() {
+		// 页面显示时检查登录状态
+		this.isLogin = !!uni.getStorageSync('isLogin');
+	},
+	methods: {
+		goToLogin() {
+			uni.reLaunch({ url: '/pages/login/index' });
 		},
-		data() {
-			return {
-				assets,
-				isLogin: false, // 控制登录状态
-				orderStates: [
-					{ label: '待审核', icon: assets.minePendingReview },
-					{ label: '待签批', icon: assets.minePendingSign },
-					{ label: '生产中', icon: assets.mineProducing },
-					{ label: '已完成', icon: assets.mineCompleted }
-				],
-				menuList: [
-					{ label: '用户协议', icon: assets.mineProtocol, id: 'agreement' },
-					{ label: '隐私政策', icon: assets.minePrivacy, id: 'privacy' },
-					{ label: '投诉与建议', icon: assets.mineComplaint, id: 'complaint' },
-					{ label: '联系客服', icon: assets.mineService, id: 'service' }
-				]
+		// 跳转至设置页面
+		goToSettings() {
+			if (this.isLogin) {
+				uni.navigateTo({
+					url: '/pages/mine/settings/index'
+				});
 			}
 		},
-		onShow() {
-			// 页面显示时检查登录状态
-			this.isLogin = !!uni.getStorageSync('isLogin');
+		// 新增:跳转至订单列表
+		goToOrderList(status) {
+			if (!this.isLogin) {
+				return this.goToLogin();
+			}
+			uni.navigateTo({
+				url: `/pages/order/list/index?tab=${status}`
+			});
 		},
-		methods: {
-			goToLogin() {
-				uni.reLaunch({ url: '/pages/login/index' });
-			},
-			// 跳转至设置页面
-			goToSettings() {
-				if(this.isLogin) {
-					uni.navigateTo({
-						url: '/pages/mine/settings/index'
-					});
-				}
-			},
-			// 新增:跳转至订单列表
-			goToOrderList(status) {
-				if(!this.isLogin) {
-					return this.goToLogin();
+		handleLogout() {
+			uni.showModal({
+				title: '退出提示',
+				content: '确认退出当前账号吗?',
+				confirmColor: '#C1001C',
+				success: (res) => {
+					if (res.confirm) {
+						uni.removeStorageSync('isLogin');
+						this.isLogin = false;
+					}
 				}
-				uni.navigateTo({
-					url: `/pages/order/list/index?tab=${status}`
-				});
-			},
-			handleLogout() {
+			});
+		},
+		// 新增:菜单点击处理
+		handleMenuClick(menu) {
+			if (menu.id === 'agreement') {
+				uni.navigateTo({ url: '/pages/mine/agreement/index' });
+			} else if (menu.id === 'privacy') {
+				uni.navigateTo({ url: '/pages/mine/privacy/index' });
+			} else if (menu.id === 'complaint') {
+				uni.navigateTo({ url: '/pages/mine/complaint/index' });
+			} else if (menu.id === 'service') {
 				uni.showModal({
-					title: '退出提示',
-					content: '确认退出当前账号吗?',
+					title: '联系客服',
+					content: '客服电话:138-8888-8888',
+					confirmText: '立即拨打',
 					confirmColor: '#C1001C',
+					cancelColor: '#999999',
 					success: (res) => {
 						if (res.confirm) {
-							uni.removeStorageSync('isLogin');
-							this.isLogin = false;
+							uni.makePhoneCall({
+								phoneNumber: '13888888888'
+							});
 						}
 					}
 				});
-			},
-			// 新增:菜单点击处理
-			handleMenuClick(menu) {
-				if (menu.id === 'agreement') {
-					uni.navigateTo({ url: '/pages/mine/agreement/index' });
-				} else if (menu.id === 'privacy') {
-					uni.navigateTo({ url: '/pages/mine/privacy/index' });
-				} else if (menu.id === 'complaint') {
-					uni.navigateTo({ url: '/pages/mine/complaint/index' });
-				} else if (menu.id === 'service') {
-					uni.showModal({
-						title: '联系客服',
-						content: '客服电话:138-8888-8888',
-						confirmText: '立即拨打',
-						confirmColor: '#C1001C',
-						cancelColor: '#999999',
-						success: (res) => {
-							if (res.confirm) {
-								uni.makePhoneCall({
-									phoneNumber: '13888888888'
-								});
-							}
-						}
-					});
-				}
 			}
 		}
 	}
+}
 </script>
 
 <style scoped>
-	.mine-page { width: 100%; height: 100vh; background: #f7f8fa; position: relative; display: flex; flex-direction: column; overflow: hidden; }
-	
-	.mine-scroll { width: 100%; height: 100%; }
-	/* 隐藏滚动条 */
-	.mine-scroll ::-webkit-scrollbar { width: 0 !important; height: 0 !important; color: transparent !important; display: none !important; }
-
-	/* 顶部定制背景:高级渐变蓝 + 柔和弧度 */
-	.header-bg-shape {
-		position: absolute;
-		top: 0;
-		left: 0;
-		width: 100%;
-		height: 380rpx;
-		background: linear-gradient(135deg, #C1001C 0%, #FF4D4F 100%);
-		border-bottom-left-radius: 60rpx;
-		border-bottom-right-radius: 60rpx;
-		z-index: 1;
-		box-shadow: 0 10rpx 30rpx rgba(193, 0, 28, 0.15);
-	}
-	.header-bg-gradient {
-		width: 100%;
-		height: 100%;
-		background: linear-gradient(180deg, rgba(255,255,255,0) 0%, rgba(255,255,255,0.1) 100%);
-		border-bottom-left-radius: 60rpx;
-		border-bottom-right-radius: 60rpx;
-	}
+.mine-page {
+	width: 100%;
+	height: 100vh;
+	background: #f7f8fa;
+	position: relative;
+	display: flex;
+	flex-direction: column;
+	overflow: hidden;
+}
+
+.mine-scroll {
+	width: 100%;
+	height: 100%;
+}
+
+/* 隐藏滚动条 */
+.mine-scroll ::-webkit-scrollbar {
+	width: 0 !important;
+	height: 0 !important;
+	color: transparent !important;
+	display: none !important;
+}
+
+/* 顶部定制背景:高级渐变蓝 + 柔和弧度 */
+.header-bg-shape {
+	position: absolute;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 380rpx;
+	background: linear-gradient(135deg, #C1001C 0%, #FF4D4F 100%);
+	border-bottom-left-radius: 60rpx;
+	border-bottom-right-radius: 60rpx;
+	z-index: 1;
+	box-shadow: 0 10rpx 30rpx rgba(193, 0, 28, 0.15);
+}
+
+.header-bg-gradient {
+	width: 100%;
+	height: 100%;
+	background: linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.1) 100%);
+	border-bottom-left-radius: 60rpx;
+	border-bottom-right-radius: 60rpx;
+}
+
+/* 标题栏已恢复为原生,此处仅需正常的容器内边距即可 */
+.content-wrapper {
+	position: relative;
+	z-index: 2;
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	padding: 40rpx 30rpx 0;
+	box-sizing: border-box;
+}
+
+/* 用户信息卡片 */
+.user-card {
+	background: #fff;
+	border-radius: 32rpx;
+	padding: 50rpx 40rpx;
+	display: flex;
+	align-items: center;
+	margin-bottom: 30rpx;
+	margin-top: 20rpx;
+	box-shadow: 0 16rpx 40rpx rgba(0, 0, 0, 0.05);
+}
+
+.user-card.unlogged {
+	cursor: pointer;
+}
+
+.avatar-box {
+	width: 130rpx;
+	height: 130rpx;
+	border-radius: 65rpx;
+	background: #f5f6f7;
+	margin-right: 30rpx;
+	overflow: hidden;
+	border: 4rpx solid #fff;
+	box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.05);
+}
+
+.gray-avatar {
+	background: #f0f0f0;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+
+.avatar-img {
+	width: 100%;
+	height: 100%;
+}
+
+.info-box {
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	justify-content: center;
+}
+
+.nickname {
+	font-size: 40rpx;
+	font-weight: bold;
+	color: #1a1a1a;
+	margin-bottom: 12rpx;
+}
+
+.login-hint {
+	color: #333;
+}
+
+.tags-row {
+	display: flex;
+	align-items: center;
+	margin-bottom: 12rpx;
+}
+
+.customer-tag {
+	font-size: 24rpx;
+	color: #C1001C;
+	background: rgba(193, 0, 28, 0.1);
+	padding: 6rpx 16rpx;
+	border-radius: 8rpx;
+	font-weight: 500;
+}
+
+.phone-text {
+	font-size: 26rpx;
+	color: #999;
+}
+
+/* 设置图标 & 右侧箭头 */
+.settings-btn {
+	width: 60rpx;
+	height: 60rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+
+.settings-icon {
+	width: 44rpx;
+	height: 44rpx;
+	opacity: 0.6;
+}
+
+.arrow-icon-right {
+	width: 24rpx;
+	height: 24rpx;
+	opacity: 0.4;
+}
+
+/* 通用卡片样式 */
+.section-card {
+	background: #fff;
+	border-radius: 24rpx;
+	padding: 40rpx 30rpx;
+	margin-bottom: 30rpx;
+	box-shadow: 0 8rpx 30rpx rgba(0, 0, 0, 0.02);
+}
+
+/* 订单统计区块 */
+.section-header {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	margin-bottom: 40rpx;
+}
+
+.section-title {
+	font-size: 32rpx;
+	font-weight: bold;
+	color: #333;
+}
+
+.more-link {
+	display: flex;
+	align-items: center;
+	font-size: 26rpx;
+	color: #999;
+}
+
+.arrow-icon {
+	width: 20rpx;
+	height: 20rpx;
+	opacity: 0.5;
+	margin-left: 6rpx;
+	position: relative;
+	top: 2rpx;
+}
+
+.stat-grid {
+	display: flex;
+	justify-content: space-around;
+}
+
+.stat-item {
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+}
+
+.stat-icon {
+	width: 56rpx;
+	height: 56rpx;
+	margin-bottom: 16rpx;
+	opacity: 0.8;
+}
+
+.stat-label {
+	font-size: 26rpx;
+	color: #666;
+}
+
+/* 菜单列表区块 */
+.menu-card {
+	padding: 10rpx 30rpx;
+}
+
+.menu-item {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	padding: 36rpx 0;
+	border-bottom: 1rpx solid #f5f6f7;
+}
+
+.menu-item:last-child {
+	border-bottom: none;
+}
+
+.menu-left {
+	display: flex;
+	align-items: center;
+}
+
+.menu-icon {
+	width: 44rpx;
+	height: 44rpx;
+	margin-right: 20rpx;
+	opacity: 0.7;
+}
+
+.menu-label {
+	font-size: 30rpx;
+	color: #333;
+}
+
+/* 退出登录 */
+.logout-section {
+	margin-top: 40rpx;
+}
+
+.logout-btn {
+	width: 100%;
+	height: 96rpx;
+	background: #fff;
+	color: #ff5e5e;
+	border-radius: 24rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 32rpx;
+	font-weight: bold;
+	border: none;
+	box-shadow: 0 4rpx 20rpx rgba(255, 94, 94, 0.05);
+	transition: all 0.2s;
+}
+
+.logout-btn:active {
+	background: #fff0f0;
+}
+
+button::after {
+	border: none;
+}
 
-	/* 标题栏已恢复为原生,此处仅需正常的容器内边距即可 */
-	.content-wrapper { position: relative; z-index: 2; flex: 1; display: flex; flex-direction: column; padding: 40rpx 30rpx 0; box-sizing: border-box; }
-
-	/* 用户信息卡片 */
-	.user-card { background: #fff; border-radius: 32rpx; padding: 50rpx 40rpx; display: flex; align-items: center; margin-bottom: 30rpx; margin-top: 20rpx; box-shadow: 0 16rpx 40rpx rgba(0, 0, 0, 0.05); }
-	.user-card.unlogged { cursor: pointer; }
-	.avatar-box { width: 130rpx; height: 130rpx; border-radius: 65rpx; background: #f5f6f7; margin-right: 30rpx; overflow: hidden; border: 4rpx solid #fff; box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.05); }
-	.gray-avatar { background: #f0f0f0; display: flex; align-items: center; justify-content: center; }
-	.avatar-img { width: 100%; height: 100%; }
-	.info-box { flex: 1; display: flex; flex-direction: column; justify-content: center; }
-	.nickname { font-size: 40rpx; font-weight: bold; color: #1a1a1a; margin-bottom: 12rpx; }
-	.login-hint { color: #333; }
-	.tags-row { display: flex; align-items: center; margin-bottom: 12rpx; }
-	.customer-tag { font-size: 24rpx; color: #C1001C; background: rgba(193, 0, 28, 0.1); padding: 6rpx 16rpx; border-radius: 8rpx; font-weight: 500; }
-	.phone-text { font-size: 26rpx; color: #999; }
-	
-	/* 设置图标 & 右侧箭头 */
-	.settings-btn { width: 60rpx; height: 60rpx; display: flex; align-items: center; justify-content: center; }
-	.settings-icon { width: 44rpx; height: 44rpx; opacity: 0.6; }
-	.arrow-icon-right { width: 24rpx; height: 24rpx; opacity: 0.4; }
-
-	/* 通用卡片样式 */
-	.section-card { background: #fff; border-radius: 24rpx; padding: 40rpx 30rpx; margin-bottom: 30rpx; box-shadow: 0 8rpx 30rpx rgba(0,0,0,0.02); }
-	
-	/* 订单统计区块 */
-	.section-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 40rpx; }
-	.section-title { font-size: 32rpx; font-weight: bold; color: #333; }
-	.more-link { display: flex; align-items: center; font-size: 26rpx; color: #999; }
-	.arrow-icon { width: 20rpx; height: 20rpx; opacity: 0.5; margin-left: 6rpx; position: relative; top: 2rpx; }
-	
-	.stat-grid { display: flex; justify-content: space-around; }
-	.stat-item { display: flex; flex-direction: column; align-items: center; }
-	.stat-icon { width: 56rpx; height: 56rpx; margin-bottom: 16rpx; opacity: 0.8; }
-	.stat-label { font-size: 26rpx; color: #666; }
-
-	/* 菜单列表区块 */
-	.menu-card { padding: 10rpx 30rpx; }
-	.menu-item { display: flex; justify-content: space-between; align-items: center; padding: 36rpx 0; border-bottom: 1rpx solid #f5f6f7; }
-	.menu-item:last-child { border-bottom: none; }
-	.menu-left { display: flex; align-items: center; }
-	.menu-icon { width: 44rpx; height: 44rpx; margin-right: 20rpx; opacity: 0.7; }
-	.menu-label { font-size: 30rpx; color: #333; }
-
-	/* 退出登录 */
-	.logout-section { margin-top: 40rpx; }
-	.logout-btn { width: 100%; height: 96rpx; background: #fff; color: #ff5e5e; border-radius: 24rpx; display: flex; align-items: center; justify-content: center; font-size: 32rpx; font-weight: bold; border: none; box-shadow: 0 4rpx 20rpx rgba(255, 94, 94, 0.05); transition: all 0.2s; }
-	.logout-btn:active { background: #fff0f0; }
-	
-	button::after { border: none; }
-	.bottom-placeholder { height: 180rpx; }
+.bottom-placeholder {
+	height: 180rpx;
+}
 </style>

+ 68 - 52
pages/mine/privacy/index.vue

@@ -1,71 +1,87 @@
 <template>
 	<view class="privacy-page">
-		<!-- 1. 自定义导航栏 -->
-		<view class="custom-navbar" :style="{ paddingTop: statusBarHeight + 'px' }">
-			<view class="nav-content">
-				<view class="back-area" @click="goBack">
-					<text class="back-arrow"></text>
-				</view>
-				<view class="nav-title">隐私政策</view>
-				<view class="right-placeholder"></view>
-			</view>
-		</view>
+		<erp-nav-bar :title="title" />
 
 		<scroll-view scroll-y class="content-scroll" :style="{ height: scrollHeight }">
 			<view class="article-body">
-				<view class="title">ERP 系统隐私政策</view>
-				<view class="update-time">发布日期:2024年04月28日</view>
 				<rich-text :nodes="privacyNodes"></rich-text>
-				<view class="safe-bottom-hint">
-					<text>加密存储 · 严格保密</text>
-				</view>
 			</view>
 		</scroll-view>
 	</view>
 </template>
 
 <script>
-	export default {
-		data() {
-			return {
-				statusBarHeight: 20,
-				privacyNodes: `
-					<div style="line-height: 1.8; color: #444; font-size: 14px;">
-						<h3 style="color: #000; margin-top: 20px;">1. 我们收集的信息</h3>
-						<p>我们仅收集实现业务功能所必需的信息。包括您的登录手机号、企业授权名称、操作日志以及必要业务参数。</p>
-						<h3 style="color: #000; margin-top: 20px;">2. 信息安全保障</h3>
-						<p>我们采用行业标准的加密技术对您的数据进行存储,并建立了严格的内部访问控制体系。</p>
-					</div>
-				`
-			}
-		},
-		computed: {
-			scrollHeight() {
-				return `calc(100vh - ${this.statusBarHeight + 44}px)`;
-			}
-		},
-		onLoad() {
-			const info = uni.getSystemInfoSync();
-			this.statusBarHeight = info.statusBarHeight;
-		},
-		methods: {
-			goBack() { uni.navigateBack(); }
+import { getAgreement } from '@/api/system/agreement.js';
+import ErpNavBar from '@/components/erp-nav-bar.vue';
+export default {
+	components: { ErpNavBar },
+	data() {
+		return {
+			statusBarHeight: 20,
+			title: '',
+			privacyNodes: ''
+		}
+	},
+	computed: {
+		scrollHeight() {
+			return `calc(100vh - ${this.statusBarHeight + 44}px)`;
 		}
+	},
+	async onLoad() {
+		this.statusBarHeight = uni.getSystemInfoSync().statusBarHeight || 20;
+		try {
+			const res = await getAgreement(2);
+			this.title = res.data.title;
+			this.privacyNodes = res.data.content;
+		} catch (e) {
+			console.error('[隐私政策] 加载失败', e);
+		}
+	},
+	methods: {
+		goBack() { uni.navigateBack(); }
 	}
+}
 </script>
 
 <style scoped>
-	.privacy-page { width: 100vw; height: 100vh; background: #ffffff; display: flex; flex-direction: column; }
-	.custom-navbar { background: #fff; flex-shrink: 0; }
-	.nav-content { height: 44px; display: flex; align-items: center; justify-content: space-between; padding: 0 30rpx; }
-	.back-area { width: 60rpx; height: 44px; display: flex; align-items: center; }
-	.back-arrow { width: 22rpx; height: 22rpx; border-left: 4rpx solid #333; border-bottom: 4rpx solid #333; transform: rotate(45deg); margin-left: 10rpx; }
-	.nav-title { font-size: 34rpx; font-weight: bold; color: #333; }
-	.right-placeholder { width: 60rpx; }
+.privacy-page {
+	width: 100vw;
+	height: 100vh;
+	background: #ffffff;
+	display: flex;
+	flex-direction: column;
+}
+
+
+.content-scroll {
+	width: 100%;
+}
+
+.article-body {
+	padding: 40rpx;
+	padding-top: 20rpx;
+}
+
+.title {
+	font-size: 40rpx;
+	font-weight: bold;
+	color: #1a1a1a;
+	margin-bottom: 16rpx;
+	text-align: center;
+}
+
+.update-time {
+	font-size: 24rpx;
+	color: #999;
+	margin-bottom: 40rpx;
+	text-align: center;
+}
 
-	.content-scroll { width: 100%; }
-	.article-body { padding: 40rpx; padding-top: 20rpx; }
-	.title { font-size: 40rpx; font-weight: bold; color: #1a1a1a; margin-bottom: 16rpx; text-align: center; }
-	.update-time { font-size: 24rpx; color: #999; margin-bottom: 40rpx; text-align: center; }
-	.safe-bottom-hint { margin-top: 80rpx; text-align: center; color: #52c41a; font-size: 24rpx; opacity: 0.6; }
+.safe-bottom-hint {
+	margin-top: 80rpx;
+	text-align: center;
+	color: #52c41a;
+	font-size: 24rpx;
+	opacity: 0.6;
+}
 </style>

+ 135 - 85
pages/mine/settings/index.vue

@@ -1,15 +1,6 @@
 <template>
 	<view class="settings-root">
-		<!-- 1. 自定义导航栏:解决蓝线顽疾 -->
-		<view class="custom-navbar" :style="{ paddingTop: statusBarHeight + 'px' }">
-			<view class="nav-content">
-				<view class="back-area" @click="goBack">
-					<text class="back-arrow"></text>
-				</view>
-				<view class="nav-title">个人资料设置</view>
-				<view class="right-placeholder"></view>
-			</view>
-		</view>
+		<erp-nav-bar title="个人资料设置" />
 
 		<!-- 2. 资料列表 -->
 		<view class="settings-list" :style="{ marginTop: '10px' }">
@@ -20,11 +11,11 @@
 					<text class="icon-more"></text>
 				</view>
 			</view>
-			
+
 			<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.nickName }}</text>
 					<text class="icon-more"></text>
 				</view>
 			</view>
@@ -34,13 +25,13 @@
 			<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.phoneNum }}</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.orgName }}</text>
 				</view>
 			</view>
 		</view>
@@ -52,83 +43,142 @@
 </template>
 
 <script>
-	export default {
-		data() {
-			return {
-				statusBarHeight: 20,
-				myInfo: {
-					avatarUrl: 'https://img.icons8.com/clouds/200/manager.png',
-					nickName: '张经理',
-					phoneNum: '138-8888-8888',
-					orgName: '广东粤铝材实业有限公司'
-				}
+import ErpNavBar from '@/components/erp-nav-bar.vue';
+export default {
+	components: { ErpNavBar },
+	data() {
+		return {
+			myInfo: {
+				avatarUrl: 'https://img.icons8.com/clouds/200/manager.png',
+				nickName: '张经理',
+				phoneNum: '138-8888-8888',
+				orgName: '广东粤铝材实业有限公司'
 			}
+		}
+	},
+	methods: {
+		goBack() { uni.navigateBack(); },
+		doChooseImage() {
+			uni.chooseImage({
+				count: 1,
+				success: (res) => {
+					this.myInfo.avatarUrl = res.tempFilePaths[0];
+					uni.showToast({ title: '头像已选好', icon: 'none' });
+				}
+			});
 		},
-		onLoad() {
-			const info = uni.getSystemInfoSync();
-			this.statusBarHeight = info.statusBarHeight;
-		},
-		methods: {
-			goBack() { uni.navigateBack(); },
-			doChooseImage() {
-				uni.chooseImage({
-					count: 1,
-					success: (res) => {
-						this.myInfo.avatarUrl = res.tempFilePaths[0];
-						uni.showToast({ title: '头像已选好', icon: 'none' });
-					}
-				});
-			},
-			doEditName() {
-				uni.showModal({
-					title: '设置昵称',
-					content: this.myInfo.nickName,
-					editable: true,
-					confirmColor: '#C1001C', // 重点修复点:弹窗确认按钮强制采用主题红
-					success: (res) => {
-						if (res.confirm) {
-							this.myInfo.nickName = res.content || '未命名';
-						}
+		doEditName() {
+			uni.showModal({
+				title: '设置昵称',
+				content: this.myInfo.nickName,
+				editable: true,
+				confirmColor: '#C1001C', // 重点修复点:弹窗确认按钮强制采用主题红
+				success: (res) => {
+					if (res.confirm) {
+						this.myInfo.nickName = res.content || '未命名';
 					}
-				});
-			},
-			saveProfile() {
-				uni.showLoading({ title: '保存中' });
-				setTimeout(() => {
-					uni.hideLoading();
-					uni.showToast({ title: '保存成功' });
-					setTimeout(() => { uni.navigateBack(); }, 1200);
-				}, 600);
-			}
+				}
+			});
+		},
+		saveProfile() {
+			uni.showLoading({ title: '保存中' });
+			setTimeout(() => {
+				uni.hideLoading();
+				uni.showToast({ title: '保存成功' });
+				setTimeout(() => { uni.navigateBack(); }, 1200);
+			}, 600);
 		}
 	}
+}
 </script>
 
 <style scoped>
-	.settings-root { width: 100vw; height: 100vh; background: #f8fafb; display: flex; flex-direction: column; }
-	
-	/* 自定义导航栏样式 */
-	.custom-navbar { background: #fff; flex-shrink: 0; }
-	.nav-content { height: 44px; display: flex; align-items: center; justify-content: space-between; padding: 0 30rpx; }
-	.back-area { width: 60rpx; height: 44px; display: flex; align-items: center; }
-	.back-arrow { width: 22rpx; height: 22rpx; border-left: 4rpx solid #333; border-bottom: 4rpx solid #333; transform: rotate(45deg); margin-left: 10rpx; }
-	.nav-title { font-size: 34rpx; font-weight: bold; color: #333; }
-	.right-placeholder { width: 60rpx; }
-
-	.settings-list { background: #fff; padding: 0 40rpx; }
-	.mt-30 { margin-top: 30rpx; }
-	
-	.item-row { display: flex; justify-content: space-between; align-items: center; min-height: 110rpx; border-bottom: 2rpx solid #f9f9f9; }
-	.item-row:last-child { border-bottom: none; }
-	.avatar-row { height: 180rpx; }
-
-	.item-label { font-size: 32rpx; color: #333; }
-	.item-right { display: flex; align-items: center; }
-	.avatar-img { width: 110rpx; height: 110rpx; border-radius: 50%; background: #eee; margin-right: 20rpx; }
-	.item-value { font-size: 30rpx; color: #666; margin-right: 15rpx; }
-	.item-value.readonly { color: #aaa; margin-right: 0; }
-	.icon-more { width: 14rpx; height: 14rpx; border-top: 3rpx solid #ccc; border-right: 3rpx solid #ccc; transform: rotate(45deg); }
-
-	.footer-bar { padding: 40rpx; margin-top: auto; padding-bottom: calc(40rpx + env(safe-area-inset-bottom)); }
-	.btn-confirm { width: 100%; height: 90rpx; background: #C1001C; color: #fff; border-radius: 45rpx; font-size: 32rpx; font-weight: bold; display: flex; align-items: center; justify-content: center; }
+.settings-root {
+	width: 100vw;
+	height: 100vh;
+	background: #f8fafb;
+	display: flex;
+	flex-direction: column;
+}
+
+.settings-list {
+	background: #fff;
+	padding: 0 40rpx;
+}
+
+.mt-30 {
+	margin-top: 30rpx;
+}
+
+.item-row {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	min-height: 110rpx;
+	border-bottom: 2rpx solid #f9f9f9;
+}
+
+.item-row:last-child {
+	border-bottom: none;
+}
+
+.avatar-row {
+	height: 180rpx;
+}
+
+.item-label {
+	font-size: 32rpx;
+	color: #333;
+}
+
+.item-right {
+	display: flex;
+	align-items: center;
+}
+
+.avatar-img {
+	width: 110rpx;
+	height: 110rpx;
+	border-radius: 50%;
+	background: #eee;
+	margin-right: 20rpx;
+}
+
+.item-value {
+	font-size: 30rpx;
+	color: #666;
+	margin-right: 15rpx;
+}
+
+.item-value.readonly {
+	color: #aaa;
+	margin-right: 0;
+}
+
+.icon-more {
+	width: 14rpx;
+	height: 14rpx;
+	border-top: 3rpx solid #ccc;
+	border-right: 3rpx solid #ccc;
+	transform: rotate(45deg);
+}
+
+.footer-bar {
+	padding: 40rpx;
+	margin-top: auto;
+	padding-bottom: calc(40rpx + env(safe-area-inset-bottom));
+}
+
+.btn-confirm {
+	width: 100%;
+	height: 90rpx;
+	background: #C1001C;
+	color: #fff;
+	border-radius: 45rpx;
+	font-size: 32rpx;
+	font-weight: bold;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
 </style>

+ 346 - 130
pages/order/add-model/index.vue

@@ -1,12 +1,10 @@
 <template>
 	<view class="order-container">
-		<scroll-view 
-			:scroll-y="!showTypePicker && !showSurfacePicker && !showPackagePicker" 
-			class="order-scroll" 
-			:show-scrollbar="false"
-			:enhanced="true">
+		<erp-nav-bar title="添加型号" />
+		<scroll-view :scroll-y="!showTypePicker && !showSurfacePicker && !showPackagePicker" class="order-scroll"
+			:show-scrollbar="false" :enhanced="true">
 			<view class="form-content">
-				
+
 				<!-- 模块 1:型材 -->
 				<view class="section-card">
 					<view class="section-header">
@@ -17,7 +15,7 @@
 						<text class="label required">型号</text>
 						<view class="picker-box" @click="openTypePicker">
 							<view class="picker-inner">
-								<view class="picker-val" :class="{placeholder: !formData.type}">
+								<view class="picker-val" :class="{ placeholder: !formData.type }">
 									{{ formData.type || '请选择型号' }}
 								</view>
 								<view class="line-arrow-down"></view>
@@ -27,11 +25,13 @@
 					<view class="row-flex">
 						<view class="half-item">
 							<text class="label">名称</text>
-							<input class="input-box readonly small-font" v-model="formData.name" disabled placeholder="型号名称" />
+							<input class="input-box readonly small-font" v-model="formData.name" disabled
+								placeholder="型号名称" />
 						</view>
 						<view class="half-item">
 							<text class="label">材质</text>
-							<input class="input-box readonly small-font" v-model="formData.material" disabled placeholder="材质" />
+							<input class="input-box readonly small-font" v-model="formData.material" disabled
+								placeholder="材质" />
 						</view>
 					</view>
 				</view>
@@ -46,7 +46,7 @@
 						<text class="label required">表面名称</text>
 						<view class="picker-box" @click="openSurfacePicker">
 							<view class="picker-inner">
-								<view class="picker-val" :class="{placeholder: !formData.surfaceName}">
+								<view class="picker-val" :class="{ placeholder: !formData.surfaceName }">
 									{{ formData.surfaceName || '请选择表面名称' }}
 								</view>
 								<view class="line-arrow-down"></view>
@@ -65,7 +65,7 @@
 						<text class="label required">包装方式</text>
 						<view class="picker-box" @click="openPackagePicker">
 							<view class="picker-inner">
-								<view class="picker-val" :class="{placeholder: !formData.packageMethod}">
+								<view class="picker-val" :class="{ placeholder: !formData.packageMethod }">
 									{{ formData.packageMethod || '请选择包装方式' }}
 								</view>
 								<view class="line-arrow-down"></view>
@@ -91,7 +91,8 @@
 						<view class="half-item">
 							<text class="label required">壁厚</text>
 							<view class="input-wrap">
-								<input class="input-box" type="digit" v-model="formData.wallThickness" placeholder="请输入" />
+								<input class="input-box" type="digit" v-model="formData.wallThickness"
+									placeholder="请输入" />
 								<text class="unit">mm</text>
 							</view>
 						</view>
@@ -106,7 +107,8 @@
 					</view>
 					<view class="form-item no-margin-bottom">
 						<text class="label required">支数</text>
-						<input class="input-box full-width" type="number" v-model="formData.count" placeholder="请输入支付支数" />
+						<input class="input-box full-width" type="number" v-model="formData.count"
+							placeholder="请输入支付支数" />
 					</view>
 				</view>
 
@@ -127,10 +129,11 @@
 					<text class="confirm-text" @click="confirmTypeSelect">确定</text>
 				</view>
 				<scroll-view scroll-y class="item-list">
-					<view class="option-item" v-for="(item, index) in typeList" :key="index" 
-						:class="{active: tempSelectedIndex === index}" @click="selectTypeItem(index)">
-						<text>{{item}}</text>
-						<icon type="success_no_circle" size="16" color="#C1001C" v-if="tempSelectedIndex === index"></icon>
+					<view class="option-item" v-for="(item, index) in typeList" :key="index"
+						:class="{ active: tempSelectedIndex === index }" @click="selectTypeItem(index)">
+						<text>{{ item }}</text>
+						<icon type="success_no_circle" size="16" color="#C1001C" v-if="tempSelectedIndex === index">
+						</icon>
 					</view>
 				</scroll-view>
 			</view>
@@ -145,10 +148,11 @@
 					<text class="confirm-text" @click="confirmSurfaceSelect">确定</text>
 				</view>
 				<scroll-view scroll-y class="item-list">
-					<view class="option-item" v-for="(item, index) in surfaceList" :key="index" 
-						:class="{active: tempSurfaceIndex === index}" @click="selectSurfaceItem(index)">
-						<text>{{item}}</text>
-						<icon type="success_no_circle" size="16" color="#C1001C" v-if="tempSurfaceIndex === index"></icon>
+					<view class="option-item" v-for="(item, index) in surfaceList" :key="index"
+						:class="{ active: tempSurfaceIndex === index }" @click="selectSurfaceItem(index)">
+						<text>{{ item }}</text>
+						<icon type="success_no_circle" size="16" color="#C1001C" v-if="tempSurfaceIndex === index">
+						</icon>
 					</view>
 				</scroll-view>
 			</view>
@@ -163,10 +167,11 @@
 					<text class="confirm-text" @click="confirmPackageSelect">确定</text>
 				</view>
 				<scroll-view scroll-y class="item-list">
-					<view class="option-item" v-for="(item, index) in packageList" :key="index" 
-						:class="{active: tempPackageIndex === index}" @click="selectPackageItem(index)">
-						<text>{{item}}</text>
-						<icon type="success_no_circle" size="16" color="#C1001C" v-if="tempPackageIndex === index"></icon>
+					<view class="option-item" v-for="(item, index) in packageList" :key="index"
+						:class="{ active: tempPackageIndex === index }" @click="selectPackageItem(index)">
+						<text>{{ item }}</text>
+						<icon type="success_no_circle" size="16" color="#C1001C" v-if="tempPackageIndex === index">
+						</icon>
 					</view>
 				</scroll-view>
 			</view>
@@ -176,119 +181,330 @@
 </template>
 
 <script>
-	export default {
-		data() {
-			return {
-				showTypePicker: false, showSurfacePicker: false, showPackagePicker: false,
-				tempSelectedIndex: -1, tempSurfaceIndex: -1, tempPackageIndex: -1,
-				typeList: ['TY0018', 'TY0019', 'TY0020', 'TY0021', 'TY0022', 'TY0023', 'TY0024', 'TY0025', 'TY0026', 'TY0027', 'TY0028'],
-				surfaceList: ['PL坯料', '阳极氧化', '电泳涂漆', '粉末喷涂', '氟碳喷涂', '木纹转印'],
-				packageList: ['不贴膜+3点捆扎', '贴膜+纸箱', '气泡膜包装', '简易编织袋', '木托架包装'],
-				formData: {
-					type: '', name: '', material: '',
-					surfaceName: '', packageMethod: '', length: '',
-					wallThickness: '', count: ''
-				}
+import ErpNavBar from '@/components/erp-nav-bar.vue';
+export default {
+	components: { ErpNavBar },
+	data() {
+		return {
+			showTypePicker: false, showSurfacePicker: false, showPackagePicker: false,
+			tempSelectedIndex: -1, tempSurfaceIndex: -1, tempPackageIndex: -1,
+			typeList: ['TY0018', 'TY0019', 'TY0020', 'TY0021', 'TY0022', 'TY0023', 'TY0024', 'TY0025', 'TY0026', 'TY0027', 'TY0028'],
+			surfaceList: ['PL坯料', '阳极氧化', '电泳涂漆', '粉末喷涂', '氟碳喷涂', '木纹转印'],
+			packageList: ['不贴膜+3点捆扎', '贴膜+纸箱', '气泡膜包装', '简易编织袋', '木托架包装'],
+			formData: {
+				type: '', name: '', material: '',
+				surfaceName: '', packageMethod: '', length: '',
+				wallThickness: '', count: ''
 			}
-		},
-		methods: {
-			openTypePicker() { if (this.formData.type) this.tempSelectedIndex = this.typeList.indexOf(this.formData.type); this.showTypePicker = true; },
-			closeTypePicker() { this.showTypePicker = false; },
-			selectTypeItem(index) { this.tempSelectedIndex = index; },
-			confirmTypeSelect() { if (this.tempSelectedIndex === -1) return; const val = this.typeList[this.tempSelectedIndex]; this.formData.type = val; this.formData.name = '工业铝材'; this.formData.material = (this.tempSelectedIndex % 2 === 0) ? '6063-T5' : '6061-T6'; this.closeTypePicker(); },
-			openSurfacePicker() { if (this.formData.surfaceName) this.tempSurfaceIndex = this.surfaceList.indexOf(this.formData.surfaceName); this.showSurfacePicker = true; },
-			closeSurfacePicker() { this.showSurfacePicker = false; },
-			selectSurfaceItem(index) { this.tempSurfaceIndex = index; },
-			confirmSurfaceSelect() { if (this.tempSurfaceIndex === -1) return; this.formData.surfaceName = this.surfaceList[this.tempSurfaceIndex]; this.closeSurfacePicker(); },
-			openPackagePicker() { if (this.formData.packageMethod) this.tempPackageIndex = this.packageList.indexOf(this.formData.packageMethod); this.showPackagePicker = true; },
-			closePackagePicker() { this.showPackagePicker = false; },
-			selectPackageItem(index) { this.tempPackageIndex = index; },
-			confirmPackageSelect() { if (this.tempPackageIndex === -1) return; this.formData.packageMethod = this.packageList[this.tempPackageIndex]; this.closePackagePicker(); },
-			confirmAddModel() {
-				const fields = [
-					{ key: 'type', label: '型号' },
-					{ key: 'surfaceName', label: '表面名称' },
-					{ key: 'packageMethod', label: '包装方式' },
-					{ key: 'length', label: '长度' },
-					{ key: 'wallThickness', label: '壁厚' },
-					{ key: 'count', label: '支数' }
-				];
-				for (let item of fields) {
-					if (!this.formData[item.key]) {
-						uni.showToast({ title: `请完善项目:${item.label}`, icon: 'none' });
-						return;
-					}
+		}
+	},
+	methods: {
+		openTypePicker() { if (this.formData.type) this.tempSelectedIndex = this.typeList.indexOf(this.formData.type); this.showTypePicker = true; },
+		closeTypePicker() { this.showTypePicker = false; },
+		selectTypeItem(index) { this.tempSelectedIndex = index; },
+		confirmTypeSelect() { if (this.tempSelectedIndex === -1) return; const val = this.typeList[this.tempSelectedIndex]; this.formData.type = val; this.formData.name = '工业铝材'; this.formData.material = (this.tempSelectedIndex % 2 === 0) ? '6063-T5' : '6061-T6'; this.closeTypePicker(); },
+		openSurfacePicker() { if (this.formData.surfaceName) this.tempSurfaceIndex = this.surfaceList.indexOf(this.formData.surfaceName); this.showSurfacePicker = true; },
+		closeSurfacePicker() { this.showSurfacePicker = false; },
+		selectSurfaceItem(index) { this.tempSurfaceIndex = index; },
+		confirmSurfaceSelect() { if (this.tempSurfaceIndex === -1) return; this.formData.surfaceName = this.surfaceList[this.tempSurfaceIndex]; this.closeSurfacePicker(); },
+		openPackagePicker() { if (this.formData.packageMethod) this.tempPackageIndex = this.packageList.indexOf(this.formData.packageMethod); this.showPackagePicker = true; },
+		closePackagePicker() { this.showPackagePicker = false; },
+		selectPackageItem(index) { this.tempPackageIndex = index; },
+		confirmPackageSelect() { if (this.tempPackageIndex === -1) return; this.formData.packageMethod = this.packageList[this.tempPackageIndex]; this.closePackagePicker(); },
+		confirmAddModel() {
+			const fields = [
+				{ key: 'type', label: '型号' },
+				{ key: 'surfaceName', label: '表面名称' },
+				{ key: 'packageMethod', label: '包装方式' },
+				{ key: 'length', label: '长度' },
+				{ key: 'wallThickness', label: '壁厚' },
+				{ key: 'count', label: '支数' }
+			];
+			for (let item of fields) {
+				if (!this.formData[item.key]) {
+					uni.showToast({ title: `请完善项目:${item.label}`, icon: 'none' });
+					return;
 				}
-				uni.$emit('add_order_item', JSON.parse(JSON.stringify(this.formData)));
-				uni.navigateBack();
 			}
+			uni.$emit('add_order_item', JSON.parse(JSON.stringify(this.formData)));
+			uni.navigateBack();
 		}
 	}
+}
 </script>
 
 <style scoped>
-	/deep/ ::-webkit-scrollbar { display: none !important; width: 0 !important; height: 0 !important; }
-	.order-container { width: 100%; height: 100vh; background: #f7f8fa; display: flex; flex-direction: column; overflow: hidden; }
-	.order-scroll { flex: 1; height: 0; }
-	.form-content { 
-		padding: 30rpx; 
-		padding-bottom: calc(180rpx + env(safe-area-inset-bottom)); 
-	}
-	.section-card { background: #fff; border-radius: 24rpx; padding: 30rpx; margin-bottom: 30rpx; box-shadow: 0 4rpx 20rpx rgba(0,0,0,0.02); }
-	.section-header { display: flex; align-items: center; margin-bottom: 40rpx; }
-	.blue-bar { width: 8rpx; height: 32rpx; background: #C1001C; border-radius: 4rpx; margin-right: 16rpx; }
-	.section-title { font-size: 32rpx; font-weight: bold; color: #333; }
-	.form-item { margin-bottom: 40rpx; }
-	.no-margin-bottom { margin-bottom: 0; }
-	.row-flex { display: flex; justify-content: space-between; }
-	.half-item { width: 48%; }
-	.label { font-size: 28rpx; color: #333; margin-bottom: 20rpx; display: block; font-weight: 500; }
-	.label.required::after { content: ' *'; color: #ff4d4f; font-weight: bold; margin-left: 4rpx; }
-	.picker-box { background: #f9fafc; border-radius: 12rpx; height: 100rpx; border: 1rpx solid #eee; display: flex; align-items: center; }
-	.picker-inner { width: 100%; height: 100%; display: flex; align-items: center; justify-content: space-between; padding: 0 30rpx; box-sizing: border-box; }
-	.picker-val { font-size: 30rpx; color: #333; }
-	.picker-val.placeholder { color: #ccc; font-size: 28rpx; }
-	.line-arrow-down { width: 14rpx; height: 14rpx; border-right: 3rpx solid #bbb; border-bottom: 3rpx solid #bbb; transform: rotate(45deg); margin-top: -8rpx; margin-right: 4rpx; }
-	.input-wrap { position: relative; width: 100%; }
-	.input-box { font-size: 30rpx; color: #333; width: 100%; height: 100rpx; background: #f9fafc; border-radius: 12rpx; padding: 0 80rpx 0 30rpx; box-sizing: border-box; border: 1rpx solid #eee; }
-	.input-box.readonly { background: #f8f9fa; color: #666; border-color: #f0f0f0; }
-	.input-box.full-width { padding: 0 30rpx; }
-	.unit { position: absolute; right: 24rpx; top: 50%; transform: translateY(-50%); font-size: 26rpx; color: #999; font-weight: 500; }
-	.small-font { font-size: 26rpx !important; }
-	
-	.fixed-submit-bar { 
-		position: fixed; 
-		bottom: 0; 
-		left: 0; 
-		width: 100%; 
-		background: #fff; 
-		padding: 20rpx 30rpx calc(env(safe-area-inset-bottom) + 20rpx); 
-		box-sizing: border-box; 
-		box-shadow: 0 -10rpx 30rpx rgba(0,0,0,0.05);
-		z-index: 100;
+/deep/ ::-webkit-scrollbar {
+	display: none !important;
+	width: 0 !important;
+	height: 0 !important;
+}
+
+.order-container {
+	width: 100%;
+	height: 100vh;
+	background: #f7f8fa;
+	display: flex;
+	flex-direction: column;
+	overflow: hidden;
+}
+
+.order-scroll {
+	flex: 1;
+	height: 0;
+}
+
+.form-content {
+	padding: 30rpx;
+	padding-bottom: calc(180rpx + env(safe-area-inset-bottom));
+}
+
+.section-card {
+	background: #fff;
+	border-radius: 24rpx;
+	padding: 30rpx;
+	margin-bottom: 30rpx;
+	box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.02);
+}
+
+.section-header {
+	display: flex;
+	align-items: center;
+	margin-bottom: 40rpx;
+}
+
+.blue-bar {
+	width: 8rpx;
+	height: 32rpx;
+	background: #C1001C;
+	border-radius: 4rpx;
+	margin-right: 16rpx;
+}
+
+.section-title {
+	font-size: 32rpx;
+	font-weight: bold;
+	color: #333;
+}
+
+.form-item {
+	margin-bottom: 40rpx;
+}
+
+.no-margin-bottom {
+	margin-bottom: 0;
+}
+
+.row-flex {
+	display: flex;
+	justify-content: space-between;
+}
+
+.half-item {
+	width: 48%;
+}
+
+.label {
+	font-size: 28rpx;
+	color: #333;
+	margin-bottom: 20rpx;
+	display: block;
+	font-weight: 500;
+}
+
+.label.required::after {
+	content: ' *';
+	color: #ff4d4f;
+	font-weight: bold;
+	margin-left: 4rpx;
+}
+
+.picker-box {
+	background: #f9fafc;
+	border-radius: 12rpx;
+	height: 100rpx;
+	border: 1rpx solid #eee;
+	display: flex;
+	align-items: center;
+}
+
+.picker-inner {
+	width: 100%;
+	height: 100%;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 0 30rpx;
+	box-sizing: border-box;
+}
+
+.picker-val {
+	font-size: 30rpx;
+	color: #333;
+}
+
+.picker-val.placeholder {
+	color: #ccc;
+	font-size: 28rpx;
+}
+
+.line-arrow-down {
+	width: 14rpx;
+	height: 14rpx;
+	border-right: 3rpx solid #bbb;
+	border-bottom: 3rpx solid #bbb;
+	transform: rotate(45deg);
+	margin-top: -8rpx;
+	margin-right: 4rpx;
+}
+
+.input-wrap {
+	position: relative;
+	width: 100%;
+}
+
+.input-box {
+	font-size: 30rpx;
+	color: #333;
+	width: 100%;
+	height: 100rpx;
+	background: #f9fafc;
+	border-radius: 12rpx;
+	padding: 0 80rpx 0 30rpx;
+	box-sizing: border-box;
+	border: 1rpx solid #eee;
+}
+
+.input-box.readonly {
+	background: #f8f9fa;
+	color: #666;
+	border-color: #f0f0f0;
+}
+
+.input-box.full-width {
+	padding: 0 30rpx;
+}
+
+.unit {
+	position: absolute;
+	right: 24rpx;
+	top: 50%;
+	transform: translateY(-50%);
+	font-size: 26rpx;
+	color: #999;
+	font-weight: 500;
+}
+
+.small-font {
+	font-size: 26rpx !important;
+}
+
+.fixed-submit-bar {
+	position: fixed;
+	bottom: 0;
+	left: 0;
+	width: 100%;
+	background: #fff;
+	padding: 20rpx 30rpx calc(env(safe-area-inset-bottom) + 20rpx);
+	box-sizing: border-box;
+	box-shadow: 0 -10rpx 30rpx rgba(0, 0, 0, 0.05);
+	z-index: 100;
+}
+
+.submit-btn {
+	background: #C1001C;
+	color: #fff;
+	height: 100rpx;
+	border-radius: 50rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 34rpx;
+	font-weight: bold;
+	border: none;
+}
+
+.submit-btn:active {
+	opacity: 0.9;
+	transform: scale(0.98);
+}
+
+.custom-picker-mask {
+	position: fixed;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	background: rgba(0, 0, 0, 0.4);
+	z-index: 1000;
+	display: flex;
+	align-items: flex-end;
+}
+
+.picker-popup {
+	width: 100%;
+	background: #fff;
+	border-radius: 32rpx 32rpx 0 0;
+	padding-bottom: calc(env(safe-area-inset-bottom) + 20rpx);
+	animation: slideUp 0.15s ease-out;
+}
+
+@keyframes slideUp {
+	from {
+		transform: translateY(100%);
 	}
-	.submit-btn { 
-		background: #C1001C; 
-		color: #fff; 
-		height: 100rpx; 
-		border-radius: 50rpx; 
-		display: flex; 
-		align-items: center; 
-		justify-content: center; 
-		font-size: 34rpx; 
-		font-weight: bold; 
-		border: none; 
+
+	to {
+		transform: translateY(0);
 	}
-	.submit-btn:active { opacity: 0.9; transform: scale(0.98); }
-	.custom-picker-mask { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.4); z-index: 1000; display: flex; align-items: flex-end; }
-	.picker-popup { width: 100%; background: #fff; border-radius: 32rpx 32rpx 0 0; padding-bottom: calc(env(safe-area-inset-bottom) + 20rpx); animation: slideUp 0.15s ease-out; }
-	@keyframes slideUp { from { transform: translateY(100%); } to { transform: translateY(0); } }
-	.popup-header { display: flex; justify-content: space-between; align-items: center; padding: 30rpx 40rpx; border-bottom: 1rpx solid #f0f0f0; }
-	.popup-title { font-size: 32rpx; font-weight: bold; color: #333; }
-	.cancel-text, .confirm-text { font-size: 30rpx; padding: 10rpx; }
-	.confirm-text { color: #C1001C; font-weight: bold; }
-	.item-list { max-height: 50vh; padding: 0 40rpx; }
-	.option-item { height: 110rpx; display: flex; align-items: center; justify-content: space-between; border-bottom: 1rpx solid #f8f8f8; font-size: 32rpx; color: #333; }
-	.option-item.active { color: #C1001C; font-weight: bold; }
-	.bottom-placeholder { height: 60rpx; }
+}
+
+.popup-header {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	padding: 30rpx 40rpx;
+	border-bottom: 1rpx solid #f0f0f0;
+}
+
+.popup-title {
+	font-size: 32rpx;
+	font-weight: bold;
+	color: #333;
+}
+
+.cancel-text,
+.confirm-text {
+	font-size: 30rpx;
+	padding: 10rpx;
+}
+
+.confirm-text {
+	color: #C1001C;
+	font-weight: bold;
+}
+
+.item-list {
+	max-height: 50vh;
+	padding: 0 40rpx;
+}
+
+.option-item {
+	height: 110rpx;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	border-bottom: 1rpx solid #f8f8f8;
+	font-size: 32rpx;
+	color: #333;
+}
+
+.option-item.active {
+	color: #C1001C;
+	font-weight: bold;
+}
+
+.bottom-placeholder {
+	height: 60rpx;
+}
 </style>

+ 287 - 153
pages/order/detail/index.vue

@@ -1,22 +1,13 @@
 <template>
 	<view class="detail-page-container">
-		<!-- 1. 顶部自定义导航栏:白色背景 + 黑色文字 -->
-		<view class="white-nav-section" :style="{ paddingTop: statusBarHeight + 'px' }">
-			<view class="custom-nav-bar">
-				<view class="back-icon" @click="goBack">
-					<view class="arrow-left"></view>
-				</view>
-				<text class="nav-title">订单详情</text>
-				<view class="placeholder-right"></view>
-			</view>
-		</view>
+		<erp-nav-bar title="订单详情" />
 
 		<!-- 2. 状态横幅区域:不再包含状态栏边距 -->
 		<view class="status-banner-container" :class="order.statusType" id="nav-header">
 			<view class="status-banner-content">
 				<view class="header-main">
-					<text class="status-title">{{order.statusName}}</text>
-					<text class="status-sub">{{statusSubText}}</text>
+					<text class="status-title">{{ order.statusName }}</text>
+					<text class="status-sub">{{ statusSubText }}</text>
 				</view>
 				<view class="header-icon-wrap">
 					<view class="status-visual-icon"></view>
@@ -29,34 +20,43 @@
 			<view class="detail-inner-box">
 				<!-- 卡片:规格清单 (支持多个型号展现) -->
 				<view class="model-item-card-inner" v-for="(model, mIdx) in (order.models || [order])" :key="mIdx">
-					<view class="data-group-card" :class="{'first-card': mIdx === 0}">
-						<view class="card-head">规格清单 #{{mIdx + 1}}</view>
-						<view class="data-item"><text class="l">产品型号</text><text class="v bold">{{model.type}}</text></view>
-						<view class="data-item"><text class="l">型号名称</text><text class="v">{{model.typeName || '铝型材主料'}}</text></view>
-						<view class="data-item"><text class="l">型材材质</text><text class="v">{{model.material || '6063-T5'}}</text></view>
+					<view class="data-group-card" :class="{ 'first-card': mIdx === 0 }">
+						<view class="card-head">规格清单 #{{ mIdx + 1 }}</view>
+						<view class="data-item"><text class="l">产品型号</text><text class="v bold">{{ model.type }}</text>
+						</view>
+						<view class="data-item"><text class="l">型号名称</text><text class="v">{{ model.typeName ||
+							'铝型材主料' }}</text></view>
+						<view class="data-item"><text class="l">型材材质</text><text class="v">{{ model.material ||
+							'6063-T5' }}</text></view>
 						<view class="line-split"></view>
-						<view class="data-item"><text class="l">表面处理</text><text class="v">{{model.surface}}</text></view>
-						<view class="data-item"><text class="l">包装方式</text><text class="v">{{model.package || '普通包装'}}</text></view>
+						<view class="data-item"><text class="l">表面处理</text><text class="v">{{ model.surface }}</text>
+						</view>
+						<view class="data-item"><text class="l">包装方式</text><text class="v">{{ model.package ||
+							'普通包装' }}</text></view>
 						<view class="line-split"></view>
-						<view class="data-item"><text class="l">订单长度</text><text class="v">{{model.length}} mm</text></view>
-						<view class="data-item"><text class="l">型材壁厚</text><text class="v">{{model.wallThickness || '1.2'}} mm</text></view>
-						<view class="data-item"><text class="l">需求支数</text><text class="v highlight">{{model.count}} 支</text></view>
+						<view class="data-item"><text class="l">订单长度</text><text class="v">{{ model.length }} mm</text>
+						</view>
+						<view class="data-item"><text class="l">型材壁厚</text><text class="v">{{ model.wallThickness ||
+							'1.2' }} mm</text></view>
+						<view class="data-item"><text class="l">需求支数</text><text class="v highlight">{{ model.count }}
+								支</text></view>
 					</view>
 				</view>
 
 				<!-- 卡片:订单详情 -->
 				<view class="data-group-card shadow-less">
 					<view class="card-head">订单详情</view>
-					<view class="data-item"><text class="l">订单单号</text><text class="v selectable">{{order.orderNo}}</text></view>
+					<view class="data-item"><text class="l">订单单号</text><text class="v selectable">{{ order.orderNo
+					}}</text></view>
 					<!-- 新增:ERP单号 (特定状态下显示) -->
 					<view class="data-item" v-if="[2, 3, 4].includes(order.status)">
 						<text class="l">ERP 单号</text>
-						<text class="v selectable erp-no">{{order.erpNo || 'ERP' + order.orderNo.slice(-8)}}</text>
+						<text class="v selectable erp-no">{{ order.erpNo || 'ERP' + order.orderNo.slice(-8) }}</text>
 					</view>
-					<view class="data-item"><text class="l">下单日期</text><text class="v">{{order.time}}</text></view>
+					<view class="data-item"><text class="l">下单日期</text><text class="v">{{ order.time }}</text></view>
 					<view class="data-item"><text class="l">支付方式</text><text class="v">月结扣款</text></view>
 				</view>
-				
+
 				<!-- 底部占位 -->
 				<view class="list-bottom-placeholder"></view>
 			</view>
@@ -77,139 +77,273 @@
 </template>
 
 <script>
-	export default {
-		data() {
-			return {
-				statusBarHeight: 20,
-				footerHeight: 80, // px
-				headerHeight: 120, // px
-				order: {
-					orderNo: '-',
-					status: 1,
-					statusName: '加载中',
-					statusType: 'pending',
-					models: [],
-					erpNo: '',
-					time: '-'
-				}
-			}
-		},
-		computed: {
-			statusSubText() {
-				const map = {
-					pending: '您的订单已提交,正在排队等待审核...',
-					process: '审核已完成,正在由相关主管签批...',
-					making: '订单已入库排产,工厂正在全力生产中...',
-					finish: '该订单生产已完成并正式入库。',
-					expired: '该订单已由客户主动撤销。'
-				};
-				return map[this.order.statusType] || '订单状态更新中';
-			},
-			scrollHeight() {
-				// 获取系统安全区域
-				const info = uni.getSystemInfoSync();
-				const safeBottom = info.safeAreaInsets ? info.safeAreaInsets.bottom : 0;
-				// 动态计算滚动区高度:屏幕总高 - 顶部高(状态栏+导航栏+横幅) - 底部固定栏(内含安全区)
-				// 顶部高度估算:statusBarHeight + 44(nav) + 120(banner)
-				return `calc(100vh - ${this.statusBarHeight + 164}px - ${80 + safeBottom}px)`;
+import ErpNavBar from '@/components/erp-nav-bar.vue';
+export default {
+	components: { ErpNavBar },
+	data() {
+		return {
+			footerHeight: 80, // px
+			headerHeight: 120, // px
+			order: {
+				orderNo: '-',
+				status: 1,
+				statusName: '加载中',
+				statusType: 'pending',
+				models: [],
+				erpNo: '',
+				time: '-'
 			}
+		}
+	},
+	computed: {
+		statusSubText() {
+			const map = {
+				pending: '您的订单已提交,正在排队等待审核...',
+				process: '审核已完成,正在由相关主管签批...',
+				making: '订单已入库排产,工厂正在全力生产中...',
+				finish: '该订单生产已完成并正式入库。',
+				expired: '该订单已由客户主动撤销。'
+			};
+			return map[this.order.statusType] || '订单状态更新中';
 		},
-		onLoad(options) {
+		scrollHeight() {
+			// 获取系统安全区域
 			const info = uni.getSystemInfoSync();
-			this.statusBarHeight = info.statusBarHeight;
-			
-			if (options.data) {
-				try {
-					this.order = JSON.parse(decodeURIComponent(options.data));
-				} catch(e) { console.error('Data Error'); }
-			}
-		},
-		methods: {
-			goBack() { uni.navigateBack(); },
-			doCancel() {
-				uni.showModal({
-					title: '确认撤销',
-					content: '订单撤销后将流转至已撤销状态,确定吗?',
-					confirmColor: '#ff3b30',
-					success: (res) => {
-						if (res.confirm) {
-							this.order.status = 0;
-							this.order.statusName = '已撤销';
-							this.order.statusType = 'expired';
-							uni.showToast({ title: '撤销成功' });
-						}
-					}
-				});
-			},
-			callSales() { uni.makePhoneCall({ phoneNumber: '13888888888' }); },
-			goHome() { uni.reLaunch({ url: '/pages/order/index' }); }
+			const safeBottom = info.safeAreaInsets ? info.safeAreaInsets.bottom : 0;
+			// 动态计算滚动区高度:屏幕总高 - 顶部高(状态栏+导航栏+横幅) - 底部固定栏(内含安全区)
+			const statusBarHeight = uni.getSystemInfoSync().statusBarHeight || 20;
+			// 顶部高度估算:statusBarHeight + 44(nav) + 120(banner)
+			return `calc(100vh - ${statusBarHeight + 164}px - ${80 + safeBottom}px)`;
+		}
+	},
+	onLoad(options) {
+
+		if (options.data) {
+			try {
+				this.order = JSON.parse(decodeURIComponent(options.data));
+			} catch (e) { console.error('Data Error'); }
 		}
+	},
+	methods: {
+		goBack() { uni.navigateBack(); },
+		doCancel() {
+			uni.showModal({
+				title: '确认撤销',
+				content: '订单撤销后将流转至已撤销状态,确定吗?',
+				confirmColor: '#ff3b30',
+				success: (res) => {
+					if (res.confirm) {
+						this.order.status = 0;
+						this.order.statusName = '已撤销';
+						this.order.statusType = 'expired';
+						uni.showToast({ title: '撤销成功' });
+					}
+				}
+			});
+		},
+		callSales() { uni.makePhoneCall({ phoneNumber: '13888888888' }); },
+		goHome() { uni.reLaunch({ url: '/pages/order/index' }); }
 	}
+}
 </script>
 
 <style scoped>
-	/deep/ ::-webkit-scrollbar { display: none !important; width: 0 !important; height: 0 !important; -webkit-appearance: none; background: transparent; }
-	.detail-page-container { width: 100vw; height: 100vh; background: #f8fbfd; display: flex; flex-direction: column; overflow: hidden; position: relative; }
-
-	.white-nav-section { background: #fff; width: 100%; flex-shrink: 0; }
-	.custom-nav-bar { height: 44px; display: flex; align-items: center; justify-content: space-between; padding: 0 30rpx; }
-	.back-icon { width: 60rpx; height: 44px; display: flex; align-items: center; }
-	.arrow-left { width: 20rpx; height: 20rpx; border-left: 4rpx solid #333; border-bottom: 4rpx solid #333; transform: rotate(45deg); margin-left: 10rpx; }
-	.nav-title { font-size: 34rpx; font-weight: bold; color: #1a1a1a; }
-	.placeholder-right { width: 60rpx; }
-
-	.status-banner-container { color: #fff; flex-shrink: 0; }
-	.status-banner-container.pending { background: linear-gradient(135deg, #C1001C 0%, #FF4D4F 100%); }
-	.status-banner-container.process { background: linear-gradient(135deg, #FF6A00 0%, #EE0979 100%); }
-	.status-banner-container.making { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); }
-	.status-banner-container.finish { background: linear-gradient(135deg, #2af598 0%, #009efd 100%); }
-	.status-banner-container.expired { background: linear-gradient(135deg, #868f96 0%, #596164 100%); }
-
-	/* 状态横幅内容 */
-	.status-banner-content { padding: 40rpx; padding-bottom: 60rpx; display: flex; justify-content: space-between; align-items: center; }
-	.header-main { flex: 1; }
-	.status-title { font-size: 48rpx; font-weight: bold; display: block; margin-bottom: 12rpx; }
-	.status-sub { font-size: 26rpx; opacity: 0.9; }
-	.status-visual-icon { width: 60rpx; height: 60rpx; border: 4rpx solid rgba(255,255,255,0.3); border-radius: 50%; opacity: 0.6; }
-
-	/* 修正:移除负边距,并明确滚动方向 */
-	.main-content-scroll { width: 100%; flex: 1; }
-	.detail-inner-box { padding: 30rpx; padding-top: 10rpx; }
-
-	.data-group-card { background: #fff; border-radius: 30rpx; padding: 40rpx; margin-bottom: 30rpx; box-shadow: 0 4rpx 20rpx rgba(0,0,0,0.02); }
-	/* 第一张卡片增加顶部间隔(红框1优化点) */
-	.first-card { margin-top: 20rpx; }
-	
-	.card-head { font-size: 30rpx; font-weight: bold; color: #333; margin-bottom: 30rpx; border-left: 8rpx solid #C1001C; padding-left: 20rpx; }
-
-	.line-split { height: 1rpx; background: #f5f5f5; margin: 24rpx 0; }
-	.data-item { display: flex; justify-content: space-between; margin-bottom: 24rpx; font-size: 28rpx; align-items: center; }
-	.l { color: #999; }
-	.v { color: #333; font-weight: 500; }
-	.v.bold { font-weight: bold; font-size: 30rpx; }
-	.v.erp-no { color: #C1001C; font-weight: bold; }
-	.v.highlight { color: #ff3b30; font-weight: bold; font-size: 34rpx; }
-
-	.list-bottom-placeholder { height: 260rpx; }
-
-	.detail-action-bar-fixed { 
-		position: fixed; 
-		bottom: 0; 
-		left: 0; 
-		right: 0; 
-		background: #fff; 
-		padding: 30rpx 40rpx; 
-		box-shadow: 0 -10rpx 40rpx rgba(0,0,0,0.04); 
-		z-index: 999; 
-		flex-shrink: 0;
-	}
-	.action-btn-wrap { display: flex; gap: 24rpx; }
-	.action-btn { flex: 1; height: 96rpx; border-radius: 48rpx; display: flex; align-items: center; justify-content: center; font-size: 32rpx; font-weight: bold; }
-	.action-btn.primary { background: #C1001C; color: #fff; border: none; }
-	.action-btn.cancel { background: #fff1f0; color: #ff3b30; border: 1rpx solid #ffccc7; font-weight: normal; }
-	
-	.safe-area-bottom-support { 
-		height: constant(safe-area-inset-bottom); 
-		height: env(safe-area-inset-bottom); 
-	}
+/deep/ ::-webkit-scrollbar {
+	display: none !important;
+	width: 0 !important;
+	height: 0 !important;
+	-webkit-appearance: none;
+	background: transparent;
+}
+
+.detail-page-container {
+	width: 100vw;
+	height: 100vh;
+	background: #f8fbfd;
+	display: flex;
+	flex-direction: column;
+	overflow: hidden;
+	position: relative;
+}
+
+
+.status-banner-container {
+	color: #fff;
+	flex-shrink: 0;
+}
+
+.status-banner-container.pending {
+	background: linear-gradient(135deg, #C1001C 0%, #FF4D4F 100%);
+}
+
+.status-banner-container.process {
+	background: linear-gradient(135deg, #FF6A00 0%, #EE0979 100%);
+}
+
+.status-banner-container.making {
+	background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+}
+
+.status-banner-container.finish {
+	background: linear-gradient(135deg, #2af598 0%, #009efd 100%);
+}
+
+.status-banner-container.expired {
+	background: linear-gradient(135deg, #868f96 0%, #596164 100%);
+}
+
+/* 状态横幅内容 */
+.status-banner-content {
+	padding: 40rpx;
+	padding-bottom: 60rpx;
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+}
+
+.header-main {
+	flex: 1;
+}
+
+.status-title {
+	font-size: 48rpx;
+	font-weight: bold;
+	display: block;
+	margin-bottom: 12rpx;
+}
+
+.status-sub {
+	font-size: 26rpx;
+	opacity: 0.9;
+}
+
+.status-visual-icon {
+	width: 60rpx;
+	height: 60rpx;
+	border: 4rpx solid rgba(255, 255, 255, 0.3);
+	border-radius: 50%;
+	opacity: 0.6;
+}
+
+/* 修正:移除负边距,并明确滚动方向 */
+.main-content-scroll {
+	width: 100%;
+	flex: 1;
+}
+
+.detail-inner-box {
+	padding: 30rpx;
+	padding-top: 10rpx;
+}
+
+.data-group-card {
+	background: #fff;
+	border-radius: 30rpx;
+	padding: 40rpx;
+	margin-bottom: 30rpx;
+	box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.02);
+}
+
+/* 第一张卡片增加顶部间隔(红框1优化点) */
+.first-card {
+	margin-top: 20rpx;
+}
+
+.card-head {
+	font-size: 30rpx;
+	font-weight: bold;
+	color: #333;
+	margin-bottom: 30rpx;
+	border-left: 8rpx solid #C1001C;
+	padding-left: 20rpx;
+}
+
+.line-split {
+	height: 1rpx;
+	background: #f5f5f5;
+	margin: 24rpx 0;
+}
+
+.data-item {
+	display: flex;
+	justify-content: space-between;
+	margin-bottom: 24rpx;
+	font-size: 28rpx;
+	align-items: center;
+}
+
+.l {
+	color: #999;
+}
+
+.v {
+	color: #333;
+	font-weight: 500;
+}
+
+.v.bold {
+	font-weight: bold;
+	font-size: 30rpx;
+}
+
+.v.erp-no {
+	color: #C1001C;
+	font-weight: bold;
+}
+
+.v.highlight {
+	color: #ff3b30;
+	font-weight: bold;
+	font-size: 34rpx;
+}
+
+.list-bottom-placeholder {
+	height: 260rpx;
+}
+
+.detail-action-bar-fixed {
+	position: fixed;
+	bottom: 0;
+	left: 0;
+	right: 0;
+	background: #fff;
+	padding: 30rpx 40rpx;
+	box-shadow: 0 -10rpx 40rpx rgba(0, 0, 0, 0.04);
+	z-index: 999;
+	flex-shrink: 0;
+}
+
+.action-btn-wrap {
+	display: flex;
+	gap: 24rpx;
+}
+
+.action-btn {
+	flex: 1;
+	height: 96rpx;
+	border-radius: 48rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 32rpx;
+	font-weight: bold;
+}
+
+.action-btn.primary {
+	background: #C1001C;
+	color: #fff;
+	border: none;
+}
+
+.action-btn.cancel {
+	background: #fff1f0;
+	color: #ff3b30;
+	border: 1rpx solid #ffccc7;
+	font-weight: normal;
+}
+
+.safe-area-bottom-support {
+	height: constant(safe-area-inset-bottom);
+	height: env(safe-area-inset-bottom);
+}
 </style>

+ 360 - 145
pages/order/edit-model/index.vue

@@ -1,12 +1,9 @@
 <template>
 	<view class="order-container">
-		<scroll-view 
-			scroll-y 
-			class="order-scroll" 
-			:show-scrollbar="false"
-			:enhanced="true">
+		<erp-nav-bar title="编辑型号" />
+		<scroll-view scroll-y class="order-scroll" :show-scrollbar="false" :enhanced="true">
 			<view class="form-content">
-				
+
 				<!-- 模块 1:型材 -->
 				<view class="section-card">
 					<view class="section-header">
@@ -17,7 +14,7 @@
 						<text class="label required">型号</text>
 						<view class="picker-box" @click="openTypePicker">
 							<view class="picker-inner">
-								<view class="picker-val" :class="{placeholder: !formData.type}">
+								<view class="picker-val" :class="{ placeholder: !formData.type }">
 									{{ formData.type || '请选择型号' }}
 								</view>
 								<view class="line-arrow-down"></view>
@@ -27,11 +24,13 @@
 					<view class="row-flex">
 						<view class="half-item">
 							<text class="label">名称</text>
-							<input class="input-box readonly small-font" v-model="formData.name" disabled placeholder="型号名称" />
+							<input class="input-box readonly small-font" v-model="formData.name" disabled
+								placeholder="型号名称" />
 						</view>
 						<view class="half-item">
 							<text class="label">材质</text>
-							<input class="input-box readonly small-font" v-model="formData.material" disabled placeholder="材质" />
+							<input class="input-box readonly small-font" v-model="formData.material" disabled
+								placeholder="材质" />
 						</view>
 					</view>
 				</view>
@@ -46,7 +45,7 @@
 						<text class="label required">表面名称</text>
 						<view class="picker-box" @click="openSurfacePicker">
 							<view class="picker-inner">
-								<view class="picker-val" :class="{placeholder: !formData.surfaceName}">
+								<view class="picker-val" :class="{ placeholder: !formData.surfaceName }">
 									{{ formData.surfaceName || '请选择表面名称' }}
 								</view>
 								<view class="line-arrow-down"></view>
@@ -65,7 +64,7 @@
 						<text class="label required">包装方式</text>
 						<view class="picker-box" @click="openPackagePicker">
 							<view class="picker-inner">
-								<view class="picker-val" :class="{placeholder: !formData.packageMethod}">
+								<view class="picker-val" :class="{ placeholder: !formData.packageMethod }">
 									{{ formData.packageMethod || '请选择包装方式' }}
 								</view>
 								<view class="line-arrow-down"></view>
@@ -91,7 +90,8 @@
 						<view class="half-item">
 							<text class="label required">壁厚</text>
 							<view class="input-wrap">
-								<input class="input-box" type="digit" v-model="formData.wallThickness" placeholder="请输入" />
+								<input class="input-box" type="digit" v-model="formData.wallThickness"
+									placeholder="请输入" />
 								<text class="unit">mm</text>
 							</view>
 						</view>
@@ -106,7 +106,8 @@
 					</view>
 					<view class="form-item no-margin-bottom">
 						<text class="label required">支数</text>
-						<input class="input-box full-width" type="number" v-model="formData.count" placeholder="请输入支付支数" />
+						<input class="input-box full-width" type="number" v-model="formData.count"
+							placeholder="请输入支付支数" />
 					</view>
 				</view>
 
@@ -128,10 +129,11 @@
 					<text class="confirm-text" @click="confirmTypeSelect">确定</text>
 				</view>
 				<scroll-view scroll-y class="item-list">
-					<view class="option-item" v-for="(item, index) in typeList" :key="index" 
-						:class="{active: tempSelectedIndex === index}" @click="selectTypeItem(index)">
-						<text>{{item}}</text>
-						<icon type="success_no_circle" size="16" color="#C1001C" v-if="tempSelectedIndex === index"></icon>
+					<view class="option-item" v-for="(item, index) in typeList" :key="index"
+						:class="{ active: tempSelectedIndex === index }" @click="selectTypeItem(index)">
+						<text>{{ item }}</text>
+						<icon type="success_no_circle" size="16" color="#C1001C" v-if="tempSelectedIndex === index">
+						</icon>
 					</view>
 				</scroll-view>
 			</view>
@@ -146,10 +148,11 @@
 					<text class="confirm-text" @click="confirmSurfaceSelect">确定</text>
 				</view>
 				<scroll-view scroll-y class="item-list">
-					<view class="option-item" v-for="(item, index) in surfaceList" :key="index" 
-						:class="{active: tempSurfaceIndex === index}" @click="selectSurfaceItem(index)">
-						<text>{{item}}</text>
-						<icon type="success_no_circle" size="16" color="#C1001C" v-if="tempSurfaceIndex === index"></icon>
+					<view class="option-item" v-for="(item, index) in surfaceList" :key="index"
+						:class="{ active: tempSurfaceIndex === index }" @click="selectSurfaceItem(index)">
+						<text>{{ item }}</text>
+						<icon type="success_no_circle" size="16" color="#C1001C" v-if="tempSurfaceIndex === index">
+						</icon>
 					</view>
 				</scroll-view>
 			</view>
@@ -164,10 +167,11 @@
 					<text class="confirm-text" @click="confirmPackageSelect">确定</text>
 				</view>
 				<scroll-view scroll-y class="item-list">
-					<view class="option-item" v-for="(item, index) in packageList" :key="index" 
-						:class="{active: tempPackageIndex === index}" @click="selectPackageItem(index)">
-						<text>{{item}}</text>
-						<icon type="success_no_circle" size="16" color="#C1001C" v-if="tempPackageIndex === index"></icon>
+					<view class="option-item" v-for="(item, index) in packageList" :key="index"
+						:class="{ active: tempPackageIndex === index }" @click="selectPackageItem(index)">
+						<text>{{ item }}</text>
+						<icon type="success_no_circle" size="16" color="#C1001C" v-if="tempPackageIndex === index">
+						</icon>
 					</view>
 				</scroll-view>
 			</view>
@@ -177,135 +181,346 @@
 </template>
 
 <script>
-	export default {
-		data() {
-			return {
-				itemIndex: -1,
-				showTypePicker: false, showSurfacePicker: false, showPackagePicker: false,
-				tempSelectedIndex: -1, tempSurfaceIndex: -1, tempPackageIndex: -1,
-				typeList: ['TY0018', 'TY0019', 'TY0020', 'TY0021', 'TY0022', 'TY0023', 'TY0024', 'TY0025', 'TY0026', 'TY0027', 'TY0028'],
-				surfaceList: ['PL坯料', '阳极氧化', '电泳涂漆', '粉末喷涂', '氟碳喷涂', '木纹转印'],
-				packageList: ['不贴膜+3点捆扎', '贴膜+纸箱', '气泡膜包装', '简易编织袋', '木托架包装'],
-				formData: {
-					type: '', name: '', material: '',
-					surfaceName: '', packageMethod: '', length: '',
-					wallThickness: '', count: ''
-				}
+import ErpNavBar from '@/components/erp-nav-bar.vue';
+export default {
+	components: { ErpNavBar },
+	data() {
+		return {
+			itemIndex: -1,
+			showTypePicker: false, showSurfacePicker: false, showPackagePicker: false,
+			tempSelectedIndex: -1, tempSurfaceIndex: -1, tempPackageIndex: -1,
+			typeList: ['TY0018', 'TY0019', 'TY0020', 'TY0021', 'TY0022', 'TY0023', 'TY0024', 'TY0025', 'TY0026', 'TY0027', 'TY0028'],
+			surfaceList: ['PL坯料', '阳极氧化', '电泳涂漆', '粉末喷涂', '氟碳喷涂', '木纹转印'],
+			packageList: ['不贴膜+3点捆扎', '贴膜+纸箱', '气泡膜包装', '简易编织袋', '木托架包装'],
+			formData: {
+				type: '', name: '', material: '',
+				surfaceName: '', packageMethod: '', length: '',
+				wallThickness: '', count: ''
 			}
-		},
-		onLoad(options) {
-			if (options.data) {
-				try {
-					const item = JSON.parse(decodeURIComponent(options.data));
-					this.formData = item;
-					this.itemIndex = parseInt(options.index || -1);
-				} catch (e) {
-					console.error('Data parse error', e);
-				}
+		}
+	},
+	onLoad(options) {
+		if (options.data) {
+			try {
+				const item = JSON.parse(decodeURIComponent(options.data));
+				this.formData = item;
+				this.itemIndex = parseInt(options.index || -1);
+			} catch (e) {
+				console.error('Data parse error', e);
 			}
-		},
-		methods: {
-			openTypePicker() { if (this.formData.type) this.tempSelectedIndex = this.typeList.indexOf(this.formData.type); this.showTypePicker = true; },
-			closeTypePicker() { this.showTypePicker = false; },
-			selectTypeItem(index) { this.tempSelectedIndex = index; },
-			confirmTypeSelect() { if (this.tempSelectedIndex === -1) return; const val = this.typeList[this.tempSelectedIndex]; this.formData.type = val; this.formData.name = '工业铝材'; this.formData.material = (this.tempSelectedIndex % 2 === 0) ? '6063-T5' : '6061-T6'; this.closeTypePicker(); },
-			openSurfacePicker() { if (this.formData.surfaceName) this.tempSurfaceIndex = this.surfaceList.indexOf(this.formData.surfaceName); this.showSurfacePicker = true; },
-			closeSurfacePicker() { this.showSurfacePicker = false; },
-			selectSurfaceItem(index) { this.tempSurfaceIndex = index; },
-			confirmSurfaceSelect() { if (this.tempSurfaceIndex === -1) return; this.formData.surfaceName = this.surfaceList[this.tempSurfaceIndex]; this.closeSurfacePicker(); },
-			openPackagePicker() { if (this.formData.packageMethod) this.tempPackageIndex = this.packageList.indexOf(this.formData.packageMethod); this.showPackagePicker = true; },
-			closePackagePicker() { this.showPackagePicker = false; },
-			selectPackageItem(index) { this.tempPackageIndex = index; },
-			confirmPackageSelect() { if (this.tempPackageIndex === -1) return; this.formData.packageMethod = this.packageList[this.tempPackageIndex]; this.closePackagePicker(); },
-			saveEdit() {
-				const fields = [
-					{ key: 'type', label: '型号' },
-					{ key: 'surfaceName', label: '表面名称' },
-					{ key: 'packageMethod', label: '包装方式' },
-					{ key: 'length', label: '长度' },
-					{ key: 'wallThickness', label: '壁厚' },
-					{ key: 'count', label: '支数' }
-				];
-				for (let item of fields) {
-					if (!this.formData[item.key]) {
-						uni.showToast({ title: `请完善项目:${item.label}`, icon: 'none' });
-						return;
-					}
+		}
+	},
+	methods: {
+		openTypePicker() { if (this.formData.type) this.tempSelectedIndex = this.typeList.indexOf(this.formData.type); this.showTypePicker = true; },
+		closeTypePicker() { this.showTypePicker = false; },
+		selectTypeItem(index) { this.tempSelectedIndex = index; },
+		confirmTypeSelect() { if (this.tempSelectedIndex === -1) return; const val = this.typeList[this.tempSelectedIndex]; this.formData.type = val; this.formData.name = '工业铝材'; this.formData.material = (this.tempSelectedIndex % 2 === 0) ? '6063-T5' : '6061-T6'; this.closeTypePicker(); },
+		openSurfacePicker() { if (this.formData.surfaceName) this.tempSurfaceIndex = this.surfaceList.indexOf(this.formData.surfaceName); this.showSurfacePicker = true; },
+		closeSurfacePicker() { this.showSurfacePicker = false; },
+		selectSurfaceItem(index) { this.tempSurfaceIndex = index; },
+		confirmSurfaceSelect() { if (this.tempSurfaceIndex === -1) return; this.formData.surfaceName = this.surfaceList[this.tempSurfaceIndex]; this.closeSurfacePicker(); },
+		openPackagePicker() { if (this.formData.packageMethod) this.tempPackageIndex = this.packageList.indexOf(this.formData.packageMethod); this.showPackagePicker = true; },
+		closePackagePicker() { this.showPackagePicker = false; },
+		selectPackageItem(index) { this.tempPackageIndex = index; },
+		confirmPackageSelect() { if (this.tempPackageIndex === -1) return; this.formData.packageMethod = this.packageList[this.tempPackageIndex]; this.closePackagePicker(); },
+		saveEdit() {
+			const fields = [
+				{ key: 'type', label: '型号' },
+				{ key: 'surfaceName', label: '表面名称' },
+				{ key: 'packageMethod', label: '包装方式' },
+				{ key: 'length', label: '长度' },
+				{ key: 'wallThickness', label: '壁厚' },
+				{ key: 'count', label: '支数' }
+			];
+			for (let item of fields) {
+				if (!this.formData[item.key]) {
+					uni.showToast({ title: `请完善项目:${item.label}`, icon: 'none' });
+					return;
 				}
-				
-				uni.$emit('update_order_item', {
-					index: this.itemIndex,
-					data: JSON.parse(JSON.stringify(this.formData))
-				});
-				uni.navigateBack();
 			}
+
+			uni.$emit('update_order_item', {
+				index: this.itemIndex,
+				data: JSON.parse(JSON.stringify(this.formData))
+			});
+			uni.navigateBack();
 		}
 	}
+}
 </script>
 
 <style scoped>
-	/deep/ ::-webkit-scrollbar { display: none !important; width: 0 !important; height: 0 !important; }
-	.order-container { width: 100%; height: 100vh; background: #f7f8fa; display: flex; flex-direction: column; overflow: hidden; }
-	.order-scroll { flex: 1; height: 0; }
-	.form-content { 
-		padding: 30rpx; 
-		padding-bottom: calc(180rpx + env(safe-area-inset-bottom)); 
-	}
-	.section-card { background: #fff; border-radius: 24rpx; padding: 30rpx; margin-bottom: 30rpx; box-shadow: 0 4rpx 20rpx rgba(0,0,0,0.02); }
-	.section-header { display: flex; align-items: center; margin-bottom: 40rpx; }
-	.blue-bar { width: 8rpx; height: 32rpx; background: #C1001C; border-radius: 4rpx; margin-right: 16rpx; }
-	.section-title { font-size: 32rpx; font-weight: bold; color: #333; }
-	.form-item { margin-bottom: 40rpx; }
-	.no-margin-bottom { margin-bottom: 0; }
-	.row-flex { display: flex; justify-content: space-between; }
-	.half-item { width: 48%; }
-	.label { font-size: 28rpx; color: #333; margin-bottom: 20rpx; display: block; font-weight: 500; }
-	.label.required::after { content: ' *'; color: #ff4d4f; font-weight: bold; margin-left: 4rpx; }
-	.picker-box { background: #f9fafc; border-radius: 12rpx; height: 100rpx; border: 1rpx solid #eee; display: flex; align-items: center; }
-	.picker-inner { width: 100%; height: 100%; display: flex; align-items: center; justify-content: space-between; padding: 0 30rpx; box-sizing: border-box; }
-	.picker-val { font-size: 30rpx; color: #333; }
-	.picker-val.placeholder { color: #ccc; font-size: 28rpx; }
-	.line-arrow-down { width: 14rpx; height: 14rpx; border-right: 3rpx solid #bbb; border-bottom: 3rpx solid #bbb; transform: rotate(45deg); margin-top: -8rpx; margin-right: 4rpx; }
-	.input-wrap { position: relative; width: 100%; }
-	.input-box { font-size: 30rpx; color: #333; width: 100%; height: 100rpx; background: #f9fafc; border-radius: 12rpx; padding: 0 80rpx 0 30rpx; box-sizing: border-box; border: 1rpx solid #eee; }
-	.input-box.readonly { background: #f8f9fa; color: #666; border-color: #f0f0f0; }
-	.input-box.full-width { padding: 0 30rpx; }
-	.unit { position: absolute; right: 24rpx; top: 50%; transform: translateY(-50%); font-size: 26rpx; color: #999; font-weight: 500; }
-	.small-font { font-size: 26rpx !important; }
-	
-	.fixed-submit-bar { 
-		position: fixed; 
-		bottom: 0; 
-		left: 0; 
-		width: 100%; 
-		background: #fff; 
-		padding: 20rpx 30rpx calc(env(safe-area-inset-bottom) + 20rpx); 
-		box-sizing: border-box; 
-		box-shadow: 0 -10rpx 30rpx rgba(0,0,0,0.05);
-		z-index: 100;
+/deep/ ::-webkit-scrollbar {
+	display: none !important;
+	width: 0 !important;
+	height: 0 !important;
+}
+
+.order-container {
+	width: 100%;
+	height: 100vh;
+	background: #f7f8fa;
+	display: flex;
+	flex-direction: column;
+	overflow: hidden;
+}
+
+.order-scroll {
+	flex: 1;
+	height: 0;
+}
+
+.form-content {
+	padding: 30rpx;
+	padding-bottom: calc(180rpx + env(safe-area-inset-bottom));
+}
+
+.section-card {
+	background: #fff;
+	border-radius: 24rpx;
+	padding: 30rpx;
+	margin-bottom: 30rpx;
+	box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.02);
+}
+
+.section-header {
+	display: flex;
+	align-items: center;
+	margin-bottom: 40rpx;
+}
+
+.blue-bar {
+	width: 8rpx;
+	height: 32rpx;
+	background: #C1001C;
+	border-radius: 4rpx;
+	margin-right: 16rpx;
+}
+
+.section-title {
+	font-size: 32rpx;
+	font-weight: bold;
+	color: #333;
+}
+
+.form-item {
+	margin-bottom: 40rpx;
+}
+
+.no-margin-bottom {
+	margin-bottom: 0;
+}
+
+.row-flex {
+	display: flex;
+	justify-content: space-between;
+}
+
+.half-item {
+	width: 48%;
+}
+
+.label {
+	font-size: 28rpx;
+	color: #333;
+	margin-bottom: 20rpx;
+	display: block;
+	font-weight: 500;
+}
+
+.label.required::after {
+	content: ' *';
+	color: #ff4d4f;
+	font-weight: bold;
+	margin-left: 4rpx;
+}
+
+.picker-box {
+	background: #f9fafc;
+	border-radius: 12rpx;
+	height: 100rpx;
+	border: 1rpx solid #eee;
+	display: flex;
+	align-items: center;
+}
+
+.picker-inner {
+	width: 100%;
+	height: 100%;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 0 30rpx;
+	box-sizing: border-box;
+}
+
+.picker-val {
+	font-size: 30rpx;
+	color: #333;
+}
+
+.picker-val.placeholder {
+	color: #ccc;
+	font-size: 28rpx;
+}
+
+.line-arrow-down {
+	width: 14rpx;
+	height: 14rpx;
+	border-right: 3rpx solid #bbb;
+	border-bottom: 3rpx solid #bbb;
+	transform: rotate(45deg);
+	margin-top: -8rpx;
+	margin-right: 4rpx;
+}
+
+.input-wrap {
+	position: relative;
+	width: 100%;
+}
+
+.input-box {
+	font-size: 30rpx;
+	color: #333;
+	width: 100%;
+	height: 100rpx;
+	background: #f9fafc;
+	border-radius: 12rpx;
+	padding: 0 80rpx 0 30rpx;
+	box-sizing: border-box;
+	border: 1rpx solid #eee;
+}
+
+.input-box.readonly {
+	background: #f8f9fa;
+	color: #666;
+	border-color: #f0f0f0;
+}
+
+.input-box.full-width {
+	padding: 0 30rpx;
+}
+
+.unit {
+	position: absolute;
+	right: 24rpx;
+	top: 50%;
+	transform: translateY(-50%);
+	font-size: 26rpx;
+	color: #999;
+	font-weight: 500;
+}
+
+.small-font {
+	font-size: 26rpx !important;
+}
+
+.fixed-submit-bar {
+	position: fixed;
+	bottom: 0;
+	left: 0;
+	width: 100%;
+	background: #fff;
+	padding: 20rpx 30rpx calc(env(safe-area-inset-bottom) + 20rpx);
+	box-sizing: border-box;
+	box-shadow: 0 -10rpx 30rpx rgba(0, 0, 0, 0.05);
+	z-index: 100;
+}
+
+.submit-btn {
+	background: #C1001C;
+	color: #fff;
+	height: 100rpx;
+	border-radius: 50rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 34rpx;
+	font-weight: bold;
+	border: none;
+}
+
+.submit-btn:active {
+	opacity: 0.9;
+	transform: scale(0.98);
+}
+
+.custom-picker-mask {
+	position: fixed;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	background: rgba(0, 0, 0, 0.4);
+	z-index: 1000;
+	display: flex;
+	align-items: flex-end;
+}
+
+.picker-popup {
+	width: 100%;
+	background: #fff;
+	border-radius: 32rpx 32rpx 0 0;
+	padding-bottom: calc(env(safe-area-inset-bottom) + 20rpx);
+	animation: slideUp 0.15s ease-out;
+}
+
+@keyframes slideUp {
+	from {
+		transform: translateY(100%);
 	}
-	.submit-btn { 
-		background: #C1001C; 
-		color: #fff; 
-		height: 100rpx; 
-		border-radius: 50rpx; 
-		display: flex; 
-		align-items: center; 
-		justify-content: center; 
-		font-size: 34rpx; 
-		font-weight: bold; 
-		border: none; 
+
+	to {
+		transform: translateY(0);
 	}
-	.submit-btn:active { opacity: 0.9; transform: scale(0.98); }
-	.custom-picker-mask { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.4); z-index: 1000; display: flex; align-items: flex-end; }
-	.picker-popup { width: 100%; background: #fff; border-radius: 32rpx 32rpx 0 0; padding-bottom: calc(env(safe-area-inset-bottom) + 20rpx); animation: slideUp 0.15s ease-out; }
-	@keyframes slideUp { from { transform: translateY(100%); } to { transform: translateY(0); } }
-	.popup-header { display: flex; justify-content: space-between; align-items: center; padding: 30rpx 40rpx; border-bottom: 1rpx solid #f0f0f0; }
-	.popup-title { font-size: 32rpx; font-weight: bold; color: #333; }
-	.cancel-text, .confirm-text { font-size: 30rpx; padding: 10rpx; }
-	.confirm-text { color: #C1001C; font-weight: bold; }
-	.item-list { max-height: 50vh; padding: 0 40rpx; }
-	.option-item { height: 110rpx; display: flex; align-items: center; justify-content: space-between; border-bottom: 1rpx solid #f8f8f8; font-size: 32rpx; color: #333; }
-	.option-item.active { color: #C1001C; font-weight: bold; }
-	.bottom-placeholder { height: 60rpx; }
+}
+
+.popup-header {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	padding: 30rpx 40rpx;
+	border-bottom: 1rpx solid #f0f0f0;
+}
+
+.popup-title {
+	font-size: 32rpx;
+	font-weight: bold;
+	color: #333;
+}
+
+.cancel-text,
+.confirm-text {
+	font-size: 30rpx;
+	padding: 10rpx;
+}
+
+.confirm-text {
+	color: #C1001C;
+	font-weight: bold;
+}
+
+.item-list {
+	max-height: 50vh;
+	padding: 0 40rpx;
+}
+
+.option-item {
+	height: 110rpx;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	border-bottom: 1rpx solid #f8f8f8;
+	font-size: 32rpx;
+	color: #333;
+}
+
+.option-item.active {
+	color: #C1001C;
+	font-weight: bold;
+}
+
+.bottom-placeholder {
+	height: 60rpx;
+}
 </style>

+ 473 - 218
pages/order/index.vue

@@ -1,9 +1,11 @@
 <template>
 	<view class="order-container">
+		<erp-nav-bar title="ERP 下单" :show-back="false" />
 		<!-- 1. 待管理员授权状态 -->
 		<view class="auth-waiting-full" v-if="!isAuthorized">
 			<view class="auth-card">
-				<image class="auth-icon" src="https://img.icons8.com/color/192/hourglass-sand-top.png" mode="aspectFit"></image>
+				<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>
@@ -13,44 +15,42 @@
 
 		<!-- 2. 已授权状态:已选型号列表 (参考草图2) -->
 		<template v-else>
-			<scroll-view 
-				scroll-y 
-				class="order-scroll-list" 
-				:show-scrollbar="false"
-				:enhanced="true">
+			<scroll-view scroll-y class="order-scroll-list" :show-scrollbar="false" :enhanced="true">
 				<view class="list-wrapper">
 					<!-- 列表头部:仅在有数据时显示 -->
 					<view class="list-header" v-if="selectedModels.length > 0">
 						<text class="header-text">已选型号列表:</text>
 					</view>
-					
+
 					<!-- 1. 列表渲染 (精品化设计) -->
-					<view class="model-item-card" v-for="(item, index) in selectedModels" :key="index" v-if="selectedModels.length > 0" @click="editItem(index, item)">
+					<view class="model-item-card" v-for="(item, index) in selectedModels" :key="index"
+						v-if="selectedModels.length > 0" @click="editItem(index, item)">
 						<view class="remove-icon" @click.stop="removeItem(index)">
 							<text class="x-icon">×</text>
 						</view>
 						<view class="card-line">
-							<text class="model-value">{{item.type}}</text>
+							<text class="model-value">{{ item.type }}</text>
 							<view class="count-tag">
-								支数<text class="count-num">{{item.count}}</text>
+								支数<text class="count-num">{{ item.count }}</text>
 							</view>
 						</view>
 						<view class="card-line secondary">
 							<text class="surface-label">表面名称:</text>
-							<text class="surface-text">{{item.surfaceName}}</text>
+							<text class="surface-text">{{ item.surfaceName }}</text>
 						</view>
 					</view>
-					
+
 					<!-- 2. 全屏缺省状态:美化后的引导页 -->
 					<view class="empty-state-full" v-else>
 						<view class="empty-visual">
-							<image class="empty-img" src="https://img.icons8.com/clouds/200/shopping-cart.png" mode="aspectFit"></image>
+							<image class="empty-img" src="https://img.icons8.com/clouds/200/shopping-cart.png"
+								mode="aspectFit"></image>
 							<view class="empty-bg-glow"></view>
 						</view>
 						<text class="empty-title">暂无已选型号</text>
 						<button class="empty-action-btn" @click="goToAddModel">选型下单</button>
 					</view>
-					
+
 					<view class="bottom-safe-space"></view>
 				</view>
 			</scroll-view>
@@ -64,13 +64,14 @@
 			<view class="footer-summary-bar" v-if="selectedModels.length > 0">
 				<view class="summary-info">
 					<text class="count-label">共计:</text>
-					<text class="num-highlight">{{selectedModels.length}}</text>
+					<text class="num-highlight">{{ selectedModels.length }}</text>
 					<text class="unit">条</text>
 					<view class="split-line"></view>
-					<text class="num-highlight green">{{totalCount}}</text>
+					<text class="num-highlight green">{{ totalCount }}</text>
 					<text class="unit">支</text>
 				</view>
-				<button class="submit-order-btn" :disabled="selectedModels.length === 0" @click="submitFinalOrder">立即下单</button>
+				<button class="submit-order-btn" :disabled="selectedModels.length === 0"
+					@click="submitFinalOrder">立即下单</button>
 			</view>
 		</template>
 
@@ -80,219 +81,473 @@
 </template>
 
 <script>
-	import ErpTabBar from '@/components/erp-tab-bar.vue';
-	export default {
-		components: { ErpTabBar },
-		data() {
-			return {
-				isAuthorized: false,
-				selectedModels: []
-			}
-		},
-		computed: {
-			totalCount() {
-				return this.selectedModels.reduce((sum, item) => sum + parseInt(item.count || 0), 0);
+import ErpTabBar from '@/components/erp-tab-bar.vue';
+import ErpNavBar from '@/components/erp-nav-bar.vue';
+export default {
+	components: { ErpNavBar, ErpTabBar },
+	data() {
+		return {
+			isAuthorized: false,
+			selectedModels: []
+		}
+	},
+	computed: {
+		totalCount() {
+			return this.selectedModels.reduce((sum, item) => sum + parseInt(item.count || 0), 0);
+		}
+	},
+	onLoad() {
+		// 监听添加型号的事件
+		uni.$on('add_order_item', (data) => {
+			this.selectedModels.push(data);
+			uni.showToast({ title: '添加成功', icon: 'success' });
+		});
+		// 监听修改型号的事件
+		uni.$on('update_order_item', (res) => {
+			if (res.index > -1) {
+				this.$set(this.selectedModels, res.index, res.data);
+				uni.showToast({ title: '修改成功', icon: 'success' });
 			}
+		});
+	},
+	onUnload() {
+		uni.$off('add_order_item');
+		uni.$off('update_order_item');
+	},
+	methods: {
+		contactAdmin() { uni.showModal({ title: '联系管理员', content: '管理员电话:138-0000-0000', showCancel: false, confirmColor: '#C1001C' }); },
+		goToAddModel() {
+			uni.navigateTo({
+				url: '/pages/order/add-model/index'
+			});
 		},
-		onLoad() {
-			// 监听添加型号的事件
-			uni.$on('add_order_item', (data) => {
-				this.selectedModels.push(data);
-				uni.showToast({ title: '添加成功', icon: 'success' });
+		editItem(index, item) {
+			uni.navigateTo({
+				url: `/pages/order/edit-model/index?index=${index}&data=${encodeURIComponent(JSON.stringify(item))}`
 			});
-			// 监听修改型号的事件
-			uni.$on('update_order_item', (res) => {
-				if (res.index > -1) {
-					this.$set(this.selectedModels, res.index, res.data);
-					uni.showToast({ title: '修改成功', icon: 'success' });
+		},
+		removeItem(index) {
+			const self = this;
+			uni.showModal({
+				title: '提示',
+				content: '确定移除该型号吗?',
+				success: (res) => {
+					if (res.confirm) {
+						self.selectedModels.splice(index, 1);
+					}
 				}
 			});
 		},
-		onUnload() {
-			uni.$off('add_order_item');
-			uni.$off('update_order_item');
-		},
-		methods: {
-			contactAdmin() { uni.showModal({ title: '联系管理员', content: '管理员电话:138-0000-0000', showCancel: false, confirmColor: '#C1001C' }); },
-			goToAddModel() {
-				uni.navigateTo({
-					url: '/pages/order/add-model/index'
-				});
-			},
-			editItem(index, item) {
+		submitFinalOrder() {
+			if (this.selectedModels.length === 0) return;
+
+			uni.showLoading({ title: '正在提交结果', mask: true });
+			setTimeout(() => {
+				uni.hideLoading();
 				uni.navigateTo({
-					url: `/pages/order/edit-model/index?index=${index}&data=${encodeURIComponent(JSON.stringify(item))}`
+					url: '/pages/order/success/index'
 				});
-			},
-			removeItem(index) {
-				const self = this;
-				uni.showModal({
-					title: '提示',
-					content: '确定移除该型号吗?',
-					success: (res) => {
-						if (res.confirm) {
-							self.selectedModels.splice(index, 1);
-						}
-					}
-				});
-			},
-			submitFinalOrder() {
-				if (this.selectedModels.length === 0) return;
-				
-				uni.showLoading({ title: '正在提交结果', mask: true });
-				setTimeout(() => {
-					uni.hideLoading();
-					uni.navigateTo({
-						url: '/pages/order/success/index'
-					});
-					// 注意:此处不再手动清空 selectedModels,防止跳转前页面出现“暂无数据”的闪现
-					// 并在 success 页面点击“再来一单”时通过 reLaunch 自动重置页面状态
-				}, 1500);
-			}
+				// 注意:此处不再手动清空 selectedModels,防止跳转前页面出现“暂无数据”的闪现
+				// 并在 success 页面点击“再来一单”时通过 reLaunch 自动重置页面状态
+			}, 1500);
 		}
 	}
+}
 </script>
 
 <style scoped>
-	/deep/ ::-webkit-scrollbar { display: none !important; width: 0 !important; height: 0 !important; }
-	.order-container { width: 100%; height: 100vh; background: #f8fafc; display: flex; flex-direction: column; overflow: hidden; }
-	
-	/* 授权等待样式保持一致 */
-	.auth-waiting-full { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: flex-start; padding: 200rpx 40rpx 40rpx; background: linear-gradient(180deg, rgba(0, 122, 255, 0.08) 0%, rgba(247, 248, 250, 1) 100%); }
-	.auth-card { display: flex; flex-direction: column; align-items: center; text-align: center; }
-	.auth-icon { width: 200rpx; height: 200rpx; margin-bottom: 50rpx; }
-	.auth-title { font-size: 44rpx; font-weight: bold; color: #1a1a1a; margin-bottom: 24rpx; }
-	.auth-desc { font-size: 28rpx; color: #666; line-height: 1.8; margin-bottom: 80rpx; padding: 0 20rpx; }
-	.contact-btn { width: 360rpx; height: 96rpx; background: linear-gradient(135deg, #C1001C 0%, #FF4D4F 100%); color: #fff; border-radius: 48rpx; display: flex; align-items: center; justify-content: center; font-size: 32rpx; font-weight: bold; border: none; box-shadow: 0 12rpx 30rpx rgba(193, 0, 28, 0.2); }
-	.authorized-btn { width: 360rpx; height: 96rpx; background: #fff; color: #C1001C; border-radius: 48rpx; display: flex; align-items: center; justify-content: center; font-size: 32rpx; font-weight: bold; border: 2rpx solid #C1001C; margin-top: 30rpx; }
-
-	/* 已授权列表页样式 */
-	.order-container { width: 100%; height: 100vh; background: #f7f8fa; display: flex; flex-direction: column; overflow: hidden; }
-	.order-scroll-list { flex: 1; height: 0; }
-	.list-wrapper { 
-		padding: 30rpx; 
-		/* 确保最后一条数据不被底部双层固定栏遮挡:汇总栏130 + 菜单栏110 + 安全区 + 缓冲余量 */
-		padding-bottom: calc(280rpx + env(safe-area-inset-bottom)); 
-	}
-	.list-header { padding: 10rpx 0 20rpx; }
-	.header-text { font-size: 34rpx; font-weight: bold; color: #1a1a1a; position: relative; padding-left: 24rpx; }
-	.header-text::before { content: ''; position: absolute; left: 0; top: 10%; height: 80%; width: 8rpx; background: #C1001C; border-radius: 4rpx; }
-
-	/* 型号卡片:大幅升级美化 */
-	.model-item-card { 
-		background: #fff; 
-		border-radius: 24rpx; 
-		padding: 36rpx; 
-		margin-bottom: 30rpx; 
-		position: relative; 
-		box-shadow: 0 8rpx 30rpx rgba(0,0,0,0.04);
-		border: 1rpx solid rgba(0,0,0,0.02);
-	}
-	.remove-icon { 
-		position: absolute; 
-		right: 0; 
-		top: 0; 
-		width: 50rpx; 
-		height: 50rpx; 
-		background: rgba(255, 77, 79, 0.1); 
-		border-radius: 0 24rpx 0 24rpx; 
-		display: flex; 
-		align-items: center; 
-		justify-content: center; 
-		z-index: 5;
-	}
-	.x-icon { font-size: 32rpx; color: #ff4d4f; font-weight: bold; }
-	
-	.card-line { display: flex; align-items: center; margin-bottom: 20rpx; }
-	.card-line.secondary { margin-bottom: 0; padding-top: 20rpx; border-top: 1rpx dashed #f0f0f0; }
-	
-	.model-label { font-size: 26rpx; color: #999; }
-	.model-value { font-size: 34rpx; font-weight: bold; color: #333; flex: 1; }
-	
-	.count-tag { background: #FFF1F2; color: #C1001C; padding: 4rpx 16rpx; border-radius: 8rpx; font-size: 24rpx; font-weight: bold; }
-	.count-num { font-size: 30rpx; margin-left: 8rpx; }
-	
-	.surface-label { font-size: 26rpx; color: #999; }
-	.surface-text { font-size: 28rpx; color: #666; }
-
-	/* 悬浮添加按钮:位置上移避免拥挤 */
-	.floating-add-btn { 
-		position: fixed; 
-		right: 40rpx; 
-		bottom: calc(260rpx + env(safe-area-inset-bottom) + 40rpx); 
-		width: 110rpx; 
-		height: 110rpx; 
-		background: #C1001C; 
-		border-radius: 50%; 
-		display: flex; 
-		align-items: center; 
-		justify-content: center; 
-		box-shadow: 0 12rpx 40rpx rgba(193, 0, 28, 0.4);
-		z-index: 100;
-		transition: transform 0.2s;
-	}
-	.floating-add-btn:active { transform: scale(0.9); }
-	.plus-icon { width: 40rpx; height: 4rpx; background: #fff; border-radius: 2rpx; position: relative; }
-	.plus-icon::after { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: #fff; transform: rotate(90deg); border-radius: 2rpx; }
-
-	/* 底部汇总栏:微调间距与样式 */
-	.footer-summary-bar { 
-		position: fixed; 
-		bottom: calc(110rpx + env(safe-area-inset-bottom)); 
-		left: 0; 
-		width: 100%; 
-		height: 130rpx; 
-		background: #fff; 
-		border-top: 1rpx solid #f0f0f0; 
-		display: flex; 
-		align-items: center; 
-		justify-content: space-between; 
-		padding: 0 40rpx; 
-		box-sizing: border-box; 
-		z-index: 99;
-		box-shadow: 0 -10rpx 40rpx rgba(0,0,0,0.05);
-	}
-	.summary-info { display: flex; align-items: center; }
-	.count-label { font-size: 26rpx; color: #999; }
-	.num-highlight { font-size: 36rpx; font-weight: bold; color: #1a1a1a; margin: 0 4rpx; }
-	.num-highlight.green { color: #C1001C; }
-	.unit { font-size: 24rpx; color: #999; margin-left: 2rpx; }
-	.split-line { width: 1rpx; height: 30rpx; background: #eee; margin: 0 20rpx; }
-	
-	.submit-order-btn { 
-		width: 220rpx; height: 80rpx; background: #e0e0e0; color: #666; font-size: 28rpx; 
-		border-radius: 40rpx; display: flex; align-items: center; justify-content: center; 
-		border: none; margin: 0; transition: all 0.3s;
-	}
-	.submit-order-btn:not([disabled]) {
-		background: #C1001C; color: #fff; font-weight: bold;
-	}
-	
-	/* 全屏缺省页样式 */
-	.empty-state-full { 
-		display: flex; 
-		flex-direction: column; 
-		align-items: center; 
-		justify-content: center; 
-		padding-top: 120rpx; 
-	}
-	.empty-visual { position: relative; margin-bottom: 40rpx; width: 400rpx; height: 400rpx; display: flex; align-items: center; justify-content: center; }
-	.empty-img { width: 320rpx; height: 320rpx; z-index: 2; }
-	.empty-bg-glow { 
-		position: absolute; width: 240rpx; height: 240rpx; 
-		background: radial-gradient(circle, rgba(193, 0, 28, 0.15) 0%, rgba(248, 250, 252, 0) 70%); 
-		z-index: 1; border-radius: 50%; 
-	}
-	.empty-title { font-size: 36rpx; font-weight: bold; color: #1a1a1a; margin-bottom: 80rpx; }
-	.empty-desc { font-size: 26rpx; color: #999; margin-bottom: 60rpx; text-align: center; padding: 0 80rpx; line-height: 1.6; }
-	.empty-action-btn { 
-		width: 320rpx; height: 90rpx; background: #C1001C; color: #fff; 
-		border-radius: 45rpx; font-size: 30rpx; font-weight: bold; 
-		display: flex; align-items: center; justify-content: center; 
-		box-shadow: 0 10rpx 30rpx rgba(193, 0, 28, 0.2);
-		border: none;
-	}
-	.empty-action-btn:active { opacity: 0.8; transform: scale(0.96); }
+/deep/ ::-webkit-scrollbar {
+	display: none !important;
+	width: 0 !important;
+	height: 0 !important;
+}
+
+.order-container {
+	width: 100%;
+	height: 100vh;
+	background: #f8fafc;
+	display: flex;
+	flex-direction: column;
+	overflow: hidden;
+}
+
+/* 授权等待样式保持一致 */
+.auth-waiting-full {
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	justify-content: flex-start;
+	padding: 200rpx 40rpx 40rpx;
+	background: linear-gradient(180deg, rgba(0, 122, 255, 0.08) 0%, rgba(247, 248, 250, 1) 100%);
+}
+
+.auth-card {
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	text-align: center;
+}
+
+.auth-icon {
+	width: 200rpx;
+	height: 200rpx;
+	margin-bottom: 50rpx;
+}
+
+.auth-title {
+	font-size: 44rpx;
+	font-weight: bold;
+	color: #1a1a1a;
+	margin-bottom: 24rpx;
+}
+
+.auth-desc {
+	font-size: 28rpx;
+	color: #666;
+	line-height: 1.8;
+	margin-bottom: 80rpx;
+	padding: 0 20rpx;
+}
+
+.contact-btn {
+	width: 360rpx;
+	height: 96rpx;
+	background: linear-gradient(135deg, #C1001C 0%, #FF4D4F 100%);
+	color: #fff;
+	border-radius: 48rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 32rpx;
+	font-weight: bold;
+	border: none;
+	box-shadow: 0 12rpx 30rpx rgba(193, 0, 28, 0.2);
+}
+
+.authorized-btn {
+	width: 360rpx;
+	height: 96rpx;
+	background: #fff;
+	color: #C1001C;
+	border-radius: 48rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 32rpx;
+	font-weight: bold;
+	border: 2rpx solid #C1001C;
+	margin-top: 30rpx;
+}
+
+/* 已授权列表页样式 */
+.order-container {
+	width: 100%;
+	height: 100vh;
+	background: #f7f8fa;
+	display: flex;
+	flex-direction: column;
+	overflow: hidden;
+}
+
+.order-scroll-list {
+	flex: 1;
+	height: 0;
+}
+
+.list-wrapper {
+	padding: 30rpx;
+	/* 确保最后一条数据不被底部双层固定栏遮挡:汇总栏130 + 菜单栏110 + 安全区 + 缓冲余量 */
+	padding-bottom: calc(280rpx + env(safe-area-inset-bottom));
+}
+
+.list-header {
+	padding: 10rpx 0 20rpx;
+}
+
+.header-text {
+	font-size: 34rpx;
+	font-weight: bold;
+	color: #1a1a1a;
+	position: relative;
+	padding-left: 24rpx;
+}
+
+.header-text::before {
+	content: '';
+	position: absolute;
+	left: 0;
+	top: 10%;
+	height: 80%;
+	width: 8rpx;
+	background: #C1001C;
+	border-radius: 4rpx;
+}
+
+/* 型号卡片:大幅升级美化 */
+.model-item-card {
+	background: #fff;
+	border-radius: 24rpx;
+	padding: 36rpx;
+	margin-bottom: 30rpx;
+	position: relative;
+	box-shadow: 0 8rpx 30rpx rgba(0, 0, 0, 0.04);
+	border: 1rpx solid rgba(0, 0, 0, 0.02);
+}
+
+.remove-icon {
+	position: absolute;
+	right: 0;
+	top: 0;
+	width: 50rpx;
+	height: 50rpx;
+	background: rgba(255, 77, 79, 0.1);
+	border-radius: 0 24rpx 0 24rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	z-index: 5;
+}
+
+.x-icon {
+	font-size: 32rpx;
+	color: #ff4d4f;
+	font-weight: bold;
+}
+
+.card-line {
+	display: flex;
+	align-items: center;
+	margin-bottom: 20rpx;
+}
+
+.card-line.secondary {
+	margin-bottom: 0;
+	padding-top: 20rpx;
+	border-top: 1rpx dashed #f0f0f0;
+}
+
+.model-label {
+	font-size: 26rpx;
+	color: #999;
+}
+
+.model-value {
+	font-size: 34rpx;
+	font-weight: bold;
+	color: #333;
+	flex: 1;
+}
+
+.count-tag {
+	background: #FFF1F2;
+	color: #C1001C;
+	padding: 4rpx 16rpx;
+	border-radius: 8rpx;
+	font-size: 24rpx;
+	font-weight: bold;
+}
+
+.count-num {
+	font-size: 30rpx;
+	margin-left: 8rpx;
+}
+
+.surface-label {
+	font-size: 26rpx;
+	color: #999;
+}
+
+.surface-text {
+	font-size: 28rpx;
+	color: #666;
+}
+
+/* 悬浮添加按钮:位置上移避免拥挤 */
+.floating-add-btn {
+	position: fixed;
+	right: 40rpx;
+	bottom: calc(260rpx + env(safe-area-inset-bottom) + 40rpx);
+	width: 110rpx;
+	height: 110rpx;
+	background: #C1001C;
+	border-radius: 50%;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	box-shadow: 0 12rpx 40rpx rgba(193, 0, 28, 0.4);
+	z-index: 100;
+	transition: transform 0.2s;
+}
+
+.floating-add-btn:active {
+	transform: scale(0.9);
+}
+
+.plus-icon {
+	width: 40rpx;
+	height: 4rpx;
+	background: #fff;
+	border-radius: 2rpx;
+	position: relative;
+}
+
+.plus-icon::after {
+	content: '';
+	position: absolute;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	background: #fff;
+	transform: rotate(90deg);
+	border-radius: 2rpx;
+}
+
+/* 底部汇总栏:微调间距与样式 */
+.footer-summary-bar {
+	position: fixed;
+	bottom: calc(110rpx + env(safe-area-inset-bottom));
+	left: 0;
+	width: 100%;
+	height: 130rpx;
+	background: #fff;
+	border-top: 1rpx solid #f0f0f0;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 0 40rpx;
+	box-sizing: border-box;
+	z-index: 99;
+	box-shadow: 0 -10rpx 40rpx rgba(0, 0, 0, 0.05);
+}
+
+.summary-info {
+	display: flex;
+	align-items: center;
+}
+
+.count-label {
+	font-size: 26rpx;
+	color: #999;
+}
+
+.num-highlight {
+	font-size: 36rpx;
+	font-weight: bold;
+	color: #1a1a1a;
+	margin: 0 4rpx;
+}
+
+.num-highlight.green {
+	color: #C1001C;
+}
+
+.unit {
+	font-size: 24rpx;
+	color: #999;
+	margin-left: 2rpx;
+}
+
+.split-line {
+	width: 1rpx;
+	height: 30rpx;
+	background: #eee;
+	margin: 0 20rpx;
+}
+
+.submit-order-btn {
+	width: 220rpx;
+	height: 80rpx;
+	background: #e0e0e0;
+	color: #666;
+	font-size: 28rpx;
+	border-radius: 40rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	border: none;
+	margin: 0;
+	transition: all 0.3s;
+}
+
+.submit-order-btn:not([disabled]) {
+	background: #C1001C;
+	color: #fff;
+	font-weight: bold;
+}
+
+/* 全屏缺省页样式 */
+.empty-state-full {
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	justify-content: center;
+	padding-top: 120rpx;
+}
+
+.empty-visual {
+	position: relative;
+	margin-bottom: 40rpx;
+	width: 400rpx;
+	height: 400rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+
+.empty-img {
+	width: 320rpx;
+	height: 320rpx;
+	z-index: 2;
+}
+
+.empty-bg-glow {
+	position: absolute;
+	width: 240rpx;
+	height: 240rpx;
+	background: radial-gradient(circle, rgba(193, 0, 28, 0.15) 0%, rgba(248, 250, 252, 0) 70%);
+	z-index: 1;
+	border-radius: 50%;
+}
+
+.empty-title {
+	font-size: 36rpx;
+	font-weight: bold;
+	color: #1a1a1a;
+	margin-bottom: 80rpx;
+}
+
+.empty-desc {
+	font-size: 26rpx;
+	color: #999;
+	margin-bottom: 60rpx;
+	text-align: center;
+	padding: 0 80rpx;
+	line-height: 1.6;
+}
+
+.empty-action-btn {
+	width: 320rpx;
+	height: 90rpx;
+	background: #C1001C;
+	color: #fff;
+	border-radius: 45rpx;
+	font-size: 30rpx;
+	font-weight: bold;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	box-shadow: 0 10rpx 30rpx rgba(193, 0, 28, 0.2);
+	border: none;
+}
+
+.empty-action-btn:active {
+	opacity: 0.8;
+	transform: scale(0.96);
+}
 
-	.bottom-safe-space { height: 100rpx; }
+.bottom-safe-space {
+	height: 100rpx;
+}
 </style>

+ 457 - 219
pages/order/list/index.vue

@@ -1,28 +1,17 @@
 <template>
 	<view class="list-page-container">
-		<!-- 1. 自定义顶部导航:彻底抹除红框1的原生蓝线 -->
-		<view class="custom-nav-bar" :style="{ paddingTop: statusBarHeight + 'px' }">
-			<view class="nav-content">
-				<view class="back-icon" @click="goBack">
-					<view class="arrow-left"></view>
-				</view>
-				<text class="nav-title">全部订单</text>
-				<view class="placeholder-right"></view>
-			</view>
-		</view>
+		<erp-nav-bar title="全部订单" />
 
 		<!-- 2. 分类切换:使用翻译位移,彻底消除红框2残影 -->
 		<view class="tabs-fixed">
 			<view class="tabs-box">
-				<view v-for="(tab, index) in tabs" :key="index" 
-					class="tab-item" 
-					:class="{active: currentTab === index}"
-					@click="switchTab(index)">
-					<text class="tab-txt">{{tab}}</text>
+				<view v-for="(tab, index) in tabs" :key="index" class="tab-item"
+					:class="{ active: currentTab === index }" @click="switchTab(index)">
+					<text class="tab-txt">{{ tab }}</text>
 				</view>
 				<!-- 指示器:只负责位移,不负责显隐,彻底杜绝虚影 -->
 				<view class="indicator-track">
-					<view class="indicator-bar" :style="{transform: 'translateX(' + (currentTab * 100) + '%)'}">
+					<view class="indicator-bar" :style="{ transform: 'translateX(' + (currentTab * 100) + '%)' }">
 						<view class="bar-inner"></view>
 					</view>
 				</view>
@@ -30,40 +19,35 @@
 		</view>
 
 		<!-- 3. 固定高度的滚动区:强制启用滚动,解决不能滑动问题 -->
-		<scroll-view 
-			scroll-y 
-			class="order-scroll-view" 
-			:style="{ height: scrollHeight }"
-			@scrolltolower="onReachEnd"
-			:refresher-enabled="false"
-			:show-scrollbar="false">
-			
+		<scroll-view scroll-y class="order-scroll-view" :style="{ height: scrollHeight }" @scrolltolower="onReachEnd"
+			:refresher-enabled="false" :show-scrollbar="false">
+
 			<view class="order-list-inner">
 				<view class="order-card" v-for="(item, index) in displayList" :key="index" @click="goDetail(item)">
 					<view class="card-head">
-						<text class="order-id">单号:{{item.orderNo}}</text>
-						<view class="status-badge" :class="item.statusType">{{item.statusName}}</view>
+						<text class="order-id">单号:{{ item.orderNo }}</text>
+						<view class="status-badge" :class="item.statusType">{{ item.statusName }}</view>
 					</view>
 					<view class="card-body">
 						<view class="model-row" v-for="(model, mIdx) in item.models.slice(0, 2)" :key="mIdx">
-							<text class="m-type">{{model.type}}</text>
-							<text class="m-spec">{{model.surface}} | {{model.length}}mm</text>
-							<text class="m-count">{{model.count}} 支</text>
+							<text class="m-type">{{ model.type }}</text>
+							<text class="m-spec">{{ model.surface }} | {{ model.length }}mm</text>
+							<text class="m-count">{{ model.count }} 支</text>
 						</view>
 						<view class="more-hint" v-if="item.models.length > 2">
-							<text>查看更多 {{item.models.length - 2}} 个型号...</text>
+							<text>查看更多 {{ item.models.length - 2 }} 个型号...</text>
 						</view>
 						<view class="total-summary">
 							<text class="summary-label">共计:</text>
-							<text class="summary-val">{{item.models.length}}</text>
+							<text class="summary-val">{{ item.models.length }}</text>
 							<text class="summary-unit">个型号</text>
 							<view class="summary-split"></view>
-							<text class="summary-val highlight">{{item.totalCount}}</text>
+							<text class="summary-val highlight">{{ item.totalCount }}</text>
 							<text class="summary-unit">支</text>
 						</view>
 					</view>
 					<view class="card-foot">
-						<text class="time">{{item.time}}</text>
+						<text class="time">{{ item.time }}</text>
 						<view class="btns">
 							<view class="btn-cancel" v-if="item.status === 1" @click.stop="onCancel(item)">撤销</view>
 							<view class="btn-view primary" @click.stop="goDetail(item)">订单详情</view>
@@ -88,7 +72,7 @@
 					<image src="https://img.icons8.com/clouds/200/open-box.png" mode="aspectFit"></image>
 					<text>暂无订单记录</text>
 				</view>
-				
+
 				<view class="safe-bottom"></view>
 			</view>
 		</scroll-view>
@@ -99,198 +83,452 @@
 </template>
 
 <script>
-	import ErpTabBar from '@/components/erp-tab-bar.vue';
-	export default {
-		components: {
-			ErpTabBar
+import ErpTabBar from '@/components/erp-tab-bar.vue';
+import ErpNavBar from '@/components/erp-nav-bar.vue';
+export default {
+	components: { ErpTabBar, ErpNavBar },
+	data() {
+		return {
+			statusBarHeight: 20,
+			navBarHeight: 44,
+			tabBarHeight: 50, // 对应 100rpx
+			currentTab: 0,
+			loading: false,
+			noMore: false,
+			tabs: ['全部', '待审核', '待签批', '生产中', '已完成'],
+			allOrders: [
+				{
+					orderNo: 'ORD20240428001',
+					models: [
+						{ type: 'TY0019', length: '6000', surface: '阳极氧化', count: '100' },
+						{ type: 'TY0018', length: '6000', surface: 'PL坯料', count: '50' }
+					],
+					totalCount: 150,
+					status: 1, statusName: '待审核', statusType: 'pending', time: '2024-04-28 10:20'
+				},
+				{
+					orderNo: 'ORD20240428002',
+					models: [
+						{ type: 'TY0020', length: '5800', surface: '粉末喷涂', count: '80' }
+					],
+					totalCount: 80,
+					status: 2, statusName: '待签批', statusType: 'process', time: '2024-04-28 09:15'
+				},
+				{
+					orderNo: 'ORD20240427088',
+					models: [
+						{ type: 'TY0018', length: '6000', surface: 'PL坯料', count: '300' }
+					],
+					totalCount: 300,
+					status: 4, statusName: '已完成', statusType: 'finish', time: '2024-04-27 15:40'
+				},
+				{
+					orderNo: 'ORD20240427045',
+					models: [
+						{ type: 'TY0021', length: '3000', surface: '电泳涂漆', count: '50' },
+						{ type: 'TY0022', length: '4000', surface: '木纹转印', count: '40' },
+						{ type: 'TY0023', length: '5000', surface: '氟碳喷涂', count: '30' }
+					],
+					totalCount: 120,
+					status: 3, statusName: '生产中', statusType: 'making', time: '2024-04-27 11:05'
+				}
+			],
+			displayList: []
+		}
+	},
+	computed: {
+		scrollHeight() {
+			// 减去状态栏、导航栏、选项卡的高度
+			return `calc(100vh - ${this.statusBarHeight + this.navBarHeight + this.tabBarHeight}px)`;
+		}
+	},
+	onLoad(options) {
+		const info = uni.getSystemInfoSync();
+		this.statusBarHeight = info.statusBarHeight;
+		// 修正选项卡高度(单位px)
+		this.tabBarHeight = info.windowWidth / 750 * 110;
+
+		if (options.tab) this.currentTab = parseInt(options.tab);
+		this.refresh();
+	},
+	methods: {
+		goBack() { uni.navigateBack(); },
+		switchTab(i) { this.currentTab = i; this.refresh(); },
+		refresh() { this.displayList = []; this.noMore = false; this.loadData(); },
+		onReachEnd() { if (!this.loading && !this.noMore) this.loadData(); },
+		loadData() {
+			this.loading = true;
+			setTimeout(() => {
+				let raw = this.currentTab === 0 ? this.allOrders : this.allOrders.filter(o => o.status === this.currentTab);
+				this.displayList = [...this.displayList, ...raw];
+				this.noMore = true; // 模拟一次性加载完演示数据
+				this.loading = false;
+			}, 500);
 		},
-		data() {
-			return {
-				statusBarHeight: 20,
-				navBarHeight: 44,
-				tabBarHeight: 50, // 对应 100rpx
-				currentTab: 0,
-				loading: false,
-				noMore: false,
-				tabs: ['全部', '待审核', '待签批', '生产中', '已完成'],
-				allOrders: [
-					{ 
-						orderNo: 'ORD20240428001', 
-						models: [
-							{ type: 'TY0019', length: '6000', surface: '阳极氧化', count: '100' },
-							{ type: 'TY0018', length: '6000', surface: 'PL坯料', count: '50' }
-						],
-						totalCount: 150,
-						status: 1, statusName: '待审核', statusType: 'pending', time: '2024-04-28 10:20' 
-					},
-					{ 
-						orderNo: 'ORD20240428002', 
-						models: [
-							{ type: 'TY0020', length: '5800', surface: '粉末喷涂', count: '80' }
-						],
-						totalCount: 80,
-						status: 2, statusName: '待签批', statusType: 'process', time: '2024-04-28 09:15' 
-					},
-					{ 
-						orderNo: 'ORD20240427088', 
-						models: [
-							{ type: 'TY0018', length: '6000', surface: 'PL坯料', count: '300' }
-						],
-						totalCount: 300,
-						status: 4, statusName: '已完成', statusType: 'finish', time: '2024-04-27 15:40' 
-					},
-					{ 
-						orderNo: 'ORD20240427045', 
-						models: [
-							{ type: 'TY0021', length: '3000', surface: '电泳涂漆', count: '50' },
-							{ type: 'TY0022', length: '4000', surface: '木纹转印', count: '40' },
-							{ type: 'TY0023', length: '5000', surface: '氟碳喷涂', count: '30' }
-						],
-						totalCount: 120,
-						status: 3, statusName: '生产中', statusType: 'making', time: '2024-04-27 11:05' 
+		onCancel(item) {
+			uni.showModal({
+				title: '确认撤销',
+				content: `确认要撤销订单:${item.orderNo} 吗?`,
+				confirmColor: '#ff4d4f',
+				success: (res) => {
+					if (res.confirm) {
+						uni.showLoading({ title: '撤销中' });
+						setTimeout(() => {
+							uni.hideLoading();
+							uni.showToast({ title: '已撤销' });
+
+							// 逻辑修复:修改状态而非移除
+							const target = this.allOrders.find(o => o.orderNo === item.orderNo);
+							if (target) {
+								target.status = 0;
+								target.statusName = '已撤销';
+								target.statusType = 'expired';
+							}
+							// 再次过滤刷新当前视图
+							this.refresh();
+						}, 800);
 					}
-				],
-				displayList: []
-			}
-		},
-		computed: {
-			scrollHeight() {
-				// 减去状态栏、导航栏、选项卡的高度
-				return `calc(100vh - ${this.statusBarHeight + this.navBarHeight + this.tabBarHeight}px)`;
-			}
+				}
+			});
 		},
-		onLoad(options) {
-			const info = uni.getSystemInfoSync();
-			this.statusBarHeight = info.statusBarHeight;
-			// 修正选项卡高度(单位px)
-			this.tabBarHeight = info.windowWidth / 750 * 110; 
-
-			if (options.tab) this.currentTab = parseInt(options.tab);
-			this.refresh();
-		},
-		methods: {
-			goBack() { uni.navigateBack(); },
-			switchTab(i) { this.currentTab = i; this.refresh(); },
-			refresh() { this.displayList = []; this.noMore = false; this.loadData(); },
-			onReachEnd() { if (!this.loading && !this.noMore) this.loadData(); },
-			loadData() {
-				this.loading = true;
-				setTimeout(() => {
-					let raw = this.currentTab === 0 ? this.allOrders : this.allOrders.filter(o => o.status === this.currentTab);
-					this.displayList = [...this.displayList, ...raw];
-					this.noMore = true; // 模拟一次性加载完演示数据
-					this.loading = false;
-				}, 500);
-			},
-			onCancel(item) {
-				uni.showModal({
-					title: '确认撤销',
-					content: `确认要撤销订单:${item.orderNo} 吗?`,
-					confirmColor: '#ff4d4f',
-					success: (res) => {
-						if (res.confirm) {
-							uni.showLoading({ title: '撤销中' });
-							setTimeout(() => {
-								uni.hideLoading();
-								uni.showToast({ title: '已撤销' });
-								
-								// 逻辑修复:修改状态而非移除
-								const target = this.allOrders.find(o => o.orderNo === item.orderNo);
-								if (target) {
-									target.status = 0;
-									target.statusName = '已撤销';
-									target.statusType = 'expired';
-								}
-								// 再次过滤刷新当前视图
-								this.refresh();
-							}, 800);
-						}
-					}
-				});
-			},
-			goDetail(item) {
-				const dataStr = encodeURIComponent(JSON.stringify(item));
-				uni.navigateTo({
-					url: `/pages/order/detail/index?data=${dataStr}`
-				});
-			}
+		goDetail(item) {
+			const dataStr = encodeURIComponent(JSON.stringify(item));
+			uni.navigateTo({
+				url: `/pages/order/detail/index?data=${dataStr}`
+			});
 		}
 	}
+}
 </script>
 
 <style scoped>
-	/deep/ ::-webkit-scrollbar { display: none !important; width: 0 !important; height: 0 !important; -webkit-appearance: none; background: transparent; }
-	.list-page-container { width: 100vw; height: 100vh; background: #f8fafc; overflow: hidden; display: flex; flex-direction: column; }
-	
-	/* 1. 自定义导航栏:解决蓝线红框1 */
-	.custom-nav-bar { background: #ffffff; width: 100%; flex-shrink: 0; }
-	.nav-content { height: 44px; display: flex; align-items: center; justify-content: space-between; padding: 0 30rpx; }
-	.back-icon { width: 60rpx; height: 44px; display: flex; align-items: center; }
-	.arrow-left { width: 20rpx; height: 20rpx; border-left: 4rpx solid #333; border-bottom: 4rpx solid #333; transform: rotate(45deg); margin-left: 10rpx; }
-	.nav-title { font-size: 34rpx; font-weight: bold; color: #1a1a1a; }
-	.placeholder-right { width: 60rpx; }
-
-	/* 2. 选项卡:解决残影红框2 */
-	.tabs-fixed { background: #fff; width: 100%; flex-shrink: 0; border-bottom: 1rpx solid #f0f0f0; }
-	.tabs-box { height: 110rpx; position: relative; display: flex; width: 100%; }
-	.tab-item { flex: 1; display: flex; align-items: center; justify-content: center; z-index: 5; }
-	.tab-txt { font-size: 28rpx; color: #888; transition: all 0.2s; }
-	.tab-item.active .tab-txt { color: #C1001C; font-weight: bold; font-size: 32rpx; }
-	
-	/* 指示器轨道:通过位移消除虚影 */
-	.indicator-track { position: absolute; bottom: 10rpx; left: 0; width: 100%; height: 6rpx; display: flex; }
-	.indicator-bar { width: 20%; height: 100%; display: flex; align-items: center; justify-content: center; transition: transform 0.3s cubic-bezier(0.18, 0.89, 0.32, 1.28); }
-	.bar-inner { width: 40rpx; height: 100%; background: #C1001C; border-radius: 6rpx; }
-
-	/* 3. 滚动区:解决不可滑动问题 */
-	.order-scroll-view { width: 100%; }
-	.order-list-inner { padding: 30rpx; padding-bottom: 60rpx; }
-
-	.order-card { background: #fff; border-radius: 24rpx; padding: 36rpx; margin-bottom: 30rpx; box-shadow: 0 4rpx 20rpx rgba(0,0,0,0.02); }
-	.card-head { display: flex; justify-content: space-between; align-items: center; margin-bottom: 30rpx; }
-	.order-id { font-size: 28rpx; color: #1a1a1a; font-weight: bold; }
-	.status-badge { font-size: 20rpx; padding: 4rpx 16rpx; border-radius: 8rpx; }
-	.status-badge.pending { background: #FFF1F2; color: #C1001C; }
-	.status-badge.expired { background: #f5f5f5; color: #999; }
-	.status-badge.process { background: #fff7e6; color: #ffa940; }
-	.status-badge.making { background: #e6fffb; color: #36cfc9; }
-	/* 已撤销样式 */
-	.status-badge.expired { background: #f5f5f5; color: #999; }
-	.status-badge.finish { background: #f6ffed; color: #52c41a; }
-
-	.card-body { padding: 24rpx 0; border-top: 1rpx dashed #f0f0f0; margin-bottom: 24rpx; }
-	.model-row { display: flex; align-items: center; margin-bottom: 12rpx; font-size: 24rpx; }
-	.m-type { font-size: 28rpx; font-weight: bold; color: #333; width: 140rpx; }
-	.m-spec { color: #888; flex: 1; padding: 0 20rpx; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
-	.m-count { color: #555; width: 100rpx; text-align: right; font-weight: 500; }
-	
-	.more-hint { padding: 10rpx 0; font-size: 24rpx; color: #999; text-align: center; background: #fafafa; border-radius: 8rpx; margin-bottom: 16rpx; }
-	
-	.total-summary { 
-		display: flex; align-items: center; justify-content: flex-end; 
-		padding-top: 20rpx; border-top: 1rpx solid #fafafa;
+/deep/ ::-webkit-scrollbar {
+	display: none !important;
+	width: 0 !important;
+	height: 0 !important;
+	-webkit-appearance: none;
+	background: transparent;
+}
+
+.list-page-container {
+	width: 100vw;
+	height: 100vh;
+	background: #f8fafc;
+	overflow: hidden;
+	display: flex;
+	flex-direction: column;
+}
+
+
+/* 2. 选项卡:解决残影红框2 */
+.tabs-fixed {
+	background: #fff;
+	width: 100%;
+	flex-shrink: 0;
+	border-bottom: 1rpx solid #f0f0f0;
+}
+
+.tabs-box {
+	height: 110rpx;
+	position: relative;
+	display: flex;
+	width: 100%;
+}
+
+.tab-item {
+	flex: 1;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	z-index: 5;
+}
+
+.tab-txt {
+	font-size: 28rpx;
+	color: #888;
+	transition: all 0.2s;
+}
+
+.tab-item.active .tab-txt {
+	color: #C1001C;
+	font-weight: bold;
+	font-size: 32rpx;
+}
+
+/* 指示器轨道:通过位移消除虚影 */
+.indicator-track {
+	position: absolute;
+	bottom: 10rpx;
+	left: 0;
+	width: 100%;
+	height: 6rpx;
+	display: flex;
+}
+
+.indicator-bar {
+	width: 20%;
+	height: 100%;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	transition: transform 0.3s cubic-bezier(0.18, 0.89, 0.32, 1.28);
+}
+
+.bar-inner {
+	width: 40rpx;
+	height: 100%;
+	background: #C1001C;
+	border-radius: 6rpx;
+}
+
+/* 3. 滚动区:解决不可滑动问题 */
+.order-scroll-view {
+	width: 100%;
+}
+
+.order-list-inner {
+	padding: 30rpx;
+	padding-bottom: 60rpx;
+}
+
+.order-card {
+	background: #fff;
+	border-radius: 24rpx;
+	padding: 36rpx;
+	margin-bottom: 30rpx;
+	box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.02);
+}
+
+.card-head {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	margin-bottom: 30rpx;
+}
+
+.order-id {
+	font-size: 28rpx;
+	color: #1a1a1a;
+	font-weight: bold;
+}
+
+.status-badge {
+	font-size: 20rpx;
+	padding: 4rpx 16rpx;
+	border-radius: 8rpx;
+}
+
+.status-badge.pending {
+	background: #FFF1F2;
+	color: #C1001C;
+}
+
+.status-badge.expired {
+	background: #f5f5f5;
+	color: #999;
+}
+
+.status-badge.process {
+	background: #fff7e6;
+	color: #ffa940;
+}
+
+.status-badge.making {
+	background: #e6fffb;
+	color: #36cfc9;
+}
+
+/* 已撤销样式 */
+.status-badge.expired {
+	background: #f5f5f5;
+	color: #999;
+}
+
+.status-badge.finish {
+	background: #f6ffed;
+	color: #52c41a;
+}
+
+.card-body {
+	padding: 24rpx 0;
+	border-top: 1rpx dashed #f0f0f0;
+	margin-bottom: 24rpx;
+}
+
+.model-row {
+	display: flex;
+	align-items: center;
+	margin-bottom: 12rpx;
+	font-size: 24rpx;
+}
+
+.m-type {
+	font-size: 28rpx;
+	font-weight: bold;
+	color: #333;
+	width: 140rpx;
+}
+
+.m-spec {
+	color: #888;
+	flex: 1;
+	padding: 0 20rpx;
+	overflow: hidden;
+	text-overflow: ellipsis;
+	white-space: nowrap;
+}
+
+.m-count {
+	color: #555;
+	width: 100rpx;
+	text-align: right;
+	font-weight: 500;
+}
+
+.more-hint {
+	padding: 10rpx 0;
+	font-size: 24rpx;
+	color: #999;
+	text-align: center;
+	background: #fafafa;
+	border-radius: 8rpx;
+	margin-bottom: 16rpx;
+}
+
+.total-summary {
+	display: flex;
+	align-items: center;
+	justify-content: flex-end;
+	padding-top: 20rpx;
+	border-top: 1rpx solid #fafafa;
+}
+
+.summary-label {
+	font-size: 24rpx;
+	color: #999;
+}
+
+.summary-val {
+	font-size: 32rpx;
+	font-weight: bold;
+	color: #333;
+	margin: 0 4rpx;
+}
+
+.summary-val.highlight {
+	color: #C1001C;
+}
+
+.summary-unit {
+	font-size: 22rpx;
+	color: #999;
+	margin-right: 12rpx;
+}
+
+.summary-split {
+	width: 1rpx;
+	height: 20rpx;
+	background: #eee;
+	margin: 0 16rpx;
+}
+
+.card-foot {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	padding-top: 10rpx;
+}
+
+.time {
+	font-size: 24rpx;
+	color: #bbb;
+}
+
+.btns {
+	display: flex;
+	gap: 16rpx;
+}
+
+.btn-cancel,
+.btn-view {
+	padding: 12rpx 30rpx;
+	border-radius: 30rpx;
+	font-size: 24rpx;
+}
+
+.btn-cancel {
+	border: 1rpx solid #ddd;
+	color: #666;
+}
+
+.btn-view.primary {
+	background: #C1001C;
+	color: #fff;
+}
+
+.list-status-info {
+	padding: 40rpx 0;
+	display: flex;
+	justify-content: center;
+}
+
+.nomore-wrap {
+	display: flex;
+	align-items: center;
+	color: #ccc;
+	font-size: 24rpx;
+}
+
+.nomore-line {
+	width: 40rpx;
+	height: 1rpx;
+	background: #eee;
+	margin: 0 20rpx;
+}
+
+.loading-wrap {
+	color: #999;
+	font-size: 24rpx;
+	display: flex;
+	align-items: center;
+}
+
+.load-dot {
+	width: 10rpx;
+	height: 10rpx;
+	background: #C1001C;
+	border-radius: 50%;
+	margin-right: 10rpx;
+	animation: flash 0.6s infinite alternate;
+}
+
+@keyframes flash {
+	from {
+		opacity: 0.3;
+	}
+
+	to {
+		opacity: 1;
 	}
-	.summary-label { font-size: 24rpx; color: #999; }
-	.summary-val { font-size: 32rpx; font-weight: bold; color: #333; margin: 0 4rpx; }
-	.summary-val.highlight { color: #C1001C; }
-	.summary-unit { font-size: 22rpx; color: #999; margin-right: 12rpx; }
-	.summary-split { width: 1rpx; height: 20rpx; background: #eee; margin: 0 16rpx; }
-
-	.card-foot { display: flex; justify-content: space-between; align-items: center; padding-top: 10rpx; }
-	.time { font-size: 24rpx; color: #bbb; }
-	.btns { display: flex; gap: 16rpx; }
-	.btn-cancel, .btn-view { padding: 12rpx 30rpx; border-radius: 30rpx; font-size: 24rpx; }
-	.btn-cancel { border: 1rpx solid #ddd; color: #666; }
-	.btn-view.primary { background: #C1001C; color: #fff; }
-
-	.list-status-info { padding: 40rpx 0; display: flex; justify-content: center; }
-	.nomore-wrap { display: flex; align-items: center; color: #ccc; font-size: 24rpx; }
-	.nomore-line { width: 40rpx; height: 1rpx; background: #eee; margin: 0 20rpx; }
-	.loading-wrap { color: #999; font-size: 24rpx; display: flex; align-items: center; }
-	.load-dot { width: 10rpx; height: 10rpx; background: #C1001C; border-radius: 50%; margin-right: 10rpx; animation: flash 0.6s infinite alternate; }
-	@keyframes flash { from { opacity: 0.3; } to { opacity: 1; } }
-
-	.empty-state { display: flex; flex-direction: column; align-items: center; padding-top: 200rpx; color: #bbb; font-size: 28rpx; }
-	.empty-state image { width: 220rpx; height: 220rpx; margin-bottom: 30rpx; opacity: 0.6; }
-	.safe-bottom { height: 40rpx; }
+}
+
+.empty-state {
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	padding-top: 200rpx;
+	color: #bbb;
+	font-size: 28rpx;
+}
+
+.empty-state image {
+	width: 220rpx;
+	height: 220rpx;
+	margin-bottom: 30rpx;
+	opacity: 0.6;
+}
+
+.safe-bottom {
+	height: 40rpx;
+}
 </style>

+ 107 - 94
pages/order/success/index.vue

@@ -1,10 +1,11 @@
 <template>
 	<view class="success-container">
+		<erp-nav-bar title="下单成功" />
 		<view class="success-card">
 			<icon type="success" size="80" color="#C1001C" class="success-icon"></icon>
 			<text class="status-title">提交成功</text>
 			<text class="status-desc">您的订单已提交,正在等待业务员审核</text>
-			
+
 			<view class="btn-group">
 				<!-- 再来一单:主按钮 -->
 				<button class="primary-btn" @click="handleReorder">再来一单</button>
@@ -18,102 +19,114 @@
 </template>
 
 <script>
-	export default {
-		methods: {
-			// 将再来一单和返回页面功能合并:通过 reLaunch 自动重置数据
-			handleReorder() {
-				// reLaunch 会重新加载页面,彻底清空原有表单数据
-				uni.reLaunch({
-					url: '/pages/order/index'
-				});
-			},
-			viewOrder() {
-				// 跳转到订单管理或个人中心(视项目实际路径而定)
-				uni.switchTab({
-					url: '/pages/index/index'
-				});
-			}
+import ErpNavBar from '@/components/erp-nav-bar.vue';
+export default {
+	components: { ErpNavBar },
+	methods: {
+		// 将再来一单和返回页面功能合并:通过 reLaunch 自动重置数据
+		handleReorder() {
+			// reLaunch 会重新加载页面,彻底清空原有表单数据
+			uni.reLaunch({
+				url: '/pages/order/index'
+			});
+		},
+		viewOrder() {
+			// 跳转到订单管理或个人中心(视项目实际路径而定)
+			uni.switchTab({
+				url: '/pages/index/index'
+			});
 		}
 	}
+}
 </script>
 
 <style scoped>
-	.success-container {
-		width: 100%;
-		min-height: 100vh;
-		background: #f7f8fa;
-		display: flex;
-		flex-direction: column;
-		align-items: center;
-		padding-top: 15vh;
-	}
-	.success-card {
-		width: 90%;
-		background: #fff;
-		border-radius: 32rpx;
-		padding: 80rpx 40rpx;
-		display: flex;
-		flex-direction: column;
-		align-items: center;
-		box-shadow: 0 4rpx 30rpx rgba(0,0,0,0.03);
-	}
-	.success-icon {
-		margin-bottom: 40rpx;
-	}
-	.status-title {
-		font-size: 40rpx;
-		font-weight: bold;
-		color: #333;
-		margin-bottom: 16rpx;
-	}
-	.status-desc {
-		font-size: 28rpx;
-		color: #999;
-		margin-bottom: 80rpx;
-	}
-	.btn-group {
-		width: 100%;
-		display: flex;
-		flex-direction: column;
-		gap: 24rpx;
-	}
-	.primary-btn {
-		width: 100%;
-		height: 96rpx;
-		background: #C1001C;
-		color: #fff;
-		border-radius: 48rpx;
-		font-size: 32rpx;
-		font-weight: bold;
-		display: flex;
-		align-items: center;
-		justify-content: center;
-		border: none;
-		box-shadow: 0 10rpx 20rpx rgba(193, 0, 28, 0.15);
-	}
-	.outline-btn {
-		width: 100%;
-		height: 96rpx;
-		background: #fff;
-		color: #C1001C;
-		border-radius: 48rpx;
-		font-size: 32rpx;
-		font-weight: bold;
-		display: flex;
-		align-items: center;
-		justify-content: center;
-		border: 2rpx solid #C1001C;
-	}
-	.text-btn {
-		margin-top: 20rpx;
-		background: transparent;
-		color: #666;
-		font-size: 28rpx;
-		border: none;
-		text-decoration: underline; /* 增加下划线提示可点击 */
-	}
-	.text-btn:active {
-		color: #333;
-		opacity: 0.8;
-	}
+.success-container {
+	width: 100%;
+	min-height: 100vh;
+	background: #f7f8fa;
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	padding-top: 15vh;
+}
+
+.success-card {
+	width: 90%;
+	background: #fff;
+	border-radius: 32rpx;
+	padding: 80rpx 40rpx;
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	box-shadow: 0 4rpx 30rpx rgba(0, 0, 0, 0.03);
+}
+
+.success-icon {
+	margin-bottom: 40rpx;
+}
+
+.status-title {
+	font-size: 40rpx;
+	font-weight: bold;
+	color: #333;
+	margin-bottom: 16rpx;
+}
+
+.status-desc {
+	font-size: 28rpx;
+	color: #999;
+	margin-bottom: 80rpx;
+}
+
+.btn-group {
+	width: 100%;
+	display: flex;
+	flex-direction: column;
+	gap: 24rpx;
+}
+
+.primary-btn {
+	width: 100%;
+	height: 96rpx;
+	background: #C1001C;
+	color: #fff;
+	border-radius: 48rpx;
+	font-size: 32rpx;
+	font-weight: bold;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	border: none;
+	box-shadow: 0 10rpx 20rpx rgba(193, 0, 28, 0.15);
+}
+
+.outline-btn {
+	width: 100%;
+	height: 96rpx;
+	background: #fff;
+	color: #C1001C;
+	border-radius: 48rpx;
+	font-size: 32rpx;
+	font-weight: bold;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	border: 2rpx solid #C1001C;
+}
+
+.text-btn {
+	margin-top: 20rpx;
+	background: transparent;
+	color: #666;
+	font-size: 28rpx;
+	border: none;
+	text-decoration: underline;
+	/* 增加下划线提示可点击 */
+}
+
+.text-btn:active {
+	color: #333;
+	opacity: 0.8;
+}
 </style>

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

@@ -0,0 +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;;;;"}

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

@@ -0,0 +1 @@
+{"version":3,"file":"agreement.js","sources":["api/system/agreement.js"],"sourcesContent":["import request from '@/utils/request';\n\n/**\n * 根据ID查询协议信息\n * @param {number} id 1=用户协议 2=隐私政策\n */\nexport function getAgreement(id) {\n\treturn request({ url: `/system/agreement/${id}`, method: 'GET' });\n}\n"],"names":["request"],"mappings":";;AAMO,SAAS,aAAa,IAAI;AAChC,SAAOA,cAAO,QAAC,EAAE,KAAK,qBAAqB,EAAE,IAAI,QAAQ,MAAK,CAAE;AACjE;;"}

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/erp-nav-bar.js.map


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/index.js.map


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/login/index.js.map


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/agreement/index.js.map


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/complaint/index.js.map


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/index.js.map


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/privacy/index.js.map


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/mine/settings/index.js.map


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/order/add-model/index.js.map


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/order/detail/index.js.map


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/order/edit-model/index.js.map


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/order/index.js.map


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/order/list/index.js.map


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/order/success/index.js.map


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/utils/request.js.map


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

@@ -0,0 +1,31 @@
+"use strict";
+const utils_request = require("../../utils/request.js");
+function wechatLogin(data) {
+  return utils_request.request({
+    url: "/auth/login",
+    method: "post",
+    data: {
+      ...data,
+      clientId: "e48ac397bff4f031b14d6e671eee49c3",
+      grantType: "wechatApplet"
+    }
+  });
+}
+function getWechatPhone(data) {
+  return utils_request.request({
+    url: "/auth/wechat/phone",
+    method: "post",
+    data
+  });
+}
+function wechatRegister(data) {
+  return utils_request.request({
+    url: "/auth/wechat/register",
+    method: "post",
+    data
+  });
+}
+exports.getWechatPhone = getWechatPhone;
+exports.wechatLogin = wechatLogin;
+exports.wechatRegister = wechatRegister;
+//# sourceMappingURL=../../../.sourcemap/mp-weixin/api/auth/index.js.map

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

@@ -0,0 +1,7 @@
+"use strict";
+const utils_request = require("../../utils/request.js");
+function getAgreement(id) {
+  return utils_request.request({ url: `/system/agreement/${id}`, method: "GET" });
+}
+exports.getAgreement = getAgreement;
+//# sourceMappingURL=../../../.sourcemap/mp-weixin/api/system/agreement.js.map

+ 2 - 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_xfPAnv";
+  const id = "mp-weixin_alL6lY";
   const lazy = typeof swan !== "undefined";
   let restoreError = lazy ? () => {
   } : initOnError();
@@ -8042,4 +8042,5 @@ exports.o = o;
 exports.p = p;
 exports.resolveComponent = resolveComponent;
 exports.t = t;
+exports.wx$1 = wx$1;
 //# sourceMappingURL=../../.sourcemap/mp-weixin/common/vendor.js.map

+ 41 - 0
unpackage/dist/dev/mp-weixin/components/erp-nav-bar.js

@@ -0,0 +1,41 @@
+"use strict";
+const common_vendor = require("../common/vendor.js");
+const _sfc_main = {
+  name: "ErpNavBar",
+  props: {
+    title: { type: String, default: "" },
+    showBack: { type: Boolean, default: true },
+    bgColor: { type: String, default: "#ffffff" },
+    titleColor: { type: String, default: "#333333" }
+  },
+  data() {
+    return { statusBarHeight: 20 };
+  },
+  mounted() {
+    this.statusBarHeight = common_vendor.index.getSystemInfoSync().statusBarHeight || 20;
+  },
+  methods: {
+    handleBack() {
+      if (this.showBack) {
+        this.$emit("back");
+        common_vendor.index.navigateBack();
+      }
+    }
+  }
+};
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+  return common_vendor.e({
+    a: $props.showBack
+  }, $props.showBack ? {
+    b: $props.titleColor
+  } : {}, {
+    c: common_vendor.o((...args) => $options.handleBack && $options.handleBack(...args), "6f"),
+    d: common_vendor.t($props.title),
+    e: $props.titleColor,
+    f: $data.statusBarHeight + "px",
+    g: $props.bgColor
+  });
+}
+const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-1c584cd2"]]);
+wx.createComponent(Component);
+//# sourceMappingURL=../../.sourcemap/mp-weixin/components/erp-nav-bar.js.map

+ 0 - 0
unpackage/dist/dev/mp-weixin/components/erp-tab-bar/erp-tab-bar.json → unpackage/dist/dev/mp-weixin/components/erp-nav-bar.json


+ 1 - 0
unpackage/dist/dev/mp-weixin/components/erp-nav-bar.wxml

@@ -0,0 +1 @@
+<view class="erp-nav-bar data-v-1c584cd2" style="{{'padding-top:' + f + ';' + ('background-color:' + g)}}"><view class="erp-nav-content data-v-1c584cd2"><view class="erp-nav-left data-v-1c584cd2" bindtap="{{c}}"><view wx:if="{{a}}" class="erp-back-arrow data-v-1c584cd2" style="{{'border-color:' + b}}"></view></view><text class="erp-nav-title data-v-1c584cd2" style="{{'color:' + e}}">{{d}}</text><view class="erp-nav-right data-v-1c584cd2"><slot name="right"></slot></view></view></view>

+ 40 - 0
unpackage/dist/dev/mp-weixin/components/erp-nav-bar.wxss

@@ -0,0 +1,40 @@
+
+.erp-nav-bar.data-v-1c584cd2 {
+	width: 100%;
+	flex-shrink: 0;
+}
+.erp-nav-content.data-v-1c584cd2 {
+	height: 44px;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 0 30rpx;
+}
+.erp-nav-left.data-v-1c584cd2 {
+	width: 60rpx;
+	height: 44px;
+	display: flex;
+	align-items: center;
+}
+.erp-back-arrow.data-v-1c584cd2 {
+	width: 20rpx;
+	height: 20rpx;
+	border-left: 4rpx solid #333;
+	border-bottom: 4rpx solid #333;
+	transform: rotate(45deg);
+	margin-left: 8rpx;
+}
+.erp-nav-title.data-v-1c584cd2 {
+	flex: 1;
+	text-align: center;
+	font-size: 34rpx;
+	font-weight: bold;
+	color: #333333;
+}
+.erp-nav-right.data-v-1c584cd2 {
+	width: 60rpx;
+	height: 44px;
+	display: flex;
+	align-items: center;
+	justify-content: flex-end;
+}

+ 0 - 44
unpackage/dist/dev/mp-weixin/components/erp-tab-bar/erp-tab-bar.js

@@ -1,44 +0,0 @@
-"use strict";
-const common_vendor = require("../../common/vendor.js");
-const _sfc_main = {
-  props: {
-    active: { type: String, default: "order" }
-  },
-  data() {
-    return {};
-  },
-  methods: {
-    switchTab(code) {
-      let url = "";
-      switch (code) {
-        case "home":
-          url = "/pages/index/index";
-          break;
-        case "order":
-          url = "/pages/order/index";
-          break;
-        case "mine":
-          url = "/pages/mine/index";
-          break;
-      }
-      if (url)
-        common_vendor.index.reLaunch({ url });
-    }
-  }
-};
-function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
-  return {
-    a: $props.active === "home" ? "/static/tabs/home_active.png" : "/static/tabs/home.png",
-    b: common_vendor.o(($event) => $options.switchTab("home"), "1d"),
-    c: $props.active === "home" ? 1 : "",
-    d: $props.active === "order" ? "/static/tabs/order_active.png" : "/static/tabs/order.png",
-    e: common_vendor.o(($event) => $options.switchTab("order"), "6a"),
-    f: $props.active === "order" ? 1 : "",
-    g: $props.active === "mine" ? "/static/tabs/mine_active.png" : "/static/tabs/mine.png",
-    h: common_vendor.o(($event) => $options.switchTab("mine"), "75"),
-    i: $props.active === "mine" ? 1 : ""
-  };
-}
-const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-e7719d4f"]]);
-wx.createComponent(Component);
-//# sourceMappingURL=../../../.sourcemap/mp-weixin/components/erp-tab-bar/erp-tab-bar.js.map

+ 0 - 1
unpackage/dist/dev/mp-weixin/components/erp-tab-bar/erp-tab-bar.wxml

@@ -1 +0,0 @@
-<view class="tab-bar-container data-v-e7719d4f"><view class="tab-bar-content data-v-e7719d4f"><view bindtap="{{b}}" class="{{['tab-item', 'data-v-e7719d4f', c && 'active']}}"><image class="tab-icon data-v-e7719d4f" src="{{a}}" mode="aspectFit"></image><text class="tab-text data-v-e7719d4f">首页</text></view><view bindtap="{{e}}" class="{{['tab-item', 'data-v-e7719d4f', f && 'active']}}"><image class="tab-icon data-v-e7719d4f" src="{{d}}" mode="aspectFit"></image><text class="tab-text data-v-e7719d4f">下单</text></view><view bindtap="{{h}}" class="{{['tab-item', 'data-v-e7719d4f', i && 'active']}}"><image class="tab-icon data-v-e7719d4f" src="{{g}}" mode="aspectFit"></image><text class="tab-text data-v-e7719d4f">我的</text></view></view></view>

+ 0 - 51
unpackage/dist/dev/mp-weixin/components/erp-tab-bar/erp-tab-bar.wxss

@@ -1,51 +0,0 @@
-
-.tab-bar-container.data-v-e7719d4f { 
-		position: fixed; 
-		bottom: 0; 
-		left: 0; 
-		right: 0; 
-		z-index: 999;
-		display: flex;
-		flex-direction: column;
-		background: rgba(255, 255, 255, 0.98);
-		-webkit-backdrop-filter: blur(10px);
-		        backdrop-filter: blur(10px);
-		box-shadow: 0 -4rpx 30rpx rgba(0, 0, 0, 0.06);
-		/* 确保底部安全区也被该背景色填充 */
-		padding-bottom: env(safe-area-inset-bottom);
-}
-.tab-bar-content.data-v-e7719d4f {
-		position: relative;
-		z-index: 2;
-		height: 100rpx;
-		display: flex;
-		align-items: center;
-		justify-content: space-around;
-}
-.tab-item.data-v-e7719d4f {
-		flex: 1;
-		display: flex;
-		flex-direction: column;
-		align-items: center;
-		justify-content: center;
-		height: 100%;
-}
-.tab-icon.data-v-e7719d4f {
-		width: 52rpx;
-		height: 52rpx;
-		margin-bottom: 4rpx;
-		display: block;
-}
-.tab-text.data-v-e7719d4f {
-		font-size: 22rpx;
-		color: #999;
-		line-height: 1;
-}
-.tab-item.active .tab-text.data-v-e7719d4f {
-		color: #C1001C;
-		font-weight: 600;
-}
-.tab-item.active .tab-icon.data-v-e7719d4f {
-		/* 去掉微动效,防止加载感延迟 */
-		transform: none;
-}

+ 0 - 44
unpackage/dist/dev/mp-weixin/components/erp-tab-bar/index.js

@@ -1,44 +0,0 @@
-"use strict";
-const common_vendor = require("../../common/vendor.js");
-const _sfc_main = {
-  props: {
-    active: { type: String, default: "order" }
-  },
-  data() {
-    return {};
-  },
-  methods: {
-    switchTab(code) {
-      let url = "";
-      switch (code) {
-        case "home":
-          url = "/pages/index/index";
-          break;
-        case "order":
-          url = "/pages/order/index";
-          break;
-        case "mine":
-          url = "/pages/mine/index";
-          break;
-      }
-      if (url)
-        common_vendor.index.reLaunch({ url });
-    }
-  }
-};
-function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
-  return {
-    a: $props.active === "home" ? "/static/tabs/home_active.png" : "/static/tabs/home.png",
-    b: common_vendor.o(($event) => $options.switchTab("home"), "1d"),
-    c: $props.active === "home" ? 1 : "",
-    d: $props.active === "order" ? "/static/tabs/order_active.png" : "/static/tabs/order.png",
-    e: common_vendor.o(($event) => $options.switchTab("order"), "6a"),
-    f: $props.active === "order" ? 1 : "",
-    g: $props.active === "mine" ? "/static/tabs/mine_active.png" : "/static/tabs/mine.png",
-    h: common_vendor.o(($event) => $options.switchTab("mine"), "75"),
-    i: $props.active === "mine" ? 1 : ""
-  };
-}
-const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-379cacd1"]]);
-wx.createComponent(Component);
-//# sourceMappingURL=../../../.sourcemap/mp-weixin/components/erp-tab-bar/index.js.map

+ 0 - 4
unpackage/dist/dev/mp-weixin/components/erp-tab-bar/index.json

@@ -1,4 +0,0 @@
-{
-  "component": true,
-  "usingComponents": {}
-}

+ 0 - 1
unpackage/dist/dev/mp-weixin/components/erp-tab-bar/index.wxml

@@ -1 +0,0 @@
-<view class="tab-bar-container data-v-379cacd1"><view class="tab-bar-content data-v-379cacd1"><view bindtap="{{b}}" class="{{['tab-item', 'data-v-379cacd1', c && 'active']}}"><image class="tab-icon data-v-379cacd1" src="{{a}}" mode="aspectFit"></image><text class="tab-text data-v-379cacd1">首页</text></view><view bindtap="{{e}}" class="{{['tab-item', 'data-v-379cacd1', f && 'active']}}"><image class="tab-icon data-v-379cacd1" src="{{d}}" mode="aspectFit"></image><text class="tab-text data-v-379cacd1">下单</text></view><view bindtap="{{h}}" class="{{['tab-item', 'data-v-379cacd1', i && 'active']}}"><image class="tab-icon data-v-379cacd1" src="{{g}}" mode="aspectFit"></image><text class="tab-text data-v-379cacd1">我的</text></view></view></view>

+ 0 - 51
unpackage/dist/dev/mp-weixin/components/erp-tab-bar/index.wxss

@@ -1,51 +0,0 @@
-
-.tab-bar-container.data-v-379cacd1 { 
-		position: fixed; 
-		bottom: 0; 
-		left: 0; 
-		right: 0; 
-		z-index: 999;
-		display: flex;
-		flex-direction: column;
-		background: rgba(255, 255, 255, 0.98);
-		-webkit-backdrop-filter: blur(10px);
-		        backdrop-filter: blur(10px);
-		box-shadow: 0 -4rpx 30rpx rgba(0, 0, 0, 0.06);
-		/* 确保底部安全区也被该背景色填充 */
-		padding-bottom: env(safe-area-inset-bottom);
-}
-.tab-bar-content.data-v-379cacd1 {
-		position: relative;
-		z-index: 2;
-		height: 100rpx;
-		display: flex;
-		align-items: center;
-		justify-content: space-around;
-}
-.tab-item.data-v-379cacd1 {
-		flex: 1;
-		display: flex;
-		flex-direction: column;
-		align-items: center;
-		justify-content: center;
-		height: 100%;
-}
-.tab-icon.data-v-379cacd1 {
-		width: 52rpx;
-		height: 52rpx;
-		margin-bottom: 4rpx;
-		display: block;
-}
-.tab-text.data-v-379cacd1 {
-		font-size: 22rpx;
-		color: #999;
-		line-height: 1;
-}
-.tab-item.active .tab-text.data-v-379cacd1 {
-		color: #C1001C;
-		font-weight: 600;
-}
-.tab-item.active .tab-icon.data-v-379cacd1 {
-		/* 去掉微动效,防止加载感延迟 */
-		transform: none;
-}

+ 14 - 8
unpackage/dist/dev/mp-weixin/pages/index/index.js

@@ -2,8 +2,9 @@
 const common_vendor = require("../../common/vendor.js");
 const utils_assets = require("../../utils/assets.js");
 const ErpTabBar = () => "../../components/erp-tab-bar.js";
+const ErpNavBar = () => "../../components/erp-nav-bar.js";
 const _sfc_main = {
-  components: { ErpTabBar },
+  components: { ErpTabBar, ErpNavBar },
   data() {
     return {
       assets: utils_assets.assets,
@@ -58,12 +59,17 @@ const _sfc_main = {
   }
 };
 if (!Array) {
+  const _component_erp_nav_bar = common_vendor.resolveComponent("erp-nav-bar");
   const _component_erp_tab_bar = common_vendor.resolveComponent("erp-tab-bar");
-  _component_erp_tab_bar();
+  (_component_erp_nav_bar + _component_erp_tab_bar)();
 }
 function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
   return {
-    a: common_vendor.f($data.banners, (item, index, i0) => {
+    a: common_vendor.p({
+      title: "华晶型材",
+      ["show-back"]: false
+    }),
+    b: common_vendor.f($data.banners, (item, index, i0) => {
       return {
         a: item.url,
         b: common_vendor.t(item.tag),
@@ -72,15 +78,15 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
         e: index
       };
     }),
-    b: common_vendor.o((...args) => $options.handleBannerChange && $options.handleBannerChange(...args), "ff"),
-    c: common_vendor.f($data.banners, (item, index, i0) => {
+    c: common_vendor.o((...args) => $options.handleBannerChange && $options.handleBannerChange(...args), "84"),
+    d: common_vendor.f($data.banners, (item, index, i0) => {
       return {
         a: index,
         b: $data.currentBanner === index ? 1 : ""
       };
     }),
-    d: common_vendor.o((...args) => $options.callService && $options.callService(...args), "35"),
-    e: common_vendor.f($data.cubeProducts, (item, index, i0) => {
+    e: common_vendor.o((...args) => $options.callService && $options.callService(...args), "c9"),
+    f: common_vendor.f($data.cubeProducts, (item, index, i0) => {
       return {
         a: item.image,
         b: common_vendor.t(item.name),
@@ -89,7 +95,7 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
         e: common_vendor.o((...args) => $options.goToOrder && $options.goToOrder(...args), index)
       };
     }),
-    f: common_vendor.p({
+    g: common_vendor.p({
       active: "home"
     })
   };

+ 3 - 4
unpackage/dist/dev/mp-weixin/pages/index/index.json

@@ -1,8 +1,7 @@
 {
-  "navigationBarTitleText": "华晟型材",
-  "navigationBarBackgroundColor": "#FFFFFF",
-  "navigationBarTextStyle": "black",
+  "navigationStyle": "custom",
   "usingComponents": {
-    "erp-tab-bar": "../../components/erp-tab-bar"
+    "erp-tab-bar": "../../components/erp-tab-bar",
+    "erp-nav-bar": "../../components/erp-nav-bar"
   }
 }

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages/index/index.wxml


+ 286 - 108
unpackage/dist/dev/mp-weixin/pages/index/index.wxss

@@ -1,120 +1,298 @@
 
-.home-page.data-v-1cf27b2a { width: 100vw; height: 100vh; background-color: #F8FAFC; display: flex; flex-direction: column;
+.home-page.data-v-1cf27b2a {
+	width: 100vw;
+	height: 100vh;
+	background-color: #F8FAFC;
+	display: flex;
+	flex-direction: column;
 }
-.main-scroll.data-v-1cf27b2a { flex: 1; height: 0;
+.main-scroll.data-v-1cf27b2a {
+	flex: 1;
+	height: 0;
 }
 
-	/* 英雄轮播区 */
-.hero-section.data-v-1cf27b2a { position: relative; width: 100%; height: 500rpx; overflow: hidden;
-}
-.hero-swiper.data-v-1cf27b2a { height: 100%;
-}
-.hero-card.data-v-1cf27b2a { position: relative; width: 100%; height: 100%;
-}
-.hero-img.data-v-1cf27b2a { width: 100%; height: 100%;
-}
-.hero-overlay.data-v-1cf27b2a { position: absolute; inset: 0; background: linear-gradient(to bottom, rgba(0,0,0,0.1), rgba(0,0,0,0.5));
-}
-.hero-text-content.data-v-1cf27b2a { position: absolute; left: 40rpx; bottom: 80rpx; color: #fff; z-index: 2;
-}
-.hero-tag.data-v-1cf27b2a { font-size: 20rpx; background: rgba(193,0,28,0.8); padding: 4rpx 16rpx; border-radius: 4rpx; margin-bottom: 12rpx; display: inline-block;
-}
-.hero-main-title.data-v-1cf27b2a { font-size: 44rpx; font-weight: bold; display: block; margin-bottom: 8rpx;
-}
-.hero-sub-title.data-v-1cf27b2a { font-size: 24rpx; opacity: 0.8; letter-spacing: 1rpx;
-}
-.hero-indicators.data-v-1cf27b2a { position: absolute; bottom: 40rpx; right: 40rpx; display: flex; gap: 8rpx;
-}
-.indicator-pill.data-v-1cf27b2a { width: 12rpx; height: 6rpx; background: rgba(255,255,255,0.3); border-radius: 4rpx; transition: 0.3s;
-}
-.indicator-pill.active.data-v-1cf27b2a { width: 32rpx; background: #fff;
+/* 英雄轮播区 */
+.hero-section.data-v-1cf27b2a {
+	position: relative;
+	width: 100%;
+	height: 500rpx;
+	overflow: hidden;
+}
+.hero-swiper.data-v-1cf27b2a {
+	height: 100%;
+}
+.hero-card.data-v-1cf27b2a {
+	position: relative;
+	width: 100%;
+	height: 100%;
+}
+.hero-img.data-v-1cf27b2a {
+	width: 100%;
+	height: 100%;
+}
+.hero-overlay.data-v-1cf27b2a {
+	position: absolute;
+	inset: 0;
+	background: linear-gradient(to bottom, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.5));
+}
+.hero-text-content.data-v-1cf27b2a {
+	position: absolute;
+	left: 40rpx;
+	bottom: 80rpx;
+	color: #fff;
+	z-index: 2;
+}
+.hero-tag.data-v-1cf27b2a {
+	font-size: 20rpx;
+	background: rgba(193, 0, 28, 0.8);
+	padding: 4rpx 16rpx;
+	border-radius: 4rpx;
+	margin-bottom: 12rpx;
+	display: inline-block;
+}
+.hero-main-title.data-v-1cf27b2a {
+	font-size: 44rpx;
+	font-weight: bold;
+	display: block;
+	margin-bottom: 8rpx;
+}
+.hero-sub-title.data-v-1cf27b2a {
+	font-size: 24rpx;
+	opacity: 0.8;
+	letter-spacing: 1rpx;
+}
+.hero-indicators.data-v-1cf27b2a {
+	position: absolute;
+	bottom: 40rpx;
+	right: 40rpx;
+	display: flex;
+	gap: 8rpx;
+}
+.indicator-pill.data-v-1cf27b2a {
+	width: 12rpx;
+	height: 6rpx;
+	background: rgba(255, 255, 255, 0.3);
+	border-radius: 4rpx;
+	transition: 0.3s;
+}
+.indicator-pill.active.data-v-1cf27b2a {
+	width: 32rpx;
+	background: #fff;
 }
 
-	/* 咨询卡片 */
+/* 咨询卡片 */
 .contact-card.data-v-1cf27b2a {
-		margin: -40rpx 40rpx 40rpx; position: relative; z-index: 10;
-		background: rgba(255,255,255,0.9); -webkit-backdrop-filter: blur(20px); backdrop-filter: blur(20px);
-		border-radius: 24rpx; padding: 32rpx 40rpx; display: flex; align-items: center; 
-		justify-content: space-between; border: 1rpx solid #fff;
-		box-shadow: 0 12rpx 40rpx rgba(0,0,0,0.06);
-}
-.contact-info.data-v-1cf27b2a { display: flex; align-items: center;
-}
-.contact-icon-box.data-v-1cf27b2a { width: 88rpx; height: 88rpx; background: #FFF1F2; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin-right: 24rpx;
-}
-.contact-icon-box image.data-v-1cf27b2a { width: 44rpx; height: 44rpx;
-}
-.main-txt.data-v-1cf27b2a { font-size: 30rpx; font-weight: bold; color: #1a1a1a; display: block; margin-bottom: 4rpx;
-}
-.sub-txt.data-v-1cf27b2a { font-size: 22rpx; color: #7a7a7a;
-}
-.call-btn-circle.data-v-1cf27b2a { width: 72rpx; height: 72rpx; background: #C1001C; border-radius: 50%; display: flex; align-items: center; justify-content: center; box-shadow: 0 6rpx 12rpx rgba(193,0,28,0.3);
-}
-.call-btn-circle image.data-v-1cf27b2a { width: 32rpx; height: 32rpx;
+	margin: -40rpx 40rpx 40rpx;
+	position: relative;
+	z-index: 10;
+	background: rgba(255, 255, 255, 0.9);
+	-webkit-backdrop-filter: blur(20px);
+	        backdrop-filter: blur(20px);
+	border-radius: 24rpx;
+	padding: 32rpx 40rpx;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	border: 1rpx solid #fff;
+	box-shadow: 0 12rpx 40rpx rgba(0, 0, 0, 0.06);
+}
+.contact-info.data-v-1cf27b2a {
+	display: flex;
+	align-items: center;
+}
+.contact-icon-box.data-v-1cf27b2a {
+	width: 88rpx;
+	height: 88rpx;
+	background: #FFF1F2;
+	border-radius: 50%;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	margin-right: 24rpx;
+}
+.contact-icon-box image.data-v-1cf27b2a {
+	width: 44rpx;
+	height: 44rpx;
+}
+.main-txt.data-v-1cf27b2a {
+	font-size: 30rpx;
+	font-weight: bold;
+	color: #1a1a1a;
+	display: block;
+	margin-bottom: 4rpx;
+}
+.sub-txt.data-v-1cf27b2a {
+	font-size: 22rpx;
+	color: #7a7a7a;
+}
+.call-btn-circle.data-v-1cf27b2a {
+	width: 72rpx;
+	height: 72rpx;
+	background: #C1001C;
+	border-radius: 50%;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	box-shadow: 0 6rpx 12rpx rgba(193, 0, 28, 0.3);
+}
+.call-btn-circle image.data-v-1cf27b2a {
+	width: 32rpx;
+	height: 32rpx;
 }
 
-	/* 魔方布局 */
-.cube-section.data-v-1cf27b2a { padding: 20rpx 40rpx;
-}
-.section-header.data-v-1cf27b2a { margin-bottom: 30rpx;
-}
-.title-with-line.data-v-1cf27b2a { display: flex; align-items: baseline; gap: 16rpx;
-}
-.title-with-line .zh.data-v-1cf27b2a { font-size: 36rpx; font-weight: 800; color: #1a1a1a;
-}
-.title-with-line .en.data-v-1cf27b2a { font-size: 20rpx; color: #999; font-family: 'Georgia'; letter-spacing: 2rpx;
-}
-.cube-container.data-v-1cf27b2a { width: 100%;
-}
-.cube-grid.data-v-1cf27b2a { display: grid; grid-template-columns: repeat(2, 1fr); gap: 20rpx;
-}
-.cube-card.data-v-1cf27b2a { 
-		position: relative; height: 320rpx; border-radius: 20rpx; overflow: hidden;
-		background: #eee; transition: 0.3s;
-}
-.cube-bg.data-v-1cf27b2a { width: 100%; height: 100%;
-}
-.cube-mask.data-v-1cf27b2a { position: absolute; inset: 0; background: rgba(0,0,0,0.3);
-}
-.cube-content.data-v-1cf27b2a { position: absolute; left: 30rpx; top: 30rpx; z-index: 2;
-}
-.cube-title.data-v-1cf27b2a { font-size: 32rpx; font-weight: bold; color: #fff; margin-bottom: 12rpx; display: block;
-}
-.cube-line.data-v-1cf27b2a { width: 40rpx; height: 4rpx; background: #C1001C; margin-bottom: 12rpx;
-}
-.cube-desc.data-v-1cf27b2a { font-size: 20rpx; color: rgba(255,255,255,0.8); max-width: 240rpx; line-height: 1.4; display: block;
-}
-.cube-arrow.data-v-1cf27b2a { position: absolute; right: 30rpx; bottom: 30rpx; color: #fff; font-size: 30rpx; opacity: 0.6;
+/* 魔方布局 */
+.cube-section.data-v-1cf27b2a {
+	padding: 20rpx 40rpx;
+}
+.section-header.data-v-1cf27b2a {
+	margin-bottom: 30rpx;
+}
+.title-with-line.data-v-1cf27b2a {
+	display: flex;
+	align-items: baseline;
+	gap: 16rpx;
+}
+.title-with-line .zh.data-v-1cf27b2a {
+	font-size: 36rpx;
+	font-weight: 800;
+	color: #1a1a1a;
+}
+.title-with-line .en.data-v-1cf27b2a {
+	font-size: 20rpx;
+	color: #999;
+	font-family: 'Georgia';
+	letter-spacing: 2rpx;
+}
+.cube-container.data-v-1cf27b2a {
+	width: 100%;
+}
+.cube-grid.data-v-1cf27b2a {
+	display: grid;
+	grid-template-columns: repeat(2, 1fr);
+	gap: 20rpx;
+}
+.cube-card.data-v-1cf27b2a {
+	position: relative;
+	height: 320rpx;
+	border-radius: 20rpx;
+	overflow: hidden;
+	background: #eee;
+	transition: 0.3s;
+}
+.cube-bg.data-v-1cf27b2a {
+	width: 100%;
+	height: 100%;
+}
+.cube-mask.data-v-1cf27b2a {
+	position: absolute;
+	inset: 0;
+	background: rgba(0, 0, 0, 0.3);
+}
+.cube-content.data-v-1cf27b2a {
+	position: absolute;
+	left: 30rpx;
+	top: 30rpx;
+	z-index: 2;
+}
+.cube-title.data-v-1cf27b2a {
+	font-size: 32rpx;
+	font-weight: bold;
+	color: #fff;
+	margin-bottom: 12rpx;
+	display: block;
+}
+.cube-line.data-v-1cf27b2a {
+	width: 40rpx;
+	height: 4rpx;
+	background: #C1001C;
+	margin-bottom: 12rpx;
+}
+.cube-desc.data-v-1cf27b2a {
+	font-size: 20rpx;
+	color: rgba(255, 255, 255, 0.8);
+	max-width: 240rpx;
+	line-height: 1.4;
+	display: block;
+}
+.cube-arrow.data-v-1cf27b2a {
+	position: absolute;
+	right: 30rpx;
+	bottom: 30rpx;
+	color: #fff;
+	font-size: 30rpx;
+	opacity: 0.6;
 }
 
-	/* 企业实力 */
-.brand-strength.data-v-1cf27b2a { padding: 40rpx; margin-bottom: 40rpx;
-}
-.strength-card.data-v-1cf27b2a { 
-		background: #1a1a1a; border-radius: 32rpx; padding: 48rpx 40rpx; color: #fff;
-		box-shadow: 0 20rpx 60rpx rgba(0,0,0,0.15);
-}
-.s-header.data-v-1cf27b2a { margin-bottom: 50rpx;
-}
-.s-title.data-v-1cf27b2a { font-size: 34rpx; font-weight: bold; display: block; margin-bottom: 8rpx; color: #fff; letter-spacing: 4rpx;
-}
-.s-subtitle.data-v-1cf27b2a { font-size: 18rpx; color: #666; font-family: 'Arial'; text-transform: uppercase;
-}
-.s-stats.data-v-1cf27b2a { display: flex; justify-content: space-between; align-items: center; margin-bottom: 40rpx;
-}
-.stat-box.data-v-1cf27b2a { text-align: center; flex: 1;
-}
-.stat-box .num.data-v-1cf27b2a { font-size: 44rpx; font-weight: 800; color: #FFD700; display: block; margin-bottom: 4rpx;
-}
-.stat-box .unit.data-v-1cf27b2a { font-size: 20rpx; margin-left: 4rpx; font-weight: normal;
-}
-.stat-box .label.data-v-1cf27b2a { font-size: 22rpx; color: #ababab;
-}
-.stat-divider.data-v-1cf27b2a { width: 1rpx; height: 50rpx; background: rgba(255,255,255,0.1);
-}
-.s-footer.data-v-1cf27b2a { border-top: 1rpx solid rgba(255,255,255,0.05); padding-top: 30rpx; text-align: center;
-}
-.s-footer text.data-v-1cf27b2a { font-size: 18rpx; color: #555; letter-spacing: 6rpx;
-}
-.safe-bottom-gap.data-v-1cf27b2a { height: 140rpx;
+/* 企业实力 */
+.brand-strength.data-v-1cf27b2a {
+	padding: 40rpx;
+	margin-bottom: 40rpx;
+}
+.strength-card.data-v-1cf27b2a {
+	background: #1a1a1a;
+	border-radius: 32rpx;
+	padding: 48rpx 40rpx;
+	color: #fff;
+	box-shadow: 0 20rpx 60rpx rgba(0, 0, 0, 0.15);
+}
+.s-header.data-v-1cf27b2a {
+	margin-bottom: 50rpx;
+}
+.s-title.data-v-1cf27b2a {
+	font-size: 34rpx;
+	font-weight: bold;
+	display: block;
+	margin-bottom: 8rpx;
+	color: #fff;
+	letter-spacing: 4rpx;
+}
+.s-subtitle.data-v-1cf27b2a {
+	font-size: 18rpx;
+	color: #666;
+	font-family: 'Arial';
+	text-transform: uppercase;
+}
+.s-stats.data-v-1cf27b2a {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	margin-bottom: 40rpx;
+}
+.stat-box.data-v-1cf27b2a {
+	text-align: center;
+	flex: 1;
+}
+.stat-box .num.data-v-1cf27b2a {
+	font-size: 44rpx;
+	font-weight: 800;
+	color: #FFD700;
+	display: block;
+	margin-bottom: 4rpx;
+}
+.stat-box .unit.data-v-1cf27b2a {
+	font-size: 20rpx;
+	margin-left: 4rpx;
+	font-weight: normal;
+}
+.stat-box .label.data-v-1cf27b2a {
+	font-size: 22rpx;
+	color: #ababab;
+}
+.stat-divider.data-v-1cf27b2a {
+	width: 1rpx;
+	height: 50rpx;
+	background: rgba(255, 255, 255, 0.1);
+}
+.s-footer.data-v-1cf27b2a {
+	border-top: 1rpx solid rgba(255, 255, 255, 0.05);
+	padding-top: 30rpx;
+	text-align: center;
+}
+.s-footer text.data-v-1cf27b2a {
+	font-size: 18rpx;
+	color: #555;
+	letter-spacing: 6rpx;
+}
+.safe-bottom-gap.data-v-1cf27b2a {
+	height: 140rpx;
 }

+ 126 - 32
unpackage/dist/dev/mp-weixin/pages/login/index.js

@@ -1,19 +1,24 @@
 "use strict";
 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 _sfc_main = {
   data() {
     return {
       assets: utils_assets.assets,
       isAgreed: false,
       activeModal: "",
-      userAvatar: "",
+      avatarBase64: "",
       userName: "微信用户",
       currentProtocol: { title: "", content: "" },
       protocols: {
-        user: { title: "用户服务协议", content: '<div style="line-height:1.8;"><h4 style="margin-bottom:10px;">服务内容</h4><p>欢迎使用ERP系统,我们将为您提供高效的下单管理服务。本协议旨在明确双方权利与义务...</p></div>' },
-        privacy: { title: "隐私政策", content: '<div style="line-height:1.8;"><h4 style="margin-bottom:10px;">隐私保护</h4><p>我们非常重视您的个人信息保护。我们会按照法律法规要求,采取相应的安全保护措施...</p></div>' }
-      }
+        user: { title: "", content: "" },
+        privacy: { title: "", content: "" }
+      },
+      openId: "",
+      unionId: "",
+      phoneNumber: ""
     };
   },
   methods: {
@@ -24,29 +29,105 @@ const _sfc_main = {
       if (!this.isAgreed)
         this.activeModal = "confirm";
       else
-        this.activeModal = "profile";
+        this.performLogin();
     },
     agreeAndClose() {
       this.isAgreed = true;
       this.activeModal = "";
     },
-    completeLogin() {
-      common_vendor.index.showLoading({ title: "登录中..." });
-      common_vendor.index.setStorageSync("isLogin", true);
-      setTimeout(() => {
+    async performLogin() {
+      try {
+        common_vendor.index.showLoading({ title: "登录中..." });
+        const loginRes = await new Promise((resolve, reject) => {
+          common_vendor.wx$1.login({
+            success: resolve,
+            fail: reject
+          });
+        });
+        if (!loginRes.code) {
+          common_vendor.index.hideLoading();
+          common_vendor.index.showToast({ title: "获取登录凭证失败", icon: "none" });
+          return;
+        }
+        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);
+          common_vendor.index.setStorageSync("isLogin", true);
+          common_vendor.index.showToast({ title: "登录成功", icon: "success" });
+          setTimeout(() => {
+            common_vendor.index.reLaunch({ url: "/pages/order/index" });
+          }, 1e3);
+        } else if (res.data && res.data.openid) {
+          this.openId = res.data.openid;
+          this.unionId = res.data.unionid || "";
+          this.activeModal = "profile";
+        } else {
+          common_vendor.index.showToast({ title: "登录失败", icon: "none" });
+        }
+      } catch (error) {
         common_vendor.index.hideLoading();
-        this.activeModal = "";
-        common_vendor.index.reLaunch({ url: "/pages/order/index" });
-      }, 1e3);
+        common_vendor.index.__f__("error", "at pages/login/index.vue:196", "登录错误:", error);
+        common_vendor.index.showToast({ title: "登录失败,请重试", icon: "none" });
+      }
     },
     onChooseAvatar(e) {
-      this.userAvatar = e.detail.avatarUrl;
+      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);
+        }
+      });
     },
     onNicknameBlur(e) {
       this.userName = e.detail.value;
+      common_vendor.index.__f__("log", "at pages/login/index.vue:219", "[微信信息] 昵称(blur):", this.userName);
     },
     onNicknameChange(e) {
       this.userName = e.detail.value;
+      common_vendor.index.__f__("log", "at pages/login/index.vue:223", "[微信信息] 昵称(input):", this.userName);
+    },
+    async goToPhoneAuth() {
+      this.phoneNumber = "";
+      this.activeModal = "phone";
+    },
+    async handleGetPhoneNumber(e) {
+      if (e.detail.errMsg !== "getPhoneNumber:ok") {
+        common_vendor.index.showToast({ title: "获取手机号失败,请重试", icon: "none" });
+        return;
+      }
+      try {
+        common_vendor.index.showLoading({ title: "获取手机号中..." });
+        const phoneRes = await api_auth_index.getWechatPhone({
+          phoneCode: e.detail.code,
+          openId: this.openId
+        });
+        common_vendor.index.hideLoading();
+        this.phoneNumber = phoneRes.data;
+        common_vendor.index.showLoading({ title: "注册中..." });
+        const registerRes = await api_auth_index.wechatRegister({
+          openId: this.openId,
+          unionId: this.unionId,
+          phone: this.phoneNumber,
+          nickname: this.userName,
+          avatar: this.avatarBase64
+        });
+        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.showToast({ title: "注册失败,请重试", icon: "none" });
+      }
     },
     showProtocol(type) {
       this.currentProtocol = this.protocols[type];
@@ -55,6 +136,18 @@ const _sfc_main = {
     closeAllModals() {
       this.activeModal = "";
     }
+  },
+  async mounted() {
+    try {
+      const [userRes, privacyRes] = await Promise.all([
+        api_system_agreement.getAgreement(1),
+        api_system_agreement.getAgreement(2)
+      ]);
+      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);
+    }
   }
 };
 function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
@@ -63,41 +156,42 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
     b: $data.assets.wechat,
     c: common_vendor.o((...args) => $options.startLoginFlow && $options.startLoginFlow(...args), "ec"),
     d: $data.isAgreed,
-    e: common_vendor.o(($event) => $options.showProtocol("user"), "40"),
-    f: common_vendor.o(($event) => $options.showProtocol("privacy"), "32"),
+    e: common_vendor.o(($event) => $options.showProtocol("user"), "a3"),
+    f: common_vendor.o(($event) => $options.showProtocol("privacy"), "86"),
     g: common_vendor.o((...args) => $options.toggleAgreed && $options.toggleAgreed(...args), "56"),
     h: $data.activeModal
   }, $data.activeModal ? {
-    i: common_vendor.o((...args) => $options.closeAllModals && $options.closeAllModals(...args), "b1")
+    i: common_vendor.o((...args) => $options.closeAllModals && $options.closeAllModals(...args), "a3")
   } : {}, {
     j: $data.activeModal === "confirm"
   }, $data.activeModal === "confirm" ? {
-    k: common_vendor.o(($event) => $data.activeModal = "", "2d"),
-    l: common_vendor.o((...args) => $options.agreeAndClose && $options.agreeAndClose(...args), "60")
+    k: common_vendor.o(($event) => $data.activeModal = "", "e1"),
+    l: common_vendor.o((...args) => $options.agreeAndClose && $options.agreeAndClose(...args), "1f")
   } : {}, {
     m: $data.activeModal === "profile"
   }, $data.activeModal === "profile" ? {
-    n: common_vendor.o(($event) => $data.activeModal = "", "c1"),
-    o: common_vendor.o(($event) => $data.activeModal = "phone", "5f"),
-    p: $data.userAvatar || "https://img.icons8.com/color/144/user.png",
-    q: common_vendor.o((...args) => $options.onChooseAvatar && $options.onChooseAvatar(...args), "04"),
+    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",
+    q: common_vendor.o((...args) => $options.onChooseAvatar && $options.onChooseAvatar(...args), "14"),
     r: $data.userName,
-    s: common_vendor.o((...args) => $options.onNicknameBlur && $options.onNicknameBlur(...args), "b8"),
-    t: common_vendor.o((...args) => $options.onNicknameChange && $options.onNicknameChange(...args), "e2"),
-    v: common_vendor.o(($event) => $data.activeModal = "phone", "ee")
+    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")
   } : {}, {
     w: $data.activeModal === "phone"
   }, $data.activeModal === "phone" ? {
     x: $data.assets.logo,
-    y: common_vendor.o(($event) => $data.activeModal = "", "99"),
-    z: common_vendor.o((...args) => $options.completeLogin && $options.completeLogin(...args), "21")
+    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")
   } : {}, {
-    A: $data.activeModal === "protocol"
+    B: $data.activeModal === "protocol"
   }, $data.activeModal === "protocol" ? {
-    B: common_vendor.t($data.currentProtocol.title),
-    C: common_vendor.o(($event) => $data.activeModal = "", "3b"),
-    D: $data.currentProtocol.content,
-    E: common_vendor.o(($event) => $data.activeModal = "", "06")
+    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")
   } : {});
 }
 const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-d08ef7d4"]]);

+ 0 - 1
unpackage/dist/dev/mp-weixin/pages/login/index.json

@@ -1,5 +1,4 @@
 {
-  "navigationBarTitleText": "登录",
   "navigationStyle": "custom",
   "usingComponents": {}
 }

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages/login/index.wxml


+ 387 - 122
unpackage/dist/dev/mp-weixin/pages/login/index.wxss

@@ -1,137 +1,402 @@
 
-	/* 基础容器 */
-.login-container.data-v-d08ef7d4 { width: 100%; min-height: 100vh; background: #fff; position: relative; display: flex; flex-direction: column;
-}
-.gradient-bg.data-v-d08ef7d4 { position: absolute; top: 0; left: 0; right: 0; height: 600rpx; background: linear-gradient(180deg, rgba(193, 0, 28, 0.12) 0%, rgba(255, 255, 255, 0) 100%); z-index: 1;
-}
-.content-wrapper.data-v-d08ef7d4 { position: relative; z-index: 2; flex: 1; display: flex; flex-direction: column; padding: 0 80rpx; box-sizing: border-box;
-}
-.logo-section.data-v-d08ef7d4 { display: flex; flex-direction: column; align-items: center; margin-top: 360rpx; margin-bottom: 120rpx;
-}
-.logo-outer.data-v-d08ef7d4 { width: 200rpx; height: 200rpx; background: #fff; border-radius: 48rpx; box-shadow: 0 40rpx 80rpx rgba(193, 0, 28, 0.35), 0 10rpx 30rpx rgba(0, 0, 0, 0.1), inset 0 4rpx 10rpx rgba(255,255,255,0.8); display: flex; align-items: center; justify-content: center; overflow: hidden; margin-bottom: 40rpx;
-}
-.logo-img.data-v-d08ef7d4 { width: 100%; height: 100%;
-}
-.app-title.data-v-d08ef7d4 { font-size: 48rpx; font-weight: bold; color: #1a1a1a; letter-spacing: 2rpx;
-}
-.app-subtitle.data-v-d08ef7d4 { font-size: 26rpx; color: #999; margin-top: 10rpx; letter-spacing: 6rpx;
-}
-.main-btn.data-v-d08ef7d4 { width: 100%; height: 100rpx; background: linear-gradient(135deg, #C1001C 0%, #FF4D4F 100%); border-radius: 50rpx; color: #fff; display: flex; align-items: center; justify-content: center; font-size: 32rpx; font-weight: bold; box-shadow: 0 12rpx 30rpx rgba(193, 0, 28, 0.2); border: none; margin-bottom: 40rpx;
-}
-.btn-icon.data-v-d08ef7d4 { width: 48rpx; height: 48rpx; margin-right: 16rpx;
-}
-.agreement-text.data-v-d08ef7d4 { font-size: 24rpx; color: #999;
-}
-.link.data-v-d08ef7d4 { color: #C1001C; margin: 0 4rpx; font-weight: 500;
-}
-.footer-section.data-v-d08ef7d4 { margin-top: auto; padding-bottom: 60rpx; text-align: center; font-size: 20rpx; color: #dcdcdc;
+/* 基础容器 */
+.login-container.data-v-d08ef7d4 {
+	width: 100%;
+	min-height: 100vh;
+	background: #fff;
+	position: relative;
+	display: flex;
+	flex-direction: column;
+}
+.gradient-bg.data-v-d08ef7d4 {
+	position: absolute;
+	top: 0;
+	left: 0;
+	right: 0;
+	height: 600rpx;
+	background: linear-gradient(180deg, rgba(193, 0, 28, 0.12) 0%, rgba(255, 255, 255, 0) 100%);
+	z-index: 1;
+}
+.content-wrapper.data-v-d08ef7d4 {
+	position: relative;
+	z-index: 2;
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	padding: 0 80rpx;
+	box-sizing: border-box;
+}
+.logo-section.data-v-d08ef7d4 {
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	margin-top: 360rpx;
+	margin-bottom: 120rpx;
+}
+.logo-outer.data-v-d08ef7d4 {
+	width: 200rpx;
+	height: 200rpx;
+	background: #fff;
+	border-radius: 48rpx;
+	box-shadow: 0 40rpx 80rpx rgba(193, 0, 28, 0.35), 0 10rpx 30rpx rgba(0, 0, 0, 0.1), inset 0 4rpx 10rpx rgba(255, 255, 255, 0.8);
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	overflow: hidden;
+	margin-bottom: 40rpx;
+}
+.logo-img.data-v-d08ef7d4 {
+	width: 100%;
+	height: 100%;
+}
+.app-title.data-v-d08ef7d4 {
+	font-size: 48rpx;
+	font-weight: bold;
+	color: #1a1a1a;
+	letter-spacing: 2rpx;
+}
+.app-subtitle.data-v-d08ef7d4 {
+	font-size: 26rpx;
+	color: #999;
+	margin-top: 10rpx;
+	letter-spacing: 6rpx;
+}
+.main-btn.data-v-d08ef7d4 {
+	width: 100%;
+	height: 100rpx;
+	background: linear-gradient(135deg, #C1001C 0%, #FF4D4F 100%);
+	border-radius: 50rpx;
+	color: #fff;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 32rpx;
+	font-weight: bold;
+	box-shadow: 0 12rpx 30rpx rgba(193, 0, 28, 0.2);
+	border: none;
+	margin-bottom: 40rpx;
+}
+.btn-icon.data-v-d08ef7d4 {
+	width: 48rpx;
+	height: 48rpx;
+	margin-right: 16rpx;
+}
+.agreement-text.data-v-d08ef7d4 {
+	font-size: 24rpx;
+	color: #999;
+}
+.link.data-v-d08ef7d4 {
+	color: #C1001C;
+	margin: 0 4rpx;
+	font-weight: 500;
+}
+.footer-section.data-v-d08ef7d4 {
+	margin-top: auto;
+	padding-bottom: 60rpx;
+	text-align: center;
+	font-size: 20rpx;
+	color: #dcdcdc;
 }
 
-	/* 弹窗通用基础 */
-.global-mask.data-v-d08ef7d4 { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.5); z-index: 998;
-}
-.center-card.data-v-d08ef7d4 { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 620rpx; background: #fff; border-radius: 32rpx; z-index: 1000; box-shadow: 0 30rpx 80rpx rgba(0,0,0,0.15); padding: 50rpx 40rpx; display: flex; flex-direction: column;
-}
-.bottom-pop.data-v-d08ef7d4 { position: fixed; bottom: 0; left: 0; right: 0; background: #fff; border-radius: 40rpx 40rpx 0 0; z-index: 1001; padding: 40rpx; padding-bottom: calc(50rpx + env(safe-area-inset-bottom)); box-shadow: 0 -10rpx 40rpx rgba(0,0,0,0.05);
+/* 弹窗通用基础 */
+.global-mask.data-v-d08ef7d4 {
+	position: fixed;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	background: rgba(0, 0, 0, 0.5);
+	z-index: 998;
+}
+.center-card.data-v-d08ef7d4 {
+	position: fixed;
+	top: 50%;
+	left: 50%;
+	transform: translate(-50%, -50%);
+	width: 620rpx;
+	background: #fff;
+	border-radius: 32rpx;
+	z-index: 1000;
+	box-shadow: 0 30rpx 80rpx rgba(0, 0, 0, 0.15);
+	padding: 50rpx 40rpx;
+	display: flex;
+	flex-direction: column;
+}
+.bottom-pop.data-v-d08ef7d4 {
+	position: fixed;
+	bottom: 0;
+	left: 0;
+	right: 0;
+	background: #fff;
+	border-radius: 40rpx 40rpx 0 0;
+	z-index: 1001;
+	padding: 40rpx;
+	padding-bottom: calc(50rpx + env(safe-area-inset-bottom));
+	box-shadow: 0 -10rpx 40rpx rgba(0, 0, 0, 0.05);
 }
 
-	/* 按钮对齐辅助 */
-button.data-v-d08ef7d4 { display: flex !important; align-items: center !important; justify-content: center !important; padding: 0 !important; line-height: normal !important;
+/* 按钮对齐辅助 */
+button.data-v-d08ef7d4 {
+	display: flex !important;
+	align-items: center !important;
+	justify-content: center !important;
+	padding: 0 !important;
+	line-height: normal !important;
 }
-button.data-v-d08ef7d4::after { border: none;
+button.data-v-d08ef7d4::after {
+	border: none;
 }
 
-	/* 协议拦截弹窗 */
-.card-title.data-v-d08ef7d4 { font-size: 38rpx; font-weight: bold; text-align: center; margin-bottom: 30rpx;
-}
-.card-body.data-v-d08ef7d4 { font-size: 28rpx; color: #666; line-height: 1.6; text-align: center; margin-bottom: 50rpx;
-}
-.card-footer-btns.data-v-d08ef7d4 { display: flex; gap: 24rpx;
-}
-.btn-item.data-v-d08ef7d4 { flex: 1; height: 90rpx; border-radius: 45rpx; font-size: 30rpx; display: flex !important; align-items: center !important; justify-content: center !important; text-align: center; line-height: 90rpx;
-}
-.btn-item.cancel.data-v-d08ef7d4 { background: #f8f8f8; color: #999;
-}
-.btn-item.agree.data-v-d08ef7d4 { background: #C1001C; color: #fff; font-weight: bold;
+/* 协议拦截弹窗 */
+.card-title.data-v-d08ef7d4 {
+	font-size: 38rpx;
+	font-weight: bold;
+	text-align: center;
+	margin-bottom: 30rpx;
+}
+.card-body.data-v-d08ef7d4 {
+	font-size: 28rpx;
+	color: #666;
+	line-height: 1.6;
+	text-align: center;
+	margin-bottom: 50rpx;
+}
+.card-footer-btns.data-v-d08ef7d4 {
+	display: flex;
+	gap: 24rpx;
+}
+.btn-item.data-v-d08ef7d4 {
+	flex: 1;
+	height: 90rpx;
+	border-radius: 45rpx;
+	font-size: 30rpx;
+	display: flex !important;
+	align-items: center !important;
+	justify-content: center !important;
+	text-align: center;
+	line-height: 90rpx;
+}
+.btn-item.cancel.data-v-d08ef7d4 {
+	background: #f8f8f8;
+	color: #999;
+}
+.btn-item.agree.data-v-d08ef7d4 {
+	background: #C1001C;
+	color: #fff;
+	font-weight: bold;
 }
 
-	/* 协议内容弹窗专项修复 */
-.p-pop-header.data-v-d08ef7d4 { display: flex; justify-content: space-between; align-items: center; margin-bottom: 30rpx;
-}
-.p-pop-title.data-v-d08ef7d4 { font-size: 36rpx; font-weight: bold; color: #1a1a1a;
-}
-.p-pop-close.data-v-d08ef7d4 { font-size: 48rpx; color: #ccc; padding: 10rpx;
-}
-.p-pop-scroll.data-v-d08ef7d4 { max-height: 55vh; margin-bottom: 30rpx;
-}
-.rich-text-wrapper.data-v-d08ef7d4 { padding: 10rpx 0; color: #444; font-size: 28rpx;
-}
-.p-pop-footer.data-v-d08ef7d4 { padding-top: 20rpx;
-}
-.p-pop-btn.data-v-d08ef7d4 { width: 100%; height: 90rpx; background: #C1001C; color: #fff; border-radius: 45rpx; font-size: 30rpx; font-weight: bold;
+/* 协议内容弹窗专项修复 */
+.p-pop-header.data-v-d08ef7d4 {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	margin-bottom: 30rpx;
+}
+.p-pop-title.data-v-d08ef7d4 {
+	font-size: 36rpx;
+	font-weight: bold;
+	color: #1a1a1a;
+}
+.p-pop-close.data-v-d08ef7d4 {
+	font-size: 48rpx;
+	color: #ccc;
+	padding: 10rpx;
+}
+.p-pop-scroll.data-v-d08ef7d4 {
+	max-height: 55vh;
+	margin-bottom: 30rpx;
+}
+.rich-text-wrapper.data-v-d08ef7d4 {
+	padding: 10rpx 0;
+	color: #444;
+	font-size: 28rpx;
+}
+.p-pop-footer.data-v-d08ef7d4 {
+	padding-top: 20rpx;
+}
+.p-pop-btn.data-v-d08ef7d4 {
+	width: 100%;
+	height: 90rpx;
+	background: #C1001C;
+	color: #fff;
+	border-radius: 45rpx;
+	font-size: 30rpx;
+	font-weight: bold;
 }
 
-	/* 头像授权弹窗 */
-.pop-header-bar.data-v-d08ef7d4 { display: flex; justify-content: space-between; align-items: center; margin-bottom: 60rpx;
-}
-.pop-cancel.data-v-d08ef7d4 { font-size: 30rpx; color: #999;
-}
-.pop-main-title.data-v-d08ef7d4 { font-size: 32rpx; font-weight: bold;
-}
-.pop-done.data-v-d08ef7d4 { font-size: 30rpx; color: #C1001C; font-weight: bold;
-}
-.profile-edit-content.data-v-d08ef7d4 { display: flex; flex-direction: column; align-items: center;
-}
-.avatar-wrapper-btn.data-v-d08ef7d4 { 
-		width: 170rpx; height: 170rpx; border-radius: 85rpx; background: #f8f8f8; 
-		position: relative; margin-bottom: 24rpx; padding: 0 !important; overflow: visible;
-		display: flex !important; align-items: center; justify-content: center;
-		border: none;
-}
-.current-avatar.data-v-d08ef7d4 { width: 100%; height: 100%; border-radius: 85rpx; border: 4rpx solid #fff; box-shadow: 0 4rpx 15rpx rgba(0,0,0,0.05);
-}
-.camera-icon.data-v-d08ef7d4 { 
-		position: absolute; bottom: 0; right: 0; background: #fff; width: 56rpx; height: 56rpx; 
-		border-radius: 28rpx; display: flex; align-items: center; justify-content: center; 
-		box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.12); z-index: 5;
-}
-.camera-icon image.data-v-d08ef7d4 { width: 30rpx; height: 30rpx;
-}
-.edit-hint.data-v-d08ef7d4 { font-size: 24rpx; color: #999; margin-bottom: 70rpx; width: 100%; text-align: center; display: block;
-}
-.nickname-edit-box.data-v-d08ef7d4 { width: 100%; display: flex; align-items: center; padding: 36rpx 0; border-top: 1rpx solid #f0f0f0; border-bottom: 1rpx solid #f0f0f0; margin-bottom: 40rpx;
-}
-.nickname-edit-box .label.data-v-d08ef7d4 { width: 130rpx; font-size: 32rpx;
-}
-.nickname-input.data-v-d08ef7d4 { flex: 1; font-size: 32rpx;
-}
-.notice-text.data-v-d08ef7d4 { font-size: 24rpx; color: #bfbfbf; text-align: center; display: block; margin-bottom: 60rpx;
-}
-.confirm-btn-fixed.data-v-d08ef7d4 { width: 100%; height: 96rpx; background: #C1001C; color: #fff; border-radius: 16rpx; font-size: 32rpx; font-weight: bold;
+/* 头像授权弹窗 */
+.pop-header-bar.data-v-d08ef7d4 {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	margin-bottom: 60rpx;
+}
+.pop-cancel.data-v-d08ef7d4 {
+	font-size: 30rpx;
+	color: #999;
+}
+.pop-main-title.data-v-d08ef7d4 {
+	font-size: 32rpx;
+	font-weight: bold;
+}
+.pop-done.data-v-d08ef7d4 {
+	font-size: 30rpx;
+	color: #C1001C;
+	font-weight: bold;
+}
+.profile-edit-content.data-v-d08ef7d4 {
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+}
+.avatar-wrapper-btn.data-v-d08ef7d4 {
+	width: 170rpx;
+	height: 170rpx;
+	border-radius: 85rpx;
+	background: #f8f8f8;
+	position: relative;
+	margin-bottom: 24rpx;
+	padding: 0 !important;
+	overflow: visible;
+	display: flex !important;
+	align-items: center;
+	justify-content: center;
+	border: none;
+}
+.current-avatar.data-v-d08ef7d4 {
+	width: 100%;
+	height: 100%;
+	border-radius: 85rpx;
+	border: 4rpx solid #fff;
+	box-shadow: 0 4rpx 15rpx rgba(0, 0, 0, 0.05);
+}
+.camera-icon.data-v-d08ef7d4 {
+	position: absolute;
+	bottom: 0;
+	right: 0;
+	background: #fff;
+	width: 56rpx;
+	height: 56rpx;
+	border-radius: 28rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.12);
+	z-index: 5;
+}
+.camera-icon image.data-v-d08ef7d4 {
+	width: 30rpx;
+	height: 30rpx;
+}
+.edit-hint.data-v-d08ef7d4 {
+	font-size: 24rpx;
+	color: #999;
+	margin-bottom: 70rpx;
+	width: 100%;
+	text-align: center;
+	display: block;
+}
+.nickname-edit-box.data-v-d08ef7d4 {
+	width: 100%;
+	display: flex;
+	align-items: center;
+	padding: 36rpx 0;
+	border-top: 1rpx solid #f0f0f0;
+	border-bottom: 1rpx solid #f0f0f0;
+	margin-bottom: 40rpx;
+}
+.nickname-edit-box .label.data-v-d08ef7d4 {
+	width: 130rpx;
+	font-size: 32rpx;
+}
+.nickname-input.data-v-d08ef7d4 {
+	flex: 1;
+	font-size: 32rpx;
+}
+.notice-text.data-v-d08ef7d4 {
+	font-size: 24rpx;
+	color: #bfbfbf;
+	text-align: center;
+	display: block;
+	margin-bottom: 60rpx;
+}
+.confirm-btn-fixed.data-v-d08ef7d4 {
+	width: 100%;
+	height: 96rpx;
+	background: #C1001C;
+	color: #fff;
+	border-radius: 16rpx;
+	font-size: 32rpx;
+	font-weight: bold;
 }
 
-	/* 手机号授权弹窗 */
-.p-header.data-v-d08ef7d4 { display: flex; align-items: center; margin-bottom: 50rpx;
-}
-.p-mini-logo.data-v-d08ef7d4 { width: 44rpx; height: 44rpx; border-radius: 8rpx; margin-right: 16rpx;
-}
-.p-app-name.data-v-d08ef7d4 { font-size: 28rpx; color: #7f7f7f;
-}
-.p-title.data-v-d08ef7d4 { font-size: 40rpx; font-weight: bold; color: #000; margin-bottom: 44rpx; display: block;
-}
-.p-number-card.data-v-d08ef7d4 { background: #fbfbfb; padding: 36rpx; border-radius: 20rpx; display: flex; justify-content: space-between; align-items: center; margin-bottom: 30rpx; border: 1rpx solid #f0f0f0;
-}
-.p-real-num.data-v-d08ef7d4 { font-size: 36rpx; font-weight: bold; color: #1a1a1a; display: block;
-}
-.p-num-hint.data-v-d08ef7d4 { font-size: 24rpx; color: #999;
-}
-.p-other-link.data-v-d08ef7d4 { font-size: 28rpx; color: #576b95; display: block; margin-bottom: 60rpx;
-}
-.p-footer-btns.data-v-d08ef7d4 { display: flex; gap: 30rpx;
-}
-.p-btn-fixed.data-v-d08ef7d4 { flex: 1; height: 96rpx; border-radius: 16rpx; font-size: 32rpx; border: none;
-}
-.p-deny.data-v-d08ef7d4 { background: #f2f2f2; color: #C1001C;
-}
-.p-allow.data-v-d08ef7d4 { background: #C1001C; color: #fff; font-weight: bold;
+/* 手机号授权弹窗 */
+.p-header.data-v-d08ef7d4 {
+	display: flex;
+	align-items: center;
+	margin-bottom: 50rpx;
+}
+.p-mini-logo.data-v-d08ef7d4 {
+	width: 44rpx;
+	height: 44rpx;
+	border-radius: 8rpx;
+	margin-right: 16rpx;
+}
+.p-app-name.data-v-d08ef7d4 {
+	font-size: 28rpx;
+	color: #7f7f7f;
+}
+.p-title.data-v-d08ef7d4 {
+	font-size: 40rpx;
+	font-weight: bold;
+	color: #000;
+	margin-bottom: 44rpx;
+	display: block;
+}
+.p-number-card.data-v-d08ef7d4 {
+	background: #fbfbfb;
+	padding: 36rpx;
+	border-radius: 20rpx;
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	margin-bottom: 30rpx;
+	border: 1rpx solid #f0f0f0;
+}
+.p-real-num.data-v-d08ef7d4 {
+	font-size: 36rpx;
+	font-weight: bold;
+	color: #1a1a1a;
+	display: block;
+}
+.p-num-hint.data-v-d08ef7d4 {
+	font-size: 24rpx;
+	color: #999;
+}
+.p-other-link.data-v-d08ef7d4 {
+	font-size: 28rpx;
+	color: #576b95;
+	display: block;
+	margin-bottom: 60rpx;
+}
+.p-footer-btns.data-v-d08ef7d4 {
+	display: flex;
+	gap: 30rpx;
+}
+.p-btn-fixed.data-v-d08ef7d4 {
+	flex: 1;
+	height: 96rpx;
+	border-radius: 16rpx;
+	font-size: 32rpx;
+	border: none;
+}
+.p-deny.data-v-d08ef7d4 {
+	background: #f2f2f2;
+	color: #C1001C;
+}
+.p-allow.data-v-d08ef7d4 {
+	background: #C1001C;
+	color: #fff;
+	font-weight: bold;
 }

+ 23 - 17
unpackage/dist/dev/mp-weixin/pages/mine/agreement/index.js

@@ -1,19 +1,14 @@
 "use strict";
 const common_vendor = require("../../../common/vendor.js");
+const api_system_agreement = require("../../../api/system/agreement.js");
+const ErpNavBar = () => "../../../components/erp-nav-bar.js";
 const _sfc_main = {
+  components: { ErpNavBar },
   data() {
     return {
       statusBarHeight: 20,
-      agreementNodes: `
-					<div style="line-height: 1.8; color: #444; font-size: 14px;">
-						<h3 style="color: #000; margin-top: 20px;">1. 账户注册与安全</h3>
-						<p>您必须使用真实手机号进行授权登录。您应对账号下的所有活动负责,严禁将账号转借或转让他人使用。</p>
-						<h3 style="color: #000; margin-top: 20px;">2. 订购规范</h3>
-						<p>用户在提交订单前应核实型号、规格及数量。订单一旦系统确认进入生产环节,不可随意撤回。</p>
-						<h3 style="color: #000; margin-top: 20px;">3. 知识产权</h3>
-						<p>本平台所有技术文档、图纸及界面设计均受法律保护,未经许可不得擅自抓取或仿造。</p>
-					</div>
-				`
+      title: "",
+      agreementNodes: ""
     };
   },
   computed: {
@@ -21,9 +16,15 @@ const _sfc_main = {
       return `calc(100vh - ${this.statusBarHeight + 44}px)`;
     }
   },
-  onLoad() {
-    const info = common_vendor.index.getSystemInfoSync();
-    this.statusBarHeight = info.statusBarHeight;
+  async onLoad() {
+    this.statusBarHeight = common_vendor.index.getSystemInfoSync().statusBarHeight || 20;
+    try {
+      const res = await api_system_agreement.getAgreement(1);
+      this.title = res.data.title;
+      this.agreementNodes = res.data.content;
+    } catch (e) {
+      common_vendor.index.__f__("error", "at pages/mine/agreement/index.vue:37", "[用户协议] 加载失败", e);
+    }
   },
   methods: {
     goBack() {
@@ -31,12 +32,17 @@ const _sfc_main = {
     }
   }
 };
+if (!Array) {
+  const _component_erp_nav_bar = common_vendor.resolveComponent("erp-nav-bar");
+  _component_erp_nav_bar();
+}
 function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
   return {
-    a: common_vendor.o((...args) => $options.goBack && $options.goBack(...args), "8c"),
-    b: $data.statusBarHeight + "px",
-    c: $data.agreementNodes,
-    d: $options.scrollHeight
+    a: common_vendor.p({
+      title: $data.title
+    }),
+    b: $data.agreementNodes,
+    c: $options.scrollHeight
   };
 }
 const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-0b7e99d3"]]);

+ 3 - 2
unpackage/dist/dev/mp-weixin/pages/mine/agreement/index.json

@@ -1,5 +1,6 @@
 {
-  "navigationBarTitleText": "用户协议",
   "navigationStyle": "custom",
-  "usingComponents": {}
+  "usingComponents": {
+    "erp-nav-bar": "../../../components/erp-nav-bar"
+  }
 }

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

@@ -1 +1 @@
-<view class="agreement-page data-v-0b7e99d3"><view class="custom-navbar data-v-0b7e99d3" style="{{'padding-top:' + b}}"><view class="nav-content data-v-0b7e99d3"><view class="back-area data-v-0b7e99d3" bindtap="{{a}}"><text class="back-arrow data-v-0b7e99d3"></text></view><view class="nav-title data-v-0b7e99d3">用户协议</view><view class="right-placeholder data-v-0b7e99d3"></view></view></view><scroll-view scroll-y class="content-scroll data-v-0b7e99d3" style="{{'height:' + d}}"><view class="article-body data-v-0b7e99d3"><view class="title data-v-0b7e99d3">ERP 系统用户服务协议</view><view class="update-time data-v-0b7e99d3">最近更新日期:2024年04月28日</view><rich-text class="data-v-0b7e99d3" nodes="{{c}}"></rich-text><view class="footer-tip data-v-0b7e99d3">本协议由广东粤铝材实业有限公司负责解释。</view></view></scroll-view></view>
+<view class="agreement-page data-v-0b7e99d3"><erp-nav-bar wx:if="{{a}}" class="data-v-0b7e99d3" u-i="0b7e99d3-0" bind:__l="__l" u-p="{{a}}"/><scroll-view scroll-y class="content-scroll data-v-0b7e99d3" style="{{'height:' + c}}"><view class="article-body data-v-0b7e99d3"><rich-text class="data-v-0b7e99d3" nodes="{{b}}"></rich-text></view></scroll-view></view>

+ 34 - 25
unpackage/dist/dev/mp-weixin/pages/mine/agreement/index.wxss

@@ -1,27 +1,36 @@
 
-.agreement-page.data-v-0b7e99d3 { width: 100vw; height: 100vh; background: #ffffff; display: flex; flex-direction: column;
-}
-	
-	/* 自定义导航栏样式 */
-.custom-navbar.data-v-0b7e99d3 { background: #fff; flex-shrink: 0;
-}
-.nav-content.data-v-0b7e99d3 { height: 44px; display: flex; align-items: center; justify-content: space-between; padding: 0 30rpx;
-}
-.back-area.data-v-0b7e99d3 { width: 60rpx; height: 44px; display: flex; align-items: center;
-}
-.back-arrow.data-v-0b7e99d3 { width: 22rpx; height: 22rpx; border-left: 4rpx solid #333; border-bottom: 4rpx solid #333; transform: rotate(45deg); margin-left: 10rpx;
-}
-.nav-title.data-v-0b7e99d3 { font-size: 34rpx; font-weight: bold; color: #333;
-}
-.right-placeholder.data-v-0b7e99d3 { width: 60rpx;
-}
-.content-scroll.data-v-0b7e99d3 { width: 100%;
-}
-.article-body.data-v-0b7e99d3 { padding: 40rpx; padding-top: 20rpx;
-}
-.title.data-v-0b7e99d3 { font-size: 40rpx; font-weight: bold; color: #1a1a1a; margin-bottom: 16rpx; text-align: center;
-}
-.update-time.data-v-0b7e99d3 { font-size: 24rpx; color: #999; margin-bottom: 40rpx; text-align: center;
-}
-.footer-tip.data-v-0b7e99d3 { margin-top: 60rpx; padding: 30rpx; background: #f8fafc; font-size: 24rpx; color: #888; text-align: center;
+.agreement-page.data-v-0b7e99d3 {
+	width: 100vw;
+	height: 100vh;
+	background: #ffffff;
+	display: flex;
+	flex-direction: column;
+}
+.content-scroll.data-v-0b7e99d3 {
+	width: 100%;
+}
+.article-body.data-v-0b7e99d3 {
+	padding: 40rpx;
+	padding-top: 20rpx;
+}
+.title.data-v-0b7e99d3 {
+	font-size: 40rpx;
+	font-weight: bold;
+	color: #1a1a1a;
+	margin-bottom: 16rpx;
+	text-align: center;
+}
+.update-time.data-v-0b7e99d3 {
+	font-size: 24rpx;
+	color: #999;
+	margin-bottom: 40rpx;
+	text-align: center;
+}
+.footer-tip.data-v-0b7e99d3 {
+	margin-top: 60rpx;
+	padding: 30rpx;
+	background: #f8fafc;
+	font-size: 24rpx;
+	color: #888;
+	text-align: center;
 }

+ 18 - 20
unpackage/dist/dev/mp-weixin/pages/mine/complaint/index.js

@@ -1,9 +1,10 @@
 "use strict";
 const common_vendor = require("../../../common/vendor.js");
+const ErpNavBar = () => "../../../components/erp-nav-bar.js";
 const _sfc_main = {
+  components: { ErpNavBar },
   data() {
     return {
-      statusBarHeight: 20,
       types: [
         { label: "系统投诉", value: "complaint" },
         { label: "改进建议", value: "suggestion" },
@@ -21,14 +22,6 @@ const _sfc_main = {
       return this.formData.content && this.formData.content.trim().length >= 5;
     }
   },
-  onLoad() {
-    try {
-      const info = common_vendor.index.getSystemInfoSync();
-      this.statusBarHeight = info.statusBarHeight || 20;
-    } catch (e) {
-      this.statusBarHeight = 20;
-    }
-  },
   methods: {
     goBack() {
       common_vendor.index.navigateBack();
@@ -64,11 +57,16 @@ const _sfc_main = {
     }
   }
 };
+if (!Array) {
+  const _component_erp_nav_bar = common_vendor.resolveComponent("erp-nav-bar");
+  _component_erp_nav_bar();
+}
 function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
   return common_vendor.e({
-    a: common_vendor.o((...args) => $options.goBack && $options.goBack(...args), "46"),
-    b: $data.statusBarHeight + "px",
-    c: common_vendor.f($data.types, (item, k0, i0) => {
+    a: common_vendor.p({
+      title: "投诉与建议"
+    }),
+    b: common_vendor.f($data.types, (item, k0, i0) => {
       return {
         a: common_vendor.t(item.label),
         b: item.value,
@@ -76,10 +74,10 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
         d: common_vendor.o(($event) => $data.formData.type = item.value, item.value)
       };
     }),
-    d: $data.formData.content,
-    e: common_vendor.o(($event) => $data.formData.content = $event.detail.value, "f6"),
-    f: common_vendor.t($data.formData.content.length),
-    g: common_vendor.f($data.formData.images, (img, index, i0) => {
+    c: $data.formData.content,
+    d: common_vendor.o(($event) => $data.formData.content = $event.detail.value, "dd"),
+    e: common_vendor.t($data.formData.content.length),
+    f: common_vendor.f($data.formData.images, (img, index, i0) => {
       return {
         a: img,
         b: common_vendor.o(($event) => $options.previewImage(index), index),
@@ -87,12 +85,12 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
         d: index
       };
     }),
-    h: $data.formData.images.length < 6
+    g: $data.formData.images.length < 6
   }, $data.formData.images.length < 6 ? {
-    i: common_vendor.o((...args) => $options.chooseImage && $options.chooseImage(...args), "55")
+    h: common_vendor.o((...args) => $options.chooseImage && $options.chooseImage(...args), "94")
   } : {}, {
-    j: !$options.isFormValid,
-    k: common_vendor.o((...args) => $options.handleSubmit && $options.handleSubmit(...args), "d6")
+    i: !$options.isFormValid,
+    j: common_vendor.o((...args) => $options.handleSubmit && $options.handleSubmit(...args), "eb")
   });
 }
 const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-6497fc4f"]]);

+ 3 - 2
unpackage/dist/dev/mp-weixin/pages/mine/complaint/index.json

@@ -1,5 +1,6 @@
 {
-  "navigationBarTitleText": "投诉与建议",
   "navigationStyle": "custom",
-  "usingComponents": {}
+  "usingComponents": {
+    "erp-nav-bar": "../../../components/erp-nav-bar"
+  }
 }

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages/mine/complaint/index.wxml


+ 200 - 57
unpackage/dist/dev/mp-weixin/pages/mine/complaint/index.wxss

@@ -1,59 +1,202 @@
 
-.complaint-root.data-v-6497fc4f { width: 100vw; height: 100vh; background: #f8fafb; display: flex; flex-direction: column; overflow: hidden;
-}
-.custom-navbar.data-v-6497fc4f { background: #fff; width: 100%; flex-shrink: 0; border-bottom: 1rpx solid #f0f0f0;
-}
-.nav-content.data-v-6497fc4f { height: 44px; display: flex; align-items: center; justify-content: space-between; padding: 0 30rpx;
-}
-.back-area.data-v-6497fc4f { width: 60rpx; height: 44px; display: flex; align-items: center;
-}
-.back-arrow.data-v-6497fc4f { width: 22rpx; height: 22rpx; border-left: 4rpx solid #333; border-bottom: 4rpx solid #333; transform: rotate(45deg); margin-left: 10rpx;
-}
-.nav-title.data-v-6497fc4f { font-size: 34rpx; font-weight: bold; color: #333;
-}
-.right-placeholder.data-v-6497fc4f { width: 60rpx;
-}
-.scroll-container.data-v-6497fc4f { flex: 1; height: 0; width: 100%; position: relative;
-}
-.scroll-content.data-v-6497fc4f { width: 100%; height: 100%;
-}
-.form-body.data-v-6497fc4f { padding: 30rpx;
-}
-.section-card.data-v-6497fc4f { background: #fff; border-radius: 24rpx; padding: 40rpx 30rpx; margin-bottom: 30rpx; box-shadow: 0 4rpx 20rpx rgba(0,0,0,0.02);
-}
-.section-title.data-v-6497fc4f { font-size: 30rpx; font-weight: bold; color: #1a1a1a; margin-bottom: 30rpx; border-left: 8rpx solid #C1001C; padding-left: 20rpx; line-height: 1.2;
-}
-.type-grid.data-v-6497fc4f { display: flex; gap: 20rpx;
-}
-.type-item.data-v-6497fc4f { flex: 1; height: 80rpx; background: #f5f6f8; border-radius: 12rpx; display: flex; align-items: center; justify-content: center; font-size: 28rpx; color: #666; border: 2rpx solid #f5f6f8; transition: all 0.2s;
-}
-.type-item.active.data-v-6497fc4f { background: rgba(193, 0, 28, 0.05); color: #C1001C; border-color: #C1001C; font-weight: bold;
-}
-.content-input.data-v-6497fc4f { width: 100%; height: 300rpx; background: #f9fafb; border-radius: 16rpx; padding: 24rpx; box-sizing: border-box; font-size: 30rpx; color: #333;
-}
-.word-count.data-v-6497fc4f { text-align: right; font-size: 24rpx; color: #ccc; margin-top: 12rpx;
-}
-.upload-grid.data-v-6497fc4f { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20rpx;
-}
-.img-item.data-v-6497fc4f { position: relative; width: 100%; padding-top: 100%;
-}
-.img-item image.data-v-6497fc4f { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border-radius: 16rpx;
-}
-.del-btn.data-v-6497fc4f { position: absolute; top: -10rpx; right: -10rpx; width: 40rpx; height: 40rpx; background: rgba(0,0,0,0.5); border-radius: 50%; display: flex; align-items: center; justify-content: center; z-index: 10;
-}
-.close-icon.data-v-6497fc4f { color: #fff; font-size: 30rpx; line-height: 1;
-}
-.add-btn.data-v-6497fc4f { width: 100%; padding-top: 100%; border: 2rpx dashed #ddd; border-radius: 16rpx; display: flex; flex-direction: column; align-items: center; justify-content: center; position: relative; background: #fcfcfc;
-}
-.add-icon.data-v-6497fc4f { position: absolute; top: 35%; left: 50%; transform: translateX(-50%); font-size: 60rpx; color: #bbb;
-}
-.add-txt.data-v-6497fc4f { position: absolute; bottom: 20%; left: 50%; transform: translateX(-50%); font-size: 22rpx; color: #999;
-}
-.footer-bar.data-v-6497fc4f { background: #fff; padding: 30rpx 40rpx calc(30rpx + env(safe-area-inset-bottom)); flex-shrink: 0; border-top: 1rpx solid #f0f0f0;
-}
-.submit-btn.data-v-6497fc4f { width: 100%; height: 96rpx; background: #C1001C; color: #fff; border-radius: 48rpx; display: flex; align-items: center; justify-content: center; font-size: 32rpx; font-weight: bold; border: none;
-}
-.submit-btn[disabled].data-v-6497fc4f { background: #edb3bb !important; color: rgba(255,255,255,0.6) !important;
-}
-.bottom-placeholder.data-v-6497fc4f { height: 40rpx;
+.complaint-root.data-v-6497fc4f {
+	width: 100vw;
+	height: 100vh;
+	background: #f8fafb;
+	display: flex;
+	flex-direction: column;
+	overflow: hidden;
+}
+.custom-navbar.data-v-6497fc4f {
+	background: #fff;
+	width: 100%;
+	flex-shrink: 0;
+	border-bottom: 1rpx solid #f0f0f0;
+}
+.nav-content.data-v-6497fc4f {
+	height: 44px;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 0 30rpx;
+}
+.back-area.data-v-6497fc4f {
+	width: 60rpx;
+	height: 44px;
+	display: flex;
+	align-items: center;
+}
+.back-arrow.data-v-6497fc4f {
+	width: 22rpx;
+	height: 22rpx;
+	border-left: 4rpx solid #333;
+	border-bottom: 4rpx solid #333;
+	transform: rotate(45deg);
+	margin-left: 10rpx;
+}
+.nav-title.data-v-6497fc4f {
+	font-size: 34rpx;
+	font-weight: bold;
+	color: #333;
+}
+.right-placeholder.data-v-6497fc4f {
+	width: 60rpx;
+}
+.scroll-container.data-v-6497fc4f {
+	flex: 1;
+	height: 0;
+	width: 100%;
+	position: relative;
+}
+.scroll-content.data-v-6497fc4f {
+	width: 100%;
+	height: 100%;
+}
+.form-body.data-v-6497fc4f {
+	padding: 30rpx;
+}
+.section-card.data-v-6497fc4f {
+	background: #fff;
+	border-radius: 24rpx;
+	padding: 40rpx 30rpx;
+	margin-bottom: 30rpx;
+	box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.02);
+}
+.section-title.data-v-6497fc4f {
+	font-size: 30rpx;
+	font-weight: bold;
+	color: #1a1a1a;
+	margin-bottom: 30rpx;
+	border-left: 8rpx solid #C1001C;
+	padding-left: 20rpx;
+	line-height: 1.2;
+}
+.type-grid.data-v-6497fc4f {
+	display: flex;
+	gap: 20rpx;
+}
+.type-item.data-v-6497fc4f {
+	flex: 1;
+	height: 80rpx;
+	background: #f5f6f8;
+	border-radius: 12rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 28rpx;
+	color: #666;
+	border: 2rpx solid #f5f6f8;
+	transition: all 0.2s;
+}
+.type-item.active.data-v-6497fc4f {
+	background: rgba(193, 0, 28, 0.05);
+	color: #C1001C;
+	border-color: #C1001C;
+	font-weight: bold;
+}
+.content-input.data-v-6497fc4f {
+	width: 100%;
+	height: 300rpx;
+	background: #f9fafb;
+	border-radius: 16rpx;
+	padding: 24rpx;
+	box-sizing: border-box;
+	font-size: 30rpx;
+	color: #333;
+}
+.word-count.data-v-6497fc4f {
+	text-align: right;
+	font-size: 24rpx;
+	color: #ccc;
+	margin-top: 12rpx;
+}
+.upload-grid.data-v-6497fc4f {
+	display: grid;
+	grid-template-columns: repeat(3, 1fr);
+	gap: 20rpx;
+}
+.img-item.data-v-6497fc4f {
+	position: relative;
+	width: 100%;
+	padding-top: 100%;
+}
+.img-item image.data-v-6497fc4f {
+	position: absolute;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	border-radius: 16rpx;
+}
+.del-btn.data-v-6497fc4f {
+	position: absolute;
+	top: -10rpx;
+	right: -10rpx;
+	width: 40rpx;
+	height: 40rpx;
+	background: rgba(0, 0, 0, 0.5);
+	border-radius: 50%;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	z-index: 10;
+}
+.close-icon.data-v-6497fc4f {
+	color: #fff;
+	font-size: 30rpx;
+	line-height: 1;
+}
+.add-btn.data-v-6497fc4f {
+	width: 100%;
+	padding-top: 100%;
+	border: 2rpx dashed #ddd;
+	border-radius: 16rpx;
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	justify-content: center;
+	position: relative;
+	background: #fcfcfc;
+}
+.add-icon.data-v-6497fc4f {
+	position: absolute;
+	top: 35%;
+	left: 50%;
+	transform: translateX(-50%);
+	font-size: 60rpx;
+	color: #bbb;
+}
+.add-txt.data-v-6497fc4f {
+	position: absolute;
+	bottom: 20%;
+	left: 50%;
+	transform: translateX(-50%);
+	font-size: 22rpx;
+	color: #999;
+}
+.footer-bar.data-v-6497fc4f {
+	background: #fff;
+	padding: 30rpx 40rpx calc(30rpx + env(safe-area-inset-bottom));
+	flex-shrink: 0;
+	border-top: 1rpx solid #f0f0f0;
+}
+.submit-btn.data-v-6497fc4f {
+	width: 100%;
+	height: 96rpx;
+	background: #C1001C;
+	color: #fff;
+	border-radius: 48rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 32rpx;
+	font-weight: bold;
+	border: none;
+}
+.submit-btn[disabled].data-v-6497fc4f {
+	background: #edb3bb !important;
+	color: rgba(255, 255, 255, 0.6) !important;
+}
+.bottom-placeholder.data-v-6497fc4f {
+	height: 40rpx;
 }

+ 23 - 17
unpackage/dist/dev/mp-weixin/pages/mine/index.js

@@ -2,10 +2,9 @@
 const common_vendor = require("../../common/vendor.js");
 const utils_assets = require("../../utils/assets.js");
 const ErpTabBar = () => "../../components/erp-tab-bar.js";
+const ErpNavBar = () => "../../components/erp-nav-bar.js";
 const _sfc_main = {
-  components: {
-    ErpTabBar
-  },
+  components: { ErpTabBar, ErpNavBar },
   data() {
     return {
       assets: utils_assets.assets,
@@ -90,22 +89,29 @@ const _sfc_main = {
   }
 };
 if (!Array) {
+  const _component_erp_nav_bar = common_vendor.resolveComponent("erp-nav-bar");
   const _component_erp_tab_bar = common_vendor.resolveComponent("erp-tab-bar");
-  _component_erp_tab_bar();
+  (_component_erp_nav_bar + _component_erp_tab_bar)();
 }
 function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
   return common_vendor.e({
-    a: $data.isLogin
+    a: common_vendor.p({
+      title: "个人中心",
+      ["show-back"]: false,
+      ["bg-color"]: "#C1001C",
+      ["title-color"]: "#ffffff"
+    }),
+    b: $data.isLogin
   }, $data.isLogin ? {
-    b: $data.assets.mineSettings,
-    c: common_vendor.o((...args) => $options.goToSettings && $options.goToSettings(...args), "d8")
+    c: $data.assets.mineSettings,
+    d: common_vendor.o((...args) => $options.goToSettings && $options.goToSettings(...args), "ee")
   } : {
-    d: $data.assets.mineArrow,
-    e: common_vendor.o((...args) => $options.goToLogin && $options.goToLogin(...args), "c3")
+    e: $data.assets.mineArrow,
+    f: common_vendor.o((...args) => $options.goToLogin && $options.goToLogin(...args), "17")
   }, {
-    f: $data.assets.mineArrow,
-    g: common_vendor.o(($event) => $options.goToOrderList(0), "11"),
-    h: common_vendor.f($data.orderStates, (item, index, i0) => {
+    g: $data.assets.mineArrow,
+    h: common_vendor.o(($event) => $options.goToOrderList(0), "7c"),
+    i: common_vendor.f($data.orderStates, (item, index, i0) => {
       return {
         a: item.icon,
         b: common_vendor.t(item.label),
@@ -113,7 +119,7 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
         d: common_vendor.o(($event) => $options.goToOrderList(index + 1), index)
       };
     }),
-    i: common_vendor.f($data.menuList, (menu, index, i0) => {
+    j: common_vendor.f($data.menuList, (menu, index, i0) => {
       return {
         a: menu.icon,
         b: common_vendor.t(menu.label),
@@ -121,12 +127,12 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
         d: common_vendor.o(($event) => $options.handleMenuClick(menu), index)
       };
     }),
-    j: $data.assets.mineArrow,
-    k: $data.isLogin
+    k: $data.assets.mineArrow,
+    l: $data.isLogin
   }, $data.isLogin ? {
-    l: common_vendor.o((...args) => $options.handleLogout && $options.handleLogout(...args), "78")
+    m: common_vendor.o((...args) => $options.handleLogout && $options.handleLogout(...args), "33")
   } : {}, {
-    m: common_vendor.p({
+    n: common_vendor.p({
       active: "mine"
     })
   });

+ 3 - 4
unpackage/dist/dev/mp-weixin/pages/mine/index.json

@@ -1,8 +1,7 @@
 {
-  "navigationBarTitleText": "个人中心",
-  "navigationBarBackgroundColor": "#C1001C",
-  "navigationBarTextStyle": "white",
+  "navigationStyle": "custom",
   "usingComponents": {
-    "erp-tab-bar": "../../components/erp-tab-bar"
+    "erp-tab-bar": "../../components/erp-tab-bar",
+    "erp-nav-bar": "../../components/erp-nav-bar"
   }
 }

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages/mine/index.wxml


+ 233 - 93
unpackage/dist/dev/mp-weixin/pages/mine/index.wxss

@@ -1,113 +1,253 @@
 
-.mine-page.data-v-569e925a { width: 100%; height: 100vh; background: #f7f8fa; position: relative; display: flex; flex-direction: column; overflow: hidden;
+.mine-page.data-v-569e925a {
+	width: 100%;
+	height: 100vh;
+	background: #f7f8fa;
+	position: relative;
+	display: flex;
+	flex-direction: column;
+	overflow: hidden;
+}
+.mine-scroll.data-v-569e925a {
+	width: 100%;
+	height: 100%;
 }
-.mine-scroll.data-v-569e925a { width: 100%; height: 100%;
-}
-	/* 隐藏滚动条 */
-.mine-scroll.data-v-569e925a ::-webkit-scrollbar { width: 0 !important; height: 0 !important; color: transparent !important; display: none !important;
+
+/* 隐藏滚动条 */
+.mine-scroll.data-v-569e925a ::-webkit-scrollbar {
+	width: 0 !important;
+	height: 0 !important;
+	color: transparent !important;
+	display: none !important;
 }
 
-	/* 顶部定制背景:高级渐变蓝 + 柔和弧度 */
+/* 顶部定制背景:高级渐变蓝 + 柔和弧度 */
 .header-bg-shape.data-v-569e925a {
-		position: absolute;
-		top: 0;
-		left: 0;
-		width: 100%;
-		height: 380rpx;
-		background: linear-gradient(135deg, #C1001C 0%, #FF4D4F 100%);
-		border-bottom-left-radius: 60rpx;
-		border-bottom-right-radius: 60rpx;
-		z-index: 1;
-		box-shadow: 0 10rpx 30rpx rgba(193, 0, 28, 0.15);
+	position: absolute;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 380rpx;
+	background: linear-gradient(135deg, #C1001C 0%, #FF4D4F 100%);
+	border-bottom-left-radius: 60rpx;
+	border-bottom-right-radius: 60rpx;
+	z-index: 1;
+	box-shadow: 0 10rpx 30rpx rgba(193, 0, 28, 0.15);
 }
 .header-bg-gradient.data-v-569e925a {
-		width: 100%;
-		height: 100%;
-		background: linear-gradient(180deg, rgba(255,255,255,0) 0%, rgba(255,255,255,0.1) 100%);
-		border-bottom-left-radius: 60rpx;
-		border-bottom-right-radius: 60rpx;
+	width: 100%;
+	height: 100%;
+	background: linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.1) 100%);
+	border-bottom-left-radius: 60rpx;
+	border-bottom-right-radius: 60rpx;
 }
 
-	/* 标题栏已恢复为原生,此处仅需正常的容器内边距即可 */
-.content-wrapper.data-v-569e925a { position: relative; z-index: 2; flex: 1; display: flex; flex-direction: column; padding: 40rpx 30rpx 0; box-sizing: border-box;
+/* 标题栏已恢复为原生,此处仅需正常的容器内边距即可 */
+.content-wrapper.data-v-569e925a {
+	position: relative;
+	z-index: 2;
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	padding: 40rpx 30rpx 0;
+	box-sizing: border-box;
 }
 
-	/* 用户信息卡片 */
-.user-card.data-v-569e925a { background: #fff; border-radius: 32rpx; padding: 50rpx 40rpx; display: flex; align-items: center; margin-bottom: 30rpx; margin-top: 20rpx; box-shadow: 0 16rpx 40rpx rgba(0, 0, 0, 0.05);
-}
-.user-card.unlogged.data-v-569e925a { cursor: pointer;
-}
-.avatar-box.data-v-569e925a { width: 130rpx; height: 130rpx; border-radius: 65rpx; background: #f5f6f7; margin-right: 30rpx; overflow: hidden; border: 4rpx solid #fff; box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.05);
-}
-.gray-avatar.data-v-569e925a { background: #f0f0f0; display: flex; align-items: center; justify-content: center;
-}
-.avatar-img.data-v-569e925a { width: 100%; height: 100%;
-}
-.info-box.data-v-569e925a { flex: 1; display: flex; flex-direction: column; justify-content: center;
-}
-.nickname.data-v-569e925a { font-size: 40rpx; font-weight: bold; color: #1a1a1a; margin-bottom: 12rpx;
-}
-.login-hint.data-v-569e925a { color: #333;
-}
-.tags-row.data-v-569e925a { display: flex; align-items: center; margin-bottom: 12rpx;
-}
-.customer-tag.data-v-569e925a { font-size: 24rpx; color: #C1001C; background: rgba(193, 0, 28, 0.1); padding: 6rpx 16rpx; border-radius: 8rpx; font-weight: 500;
-}
-.phone-text.data-v-569e925a { font-size: 26rpx; color: #999;
-}
-	
-	/* 设置图标 & 右侧箭头 */
-.settings-btn.data-v-569e925a { width: 60rpx; height: 60rpx; display: flex; align-items: center; justify-content: center;
-}
-.settings-icon.data-v-569e925a { width: 44rpx; height: 44rpx; opacity: 0.6;
-}
-.arrow-icon-right.data-v-569e925a { width: 24rpx; height: 24rpx; opacity: 0.4;
+/* 用户信息卡片 */
+.user-card.data-v-569e925a {
+	background: #fff;
+	border-radius: 32rpx;
+	padding: 50rpx 40rpx;
+	display: flex;
+	align-items: center;
+	margin-bottom: 30rpx;
+	margin-top: 20rpx;
+	box-shadow: 0 16rpx 40rpx rgba(0, 0, 0, 0.05);
+}
+.user-card.unlogged.data-v-569e925a {
+	cursor: pointer;
+}
+.avatar-box.data-v-569e925a {
+	width: 130rpx;
+	height: 130rpx;
+	border-radius: 65rpx;
+	background: #f5f6f7;
+	margin-right: 30rpx;
+	overflow: hidden;
+	border: 4rpx solid #fff;
+	box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.05);
+}
+.gray-avatar.data-v-569e925a {
+	background: #f0f0f0;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+.avatar-img.data-v-569e925a {
+	width: 100%;
+	height: 100%;
+}
+.info-box.data-v-569e925a {
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	justify-content: center;
+}
+.nickname.data-v-569e925a {
+	font-size: 40rpx;
+	font-weight: bold;
+	color: #1a1a1a;
+	margin-bottom: 12rpx;
+}
+.login-hint.data-v-569e925a {
+	color: #333;
+}
+.tags-row.data-v-569e925a {
+	display: flex;
+	align-items: center;
+	margin-bottom: 12rpx;
+}
+.customer-tag.data-v-569e925a {
+	font-size: 24rpx;
+	color: #C1001C;
+	background: rgba(193, 0, 28, 0.1);
+	padding: 6rpx 16rpx;
+	border-radius: 8rpx;
+	font-weight: 500;
+}
+.phone-text.data-v-569e925a {
+	font-size: 26rpx;
+	color: #999;
 }
 
-	/* 通用卡片样式 */
-.section-card.data-v-569e925a { background: #fff; border-radius: 24rpx; padding: 40rpx 30rpx; margin-bottom: 30rpx; box-shadow: 0 8rpx 30rpx rgba(0,0,0,0.02);
-}
-	
-	/* 订单统计区块 */
-.section-header.data-v-569e925a { display: flex; justify-content: space-between; align-items: center; margin-bottom: 40rpx;
-}
-.section-title.data-v-569e925a { font-size: 32rpx; font-weight: bold; color: #333;
-}
-.more-link.data-v-569e925a { display: flex; align-items: center; font-size: 26rpx; color: #999;
-}
-.arrow-icon.data-v-569e925a { width: 20rpx; height: 20rpx; opacity: 0.5; margin-left: 6rpx; position: relative; top: 2rpx;
-}
-.stat-grid.data-v-569e925a { display: flex; justify-content: space-around;
-}
-.stat-item.data-v-569e925a { display: flex; flex-direction: column; align-items: center;
-}
-.stat-icon.data-v-569e925a { width: 56rpx; height: 56rpx; margin-bottom: 16rpx; opacity: 0.8;
-}
-.stat-label.data-v-569e925a { font-size: 26rpx; color: #666;
+/* 设置图标 & 右侧箭头 */
+.settings-btn.data-v-569e925a {
+	width: 60rpx;
+	height: 60rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+.settings-icon.data-v-569e925a {
+	width: 44rpx;
+	height: 44rpx;
+	opacity: 0.6;
+}
+.arrow-icon-right.data-v-569e925a {
+	width: 24rpx;
+	height: 24rpx;
+	opacity: 0.4;
 }
 
-	/* 菜单列表区块 */
-.menu-card.data-v-569e925a { padding: 10rpx 30rpx;
-}
-.menu-item.data-v-569e925a { display: flex; justify-content: space-between; align-items: center; padding: 36rpx 0; border-bottom: 1rpx solid #f5f6f7;
-}
-.menu-item.data-v-569e925a:last-child { border-bottom: none;
-}
-.menu-left.data-v-569e925a { display: flex; align-items: center;
-}
-.menu-icon.data-v-569e925a { width: 44rpx; height: 44rpx; margin-right: 20rpx; opacity: 0.7;
-}
-.menu-label.data-v-569e925a { font-size: 30rpx; color: #333;
+/* 通用卡片样式 */
+.section-card.data-v-569e925a {
+	background: #fff;
+	border-radius: 24rpx;
+	padding: 40rpx 30rpx;
+	margin-bottom: 30rpx;
+	box-shadow: 0 8rpx 30rpx rgba(0, 0, 0, 0.02);
 }
 
-	/* 退出登录 */
-.logout-section.data-v-569e925a { margin-top: 40rpx;
+/* 订单统计区块 */
+.section-header.data-v-569e925a {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	margin-bottom: 40rpx;
+}
+.section-title.data-v-569e925a {
+	font-size: 32rpx;
+	font-weight: bold;
+	color: #333;
+}
+.more-link.data-v-569e925a {
+	display: flex;
+	align-items: center;
+	font-size: 26rpx;
+	color: #999;
+}
+.arrow-icon.data-v-569e925a {
+	width: 20rpx;
+	height: 20rpx;
+	opacity: 0.5;
+	margin-left: 6rpx;
+	position: relative;
+	top: 2rpx;
+}
+.stat-grid.data-v-569e925a {
+	display: flex;
+	justify-content: space-around;
+}
+.stat-item.data-v-569e925a {
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+}
+.stat-icon.data-v-569e925a {
+	width: 56rpx;
+	height: 56rpx;
+	margin-bottom: 16rpx;
+	opacity: 0.8;
+}
+.stat-label.data-v-569e925a {
+	font-size: 26rpx;
+	color: #666;
 }
-.logout-btn.data-v-569e925a { width: 100%; height: 96rpx; background: #fff; color: #ff5e5e; border-radius: 24rpx; display: flex; align-items: center; justify-content: center; font-size: 32rpx; font-weight: bold; border: none; box-shadow: 0 4rpx 20rpx rgba(255, 94, 94, 0.05); transition: all 0.2s;
-}
-.logout-btn.data-v-569e925a:active { background: #fff0f0;
-}
-button.data-v-569e925a::after { border: none;
+
+/* 菜单列表区块 */
+.menu-card.data-v-569e925a {
+	padding: 10rpx 30rpx;
+}
+.menu-item.data-v-569e925a {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	padding: 36rpx 0;
+	border-bottom: 1rpx solid #f5f6f7;
+}
+.menu-item.data-v-569e925a:last-child {
+	border-bottom: none;
+}
+.menu-left.data-v-569e925a {
+	display: flex;
+	align-items: center;
+}
+.menu-icon.data-v-569e925a {
+	width: 44rpx;
+	height: 44rpx;
+	margin-right: 20rpx;
+	opacity: 0.7;
+}
+.menu-label.data-v-569e925a {
+	font-size: 30rpx;
+	color: #333;
 }
-.bottom-placeholder.data-v-569e925a { height: 180rpx;
+
+/* 退出登录 */
+.logout-section.data-v-569e925a {
+	margin-top: 40rpx;
+}
+.logout-btn.data-v-569e925a {
+	width: 100%;
+	height: 96rpx;
+	background: #fff;
+	color: #ff5e5e;
+	border-radius: 24rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 32rpx;
+	font-weight: bold;
+	border: none;
+	box-shadow: 0 4rpx 20rpx rgba(255, 94, 94, 0.05);
+	transition: all 0.2s;
+}
+.logout-btn.data-v-569e925a:active {
+	background: #fff0f0;
+}
+button.data-v-569e925a::after {
+	border: none;
+}
+.bottom-placeholder.data-v-569e925a {
+	height: 180rpx;
 }

+ 23 - 15
unpackage/dist/dev/mp-weixin/pages/mine/privacy/index.js

@@ -1,17 +1,14 @@
 "use strict";
 const common_vendor = require("../../../common/vendor.js");
+const api_system_agreement = require("../../../api/system/agreement.js");
+const ErpNavBar = () => "../../../components/erp-nav-bar.js";
 const _sfc_main = {
+  components: { ErpNavBar },
   data() {
     return {
       statusBarHeight: 20,
-      privacyNodes: `
-					<div style="line-height: 1.8; color: #444; font-size: 14px;">
-						<h3 style="color: #000; margin-top: 20px;">1. 我们收集的信息</h3>
-						<p>我们仅收集实现业务功能所必需的信息。包括您的登录手机号、企业授权名称、操作日志以及必要业务参数。</p>
-						<h3 style="color: #000; margin-top: 20px;">2. 信息安全保障</h3>
-						<p>我们采用行业标准的加密技术对您的数据进行存储,并建立了严格的内部访问控制体系。</p>
-					</div>
-				`
+      title: "",
+      privacyNodes: ""
     };
   },
   computed: {
@@ -19,9 +16,15 @@ const _sfc_main = {
       return `calc(100vh - ${this.statusBarHeight + 44}px)`;
     }
   },
-  onLoad() {
-    const info = common_vendor.index.getSystemInfoSync();
-    this.statusBarHeight = info.statusBarHeight;
+  async onLoad() {
+    this.statusBarHeight = common_vendor.index.getSystemInfoSync().statusBarHeight || 20;
+    try {
+      const res = await api_system_agreement.getAgreement(2);
+      this.title = res.data.title;
+      this.privacyNodes = res.data.content;
+    } catch (e) {
+      common_vendor.index.__f__("error", "at pages/mine/privacy/index.vue:37", "[隐私政策] 加载失败", e);
+    }
   },
   methods: {
     goBack() {
@@ -29,12 +32,17 @@ const _sfc_main = {
     }
   }
 };
+if (!Array) {
+  const _component_erp_nav_bar = common_vendor.resolveComponent("erp-nav-bar");
+  _component_erp_nav_bar();
+}
 function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
   return {
-    a: common_vendor.o((...args) => $options.goBack && $options.goBack(...args), "39"),
-    b: $data.statusBarHeight + "px",
-    c: $data.privacyNodes,
-    d: $options.scrollHeight
+    a: common_vendor.p({
+      title: $data.title
+    }),
+    b: $data.privacyNodes,
+    c: $options.scrollHeight
   };
 }
 const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-2b75265c"]]);

+ 3 - 2
unpackage/dist/dev/mp-weixin/pages/mine/privacy/index.json

@@ -1,5 +1,6 @@
 {
-  "navigationBarTitleText": "隐私政策",
   "navigationStyle": "custom",
-  "usingComponents": {}
+  "usingComponents": {
+    "erp-nav-bar": "../../../components/erp-nav-bar"
+  }
 }

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

@@ -1 +1 @@
-<view class="privacy-page data-v-2b75265c"><view class="custom-navbar data-v-2b75265c" style="{{'padding-top:' + b}}"><view class="nav-content data-v-2b75265c"><view class="back-area data-v-2b75265c" bindtap="{{a}}"><text class="back-arrow data-v-2b75265c"></text></view><view class="nav-title data-v-2b75265c">隐私政策</view><view class="right-placeholder data-v-2b75265c"></view></view></view><scroll-view scroll-y class="content-scroll data-v-2b75265c" style="{{'height:' + d}}"><view class="article-body data-v-2b75265c"><view class="title data-v-2b75265c">ERP 系统隐私政策</view><view class="update-time data-v-2b75265c">发布日期:2024年04月28日</view><rich-text class="data-v-2b75265c" nodes="{{c}}"></rich-text><view class="safe-bottom-hint data-v-2b75265c"><text class="data-v-2b75265c">加密存储 · 严格保密</text></view></view></scroll-view></view>
+<view class="privacy-page data-v-2b75265c"><erp-nav-bar wx:if="{{a}}" class="data-v-2b75265c" u-i="2b75265c-0" bind:__l="__l" u-p="{{a}}"/><scroll-view scroll-y class="content-scroll data-v-2b75265c" style="{{'height:' + c}}"><view class="article-body data-v-2b75265c"><rich-text class="data-v-2b75265c" nodes="{{b}}"></rich-text></view></scroll-view></view>

+ 33 - 23
unpackage/dist/dev/mp-weixin/pages/mine/privacy/index.wxss

@@ -1,25 +1,35 @@
 
-.privacy-page.data-v-2b75265c { width: 100vw; height: 100vh; background: #ffffff; display: flex; flex-direction: column;
-}
-.custom-navbar.data-v-2b75265c { background: #fff; flex-shrink: 0;
-}
-.nav-content.data-v-2b75265c { height: 44px; display: flex; align-items: center; justify-content: space-between; padding: 0 30rpx;
-}
-.back-area.data-v-2b75265c { width: 60rpx; height: 44px; display: flex; align-items: center;
-}
-.back-arrow.data-v-2b75265c { width: 22rpx; height: 22rpx; border-left: 4rpx solid #333; border-bottom: 4rpx solid #333; transform: rotate(45deg); margin-left: 10rpx;
-}
-.nav-title.data-v-2b75265c { font-size: 34rpx; font-weight: bold; color: #333;
-}
-.right-placeholder.data-v-2b75265c { width: 60rpx;
-}
-.content-scroll.data-v-2b75265c { width: 100%;
-}
-.article-body.data-v-2b75265c { padding: 40rpx; padding-top: 20rpx;
-}
-.title.data-v-2b75265c { font-size: 40rpx; font-weight: bold; color: #1a1a1a; margin-bottom: 16rpx; text-align: center;
-}
-.update-time.data-v-2b75265c { font-size: 24rpx; color: #999; margin-bottom: 40rpx; text-align: center;
-}
-.safe-bottom-hint.data-v-2b75265c { margin-top: 80rpx; text-align: center; color: #52c41a; font-size: 24rpx; opacity: 0.6;
+.privacy-page.data-v-2b75265c {
+	width: 100vw;
+	height: 100vh;
+	background: #ffffff;
+	display: flex;
+	flex-direction: column;
+}
+.content-scroll.data-v-2b75265c {
+	width: 100%;
+}
+.article-body.data-v-2b75265c {
+	padding: 40rpx;
+	padding-top: 20rpx;
+}
+.title.data-v-2b75265c {
+	font-size: 40rpx;
+	font-weight: bold;
+	color: #1a1a1a;
+	margin-bottom: 16rpx;
+	text-align: center;
+}
+.update-time.data-v-2b75265c {
+	font-size: 24rpx;
+	color: #999;
+	margin-bottom: 40rpx;
+	text-align: center;
+}
+.safe-bottom-hint.data-v-2b75265c {
+	margin-top: 80rpx;
+	text-align: center;
+	color: #52c41a;
+	font-size: 24rpx;
+	opacity: 0.6;
 }

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

@@ -1,9 +1,10 @@
 "use strict";
 const common_vendor = require("../../../common/vendor.js");
+const ErpNavBar = () => "../../../components/erp-nav-bar.js";
 const _sfc_main = {
+  components: { ErpNavBar },
   data() {
     return {
-      statusBarHeight: 20,
       myInfo: {
         avatarUrl: "https://img.icons8.com/clouds/200/manager.png",
         nickName: "张经理",
@@ -12,10 +13,6 @@ const _sfc_main = {
       }
     };
   },
-  onLoad() {
-    const info = common_vendor.index.getSystemInfoSync();
-    this.statusBarHeight = info.statusBarHeight;
-  },
   methods: {
     goBack() {
       common_vendor.index.navigateBack();
@@ -55,17 +52,22 @@ const _sfc_main = {
     }
   }
 };
+if (!Array) {
+  const _component_erp_nav_bar = common_vendor.resolveComponent("erp-nav-bar");
+  _component_erp_nav_bar();
+}
 function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
   return {
-    a: common_vendor.o((...args) => $options.goBack && $options.goBack(...args), "c7"),
-    b: $data.statusBarHeight + "px",
-    c: $data.myInfo.avatarUrl,
-    d: common_vendor.o((...args) => $options.doChooseImage && $options.doChooseImage(...args), "2c"),
-    e: common_vendor.t($data.myInfo.nickName),
-    f: common_vendor.o((...args) => $options.doEditName && $options.doEditName(...args), "c8"),
-    g: common_vendor.t($data.myInfo.phoneNum),
-    h: common_vendor.t($data.myInfo.orgName),
-    i: common_vendor.o((...args) => $options.saveProfile && $options.saveProfile(...args), "5d")
+    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")
   };
 }
 const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-2f058983"]]);

+ 3 - 2
unpackage/dist/dev/mp-weixin/pages/mine/settings/index.json

@@ -1,5 +1,6 @@
 {
-  "navigationBarTitleText": "个人资料设置",
   "navigationStyle": "custom",
-  "usingComponents": {}
+  "usingComponents": {
+    "erp-nav-bar": "../../../components/erp-nav-bar"
+  }
 }

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

@@ -1 +1 @@
-<view class="settings-root data-v-2f058983"><view class="custom-navbar data-v-2f058983" style="{{'padding-top:' + b}}"><view class="nav-content data-v-2f058983"><view class="back-area data-v-2f058983" bindtap="{{a}}"><text class="back-arrow data-v-2f058983"></text></view><view class="nav-title data-v-2f058983">个人资料设置</view><view class="right-placeholder data-v-2f058983"></view></view></view><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"><image class="avatar-img data-v-2f058983" src="{{c}}" mode="aspectFill"></image><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}}">确认保存</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="{{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>

+ 74 - 41
unpackage/dist/dev/mp-weixin/pages/mine/settings/index.wxss

@@ -1,43 +1,76 @@
 
-.settings-root.data-v-2f058983 { width: 100vw; height: 100vh; background: #f8fafb; display: flex; flex-direction: column;
-}
-	
-	/* 自定义导航栏样式 */
-.custom-navbar.data-v-2f058983 { background: #fff; flex-shrink: 0;
-}
-.nav-content.data-v-2f058983 { height: 44px; display: flex; align-items: center; justify-content: space-between; padding: 0 30rpx;
-}
-.back-area.data-v-2f058983 { width: 60rpx; height: 44px; display: flex; align-items: center;
-}
-.back-arrow.data-v-2f058983 { width: 22rpx; height: 22rpx; border-left: 4rpx solid #333; border-bottom: 4rpx solid #333; transform: rotate(45deg); margin-left: 10rpx;
-}
-.nav-title.data-v-2f058983 { font-size: 34rpx; font-weight: bold; color: #333;
-}
-.right-placeholder.data-v-2f058983 { width: 60rpx;
-}
-.settings-list.data-v-2f058983 { background: #fff; padding: 0 40rpx;
-}
-.mt-30.data-v-2f058983 { margin-top: 30rpx;
-}
-.item-row.data-v-2f058983 { display: flex; justify-content: space-between; align-items: center; min-height: 110rpx; border-bottom: 2rpx solid #f9f9f9;
-}
-.item-row.data-v-2f058983:last-child { border-bottom: none;
-}
-.avatar-row.data-v-2f058983 { height: 180rpx;
-}
-.item-label.data-v-2f058983 { font-size: 32rpx; color: #333;
-}
-.item-right.data-v-2f058983 { display: flex; align-items: center;
-}
-.avatar-img.data-v-2f058983 { width: 110rpx; height: 110rpx; border-radius: 50%; background: #eee; margin-right: 20rpx;
-}
-.item-value.data-v-2f058983 { font-size: 30rpx; color: #666; margin-right: 15rpx;
-}
-.item-value.readonly.data-v-2f058983 { color: #aaa; margin-right: 0;
-}
-.icon-more.data-v-2f058983 { width: 14rpx; height: 14rpx; border-top: 3rpx solid #ccc; border-right: 3rpx solid #ccc; transform: rotate(45deg);
-}
-.footer-bar.data-v-2f058983 { padding: 40rpx; margin-top: auto; padding-bottom: calc(40rpx + env(safe-area-inset-bottom));
-}
-.btn-confirm.data-v-2f058983 { width: 100%; height: 90rpx; background: #C1001C; color: #fff; border-radius: 45rpx; font-size: 32rpx; font-weight: bold; display: flex; align-items: center; justify-content: center;
+.settings-root.data-v-2f058983 {
+	width: 100vw;
+	height: 100vh;
+	background: #f8fafb;
+	display: flex;
+	flex-direction: column;
+}
+.settings-list.data-v-2f058983 {
+	background: #fff;
+	padding: 0 40rpx;
+}
+.mt-30.data-v-2f058983 {
+	margin-top: 30rpx;
+}
+.item-row.data-v-2f058983 {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	min-height: 110rpx;
+	border-bottom: 2rpx solid #f9f9f9;
+}
+.item-row.data-v-2f058983:last-child {
+	border-bottom: none;
+}
+.avatar-row.data-v-2f058983 {
+	height: 180rpx;
+}
+.item-label.data-v-2f058983 {
+	font-size: 32rpx;
+	color: #333;
+}
+.item-right.data-v-2f058983 {
+	display: flex;
+	align-items: center;
+}
+.avatar-img.data-v-2f058983 {
+	width: 110rpx;
+	height: 110rpx;
+	border-radius: 50%;
+	background: #eee;
+	margin-right: 20rpx;
+}
+.item-value.data-v-2f058983 {
+	font-size: 30rpx;
+	color: #666;
+	margin-right: 15rpx;
+}
+.item-value.readonly.data-v-2f058983 {
+	color: #aaa;
+	margin-right: 0;
+}
+.icon-more.data-v-2f058983 {
+	width: 14rpx;
+	height: 14rpx;
+	border-top: 3rpx solid #ccc;
+	border-right: 3rpx solid #ccc;
+	transform: rotate(45deg);
+}
+.footer-bar.data-v-2f058983 {
+	padding: 40rpx;
+	margin-top: auto;
+	padding-bottom: calc(40rpx + env(safe-area-inset-bottom));
+}
+.btn-confirm.data-v-2f058983 {
+	width: 100%;
+	height: 90rpx;
+	background: #C1001C;
+	color: #fff;
+	border-radius: 45rpx;
+	font-size: 32rpx;
+	font-weight: bold;
+	display: flex;
+	align-items: center;
+	justify-content: center;
 }

+ 57 - 48
unpackage/dist/dev/mp-weixin/pages/order/add-model/index.js

@@ -1,6 +1,8 @@
 "use strict";
 const common_vendor = require("../../../common/vendor.js");
+const ErpNavBar = () => "../../../components/erp-nav-bar.js";
 const _sfc_main = {
+  components: { ErpNavBar },
   data() {
     return {
       showTypePicker: false,
@@ -99,34 +101,41 @@ const _sfc_main = {
     }
   }
 };
+if (!Array) {
+  const _component_erp_nav_bar = common_vendor.resolveComponent("erp-nav-bar");
+  _component_erp_nav_bar();
+}
 function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
   return common_vendor.e({
-    a: common_vendor.t($data.formData.type || "请选择型号"),
-    b: !$data.formData.type ? 1 : "",
-    c: common_vendor.o((...args) => $options.openTypePicker && $options.openTypePicker(...args), "d9"),
-    d: $data.formData.name,
-    e: common_vendor.o(($event) => $data.formData.name = $event.detail.value, "fa"),
-    f: $data.formData.material,
-    g: common_vendor.o(($event) => $data.formData.material = $event.detail.value, "77"),
-    h: common_vendor.t($data.formData.surfaceName || "请选择表面名称"),
-    i: !$data.formData.surfaceName ? 1 : "",
-    j: common_vendor.o((...args) => $options.openSurfacePicker && $options.openSurfacePicker(...args), "b0"),
-    k: common_vendor.t($data.formData.packageMethod || "请选择包装方式"),
-    l: !$data.formData.packageMethod ? 1 : "",
-    m: common_vendor.o((...args) => $options.openPackagePicker && $options.openPackagePicker(...args), "d5"),
-    n: $data.formData.length,
-    o: common_vendor.o(($event) => $data.formData.length = $event.detail.value, "14"),
-    p: $data.formData.wallThickness,
-    q: common_vendor.o(($event) => $data.formData.wallThickness = $event.detail.value, "b0"),
-    r: $data.formData.count,
-    s: common_vendor.o(($event) => $data.formData.count = $event.detail.value, "8c"),
-    t: !$data.showTypePicker && !$data.showSurfacePicker && !$data.showPackagePicker,
-    v: common_vendor.o((...args) => $options.confirmAddModel && $options.confirmAddModel(...args), "48"),
-    w: $data.showTypePicker
+    a: common_vendor.p({
+      title: "添加型号"
+    }),
+    b: common_vendor.t($data.formData.type || "请选择型号"),
+    c: !$data.formData.type ? 1 : "",
+    d: common_vendor.o((...args) => $options.openTypePicker && $options.openTypePicker(...args), "e7"),
+    e: $data.formData.name,
+    f: common_vendor.o(($event) => $data.formData.name = $event.detail.value, "cd"),
+    g: $data.formData.material,
+    h: common_vendor.o(($event) => $data.formData.material = $event.detail.value, "65"),
+    i: common_vendor.t($data.formData.surfaceName || "请选择表面名称"),
+    j: !$data.formData.surfaceName ? 1 : "",
+    k: common_vendor.o((...args) => $options.openSurfacePicker && $options.openSurfacePicker(...args), "e5"),
+    l: common_vendor.t($data.formData.packageMethod || "请选择包装方式"),
+    m: !$data.formData.packageMethod ? 1 : "",
+    n: common_vendor.o((...args) => $options.openPackagePicker && $options.openPackagePicker(...args), "64"),
+    o: $data.formData.length,
+    p: common_vendor.o(($event) => $data.formData.length = $event.detail.value, "01"),
+    q: $data.formData.wallThickness,
+    r: common_vendor.o(($event) => $data.formData.wallThickness = $event.detail.value, "61"),
+    s: $data.formData.count,
+    t: common_vendor.o(($event) => $data.formData.count = $event.detail.value, "47"),
+    v: !$data.showTypePicker && !$data.showSurfacePicker && !$data.showPackagePicker,
+    w: common_vendor.o((...args) => $options.confirmAddModel && $options.confirmAddModel(...args), "d9"),
+    x: $data.showTypePicker
   }, $data.showTypePicker ? {
-    x: common_vendor.o((...args) => $options.closeTypePicker && $options.closeTypePicker(...args), "9a"),
-    y: common_vendor.o((...args) => $options.confirmTypeSelect && $options.confirmTypeSelect(...args), "9a"),
-    z: common_vendor.f($data.typeList, (item, index, i0) => {
+    y: common_vendor.o((...args) => $options.closeTypePicker && $options.closeTypePicker(...args), "0a"),
+    z: common_vendor.o((...args) => $options.confirmTypeSelect && $options.confirmTypeSelect(...args), "31"),
+    A: common_vendor.f($data.typeList, (item, index, i0) => {
       return common_vendor.e({
         a: common_vendor.t(item),
         b: $data.tempSelectedIndex === index
@@ -136,17 +145,17 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
         e: common_vendor.o(($event) => $options.selectTypeItem(index), index)
       });
     }),
-    A: common_vendor.o(() => {
-    }, "ed"),
-    B: common_vendor.o((...args) => $options.closeTypePicker && $options.closeTypePicker(...args), "7c"),
-    C: common_vendor.o(() => {
-    }, "c4")
+    B: common_vendor.o(() => {
+    }, "2f"),
+    C: common_vendor.o((...args) => $options.closeTypePicker && $options.closeTypePicker(...args), "f0"),
+    D: common_vendor.o(() => {
+    }, "d9")
   } : {}, {
-    D: $data.showSurfacePicker
+    E: $data.showSurfacePicker
   }, $data.showSurfacePicker ? {
-    E: common_vendor.o((...args) => $options.closeSurfacePicker && $options.closeSurfacePicker(...args), "10"),
-    F: common_vendor.o((...args) => $options.confirmSurfaceSelect && $options.confirmSurfaceSelect(...args), "9b"),
-    G: common_vendor.f($data.surfaceList, (item, index, i0) => {
+    F: common_vendor.o((...args) => $options.closeSurfacePicker && $options.closeSurfacePicker(...args), "14"),
+    G: common_vendor.o((...args) => $options.confirmSurfaceSelect && $options.confirmSurfaceSelect(...args), "eb"),
+    H: common_vendor.f($data.surfaceList, (item, index, i0) => {
       return common_vendor.e({
         a: common_vendor.t(item),
         b: $data.tempSurfaceIndex === index
@@ -156,17 +165,17 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
         e: common_vendor.o(($event) => $options.selectSurfaceItem(index), index)
       });
     }),
-    H: common_vendor.o(() => {
-    }, "12"),
-    I: common_vendor.o((...args) => $options.closeSurfacePicker && $options.closeSurfacePicker(...args), "fc"),
-    J: common_vendor.o(() => {
-    }, "71")
+    I: common_vendor.o(() => {
+    }, "bd"),
+    J: common_vendor.o((...args) => $options.closeSurfacePicker && $options.closeSurfacePicker(...args), "0b"),
+    K: common_vendor.o(() => {
+    }, "ff")
   } : {}, {
-    K: $data.showPackagePicker
+    L: $data.showPackagePicker
   }, $data.showPackagePicker ? {
-    L: common_vendor.o((...args) => $options.closePackagePicker && $options.closePackagePicker(...args), "8b"),
-    M: common_vendor.o((...args) => $options.confirmPackageSelect && $options.confirmPackageSelect(...args), "d8"),
-    N: common_vendor.f($data.packageList, (item, index, i0) => {
+    M: common_vendor.o((...args) => $options.closePackagePicker && $options.closePackagePicker(...args), "a7"),
+    N: common_vendor.o((...args) => $options.confirmPackageSelect && $options.confirmPackageSelect(...args), "f7"),
+    O: common_vendor.f($data.packageList, (item, index, i0) => {
       return common_vendor.e({
         a: common_vendor.t(item),
         b: $data.tempPackageIndex === index
@@ -176,11 +185,11 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
         e: common_vendor.o(($event) => $options.selectPackageItem(index), index)
       });
     }),
-    O: common_vendor.o(() => {
-    }, "46"),
-    P: common_vendor.o((...args) => $options.closePackagePicker && $options.closePackagePicker(...args), "76"),
-    Q: common_vendor.o(() => {
-    }, "93")
+    P: common_vendor.o(() => {
+    }, "54"),
+    Q: common_vendor.o((...args) => $options.closePackagePicker && $options.closePackagePicker(...args), "7e"),
+    R: common_vendor.o(() => {
+    }, "97")
   } : {});
 }
 const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-97855afd"]]);

+ 4 - 3
unpackage/dist/dev/mp-weixin/pages/order/add-model/index.json

@@ -1,5 +1,6 @@
 {
-  "navigationBarTitleText": "添加型号",
-  "navigationBarBackgroundColor": "#FFFFFF",
-  "usingComponents": {}
+  "navigationStyle": "custom",
+  "usingComponents": {
+    "erp-nav-bar": "../../../components/erp-nav-bar"
+  }
 }

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages/order/add-model/index.wxml


+ 231 - 100
unpackage/dist/dev/mp-weixin/pages/order/add-model/index.wxss

@@ -1,104 +1,235 @@
 
-.data-v-97855afd ::-webkit-scrollbar { display: none !important; width: 0 !important; height: 0 !important;
-}
-.order-container.data-v-97855afd { width: 100%; height: 100vh; background: #f7f8fa; display: flex; flex-direction: column; overflow: hidden;
-}
-.order-scroll.data-v-97855afd { flex: 1; height: 0;
-}
-.form-content.data-v-97855afd { 
-		padding: 30rpx; 
-		padding-bottom: calc(180rpx + env(safe-area-inset-bottom));
-}
-.section-card.data-v-97855afd { background: #fff; border-radius: 24rpx; padding: 30rpx; margin-bottom: 30rpx; box-shadow: 0 4rpx 20rpx rgba(0,0,0,0.02);
-}
-.section-header.data-v-97855afd { display: flex; align-items: center; margin-bottom: 40rpx;
-}
-.blue-bar.data-v-97855afd { width: 8rpx; height: 32rpx; background: #C1001C; border-radius: 4rpx; margin-right: 16rpx;
-}
-.section-title.data-v-97855afd { font-size: 32rpx; font-weight: bold; color: #333;
-}
-.form-item.data-v-97855afd { margin-bottom: 40rpx;
-}
-.no-margin-bottom.data-v-97855afd { margin-bottom: 0;
-}
-.row-flex.data-v-97855afd { display: flex; justify-content: space-between;
-}
-.half-item.data-v-97855afd { width: 48%;
-}
-.label.data-v-97855afd { font-size: 28rpx; color: #333; margin-bottom: 20rpx; display: block; font-weight: 500;
-}
-.label.required.data-v-97855afd::after { content: ' *'; color: #ff4d4f; font-weight: bold; margin-left: 4rpx;
-}
-.picker-box.data-v-97855afd { background: #f9fafc; border-radius: 12rpx; height: 100rpx; border: 1rpx solid #eee; display: flex; align-items: center;
-}
-.picker-inner.data-v-97855afd { width: 100%; height: 100%; display: flex; align-items: center; justify-content: space-between; padding: 0 30rpx; box-sizing: border-box;
-}
-.picker-val.data-v-97855afd { font-size: 30rpx; color: #333;
-}
-.picker-val.placeholder.data-v-97855afd { color: #ccc; font-size: 28rpx;
-}
-.line-arrow-down.data-v-97855afd { width: 14rpx; height: 14rpx; border-right: 3rpx solid #bbb; border-bottom: 3rpx solid #bbb; transform: rotate(45deg); margin-top: -8rpx; margin-right: 4rpx;
-}
-.input-wrap.data-v-97855afd { position: relative; width: 100%;
-}
-.input-box.data-v-97855afd { font-size: 30rpx; color: #333; width: 100%; height: 100rpx; background: #f9fafc; border-radius: 12rpx; padding: 0 80rpx 0 30rpx; box-sizing: border-box; border: 1rpx solid #eee;
-}
-.input-box.readonly.data-v-97855afd { background: #f8f9fa; color: #666; border-color: #f0f0f0;
-}
-.input-box.full-width.data-v-97855afd { padding: 0 30rpx;
-}
-.unit.data-v-97855afd { position: absolute; right: 24rpx; top: 50%; transform: translateY(-50%); font-size: 26rpx; color: #999; font-weight: 500;
-}
-.small-font.data-v-97855afd { font-size: 26rpx !important;
-}
-.fixed-submit-bar.data-v-97855afd { 
-		position: fixed; 
-		bottom: 0; 
-		left: 0; 
-		width: 100%; 
-		background: #fff; 
-		padding: 20rpx 30rpx calc(env(safe-area-inset-bottom) + 20rpx); 
-		box-sizing: border-box; 
-		box-shadow: 0 -10rpx 30rpx rgba(0,0,0,0.05);
-		z-index: 100;
-}
-.submit-btn.data-v-97855afd { 
-		background: #C1001C; 
-		color: #fff; 
-		height: 100rpx; 
-		border-radius: 50rpx; 
-		display: flex; 
-		align-items: center; 
-		justify-content: center; 
-		font-size: 34rpx; 
-		font-weight: bold; 
-		border: none;
-}
-.submit-btn.data-v-97855afd:active { opacity: 0.9; transform: scale(0.98);
-}
-.custom-picker-mask.data-v-97855afd { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.4); z-index: 1000; display: flex; align-items: flex-end;
-}
-.picker-popup.data-v-97855afd { width: 100%; background: #fff; border-radius: 32rpx 32rpx 0 0; padding-bottom: calc(env(safe-area-inset-bottom) + 20rpx); animation: slideUp-97855afd 0.15s ease-out;
+.data-v-97855afd ::-webkit-scrollbar {
+	display: none !important;
+	width: 0 !important;
+	height: 0 !important;
+}
+.order-container.data-v-97855afd {
+	width: 100%;
+	height: 100vh;
+	background: #f7f8fa;
+	display: flex;
+	flex-direction: column;
+	overflow: hidden;
+}
+.order-scroll.data-v-97855afd {
+	flex: 1;
+	height: 0;
+}
+.form-content.data-v-97855afd {
+	padding: 30rpx;
+	padding-bottom: calc(180rpx + env(safe-area-inset-bottom));
+}
+.section-card.data-v-97855afd {
+	background: #fff;
+	border-radius: 24rpx;
+	padding: 30rpx;
+	margin-bottom: 30rpx;
+	box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.02);
+}
+.section-header.data-v-97855afd {
+	display: flex;
+	align-items: center;
+	margin-bottom: 40rpx;
+}
+.blue-bar.data-v-97855afd {
+	width: 8rpx;
+	height: 32rpx;
+	background: #C1001C;
+	border-radius: 4rpx;
+	margin-right: 16rpx;
+}
+.section-title.data-v-97855afd {
+	font-size: 32rpx;
+	font-weight: bold;
+	color: #333;
+}
+.form-item.data-v-97855afd {
+	margin-bottom: 40rpx;
+}
+.no-margin-bottom.data-v-97855afd {
+	margin-bottom: 0;
+}
+.row-flex.data-v-97855afd {
+	display: flex;
+	justify-content: space-between;
+}
+.half-item.data-v-97855afd {
+	width: 48%;
+}
+.label.data-v-97855afd {
+	font-size: 28rpx;
+	color: #333;
+	margin-bottom: 20rpx;
+	display: block;
+	font-weight: 500;
+}
+.label.required.data-v-97855afd::after {
+	content: ' *';
+	color: #ff4d4f;
+	font-weight: bold;
+	margin-left: 4rpx;
+}
+.picker-box.data-v-97855afd {
+	background: #f9fafc;
+	border-radius: 12rpx;
+	height: 100rpx;
+	border: 1rpx solid #eee;
+	display: flex;
+	align-items: center;
+}
+.picker-inner.data-v-97855afd {
+	width: 100%;
+	height: 100%;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 0 30rpx;
+	box-sizing: border-box;
+}
+.picker-val.data-v-97855afd {
+	font-size: 30rpx;
+	color: #333;
+}
+.picker-val.placeholder.data-v-97855afd {
+	color: #ccc;
+	font-size: 28rpx;
+}
+.line-arrow-down.data-v-97855afd {
+	width: 14rpx;
+	height: 14rpx;
+	border-right: 3rpx solid #bbb;
+	border-bottom: 3rpx solid #bbb;
+	transform: rotate(45deg);
+	margin-top: -8rpx;
+	margin-right: 4rpx;
+}
+.input-wrap.data-v-97855afd {
+	position: relative;
+	width: 100%;
+}
+.input-box.data-v-97855afd {
+	font-size: 30rpx;
+	color: #333;
+	width: 100%;
+	height: 100rpx;
+	background: #f9fafc;
+	border-radius: 12rpx;
+	padding: 0 80rpx 0 30rpx;
+	box-sizing: border-box;
+	border: 1rpx solid #eee;
+}
+.input-box.readonly.data-v-97855afd {
+	background: #f8f9fa;
+	color: #666;
+	border-color: #f0f0f0;
+}
+.input-box.full-width.data-v-97855afd {
+	padding: 0 30rpx;
+}
+.unit.data-v-97855afd {
+	position: absolute;
+	right: 24rpx;
+	top: 50%;
+	transform: translateY(-50%);
+	font-size: 26rpx;
+	color: #999;
+	font-weight: 500;
+}
+.small-font.data-v-97855afd {
+	font-size: 26rpx !important;
+}
+.fixed-submit-bar.data-v-97855afd {
+	position: fixed;
+	bottom: 0;
+	left: 0;
+	width: 100%;
+	background: #fff;
+	padding: 20rpx 30rpx calc(env(safe-area-inset-bottom) + 20rpx);
+	box-sizing: border-box;
+	box-shadow: 0 -10rpx 30rpx rgba(0, 0, 0, 0.05);
+	z-index: 100;
+}
+.submit-btn.data-v-97855afd {
+	background: #C1001C;
+	color: #fff;
+	height: 100rpx;
+	border-radius: 50rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 34rpx;
+	font-weight: bold;
+	border: none;
+}
+.submit-btn.data-v-97855afd:active {
+	opacity: 0.9;
+	transform: scale(0.98);
+}
+.custom-picker-mask.data-v-97855afd {
+	position: fixed;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	background: rgba(0, 0, 0, 0.4);
+	z-index: 1000;
+	display: flex;
+	align-items: flex-end;
+}
+.picker-popup.data-v-97855afd {
+	width: 100%;
+	background: #fff;
+	border-radius: 32rpx 32rpx 0 0;
+	padding-bottom: calc(env(safe-area-inset-bottom) + 20rpx);
+	animation: slideUp-97855afd 0.15s ease-out;
 }
 @keyframes slideUp-97855afd {
-from { transform: translateY(100%);
-}
-to { transform: translateY(0);
-}
-}
-.popup-header.data-v-97855afd { display: flex; justify-content: space-between; align-items: center; padding: 30rpx 40rpx; border-bottom: 1rpx solid #f0f0f0;
-}
-.popup-title.data-v-97855afd { font-size: 32rpx; font-weight: bold; color: #333;
-}
-.cancel-text.data-v-97855afd, .confirm-text.data-v-97855afd { font-size: 30rpx; padding: 10rpx;
-}
-.confirm-text.data-v-97855afd { color: #C1001C; font-weight: bold;
-}
-.item-list.data-v-97855afd { max-height: 50vh; padding: 0 40rpx;
-}
-.option-item.data-v-97855afd { height: 110rpx; display: flex; align-items: center; justify-content: space-between; border-bottom: 1rpx solid #f8f8f8; font-size: 32rpx; color: #333;
-}
-.option-item.active.data-v-97855afd { color: #C1001C; font-weight: bold;
-}
-.bottom-placeholder.data-v-97855afd { height: 60rpx;
+from {
+		transform: translateY(100%);
+}
+to {
+		transform: translateY(0);
+}
+}
+.popup-header.data-v-97855afd {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	padding: 30rpx 40rpx;
+	border-bottom: 1rpx solid #f0f0f0;
+}
+.popup-title.data-v-97855afd {
+	font-size: 32rpx;
+	font-weight: bold;
+	color: #333;
+}
+.cancel-text.data-v-97855afd,
+.confirm-text.data-v-97855afd {
+	font-size: 30rpx;
+	padding: 10rpx;
+}
+.confirm-text.data-v-97855afd {
+	color: #C1001C;
+	font-weight: bold;
+}
+.item-list.data-v-97855afd {
+	max-height: 50vh;
+	padding: 0 40rpx;
+}
+.option-item.data-v-97855afd {
+	height: 110rpx;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	border-bottom: 1rpx solid #f8f8f8;
+	font-size: 32rpx;
+	color: #333;
+}
+.option-item.active.data-v-97855afd {
+	color: #C1001C;
+	font-weight: bold;
+}
+.bottom-placeholder.data-v-97855afd {
+	height: 60rpx;
 }

+ 24 - 19
unpackage/dist/dev/mp-weixin/pages/order/detail/index.js

@@ -1,9 +1,10 @@
 "use strict";
 const common_vendor = require("../../../common/vendor.js");
+const ErpNavBar = () => "../../../components/erp-nav-bar.js";
 const _sfc_main = {
+  components: { ErpNavBar },
   data() {
     return {
-      statusBarHeight: 20,
       footerHeight: 80,
       // px
       headerHeight: 120,
@@ -33,12 +34,11 @@ const _sfc_main = {
     scrollHeight() {
       const info = common_vendor.index.getSystemInfoSync();
       const safeBottom = info.safeAreaInsets ? info.safeAreaInsets.bottom : 0;
-      return `calc(100vh - ${this.statusBarHeight + 164}px - ${80 + safeBottom}px)`;
+      const statusBarHeight = common_vendor.index.getSystemInfoSync().statusBarHeight || 20;
+      return `calc(100vh - ${statusBarHeight + 164}px - ${80 + safeBottom}px)`;
     }
   },
   onLoad(options) {
-    const info = common_vendor.index.getSystemInfoSync();
-    this.statusBarHeight = info.statusBarHeight;
     if (options.data) {
       try {
         this.order = JSON.parse(decodeURIComponent(options.data));
@@ -74,14 +74,19 @@ const _sfc_main = {
     }
   }
 };
+if (!Array) {
+  const _component_erp_nav_bar = common_vendor.resolveComponent("erp-nav-bar");
+  _component_erp_nav_bar();
+}
 function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
   return common_vendor.e({
-    a: common_vendor.o((...args) => $options.goBack && $options.goBack(...args), "ee"),
-    b: $data.statusBarHeight + "px",
-    c: common_vendor.t($data.order.statusName),
-    d: common_vendor.t($options.statusSubText),
-    e: common_vendor.n($data.order.statusType),
-    f: common_vendor.f($data.order.models || [$data.order], (model, mIdx, i0) => {
+    a: common_vendor.p({
+      title: "订单详情"
+    }),
+    b: common_vendor.t($data.order.statusName),
+    c: common_vendor.t($options.statusSubText),
+    d: common_vendor.n($data.order.statusType),
+    e: common_vendor.f($data.order.models || [$data.order], (model, mIdx, i0) => {
       return {
         a: common_vendor.t(mIdx + 1),
         b: common_vendor.t(model.type),
@@ -96,19 +101,19 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
         k: mIdx
       };
     }),
-    g: common_vendor.t($data.order.orderNo),
-    h: [2, 3, 4].includes($data.order.status)
+    f: common_vendor.t($data.order.orderNo),
+    g: [2, 3, 4].includes($data.order.status)
   }, [2, 3, 4].includes($data.order.status) ? {
-    i: common_vendor.t($data.order.erpNo || "ERP" + $data.order.orderNo.slice(-8))
+    h: common_vendor.t($data.order.erpNo || "ERP" + $data.order.orderNo.slice(-8))
   } : {}, {
-    j: common_vendor.t($data.order.time),
-    k: $options.scrollHeight,
-    l: $data.order.status === 1
+    i: common_vendor.t($data.order.time),
+    j: $options.scrollHeight,
+    k: $data.order.status === 1
   }, $data.order.status === 1 ? {
-    m: common_vendor.o((...args) => $options.doCancel && $options.doCancel(...args), "e1"),
-    n: common_vendor.o((...args) => $options.callSales && $options.callSales(...args), "e9")
+    l: common_vendor.o((...args) => $options.doCancel && $options.doCancel(...args), "8d"),
+    m: common_vendor.o((...args) => $options.callSales && $options.callSales(...args), "49")
   } : {
-    o: common_vendor.o((...args) => $options.goHome && $options.goHome(...args), "c7")
+    n: common_vendor.o((...args) => $options.goHome && $options.goHome(...args), "a0")
   });
 }
 const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-a8bbe39b"]]);

+ 3 - 2
unpackage/dist/dev/mp-weixin/pages/order/detail/index.json

@@ -1,5 +1,6 @@
 {
-  "navigationBarTitleText": "订单详情",
   "navigationStyle": "custom",
-  "usingComponents": {}
+  "usingComponents": {
+    "erp-nav-bar": "../../../components/erp-nav-bar"
+  }
 }

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages/order/detail/index.wxml


+ 156 - 79
unpackage/dist/dev/mp-weixin/pages/order/detail/index.wxss

@@ -1,93 +1,170 @@
 
-.data-v-a8bbe39b ::-webkit-scrollbar { display: none !important; width: 0 !important; height: 0 !important; -webkit-appearance: none; background: transparent;
+.data-v-a8bbe39b ::-webkit-scrollbar {
+	display: none !important;
+	width: 0 !important;
+	height: 0 !important;
+	-webkit-appearance: none;
+	background: transparent;
 }
-.detail-page-container.data-v-a8bbe39b { width: 100vw; height: 100vh; background: #f8fbfd; display: flex; flex-direction: column; overflow: hidden; position: relative;
+.detail-page-container.data-v-a8bbe39b {
+	width: 100vw;
+	height: 100vh;
+	background: #f8fbfd;
+	display: flex;
+	flex-direction: column;
+	overflow: hidden;
+	position: relative;
 }
-.white-nav-section.data-v-a8bbe39b { background: #fff; width: 100%; flex-shrink: 0;
+.status-banner-container.data-v-a8bbe39b {
+	color: #fff;
+	flex-shrink: 0;
 }
-.custom-nav-bar.data-v-a8bbe39b { height: 44px; display: flex; align-items: center; justify-content: space-between; padding: 0 30rpx;
+.status-banner-container.pending.data-v-a8bbe39b {
+	background: linear-gradient(135deg, #C1001C 0%, #FF4D4F 100%);
 }
-.back-icon.data-v-a8bbe39b { width: 60rpx; height: 44px; display: flex; align-items: center;
+.status-banner-container.process.data-v-a8bbe39b {
+	background: linear-gradient(135deg, #FF6A00 0%, #EE0979 100%);
 }
-.arrow-left.data-v-a8bbe39b { width: 20rpx; height: 20rpx; border-left: 4rpx solid #333; border-bottom: 4rpx solid #333; transform: rotate(45deg); margin-left: 10rpx;
+.status-banner-container.making.data-v-a8bbe39b {
+	background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
 }
-.nav-title.data-v-a8bbe39b { font-size: 34rpx; font-weight: bold; color: #1a1a1a;
+.status-banner-container.finish.data-v-a8bbe39b {
+	background: linear-gradient(135deg, #2af598 0%, #009efd 100%);
 }
-.placeholder-right.data-v-a8bbe39b { width: 60rpx;
-}
-.status-banner-container.data-v-a8bbe39b { color: #fff; flex-shrink: 0;
-}
-.status-banner-container.pending.data-v-a8bbe39b { background: linear-gradient(135deg, #C1001C 0%, #FF4D4F 100%);
-}
-.status-banner-container.process.data-v-a8bbe39b { background: linear-gradient(135deg, #FF6A00 0%, #EE0979 100%);
-}
-.status-banner-container.making.data-v-a8bbe39b { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-}
-.status-banner-container.finish.data-v-a8bbe39b { background: linear-gradient(135deg, #2af598 0%, #009efd 100%);
-}
-.status-banner-container.expired.data-v-a8bbe39b { background: linear-gradient(135deg, #868f96 0%, #596164 100%);
+.status-banner-container.expired.data-v-a8bbe39b {
+	background: linear-gradient(135deg, #868f96 0%, #596164 100%);
 }
 
-	/* 状态横幅内容 */
-.status-banner-content.data-v-a8bbe39b { padding: 40rpx; padding-bottom: 60rpx; display: flex; justify-content: space-between; align-items: center;
-}
-.header-main.data-v-a8bbe39b { flex: 1;
-}
-.status-title.data-v-a8bbe39b { font-size: 48rpx; font-weight: bold; display: block; margin-bottom: 12rpx;
-}
-.status-sub.data-v-a8bbe39b { font-size: 26rpx; opacity: 0.9;
-}
-.status-visual-icon.data-v-a8bbe39b { width: 60rpx; height: 60rpx; border: 4rpx solid rgba(255,255,255,0.3); border-radius: 50%; opacity: 0.6;
+/* 状态横幅内容 */
+.status-banner-content.data-v-a8bbe39b {
+	padding: 40rpx;
+	padding-bottom: 60rpx;
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+}
+.header-main.data-v-a8bbe39b {
+	flex: 1;
+}
+.status-title.data-v-a8bbe39b {
+	font-size: 48rpx;
+	font-weight: bold;
+	display: block;
+	margin-bottom: 12rpx;
+}
+.status-sub.data-v-a8bbe39b {
+	font-size: 26rpx;
+	opacity: 0.9;
+}
+.status-visual-icon.data-v-a8bbe39b {
+	width: 60rpx;
+	height: 60rpx;
+	border: 4rpx solid rgba(255, 255, 255, 0.3);
+	border-radius: 50%;
+	opacity: 0.6;
 }
 
-	/* 修正:移除负边距,并明确滚动方向 */
-.main-content-scroll.data-v-a8bbe39b { width: 100%; flex: 1;
-}
-.detail-inner-box.data-v-a8bbe39b { padding: 30rpx; padding-top: 10rpx;
-}
-.data-group-card.data-v-a8bbe39b { background: #fff; border-radius: 30rpx; padding: 40rpx; margin-bottom: 30rpx; box-shadow: 0 4rpx 20rpx rgba(0,0,0,0.02);
-}
-	/* 第一张卡片增加顶部间隔(红框1优化点) */
-.first-card.data-v-a8bbe39b { margin-top: 20rpx;
-}
-.card-head.data-v-a8bbe39b { font-size: 30rpx; font-weight: bold; color: #333; margin-bottom: 30rpx; border-left: 8rpx solid #C1001C; padding-left: 20rpx;
+/* 修正:移除负边距,并明确滚动方向 */
+.main-content-scroll.data-v-a8bbe39b {
+	width: 100%;
+	flex: 1;
+}
+.detail-inner-box.data-v-a8bbe39b {
+	padding: 30rpx;
+	padding-top: 10rpx;
+}
+.data-group-card.data-v-a8bbe39b {
+	background: #fff;
+	border-radius: 30rpx;
+	padding: 40rpx;
+	margin-bottom: 30rpx;
+	box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.02);
 }
-.line-split.data-v-a8bbe39b { height: 1rpx; background: #f5f5f5; margin: 24rpx 0;
-}
-.data-item.data-v-a8bbe39b { display: flex; justify-content: space-between; margin-bottom: 24rpx; font-size: 28rpx; align-items: center;
-}
-.l.data-v-a8bbe39b { color: #999;
-}
-.v.data-v-a8bbe39b { color: #333; font-weight: 500;
-}
-.v.bold.data-v-a8bbe39b { font-weight: bold; font-size: 30rpx;
-}
-.v.erp-no.data-v-a8bbe39b { color: #C1001C; font-weight: bold;
-}
-.v.highlight.data-v-a8bbe39b { color: #ff3b30; font-weight: bold; font-size: 34rpx;
-}
-.list-bottom-placeholder.data-v-a8bbe39b { height: 260rpx;
-}
-.detail-action-bar-fixed.data-v-a8bbe39b { 
-		position: fixed; 
-		bottom: 0; 
-		left: 0; 
-		right: 0; 
-		background: #fff; 
-		padding: 30rpx 40rpx; 
-		box-shadow: 0 -10rpx 40rpx rgba(0,0,0,0.04); 
-		z-index: 999; 
-		flex-shrink: 0;
-}
-.action-btn-wrap.data-v-a8bbe39b { display: flex; gap: 24rpx;
-}
-.action-btn.data-v-a8bbe39b { flex: 1; height: 96rpx; border-radius: 48rpx; display: flex; align-items: center; justify-content: center; font-size: 32rpx; font-weight: bold;
-}
-.action-btn.primary.data-v-a8bbe39b { background: #C1001C; color: #fff; border: none;
-}
-.action-btn.cancel.data-v-a8bbe39b { background: #fff1f0; color: #ff3b30; border: 1rpx solid #ffccc7; font-weight: normal;
-}
-.safe-area-bottom-support.data-v-a8bbe39b { 
-		height: constant(safe-area-inset-bottom); 
-		height: env(safe-area-inset-bottom);
+
+/* 第一张卡片增加顶部间隔(红框1优化点) */
+.first-card.data-v-a8bbe39b {
+	margin-top: 20rpx;
+}
+.card-head.data-v-a8bbe39b {
+	font-size: 30rpx;
+	font-weight: bold;
+	color: #333;
+	margin-bottom: 30rpx;
+	border-left: 8rpx solid #C1001C;
+	padding-left: 20rpx;
+}
+.line-split.data-v-a8bbe39b {
+	height: 1rpx;
+	background: #f5f5f5;
+	margin: 24rpx 0;
+}
+.data-item.data-v-a8bbe39b {
+	display: flex;
+	justify-content: space-between;
+	margin-bottom: 24rpx;
+	font-size: 28rpx;
+	align-items: center;
+}
+.l.data-v-a8bbe39b {
+	color: #999;
+}
+.v.data-v-a8bbe39b {
+	color: #333;
+	font-weight: 500;
+}
+.v.bold.data-v-a8bbe39b {
+	font-weight: bold;
+	font-size: 30rpx;
+}
+.v.erp-no.data-v-a8bbe39b {
+	color: #C1001C;
+	font-weight: bold;
+}
+.v.highlight.data-v-a8bbe39b {
+	color: #ff3b30;
+	font-weight: bold;
+	font-size: 34rpx;
+}
+.list-bottom-placeholder.data-v-a8bbe39b {
+	height: 260rpx;
+}
+.detail-action-bar-fixed.data-v-a8bbe39b {
+	position: fixed;
+	bottom: 0;
+	left: 0;
+	right: 0;
+	background: #fff;
+	padding: 30rpx 40rpx;
+	box-shadow: 0 -10rpx 40rpx rgba(0, 0, 0, 0.04);
+	z-index: 999;
+	flex-shrink: 0;
+}
+.action-btn-wrap.data-v-a8bbe39b {
+	display: flex;
+	gap: 24rpx;
+}
+.action-btn.data-v-a8bbe39b {
+	flex: 1;
+	height: 96rpx;
+	border-radius: 48rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 32rpx;
+	font-weight: bold;
+}
+.action-btn.primary.data-v-a8bbe39b {
+	background: #C1001C;
+	color: #fff;
+	border: none;
+}
+.action-btn.cancel.data-v-a8bbe39b {
+	background: #fff1f0;
+	color: #ff3b30;
+	border: 1rpx solid #ffccc7;
+	font-weight: normal;
+}
+.safe-area-bottom-support.data-v-a8bbe39b {
+	height: constant(safe-area-inset-bottom);
+	height: env(safe-area-inset-bottom);
 }

+ 57 - 48
unpackage/dist/dev/mp-weixin/pages/order/edit-model/index.js

@@ -1,6 +1,8 @@
 "use strict";
 const common_vendor = require("../../../common/vendor.js");
+const ErpNavBar = () => "../../../components/erp-nav-bar.js";
 const _sfc_main = {
+  components: { ErpNavBar },
   data() {
     return {
       itemIndex: -1,
@@ -32,7 +34,7 @@ const _sfc_main = {
         this.formData = item;
         this.itemIndex = parseInt(options.index || -1);
       } catch (e) {
-        common_vendor.index.__f__("error", "at pages/order/edit-model/index.vue:203", "Data parse error", e);
+        common_vendor.index.__f__("error", "at pages/order/edit-model/index.vue:209", "Data parse error", e);
       }
     }
   },
@@ -114,33 +116,40 @@ const _sfc_main = {
     }
   }
 };
+if (!Array) {
+  const _component_erp_nav_bar = common_vendor.resolveComponent("erp-nav-bar");
+  _component_erp_nav_bar();
+}
 function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
   return common_vendor.e({
-    a: common_vendor.t($data.formData.type || "请选择型号"),
-    b: !$data.formData.type ? 1 : "",
-    c: common_vendor.o((...args) => $options.openTypePicker && $options.openTypePicker(...args), "a5"),
-    d: $data.formData.name,
-    e: common_vendor.o(($event) => $data.formData.name = $event.detail.value, "9f"),
-    f: $data.formData.material,
-    g: common_vendor.o(($event) => $data.formData.material = $event.detail.value, "5f"),
-    h: common_vendor.t($data.formData.surfaceName || "请选择表面名称"),
-    i: !$data.formData.surfaceName ? 1 : "",
-    j: common_vendor.o((...args) => $options.openSurfacePicker && $options.openSurfacePicker(...args), "e1"),
-    k: common_vendor.t($data.formData.packageMethod || "请选择包装方式"),
-    l: !$data.formData.packageMethod ? 1 : "",
-    m: common_vendor.o((...args) => $options.openPackagePicker && $options.openPackagePicker(...args), "96"),
-    n: $data.formData.length,
-    o: common_vendor.o(($event) => $data.formData.length = $event.detail.value, "bf"),
-    p: $data.formData.wallThickness,
-    q: common_vendor.o(($event) => $data.formData.wallThickness = $event.detail.value, "4c"),
-    r: $data.formData.count,
-    s: common_vendor.o(($event) => $data.formData.count = $event.detail.value, "86"),
-    t: common_vendor.o((...args) => $options.saveEdit && $options.saveEdit(...args), "9a"),
-    v: $data.showTypePicker
+    a: common_vendor.p({
+      title: "编辑型号"
+    }),
+    b: common_vendor.t($data.formData.type || "请选择型号"),
+    c: !$data.formData.type ? 1 : "",
+    d: common_vendor.o((...args) => $options.openTypePicker && $options.openTypePicker(...args), "a5"),
+    e: $data.formData.name,
+    f: common_vendor.o(($event) => $data.formData.name = $event.detail.value, "bc"),
+    g: $data.formData.material,
+    h: common_vendor.o(($event) => $data.formData.material = $event.detail.value, "84"),
+    i: common_vendor.t($data.formData.surfaceName || "请选择表面名称"),
+    j: !$data.formData.surfaceName ? 1 : "",
+    k: common_vendor.o((...args) => $options.openSurfacePicker && $options.openSurfacePicker(...args), "3c"),
+    l: common_vendor.t($data.formData.packageMethod || "请选择包装方式"),
+    m: !$data.formData.packageMethod ? 1 : "",
+    n: common_vendor.o((...args) => $options.openPackagePicker && $options.openPackagePicker(...args), "0b"),
+    o: $data.formData.length,
+    p: common_vendor.o(($event) => $data.formData.length = $event.detail.value, "7d"),
+    q: $data.formData.wallThickness,
+    r: common_vendor.o(($event) => $data.formData.wallThickness = $event.detail.value, "23"),
+    s: $data.formData.count,
+    t: common_vendor.o(($event) => $data.formData.count = $event.detail.value, "ed"),
+    v: common_vendor.o((...args) => $options.saveEdit && $options.saveEdit(...args), "5f"),
+    w: $data.showTypePicker
   }, $data.showTypePicker ? {
-    w: common_vendor.o((...args) => $options.closeTypePicker && $options.closeTypePicker(...args), "79"),
-    x: common_vendor.o((...args) => $options.confirmTypeSelect && $options.confirmTypeSelect(...args), "75"),
-    y: common_vendor.f($data.typeList, (item, index, i0) => {
+    x: common_vendor.o((...args) => $options.closeTypePicker && $options.closeTypePicker(...args), "4a"),
+    y: common_vendor.o((...args) => $options.confirmTypeSelect && $options.confirmTypeSelect(...args), "e5"),
+    z: common_vendor.f($data.typeList, (item, index, i0) => {
       return common_vendor.e({
         a: common_vendor.t(item),
         b: $data.tempSelectedIndex === index
@@ -150,17 +159,17 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
         e: common_vendor.o(($event) => $options.selectTypeItem(index), index)
       });
     }),
-    z: common_vendor.o(() => {
-    }, "72"),
-    A: common_vendor.o((...args) => $options.closeTypePicker && $options.closeTypePicker(...args), "b7"),
-    B: common_vendor.o(() => {
-    }, "a1")
+    A: common_vendor.o(() => {
+    }, "d4"),
+    B: common_vendor.o((...args) => $options.closeTypePicker && $options.closeTypePicker(...args), "b0"),
+    C: common_vendor.o(() => {
+    }, "2e")
   } : {}, {
-    C: $data.showSurfacePicker
+    D: $data.showSurfacePicker
   }, $data.showSurfacePicker ? {
-    D: common_vendor.o((...args) => $options.closeSurfacePicker && $options.closeSurfacePicker(...args), "83"),
-    E: common_vendor.o((...args) => $options.confirmSurfaceSelect && $options.confirmSurfaceSelect(...args), "b7"),
-    F: common_vendor.f($data.surfaceList, (item, index, i0) => {
+    E: common_vendor.o((...args) => $options.closeSurfacePicker && $options.closeSurfacePicker(...args), "1d"),
+    F: common_vendor.o((...args) => $options.confirmSurfaceSelect && $options.confirmSurfaceSelect(...args), "b7"),
+    G: common_vendor.f($data.surfaceList, (item, index, i0) => {
       return common_vendor.e({
         a: common_vendor.t(item),
         b: $data.tempSurfaceIndex === index
@@ -170,17 +179,17 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
         e: common_vendor.o(($event) => $options.selectSurfaceItem(index), index)
       });
     }),
-    G: common_vendor.o(() => {
-    }, "3e"),
-    H: common_vendor.o((...args) => $options.closeSurfacePicker && $options.closeSurfacePicker(...args), "d2"),
-    I: common_vendor.o(() => {
-    }, "cb")
+    H: common_vendor.o(() => {
+    }, "cb"),
+    I: common_vendor.o((...args) => $options.closeSurfacePicker && $options.closeSurfacePicker(...args), "27"),
+    J: common_vendor.o(() => {
+    }, "53")
   } : {}, {
-    J: $data.showPackagePicker
+    K: $data.showPackagePicker
   }, $data.showPackagePicker ? {
-    K: common_vendor.o((...args) => $options.closePackagePicker && $options.closePackagePicker(...args), "62"),
-    L: common_vendor.o((...args) => $options.confirmPackageSelect && $options.confirmPackageSelect(...args), "eb"),
-    M: common_vendor.f($data.packageList, (item, index, i0) => {
+    L: common_vendor.o((...args) => $options.closePackagePicker && $options.closePackagePicker(...args), "e1"),
+    M: common_vendor.o((...args) => $options.confirmPackageSelect && $options.confirmPackageSelect(...args), "80"),
+    N: common_vendor.f($data.packageList, (item, index, i0) => {
       return common_vendor.e({
         a: common_vendor.t(item),
         b: $data.tempPackageIndex === index
@@ -190,11 +199,11 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
         e: common_vendor.o(($event) => $options.selectPackageItem(index), index)
       });
     }),
-    N: common_vendor.o(() => {
-    }, "6c"),
-    O: common_vendor.o((...args) => $options.closePackagePicker && $options.closePackagePicker(...args), "a3"),
-    P: common_vendor.o(() => {
-    }, "d7")
+    O: common_vendor.o(() => {
+    }, "97"),
+    P: common_vendor.o((...args) => $options.closePackagePicker && $options.closePackagePicker(...args), "3e"),
+    Q: common_vendor.o(() => {
+    }, "0c")
   } : {});
 }
 const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-411bd231"]]);

+ 4 - 3
unpackage/dist/dev/mp-weixin/pages/order/edit-model/index.json

@@ -1,5 +1,6 @@
 {
-  "navigationBarTitleText": "编辑型号",
-  "navigationBarBackgroundColor": "#FFFFFF",
-  "usingComponents": {}
+  "navigationStyle": "custom",
+  "usingComponents": {
+    "erp-nav-bar": "../../../components/erp-nav-bar"
+  }
 }

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages/order/edit-model/index.wxml


+ 231 - 100
unpackage/dist/dev/mp-weixin/pages/order/edit-model/index.wxss

@@ -1,104 +1,235 @@
 
-.data-v-411bd231 ::-webkit-scrollbar { display: none !important; width: 0 !important; height: 0 !important;
-}
-.order-container.data-v-411bd231 { width: 100%; height: 100vh; background: #f7f8fa; display: flex; flex-direction: column; overflow: hidden;
-}
-.order-scroll.data-v-411bd231 { flex: 1; height: 0;
-}
-.form-content.data-v-411bd231 { 
-		padding: 30rpx; 
-		padding-bottom: calc(180rpx + env(safe-area-inset-bottom));
-}
-.section-card.data-v-411bd231 { background: #fff; border-radius: 24rpx; padding: 30rpx; margin-bottom: 30rpx; box-shadow: 0 4rpx 20rpx rgba(0,0,0,0.02);
-}
-.section-header.data-v-411bd231 { display: flex; align-items: center; margin-bottom: 40rpx;
-}
-.blue-bar.data-v-411bd231 { width: 8rpx; height: 32rpx; background: #C1001C; border-radius: 4rpx; margin-right: 16rpx;
-}
-.section-title.data-v-411bd231 { font-size: 32rpx; font-weight: bold; color: #333;
-}
-.form-item.data-v-411bd231 { margin-bottom: 40rpx;
-}
-.no-margin-bottom.data-v-411bd231 { margin-bottom: 0;
-}
-.row-flex.data-v-411bd231 { display: flex; justify-content: space-between;
-}
-.half-item.data-v-411bd231 { width: 48%;
-}
-.label.data-v-411bd231 { font-size: 28rpx; color: #333; margin-bottom: 20rpx; display: block; font-weight: 500;
-}
-.label.required.data-v-411bd231::after { content: ' *'; color: #ff4d4f; font-weight: bold; margin-left: 4rpx;
-}
-.picker-box.data-v-411bd231 { background: #f9fafc; border-radius: 12rpx; height: 100rpx; border: 1rpx solid #eee; display: flex; align-items: center;
-}
-.picker-inner.data-v-411bd231 { width: 100%; height: 100%; display: flex; align-items: center; justify-content: space-between; padding: 0 30rpx; box-sizing: border-box;
-}
-.picker-val.data-v-411bd231 { font-size: 30rpx; color: #333;
-}
-.picker-val.placeholder.data-v-411bd231 { color: #ccc; font-size: 28rpx;
-}
-.line-arrow-down.data-v-411bd231 { width: 14rpx; height: 14rpx; border-right: 3rpx solid #bbb; border-bottom: 3rpx solid #bbb; transform: rotate(45deg); margin-top: -8rpx; margin-right: 4rpx;
-}
-.input-wrap.data-v-411bd231 { position: relative; width: 100%;
-}
-.input-box.data-v-411bd231 { font-size: 30rpx; color: #333; width: 100%; height: 100rpx; background: #f9fafc; border-radius: 12rpx; padding: 0 80rpx 0 30rpx; box-sizing: border-box; border: 1rpx solid #eee;
-}
-.input-box.readonly.data-v-411bd231 { background: #f8f9fa; color: #666; border-color: #f0f0f0;
-}
-.input-box.full-width.data-v-411bd231 { padding: 0 30rpx;
-}
-.unit.data-v-411bd231 { position: absolute; right: 24rpx; top: 50%; transform: translateY(-50%); font-size: 26rpx; color: #999; font-weight: 500;
-}
-.small-font.data-v-411bd231 { font-size: 26rpx !important;
-}
-.fixed-submit-bar.data-v-411bd231 { 
-		position: fixed; 
-		bottom: 0; 
-		left: 0; 
-		width: 100%; 
-		background: #fff; 
-		padding: 20rpx 30rpx calc(env(safe-area-inset-bottom) + 20rpx); 
-		box-sizing: border-box; 
-		box-shadow: 0 -10rpx 30rpx rgba(0,0,0,0.05);
-		z-index: 100;
-}
-.submit-btn.data-v-411bd231 { 
-		background: #C1001C; 
-		color: #fff; 
-		height: 100rpx; 
-		border-radius: 50rpx; 
-		display: flex; 
-		align-items: center; 
-		justify-content: center; 
-		font-size: 34rpx; 
-		font-weight: bold; 
-		border: none;
-}
-.submit-btn.data-v-411bd231:active { opacity: 0.9; transform: scale(0.98);
-}
-.custom-picker-mask.data-v-411bd231 { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.4); z-index: 1000; display: flex; align-items: flex-end;
-}
-.picker-popup.data-v-411bd231 { width: 100%; background: #fff; border-radius: 32rpx 32rpx 0 0; padding-bottom: calc(env(safe-area-inset-bottom) + 20rpx); animation: slideUp-411bd231 0.15s ease-out;
+.data-v-411bd231 ::-webkit-scrollbar {
+	display: none !important;
+	width: 0 !important;
+	height: 0 !important;
+}
+.order-container.data-v-411bd231 {
+	width: 100%;
+	height: 100vh;
+	background: #f7f8fa;
+	display: flex;
+	flex-direction: column;
+	overflow: hidden;
+}
+.order-scroll.data-v-411bd231 {
+	flex: 1;
+	height: 0;
+}
+.form-content.data-v-411bd231 {
+	padding: 30rpx;
+	padding-bottom: calc(180rpx + env(safe-area-inset-bottom));
+}
+.section-card.data-v-411bd231 {
+	background: #fff;
+	border-radius: 24rpx;
+	padding: 30rpx;
+	margin-bottom: 30rpx;
+	box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.02);
+}
+.section-header.data-v-411bd231 {
+	display: flex;
+	align-items: center;
+	margin-bottom: 40rpx;
+}
+.blue-bar.data-v-411bd231 {
+	width: 8rpx;
+	height: 32rpx;
+	background: #C1001C;
+	border-radius: 4rpx;
+	margin-right: 16rpx;
+}
+.section-title.data-v-411bd231 {
+	font-size: 32rpx;
+	font-weight: bold;
+	color: #333;
+}
+.form-item.data-v-411bd231 {
+	margin-bottom: 40rpx;
+}
+.no-margin-bottom.data-v-411bd231 {
+	margin-bottom: 0;
+}
+.row-flex.data-v-411bd231 {
+	display: flex;
+	justify-content: space-between;
+}
+.half-item.data-v-411bd231 {
+	width: 48%;
+}
+.label.data-v-411bd231 {
+	font-size: 28rpx;
+	color: #333;
+	margin-bottom: 20rpx;
+	display: block;
+	font-weight: 500;
+}
+.label.required.data-v-411bd231::after {
+	content: ' *';
+	color: #ff4d4f;
+	font-weight: bold;
+	margin-left: 4rpx;
+}
+.picker-box.data-v-411bd231 {
+	background: #f9fafc;
+	border-radius: 12rpx;
+	height: 100rpx;
+	border: 1rpx solid #eee;
+	display: flex;
+	align-items: center;
+}
+.picker-inner.data-v-411bd231 {
+	width: 100%;
+	height: 100%;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 0 30rpx;
+	box-sizing: border-box;
+}
+.picker-val.data-v-411bd231 {
+	font-size: 30rpx;
+	color: #333;
+}
+.picker-val.placeholder.data-v-411bd231 {
+	color: #ccc;
+	font-size: 28rpx;
+}
+.line-arrow-down.data-v-411bd231 {
+	width: 14rpx;
+	height: 14rpx;
+	border-right: 3rpx solid #bbb;
+	border-bottom: 3rpx solid #bbb;
+	transform: rotate(45deg);
+	margin-top: -8rpx;
+	margin-right: 4rpx;
+}
+.input-wrap.data-v-411bd231 {
+	position: relative;
+	width: 100%;
+}
+.input-box.data-v-411bd231 {
+	font-size: 30rpx;
+	color: #333;
+	width: 100%;
+	height: 100rpx;
+	background: #f9fafc;
+	border-radius: 12rpx;
+	padding: 0 80rpx 0 30rpx;
+	box-sizing: border-box;
+	border: 1rpx solid #eee;
+}
+.input-box.readonly.data-v-411bd231 {
+	background: #f8f9fa;
+	color: #666;
+	border-color: #f0f0f0;
+}
+.input-box.full-width.data-v-411bd231 {
+	padding: 0 30rpx;
+}
+.unit.data-v-411bd231 {
+	position: absolute;
+	right: 24rpx;
+	top: 50%;
+	transform: translateY(-50%);
+	font-size: 26rpx;
+	color: #999;
+	font-weight: 500;
+}
+.small-font.data-v-411bd231 {
+	font-size: 26rpx !important;
+}
+.fixed-submit-bar.data-v-411bd231 {
+	position: fixed;
+	bottom: 0;
+	left: 0;
+	width: 100%;
+	background: #fff;
+	padding: 20rpx 30rpx calc(env(safe-area-inset-bottom) + 20rpx);
+	box-sizing: border-box;
+	box-shadow: 0 -10rpx 30rpx rgba(0, 0, 0, 0.05);
+	z-index: 100;
+}
+.submit-btn.data-v-411bd231 {
+	background: #C1001C;
+	color: #fff;
+	height: 100rpx;
+	border-radius: 50rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 34rpx;
+	font-weight: bold;
+	border: none;
+}
+.submit-btn.data-v-411bd231:active {
+	opacity: 0.9;
+	transform: scale(0.98);
+}
+.custom-picker-mask.data-v-411bd231 {
+	position: fixed;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	background: rgba(0, 0, 0, 0.4);
+	z-index: 1000;
+	display: flex;
+	align-items: flex-end;
+}
+.picker-popup.data-v-411bd231 {
+	width: 100%;
+	background: #fff;
+	border-radius: 32rpx 32rpx 0 0;
+	padding-bottom: calc(env(safe-area-inset-bottom) + 20rpx);
+	animation: slideUp-411bd231 0.15s ease-out;
 }
 @keyframes slideUp-411bd231 {
-from { transform: translateY(100%);
-}
-to { transform: translateY(0);
-}
-}
-.popup-header.data-v-411bd231 { display: flex; justify-content: space-between; align-items: center; padding: 30rpx 40rpx; border-bottom: 1rpx solid #f0f0f0;
-}
-.popup-title.data-v-411bd231 { font-size: 32rpx; font-weight: bold; color: #333;
-}
-.cancel-text.data-v-411bd231, .confirm-text.data-v-411bd231 { font-size: 30rpx; padding: 10rpx;
-}
-.confirm-text.data-v-411bd231 { color: #C1001C; font-weight: bold;
-}
-.item-list.data-v-411bd231 { max-height: 50vh; padding: 0 40rpx;
-}
-.option-item.data-v-411bd231 { height: 110rpx; display: flex; align-items: center; justify-content: space-between; border-bottom: 1rpx solid #f8f8f8; font-size: 32rpx; color: #333;
-}
-.option-item.active.data-v-411bd231 { color: #C1001C; font-weight: bold;
-}
-.bottom-placeholder.data-v-411bd231 { height: 60rpx;
+from {
+		transform: translateY(100%);
+}
+to {
+		transform: translateY(0);
+}
+}
+.popup-header.data-v-411bd231 {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	padding: 30rpx 40rpx;
+	border-bottom: 1rpx solid #f0f0f0;
+}
+.popup-title.data-v-411bd231 {
+	font-size: 32rpx;
+	font-weight: bold;
+	color: #333;
+}
+.cancel-text.data-v-411bd231,
+.confirm-text.data-v-411bd231 {
+	font-size: 30rpx;
+	padding: 10rpx;
+}
+.confirm-text.data-v-411bd231 {
+	color: #C1001C;
+	font-weight: bold;
+}
+.item-list.data-v-411bd231 {
+	max-height: 50vh;
+	padding: 0 40rpx;
+}
+.option-item.data-v-411bd231 {
+	height: 110rpx;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	border-bottom: 1rpx solid #f8f8f8;
+	font-size: 32rpx;
+	color: #333;
+}
+.option-item.active.data-v-411bd231 {
+	color: #C1001C;
+	font-weight: bold;
+}
+.bottom-placeholder.data-v-411bd231 {
+	height: 60rpx;
 }

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

@@ -1,8 +1,9 @@
 "use strict";
 const common_vendor = require("../../common/vendor.js");
 const ErpTabBar = () => "../../components/erp-tab-bar.js";
+const ErpNavBar = () => "../../components/erp-nav-bar.js";
 const _sfc_main = {
-  components: { ErpTabBar },
+  components: { ErpNavBar, ErpTabBar },
   data() {
     return {
       isAuthorized: false,
@@ -70,21 +71,26 @@ const _sfc_main = {
   }
 };
 if (!Array) {
+  const _component_erp_nav_bar = common_vendor.resolveComponent("erp-nav-bar");
   const _component_erp_tab_bar = common_vendor.resolveComponent("erp-tab-bar");
-  _component_erp_tab_bar();
+  (_component_erp_nav_bar + _component_erp_tab_bar)();
 }
 function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
   return common_vendor.e({
-    a: !$data.isAuthorized
+    a: common_vendor.p({
+      title: "ERP 下单",
+      ["show-back"]: false
+    }),
+    b: !$data.isAuthorized
   }, !$data.isAuthorized ? {
-    b: common_vendor.o((...args) => $options.contactAdmin && $options.contactAdmin(...args), "d8"),
-    c: common_vendor.o(($event) => $data.isAuthorized = true, "35")
+    c: common_vendor.o((...args) => $options.contactAdmin && $options.contactAdmin(...args), "1b"),
+    d: common_vendor.o(($event) => $data.isAuthorized = true, "9e")
   } : common_vendor.e({
-    d: $data.selectedModels.length > 0
-  }, $data.selectedModels.length > 0 ? {} : {}, {
     e: $data.selectedModels.length > 0
+  }, $data.selectedModels.length > 0 ? {} : {}, {
+    f: $data.selectedModels.length > 0
   }, $data.selectedModels.length > 0 ? {
-    f: common_vendor.f($data.selectedModels, (item, index, i0) => {
+    g: common_vendor.f($data.selectedModels, (item, index, i0) => {
       return {
         a: common_vendor.o(($event) => $options.removeItem(index), index),
         b: common_vendor.t(item.type),
@@ -95,20 +101,20 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
       };
     })
   } : {
-    g: common_vendor.o((...args) => $options.goToAddModel && $options.goToAddModel(...args), "65")
+    h: common_vendor.o((...args) => $options.goToAddModel && $options.goToAddModel(...args), "57")
   }, {
-    h: $data.selectedModels.length > 0
+    i: $data.selectedModels.length > 0
   }, $data.selectedModels.length > 0 ? {
-    i: common_vendor.o((...args) => $options.goToAddModel && $options.goToAddModel(...args), "31")
+    j: common_vendor.o((...args) => $options.goToAddModel && $options.goToAddModel(...args), "2d")
   } : {}, {
-    j: $data.selectedModels.length > 0
+    k: $data.selectedModels.length > 0
   }, $data.selectedModels.length > 0 ? {
-    k: common_vendor.t($data.selectedModels.length),
-    l: common_vendor.t($options.totalCount),
-    m: $data.selectedModels.length === 0,
-    n: common_vendor.o((...args) => $options.submitFinalOrder && $options.submitFinalOrder(...args), "fd")
+    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")
   } : {}), {
-    o: common_vendor.p({
+    p: common_vendor.p({
       active: "order"
     })
   });

+ 3 - 4
unpackage/dist/dev/mp-weixin/pages/order/index.json

@@ -1,8 +1,7 @@
 {
-  "navigationBarTitleText": "ERP 下单",
-  "navigationBarBackgroundColor": "#FFFFFF",
-  "navigationBarTextStyle": "black",
+  "navigationStyle": "custom",
   "usingComponents": {
-    "erp-tab-bar": "../../components/erp-tab-bar"
+    "erp-tab-bar": "../../components/erp-tab-bar",
+    "erp-nav-bar": "../../components/erp-nav-bar"
   }
 }

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages/order/index.wxml


+ 340 - 160
unpackage/dist/dev/mp-weixin/pages/order/index.wxss

@@ -1,174 +1,354 @@
 
-.data-v-17a44f9d ::-webkit-scrollbar { display: none !important; width: 0 !important; height: 0 !important;
-}
-.order-container.data-v-17a44f9d { width: 100%; height: 100vh; background: #f8fafc; display: flex; flex-direction: column; overflow: hidden;
-}
-	
-	/* 授权等待样式保持一致 */
-.auth-waiting-full.data-v-17a44f9d { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: flex-start; padding: 200rpx 40rpx 40rpx; background: linear-gradient(180deg, rgba(0, 122, 255, 0.08) 0%, rgba(247, 248, 250, 1) 100%);
-}
-.auth-card.data-v-17a44f9d { display: flex; flex-direction: column; align-items: center; text-align: center;
-}
-.auth-icon.data-v-17a44f9d { width: 200rpx; height: 200rpx; margin-bottom: 50rpx;
-}
-.auth-title.data-v-17a44f9d { font-size: 44rpx; font-weight: bold; color: #1a1a1a; margin-bottom: 24rpx;
-}
-.auth-desc.data-v-17a44f9d { font-size: 28rpx; color: #666; line-height: 1.8; margin-bottom: 80rpx; padding: 0 20rpx;
-}
-.contact-btn.data-v-17a44f9d { width: 360rpx; height: 96rpx; background: linear-gradient(135deg, #C1001C 0%, #FF4D4F 100%); color: #fff; border-radius: 48rpx; display: flex; align-items: center; justify-content: center; font-size: 32rpx; font-weight: bold; border: none; box-shadow: 0 12rpx 30rpx rgba(193, 0, 28, 0.2);
-}
-.authorized-btn.data-v-17a44f9d { width: 360rpx; height: 96rpx; background: #fff; color: #C1001C; border-radius: 48rpx; display: flex; align-items: center; justify-content: center; font-size: 32rpx; font-weight: bold; border: 2rpx solid #C1001C; margin-top: 30rpx;
+.data-v-17a44f9d ::-webkit-scrollbar {
+	display: none !important;
+	width: 0 !important;
+	height: 0 !important;
+}
+.order-container.data-v-17a44f9d {
+	width: 100%;
+	height: 100vh;
+	background: #f8fafc;
+	display: flex;
+	flex-direction: column;
+	overflow: hidden;
 }
 
-	/* 已授权列表页样式 */
-.order-container.data-v-17a44f9d { width: 100%; height: 100vh; background: #f7f8fa; display: flex; flex-direction: column; overflow: hidden;
-}
-.order-scroll-list.data-v-17a44f9d { flex: 1; height: 0;
-}
-.list-wrapper.data-v-17a44f9d { 
-		padding: 30rpx; 
-		/* 确保最后一条数据不被底部双层固定栏遮挡:汇总栏130 + 菜单栏110 + 安全区 + 缓冲余量 */
-		padding-bottom: calc(280rpx + env(safe-area-inset-bottom));
-}
-.list-header.data-v-17a44f9d { padding: 10rpx 0 20rpx;
-}
-.header-text.data-v-17a44f9d { font-size: 34rpx; font-weight: bold; color: #1a1a1a; position: relative; padding-left: 24rpx;
-}
-.header-text.data-v-17a44f9d::before { content: ''; position: absolute; left: 0; top: 10%; height: 80%; width: 8rpx; background: #C1001C; border-radius: 4rpx;
+/* 授权等待样式保持一致 */
+.auth-waiting-full.data-v-17a44f9d {
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	justify-content: flex-start;
+	padding: 200rpx 40rpx 40rpx;
+	background: linear-gradient(180deg, rgba(0, 122, 255, 0.08) 0%, rgba(247, 248, 250, 1) 100%);
+}
+.auth-card.data-v-17a44f9d {
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	text-align: center;
+}
+.auth-icon.data-v-17a44f9d {
+	width: 200rpx;
+	height: 200rpx;
+	margin-bottom: 50rpx;
+}
+.auth-title.data-v-17a44f9d {
+	font-size: 44rpx;
+	font-weight: bold;
+	color: #1a1a1a;
+	margin-bottom: 24rpx;
+}
+.auth-desc.data-v-17a44f9d {
+	font-size: 28rpx;
+	color: #666;
+	line-height: 1.8;
+	margin-bottom: 80rpx;
+	padding: 0 20rpx;
+}
+.contact-btn.data-v-17a44f9d {
+	width: 360rpx;
+	height: 96rpx;
+	background: linear-gradient(135deg, #C1001C 0%, #FF4D4F 100%);
+	color: #fff;
+	border-radius: 48rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 32rpx;
+	font-weight: bold;
+	border: none;
+	box-shadow: 0 12rpx 30rpx rgba(193, 0, 28, 0.2);
+}
+.authorized-btn.data-v-17a44f9d {
+	width: 360rpx;
+	height: 96rpx;
+	background: #fff;
+	color: #C1001C;
+	border-radius: 48rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 32rpx;
+	font-weight: bold;
+	border: 2rpx solid #C1001C;
+	margin-top: 30rpx;
 }
 
-	/* 型号卡片:大幅升级美化 */
-.model-item-card.data-v-17a44f9d { 
-		background: #fff; 
-		border-radius: 24rpx; 
-		padding: 36rpx; 
-		margin-bottom: 30rpx; 
-		position: relative; 
-		box-shadow: 0 8rpx 30rpx rgba(0,0,0,0.04);
-		border: 1rpx solid rgba(0,0,0,0.02);
-}
-.remove-icon.data-v-17a44f9d { 
-		position: absolute; 
-		right: 0; 
-		top: 0; 
-		width: 50rpx; 
-		height: 50rpx; 
-		background: rgba(255, 77, 79, 0.1); 
-		border-radius: 0 24rpx 0 24rpx; 
-		display: flex; 
-		align-items: center; 
-		justify-content: center; 
-		z-index: 5;
-}
-.x-icon.data-v-17a44f9d { font-size: 32rpx; color: #ff4d4f; font-weight: bold;
-}
-.card-line.data-v-17a44f9d { display: flex; align-items: center; margin-bottom: 20rpx;
-}
-.card-line.secondary.data-v-17a44f9d { margin-bottom: 0; padding-top: 20rpx; border-top: 1rpx dashed #f0f0f0;
-}
-.model-label.data-v-17a44f9d { font-size: 26rpx; color: #999;
-}
-.model-value.data-v-17a44f9d { font-size: 34rpx; font-weight: bold; color: #333; flex: 1;
-}
-.count-tag.data-v-17a44f9d { background: #FFF1F2; color: #C1001C; padding: 4rpx 16rpx; border-radius: 8rpx; font-size: 24rpx; font-weight: bold;
-}
-.count-num.data-v-17a44f9d { font-size: 30rpx; margin-left: 8rpx;
-}
-.surface-label.data-v-17a44f9d { font-size: 26rpx; color: #999;
-}
-.surface-text.data-v-17a44f9d { font-size: 28rpx; color: #666;
+/* 已授权列表页样式 */
+.order-container.data-v-17a44f9d {
+	width: 100%;
+	height: 100vh;
+	background: #f7f8fa;
+	display: flex;
+	flex-direction: column;
+	overflow: hidden;
+}
+.order-scroll-list.data-v-17a44f9d {
+	flex: 1;
+	height: 0;
+}
+.list-wrapper.data-v-17a44f9d {
+	padding: 30rpx;
+	/* 确保最后一条数据不被底部双层固定栏遮挡:汇总栏130 + 菜单栏110 + 安全区 + 缓冲余量 */
+	padding-bottom: calc(280rpx + env(safe-area-inset-bottom));
+}
+.list-header.data-v-17a44f9d {
+	padding: 10rpx 0 20rpx;
+}
+.header-text.data-v-17a44f9d {
+	font-size: 34rpx;
+	font-weight: bold;
+	color: #1a1a1a;
+	position: relative;
+	padding-left: 24rpx;
+}
+.header-text.data-v-17a44f9d::before {
+	content: '';
+	position: absolute;
+	left: 0;
+	top: 10%;
+	height: 80%;
+	width: 8rpx;
+	background: #C1001C;
+	border-radius: 4rpx;
 }
 
-	/* 悬浮添加按钮:位置上移避免拥挤 */
-.floating-add-btn.data-v-17a44f9d { 
-		position: fixed; 
-		right: 40rpx; 
-		bottom: calc(260rpx + env(safe-area-inset-bottom) + 40rpx); 
-		width: 110rpx; 
-		height: 110rpx; 
-		background: #C1001C; 
-		border-radius: 50%; 
-		display: flex; 
-		align-items: center; 
-		justify-content: center; 
-		box-shadow: 0 12rpx 40rpx rgba(193, 0, 28, 0.4);
-		z-index: 100;
-		transition: transform 0.2s;
-}
-.floating-add-btn.data-v-17a44f9d:active { transform: scale(0.9);
-}
-.plus-icon.data-v-17a44f9d { width: 40rpx; height: 4rpx; background: #fff; border-radius: 2rpx; position: relative;
-}
-.plus-icon.data-v-17a44f9d::after { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: #fff; transform: rotate(90deg); border-radius: 2rpx;
+/* 型号卡片:大幅升级美化 */
+.model-item-card.data-v-17a44f9d {
+	background: #fff;
+	border-radius: 24rpx;
+	padding: 36rpx;
+	margin-bottom: 30rpx;
+	position: relative;
+	box-shadow: 0 8rpx 30rpx rgba(0, 0, 0, 0.04);
+	border: 1rpx solid rgba(0, 0, 0, 0.02);
+}
+.remove-icon.data-v-17a44f9d {
+	position: absolute;
+	right: 0;
+	top: 0;
+	width: 50rpx;
+	height: 50rpx;
+	background: rgba(255, 77, 79, 0.1);
+	border-radius: 0 24rpx 0 24rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	z-index: 5;
+}
+.x-icon.data-v-17a44f9d {
+	font-size: 32rpx;
+	color: #ff4d4f;
+	font-weight: bold;
+}
+.card-line.data-v-17a44f9d {
+	display: flex;
+	align-items: center;
+	margin-bottom: 20rpx;
+}
+.card-line.secondary.data-v-17a44f9d {
+	margin-bottom: 0;
+	padding-top: 20rpx;
+	border-top: 1rpx dashed #f0f0f0;
+}
+.model-label.data-v-17a44f9d {
+	font-size: 26rpx;
+	color: #999;
+}
+.model-value.data-v-17a44f9d {
+	font-size: 34rpx;
+	font-weight: bold;
+	color: #333;
+	flex: 1;
+}
+.count-tag.data-v-17a44f9d {
+	background: #FFF1F2;
+	color: #C1001C;
+	padding: 4rpx 16rpx;
+	border-radius: 8rpx;
+	font-size: 24rpx;
+	font-weight: bold;
+}
+.count-num.data-v-17a44f9d {
+	font-size: 30rpx;
+	margin-left: 8rpx;
+}
+.surface-label.data-v-17a44f9d {
+	font-size: 26rpx;
+	color: #999;
+}
+.surface-text.data-v-17a44f9d {
+	font-size: 28rpx;
+	color: #666;
 }
 
-	/* 底部汇总栏:微调间距与样式 */
-.footer-summary-bar.data-v-17a44f9d { 
-		position: fixed; 
-		bottom: calc(110rpx + env(safe-area-inset-bottom)); 
-		left: 0; 
-		width: 100%; 
-		height: 130rpx; 
-		background: #fff; 
-		border-top: 1rpx solid #f0f0f0; 
-		display: flex; 
-		align-items: center; 
-		justify-content: space-between; 
-		padding: 0 40rpx; 
-		box-sizing: border-box; 
-		z-index: 99;
-		box-shadow: 0 -10rpx 40rpx rgba(0,0,0,0.05);
-}
-.summary-info.data-v-17a44f9d { display: flex; align-items: center;
-}
-.count-label.data-v-17a44f9d { font-size: 26rpx; color: #999;
+/* 悬浮添加按钮:位置上移避免拥挤 */
+.floating-add-btn.data-v-17a44f9d {
+	position: fixed;
+	right: 40rpx;
+	bottom: calc(260rpx + env(safe-area-inset-bottom) + 40rpx);
+	width: 110rpx;
+	height: 110rpx;
+	background: #C1001C;
+	border-radius: 50%;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	box-shadow: 0 12rpx 40rpx rgba(193, 0, 28, 0.4);
+	z-index: 100;
+	transition: transform 0.2s;
+}
+.floating-add-btn.data-v-17a44f9d:active {
+	transform: scale(0.9);
+}
+.plus-icon.data-v-17a44f9d {
+	width: 40rpx;
+	height: 4rpx;
+	background: #fff;
+	border-radius: 2rpx;
+	position: relative;
+}
+.plus-icon.data-v-17a44f9d::after {
+	content: '';
+	position: absolute;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	background: #fff;
+	transform: rotate(90deg);
+	border-radius: 2rpx;
 }
-.num-highlight.data-v-17a44f9d { font-size: 36rpx; font-weight: bold; color: #1a1a1a; margin: 0 4rpx;
-}
-.num-highlight.green.data-v-17a44f9d { color: #C1001C;
-}
-.unit.data-v-17a44f9d { font-size: 24rpx; color: #999; margin-left: 2rpx;
-}
-.split-line.data-v-17a44f9d { width: 1rpx; height: 30rpx; background: #eee; margin: 0 20rpx;
-}
-.submit-order-btn.data-v-17a44f9d { 
-		width: 220rpx; height: 80rpx; background: #e0e0e0; color: #666; font-size: 28rpx; 
-		border-radius: 40rpx; display: flex; align-items: center; justify-content: center; 
-		border: none; margin: 0; transition: all 0.3s;
+
+/* 底部汇总栏:微调间距与样式 */
+.footer-summary-bar.data-v-17a44f9d {
+	position: fixed;
+	bottom: calc(110rpx + env(safe-area-inset-bottom));
+	left: 0;
+	width: 100%;
+	height: 130rpx;
+	background: #fff;
+	border-top: 1rpx solid #f0f0f0;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 0 40rpx;
+	box-sizing: border-box;
+	z-index: 99;
+	box-shadow: 0 -10rpx 40rpx rgba(0, 0, 0, 0.05);
+}
+.summary-info.data-v-17a44f9d {
+	display: flex;
+	align-items: center;
+}
+.count-label.data-v-17a44f9d {
+	font-size: 26rpx;
+	color: #999;
+}
+.num-highlight.data-v-17a44f9d {
+	font-size: 36rpx;
+	font-weight: bold;
+	color: #1a1a1a;
+	margin: 0 4rpx;
+}
+.num-highlight.green.data-v-17a44f9d {
+	color: #C1001C;
+}
+.unit.data-v-17a44f9d {
+	font-size: 24rpx;
+	color: #999;
+	margin-left: 2rpx;
+}
+.split-line.data-v-17a44f9d {
+	width: 1rpx;
+	height: 30rpx;
+	background: #eee;
+	margin: 0 20rpx;
+}
+.submit-order-btn.data-v-17a44f9d {
+	width: 220rpx;
+	height: 80rpx;
+	background: #e0e0e0;
+	color: #666;
+	font-size: 28rpx;
+	border-radius: 40rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	border: none;
+	margin: 0;
+	transition: all 0.3s;
 }
 .submit-order-btn.data-v-17a44f9d:not([disabled]) {
-		background: #C1001C; color: #fff; font-weight: bold;
+	background: #C1001C;
+	color: #fff;
+	font-weight: bold;
 }
-	
-	/* 全屏缺省页样式 */
-.empty-state-full.data-v-17a44f9d { 
-		display: flex; 
-		flex-direction: column; 
-		align-items: center; 
-		justify-content: center; 
-		padding-top: 120rpx;
-}
-.empty-visual.data-v-17a44f9d { position: relative; margin-bottom: 40rpx; width: 400rpx; height: 400rpx; display: flex; align-items: center; justify-content: center;
-}
-.empty-img.data-v-17a44f9d { width: 320rpx; height: 320rpx; z-index: 2;
-}
-.empty-bg-glow.data-v-17a44f9d { 
-		position: absolute; width: 240rpx; height: 240rpx; 
-		background: radial-gradient(circle, rgba(193, 0, 28, 0.15) 0%, rgba(248, 250, 252, 0) 70%); 
-		z-index: 1; border-radius: 50%;
-}
-.empty-title.data-v-17a44f9d { font-size: 36rpx; font-weight: bold; color: #1a1a1a; margin-bottom: 80rpx;
-}
-.empty-desc.data-v-17a44f9d { font-size: 26rpx; color: #999; margin-bottom: 60rpx; text-align: center; padding: 0 80rpx; line-height: 1.6;
-}
-.empty-action-btn.data-v-17a44f9d { 
-		width: 320rpx; height: 90rpx; background: #C1001C; color: #fff; 
-		border-radius: 45rpx; font-size: 30rpx; font-weight: bold; 
-		display: flex; align-items: center; justify-content: center; 
-		box-shadow: 0 10rpx 30rpx rgba(193, 0, 28, 0.2);
-		border: none;
-}
-.empty-action-btn.data-v-17a44f9d:active { opacity: 0.8; transform: scale(0.96);
-}
-.bottom-safe-space.data-v-17a44f9d { height: 100rpx;
+
+/* 全屏缺省页样式 */
+.empty-state-full.data-v-17a44f9d {
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	justify-content: center;
+	padding-top: 120rpx;
+}
+.empty-visual.data-v-17a44f9d {
+	position: relative;
+	margin-bottom: 40rpx;
+	width: 400rpx;
+	height: 400rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+.empty-img.data-v-17a44f9d {
+	width: 320rpx;
+	height: 320rpx;
+	z-index: 2;
+}
+.empty-bg-glow.data-v-17a44f9d {
+	position: absolute;
+	width: 240rpx;
+	height: 240rpx;
+	background: radial-gradient(circle, rgba(193, 0, 28, 0.15) 0%, rgba(248, 250, 252, 0) 70%);
+	z-index: 1;
+	border-radius: 50%;
+}
+.empty-title.data-v-17a44f9d {
+	font-size: 36rpx;
+	font-weight: bold;
+	color: #1a1a1a;
+	margin-bottom: 80rpx;
+}
+.empty-desc.data-v-17a44f9d {
+	font-size: 26rpx;
+	color: #999;
+	margin-bottom: 60rpx;
+	text-align: center;
+	padding: 0 80rpx;
+	line-height: 1.6;
+}
+.empty-action-btn.data-v-17a44f9d {
+	width: 320rpx;
+	height: 90rpx;
+	background: #C1001C;
+	color: #fff;
+	border-radius: 45rpx;
+	font-size: 30rpx;
+	font-weight: bold;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	box-shadow: 0 10rpx 30rpx rgba(193, 0, 28, 0.2);
+	border: none;
+}
+.empty-action-btn.data-v-17a44f9d:active {
+	opacity: 0.8;
+	transform: scale(0.96);
+}
+.bottom-safe-space.data-v-17a44f9d {
+	height: 100rpx;
 }

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

@@ -1,10 +1,9 @@
 "use strict";
 const common_vendor = require("../../../common/vendor.js");
 const ErpTabBar = () => "../../../components/erp-tab-bar.js";
+const ErpNavBar = () => "../../../components/erp-nav-bar.js";
 const _sfc_main = {
-  components: {
-    ErpTabBar
-  },
+  components: { ErpTabBar, ErpNavBar },
   data() {
     return {
       statusBarHeight: 20,
@@ -138,14 +137,16 @@ const _sfc_main = {
   }
 };
 if (!Array) {
+  const _component_erp_nav_bar = common_vendor.resolveComponent("erp-nav-bar");
   const _component_erp_tab_bar = common_vendor.resolveComponent("erp-tab-bar");
-  _component_erp_tab_bar();
+  (_component_erp_nav_bar + _component_erp_tab_bar)();
 }
 function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
   return common_vendor.e({
-    a: common_vendor.o((...args) => $options.goBack && $options.goBack(...args), "a8"),
-    b: $data.statusBarHeight + "px",
-    c: common_vendor.f($data.tabs, (tab, index, i0) => {
+    a: common_vendor.p({
+      title: "全部订单"
+    }),
+    b: common_vendor.f($data.tabs, (tab, index, i0) => {
       return {
         a: common_vendor.t(tab),
         b: index,
@@ -153,8 +154,8 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
         d: common_vendor.o(($event) => $options.switchTab(index), index)
       };
     }),
-    d: "translateX(" + $data.currentTab * 100 + "%)",
-    e: common_vendor.f($data.displayList, (item, index, i0) => {
+    c: "translateX(" + $data.currentTab * 100 + "%)",
+    d: common_vendor.f($data.displayList, (item, index, i0) => {
       return common_vendor.e({
         a: common_vendor.t(item.orderNo),
         b: common_vendor.t(item.statusName),
@@ -184,17 +185,17 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
         n: common_vendor.o(($event) => $options.goDetail(item), index)
       });
     }),
-    f: $data.displayList.length > 0
+    e: $data.displayList.length > 0
   }, $data.displayList.length > 0 ? common_vendor.e({
-    g: $data.loading
+    f: $data.loading
   }, $data.loading ? {} : {}, {
-    h: $data.noMore
+    g: $data.noMore
   }, $data.noMore ? {} : {}) : {}, {
-    i: $data.displayList.length === 0 && !$data.loading
+    h: $data.displayList.length === 0 && !$data.loading
   }, $data.displayList.length === 0 && !$data.loading ? {} : {}, {
-    j: $options.scrollHeight,
-    k: common_vendor.o((...args) => $options.onReachEnd && $options.onReachEnd(...args), "ea"),
-    l: common_vendor.p({
+    i: $options.scrollHeight,
+    j: common_vendor.o((...args) => $options.onReachEnd && $options.onReachEnd(...args), "57"),
+    k: common_vendor.p({
       active: "order"
     })
   });

+ 2 - 2
unpackage/dist/dev/mp-weixin/pages/order/list/index.json

@@ -1,8 +1,8 @@
 {
-  "navigationBarTitleText": "我的订单",
   "navigationStyle": "custom",
   "enablePullDownRefresh": false,
   "usingComponents": {
-    "erp-tab-bar": "../../../components/erp-tab-bar"
+    "erp-tab-bar": "../../../components/erp-tab-bar",
+    "erp-nav-bar": "../../../components/erp-nav-bar"
   }
 }

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages/order/list/index.wxml


+ 270 - 111
unpackage/dist/dev/mp-weixin/pages/order/list/index.wxss

@@ -1,126 +1,285 @@
 
-.data-v-8504eca3 ::-webkit-scrollbar { display: none !important; width: 0 !important; height: 0 !important; -webkit-appearance: none; background: transparent;
-}
-.list-page-container.data-v-8504eca3 { width: 100vw; height: 100vh; background: #f8fafc; overflow: hidden; display: flex; flex-direction: column;
-}
-	
-	/* 1. 自定义导航栏:解决蓝线红框1 */
-.custom-nav-bar.data-v-8504eca3 { background: #ffffff; width: 100%; flex-shrink: 0;
-}
-.nav-content.data-v-8504eca3 { height: 44px; display: flex; align-items: center; justify-content: space-between; padding: 0 30rpx;
-}
-.back-icon.data-v-8504eca3 { width: 60rpx; height: 44px; display: flex; align-items: center;
-}
-.arrow-left.data-v-8504eca3 { width: 20rpx; height: 20rpx; border-left: 4rpx solid #333; border-bottom: 4rpx solid #333; transform: rotate(45deg); margin-left: 10rpx;
-}
-.nav-title.data-v-8504eca3 { font-size: 34rpx; font-weight: bold; color: #1a1a1a;
-}
-.placeholder-right.data-v-8504eca3 { width: 60rpx;
+.data-v-8504eca3 ::-webkit-scrollbar {
+	display: none !important;
+	width: 0 !important;
+	height: 0 !important;
+	-webkit-appearance: none;
+	background: transparent;
+}
+.list-page-container.data-v-8504eca3 {
+	width: 100vw;
+	height: 100vh;
+	background: #f8fafc;
+	overflow: hidden;
+	display: flex;
+	flex-direction: column;
 }
 
-	/* 2. 选项卡:解决残影红框2 */
-.tabs-fixed.data-v-8504eca3 { background: #fff; width: 100%; flex-shrink: 0; border-bottom: 1rpx solid #f0f0f0;
-}
-.tabs-box.data-v-8504eca3 { height: 110rpx; position: relative; display: flex; width: 100%;
-}
-.tab-item.data-v-8504eca3 { flex: 1; display: flex; align-items: center; justify-content: center; z-index: 5;
-}
-.tab-txt.data-v-8504eca3 { font-size: 28rpx; color: #888; transition: all 0.2s;
-}
-.tab-item.active .tab-txt.data-v-8504eca3 { color: #C1001C; font-weight: bold; font-size: 32rpx;
-}
-	
-	/* 指示器轨道:通过位移消除虚影 */
-.indicator-track.data-v-8504eca3 { position: absolute; bottom: 10rpx; left: 0; width: 100%; height: 6rpx; display: flex;
-}
-.indicator-bar.data-v-8504eca3 { width: 20%; height: 100%; display: flex; align-items: center; justify-content: center; transition: transform 0.3s cubic-bezier(0.18, 0.89, 0.32, 1.28);
-}
-.bar-inner.data-v-8504eca3 { width: 40rpx; height: 100%; background: #C1001C; border-radius: 6rpx;
-}
 
-	/* 3. 滚动区:解决不可滑动问题 */
-.order-scroll-view.data-v-8504eca3 { width: 100%;
-}
-.order-list-inner.data-v-8504eca3 { padding: 30rpx; padding-bottom: 60rpx;
-}
-.order-card.data-v-8504eca3 { background: #fff; border-radius: 24rpx; padding: 36rpx; margin-bottom: 30rpx; box-shadow: 0 4rpx 20rpx rgba(0,0,0,0.02);
-}
-.card-head.data-v-8504eca3 { display: flex; justify-content: space-between; align-items: center; margin-bottom: 30rpx;
-}
-.order-id.data-v-8504eca3 { font-size: 28rpx; color: #1a1a1a; font-weight: bold;
-}
-.status-badge.data-v-8504eca3 { font-size: 20rpx; padding: 4rpx 16rpx; border-radius: 8rpx;
-}
-.status-badge.pending.data-v-8504eca3 { background: #FFF1F2; color: #C1001C;
-}
-.status-badge.expired.data-v-8504eca3 { background: #f5f5f5; color: #999;
-}
-.status-badge.process.data-v-8504eca3 { background: #fff7e6; color: #ffa940;
-}
-.status-badge.making.data-v-8504eca3 { background: #e6fffb; color: #36cfc9;
-}
-	/* 已撤销样式 */
-.status-badge.expired.data-v-8504eca3 { background: #f5f5f5; color: #999;
+/* 2. 选项卡:解决残影红框2 */
+.tabs-fixed.data-v-8504eca3 {
+	background: #fff;
+	width: 100%;
+	flex-shrink: 0;
+	border-bottom: 1rpx solid #f0f0f0;
+}
+.tabs-box.data-v-8504eca3 {
+	height: 110rpx;
+	position: relative;
+	display: flex;
+	width: 100%;
+}
+.tab-item.data-v-8504eca3 {
+	flex: 1;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	z-index: 5;
+}
+.tab-txt.data-v-8504eca3 {
+	font-size: 28rpx;
+	color: #888;
+	transition: all 0.2s;
+}
+.tab-item.active .tab-txt.data-v-8504eca3 {
+	color: #C1001C;
+	font-weight: bold;
+	font-size: 32rpx;
 }
-.status-badge.finish.data-v-8504eca3 { background: #f6ffed; color: #52c41a;
-}
-.card-body.data-v-8504eca3 { padding: 24rpx 0; border-top: 1rpx dashed #f0f0f0; margin-bottom: 24rpx;
-}
-.model-row.data-v-8504eca3 { display: flex; align-items: center; margin-bottom: 12rpx; font-size: 24rpx;
-}
-.m-type.data-v-8504eca3 { font-size: 28rpx; font-weight: bold; color: #333; width: 140rpx;
-}
-.m-spec.data-v-8504eca3 { color: #888; flex: 1; padding: 0 20rpx; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
-}
-.m-count.data-v-8504eca3 { color: #555; width: 100rpx; text-align: right; font-weight: 500;
-}
-.more-hint.data-v-8504eca3 { padding: 10rpx 0; font-size: 24rpx; color: #999; text-align: center; background: #fafafa; border-radius: 8rpx; margin-bottom: 16rpx;
-}
-.total-summary.data-v-8504eca3 { 
-		display: flex; align-items: center; justify-content: flex-end; 
-		padding-top: 20rpx; border-top: 1rpx solid #fafafa;
-}
-.summary-label.data-v-8504eca3 { font-size: 24rpx; color: #999;
-}
-.summary-val.data-v-8504eca3 { font-size: 32rpx; font-weight: bold; color: #333; margin: 0 4rpx;
-}
-.summary-val.highlight.data-v-8504eca3 { color: #C1001C;
-}
-.summary-unit.data-v-8504eca3 { font-size: 22rpx; color: #999; margin-right: 12rpx;
-}
-.summary-split.data-v-8504eca3 { width: 1rpx; height: 20rpx; background: #eee; margin: 0 16rpx;
-}
-.card-foot.data-v-8504eca3 { display: flex; justify-content: space-between; align-items: center; padding-top: 10rpx;
-}
-.time.data-v-8504eca3 { font-size: 24rpx; color: #bbb;
-}
-.btns.data-v-8504eca3 { display: flex; gap: 16rpx;
-}
-.btn-cancel.data-v-8504eca3, .btn-view.data-v-8504eca3 { padding: 12rpx 30rpx; border-radius: 30rpx; font-size: 24rpx;
-}
-.btn-cancel.data-v-8504eca3 { border: 1rpx solid #ddd; color: #666;
-}
-.btn-view.primary.data-v-8504eca3 { background: #C1001C; color: #fff;
-}
-.list-status-info.data-v-8504eca3 { padding: 40rpx 0; display: flex; justify-content: center;
-}
-.nomore-wrap.data-v-8504eca3 { display: flex; align-items: center; color: #ccc; font-size: 24rpx;
-}
-.nomore-line.data-v-8504eca3 { width: 40rpx; height: 1rpx; background: #eee; margin: 0 20rpx;
+
+/* 指示器轨道:通过位移消除虚影 */
+.indicator-track.data-v-8504eca3 {
+	position: absolute;
+	bottom: 10rpx;
+	left: 0;
+	width: 100%;
+	height: 6rpx;
+	display: flex;
+}
+.indicator-bar.data-v-8504eca3 {
+	width: 20%;
+	height: 100%;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	transition: transform 0.3s cubic-bezier(0.18, 0.89, 0.32, 1.28);
+}
+.bar-inner.data-v-8504eca3 {
+	width: 40rpx;
+	height: 100%;
+	background: #C1001C;
+	border-radius: 6rpx;
 }
-.loading-wrap.data-v-8504eca3 { color: #999; font-size: 24rpx; display: flex; align-items: center;
+
+/* 3. 滚动区:解决不可滑动问题 */
+.order-scroll-view.data-v-8504eca3 {
+	width: 100%;
+}
+.order-list-inner.data-v-8504eca3 {
+	padding: 30rpx;
+	padding-bottom: 60rpx;
+}
+.order-card.data-v-8504eca3 {
+	background: #fff;
+	border-radius: 24rpx;
+	padding: 36rpx;
+	margin-bottom: 30rpx;
+	box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.02);
+}
+.card-head.data-v-8504eca3 {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	margin-bottom: 30rpx;
+}
+.order-id.data-v-8504eca3 {
+	font-size: 28rpx;
+	color: #1a1a1a;
+	font-weight: bold;
+}
+.status-badge.data-v-8504eca3 {
+	font-size: 20rpx;
+	padding: 4rpx 16rpx;
+	border-radius: 8rpx;
+}
+.status-badge.pending.data-v-8504eca3 {
+	background: #FFF1F2;
+	color: #C1001C;
+}
+.status-badge.expired.data-v-8504eca3 {
+	background: #f5f5f5;
+	color: #999;
+}
+.status-badge.process.data-v-8504eca3 {
+	background: #fff7e6;
+	color: #ffa940;
+}
+.status-badge.making.data-v-8504eca3 {
+	background: #e6fffb;
+	color: #36cfc9;
 }
-.load-dot.data-v-8504eca3 { width: 10rpx; height: 10rpx; background: #C1001C; border-radius: 50%; margin-right: 10rpx; animation: flash-8504eca3 0.6s infinite alternate;
+
+/* 已撤销样式 */
+.status-badge.expired.data-v-8504eca3 {
+	background: #f5f5f5;
+	color: #999;
+}
+.status-badge.finish.data-v-8504eca3 {
+	background: #f6ffed;
+	color: #52c41a;
+}
+.card-body.data-v-8504eca3 {
+	padding: 24rpx 0;
+	border-top: 1rpx dashed #f0f0f0;
+	margin-bottom: 24rpx;
+}
+.model-row.data-v-8504eca3 {
+	display: flex;
+	align-items: center;
+	margin-bottom: 12rpx;
+	font-size: 24rpx;
+}
+.m-type.data-v-8504eca3 {
+	font-size: 28rpx;
+	font-weight: bold;
+	color: #333;
+	width: 140rpx;
+}
+.m-spec.data-v-8504eca3 {
+	color: #888;
+	flex: 1;
+	padding: 0 20rpx;
+	overflow: hidden;
+	text-overflow: ellipsis;
+	white-space: nowrap;
+}
+.m-count.data-v-8504eca3 {
+	color: #555;
+	width: 100rpx;
+	text-align: right;
+	font-weight: 500;
+}
+.more-hint.data-v-8504eca3 {
+	padding: 10rpx 0;
+	font-size: 24rpx;
+	color: #999;
+	text-align: center;
+	background: #fafafa;
+	border-radius: 8rpx;
+	margin-bottom: 16rpx;
+}
+.total-summary.data-v-8504eca3 {
+	display: flex;
+	align-items: center;
+	justify-content: flex-end;
+	padding-top: 20rpx;
+	border-top: 1rpx solid #fafafa;
+}
+.summary-label.data-v-8504eca3 {
+	font-size: 24rpx;
+	color: #999;
+}
+.summary-val.data-v-8504eca3 {
+	font-size: 32rpx;
+	font-weight: bold;
+	color: #333;
+	margin: 0 4rpx;
+}
+.summary-val.highlight.data-v-8504eca3 {
+	color: #C1001C;
+}
+.summary-unit.data-v-8504eca3 {
+	font-size: 22rpx;
+	color: #999;
+	margin-right: 12rpx;
+}
+.summary-split.data-v-8504eca3 {
+	width: 1rpx;
+	height: 20rpx;
+	background: #eee;
+	margin: 0 16rpx;
+}
+.card-foot.data-v-8504eca3 {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	padding-top: 10rpx;
+}
+.time.data-v-8504eca3 {
+	font-size: 24rpx;
+	color: #bbb;
+}
+.btns.data-v-8504eca3 {
+	display: flex;
+	gap: 16rpx;
+}
+.btn-cancel.data-v-8504eca3,
+.btn-view.data-v-8504eca3 {
+	padding: 12rpx 30rpx;
+	border-radius: 30rpx;
+	font-size: 24rpx;
+}
+.btn-cancel.data-v-8504eca3 {
+	border: 1rpx solid #ddd;
+	color: #666;
+}
+.btn-view.primary.data-v-8504eca3 {
+	background: #C1001C;
+	color: #fff;
+}
+.list-status-info.data-v-8504eca3 {
+	padding: 40rpx 0;
+	display: flex;
+	justify-content: center;
+}
+.nomore-wrap.data-v-8504eca3 {
+	display: flex;
+	align-items: center;
+	color: #ccc;
+	font-size: 24rpx;
+}
+.nomore-line.data-v-8504eca3 {
+	width: 40rpx;
+	height: 1rpx;
+	background: #eee;
+	margin: 0 20rpx;
+}
+.loading-wrap.data-v-8504eca3 {
+	color: #999;
+	font-size: 24rpx;
+	display: flex;
+	align-items: center;
+}
+.load-dot.data-v-8504eca3 {
+	width: 10rpx;
+	height: 10rpx;
+	background: #C1001C;
+	border-radius: 50%;
+	margin-right: 10rpx;
+	animation: flash-8504eca3 0.6s infinite alternate;
 }
 @keyframes flash-8504eca3 {
-from { opacity: 0.3;
+from {
+		opacity: 0.3;
 }
-to { opacity: 1;
+to {
+		opacity: 1;
 }
 }
-.empty-state.data-v-8504eca3 { display: flex; flex-direction: column; align-items: center; padding-top: 200rpx; color: #bbb; font-size: 28rpx;
+.empty-state.data-v-8504eca3 {
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	padding-top: 200rpx;
+	color: #bbb;
+	font-size: 28rpx;
 }
-.empty-state image.data-v-8504eca3 { width: 220rpx; height: 220rpx; margin-bottom: 30rpx; opacity: 0.6;
+.empty-state image.data-v-8504eca3 {
+	width: 220rpx;
+	height: 220rpx;
+	margin-bottom: 30rpx;
+	opacity: 0.6;
 }
-.safe-bottom.data-v-8504eca3 { height: 40rpx;
+.safe-bottom.data-v-8504eca3 {
+	height: 40rpx;
 }

+ 12 - 3
unpackage/dist/dev/mp-weixin/pages/order/success/index.js

@@ -1,6 +1,8 @@
 "use strict";
 const common_vendor = require("../../../common/vendor.js");
+const ErpNavBar = () => "../../../components/erp-nav-bar.js";
 const _sfc_main = {
+  components: { ErpNavBar },
   methods: {
     // 将再来一单和返回页面功能合并:通过 reLaunch 自动重置数据
     handleReorder() {
@@ -15,11 +17,18 @@ const _sfc_main = {
     }
   }
 };
+if (!Array) {
+  const _component_erp_nav_bar = common_vendor.resolveComponent("erp-nav-bar");
+  _component_erp_nav_bar();
+}
 function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
   return {
-    a: common_vendor.o((...args) => $options.handleReorder && $options.handleReorder(...args), "a9"),
-    b: common_vendor.o((...args) => $options.viewOrder && $options.viewOrder(...args), "93"),
-    c: common_vendor.o((...args) => $options.handleReorder && $options.handleReorder(...args), "ce")
+    a: common_vendor.p({
+      title: "下单成功"
+    }),
+    b: common_vendor.o((...args) => $options.handleReorder && $options.handleReorder(...args), "60"),
+    c: common_vendor.o((...args) => $options.viewOrder && $options.viewOrder(...args), "16"),
+    d: common_vendor.o((...args) => $options.handleReorder && $options.handleReorder(...args), "1e")
   };
 }
 const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-4df36a57"]]);

+ 4 - 3
unpackage/dist/dev/mp-weixin/pages/order/success/index.json

@@ -1,5 +1,6 @@
 {
-  "navigationBarTitleText": "下单成功",
-  "navigationBarBackgroundColor": "#FFFFFF",
-  "usingComponents": {}
+  "navigationStyle": "custom",
+  "usingComponents": {
+    "erp-nav-bar": "../../../components/erp-nav-bar"
+  }
 }

+ 1 - 1
unpackage/dist/dev/mp-weixin/pages/order/success/index.wxml

@@ -1 +1 @@
-<view class="success-container data-v-4df36a57"><view class="success-card data-v-4df36a57"><icon type="success" size="80" color="#C1001C" class="success-icon data-v-4df36a57"></icon><text class="status-title data-v-4df36a57">提交成功</text><text class="status-desc data-v-4df36a57">您的订单已提交,正在等待业务员审核</text><view class="btn-group data-v-4df36a57"><button class="primary-btn data-v-4df36a57" bindtap="{{a}}">再来一单</button><button class="outline-btn data-v-4df36a57" bindtap="{{b}}">查看订单</button><button class="text-btn data-v-4df36a57" bindtap="{{c}}">返回下单页面</button></view></view></view>
+<view class="success-container data-v-4df36a57"><erp-nav-bar wx:if="{{a}}" class="data-v-4df36a57" u-i="4df36a57-0" bind:__l="__l" u-p="{{a}}"/><view class="success-card data-v-4df36a57"><icon type="success" size="80" color="#C1001C" class="success-icon data-v-4df36a57"></icon><text class="status-title data-v-4df36a57">提交成功</text><text class="status-desc data-v-4df36a57">您的订单已提交,正在等待业务员审核</text><view class="btn-group data-v-4df36a57"><button class="primary-btn data-v-4df36a57" bindtap="{{b}}">再来一单</button><button class="outline-btn data-v-4df36a57" bindtap="{{c}}">查看订单</button><button class="text-btn data-v-4df36a57" bindtap="{{d}}">返回下单页面</button></view></view></view>

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác