zhuli 1 місяць тому
батько
коміт
daef8c74c0

+ 6 - 1
src/api/modules/homeEntry.ts

@@ -12,7 +12,7 @@ export const applyStore = params => {
   return http.post(PORT_NONE + `/storeManage/applyStore`, params);
 };
 
-//用户信息
+//用户信息查询
 export const getMerchantByPhone = params => {
   return http.get<StoreUser.ResStoreUserList>(PORT_NONE + `/merchantUser/getMerchantByPhone`, params);
 };
@@ -41,6 +41,11 @@ export const verifyOrder = params => {
 export const verifyCoupon = params => {
   return http.get<StoreUser.ResStoreUserList>(PORT_NONE + `/couponManage/verifyCoupon`, params);
 };
+//保存用户信息
+export const updateMerchantUserInfo = params => {
+  return http.post(PORT_NONE + `/merchantUser/updateMerchantUserInfo`, params);
+};
+
 export const getUserByPhone = params => {
   return http.get(PORT_NONE + `/merchantUser/getMerchantByPhone`, params);
 };

+ 0 - 5
src/api/modules/newLoginApi.ts

@@ -33,11 +33,6 @@ export const forgetPassword = params => {
   return httpLogin.get(`/alienStorePlatform/storePlatformLogin/updatePassword`, params, { loading: false });
 };
 
-// 修改密码
-export const updatePassword = params => {
-  return httpLogin.post(`/alienStorePlatform/storePlatformLogin/updatePassword`, params, { loading: false });
-};
-
 //经营板块
 export const getBusinessSection = () => {
   return httpLogin.get(`/alienStore/store/info/getBusinessSection`);

+ 88 - 42
src/layouts/components/Header/components/InfoDialog.vue

@@ -1,25 +1,24 @@
 <template>
   <el-dialog v-model="dialogVisible" title="个人信息" width="500px" draggable>
     <div class="form-wrap">
-      <el-form :model="form" :rules="rules" ref="formRef" label-width="72px">
+      <el-form :model="form" label-width="72px">
         <el-form-item label="头像">
           <el-upload
-            class="avatar-uploader"
-            action="#"
+            v-model:file-list="form.avatarList"
+            :http-request="handleHttpUpload"
             list-type="picture-card"
             :limit="1"
             :on-exceed="onExceed"
-            v-model:file-list="form.avatarList"
           >
             <el-icon><Plus /></el-icon>
           </el-upload>
         </el-form-item>
 
-        <el-form-item label="昵称" prop="nickname">
+        <el-form-item label="昵称">
           <el-input v-model="form.nickname" placeholder="请输入昵称" />
         </el-form-item>
 
-        <el-form-item label="简介" prop="intro">
+        <el-form-item label="简介">
           <el-input v-model="form.intro" type="textarea" :rows="6" placeholder="请输入简介" />
         </el-form-item>
       </el-form>
@@ -27,65 +26,112 @@
     <template #footer>
       <span class="dialog-footer">
         <el-button @click="dialogVisible = false">取消</el-button>
-        <el-button type="primary" @click="getUserInfo()">确认</el-button>
+        <el-button type="primary" @click="getSaveUserInfo()">确认</el-button>
       </span>
     </template>
   </el-dialog>
 </template>
 
 <script setup lang="ts">
-import { ref, reactive } from "vue";
-import { ElMessage, type FormInstance, type FormRules } from "element-plus";
+import { ref, reactive, onMounted } from "vue";
+import { ElMessage, type FormInstance, type UploadUserFile, UploadRequestOptions } from "element-plus";
 import { Plus } from "@element-plus/icons-vue";
-import { getMerchantByPhone } from "@/api/modules/homeEntry.ts";
+import { getMerchantByPhone, updateMerchantUserInfo } from "@/api/modules/homeEntry.ts";
+import { uploadImg } from "@/api/modules/newLoginApi.ts";
 import { localGet } from "@/utils/index";
-const userInfo = localGet("geeker-user").userInfo;
+import defaultAvatar from "@/assets/images/avatar.gif";
+import { head } from "lodash";
+
+const userInfo = localGet("geeker-user")?.userInfo || {};
 const dialogVisible = ref(false);
 
-const formRef = ref<FormInstance>();
+let headImg1 = ref("");
+const userId = ref<string | number>(""); // 保存用户ID
 const form = reactive({
-  avatarList: [] as any[],
+  avatarList: [] as UploadUserFile[],
   nickname: "",
   intro: ""
 });
-const openDialog = async () => {
-  form.nickname = userInfo.nickName;
-  form.intro = userInfo.accountBlurb;
 
+const getUserInfo = async () => {
+  const res: any = await getMerchantByPhone({ phone: userInfo.phone });
+  if (res.code == 200) {
+    // 保存用户ID
+    userId.value = res.data.id || res.data.userId || "";
+    form.nickname = res.data.nickName || "";
+    form.intro = res.data.accountBlurb || "";
+    // 设置头像
+    const headImg = res.data.headImg;
+    if (headImg && headImg !== null && headImg !== "") {
+      // 如果有头像,使用用户头像
+      form.avatarList = [
+        {
+          name: "avatar",
+          url: headImg,
+          uid: Date.now()
+        } as UploadUserFile
+      ];
+    } else {
+      // 如果 headImg 为 null 或空,使用默认头像
+      form.avatarList = [
+        {
+          name: "avatar",
+          url: defaultAvatar,
+          uid: Date.now()
+        } as UploadUserFile
+      ];
+    }
+  }
+};
+const openDialog = async () => {
   dialogVisible.value = true;
+  getUserInfo();
 };
-const getUserInfo = async () => {
-  if (!formRef.value) return;
-  await formRef.value.validate(valid => {
-    if (!valid) return;
-    const res = getMerchantByPhone({ phone: "" });
-    if (res.code === 200) {
-      ElMessage.success("保存成功");
+//文件上传
+const handleHttpUpload = async (options: UploadRequestOptions) => {
+  let formData = new FormData();
+  formData.append("file", options.file);
+  try {
+    const res: any = await uploadImg(formData);
+    // 上传成功,将URL保存到文件对象中
+    const fileUrl = res?.data?.fileUrl || res?.data?.[0] || res?.fileUrl;
+    if (fileUrl) {
+      headImg1.value = fileUrl;
+      // 调用 onSuccess 回调,传入响应数据
+      options.onSuccess({ fileUrl });
+    } else {
+      throw new Error("上传失败:未获取到文件URL");
     }
-  });
+  } catch (error) {
+    options.onError(error as any);
+    ElMessage.error("文件上传失败,请重试");
+  }
 };
+const getSaveUserInfo = async () => {
+  try {
+    const res: any = await updateMerchantUserInfo({
+      id: userId.value,
+      nickName: form.nickname,
+      headImg: headImg1.value ? headImg1.value : "",
+      accountBlurb: form.intro
+    });
 
-defineExpose({ openDialog });
-
-const rules: FormRules = {
-  nickname: [{ required: true, message: "请输入昵称", trigger: "blur" }],
-  intro: [{ required: true, message: "请输入简介", trigger: "blur" }]
+    if (res.code === "200" || res.code === 200) {
+      ElMessage.success(res.msg || "保存成功");
+      dialogVisible.value = false;
+      // 可以刷新用户信息
+      getUserInfo();
+    } else {
+      ElMessage.error(res.msg || "保存失败,请重试");
+    }
+  } catch (error: any) {
+    ElMessage.error(error?.msg || error?.message || "保存失败,请重试");
+  }
 };
 
+defineExpose({ openDialog });
+
 const onExceed = () => {
   ElMessage.warning("仅允许上传一张头像");
 };
-
-const handleBack = () => {
-  history.back();
-};
-
-const handleSave = async () => {
-  if (!formRef.value) return;
-  await formRef.value.validate(valid => {
-    if (!valid) return;
-    // TODO: 接口保存
-    ElMessage.success("保存成功");
-  });
-};
 </script>

+ 173 - 7
src/layouts/components/Header/components/PasswordDialog.vue

@@ -1,4 +1,5 @@
 <template>
+  <!-- 修改密码对话框 -->
   <el-dialog v-model="dialogVisible" title="修改密码" width="500px" draggable :close-on-click-modal="false">
     <el-form ref="passwordFormRef" :model="passwordForm" :rules="passwordRules" label-width="100px" label-position="left">
       <el-form-item label="输入原密码" prop="oldPassword">
@@ -37,13 +38,55 @@
       </span>
     </template>
   </el-dialog>
+
+  <!-- 忘记密码对话框 -->
+  <el-dialog v-model="forgotPasswordVisible" title="忘记密码" width="500px" draggable :close-on-click-modal="false">
+    <el-form
+      ref="forgotPasswordFormRef"
+      :model="forgotPasswordForm"
+      :rules="forgotPasswordRules"
+      label-width="100px"
+      label-position="left"
+    >
+      <el-form-item label="手机号码">
+        <span>{{ maskedPhone }}</span>
+      </el-form-item>
+
+      <el-form-item label="" prop="verificationCode">
+        <div style="display: flex; gap: 12px; width: 100%">
+          <el-input v-model="forgotPasswordForm.verificationCode" placeholder="请输入" clearable style="flex: 1" />
+          <el-button type="primary" :disabled="codeCountdown > 0" @click="sendLoginCode">
+            {{ codeCountdown > 0 ? `${codeCountdown}秒后重新获取` : "获取验证码" }}
+          </el-button>
+        </div>
+      </el-form-item>
+
+      <el-form-item label="输入新密码" prop="newPassword">
+        <el-input
+          v-model="forgotPasswordForm.newPassword"
+          type="password"
+          placeholder="请输入6-16位的密码,包含字母和数字"
+          show-password
+          clearable
+        />
+      </el-form-item>
+    </el-form>
+
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button @click="handleForgotPasswordCancel">取消</el-button>
+        <el-button type="primary" :loading="forgotPasswordLoading" @click="handleForgotPasswordConfirm">确定</el-button>
+      </span>
+    </template>
+  </el-dialog>
 </template>
 
 <script setup lang="ts">
-import { ref, reactive } from "vue";
+import { ref, reactive, computed, onBeforeUnmount } from "vue";
 import { ElMessage, type FormInstance, type FormRules } from "element-plus";
 import { validatePassword, validateConfirmPassword } from "@/utils/eleValidate";
-import { updatePassword } from "@/api/modules/newLoginApi";
+import { forgetPassword, getPhoneCode } from "@/api/modules/newLoginApi";
+import { localGet } from "@/utils/index";
 
 const dialogVisible = ref(false);
 const loading = ref(false);
@@ -55,6 +98,30 @@ const passwordForm = reactive({
   confirmPassword: ""
 });
 
+// 忘记密码对话框
+const forgotPasswordVisible = ref(false);
+const forgotPasswordLoading = ref(false);
+const forgotPasswordFormRef = ref<FormInstance>();
+const codeCountdown = ref(0);
+let countdownTimer: NodeJS.Timeout | null = null;
+
+// 获取用户手机号
+const userPhone = computed(() => {
+  return localGet("iphone") || localGet("geeker-user")?.userInfo?.phone || "";
+});
+// 掩码显示手机号
+const maskedPhone = computed(() => {
+  if (!userPhone.value || userPhone.value.length !== 11) {
+    return "";
+  }
+  return userPhone.value.replace(/(\d{3})\d{4}(\d{4})/, "$1****$2");
+});
+
+const forgotPasswordForm = reactive({
+  verificationCode: "",
+  newPassword: ""
+});
+
 // 表单验证规则
 const passwordRules: FormRules = {
   oldPassword: [{ required: true, message: "请输入原密码", trigger: "blur" }],
@@ -68,6 +135,12 @@ const passwordRules: FormRules = {
   ]
 };
 
+// 忘记密码表单验证规则
+const forgotPasswordRules: FormRules = {
+  verificationCode: [{ required: true, message: "请输入验证码", trigger: "blur" }],
+  newPassword: [{ required: true, validator: validatePassword, trigger: "blur" }]
+};
+
 // 打开对话框
 const openDialog = () => {
   dialogVisible.value = true;
@@ -94,9 +167,13 @@ const handleConfirm = async () => {
 
     loading.value = true;
     try {
-      const res: any = await updatePassword({
+      const res: any = await forgetPassword({
+        type: 1,
+        phone: userPhone.value,
+        verificationCode: "",
         oldPassword: passwordForm.oldPassword,
-        newPassword: passwordForm.newPassword
+        newPassword: passwordForm.newPassword,
+        confirmNewPassword: passwordForm.newPassword
       });
 
       if (res.code === "200" || res.code === 200) {
@@ -116,12 +193,101 @@ const handleConfirm = async () => {
   });
 };
 
-// 忘记密码
 const handleForgotPassword = () => {
-  ElMessage.info("忘记密码功能,请跳转到登录页面");
-  // TODO: 可以跳转到忘记密码页面或打开忘记密码对话框
   dialogVisible.value = false;
+  forgotPasswordVisible.value = true;
+  // 重置表单
+  if (forgotPasswordFormRef.value) {
+    forgotPasswordFormRef.value.resetFields();
+  }
+  // 重置倒计时
+  codeCountdown.value = 0;
+  if (countdownTimer) {
+    clearInterval(countdownTimer);
+    countdownTimer = null;
+  }
 };
+// ----------------------忘记密码-------------------------
+// 发送短信验证码
+const sendLoginCode = async () => {
+  let phoneCode: any = await getPhoneCode({ phone: userPhone.value, appType: "2", businessType: "0" });
+  if (phoneCode.code === 200) {
+    ElMessage.success("验证码已发送");
+    // 开始倒计时
+    codeCountdown.value = 60;
+    countdownTimer = setInterval(() => {
+      codeCountdown.value--;
+      if (codeCountdown.value <= 0) {
+        if (countdownTimer) {
+          clearInterval(countdownTimer);
+          countdownTimer = null;
+        }
+      }
+    }, 1000);
+  }
+};
+
+// 忘记密码取消
+const handleForgotPasswordCancel = () => {
+  forgotPasswordVisible.value = false;
+  if (forgotPasswordFormRef.value) {
+    forgotPasswordFormRef.value.resetFields();
+  }
+  // 清除倒计时
+  if (countdownTimer) {
+    clearInterval(countdownTimer);
+    countdownTimer = null;
+  }
+  codeCountdown.value = 0;
+};
+
+// 忘记密码确定
+const handleForgotPasswordConfirm = async () => {
+  if (!forgotPasswordFormRef.value) return;
+
+  await forgotPasswordFormRef.value.validate(async valid => {
+    if (!valid) return;
+
+    forgotPasswordLoading.value = true;
+
+    try {
+      const res: any = await forgetPassword({
+        phone: userPhone.value,
+        verificationCode: forgotPasswordForm.verificationCode,
+        type: "0",
+        newPassword: forgotPasswordForm.newPassword
+      });
+
+      if (res.code === "200" || res.code === 200) {
+        ElMessage.success(res.msg || "密码修改成功");
+        forgotPasswordVisible.value = false;
+        if (forgotPasswordFormRef.value) {
+          forgotPasswordFormRef.value.resetFields();
+        }
+        // 清除倒计时
+        if (countdownTimer) {
+          clearInterval(countdownTimer);
+          countdownTimer = null;
+        }
+        codeCountdown.value = 0;
+      } else {
+        ElMessage.error(res.msg || "密码修改失败,请重试");
+      }
+    } catch (error: any) {
+      ElMessage.error(error?.msg || error?.message || "密码修改失败,请重试");
+    } finally {
+      forgotPasswordLoading.value = false;
+    }
+  });
+};
+
+// 组件卸载时清除定时器
+onBeforeUnmount(() => {
+  if (countdownTimer) {
+    clearInterval(countdownTimer);
+    countdownTimer = null;
+  }
+});
 
 defineExpose({ openDialog });
 </script>

+ 30 - 37
src/views/home/components/go-flow.vue

@@ -50,10 +50,6 @@
                 <el-input-number v-model="step2Form.storeCapacity" :min="1" :max="9999" />
               </el-form-item>
 
-              <el-form-item label="门店电话" prop="storeTel">
-                <el-input v-model="step2Form.storeTel" placeholder="请输入门店电话" />
-              </el-form-item>
-
               <el-form-item label="门店面积" prop="storeArea">
                 <el-radio-group v-model="step2Form.storeArea">
                   <el-radio label="小于20平米" value="1"> 小于20平米 </el-radio>
@@ -116,7 +112,7 @@
               <el-form-item label="纬度" prop="storePositionLatitude">
                 <el-input disabled v-model="step2Form.storePositionLatitude" placeholder="请填写纬度" clearable />
               </el-form-item>
-              <el-form-item label="经纬度查询" prop="address">
+              <el-form-item label="经纬度查询">
                 <el-select
                   v-model="address"
                   filterable
@@ -133,7 +129,7 @@
                 </el-select>
               </el-form-item>
 
-              <el-form-item label="营业执照" prop="businessLicenseFiles">
+              <el-form-item label="营业执照" prop="businessLicenseAddress">
                 <el-upload
                   v-model:file-list="step2Form.businessLicenseAddress"
                   :http-request="handleHttpUpload"
@@ -149,7 +145,7 @@
                 </el-upload>
               </el-form-item>
 
-              <el-form-item label="合同图片" prop="contractImageFiles">
+              <el-form-item label="合同图片" prop="contractImageList">
                 <el-upload
                   v-model:file-list="step2Form.contractImageList"
                   :http-request="handleHttpUpload"
@@ -165,7 +161,7 @@
                 </el-upload>
               </el-form-item>
 
-              <el-form-item label="食品经营许可证" prop="foodLicenseFiles ">
+              <el-form-item label="食品经营许可证" prop="foodLicenceImgList ">
                 <el-upload
                   v-model:file-list="step2Form.foodLicenceImgList"
                   :http-request="handleHttpUpload"
@@ -187,14 +183,14 @@
 
       <!-- 按钮 -->
       <div class="form-actions">
-        <el-button size="large" @click="handlePrevStep"> 上一步 </el-button>
         <el-button type="primary" size="large" @click="handleSubmit"> 提交 </el-button>
       </div>
     </div>
     <!-- 第三步: 等待审核-->
     <div v-if="currentStep === 3">
       <div class="button-container">
-        <el-button type="primary" size="large" class="register-btn"> 等待审核 </el-button>
+        <el-button type="danger" size="large" class="register-btn" v-if="userInfo.status == 3"> 审核拒绝,重新入驻 </el-button>
+        <el-button type="primary" size="large" class="register-btn" v-else> 等待审核 </el-button>
       </div>
     </div>
   </div>
@@ -220,8 +216,13 @@ import {
   getDistrict,
   uploadImg
 } from "@/api/modules/newLoginApi.ts";
+import { localGet } from "@/utils/index";
+const userInfo = localGet("geeker-user")?.userInfo || {};
 import { add } from "lodash";
-
+onMounted(() => {
+  getBusinessSectionList();
+  getBusinessTypes();
+});
 const entryList = ref([
   {
     title: "个人实名"
@@ -237,6 +238,19 @@ const entryList = ref([
   }
 ]);
 
+const step2Rules: FormRules = {
+  storeName: [{ required: true, message: "请输入店铺名称", trigger: "blur" }],
+  storeArea: [{ required: true, message: "请选择门店面积", trigger: "change" }],
+  storeBlurb: [{ required: true, message: "请输入门店简介", trigger: "change" }],
+  storeIntro: [{ required: true, message: "请输入门店简介", trigger: "blur" }],
+  businessSection: [{ required: true, message: "请选择经营板块", trigger: "change" }],
+  businessTypes: [{ required: true, message: "请选择经营种类", trigger: "change" }],
+  address: [{ required: true, message: "请输入经纬度", trigger: "change" }],
+  businessLicenseAddress: [{ required: true, message: "请上传营业执照", trigger: "change" }],
+  contractImageList: [{ required: true, message: "请上传合同图片", trigger: "change" }],
+  foodLicenceImgList: [{ required: true, message: "请上传食品经营许可证", trigger: "change" }]
+};
+
 //地址集合
 const addressList = ref<any[]>([]);
 //查询地址名称
@@ -270,7 +284,7 @@ const setStep = (val: number) => {
 // 第一步表单
 const step1FormRef = ref<FormInstance>();
 const step1Form = reactive({
-  name: "朱丽",
+  name: "",
   idNumber: ""
 });
 
@@ -292,7 +306,6 @@ const step2Form = reactive({
   storeName: "", //门店名称
   storeCapacity: 1, //容纳人数
   storeArea: "1", //门店面积
-  storeTel: "", //门店电话
   isChain: 0, //是否连锁
   storeDetailAddress: "", //详细地址
   region: [],
@@ -315,19 +328,6 @@ const step2Form = reactive({
   foodLicenceImgList: [] as UploadUserFile[] //食品经营许可证
 });
 
-const step2Rules: FormRules = {
-  storeName: [{ required: true, message: "请输入店铺名称", trigger: "blur" }],
-  storeTel: [{ required: true, message: "请输入门店电话", trigger: "blur" }],
-  storeArea: [{ required: true, message: "请选择门店面积", trigger: "change" }],
-  storeIntro: [{ required: true, message: "请输入门店简介", trigger: "blur" }],
-  businessSection: [{ required: true, message: "请选择经营板块", trigger: "change" }],
-  businessType: [{ required: true, message: "请选择经营种类", trigger: "change" }],
-  coordinates: [{ required: true, message: "请输入经纬度", trigger: "blur" }],
-  businessLicense: [{ required: true, message: "请上传营业执照", trigger: "change" }],
-  contractImages: [{ required: true, message: "请上传合同图片", trigger: "change" }],
-  foodLicense: [{ required: true, message: "请上传食品经营许可证", trigger: "change" }]
-};
-
 // 返回按钮
 const handleBack = () => {
   if (currentStep.value === 1) {
@@ -487,9 +487,8 @@ const handleNextStep = async () => {
       const res = await verifyIdInfo(params);
       if (res.code == "200") {
         ElMessage.success(res.msg);
+
         setStep(2);
-        getBusinessSectionList();
-        getBusinessTypes();
       }
     } else {
       ElMessage.error("请完善表单信息");
@@ -497,11 +496,6 @@ const handleNextStep = async () => {
   });
 };
 
-// 上一步
-const handlePrevStep = () => {
-  setStep(1);
-};
-
 // 提取文件列表中的URL
 const getFileUrls = (fileList: UploadUserFile[]): string[] => {
   return fileList
@@ -597,11 +591,10 @@ const handleSubmit = async () => {
         fullStoreAddress = `${provinceName}${cityName}${districtName}`;
       }
 
-      // 构建提交参数(按照JSON格式)
       const params = {
+        storeTel: userInfo.phone,
         storeName: step2Form.storeName,
         storeCapacity: step2Form.storeCapacity,
-        storeTel: step2Form.storeTel,
         storeArea: storeAreaNum,
         isChain: step2Form.isChain,
         storeDetailAddress: step2Form.storeDetailAddress,
@@ -624,7 +617,7 @@ const handleSubmit = async () => {
         businessSectionName: step2Form.businessSectionName,
         businessTypes: step2Form.businessTypes.length > 0 ? step2Form.businessTypes : step2Form.businessTypesList,
         foodLicenceUrl: foodLicenceUrls.length > 0 ? foodLicenceUrls[0] : "",
-        userAccount: 0, // 需要从用户信息中获取
+        userAccount: userInfo.id, // 需要从用户信息中获取
         administrativeRegionProvinceAdcode: step2Form.administrativeRegionProvinceAdcode,
         administrativeRegionCityAdcode: step2Form.administrativeRegionCityAdcode,
         administrativeRegionDistrictAdcode: step2Form.administrativeRegionDistrictAdcode,
@@ -641,8 +634,8 @@ const handleSubmit = async () => {
           try {
             const res = await applyStore(params);
             if (res.code === "200") {
-              ElMessage.success(res.msg || "提交成功,等待审核");
               setStep(3); // 跳转到等待审核步骤
+              ElMessage.success(res.msg);
             } else {
               ElMessage.error(res.msg || "提交失败");
             }

+ 8 - 5
src/views/home/index.vue

@@ -1,10 +1,10 @@
 <template>
   <div id="home">
     <!-- 第一步  未入驻 -->
-    <go-enter :current-step="currentStep" @update:current-step="handleUpdateCurrentStep" v-if="userInfo == 0" />
+    <go-enter :current-step="currentStep" @update:current-step="handleUpdateCurrentStep" v-if="isEntry" />
 
     <!--已入驻-->
-    <go-examine v-if="userInfo == 1" />
+    <go-examine v-else />
 
     <!-- 第二步 -->
     <go-flow :current-step="currentStep" @update:current-step="handleUpdateCurrentStep" />
@@ -13,12 +13,15 @@
 
 <script setup lang="ts">
 import { ref } from "vue";
-
+import { localGet, localSet } from "@/utils/index";
 import goEnter from "./components/go-enter.vue";
 import goFlow from "./components/go-flow.vue";
 import goExamine from "./components/go-examine.vue";
-const userInfo = ref(1);
-
+const userInfo = ref(2);
+const isEntry = ref<boolean>(false);
+if (!localGet("businessSection") && !localGet("geeker-user").userInfo.businessSection) {
+  isEntry.value = true;
+}
 // 当前步骤:0-首页,1-第一步,2-第二步
 const currentStep = ref(0);
 

+ 56 - 2
src/views/home/notice.vue

@@ -2,6 +2,7 @@
   <div class="notice-page">
     <!-- 头部 -->
     <div class="header">
+      <el-button class="back-btn" @click="handleBack"> 返回 </el-button>
       <el-button class="mark-all-read-btn" v-if="noticeList.length != 0" @click="handleMarkAllRead">
         <el-icon><CircleCheck /></el-icon>
         一键已读
@@ -35,6 +36,19 @@
       </div>
     </div>
 
+    <!-- 分页 -->
+    <div v-if="total > 0" class="pagination-section">
+      <el-pagination
+        v-model:current-page="pageNum"
+        v-model:page-size="pageSize"
+        :page-sizes="[10, 20, 50, 100]"
+        :total="total"
+        layout="total, sizes, prev, pager, next, jumper"
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+      />
+    </div>
+
     <!-- 详情对话框 -->
     <el-dialog v-model="dialogVisible" :title="currentNotice?.title" width="500px" :close-on-click-modal="false">
       <div class="dialog-content">
@@ -49,7 +63,10 @@ import { ref, onMounted } from "vue";
 import { ElMessage } from "element-plus";
 import { CircleCheck } from "@element-plus/icons-vue";
 import { getNoticeList, markAllNoticesAsRead } from "@/api/modules/homeEntry.ts";
+import { useRouter } from "vue-router";
+const router = useRouter();
 import mittBus from "@/utils/mittBus";
+import { localGet } from "@/utils/index";
 
 interface NoticeItem {
   id: number;
@@ -62,11 +79,24 @@ interface NoticeItem {
 onMounted(() => {
   getList();
 });
+// 返回按钮
+const handleBack = () => {
+  router.back();
+};
 
 const noticeList = ref<NoticeItem[]>([]);
 const total = ref<number>(0);
+const pageNum = ref<number>(1);
+const pageSize = ref<number>(10);
+
+// 获取用户手机号
+const getReceiverId = () => {
+  return localGet("iphone") || localGet("geeker-user")?.userInfo?.phone || "";
+};
+
 const getList = async () => {
-  let res: any = await getNoticeList({ pageNum: 1, pageSize: 10, receiverId: "" });
+  const receiverId = getReceiverId();
+  let res: any = await getNoticeList({ pageNum: pageNum.value, pageSize: pageSize.value, receiverId });
   console.log(res);
   if (res.code == "200") {
     noticeList.value = res.data?.records || res.data?.list || [];
@@ -74,14 +104,30 @@ const getList = async () => {
   }
 };
 
+// 每页条数改变
+const handleSizeChange = (size: number) => {
+  pageSize.value = size;
+  pageNum.value = 1; // 重置到第一页
+  getList();
+};
+
+// 当前页改变
+const handleCurrentChange = (current: number) => {
+  pageNum.value = current;
+  getList();
+};
+
 const dialogVisible = ref(false);
 const currentNotice = ref<NoticeItem | null>(null);
 
 // 一键已读
 const handleMarkAllRead = async () => {
-  let res: any = await markAllNoticesAsRead({ receiverId: "" });
+  const receiverId = getReceiverId();
+  let res: any = await markAllNoticesAsRead({ receiverId });
   if (res.code == "200") {
     ElMessage.success("操作成功");
+    // 重置到第一页并刷新列表
+    pageNum.value = 1;
     getList();
     // 通知 Message 组件更新未读数量
     mittBus.emit("updateUnreadCount");
@@ -133,6 +179,7 @@ const handleViewDetail = (item: NoticeItem) => {
     display: flex;
     flex-direction: column;
     gap: 16px;
+    margin-bottom: 20px;
     .empty-state {
       display: flex;
       flex-direction: column;
@@ -207,6 +254,13 @@ const handleViewDetail = (item: NoticeItem) => {
       }
     }
   }
+  .pagination-section {
+    display: flex;
+    justify-content: flex-end;
+    padding-top: 20px;
+    margin-top: 20px;
+    border-top: 1px solid #e4e7ed;
+  }
 }
 .dialog-content {
   padding: 10px 0;