feat: OA(泛微 ecology)登录身份校验 + 公示详情悬浮按钮/PDF缩放

OA 登录校验 (manager/leader 单一可信源 = ecology 合规视图 v_compliance_project_manager):
- ComplianceLoginService: 手机号登录查视图(type=1→manager/type=2→leader), 自动建号 sys_user+biz_person, 角色不匹配软删重建; 密码登录门禁 gateForPasswordLogin
- EcologyDataSourceConfig: 独立只读 JdbcTemplate(ecologyJdbcTemplate) 接泛微库, 不接入主库动态数据源
- SysLoginController: 密码登录前 complianceGate 校验 manager/leader 仍存于视图
- BizAuthController: smsLogin 改走 reconcileForLogin; 发码放行 ecology 视图内未注册手机号
- application*.yml: 新增 spring.datasource.ecology 只读连接(prod/test)
- Login.vue: 登录标题居中微调 + 供应商注册跳生产域名

公示详情 (publicity/:id):
- 右侧悬浮操作按钮从垂直居中改为主区右上(紧贴版心右缘), 中窄屏兜底贴右缘
- PDF 预览 #zoom 由 page-width 改为数值缩放(121), 放大正文占满宽度

文档:
- shouce/ 手册 md 入仓

注: oalogin/ (含 OA 管理员密码的临时笔记) 已加 .gitignore, 不入库
This commit is contained in:
郭庆泰
2026-09-01 20:45:15 +08:00
parent a14d95288c
commit beb9799a06
20 changed files with 2425 additions and 30 deletions
+2 -2
View File
@@ -1,5 +1,5 @@
# 测试环境 API 基路径 (nginx 反向代理前缀)
VITE_APP_BASE_API = '/hegui-api'
VITE_APP_BASE_API = '/hg-api'
# 测试环境静态资源子路径 (nginx 部署在 /hegui/)
VITE_BASE = '/hegui/'
VITE_BASE = '/hg/'
Binary file not shown.

Before

Width:  |  Height:  |  Size: 478 KiB

After

Width:  |  Height:  |  Size: 118 KiB

+5 -4
View File
@@ -21,8 +21,8 @@
<!-- 右侧登录卡片 -->
<section class="login-section">
<div class="login-card">
<h1 class="login-title">{{ loginMode === 'password' ? '账号登录' : '手机号登录' }}</h1>
<p class="login-subtitle">{{ loginMode === 'password' ? '请输入您的账号信息' : '请输入手机号接收验证码' }}</p>
<h1 class="login-title">{{ loginMode === 'password' ? '登录' : '登录' }}</h1>
<!-- <p class="login-subtitle">{{loginMode === 'password' ? '请输入您的账号信息' : '请输入手机号接收验证码' }}</p> -->
<div class="login-tabs">
<span class="tab" :class="{ active: loginMode === 'password' }" @click="switchMode('password')">账号密码登录</span>
@@ -103,7 +103,6 @@
<input type="radio" name="registerUserType" :value="t.value" v-model="registerUserType">
<div class="info">
<div class="name">{{ t.name }}</div>
<div class="desc">{{ t.desc }}</div>
</div>
</label>
</div>
@@ -375,7 +374,7 @@ function confirmRegister() {
// 执行方(供应商)注册: 跳转到独立供应商注册系统, 不走本系统注册页
if (registerUserType.value === 'executor') {
showRoleModal.value = false
window.location.href = 'https://zbsuppliertest.guojustar.com/'
window.location.href = 'https://zbsupplier.guojustar.com/'
return
}
const routeMap = {
@@ -599,11 +598,13 @@ body { margin: 0; padding: 0; }
}
.login-page .login-title{
transform: translateY(-10px);
font-size: 26px;
font-weight: 600;
color: #1f2937;
margin-bottom: 10px;
letter-spacing: 2px;
text-align: center;
}
.login-page .login-subtitle{
+14 -8
View File
@@ -279,11 +279,13 @@ function isImg(url) {
// OSS bucket 设置了 Content-Disposition: attachment, iframe/embed 直接访问会被强制下载.
// 所有 OSS 文件 URL 走 /common/oss/proxy 后端代理 (重写为 inline)
// 必须加 /dev-api 前缀: Vite dev server proxy 只代理 /dev-api/* 到后端, 其他相对 URL 会 SPA fallback 到 index.html
// #toolbar=0 隐藏 Chrome PDF viewer 工具栏, #zoom=page-width 强制 PDF 撑满 iframe 宽度
// #toolbar=0 隐藏 Chrome PDF viewer 工具栏, #zoom=<百分比> 放大 PDF 内容
// 红头文件自带较宽页边距, page-width 会把整页(含边距)缩进 iframe, 正文仍偏小;
// 用数值缩放(如 160)裁掉边距、让正文尽量占满宽度, 数字越大越大/裁得越多
function proxyUrl(url) {
if (!url) return url
if (url.includes('hwtossbamlorgcn.oss-cn-beijing.aliyuncs.com')) {
return import.meta.env.VITE_APP_BASE_API + '/common/oss/proxy?url=' + encodeURIComponent(url) + '#toolbar=0&zoom=page-width'
return import.meta.env.VITE_APP_BASE_API + '/common/oss/proxy?url=' + encodeURIComponent(url) + '#toolbar=0&zoom=121'
}
return url
}
@@ -584,8 +586,6 @@ onBeforeUnmount(() => {
gap: 20px;
background: transparent; /* 不要 card 包裹 */
padding: 24px 0; /* 去掉左右内边距让内容铺满 */
/* 给悬浮按钮留右边距,避免按钮遮住内容 */
padding-right: 80px;
border-radius: 0;
box-shadow: none;
align-items: stretch;
@@ -689,18 +689,24 @@ onBeforeUnmount(() => {
100% { background-position: -200% 0; }
}
/* 悬浮固定到页面右侧中部 - 不占 detail-main 空间 */
/* 悬浮固定到 main 右上, 紧贴版心右侧 - 不占 detail-main 空间 */
.detail-actions {
position: fixed;
right: 24px;
top: 50%;
transform: translateY(-50%);
left: calc(50% + 630px); /* 版心右缘(677) 附近, 按钮右缘略出内容右上角 */
top: 180px;
z-index: 100;
display: flex;
flex-direction: column;
gap: 12px;
width: 132px;
}
/* 中窄屏: 版心右侧放不下按钮时改贴屏幕右缘, 避免溢出 */
@media (max-width: 1660px) and (min-width: 901px) {
.detail-actions {
left: auto;
right: 12px;
}
}
.action-btn {
display: flex; align-items: center; justify-content: center; gap: 6px;
height: 38px; padding: 0 18px;