소스 검색

feat(layout): 优化退出登录功能并添加确认提示

- 在 Header.vue 中添加确认提示框,确保用户有意退出登录
- 实现退出登录时的 loading 效果,提升用户体验
- 在 utils.js 中添加 confirm 函数,用于全局确认提示
- 优化多个组件中的时间显示逻辑,统一时间格式
- 修复船东管理页面的图片上传和删除相关问题
- 优化工作台页面的法律援助管理列表显示
wzg 9 달 전
부모
커밋
9d619afc6a

+ 18 - 8
src/layout/Header.vue

@@ -104,15 +104,25 @@ import { AnonymousLogin, tcb } from "../apis/cloudLogin";
 const db = tcb.database();
 const v = db.collection("huihenduo_versions");
 const __ = db.command;
+import { confirm } from "../utils/utils";
 let userName = localStorage.staffName;
-function quit() {
-  localStorage.removeItem("loginAccountId");
-  localStorage.removeItem("loginName");
-  localStorage.removeItem("loginPhone");
-  localStorage.removeItem("shippingCompany");
-  localStorage.removeItem("shippingId");
-  store.commit("changeLogin", false);
-  router.push({ path: "/login" });
+async function quit() {
+  if (!(await confirm("确认退出登录?"))) return;
+  const loading = ElLoading.service({
+    lock: true,
+    text: "正在退出登录...",
+    background: "rgba(0, 0, 0, 0.7)",
+  });
+  setTimeout(() => {
+    loading.close();
+    localStorage.removeItem("loginAccountId");
+    localStorage.removeItem("loginName");
+    localStorage.removeItem("loginPhone");
+    localStorage.removeItem("shippingCompany");
+    localStorage.removeItem("shippingId");
+    store.commit("changeLogin", false);
+    router.push({ path: "/login" });
+  }, 2000);
 }
 let dialogVisible = ref(false);
 let isNewMessage = ref([]);

+ 23 - 1
src/utils/utils.js

@@ -10,4 +10,26 @@ function subTimeStr(str, i) {
   return str.substring(0, index);
 }
 
-export { subTimeStr };
+async function confirm(
+  text = "确定操作?",
+  title = "提示",
+  confirmButtonText = "确定",
+  cancelButtonText = "取消",
+  type = "warning"
+) {
+  return new Promise((resolve, reject) => {
+    ElMessageBox.confirm(text, title, {
+      confirmButtonText,
+      cancelButtonText,
+      type,
+    })
+      .then(() => {
+        resolve(true);
+      })
+      .catch(() => {
+        resolve(false);
+      });
+  });
+}
+
+export { subTimeStr, confirm };

+ 1 - 1
src/views/fireSafetyManage/checkFireSafetyExamineList.vue

@@ -59,7 +59,7 @@
           v-if="type == 1"
         >
           <template v-slot="scope">
-            {{ subTimeStr(scope.row.createTime) }}
+            {{ subTimeStr(scope.row.createTime, 10) }}
           </template>
         </el-table-column>
         <el-table-column

+ 1 - 1
src/views/fireSafetyManage/fireSafetyHistoryCheckList.vue

@@ -59,7 +59,7 @@
           v-if="type == 2"
         >
           <template v-slot="scope">
-            {{ subTimeStr(scope.row.createTime) }}
+            {{ subTimeStr(scope.row.createTime, 10) }}
           </template>
         </el-table-column>
         <el-table-column

+ 1 - 1
src/views/fireSafetyManage/fireSafetyTemplateList.vue

@@ -43,7 +43,7 @@
           align="center"
         >
           <template v-slot="scope">
-            {{ subTimeStr(scope.row.createTime) }}
+            {{ subTimeStr(scope.row.createTime, 10) }}
           </template>
         </el-table-column>
         <el-table-column label="操作" min-width="80" align="center">

+ 12 - 2
src/views/index/Login.vue

@@ -13,7 +13,11 @@
         <div class="form-container">
           <el-form :model="ruleForm" :rules="rules" ref="form">
             <el-form-item prop="phone">
-              <el-input placeholder="请输入手机号" v-model="ruleForm.phone">
+              <el-input
+                placeholder="请输入手机号"
+                v-model="ruleForm.phone"
+                :disabled="loading"
+              >
                 <template #prepend>
                   <el-button :icon="Iphone" />
                 </template>
@@ -24,6 +28,7 @@
                 type="password"
                 placeholder="请输入密码"
                 v-model="ruleForm.password"
+                :disabled="loading"
               >
                 <template #prepend>
                   <el-button :icon="Lock" />
@@ -40,8 +45,9 @@
                 "
                 type="primary"
                 @click="login('ruleForm')"
+                :loading="loading"
               >
-                登录
+                {{ loading ? "正在登录..." : "登  录" }}
               </el-button>
             </el-form-item>
           </el-form>
@@ -80,18 +86,22 @@ const rules = ref({
 function check() {
   // form.value.validate((valid) => {});
 }
+const loading = ref(false);
 async function login() {
   // let res = await cloudConfig.doc("18ed09686196068205eeb77612d641c6").get();
   // let { version } = res.data[0];
   // localStorage.setItem("version", version);
   form.value.validate(async (valid) => {
     if (valid) {
+      loading.value = true;
+      await new Promise((resolve) => setTimeout(resolve, 2000));
       let { phone, password } = ruleForm.value;
       let { data } = await api.login({
         phone,
         password,
         // password: md5(password).toUpperCase(),
       });
+      loading.value = false;
       if (data.status == 0) {
         ElNotification.success({
           title: "成功",

+ 1 - 1
src/views/marineManage/marineNotice.vue

@@ -31,7 +31,7 @@
           align="center"
         >
           <template v-slot="scope">
-            {{ subTimeStr(scope.row.createTime) }}
+            {{ subTimeStr(scope.row.createTime, 10) }}
           </template>
         </el-table-column>
       </el-table>

+ 2 - 1
src/views/shipManage/shipDetail.vue

@@ -59,7 +59,7 @@
   </div>
   <div class="container-title">船舶图片</div>
   <div class="line-container-p24">
-    <div v-if="medias.length" class="medias-content df ffw">
+    <div v-if="!medias.length" class="medias-content df ffw">
       <div class="pic-container">
         <div v-for="(item, index) in medias" :key="item" class="pic-main">
           <div :class="['box', index % 2 == 0 ? '' : 'bottom-box']">
@@ -112,6 +112,7 @@
         ></video>
       </el-dialog>
     </div>
+    <div v-else class="tac c7">暂无船舶图片</div>
   </div>
 </template>
 <script setup>

+ 1 - 1
src/views/shipManage/shipList.vue

@@ -109,7 +109,7 @@
           align="center"
         >
           <template v-slot="scope">
-            {{ subTimeStr(scope.row.createTime) }}
+            {{ subTimeStr(scope.row.createTime, 10) }}
           </template>
         </el-table-column>
         <el-table-column label="操作" min-width="160" align="center">

+ 51 - 17
src/views/shipOwnerManage/shipOwnerDetail.vue

@@ -484,18 +484,20 @@
           绑定船舶
         </el-button>
       </div>
-      <div class="df jcc mt30 mb30" v-if="!route.query.shipOwnerId">
-        <el-button @click="router.replace('/shipOwnerManage/shipOwnerList')">
-          取消
-        </el-button>
-        <el-button
-          type="primary"
-          :loading="saveShipOwnerLoading"
-          @click="saveShipOwner"
-        >
-          保存
-        </el-button>
-      </div>
+    </div>
+  </div>
+  <div class="line-container-p24" v-if="!route.query.shipOwnerId">
+    <div class="df jcfe">
+      <el-button @click="router.replace('/shipOwnerManage/shipOwnerList')">
+        取消
+      </el-button>
+      <el-button
+        type="primary"
+        :loading="saveShipOwnerLoading"
+        @click="saveShipOwner"
+      >
+        保存
+      </el-button>
     </div>
   </div>
 </template>
@@ -774,6 +776,9 @@ const handleIdCardFrontSuccess = ({ response: data }) => {
     shipOwnerForm.value.idcardFrontFileKey = data.result.key;
     shipOwnerForm.value.idcardFrontViewUrl = data.result.viewUrl;
     shipOwnerForm.value.idcardFrontDownloadUrl = data.result.downloadUrl;
+    ElMessage.success("上传成功");
+  } else {
+    ElMessage.error(data.msg || "上传失败");
   }
 };
 // 身份证国徽面上传处理
@@ -782,6 +787,7 @@ const handleIdCardBackSuccess = ({ response: data }) => {
     shipOwnerForm.value.idcardBackFileKey = data.result.key;
     shipOwnerForm.value.idcardBackViewUrl = data.result.viewUrl;
     shipOwnerForm.value.idcardBackDownloadUrl = data.result.downloadUrl;
+    ElMessage.success("上传成功");
   } else {
     ElMessage.error(data.msg || "上传失败");
   }
@@ -806,6 +812,7 @@ const handleCertSuccess = ({ response: data }) => {
       viewUrl: data.result.viewUrl,
       downloadUrl: data.result.downloadUrl,
     });
+    ElMessage.success("上传成功");
   } else {
     ElMessage.error(data.msg || "上传失败");
   }
@@ -845,13 +852,25 @@ const handleHealthSuccess = ({ response: data }) => {
       viewUrl: data.result.viewUrl,
       downloadUrl: data.result.downloadUrl,
     });
+    ElMessage.success("上传成功");
   } else {
     ElMessage.error(data.msg || "上传失败");
   }
 };
 
 // 健康证明删除处理
-const handleHealthRemove = ({ fileIndex }) => {
+const handleHealthRemove = async ({ file, fileIndex }) => {
+  if (file.id) {
+    let { data } = await api.deleteShipOwnerCert({
+      docId: file.id,
+    });
+    if (data.status === 0) {
+      ElMessage.success("删除成功");
+    } else {
+      ElMessage.error(data.msg || "删除失败");
+      return;
+    }
+  }
   const healthDocs = shipOwnerForm.value.documents.filter(
     (doc) => doc.docType === 2
   );
@@ -862,7 +881,7 @@ const handleHealthRemove = ({ fileIndex }) => {
 };
 
 // 服务簿上传处理
-const handleServiceSuccess = ({ response: data }) => {
+const handleServiceSuccess = async ({ response: data }) => {
   if (data.status === 0) {
     if (!shipOwnerForm.value.documents) {
       shipOwnerForm.value.documents = [];
@@ -873,13 +892,25 @@ const handleServiceSuccess = ({ response: data }) => {
       viewUrl: data.result.viewUrl,
       downloadUrl: data.result.downloadUrl,
     });
+    ElMessage.success("上传成功");
   } else {
     ElMessage.error(data.msg || "上传失败");
   }
 };
 
 // 服务簿删除处理
-const handleServiceRemove = ({ fileIndex }) => {
+const handleServiceRemove = async ({ file, fileIndex }) => {
+  if (file.id) {
+    let { data } = await api.deleteShipOwnerCert({
+      docId: file.id,
+    });
+    if (data.status === 0) {
+      ElMessage.success("删除成功");
+    } else {
+      ElMessage.error(data.msg || "删除失败");
+      return;
+    }
+  }
   const serviceDocs = shipOwnerForm.value.documents.filter(
     (doc) => doc.docType === 3
   );
@@ -1169,10 +1200,13 @@ async function addShip() {
     });
     return;
   }
-  if (!shipOwnerForm.value.shipInfo.mmsi) {
+  if (
+    shipOwnerForm.value.shipInfo?.mmsi?.length != 9 &&
+    shipOwnerForm.value.shipInfo.mmsi != ""
+  ) {
     ElMessage({
       type: "warning",
-      message: "请填写船舶MMSI",
+      message: "请正确填写船舶MMSI",
     });
     return;
   }

+ 1 - 1
src/views/shipSecurityManage/checkShipExamineList.vue

@@ -59,7 +59,7 @@
           v-if="type == 1"
         >
           <template v-slot="scope">
-            {{ subTimeStr(scope.row.createTime) }}
+            {{ subTimeStr(scope.row.createTime, 10) }}
           </template>
         </el-table-column>
         <el-table-column

+ 1 - 1
src/views/shipSecurityManage/checkShipList.vue

@@ -43,7 +43,7 @@
           align="center"
         >
           <template v-slot="scope">
-            {{ subTimeStr(scope.row.createTime) }}
+            {{ subTimeStr(scope.row.createTime, 10) }}
           </template>
         </el-table-column>
       </el-table>

+ 1 - 1
src/views/shipSecurityManage/shipCheckHistoryList.vue

@@ -42,7 +42,7 @@
           align="center"
         >
           <template v-slot="scope">
-            {{ subTimeStr(scope.row.createTime) }}
+            {{ subTimeStr(scope.row.createTime, 10) }}
           </template>
         </el-table-column>
         <el-table-column

+ 1 - 1
src/views/shipSecurityManage/shipCheckTemplateList.vue

@@ -43,7 +43,7 @@
           align="center"
         >
           <template v-slot="scope">
-            {{ subTimeStr(scope.row.createTime) }}
+            {{ subTimeStr(scope.row.createTime, 10) }}
           </template>
         </el-table-column>
         <el-table-column label="操作" min-width="80" align="center">

+ 1 - 1
src/views/workStation/legalAidManage.vue

@@ -45,7 +45,7 @@
         min-width="120"
       >
         <template v-slot="scope">
-          {{ subTimeStr(scope.row.createTime) }}
+          {{ subTimeStr(scope.row.createTime, 10) }}
         </template>
       </el-table-column>
       <el-table-column align="center" label="操作" width="120">