This commit is contained in:
zlwu committed 2026-07-05 10:07:24 +08:00
1 parent 33c038b8d9
commit 54b27a3f0e
253 files changed
+30060 -14298

No files matched your search

+62 -6
View File
@@ -33,6 +33,12 @@
<div class="list-toolbar-selected">
已选 <span class="sel-num">{{ selectedRows.length }}</span> 项
</div>
<ListQuickSearchInput
v-model="quickSearchKeyword"
placeholder="职位名称/编码"
@search="handleQuickSearch"
@clear="handleQuickSearchClear"
/>
<el-button class="btn-main" type="primary" @click="handleAdd">
<el-icon><Plus /></el-icon>
新增职位
@@ -74,7 +80,15 @@
批量删除
</el-button>
<ListToolbarEndActions :loading="loading" @refresh="loadData" />
<ListToolbarEndActions
:loading="loading"
:column-defs="listColumnDefs"
v-model:visible-columns="visibleColumns"
v-model:check-all="checkAll"
:is-indeterminate="isIndeterminate"
@refresh="loadData"
@reset-columns="resetToDefault"
/>
</div>
</div>
@@ -109,6 +123,7 @@
</template>
</el-table-column>
<el-table-column
v-if="isColumnVisible('postCode')"
prop="postCode"
label="职位编码"
min-width="120"
@@ -116,6 +131,7 @@
header-align="center"
/>
<el-table-column
v-if="isColumnVisible('status')"
prop="status"
label="状态"
min-width="80"
@@ -129,6 +145,7 @@
</template>
</el-table-column>
<el-table-column
v-if="isColumnVisible('createTime')"
prop="createTime"
label="创建时间"
min-width="180"
@@ -162,8 +179,9 @@
ref="formRef"
:model="formData"
:rules="formRules"
label-position="top"
class="post-dialog-form"
label-position="right"
label-width="100px"
class="post-dialog-form sys-dialog-form"
scroll-to-error
:scroll-into-view-options="{ behavior: 'smooth', block: 'center' }"
>
@@ -215,7 +233,7 @@
<p v-if="postBindPostName" class="post-bind-subtitle">
职位:<strong>{{ postBindPostName }}</strong>
</p>
<el-form label-position="top" class="data-scope-form">
<el-form label-position="right" label-width="100px" class="data-scope-form sys-dialog-form">
<el-form-item label="绑定用户" class="data-scope-custom-form-item">
<div class="data-scope-custom-grid">
<div class="data-scope-custom-col">
@@ -338,8 +356,11 @@
<script setup lang="ts">
import ListToolbarEndActions from '@/components/business/list-toolbar-end-actions/index.vue'
import ListQuickSearchInput from '@/components/business/list-quick-search-input/index.vue'
import { usePersistedListColumns } from '@/composables/usePersistedListColumns'
import { ref, reactive, computed, onMounted, nextTick } from 'vue'
import { canDeleteByCreator, filterDeletableByCreator, allRowsDeletableByCreator, CREATOR_DELETE_TIP } from '@/utils/creator-delete'
import { syncViewRowFromFlatList } from '@/utils/view-dialog-refresh'
import { ElMessage, ElMessageBox } from 'element-plus'
import {
Plus,
@@ -371,9 +392,24 @@ import { useDictStore } from '@/store/modules/dict'
defineOptions({ name: 'SystemPost' })
const dictStore = useDictStore()
const listColumnDefs = [
{ prop: 'postCode', label: '职位编码' },
{ prop: 'status', label: '状态' },
{ prop: 'createTime', label: '创建时间' }
]
const {
visibleColumns,
checkAll,
isIndeterminate,
isColumnVisible,
resetToDefault
} = usePersistedListColumns('system-post-list-columns', listColumnDefs)
const dictStore = useDictStore()
const searchForm = reactive<{ keyword: string }>({ keyword: '' })
const quickSearchKeyword = ref('')
const tableData = ref<Api.Post.PostItem[]>([])
const selectedRows = ref<Api.Post.PostItem[]>([])
const loading = ref(false)
@@ -403,6 +439,11 @@ const dictStore = useDictStore()
// ---- 查看弹窗 ----
const viewVisible = ref(false)
const viewRow = ref<Api.Post.PostItem | null>(null)
function refreshViewIfOpen() {
if (!viewVisible.value) return
syncViewRowFromFlatList(viewRow, tableData.value)
}
const viewBoundUserNames = ref<string[]>([])
const viewSections = computed(() => {
const row = viewRow.value
@@ -636,10 +677,11 @@ const dictStore = useDictStore()
async function loadData() {
loading.value = true
try {
const quickKeyword = quickSearchKeyword.value?.trim()
const res = await fetchPostList({
page: pagination.page,
pageSize: pagination.pageSize,
keyword: searchForm.keyword || undefined
keyword: quickKeyword || searchForm.keyword || undefined
})
tableData.value = res.list || []
pagination.total = res.total ?? 0
@@ -649,12 +691,25 @@ const dictStore = useDictStore()
}
function handleSearch() {
quickSearchKeyword.value = ''
pagination.page = 1
loadData()
}
function handleReset() {
searchForm.keyword = ''
quickSearchKeyword.value = ''
pagination.page = 1
loadData()
}
function handleQuickSearch() {
pagination.page = 1
loadData()
}
function handleQuickSearchClear() {
quickSearchKeyword.value = ''
pagination.page = 1
loadData()
}
@@ -708,6 +763,7 @@ const dictStore = useDictStore()
ElMessage.success(isEdit.value ? '更新成功' : '创建成功')
dialogVisible.value = false
await loadData()
if (isEdit.value) refreshViewIfOpen()
} catch {
/* 校验或接口错误已由全局处理 */
} finally {