Commit 34e69b2dff4e32ae0006c87adf2d5b5d62484630
1 parent
f84588f8
feat: add column settings dropdown and enhance table display
- Introduced a dropdown for column settings in list view, allowing users to customize visible columns and their order via drag-and-drop. - Updated table columns to dynamically render based on user-selected visibility, improving the overall user experience. - Enhanced the display of customer information, including merging customer name and ID, and added tooltips for better clarity. - Refactored existing table columns to utilize a more flexible structure for rendering based on visibility settings.
Showing
1 changed file
with
254 additions
and
78 deletions
antis-ncc-admin/src/views/lqKhxx/index.vue
| ... | ... | @@ -148,6 +148,28 @@ |
| 148 | 148 | </el-button-group> |
| 149 | 149 | </div> |
| 150 | 150 | <div class="toolbar-right"> |
| 151 | + <el-dropdown v-if="viewMode === 'list'" trigger="click" hide-on-click="false"> | |
| 152 | + <el-button size="small" icon="el-icon-setting"> | |
| 153 | + 列设置<i class="el-icon-arrow-down el-icon--right"></i> | |
| 154 | + </el-button> | |
| 155 | + <el-dropdown-menu slot="dropdown" class="column-setting-dropdown"> | |
| 156 | + <div class="column-setting-panel" @click.stop> | |
| 157 | + <div class="column-setting-title">显示列(拖拽排序)</div> | |
| 158 | + <draggable v-model="tableColumnsOrder" | |
| 159 | + :options="{ handle: '.drag-handle', animation: 150, forceFallback: true, ghostClass: 'column-drag-ghost' }" | |
| 160 | + class="column-draggable-list" @end="saveColumnConfig"> | |
| 161 | + <div v-for="colId in tableColumnsOrder" :key="colId" | |
| 162 | + class="column-draggable-item"> | |
| 163 | + <i class="el-icon-rank drag-handle"></i> | |
| 164 | + <el-checkbox v-model="tableColumnsVisible[colId]" | |
| 165 | + @change="saveColumnConfig"> | |
| 166 | + {{ (tableColumnsMeta[colId] && tableColumnsMeta[colId].label) || colId }} | |
| 167 | + </el-checkbox> | |
| 168 | + </div> | |
| 169 | + </draggable> | |
| 170 | + </div> | |
| 171 | + </el-dropdown-menu> | |
| 172 | + </el-dropdown> | |
| 151 | 173 | <el-radio-group v-model="viewMode" size="small" @change="switchView"> |
| 152 | 174 | <el-radio-button label="list"> |
| 153 | 175 | <i class="el-icon-s-grid"></i> 列表 |
| ... | ... | @@ -288,27 +310,29 @@ |
| 288 | 310 | </div> |
| 289 | 311 | </div> |
| 290 | 312 | </div> |
| 291 | - <NCC-table v-if="viewMode === 'list'" v-loading="listLoading" :data="list" | |
| 292 | - @selection-change="handleSelectionChange" | |
| 313 | + <NCC-table v-if="viewMode === 'list'" v-loading="listLoading" :data="list" has-c | |
| 314 | + @selection-change="handleSelectionChange" @sort-change="handleSortChange" | |
| 293 | 315 | :header-cell-style="{ background: '#fafafa', color: '#262626', fontWeight: '600' }"> |
| 294 | - <!-- 客户id --> | |
| 295 | - <el-table-column label="客户ID" align="left" width="150px" fixed="left"> | |
| 316 | + <template v-for="colId in visibleColumns"> | |
| 317 | + <!-- 客户名称+档案号(合并,不单独显示客户ID) --> | |
| 318 | + <el-table-column v-if="colId === 'khmc'" key="khmc" label="客户名称" align="left" | |
| 319 | + class-name="column-khmc-full" | |
| 320 | + :min-width="tableColumnsMeta.khmc.width" :sortable="tableColumnsMeta.khmc.sortable ? 'custom' : false" | |
| 321 | + :prop="tableColumnsMeta.khmc.sidx"> | |
| 296 | 322 | <template slot-scope="scope"> |
| 297 | - <span class="cell-text-plain muted">{{ scope.row.id || '无' }}</span> | |
| 323 | + <el-tooltip :content="(scope.row.khmc || '无') + (scope.row.dah ? ' (' + scope.row.dah + ')' : '')" placement="top"> | |
| 324 | + <div class="table-cell-with-icon table-cell-name-full"> | |
| 325 | + <i class="el-icon-user-solid cell-icon primary"></i> | |
| 326 | + <span class="cell-text cell-text-full">{{ scope.row.khmc || '无' }}</span> | |
| 327 | + <span v-if="scope.row.dah" class="cell-text-plain muted" style="margin-left:6px">({{ scope.row.dah }})</span> | |
| 328 | + </div> | |
| 329 | + </el-tooltip> | |
| 298 | 330 | </template> |
| 299 | 331 | </el-table-column> |
| 300 | - <!-- 客户名称 --> | |
| 301 | - <el-table-column label="客户名称" align="left" width="100px" fixed="left"> | |
| 302 | - <template slot-scope="scope"> | |
| 303 | - <div class="table-cell-with-icon"> | |
| 304 | - <i class="el-icon-user-solid cell-icon primary"></i> | |
| 305 | - <span class="cell-text">{{ scope.row.khmc || '无' }}</span> | |
| 306 | - </div> | |
| 307 | - </template> | |
| 308 | - </el-table-column> | |
| 309 | - | |
| 310 | 332 | <!-- 手机号 --> |
| 311 | - <el-table-column label="手机号" align="left" width="130px" fixed="left"> | |
| 333 | + <el-table-column v-else-if="colId === 'sjh'" key="sjh" label="手机号" align="left" | |
| 334 | + :min-width="tableColumnsMeta.sjh.width" :sortable="tableColumnsMeta.sjh.sortable ? 'custom' : false" | |
| 335 | + :prop="tableColumnsMeta.sjh.sidx"> | |
| 312 | 336 | <template slot-scope="scope"> |
| 313 | 337 | <div class="table-cell-with-icon"> |
| 314 | 338 | <i class="el-icon-mobile-phone cell-icon success"></i> |
| ... | ... | @@ -316,17 +340,21 @@ |
| 316 | 340 | </div> |
| 317 | 341 | </template> |
| 318 | 342 | </el-table-column> |
| 319 | - | |
| 320 | - <!-- 档案号 --> | |
| 321 | - <el-table-column label="档案号" align="left" width="150px"> | |
| 343 | + <!-- 归属门店 --> | |
| 344 | + <el-table-column v-else-if="colId === 'gsmd'" key="gsmd" label="归属门店" align="left" | |
| 345 | + :min-width="tableColumnsMeta.gsmd.width" :sortable="tableColumnsMeta.gsmd.sortable ? 'custom' : false" | |
| 346 | + :prop="tableColumnsMeta.gsmd.sidx"> | |
| 322 | 347 | <template slot-scope="scope"> |
| 323 | - <span class="cell-text-plain">{{ scope.row.dah || '无' }}</span> | |
| 348 | + <div class="table-cell-with-icon"> | |
| 349 | + <i class="el-icon-office-building cell-icon info"></i> | |
| 350 | + <span class="cell-text">{{ scope.row.gsmdName || '无' }}</span> | |
| 351 | + </div> | |
| 324 | 352 | </template> |
| 325 | 353 | </el-table-column> |
| 326 | - | |
| 327 | - | |
| 328 | 354 | <!-- 性别 --> |
| 329 | - <el-table-column label="性别" align="center" width="70px"> | |
| 355 | + <el-table-column v-else-if="colId === 'xb'" key="xb" label="性别" align="center" | |
| 356 | + :min-width="tableColumnsMeta.xb.width" :sortable="tableColumnsMeta.xb.sortable ? 'custom' : false" | |
| 357 | + :prop="tableColumnsMeta.xb.sidx"> | |
| 330 | 358 | <template slot-scope="scope"> |
| 331 | 359 | <el-tag :type="scope.row.xb === '男' ? 'primary' : scope.row.xb === '女' ? 'danger' : 'info'" |
| 332 | 360 | size="small" effect="plain"> |
| ... | ... | @@ -334,56 +362,46 @@ |
| 334 | 362 | </el-tag> |
| 335 | 363 | </template> |
| 336 | 364 | </el-table-column> |
| 337 | - | |
| 338 | - <!-- 归属门店 --> | |
| 339 | - <el-table-column label="归属门店" align="left" width="120px"> | |
| 340 | - <template slot-scope="scope"> | |
| 341 | - <div class="table-cell-with-icon"> | |
| 342 | - <i class="el-icon-office-building cell-icon info"></i> | |
| 343 | - <span class="cell-text">{{ scope.row.gsmdName || '无' }}</span> | |
| 344 | - </div> | |
| 345 | - </template> | |
| 346 | - </el-table-column> | |
| 347 | - | |
| 348 | 365 | <!-- 客户类型 --> |
| 349 | - <el-table-column label="客户类型" align="center" width="100px"> | |
| 366 | + <el-table-column v-else-if="colId === 'khlx'" key="khlx" label="客户类型" align="center" | |
| 367 | + :min-width="tableColumnsMeta.khlx.width" :sortable="tableColumnsMeta.khlx.sortable ? 'custom' : false" | |
| 368 | + :prop="tableColumnsMeta.khlx.sidx"> | |
| 350 | 369 | <template slot-scope="scope"> |
| 351 | 370 | <span class="cell-text-plain">{{ scope.row.khlxName || '无' }}</span> |
| 352 | 371 | </template> |
| 353 | 372 | </el-table-column> |
| 354 | 373 | <!-- 健康师 --> |
| 355 | - <el-table-column label="健康师" align="left" width="70px"> | |
| 374 | + <el-table-column v-else-if="colId === 'mainHealthUser'" key="mainHealthUser" label="健康师" align="left" :min-width="tableColumnsMeta.mainHealthUser.width"> | |
| 356 | 375 | <template slot-scope="scope"> |
| 357 | 376 | <span class="cell-text-plain">{{ scope.row.mainHealthUserName || '无' }}</span> |
| 358 | 377 | </template> |
| 359 | 378 | </el-table-column> |
| 360 | 379 | <!-- 负责顾问 --> |
| 361 | - <el-table-column label="负责顾问" align="left" width="80px"> | |
| 380 | + <el-table-column v-else-if="colId === 'subHealthUser'" key="subHealthUser" label="负责顾问" align="left" :min-width="tableColumnsMeta.subHealthUser.width"> | |
| 362 | 381 | <template slot-scope="scope"> |
| 363 | 382 | <span class="cell-text-plain">{{ scope.row.subHealthUserName || '无' }}</span> |
| 364 | 383 | </template> |
| 365 | 384 | </el-table-column> |
| 366 | 385 | <!-- 进店渠道 --> |
| 367 | - <el-table-column label="进店渠道" align="left" width="100px"> | |
| 386 | + <el-table-column v-else-if="colId === 'jdqd'" key="jdqd" label="进店渠道" align="left" :min-width="tableColumnsMeta.jdqd.width"> | |
| 368 | 387 | <template slot-scope="scope"> |
| 369 | 388 | <span class="cell-text-plain">{{ scope.row.jdqd || '无' }}</span> |
| 370 | 389 | </template> |
| 371 | 390 | </el-table-column> |
| 372 | 391 | <!-- 推荐人 --> |
| 373 | - <el-table-column label="推荐人" align="left" width="80px"> | |
| 392 | + <el-table-column v-else-if="colId === 'tjr'" key="tjr" label="推荐人" align="left" :min-width="tableColumnsMeta.tjr.width"> | |
| 374 | 393 | <template slot-scope="scope"> |
| 375 | 394 | <span class="cell-text-plain">{{ scope.row.tjrName || '无' }}</span> |
| 376 | 395 | </template> |
| 377 | 396 | </el-table-column> |
| 378 | 397 | <!-- 拓客人员 --> |
| 379 | - <el-table-column label="拓客人员" align="left" width="80px"> | |
| 398 | + <el-table-column v-else-if="colId === 'expandUser'" key="expandUser" label="拓客人员" align="left" :min-width="tableColumnsMeta.expandUser.width"> | |
| 380 | 399 | <template slot-scope="scope"> |
| 381 | 400 | <span class="cell-text-plain">{{ scope.row.expandUserName || '无' }}</span> |
| 382 | 401 | </template> |
| 383 | 402 | </el-table-column> |
| 384 | - | |
| 385 | 403 | <!-- 会员类型 --> |
| 386 | - <el-table-column label="会员类型" align="center" min-width="130"> | |
| 404 | + <el-table-column v-else-if="colId === 'memberType'" key="memberType" label="会员类型" align="center" :min-width="tableColumnsMeta.memberType.width"> | |
| 387 | 405 | <template slot-scope="scope"> |
| 388 | 406 | <div class="member-tags"> |
| 389 | 407 | <el-tag v-if="scope.row.isBeautyMember === 1" type="success" size="mini" |
| ... | ... | @@ -402,7 +420,9 @@ |
| 402 | 420 | </el-table-column> |
| 403 | 421 | |
| 404 | 422 | <!-- 消费等级 --> |
| 405 | - <el-table-column label="消费等级" align="center" width="90px"> | |
| 423 | + <el-table-column v-else-if="colId === 'consumeLevel'" key="consumeLevel" label="消费等级" align="center" | |
| 424 | + :min-width="tableColumnsMeta.consumeLevel.width" :sortable="tableColumnsMeta.consumeLevel.sortable ? 'custom' : false" | |
| 425 | + :prop="tableColumnsMeta.consumeLevel.sidx"> | |
| 406 | 426 | <template slot-scope="scope"> |
| 407 | 427 | <el-tag :type="getConsumeLevelType(scope.row.consumeLevel)" size="small" effect="dark"> |
| 408 | 428 | {{ getConsumeLevelName(scope.row.consumeLevel) }} |
| ... | ... | @@ -411,42 +431,54 @@ |
| 411 | 431 | </el-table-column> |
| 412 | 432 | |
| 413 | 433 | <!-- 开卡总金额 --> |
| 414 | - <el-table-column label="开卡总金额" align="right" width="120"> | |
| 434 | + <el-table-column v-else-if="colId === 'totalBillingAmount'" key="totalBillingAmount" label="开卡总金额" align="right" | |
| 435 | + :min-width="tableColumnsMeta.totalBillingAmount.width" :sortable="tableColumnsMeta.totalBillingAmount.sortable ? 'custom' : false" | |
| 436 | + :prop="tableColumnsMeta.totalBillingAmount.sidx"> | |
| 415 | 437 | <template slot-scope="scope"> |
| 416 | 438 | <span class="amount-text primary">{{ formatMoney(scope.row.totalBillingAmount) }}</span> |
| 417 | 439 | </template> |
| 418 | 440 | </el-table-column> |
| 419 | 441 | |
| 420 | - <!-- 剩余权益总金额 --> | |
| 421 | - <el-table-column label="剩余权益" align="right" width="120"> | |
| 442 | + <!-- 剩余权益 --> | |
| 443 | + <el-table-column v-else-if="colId === 'remainingRightsAmount'" key="remainingRightsAmount" label="剩余权益" align="right" | |
| 444 | + :min-width="tableColumnsMeta.remainingRightsAmount.width" :sortable="tableColumnsMeta.remainingRightsAmount.sortable ? 'custom' : false" | |
| 445 | + :prop="tableColumnsMeta.remainingRightsAmount.sidx"> | |
| 422 | 446 | <template slot-scope="scope"> |
| 423 | 447 | <span class="amount-text success">{{ formatMoney(scope.row.remainingRightsAmount) }}</span> |
| 424 | 448 | </template> |
| 425 | 449 | </el-table-column> |
| 426 | 450 | |
| 427 | - <!-- 首次到店时间 --> | |
| 428 | - <el-table-column label="首次到店" align="left" width="110"> | |
| 451 | + <!-- 首次到店 --> | |
| 452 | + <el-table-column v-else-if="colId === 'firstVisitTime'" key="firstVisitTime" label="首次到店" align="left" | |
| 453 | + :min-width="tableColumnsMeta.firstVisitTime.width" :sortable="tableColumnsMeta.firstVisitTime.sortable ? 'custom' : false" | |
| 454 | + :prop="tableColumnsMeta.firstVisitTime.sidx"> | |
| 429 | 455 | <template slot-scope="scope"> |
| 430 | 456 | <span class="cell-text-plain muted">{{ formatDate(scope.row.firstVisitTime) || '无' }}</span> |
| 431 | 457 | </template> |
| 432 | 458 | </el-table-column> |
| 433 | 459 | |
| 434 | - <!-- 最后到店时间 --> | |
| 435 | - <el-table-column label="最后到店" align="left" width="110"> | |
| 460 | + <!-- 最后到店 --> | |
| 461 | + <el-table-column v-else-if="colId === 'lastVisitTime'" key="lastVisitTime" label="最后到店" align="left" | |
| 462 | + :min-width="tableColumnsMeta.lastVisitTime.width" :sortable="tableColumnsMeta.lastVisitTime.sortable ? 'custom' : false" | |
| 463 | + :prop="tableColumnsMeta.lastVisitTime.sidx"> | |
| 436 | 464 | <template slot-scope="scope"> |
| 437 | 465 | <span class="cell-text-plain muted">{{ formatDate(scope.row.lastVisitTime) || '无' }}</span> |
| 438 | 466 | </template> |
| 439 | 467 | </el-table-column> |
| 440 | 468 | |
| 441 | - <!-- 到店天数 --> | |
| 442 | - <el-table-column label="到店次数" align="center" width="90px"> | |
| 469 | + <!-- 到店次数 --> | |
| 470 | + <el-table-column v-else-if="colId === 'visitDays'" key="visitDays" label="到店次数" align="center" | |
| 471 | + :min-width="tableColumnsMeta.visitDays.width" :sortable="tableColumnsMeta.visitDays.sortable ? 'custom' : false" | |
| 472 | + :prop="tableColumnsMeta.visitDays.sidx"> | |
| 443 | 473 | <template slot-scope="scope"> |
| 444 | 474 | <el-tag size="small" type="info" effect="plain">{{ scope.row.visitDays || 0 }}次</el-tag> |
| 445 | 475 | </template> |
| 446 | 476 | </el-table-column> |
| 447 | 477 | |
| 448 | 478 | <!-- 沉睡天数 --> |
| 449 | - <el-table-column label="沉睡天数" align="center" width="90px"> | |
| 479 | + <el-table-column v-else-if="colId === 'sleepDays'" key="sleepDays" label="沉睡天数" align="center" | |
| 480 | + :min-width="tableColumnsMeta.sleepDays.width" :sortable="tableColumnsMeta.sleepDays.sortable ? 'custom' : false" | |
| 481 | + :prop="tableColumnsMeta.sleepDays.sidx"> | |
| 450 | 482 | <template slot-scope="scope"> |
| 451 | 483 | <el-tag size="small" :type="scope.row.sleepDays > 30 ? 'warning' : 'success'" |
| 452 | 484 | effect="plain"> |
| ... | ... | @@ -454,27 +486,23 @@ |
| 454 | 486 | </el-tag> |
| 455 | 487 | </template> |
| 456 | 488 | </el-table-column> |
| 489 | + </template> | |
| 457 | 490 | |
| 458 | - <!-- 操作 --> | |
| 459 | - <el-table-column label="操作" width="320" align="left" fixed="right"> | |
| 491 | + <!-- 操作(下拉,减少宽度) --> | |
| 492 | + <el-table-column label="操作" width="80" align="center" fixed="right"> | |
| 460 | 493 | <template slot-scope="scope"> |
| 461 | - <div class="action-buttons"> | |
| 462 | - <el-button type="text" class="detail-btn" icon="el-icon-view" | |
| 463 | - @click="openMemberPortrait(scope.row.id)"> | |
| 464 | - 详情 | |
| 494 | + <el-dropdown trigger="click" @command="handleOpCommand($event, scope.row)"> | |
| 495 | + <el-button type="text" size="small"> | |
| 496 | + 操作<i class="el-icon-arrow-down el-icon--right"></i> | |
| 465 | 497 | </el-button> |
| 466 | - <el-button type="text" class="edit-btn" @click="showMemberRights(scope.row.id)"> | |
| 467 | - 会员权益 | |
| 468 | - </el-button> | |
| 469 | - <el-button v-has="'btn_edit'" type="text" icon="el-icon-edit" | |
| 470 | - @click="addOrUpdateHandle(scope.row.id)" class="edit-btn"> | |
| 471 | - 编辑 | |
| 472 | - </el-button> | |
| 473 | - <el-button v-has="'btn_remove'" type="text" icon="el-icon-delete" | |
| 474 | - @click="handleDel(scope.row.id)" class="delete-btn"> | |
| 475 | - 删除 | |
| 476 | - </el-button> | |
| 477 | - </div> | |
| 498 | + <el-dropdown-menu slot="dropdown"> | |
| 499 | + <el-dropdown-item command="detail" icon="el-icon-view">详情</el-dropdown-item> | |
| 500 | + <el-dropdown-item command="rights" icon="el-icon-folder-opened">会员权益</el-dropdown-item> | |
| 501 | + <el-dropdown-item v-has="'btn_edit'" command="edit" icon="el-icon-edit">编辑</el-dropdown-item> | |
| 502 | + <el-dropdown-item v-has="'btn_remove'" command="delete" icon="el-icon-delete" | |
| 503 | + style="color: #F56C6C;">删除</el-dropdown-item> | |
| 504 | + </el-dropdown-menu> | |
| 505 | + </el-dropdown> | |
| 478 | 506 | </template> |
| 479 | 507 | </el-table-column> |
| 480 | 508 | </NCC-table> |
| ... | ... | @@ -499,8 +527,9 @@ import MemberRightsDialog from './member-rights-dialog.vue' |
| 499 | 527 | import DetailDialog from './detail-dialog.vue' |
| 500 | 528 | import MemberPortraitDialog from '@/components/member-portrait-dialog.vue' |
| 501 | 529 | import { previewDataInterface } from '@/api/systemData/dataInterface' |
| 530 | +import draggable from 'vuedraggable' | |
| 502 | 531 | export default { |
| 503 | - components: { NCCForm, ExportBox, MemberRightsDialog, DetailDialog, MemberPortraitDialog }, | |
| 532 | + components: { NCCForm, ExportBox, MemberRightsDialog, DetailDialog, MemberPortraitDialog, draggable }, | |
| 504 | 533 | data() { |
| 505 | 534 | return { |
| 506 | 535 | viewMode: 'list', // list or card |
| ... | ... | @@ -553,7 +582,30 @@ export default { |
| 553 | 582 | currentPage: 1, |
| 554 | 583 | pageSize: 20, |
| 555 | 584 | sort: "desc", |
| 556 | - sidx: "", | |
| 585 | + sidx: "id", | |
| 586 | + }, | |
| 587 | + // 列配置:顺序与显示(持久化到 localStorage) | |
| 588 | + tableColumnsOrder: ['khmc', 'sjh', 'gsmd', 'xb', 'khlx', 'mainHealthUser', 'subHealthUser', 'jdqd', 'tjr', 'expandUser', 'memberType', 'consumeLevel', 'totalBillingAmount', 'remainingRightsAmount', 'firstVisitTime', 'lastVisitTime', 'visitDays', 'sleepDays'], | |
| 589 | + tableColumnsVisible: {}, | |
| 590 | + tableColumnsMeta: { | |
| 591 | + khmc: { label: '客户名称', width: '250', sortable: true, sidx: 'khmc' }, | |
| 592 | + sjh: { label: '手机号', width: '130px', sortable: true, sidx: 'sjh' }, | |
| 593 | + gsmd: { label: '归属门店', width: '120px', sortable: true, sidx: 'gsmdName' }, | |
| 594 | + xb: { label: '性别', width: '85px', sortable: true, sidx: 'xb' }, | |
| 595 | + khlx: { label: '客户类型', width: '100px', sortable: true, sidx: 'khlx' }, | |
| 596 | + mainHealthUser: { label: '健康师', width: '85px', sortable: false }, | |
| 597 | + subHealthUser: { label: '负责顾问', width: '95px', sortable: false }, | |
| 598 | + jdqd: { label: '进店渠道', width: '100px', sortable: false }, | |
| 599 | + tjr: { label: '推荐人', width: '85px', sortable: false }, | |
| 600 | + expandUser: { label: '拓客人员', width: '95px', sortable: false }, | |
| 601 | + memberType: { label: '会员类型', width: '180', sortable: false }, | |
| 602 | + consumeLevel: { label: '消费等级', width: '100px', sortable: true, sidx: 'consumeLevel' }, | |
| 603 | + totalBillingAmount: { label: '开卡总金额', width: '130', sortable: true, sidx: 'totalBillingAmount' }, | |
| 604 | + remainingRightsAmount: { label: '剩余权益', width: '130', sortable: true, sidx: 'remainingRightsAmount' }, | |
| 605 | + firstVisitTime: { label: '首次到店', width: '120', sortable: true, sidx: 'firstVisitTime' }, | |
| 606 | + lastVisitTime: { label: '最后到店', width: '120', sortable: true, sidx: 'lastVisitTime' }, | |
| 607 | + visitDays: { label: '到店次数', width: '100px', sortable: true, sidx: 'visitDays' }, | |
| 608 | + sleepDays: { label: '沉睡天数', width: '100px', sortable: true, sidx: 'sleepDays' }, | |
| 557 | 609 | }, |
| 558 | 610 | formVisible: false, |
| 559 | 611 | exportBoxVisible: false, |
| ... | ... | @@ -630,10 +682,15 @@ export default { |
| 630 | 682 | kdhyOptions: [], |
| 631 | 683 | } |
| 632 | 684 | }, |
| 633 | - computed: {}, | |
| 685 | + computed: { | |
| 686 | + visibleColumns() { | |
| 687 | + return this.tableColumnsOrder.filter(id => this.tableColumnsVisible[id] !== false) | |
| 688 | + } | |
| 689 | + }, | |
| 634 | 690 | created() { |
| 635 | 691 | // 默认使用列表视图,不恢复本地存储的视图模式 |
| 636 | 692 | this.viewMode = 'list'; |
| 693 | + this.loadColumnConfig(); | |
| 637 | 694 | this.initData(); |
| 638 | 695 | this.getgsmdOptions(); |
| 639 | 696 | this.getkhlxOptions(); |
| ... | ... | @@ -1095,6 +1152,41 @@ export default { |
| 1095 | 1152 | } else if (command === 'delete') { |
| 1096 | 1153 | this.handleDel(item.id); |
| 1097 | 1154 | } |
| 1155 | + }, | |
| 1156 | + handleOpCommand(cmd, row) { | |
| 1157 | + if (cmd === 'detail') this.openMemberPortrait(row.id) | |
| 1158 | + else if (cmd === 'rights') this.showMemberRights(row.id) | |
| 1159 | + else if (cmd === 'edit') this.addOrUpdateHandle(row.id) | |
| 1160 | + else if (cmd === 'delete') this.handleDel(row.id) | |
| 1161 | + }, | |
| 1162 | + handleColumnCommand() {}, | |
| 1163 | + loadColumnConfig() { | |
| 1164 | + try { | |
| 1165 | + const saved = localStorage.getItem('lqKhxx_columnConfig') | |
| 1166 | + if (saved) { | |
| 1167 | + const { order, visible } = JSON.parse(saved) | |
| 1168 | + if (Array.isArray(order)) this.tableColumnsOrder = order | |
| 1169 | + if (visible && typeof visible === 'object') this.tableColumnsVisible = { ...this.tableColumnsVisible, ...visible } | |
| 1170 | + } | |
| 1171 | + } catch (e) { console.warn('loadColumnConfig error:', e) } | |
| 1172 | + // 确保所有列都有 visible 默认值 | |
| 1173 | + this.tableColumnsOrder.forEach(id => { | |
| 1174 | + if (this.tableColumnsVisible[id] === undefined) this.$set(this.tableColumnsVisible, id, true) | |
| 1175 | + }) | |
| 1176 | + }, | |
| 1177 | + saveColumnConfig() { | |
| 1178 | + try { | |
| 1179 | + localStorage.setItem('lqKhxx_columnConfig', JSON.stringify({ | |
| 1180 | + order: this.tableColumnsOrder, | |
| 1181 | + visible: this.tableColumnsVisible | |
| 1182 | + })) | |
| 1183 | + } catch (e) { console.warn('saveColumnConfig error:', e) } | |
| 1184 | + }, | |
| 1185 | + handleSortChange({ prop, order }) { | |
| 1186 | + if (!prop || !order) return | |
| 1187 | + this.listQuery.sidx = prop | |
| 1188 | + this.listQuery.sort = order === 'ascending' ? 'asc' : 'desc' | |
| 1189 | + this.initData() | |
| 1098 | 1190 | } |
| 1099 | 1191 | } |
| 1100 | 1192 | } |
| ... | ... | @@ -2672,6 +2764,59 @@ export default { |
| 2672 | 2764 | |
| 2673 | 2765 | /* 滑动展开筛选面板 - 流畅的向下展开动画 */ |
| 2674 | 2766 | |
| 2767 | +/* 列设置下拉面板 */ | |
| 2768 | +.column-setting-dropdown { | |
| 2769 | + padding: 0 !important; | |
| 2770 | + min-width: 220px; | |
| 2771 | +} | |
| 2772 | +.column-setting-panel { | |
| 2773 | + padding: 12px 16px; | |
| 2774 | + max-height: 400px; | |
| 2775 | + overflow-y: auto; | |
| 2776 | +} | |
| 2777 | +.column-setting-title { | |
| 2778 | + font-size: 13px; | |
| 2779 | + color: #606266; | |
| 2780 | + margin-bottom: 12px; | |
| 2781 | + font-weight: 500; | |
| 2782 | +} | |
| 2783 | +.column-draggable-list { | |
| 2784 | + display: flex; | |
| 2785 | + flex-direction: column; | |
| 2786 | + gap: 4px; | |
| 2787 | +} | |
| 2788 | +.column-drag-ghost { | |
| 2789 | + opacity: 0.5; | |
| 2790 | + background: #e6f7ff; | |
| 2791 | +} | |
| 2792 | +.column-draggable-item { | |
| 2793 | + display: flex; | |
| 2794 | + align-items: center; | |
| 2795 | + gap: 8px; | |
| 2796 | + padding: 6px 8px; | |
| 2797 | + border-radius: 6px; | |
| 2798 | + transition: background 0.2s; | |
| 2799 | + &:hover { | |
| 2800 | + background: #f5f7fa; | |
| 2801 | + } | |
| 2802 | + .drag-handle { | |
| 2803 | + color: #909399; | |
| 2804 | + font-size: 14px; | |
| 2805 | + cursor: grab; | |
| 2806 | + user-select: none; | |
| 2807 | + flex-shrink: 0; | |
| 2808 | + padding: 2px; | |
| 2809 | + &:active { | |
| 2810 | + cursor: grabbing; | |
| 2811 | + } | |
| 2812 | + } | |
| 2813 | + .el-checkbox { | |
| 2814 | + flex: 1; | |
| 2815 | + margin-right: 0; | |
| 2816 | + min-width: 0; | |
| 2817 | + } | |
| 2818 | +} | |
| 2819 | + | |
| 2675 | 2820 | .toolbar-card { |
| 2676 | 2821 | margin-bottom: 16px; |
| 2677 | 2822 | border-radius: 12px; |
| ... | ... | @@ -2743,6 +2888,11 @@ export default { |
| 2743 | 2888 | font-size: 14px; |
| 2744 | 2889 | border-bottom: 2px solid #e8e8e8; |
| 2745 | 2890 | padding: 14px 0; |
| 2891 | + white-space: nowrap; | |
| 2892 | + | |
| 2893 | + .cell { | |
| 2894 | + white-space: nowrap !important; | |
| 2895 | + } | |
| 2746 | 2896 | } |
| 2747 | 2897 | |
| 2748 | 2898 | td { |
| ... | ... | @@ -2755,6 +2905,17 @@ export default { |
| 2755 | 2905 | backface-visibility: hidden; |
| 2756 | 2906 | } |
| 2757 | 2907 | |
| 2908 | + td.column-khmc-full { | |
| 2909 | + overflow: visible !important; | |
| 2910 | + text-overflow: unset; | |
| 2911 | + | |
| 2912 | + .cell { | |
| 2913 | + overflow: visible !important; | |
| 2914 | + text-overflow: unset; | |
| 2915 | + min-width: max-content; | |
| 2916 | + } | |
| 2917 | + } | |
| 2918 | + | |
| 2758 | 2919 | tr { |
| 2759 | 2920 | transition: background-color 0.15s ease; |
| 2760 | 2921 | will-change: background-color; |
| ... | ... | @@ -2835,6 +2996,17 @@ export default { |
| 2835 | 2996 | text-overflow: ellipsis; |
| 2836 | 2997 | white-space: nowrap; |
| 2837 | 2998 | } |
| 2999 | + | |
| 3000 | + &.table-cell-name-full { | |
| 3001 | + overflow: visible; | |
| 3002 | + min-width: max-content; | |
| 3003 | + | |
| 3004 | + .cell-text-full { | |
| 3005 | + overflow: visible; | |
| 3006 | + text-overflow: unset; | |
| 3007 | + white-space: nowrap; | |
| 3008 | + } | |
| 3009 | + } | |
| 2838 | 3010 | } |
| 2839 | 3011 | |
| 2840 | 3012 | .cell-text-plain { |
| ... | ... | @@ -2872,15 +3044,17 @@ export default { |
| 2872 | 3044 | } |
| 2873 | 3045 | } |
| 2874 | 3046 | |
| 2875 | -// 会员标签组 | |
| 3047 | +// 会员标签组(列表内不换行) | |
| 2876 | 3048 | .member-tags { |
| 2877 | 3049 | display: flex; |
| 2878 | 3050 | gap: 4px; |
| 2879 | - flex-wrap: wrap; | |
| 3051 | + flex-wrap: nowrap; | |
| 2880 | 3052 | justify-content: center; |
| 3053 | + white-space: nowrap; | |
| 2881 | 3054 | |
| 2882 | 3055 | .el-tag { |
| 2883 | 3056 | margin: 0; |
| 3057 | + flex-shrink: 0; | |
| 2884 | 3058 | } |
| 2885 | 3059 | } |
| 2886 | 3060 | |
| ... | ... | @@ -3108,16 +3282,18 @@ export default { |
| 3108 | 3282 | } |
| 3109 | 3283 | } |
| 3110 | 3284 | |
| 3111 | -/* 标签组样式 */ | |
| 3285 | +/* 标签组样式(表格内会员类型不换行) */ | |
| 3112 | 3286 | .member-tags { |
| 3113 | 3287 | display: flex; |
| 3114 | 3288 | gap: 6px; |
| 3115 | - flex-wrap: wrap; | |
| 3289 | + flex-wrap: nowrap; | |
| 3116 | 3290 | justify-content: center; |
| 3117 | 3291 | align-items: center; |
| 3292 | + white-space: nowrap; | |
| 3118 | 3293 | |
| 3119 | 3294 | .el-tag { |
| 3120 | 3295 | margin: 0; |
| 3296 | + flex-shrink: 0; | |
| 3121 | 3297 | } |
| 3122 | 3298 | } |
| 3123 | 3299 | ... | ... |