From 5abcde36961125cbf436f91b8c17610a6b5f8308 Mon Sep 17 00:00:00 2001
From: sen <sen@qq.com>
Date: 星期三, 15 四月 2026 12:15:08 +0800
Subject: [PATCH] 修改调度单必填校验

---
 ui/car_wx_app/pages/observeLaw/index.vue |  796 ++++++++++++++++++++++----------------------------------
 1 files changed, 316 insertions(+), 480 deletions(-)

diff --git a/ui/car_wx_app/pages/observeLaw/index.vue b/ui/car_wx_app/pages/observeLaw/index.vue
index 05ad5b7..4c086d1 100644
--- a/ui/car_wx_app/pages/observeLaw/index.vue
+++ b/ui/car_wx_app/pages/observeLaw/index.vue
@@ -1,523 +1,359 @@
 <template>
-    <view class="container">
-        <!-- 椤堕儴瀵艰埅鏍� -->
+  <view class="container">
+    <Nav title="绛剧讲閬电邯瀹堟硶鎵胯涔�" @back="goBack" />
 
-        <Nav title="绛剧讲閬电邯瀹堟硶鎵胯涔�" customBack="pages/acknowledgement/index"></Nav>
-
-        <!-- 鎵胯涔﹀唴瀹瑰尯鍩燂紙鍙粴鍔級 -->
-        <scroll-view class="content-scroll" scroll-y="true">
-            <view class="agreement-content">
-                <text class="title">閬电邯瀹堟硶鎵胯涔�</text>
-
-                <text class="paragraph">鍥犳湰浜哄湪棣欐腐鎵ц鍑鸿溅浠诲姟锛屼负鏀寔閰嶅悎鍏徃瀵规寔鍓嶅線棣欐腐鎵ц鍑鸿溅浠诲姟浜哄憳鐨勭鐞嗭紝鍏卞悓缁存姢鍥藉鍜屽叕鍙哥殑澹拌獕锛屾湰浜烘壙璇哄仛鍒帮細</text>
-
-                <text class="heading">涓�銆�</text>
-                <text
-                    class="paragraph">涓ユ牸閬靛畧涓崕浜烘皯鍏卞拰鍥姐�婃捣鍏虫硶銆嬨�併�婂嚭澧冨叆澧冪鐞嗘硶銆嬨�併�婂嚭澧冨叆澧冭竟闃叉鏌ユ潯渚嬨�嬶紝棣欐腐鐗瑰埆琛屾斂鍖烘湁鍏虫硶寰嬫硶瑙勫強鏈夊叧澶栦簨绾緥瑙勫畾锛屼繚瀹堝浗瀹跺強鍏徃鐨勫晢涓氭満瀵嗐��</text>
-
-                <text class="heading">浜屻��</text>
-                <text class="paragraph">涓ユ牸閬靛畧鐝犳捣甯傛眹鐣呬氦閫氭姇璧勬湁闄愬叕鍙�/鐝犳捣甯傛捣娓苯杞﹁揣杩愬叕鍙搞�婂嚭鍥斤紙澧冿級宸ヤ綔绠$悊鍔炴硶銆嬬瓑瑙勭珷鍒跺害銆�</text>
-
-                <text class="heading">涓夈��</text>
-                <text
-                    class="paragraph">淇濊瘉涓嶅埄鐢ㄨ荡娓墽琛屽叕鍔′箣渚胯繘琛屾湁鎹熷浗瀹躲�佸叕鍙稿舰璞″強澹拌獕绛夋椿鍔紝涓嶄粠浜嬪浗瀹舵硶寰嬫硶瑙勩�侀娓壒鍒鏀垮尯娉曞緥銆佷笂绾т富绠¢儴闂ㄦ垨鍏徃瑙勭珷鍒跺害绂佹鐨勪竴鍒囪涓哄強娲诲姩銆�</text>
-
-                <text class="heading">鍥涖��</text>
-                <text
-                    class="paragraph">淇濊瘉涓嶅湪鍑鸿溅浠诲姟鏃堕棿鍐呰繘琛屽嚭鍏ュ鏃呮父锛屼笉璧扮璐╃銆佷笉鎼哄甫杩濈鍝佸嚭鍏ュ锛屼笉缁勭粐鍙婁笉鍙備笌璧屽崥銆佹秹瓒宠壊鎯呭満鎵�銆佸伔寮曟浮绛夋椿鍔ㄣ�傚鏈夊彂鐜板叾浠栦汉鍛樻垨绾跨储娑夊強杩濇硶杩濊娲诲姩锛屽嵆鍚戝叕鍙告姤鍛娿��</text>
-
-                <text class="heading">浜斻��</text>
-                <text class="paragraph">涓诲姩閰嶅悎鍙e哺鍚勭鐞嗛儴闂ㄦ寚鎸ャ�佹鏌ャ�傛湇浠庡彛宀稿悇绠$悊閮ㄩ棬鎸囨尌銆佹鏌ワ紝鎸夎瀹氱嚎璺椹跺拰鍋滄斁杞﹁締锛屾湇浠庤皟搴﹀拰宸ヤ綔瀹夋帓銆�</text>
-
-                <text class="heading">鍏��</text>
-                <text
-                    class="paragraph">姣忔棩椹鹃┒杞﹁締鍑哄叆澧冨墠鍚庤嚜瑙夋鏌ワ紝濡傚彂鐜颁汉鍛樻垨浜ら�氳繍杈撳伐鍏锋綔鍦ㄥ畨鍏ㄧ鐞嗛殣鎮o紝鎴栨湁娑夊強鍚勫彛宀哥殑杩濇硶鐘姜浜哄憳銆佽溅杈嗚繘鍑哄姩鎬佺瓑淇℃伅鐨勶紝鍙婃椂鎶ュ憡鍏徃鍙婄彔娴峰嚭鍏ュ杈归槻妫�鏌ョ珯銆�</text>
-
-                <text class="paragraph">鏈汉濡傛湁杩濆弽锛岃嚜鎰挎帴鍙楁硶寰嬫硶瑙勬垨鍏徃瑙勭珷鍒跺害鐨勫缃氥��</text>
-
-                <text class="paragraph">鐗规鎵胯锛�</text>
-
-                <text class="sign-line">鎵胯浜虹瀛楋細[ ]</text>
-                <text class="sign-line">鏃ユ湡锛歔 ]</text>
-            </view>
-        </scroll-view>
-
-        <!-- 搴曢儴鍥哄畾鍖哄煙锛堝嬀閫夋+鎸夐挳锛� -->
-        <view class="bottom-fixed">
-            <!-- 鍕鹃�夊尯鍩� -->
-            <!-- <view class="agree-area">
-        <view class="checkbox-group">
-          <checkbox 
-            class="checkbox" 
-            :checked="isAgreed" 
-            @change="handleAgreeChange"
-          ></checkbox>
-          <text class="agree-text">鎴戝凡闃呰骞剁悊瑙d笂杩板唴瀹癸紝鑷効绛剧讲</text>
-          <text class="required">*</text>
+    <scroll-view class="content-scroll" scroll-y>
+      <view class="agreement-content">
+        <text class="title">{{ agreementContent.title }}</text>
+        <text class="intro">{{ agreementContent.intro }}</text>
+        <view v-for="(clause, i) in agreementContent.clauses" :key="i" class="clause">
+          <text class="clause-number">{{ clause.number }}銆�</text>
+          <text class="clause-text">{{ clause.text }}</text>
         </view>
