颜琼丽 13 часов назад
Родитель
Сommit
c91f06e00e

+ 1 - 0
jd-logistics-ui-v3/.env.development

@@ -12,3 +12,4 @@ VITE_APP_API_BASE_URL = 'http://192.168.100.92:8080'
 #学富
 #VITE_APP_API_BASE_URL = 'http://192.168.101.250:8080'
 
+

+ 1 - 1
jd-logistics-ui-v3/.env.staging

@@ -7,7 +7,7 @@ VITE_APP_ENV = 'production'
 # 瑞鲸速达平台/生产环境
 VITE_APP_BASE_API = '/dev-api'
 
-VITE_APP_API_BASE_URL = 'http://192.168.101.77:8080'
+VITE_APP_API_BASE_URL = 'http://localhost:8080'
 
 # 是否在打包时开启压缩,支持 gzip 和 brotli
 VITE_BUILD_COMPRESS = gzip

+ 133 - 29
jd-logistics-ui-v3/src/views/login.vue

@@ -42,7 +42,18 @@
             <img :src="codeUrl" @click="getCode" class="login-code-img"/>
           </div>
         </el-form-item>
-        <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">记住密码</el-checkbox>
+        <el-checkbox v-model="loginForm.rememberMe">记住密码</el-checkbox>
+
+        <!-- 同意用户协议和隐私协议复选框 -->
+        <el-form-item prop="agree" style="margin-bottom: 20px;">
+          <el-checkbox v-model="loginForm.agree">
+            同意
+            <el-link type="primary" :underline="false" href="/user-agreement" target="_blank">《用户协议》</el-link>
+            和
+            <el-link type="primary" :underline="false" href="/privacy-policy" target="_blank">《隐私政策》</el-link>
+          </el-checkbox>
+        </el-form-item>
+
         <el-form-item style="width:100%;">
           <el-button
               :loading="loading"
@@ -60,7 +71,16 @@
         </el-form-item>
       </el-form>
     </div>
-    <!--  底部  -->
+
+    <!-- Cookie同意横幅(深色字体,浅色背景) -->
+    <div v-if="showCookieBanner" class="cookie-banner">
+      <span class="cookie-text">
+        我们将使用Cookie优化您的浏览体验,并通过第三方SDK实现网站功能。如果您想继续浏览本网站,请您同意使用Cookie和隐私条款。
+      </span>
+      <el-button type="primary" size="small" @click="acceptCookies">同意</el-button>
+    </div>
+
+    <!-- 底部版权信息 -->
     <div class="el-login-footer">
       <span>{{ footerContent }}</span>
     </div>
@@ -73,6 +93,9 @@ import Cookies from "js-cookie"
 import { encrypt, decrypt } from "@/utils/jsencrypt"
 import useUserStore from '@/store/modules/user'
 import defaultSettings from '@/settings'
+import { ElMessage } from "element-plus"
+import { ref, watch, getCurrentInstance, onMounted } from 'vue'
+import { useRoute, useRouter } from 'vue-router'
 
 const title = import.meta.env.VITE_APP_TITLE
 const footerContent = defaultSettings.footerContent
@@ -81,48 +104,59 @@ const route = useRoute()
 const router = useRouter()
 const { proxy } = getCurrentInstance()
 
+// 登录表单数据
 const loginForm = ref({
   username: "",
   password: "",
   rememberMe: false,
   code: "",
-  uuid: ""
+  uuid: "",
+  agree: false
 })
 
+// 表单验证规则
 const loginRules = {
   username: [{ required: true, trigger: "blur", message: "请输入您的账号" }],
   password: [{ required: true, trigger: "blur", message: "请输入您的密码" }],
-  code: [{ required: true, trigger: "change", message: "请输入验证码" }]
+  code: [{ required: true, trigger: "change", message: "请输入验证码" }],
+  agree: [{ required: true, trigger: "change", message: "请同意用户协议和隐私政策" }]
 }
 
 const codeUrl = ref("")
 const loading = ref(false)
-// 验证码开关
-const captchaEnabled = ref(true)
-// 注册开关
-const register = ref(false)
+const captchaEnabled = ref(true)   // 验证码开关
+const register = ref(false)        // 注册开关
 const redirect = ref(undefined)
+const showCookieBanner = ref(false) // 控制Cookie横幅显示
 
