批量推送代码

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
郭庆泰
2026-08-29 17:52:05 +08:00
co-authored by Claude
parent 36528b6e0c
commit e47f76478b
130 changed files with 3972 additions and 2546 deletions
+84 -79
View File
@@ -25,7 +25,7 @@
<el-form-item label="项目负责人">
<el-select v-model="form.leadUserId" placeholder="请选择合规管理员" filterable clearable :filter-method="searchManagers" style="width:100%">
<el-option v-for="u in managerOptions" :key="u.userId"
:label="`${u.userName}${u.nickName ? ' (' + u.nickName + ')' : ''}`" :value="u.userId" />
:label="`${u.nickName || u.userName}${u.nickName && u.userName ? ' (' + u.userName + ')' : ''}`" :value="u.userId" />
</el-select>
</el-form-item>
</el-col>
@@ -51,19 +51,19 @@
</el-col>
<el-col :span="12">
<el-form-item label="总场次/总期数" prop="totalSessions">
<el-input-number v-model="form.totalSessions" :min="1" style="width:100%" />
<div class="num-input"><el-input-number v-model="form.totalSessions" :min="1" /></div>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="12">
<el-col :span="12">
<el-form-item label="总金额(元)" prop="totalAmount">
<el-input-number v-model="form.totalAmount" :min="0" :precision="2" style="width:100%" />
<div class="num-input"><el-input-number v-model="form.totalAmount" :min="0" :precision="2" /></div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="管理费(元)">
<el-input-number v-model="form.manageFee" :min="0" :precision="2" style="width:100%" />
<div class="num-input"><el-input-number v-model="form.manageFee" :min="0" :precision="2" /></div>
</el-form-item>
</el-col>
</el-row>
@@ -83,14 +83,16 @@
<!-- ========== 第二区块角色劳务设置 ========== -->
<div class="new-card-title">角色劳务设置</div>
<div v-for="(r, idx) in form.roleRows" :key="idx" class="role-row">
<el-select v-model="r.role" placeholder="请选择" style="width:160px" @change="onRoleSelectChange(r)">
<el-option label="主席" value="主席" />
<el-option label="主" value="主" />
<el-option label="讲者" value="讲者" />
<el-option label="点评/评审" value="点评/评审" />
<el-option label="讨论" value="讨论" />
<el-option label="其他" value="其他" />
</el-select>
<div class="role-select">
<el-select v-model="r.role" placeholder="请选择" @change="onRoleSelectChange(r)">
<el-option label="主" value="主" />
<el-option label="主持" value="主持" />
<el-option label="讲者" value="讲者" />
<el-option label="点评/评审" value="点评/评审" />
<el-option label="讨论" value="讨论" />
<el-option label="其他" value="其他" />
</el-select>
</div>
<el-input v-if="r.role === '其他'" v-model="r.customName" placeholder="角色名" class="role-custom" />
<el-input-number v-model="r.amount" :min="0" :precision="2" placeholder="劳务金额" class="role-amount" />
<div class="row-actions">
@@ -104,15 +106,16 @@
<div class="notice-list">
<div v-for="(n, idx) in form.notices" :key="idx" class="notice-row">
<span class="notice-label">{{ n.label }}</span>
<oss-file-uploader
class="notice-uploader"
v-model="n.url"
:dir="`ry8080/project/${n.key}/`"
accept=".pdf,.png,.jpg,.jpeg,.gif,.webp"
:placeholder="`点击上传${n.label}`"
hint="支持 PDF / 图片"
block
/>
<div class="notice-uploader">
<oss-file-uploader
v-model="n.url"
:dir="`ry8080/project/${n.key}/`"
accept=".pdf,.png,.jpg,.jpeg,.gif,.webp"
:placeholder="`点击上传${n.label}`"
hint="支持 PDF / 图片"
block
/>
</div>
</div>
</div>
@@ -397,9 +400,14 @@ async function submit(mode = 'save') {
.hint-text p { margin-bottom: 4px; }
.hint-text p:last-child { margin-bottom: 0; }
.role-row { display: flex; align-items: center; gap: 12px; padding: 6px 0; }
.role-select { width: 160px; flex-shrink: 0; display: flex; align-items: center; }
.role-custom { flex: 1; max-width: 180px; }
.role-amount { width: 180px; }
.row-actions { display: flex; gap: 8px; }
/* 项目信息数字输入框: 桌面限制宽度, 不撑满双列 */
.num-input { width: 200px; max-width: 100%; }
/* 公告文件上传: 限制最大宽度, 上传按钮不要太长 */
.notice-uploader { flex: 1; min-width: 0; max-width: 480px; }
.notice-list { display: flex; flex-direction: column; gap: 10px; }
.notice-row { display: flex; align-items: stretch; gap: 12px; margin-bottom: 12px; }
.notice-label {
@@ -437,82 +445,79 @@ async function submit(mode = 'save') {
/* ========================================
移动端适配 (≤768px)
- 卡片 padding 收窄
- 工具栏横向滚动
- filter-form: label 与输入框横向
- 表格字号收紧
- el-row 双列 → 单列, form-item 横向 (label-width=120px 桌面默认沿用, 让 Element Plus 自然对齐)
- 角色劳务行 / 公告文件行 / 底部按钮: 紧凑布局
======================================== */
@media (max-width: 768px) {
/* 卡片 padding */
.page-card { padding: 12px !important; border-radius: 4px !important; }
.manager-projects-new { padding: 12px !important; border-radius: 4px !important; }
.breadcrumb { font-size: 12px !important; margin-bottom: 8px !important; }
/* 工具栏: 横向滚动 */
.toolbar {
flex-wrap: nowrap !important;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
padding-bottom: 6px;
margin-bottom: 8px !important;
scrollbar-width: thin;
}
.toolbar::-webkit-scrollbar { height: 4px; }
.toolbar::-webkit-scrollbar-thumb { background: var(--brand-slate-200); border-radius: 2px; }
.toolbar :deep(.action-btn),
.toolbar :deep(.el-button) {
flex-shrink: 0;
font-size: 12px !important;
padding: 0 10px !important;
height: 30px !important;
/* 章节标题间距收紧 */
.new-card-title { font-size: 13px !important; margin: 12px 0 8px !important; }
/* 双列 → 单列: el-row 强制 block, el-col 100% 宽 */
.project-form :deep(.el-row) { display: block !important; }
.project-form :deep(.el-col) {
width: 100% !important;
max-width: 100% !important;
flex: 0 0 100% !important;
display: block !important;
}
/* filter-form: 横向 (label 左 + input 右) */
.filter-form {
/* form-item: 横向 label + content, flex-start 让 error message 占独立行
不动 __label 的 float/width/height/line-height — Element Plus 自带 label-width=120px
自然右对齐 + 跟随 content 行高, 不会参差不齐 */
.project-form :deep(.el-form-item) {
display: flex !important;
flex-direction: column !important;
align-items: stretch !important;
gap: 10px !important;
}
.filter-form :deep(.el-form-item) {
display: flex !important;
align-items: center !important;
align-items: flex-start !important;
margin-right: 0 !important;
margin-bottom: 0 !important;
}
.filter-form :deep(.el-form-item__label) {
float: none !important;
width: auto !important;
min-width: 80px !important;
text-align: right !important;
padding: 0 8px 0 0 !important;
font-size: 13px !important;
color: var(--el-text-color-regular) !important;
line-height: 32px !important;
height: 32px !important;
}
.filter-form :deep(.el-form-item__content) {
margin-left: 0 !important;
line-height: 32px !important;
.project-form :deep(.el-form-item__content) {
flex: 1 !important;
min-width: 0 !important;
}
/* 强制所有控件全宽 */
.filter-form :deep(.el-select),
.filter-form :deep(.el-input),
.filter-form :deep(.el-date-editor),
.filter-form :deep(.el-button),
.filter-form :deep(.el-cascader) {
/* 表单控件全宽, 强制拉伸 (项目信息 section 的输入控件全宽)
注意: .role-row 内的控件有 .role-select/.role-amount 容器保护, 不会吃这条规则 */
.project-form :deep(.el-form-item .el-select),
.project-form :deep(.el-form-item .el-input),
.project-form :deep(.el-form-item .el-textarea),
.project-form :deep(.el-form-item .el-date-editor),
.project-form :deep(.el-form-item .el-input-number),
.project-form :deep(.el-form-item .el-cascader) {
width: 100% !important;
min-width: 0 !important;
margin-left: 0 !important;
margin-right: 0 !important;
display: block !important;
}
.filter-form :deep(.el-button + .el-button) {
margin-top: 8px !important;
}
/* 表格字号收紧 */
:deep(.el-table) { font-size: 12px !important; }
/* 数字输入框: 移动端占满 (有 .num-input 容器保护, 不会挤压其它数字输入) */
.project-form .num-input { width: 100% !important; }
/* 角色劳务行: 保持桌面原有横向布局 (角色/金额/删除) 一行, 不被表单规则拉宽 */
.role-row { flex-wrap: wrap !important; gap: 6px !important; }
.role-row .role-select { width: 110px !important; flex-shrink: 0; display: flex !important; align-items: center !important; }
.role-row .role-amount { width: 130px !important; flex-shrink: 0; }
.role-row .row-actions { margin-left: auto; }
/* 公告文件行: 横向 (label + uploader), label 顶部对齐 */
.notice-row { gap: 8px !important; margin-bottom: 10px !important; }
.notice-label {
width: 70px !important;
font-size: 12px !important;
}
/* 移动端: uploader 限制固定宽度 280px (不撑满不溢出) */
.notice-uploader { width: 280px !important; max-width: 100% !important; min-width: 0 !important; flex: none !important; }
/* 底部按钮: 等宽并排 */
.form-actions :deep(.el-form-item__content) {
display: flex !important;
flex-wrap: wrap !important;
gap: 8px !important;
}
.form-actions :deep(.el-button) {
flex: 1 1 0 !important;
width: 0 !important;
}
}
</style>