-      </view> -->
-
-            <!-- 搴曢儴鎸夐挳 -->
-            <view class="btn-group">
-                <button class="cancel-btn" @click="navigateBack">涓婁竴姝�</button>
-                <button class="next-btn" type="primary" @click="showPopup = true">濉啓鍐呭</button>
-            </view>
+        <text class="footer">{{ agreementContent.footer }}</text>
+        <text class="ending">{{ agreementContent.ending }}</text>
+        <view class="signature">
+          <text v-for="(line, i) in agreementContent.signature" :key="i" class="sign-line">{{ line }}</text>
         </view>
+      </view>
+    </scroll-view>
 
-        <!-- <uni-popup ref="popup" background-color="#fff" @change="change">
-            <view class="popup-content" :class="{ 'popup-height': type === 'left' || type === 'right' }"><text
-                    class="text">popup 鍐呭</text></view>
-        </uni-popup> -->
-        <view class="popup-mask" v-if="showPopup" @click="showPopup = false"></view>
-        <view class="popup-container" v-if="showPopup" style="height: 100%;" :class="{ 'popup-show': showPopup }">
-            <view class="popup-title">瀹炲悕淇℃伅纭</view>
-
-            <!-- uView 琛ㄥ崟缁勪欢 -->
-            <!-- <u-form ref="verifyForm" :model="formData" :rules="rules" labelPosition="left" labelWidth="180rpx">
-                <u-form-item label="鏈汉濮撳悕" prop="name" required>
-                    <u-input v-model="formData.name" placeholder="璇疯緭鍏ュ鍚�" maxlength="20"></u-input>
-                </u-form-item>
-
-                <u-form-item label="韬唤璇佸彿" prop="idCard" required>
-                    <u-input v-model="formData.idCard" placeholder="璇疯緭鍏�18浣嶈韩浠借瘉鍙�" maxlength="18"
-                        keyboard-type="number"></u-input>
-                </u-form-item>
-
-                <u-form-item label="鏃ユ湡" prop="date" required>
-                    <uni-datetime-picker type="datetime" v-model="formData.date" style="flex: 1;"
-                        @change="onDateTimeChange">
-                    </uni-datetime-picker>
-                </u-form-item>
-
-              
-
-            </u-form> -->
-            <view class="content" style="padding: 10rpx;">
-                <view style="border: 1rpx dashed #555555;">
-                    <Signature ref="sig" v-model="v"></Signature>
-                </view>
-                <u-button class="sign-btn" @click="startSign" type="primary" plain>寮�濮嬬鍚�</u-button>
-
-                <!-- <text style="overflow-wrap: break-word;">{{ v }}</text> -->
-            </view>
-            <!-- 鎵嬪姩绛惧悕鍖哄煙 -->
-            <!-- <view class="signature-area">
-                <view class="signature-title">鎵嬪姩绛惧悕</view>
-                <view class="signature-box">
-                    <text class="signature-hint" v-if="!v">瑕佹眰锛氬瓧杩规竻鏅帮紝涓庤韩浠借瘉涓�鑷�</text>
-                    <view class="signature-preview" v-if="v">
-                        <text>绛惧悕棰勮</text>
-                    </view>
-                </view>
-            </view> -->
-
-            <!-- 搴曢儴鎸夐挳 -->
-            <view class="btn-group">
-                <u-button class="cancel-btn" @click="showPopup = false" type="info" plain>
-                    鍙栨秷
-                </u-button>
-                <u-button class="submit-btn" @click="handleSubmit" type="primary">
-                    鎻愪氦
-                </u-button>
-            </view>
-        </view>
-
+    <!-- 搴曢儴鎸夐挳 -->
+    <view class="bottom-bar">
+      <view class="btn-group">
+        <button class="cancel-btn" @tap="goBack">涓婁竴姝�</button>
+        <button class="confirm-btn" type="primary" @tap="openSign">绛惧悕纭</button>
+      </view>
     </view>