+// 监听重定向地址
 watch(route, (newRoute) => {
-    redirect.value = newRoute.query && newRoute.query.redirect
+  redirect.value = newRoute.query && newRoute.query.redirect
 }, { immediate: true })
 
+// 登录处理
 function handleLogin() {
-  proxy.$refs.loginRef.validate(valid => {
+  if (!proxy.$refs.loginRef) return
+
+  proxy.$refs.loginRef.validate((valid) => {
+    if (!loginForm.value.agree) {
+      ElMessage.warning('请先同意用户协议和隐私协议')
+      return
+    }
+
     if (valid) {
       loading.value = true
-      // 勾选了需要记住密码设置在 cookie 中设置记住用户名和密码
+      // 记住密码
       if (loginForm.value.rememberMe) {
         Cookies.set("username", loginForm.value.username, { expires: 30 })
         Cookies.set("password", encrypt(loginForm.value.password), { expires: 30 })
         Cookies.set("rememberMe", loginForm.value.rememberMe, { expires: 30 })
       } else {
-        // 否则移除
         Cookies.remove("username")
         Cookies.remove("password")
         Cookies.remove("rememberMe")
       }
-      // 调用action的登录方法
+
       userStore.login(loginForm.value).then(() => {
         const query = route.query
         const otherQueryParams = Object.keys(query).reduce((acc, cur) => {
@@ -134,7 +168,6 @@ function handleLogin() {
         router.push({ path: redirect.value || "/", query: otherQueryParams })
       }).catch(() => {
         loading.value = false
-        // 重新获取验证码
         if (captchaEnabled.value) {
           getCode()
         }
@@ -143,6 +176,7 @@ function handleLogin() {
   })
 }
 
+// 获取验证码
 function getCode() {
   getCodeImg().then(res => {
     captchaEnabled.value = res.captchaEnabled === undefined ? true : res.captchaEnabled
@@ -153,19 +187,54 @@ function getCode() {
   })
 }
 
+// 从Cookie读取记住的密码
 function getCookie() {
-  const username = Cookies.get("username")
-  const password = Cookies.get("password")
-  const rememberMe = Cookies.get("rememberMe")
-  loginForm.value = {
-    username: username === undefined ? loginForm.value.username : username,
-    password: password === undefined ? loginForm.value.password : decrypt(password),
-    rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
+  try {
+    const username = Cookies.get("username")
+    const password = Cookies.get("password")
+    const rememberMe = Cookies.get("rememberMe")
+
+    if (username !== undefined) loginForm.value.username = username
+    if (password !== undefined) {
+      try {
+        loginForm.value.password = decrypt(password)
+      } catch (e) {
+        console.warn('密码解密失败', e)
+        loginForm.value.password = ''
+      }
+    }
+    if (rememberMe !== undefined) loginForm.value.rememberMe = Boolean(rememberMe)
+  } catch (e) {
+    console.error('读取Cookie失败', e)
+  }
+}
+
+// 检查是否已经同意过Cookie(使用localStorage)
+function checkCookieConsent() {
+  const consented = localStorage.getItem('cookieConsent')
+  if (consented === 'true') {
+    showCookieBanner.value = false
+    // 如果之前同意过,自动勾选协议复选框
+    loginForm.value.agree = true
+  } else {
+    showCookieBanner.value = true
   }
 }
 
-getCode()
-getCookie()
+// 同意Cookie
+function acceptCookies() {
+  localStorage.setItem('cookieConsent', 'true')
+  showCookieBanner.value = false
+  loginForm.value.agree = true  // 同时勾选协议复选框
+  ElMessage.success('感谢您的同意')
+}
+
+// 初始化
+onMounted(() => {
+  getCode()
+  getCookie()
+  checkCookieConsent()
+})
 </script>
 
 <style lang='scss' scoped>
@@ -185,7 +254,6 @@ getCookie()
   right: 0;
   padding-top: 5%;
 
-
   .title-logo {
     margin: 30px auto;
     color: #333;
@@ -202,7 +270,6 @@ getCookie()
     font-size: 24rpx;
     line-height: 32rpx;
   }
-
 }
 
 .login-form {
@@ -236,6 +303,46 @@ getCookie()
     vertical-align: middle;
   }
 }
+.login-code-img {
+  height: 40px;
+}
+
+/* Cookie同意横幅样式:深色字体,浅色背景,固定在底部 */
+.cookie-banner {
+  position: fixed;
+  bottom: 40px;          /* 位于版权信息上方 */
+  left: 0;
+  width: 100%;
+  background-color: #f9f9f9;  /* 浅色背景 */
+  color: #333;                /* 深色字体 */
+  padding: 12px 20px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  gap: 20px;
+  box-shadow: 0 -2px 8px rgba(0,0,0,0.1);
+  z-index: 1000;
+  font-size: 14px;
+  flex-wrap: wrap;
+  text-align: center;
+}
+.cookie-text {
+  max-width: 70%;
+  line-height: 1.5;
+}
+.el-button--small {
+  background-color: #409EFF;
+  color: white;
+  border: none;
+  padding: 8px 16px;
+  border-radius: 4px;
+  cursor: pointer;
+  font-weight: 500;
+}
+.el-button--small:hover {
+  background-color: #66b1ff;
+}
+
 .el-login-footer {
   height: 40px;
   line-height: 40px;
@@ -248,7 +355,4 @@ getCookie()
   font-size: 12px;
   letter-spacing: 1px;
 }
-.login-code-img {
-  height: 40px;
-}
-</style>
+</style>

+ 11 - 11
jd-logistics-ui-v3/src/views/logistics/monthSummary/costList.vue

@@ -33,7 +33,7 @@
         </template>
       </el-table-column>
       <el-table-column label="费用(元)" align="center" prop="rateAmount" />aaaaa
-      <el-table-column label="经手人" align="center" prop="userName" />
+<!--      <el-table-column label="经手人" align="center" prop="userName" />-->
       <el-table-column label="增值费用" align="center" prop="feeItemName" />
 <!--      <el-table-column label="备注" align="center" prop="remark" show-overflow-tooltip/>-->
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="100" v-if="routeQuery.status == 1">
@@ -94,21 +94,21 @@
               <el-input v-model="form.rateAmount" disabled />
             </el-form-item>
           </el-col>
-          <el-col :span="12">
-            <el-form-item label="经手人" prop="userName">
-              <el-input v-model="form.userName" disabled />
-            </el-form-item>
-          </el-col>
+<!--          <el-col :span="12">-->
+<!--            <el-form-item label="经手人" prop="userName">-->
+<!--              <el-input v-model="form.userName" disabled />-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
           <el-col :span="12">
             <el-form-item label="增值费用" prop="feeItemName">
               <el-input v-model="form.feeItemName" disabled />
             </el-form-item>
           </el-col>
-          <el-col :span="24">
-            <el-form-item label="备注" prop="remark">
-              <el-input v-model="form.remark" disabled />
-            </el-form-item>
-          </el-col>
+<!--          <el-col :span="24">-->
+<!--            <el-form-item label="备注" prop="remark">-->
+<!--              <el-input v-model="form.remark" disabled />-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
           <el-col :span="12">
             <el-form-item label="调账金额" prop="adjustAmount">
               <el-input v-model="form.adjustAmount" placeholder="请输入调账金额" />

+ 2 - 2
jd-logistics-ui-v3/src/views/system/role/index.vue

@@ -170,7 +170,7 @@
             </el-form-item>
             <el-form-item label="菜单权限">
                <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">展开/折叠</el-checkbox>
-               <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">全选/全不选</el-checkbox>
+<!--               <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">全选/全不选</el-checkbox>-->
                <el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">父子联动</el-checkbox>
                <el-tree
                   class="tree-border"
@@ -216,7 +216,7 @@
             </el-form-item>
             <el-form-item label="数据权限" v-show="form.dataScope == 2">
                <el-checkbox v-model="deptExpand" @change="handleCheckedTreeExpand($event, 'dept')">展开/折叠</el-checkbox>
-               <el-checkbox v-model="deptNodeAll" @change="handleCheckedTreeNodeAll($event, 'dept')">全选/全不选</el-checkbox>
+<!--               <el-checkbox v-model="deptNodeAll" @change="handleCheckedTreeNodeAll($event, 'dept')">全选/全不选</el-checkbox>-->
                <el-checkbox v-model="form.deptCheckStrictly" @change="handleCheckedTreeConnect($event, 'dept')">父子联动</el-checkbox>
                <el-tree
                   class="tree-border"