+
+    <!-- 绛惧悕缁勪欢锛堝叏灞忚鐩栧眰锛屼笉宓屽鍦ㄥ脊绐楀唴锛岄伩鍏嶅眰绾у啿绐侊級 -->
+    <Signature ref="signatureRef" v-model="signatureData" />
+
+    <!-- 绛惧悕棰勮纭寮圭獥锛堢瀹屽悕鍚庡睍绀猴級 -->
+    <u-popup :show="showPreview" round="12" mode="center" :closeable="true" @close="showPreview = false">
+      <view v-if="showPreview" class="preview-popup">
+        <text class="preview-title">绛惧悕棰勮</text>
+        <view class="preview-img-wrap">
+          <image v-if="signatureData" :src="signatureData" mode="aspectFit" class="preview-img" />
+          <text v-else class="no-sign">鏆傛棤绛惧悕</text>
+        </view>
+        <view class="preview-btns">
+          <button class="re-sign-btn" @tap="reSign">閲嶆柊绛惧悕</button>
+          <button class="submit-btn" type="primary" :loading="submitting" @tap="handleSubmit">纭鎻愪氦</button>
+        </view>
+      </view>
+    </u-popup>
+  </view>
 </template>
 
 <script>
 import Signature from '@/components/sin-signature/index.vue'
-import { carUploadTrip } from "@/common/examine";
+import { carUploadTrip } from '@/common/examine'
+
+const AGREEMENT_CONTENT = Object.freeze({
+  title: '閬电邯瀹堟硶鎵胯涔�',
+  intro: '鍥犳湰浜哄湪棣欐腐鎵ц鍑鸿溅浠诲姟锛屼负鏀寔閰嶅悎鍏徃瀵规寔鍓嶅線棣欐腐鎵ц鍑鸿溅浠诲姟浜哄憳鐨勭鐞嗭紝鍏卞悓缁存姢鍥藉鍜屽叕鍙哥殑澹拌獕锛屾湰浜烘壙璇哄仛鍒帮細',
+  clauses: [
+    { number: '涓�', text: '涓ユ牸閬靛畧涓崕浜烘皯鍏卞拰鍥姐�婃捣鍏虫硶銆嬨�併�婂嚭澧冨叆澧冪鐞嗘硶銆嬨�併�婂嚭澧冨叆澧冭竟闃叉鏌ユ潯渚嬨�嬶紝棣欐腐鐗瑰埆琛屾斂鍖烘湁鍏虫硶寰嬫硶瑙勫強鏈夊叧澶栦簨绾緥瑙勫畾锛屼繚瀹堝浗瀹跺強鍏徃鐨勫晢涓氭満瀵嗐��' },
+    { number: '浜�', text: '涓ユ牸閬靛畧鐝犳捣甯傛眹鐣呬氦閫氭姇璧勬湁闄愬叕鍙�/鐝犳捣甯傛捣娓苯杞﹁揣杩愬叕鍙搞�婂嚭鍥斤紙澧冿級宸ヤ綔绠$悊鍔炴硶銆嬬瓑瑙勭珷鍒跺害銆�' },
+    { number: '涓�', text: '淇濊瘉涓嶅埄鐢ㄨ荡娓墽琛屽叕鍔′箣渚胯繘琛屾湁鎹熷浗瀹躲�佸叕鍙稿舰璞″強澹拌獕绛夋椿鍔紝涓嶄粠浜嬪浗瀹舵硶寰嬫硶瑙勩�侀娓壒鍒鏀垮尯娉曞緥銆佷笂绾т富绠¢儴闂ㄦ垨鍏徃瑙勭珷鍒跺害绂佹鐨勪竴鍒囪涓哄強娲诲姩銆�' },
+    { number: '鍥�', text: '淇濊瘉涓嶅湪鍑鸿溅浠诲姟鏃堕棿鍐呰繘琛屽嚭鍏ュ鏃呮父锛屼笉璧扮璐╃銆佷笉鎼哄甫杩濈鍝佸嚭鍏ュ锛屼笉缁勭粐鍙婁笉鍙備笌璧屽崥銆佹秹瓒宠壊鎯呭満鎵�銆佸伔寮曟浮绛夋椿鍔ㄣ�傚鏈夊彂鐜板叾浠栦汉鍛樻垨绾跨储娑夊強杩濇硶杩濊娲诲姩锛屽嵆鍚戝叕鍙告姤鍛娿��' },
+    { number: '浜�', text: '涓诲姩閰嶅悎鍙e哺鍚勭鐞嗛儴闂ㄦ寚鎸ャ�佹鏌ャ�傛湇浠庡彛宀稿悇绠$悊閮ㄩ棬鎸囨尌銆佹鏌ワ紝鎸夎瀹氱嚎璺椹跺拰鍋滄斁杞﹁締锛屾湇浠庤皟搴﹀拰宸ヤ綔瀹夋帓銆�' },
+    { number: '鍏�', text: '姣忔棩椹鹃┒杞﹁締鍑哄叆澧冨墠鍚庤嚜瑙夋鏌ワ紝濡傚彂鐜颁汉鍛樻垨浜ら�氳繍杈撳伐鍏锋綔鍦ㄥ畨鍏ㄧ鐞嗛殣鎮o紝鎴栨湁娑夊強鍚勫彛宀哥殑杩濇硶鐘姜浜哄憳銆佽溅杈嗚繘鍑哄姩鎬佺瓑淇℃伅鐨勶紝鍙婃椂鎶ュ憡鍏徃鍙婄彔娴峰嚭鍏ュ杈归槻妫�鏌ョ珯銆�' }
+  ],
+  footer: '鏈汉濡傛湁杩濆弽锛岃嚜鎰挎帴鍙楁硶寰嬫硶瑙勬垨鍏徃瑙勭珷鍒跺害鐨勫缃氥��',
+  ending: '鐗规鎵胯锛�',
+  signature: ['鎵胯浜虹瀛楋細[ ]', '鏃ユ湡锛歔 ]']
+})
+
 export default {
-    data() {
-        return {
-            url: '',
-            v: '',
-            // 鎺у埗寮圭獥鏄剧ず
-            showPopup: false,
-            uploadIshow: false,
-            // 琛ㄥ崟鏁版嵁
-            formData: {
-                name: '',
-                idCard: '',
-                date: ''
-            },
-            // 绛惧悕鐘舵��
-            hasSignature: false,
-            // 琛ㄥ崟楠岃瘉瑙勫垯
-            rules: {
-                name: [
-                    { required: true, message: '璇疯緭鍏ュ鍚�', trigger: 'blur' }
-                ],
-                idCard: [
-                    { required: true, message: '璇疯緭鍏ヨ韩浠借瘉鍙�', trigger: 'blur' },
-                    {
-                        pattern: /(^\d{18}$)|(^\d{17}(\d|X|x)$)/,
-                        message: '璇疯緭鍏ユ纭殑18浣嶈韩浠借瘉鍙�',
-                        trigger: 'blur'
-                    }
-                ],
-                date: [
-                    { required: true, message: '璇烽�夋嫨鏃ユ湡', trigger: 'blur' }
-                ]
-            },
-            // 鍏朵粬鏁版嵁淇濇寔涓嶅彉
-            signatureUrl: '', // 绛惧悕鍥剧墖鍦板潃
-            hasSignature: false, // 绛惧悕鐘舵��
-            // 鏂板锛氳褰曞師濮嬬鍚嶏紝鐢ㄤ簬閲嶆柊绛惧悕鍔熻兘
-            originalSignature: ''
-        };
-    },
-    components: {
-        Signature,
-    },
-    methods: {
-        async startSign() {
-            let s = await this.$refs.sig.getSyncSignature();
-            console.log('缁勪欢鐗堟湰', this.$refs.sig.VERSION);
-            console.log('绛惧悕鏁版嵁', s);
-        },
-        // 杩斿洖涓婁竴椤�
-        navigateBack() {
-            uni.navigateTo({
-                url: '/pages/acknowledgement/index?uploadIshow=' + this.uploadIshow
-            });
-        },
-        // 澶勭悊绛惧悕鍙樺寲锛堜慨鏀瑰悗锛�
-        handleSignatureChange(url) {
-            console.log(url);
-            this.signatureUrl = url;
-            this.originalSignature = url; // 淇濆瓨鍘熷绛惧悕
-            this.hasSignature = !!url; // 鏈夌鍚嶆椂鏇存柊鐘舵��
-        },
-        // 鎻愪氦琛ㄥ崟鏂规硶涓鍚嶉獙璇侀儴鍒嗕繚鎸佷笉鍙�
-        handleSubmit() {
-            if (this.v == '') {
-                return uni.showToast({ title: '璇峰畬鎴愮鍚�', icon: 'none' });
-            }
-            const form = uni.getStorageSync("signContractForm");
-            form.signImg = this.v
-            
-            carUploadTrip(form).then((res) => {
-                if (res == 1) {
-                    this.uploadIshow =true
-                    uni.showToast({ title: '鎻愪氦鎴愬姛', icon: 'none' });
-                    this.v = ''
-                    this.showPopup = false;
-                    setTimeout(() => {
-                        wx.navigateTo({
-                         url: '/pages/examine/index?id=' + form.dispatchOrderId+'&name='+'涓婁紶琛岀▼'+'&router='+'pages/beReferred/index'
-                       });
-                        uni.removeStorageSync("signContractForm");
+  components: { Signature },
 
-                    }, 1000);
-                }else {
-                    this.uploadIshow =false
-                }
-            });
-
-
-        },
-
-
+  data() {
+    return {
+      agreementContent: AGREEMENT_CONTENT,
+      showPreview: false,
+      signatureData: '',
+      submitting: false,
+      formData: null
     }
-};
+  },
+
+  onLoad() {
+    this.formData = uni.getStorageSync('signContractForm')
+    if (!this.formData) {
+      uni.showToast({ title: '鏈壘鍒扮缃蹭俊鎭�', icon: 'none' })
+      setTimeout(() => this.goBack(), 1500)
+    }
+  },
+
+  methods: {
+    goBack() {
+      const pages = getCurrentPages()
+      for (let i = pages.length - 2; i >= 0; i--) {
+        if (pages[i].route && pages[i].route.includes('pages/signContract')) {
+          uni.navigateBack({ delta: pages.length - 1 - i })
+          return
+        }
+      }
+      uni.navigateBack({ delta: 1 })
+    },
+
+    async openSign() {
+      try {
+        const data = await this.$refs.signatureRef.getSyncSignature()
+        if (data) {
+          this.signatureData = data
+          // 绛惧畬鍚嶅悗寮瑰嚭棰勮纭
+          this.$nextTick(() => { this.showPreview = true })
+        }
+      } catch {
+        uni.showToast({ title: '绛惧悕澶辫触', icon: 'none' })
+      }
+    },
+
+    async reSign() {
+      this.showPreview = false
+      this.signatureData = ''
+      // 绛夊脊绐楀叧闂悗鍐嶆墦寮�绛惧悕
+      setTimeout(() => { this.openSign() }, 300)
+    },
+
+    async handleSubmit() {
+      if (!this.signatureData) {
+        return uni.showToast({ title: '璇峰畬鎴愮鍚�', icon: 'none' })
+      }
+
+      this.submitting = true
+      uni.showLoading({ title: '鎻愪氦涓�...' })
+
+      try {
+        const form = { ...this.formData, signImg: this.signatureData }
+        const res = await carUploadTrip(form)
+
+        if (res === 1) {
+          uni.showToast({ title: '鎻愪氦鎴愬姛', icon: 'success' })
+          this.showPreview = false
+          uni.removeStorageSync('signContractForm')
+
+          // 璁剧疆鍒锋柊鏍囧織锛岃 operate 椤甸潰鐭ラ亾闇�瑕佸埛鏂版暟鎹�
+          uni.setStorageSync('needRefreshOperate', true)
+
+          // 杩斿洖鍒� examine 椤甸潰
+          setTimeout(() => {
+            const pages = getCurrentPages()
+            for (let i = pages.length - 2; i >= 0; i--) {
+              if (pages[i].route && pages[i].route.includes('pages/examine')) {
+                uni.navigateBack({ delta: pages.length - 1 - i })
+                return
+              }
+            }
+            uni.navigateBack({ delta: 1 })
+          }, 1000)
+        } else {
+          uni.showToast({ title: '鎻愪氦澶辫触', icon: 'none' })
+        }
+      } catch (err) {
+        uni.showToast({ title: err.message || '鎻愪氦澶辫触', icon: 'none' })
+      } finally {
+        this.submitting = false
+        uni.hideLoading()
+      }
+    }
+  }
+}
 </script>
 
 <style scoped>
 .container {
-    width: 100%;
-    min-height: 100vh;
-    background-color: #ffffff;
-    display: flex;
-    flex-direction: column;
-    /* 鐣欏嚭搴曢儴鍥哄畾鍖哄煙绌洪棿 */
-    padding-bottom: 200rpx;
-    box-sizing: border-box;
+  display: flex;
+  flex-direction: column;
+  height: 100vh;
+  background-color: #ffffff;
 }
 
-/* 瀵艰埅鏍忔牱寮� */
-.nav-bar {
-    height: 88rpx;
-    display: flex;
-    align-items: center;
-    padding: 0 30rpx;
-    border-bottom: 1rpx solid #e5e5e5;
-    position: relative;
-    z-index: 10;
-}
-
-.back-btn image {
-    width: 34rpx;
-    height: 34rpx;
-}
-
-.nav-title {
-    flex: 1;
-    text-align: center;
-    font-size: 34rpx;
-    color: #333333;
-    font-weight: 500;
-}
-
-/* 婊氬姩鍐呭鍖� */
 .content-scroll {
-    flex: 1;
-    padding: 30rpx;
-    box-sizing: border-box;
-    /* 閬垮厤鍐呭琚簳閮ㄥ浐瀹氬尯閬尅 */
-    padding-bottom: 220rpx;
+  flex: 1;
+  padding: 30rpx;
+  padding-bottom: 180rpx;
+  box-sizing: border-box;
 }
 
+/* 鎵胯涔﹀唴瀹� */
 .agreement-content {
-    line-height: 1.8;
-    width: 100%;
-    height: calc(100vh - 200rpx);
+  line-height: 1.8;
 }
 
 .title {
-    display: block;
-    font-size: 32rpx;
-    color: #333333;
-    font-weight: 600;
-    text-align: center;
-    margin: 0 0 40rpx 0;
-    padding-bottom: 20rpx;
-    border-bottom: 1rpx solid #f0f0f0;
+  display: block;
+  font-size: 34rpx;
+  color: #303133;
+  font-weight: 600;
+  text-align: center;
+  margin-bottom: 30rpx;
+  padding-bottom: 20rpx;
+  border-bottom: 1rpx solid #f0f0f0;
 }
 
-.heading {
-    display: inline;
-    font-size: 28rpx;
-    color: #333333;
-    font-weight: 500;
+.intro {
+  display: block;
+  font-size: 28rpx;
+  color: #606266;
+  margin-bottom: 20rpx;
+  text-indent: 2em;
 }
 
-.paragraph {
-    display: block;
-    font-size: 28rpx;
-    color: #666666;
-    margin-bottom: 20rpx;
-    text-indent: 0;
-    /* 姝ゅ鏃犻渶棣栬缂╄繘锛屼笌鏉℃缂栧彿閰嶅悎 */
+.clause {
+  margin-bottom: 15rpx;
+}
+
+.clause-number {
+  font-size: 28rpx;
+  color: #303133;
+  font-weight: 500;
+}
+
+.clause-text {
+  font-size: 28rpx;
+  color: #606266;
+}
+
+.footer,
+.ending {
+  display: block;
+  font-size: 28rpx;
+  color: #606266;
+  margin-top: 20rpx;
+  text-indent: 2em;
+}
+
+.ending {
+  font-weight: 500;
+  color: #303133;
+}
+
+.signature {
+  margin-top: 40rpx;
 }
 
 .sign-line {
-    display: block;
-    font-size: 28rpx;
-    color: #666666;
-    margin-top: 30rpx;
-    text-align: right;
-    padding-right: 50rpx;
+  display: block;
+  font-size: 28rpx;
+  color: #606266;
+  margin-top: 15rpx;
+  text-align: right;
+  padding-right: 30rpx;
 }
 
-/* 搴曢儴鍥哄畾鍖哄煙 */
-.bottom-fixed {
-    position: fixed;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    background-color: #ffffff;
-    border-top: 1rpx solid #f5f5f5;
-    z-index: 99;
+/* 搴曢儴鏍� */
+.bottom-bar {
+  position: fixed;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  background-color: #ffffff;
+  border-top: 1rpx solid #f0f0f0;
+  z-index: 99;
+  padding-bottom: env(safe-area-inset-bottom);
 }
 
-/* 鍕鹃�夊尯鍩� */
-.agree-area {
-    padding: 20rpx 30rpx;
-}
-
-.checkbox-group {
-    display: flex;
-    align-items: center;
-}
-
-.checkbox {
-    width: 30rpx;
-    height: 30rpx;
-    margin-right: 15rpx;
-}
-
-.agree-text {
-    font-size: 28rpx;
-    color: #333333;
-    flex: 1;
-}
-
-.required {
-    font-size: 28rpx;
-    color: #ff4d4f;
-}
-
-/* 搴曢儴鎸夐挳 */
 .btn-group {
-    padding: 30rpx;
-    display: flex;
-    gap: 20rpx;
-}
-
-.cancel-btn {
-    flex: 1;
-    height: 90rpx;
-    line-height: 90rpx;
-    font-size: 32rpx;
-    color: #333333;
-    background-color: #ffffff;
-    border: 1rpx solid #e5e5e5;
-    border-radius: 8rpx;
-}
-
-.next-btn {
-    flex: 1;
-    height: 90rpx;
-    line-height: 90rpx;
-    font-size: 32rpx;
-    color: #ffffff;
-    background-color: #1677ff;
-    border: none;
-    border-radius: 8rpx;
-}
-
-.next-btn[disabled] {
-    background-color: #c9d8e9;
-    opacity: 0.7;
-}
-
-/* 瀹炲悕 */
-.container {
-    width: 100%;
-    min-height: 100vh;
-    background-color: #f5f5f5;
-    display: flex;
-    flex-direction: column;
-}
-
-/* 涓婚〉闈㈡牱寮� */
-.main-content {
-    flex: 1;
-    display: flex;
-    flex-direction: column;
-    justify-content: center;
-    align-items: center;
-    gap: 30rpx;
-    padding: 30rpx;
-}
-
-.open-btn {
-    width: 60%;
-    height: 80rpx;
-    line-height: 80rpx;
-    background-color: #1677ff;
-    color: #ffffff;
-    border-radius: 40rpx;
-    font-size: 30rpx;
-}
-
-/* 寮圭獥鏍峰紡 */
-.popup-mask {
-    position: fixed;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    background-color: rgba(0, 0, 0, 0.5);
-    z-index: 998;
-    transition: opacity 0.3s;
-}
-
-.popup-container {
-    position: fixed;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    background-color: #ffffff;
-    border-top-left-radius: 20rpx;
-    border-top-right-radius: 20rpx;
-    z-index: 999;
-    padding: 30rpx;
-    box-sizing: border-box;
-    transform: translateY(100%);
-    transition: transform 0.3s ease-out;
-    max-height: 90vh;
-    overflow-y: auto;
-}
-
-.popup-show {
-    transform: translateY(0);
-}
-
-.popup-title {
-    font-size: 34rpx;
-    color: #333333;
-    font-weight: 600;
-    text-align: center;
-    margin-bottom: 40rpx;
-    padding-bottom: 20rpx;
-    border-bottom: 1rpx solid #f0f0f0;
-}
-
-/* 绛惧悕鍖哄煙 */
-.signature-area {
-    display: flex;
-    flex-direction: column;
-    gap: 20rpx;
-    margin-top: 20rpx;
-    padding-top: 20rpx;
-    border-top: 1rpx solid #f0f0f0;
-}
-
-.signature-title {
-    font-size: 28rpx;
-    color: #333333;
-    margin-bottom: 10rpx;
-}
-
-.signature-box {
-    width: 100%;
-    height: 200rpx;
-    border: 1rpx dashed #e5e5e5;
-    border-radius: 8rpx;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-}
-
-.signature-hint {
-    font-size: 26rpx;
-    color: #999999;
-    text-align: center;
-}
-
-.signature-preview {
-    width: 100%;
-    height: 100%;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    background-color: #f9f9f9;
-    font-size: 26rpx;
-    color: #666666;
-}
-
-.sign-btn {
-    margin-top: 10rpx;
-}
-
-/* 搴曢儴鎸夐挳 */
-.btn-group {
-    display: flex;
-    gap: 20rpx;
-    margin-top: 40rpx;
+  display: flex;
+  gap: 20rpx;
+  padding: 20rpx 30rpx 20rpx;
 }
 
 .cancel-btn,
-.submit-btn {
-    flex: 1;
-    height: 90rpx;
-    line-height: 90rpx;
-    font-size: 32rpx;
+.confirm-btn {
+  flex: 1;
+  height: 88rpx;
+  line-height: 88rpx;
+  font-size: 30rpx;
+  border-radius: 12rpx;
+  border: none;
+  font-weight: 500;
 }
 
-/* 绛惧悕鍖哄煙鏍峰紡 */
-/* 浠呬慨鏀圭鍚嶅尯鍩熺浉鍏虫牱寮� */
-</style>
\ No newline at end of file
+.cancel-btn {
+  color: #606266;
+  background-color: #f5f7fa;
+}
+
+.cancel-btn::after,
+.confirm-btn::after {
+  border: none;
+}
+
+.confirm-btn {
+  color: #fff;
+  background-color: #4285f4;
+}
+
+/* 绛惧悕棰勮寮圭獥 */
+.preview-popup {
+  width: 600rpx;
+  padding: 40rpx;
+}
+
+.preview-title {
+  display: block;
+  font-size: 32rpx;
+  font-weight: 600;
+  color: #303133;
+  text-align: center;
+  margin-bottom: 30rpx;
+}
+
+.preview-img-wrap {
+  width: 100%;
+  height: 300rpx;
+  border: 2rpx dashed #dcdfe6;
+  border-radius: 12rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background-color: #fafafa;
+  overflow: hidden;
+}
+
+.preview-img {
+  width: 100%;
+  height: 100%;
+}
+
+.no-sign {
+  color: #c0c4cc;
+  font-size: 28rpx;
+}
+
+.preview-btns {
+  display: flex;
+  gap: 20rpx;
+  margin-top: 30rpx;
+}
+
+.re-sign-btn,
+.submit-btn {
+  flex: 1;
+  height: 80rpx;
+  line-height: 80rpx;
+  font-size: 28rpx;
+  border-radius: 10rpx;
+  border: none;
+}
+
+.re-sign-btn {
+  color: #606266;
+  background-color: #f5f7fa;
+}
+
+.re-sign-btn::after,
+.submit-btn::after {
+  border: none;
+}
+
+.submit-btn {
+  color: #fff;
+  background-color: #4285f4;
+}
+</style>

--
Gitblit v1.8.0