| New file |
| | |
| | | <template> |
| | | <div class="people-search-container"> |
| | | <!-- 页面标题 --> |
| | | <div class="page-header"> |
| | | <h2>人员搜索</h2> |
| | | <p>通过模块和时间范围筛选相关人员信息</p> |
| | | </div> |
| | | |
| | | <!-- 搜索表单 --> |
| | | <el-card class="search-card"> |
| | | <el-form |
| | | :model="searchForm" |
| | | :rules="searchRules" |
| | | ref="searchForm" |
| | | label-width="100px" |
| | | class="search-form" |
| | | > |
| | | <!-- 模块选择 --> |
| | | <el-form-item label="选择模块" prop="module"> |
| | | |
| | | <label v-for="item in modules" :key="item.label" class="signature-checkbox"> |
| | | <input type="checkbox" v-model="searchForm.modules" :value="item.label"> |
| | | <span>{{ item.value }}</span> |
| | | </label> |
| | | <!-- <el-select |
| | | v-model="searchForm.module" |
| | | placeholder="请选择搜索模块" |
| | | clearable |
| | | @change="handleModuleChange" |
| | | > |
| | | <el-option |
| | | v-for="item in modules" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | ></el-option> |
| | | </el-select> --> |
| | | </el-form-item> |
| | | <el-form-item class="left-align-btn"> |
| | | <div v-if="selectedMemberNames.length > 0" class="selected-members"> |
| | | <el-tag |
| | | v-for="(name, index) in selectedMemberNames" |
| | | :key="index" |
| | | closable |
| | | @close="handleTagClose(index, name)" |
| | | > |
| | | {{ name }} |
| | | </el-tag> |
| | | </div> |
| | | <el-button |
| | | type="primary" |
| | | plain |
| | | @click="openFamilyMemberDialog" |
| | | style="width: 100%; margin-bottom: 15px;" |
| | | > |
| | | 选择家族人 |
| | | </el-button> |
| | | </el-form-item> |
| | | <!-- 时间范围选择 --> |
| | | <el-form-item label="时间范围" prop="dateRange"> |
| | | <el-date-picker |
| | | v-model="searchForm.dateRange" |
| | | type="daterange" |
| | | range-separator="至" |
| | | start-placeholder="开始日期" |
| | | end-placeholder="结束日期" |
| | | value-format="yyyy-MM-dd" |
| | | :disabled-date="disabledDate" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | |
| | | <!-- 高级搜索选项 (根据选择的模块动态显示) --> |
| | | <!-- <div v-if="showAdvancedOptions" class="advanced-options"> |
| | | <el-form-item label="状态" prop="status"> |
| | | <el-select v-model="searchForm.status" placeholder="请选择状态" clearable> |
| | | <el-option label="全部" value=""></el-option> |
| | | <el-option label="启用" value="active"></el-option> |
| | | <el-option label="禁用" value="inactive"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </div> --> |
| | | |
| | | <!-- 操作按钮 --> |
| | | <el-form-item class="form-actions"> |
| | | <el-button type="primary" @click="handleSearch">搜索</el-button> |
| | | <el-button @click="handleReset">重置</el-button> |
| | | <el-button type="text" @click="toggleAdvancedOptions"> |
| | | {{ showAdvancedOptions ? '收起高级选项' : '展开高级选项' }} |
| | | </el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-card> |
| | | |
| | | <!-- 搜索结果 --> |
| | | <el-card class="result-card"> |
| | | <!-- 结果统计 --> |
| | | <div class="result-stats" v-if="searchResult.length > 0"> |
| | | <span>共找到 {{ pagination.total }} 条结果</span> |
| | | <el-button |
| | | type="text" |
| | | icon="el-icon-download" |
| | | size="small" |
| | | @click="exportResult" |
| | | > |
| | | 导出结果 |
| | | </el-button> |
| | | </div> |
| | | |
| | | <!-- 结果表格 --> |
| | | <el-table |
| | | v-loading="loading" |
| | | :data="searchResult" |
| | | border |
| | | stripe |
| | | style="width: 100%" |
| | | @row-click="handleRowClick" |
| | | > |
| | | <el-table-column type="index" label="序号" width="60"></el-table-column> |
| | | <el-table-column prop="name" label="姓名" min-width="120"></el-table-column> |
| | | <el-table-column prop="module" label="所属模块" min-width="120"> |
| | | <template slot-scope="scope"> |
| | | <el-tag>{{ getModuleLabel(scope.row.module) }}</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="createTime" label="创建时间" min-width="160"></el-table-column> |
| | | |
| | | <el-table-column label="操作" min-width="120" fixed="right"> |
| | | <template slot-scope="scope"> |
| | | <el-button size="small" type="text" @click="handleView(scope.row)">查看</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <!-- 分页控件 --> |
| | | <div class="pagination-container" v-if="pagination.total > 0"> |
| | | <el-pagination |
| | | @size-change="handleSizeChange" |
| | | @current-change="handleCurrentChange" |
| | | :current-page="pagination.currentPage" |
| | | :page-sizes="[10, 20, 50, 100]" |
| | | :page-size="pagination.pageSize" |
| | | :total="pagination.total" |
| | | layout="total, sizes, prev, pager, next, jumper" |
| | | ></el-pagination> |
| | | </div> |
| | | |
| | | <!-- 无结果提示 --> |
| | | <div v-else-if="!loading" class="no-result"> |
| | | <el-empty description="暂无搜索结果"></el-empty> |
| | | </div> |
| | | </el-card> |
| | | |
| | | |
| | | |
| | | |
| | | <!-- 添加家族人选择对话框 --> |
| | | <el-dialog |
| | | :visible.sync="familyMemberDialogVisible" |
| | | title="选择家族成员" |
| | | width="30%" |
| | | > |
| | | <el-form ref="familyForm" :model="familyForm" :rules="familyRules"> |
| | | <el-form-item prop="selectedMember"> |
| | | <!-- <el-select |
| | | v-model="familyForm.selectedMember" |
| | | placeholder="请选择家族成员" |
| | | style="width: 100%;" |
| | | > |
| | | <el-option |
| | | v-for="member in familyMembers" |
| | | :key="member.id" |
| | | :label="member.name" |
| | | :value="member.id" |
| | | ></el-option> |
| | | </el-select> --> |
| | | |
| | | <label v-for="item in familyMembers" :key="item.userId" class="signature-checkbox"> |
| | | <input type="checkbox" v-model="selectedMemberIds" :value="item.userId"> |
| | | <span>{{ item.oldName }}</span> |
| | | </label> |
| | | </el-form-item> |
| | | |
| | | <!-- 或者使用多选模式 --> |
| | | <!-- <el-form-item label="选择家族成员"> |
| | | <el-checkbox-group v-model="familyForm.selectedMembers"> |
| | | <el-checkbox |
| | | v-for="member in familyMembers" |
| | | :key="member.id" |
| | | :label="member.id" |
| | | > |
| | | {{ member.name }} |
| | | </el-checkbox> |
| | | </el-checkbox-group> |
| | | </el-form-item> --> |
| | | </el-form> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="familyMemberDialogVisible = false">取消</el-button> |
| | | <el-button type="primary" @click="confirmFamilyMember">确定</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | // 导入API请求函数(根据实际项目路径调整) |
| | | import { searchPeople, getModules } from '@/api/peopleSearch'; |
| | | import { getFamilyMembers } from '@/api/root'; // 假设获取家族成员的API |
| | | |
| | | export default { |
| | | name: 'PeopleSearch', |
| | | data() { |
| | | return { |
| | | names: "", |
| | | selectedModules: [], |
| | | selectedMemberIds:[], |
| | | // ... existing data ... |
| | | familyMemberDialogVisible: false, // 家族成员选择对话框显示状态 |
| | | familyForm: { |
| | | selectedMember: '', // 单选模式 |
| | | // selectedMembers: [] // 多选模式 |
| | | }, |
| | | familyRules: { |
| | | selectedMember: [ |
| | | { required: true, message: '请选择家族成员', trigger: 'change' } |
| | | ] |
| | | }, |
| | | familyMembers: [ |
| | | // 家族成员数据,实际项目中可能从接口获取 |
| | | { id: 1, name: '家族成员1' }, |
| | | { id: 2, name: '家族成员2' }, |
| | | { id: 3, name: '家族成员3' }, |
| | | { id: 4, name: '家族成员4' }, |
| | | { id: 5, name: '家族成员5' } |
| | | ], |
| | | // 搜索表单数据 |
| | | searchForm: { |
| | | modules: [], |
| | | dateRange: [], |
| | | peoples: '' |
| | | }, |
| | | // 表单验证规则 |
| | | searchRules: { |
| | | // module: [ |
| | | // { required: true, message: '请选择搜索模块', trigger: 'change' } |
| | | // ], |
| | | // dateRange: [ |
| | | // { type: 'array', required: true, message: '请选择时间范围', trigger: 'change' } |
| | | // ] |
| | | }, |
| | | // 模块列表 |
| | | modules: [], |
| | | // 搜索结果 |
| | | searchResult: [], |
| | | // 分页信息 |
| | | pagination: { |
| | | currentPage: 1, |
| | | pageSize: 10, |
| | | total: 0 |
| | | }, |
| | | // 加载状态 |
| | | loading: false, |
| | | // 是否显示高级选项 |
| | | showAdvancedOptions: false |
| | | }; |
| | | }, |
| | | created() { |
| | | // 初始化页面数据 |
| | | this.loadFamilyMembers() |
| | | this.loadModules(); |
| | | }, |
| | | computed: { |
| | | // 已选成员姓名(用于回显) |
| | | selectedMemberNames() { |
| | | var od = this.familyMembers |
| | | .filter(member => this.selectedMemberIds.includes(member.userId)) |
| | | .map(member => member.oldName); |
| | | |
| | | return od |
| | | }, |
| | | }, |
| | | methods: { |
| | | // 加载家族成员列表 |
| | | async loadFamilyMembers() { |
| | | this.loading = true; |
| | | |
| | | let clanId = this.$store.state.user.clanId |
| | | try { |
| | | const res = await getFamilyMembers(clanId); // 假设需要家族ID参数 |
| | | |
| | | |
| | | console.log(res) |
| | | console.log(res.data) |
| | | this.familyMembers = res.data; |
| | | // console.log(this.familyMembers.length) |
| | | // console.log(this.familyMembers.length) |
| | | // console.log(this.familyMembers[0]) |
| | | // for(let i=0; i < this.familyMembers.length; i++) |
| | | // console.log(this.familyMembers[i]) |
| | | // console.log("---999") |
| | | // 格式:[{ id: 1, name: '张三', role: '家长', relation: '父子', avatar: 'xxx' }, ...] |
| | | } catch (err) { |
| | | this.$message.error('加载家族成员失败,请重试'); |
| | | } finally { |
| | | this.loading = false; |
| | | } |
| | | }, |
| | | // 加载模块列表 |
| | | async loadModules() { |
| | | try { |
| | | // const response = await getModules(); response.data || |
| | | this.modules = [ |
| | | { label: '事纪', value: '事纪' }, |
| | | { label: '部门管理', value: 'department' }, |
| | | // { label: '角色管理', value: 'role' }, |
| | | // { label: '项目管理', value: 'project' } |
| | | ]; |
| | | } catch (error) { |
| | | this.$message.error('加载模块列表失败'); |
| | | console.error('模块加载错误:', error); |
| | | } |
| | | }, |
| | | |
| | | // 处理模块变更 |
| | | handleModuleChange(module) { |
| | | console.log('选择的模块:', module); |
| | | // 可以根据选择的模块动态调整表单选项 |
| | | }, |
| | | |
| | | // 搜索按钮点击事件 |
| | | async handleSearch() { |
| | | var nams = this.$store.state.user.name +","+this.selectedMemberNames.join(",") |
| | | |
| | | this.searchForm.peoples = nams |
| | | this.names = nams |
| | | console.log(this.searchForm.module) |
| | | console.log("----3") |
| | | this.$refs.searchForm.validate(async (valid) => { |
| | | if (valid) { |
| | | this.loading = true; |
| | | try { |
| | | // 构建搜索参数 |
| | | const params = { |
| | | modules: this.searchForm.modules, |
| | | startTime: this.searchForm.dateRange[0] || '', |
| | | endTime: this.searchForm.dateRange[1] || '', |
| | | peoples: this.searchForm.peoples, |
| | | // status: this.searchForm.status, |
| | | pageNum: this.pagination.currentPage, |
| | | pageSize: this.pagination.pageSize |
| | | }; |
| | | // alert(23) |
| | | // 调用API进行搜索 |
| | | const response = await searchPeople(params); |
| | | console.log(response) |
| | | // 更新搜索结果和分页信息 |
| | | this.searchResult = response.data.data || []; |
| | | console.log(this.searchResult) |
| | | this.pagination.total = response.data.total || 0; |
| | | |
| | | this.$message.success(`搜索成功,共找到 ${this.pagination.total} 条记录`); |
| | | } catch (error) { |
| | | this.$message.error('搜索失败,请重试'); |
| | | console.error('搜索错误:', error); |
| | | } finally { |
| | | this.loading = false; |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | // 重置表单 |
| | | handleReset() { |
| | | this.$refs.searchForm.resetFields(); |
| | | this.searchResult = []; |
| | | this.pagination = { |
| | | currentPage: 1, |
| | | pageSize: 10, |
| | | total: 0 |
| | | }; |
| | | }, |
| | | |
| | | // 切换高级选项显示/隐藏 |
| | | toggleAdvancedOptions() { |
| | | this.showAdvancedOptions = !this.showAdvancedOptions; |
| | | }, |
| | | |
| | | // 根据值获取模块标签 |
| | | getModuleLabel(value) { |
| | | const module = this.modules.find(item => item.value === value); |
| | | return module ? module.label : value; |
| | | }, |
| | | |
| | | // 禁止选择未来日期 |
| | | disabledDate(date) { |
| | | return date > new Date(); |
| | | }, |
| | | |
| | | // 分页相关方法 |
| | | handleSizeChange(val) { |
| | | this.pagination.pageSize = val; |
| | | this.pagination.currentPage = 1; |
| | | this.handleSearch(); |
| | | }, |
| | | |
| | | handleCurrentChange(val) { |
| | | this.pagination.currentPage = val; |
| | | this.handleSearch(); |
| | | }, |
| | | handleTagClose(index, name) { |
| | | // 从 selectedMemberNames 数组中移除当前关闭的标签名称 |
| | | // const index = this.selectedMemberNames.findIndex(item=== name); |
| | | selectedMemberIds: this.selectedMemberIds.filter( |
| | | item => item!== index // 过滤掉与关闭名称相同的元素 |
| | | ) |
| | | this.$forceUpdate(); |
| | | console.log(this.selectedMemberIds) |
| | | this.selectedMemberNames.splice(index, 1); |
| | | this.$forceUpdate(); |
| | | selectedMemberNames: this.selectedMemberNames.filter( |
| | | item => item !== name // 过滤掉与关闭名称相同的元素 |
| | | ) |
| | | console.log(this.selectedMemberNames) |
| | | |
| | | }, |
| | | // 查看详情 |
| | | handleView(row) { |
| | | var id = row.id |
| | | this.$router.push("/familymodel/bignote/familyeventInfo/" + id); |
| | | }, |
| | | |
| | | // 编辑 |
| | | handleEdit(row) { |
| | | this.$router.push({ name: 'PeopleEdit', params: { id: row.id } }); |
| | | }, |
| | | |
| | | // 行点击事件 |
| | | handleRowClick(row) { |
| | | console.log('点击了行:', row); |
| | | }, |
| | | |
| | | // 导出结果 |
| | | exportResult() { |
| | | this.$confirm('确定要导出当前搜索结果吗?', '提示', { |
| | | confirmButtonText: '确定', |
| | | cancelButtonText: '取消', |
| | | type: 'info' |
| | | }).then(() => { |
| | | // 实现导出逻辑 |
| | | this.$message.success('导出成功'); |
| | | }).catch(() => { |
| | | this.$message.info('已取消导出'); |
| | | }); |
| | | }, |
| | | // 打开家族成员选择对话框 |
| | | openFamilyMemberDialog() { |
| | | this.familyMemberDialogVisible = true; |
| | | }, |
| | | // 确认选择家族成员 |
| | | confirmFamilyMember() { |
| | | //this.formDat.selectedMemberIds = [...this.selectedMemberIds]; // 将弹窗选中的ID同步到表单 |
| | | |
| | | // this.$message.success(`已选择家族成员: ${selectedName}`); |
| | | // 可以在这里处理选择后的逻辑,比如保存到登录表单中 |
| | | // this.loginForm.familyMemberId = this.familyForm.selectedMember; |
| | | // this.loginForm.familyMemberName = selectedName; |
| | | |
| | | this.familyMemberDialogVisible = false; |
| | | |
| | | |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | .people-search-container { |
| | | padding: 20px; |
| | | background-color: #f5f7fa; |
| | | min-height: calc(100vh - 60px); |
| | | } |
| | | |
| | | .page-header { |
| | | margin-bottom: 20px; |
| | | |
| | | h2 { |
| | | margin-bottom: 5px; |
| | | color: #1f2d3d; |
| | | } |
| | | |
| | | p { |
| | | color: #8391a5; |
| | | font-size: 14px; |
| | | } |
| | | } |
| | | /* 可选:标签样式优化 */ |
| | | .member-tags { |
| | | display: flex; |
| | | gap: 8px; |
| | | flex-wrap: wrap; |
| | | margin: 10px 0; |
| | | } |
| | | .search-card { |
| | | margin-bottom: 20px; |
| | | box-shadow: 0 2px 12px rgba(0, 0, 0, 0.04); |
| | | } |
| | | ::v-deep .left-align-btn .el-form-item__content { |
| | | text-align: left; /* 关键:设置内容左对齐 */ |
| | | } |
| | | .search-form { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 5px; |
| | | padding: 10px 0; |
| | | |
| | | .el-form-item { |
| | | margin-bottom: 15px; |
| | | flex: 1; |
| | | min-width: 180px; |
| | | text-align: left; |
| | | // &.form-actions { |
| | | // display: flex; |
| | | // align-items: flex-start; |
| | | // justify-content: flex-end; |
| | | // flex: 100%; |
| | | // } |
| | | } |
| | | } |
| | | |
| | | .advanced-options { |
| | | border-top: 1px dashed #eaeaea; |
| | | margin-top: 15px; |
| | | padding-top: 15px; |
| | | } |
| | | |
| | | .result-card { |
| | | box-shadow: 0 2px 12px rgba(0, 0, 0, 0.04); |
| | | padding: 15px; |
| | | min-height: 400px; |
| | | |
| | | .el-table { |
| | | margin-bottom: 15px; |
| | | } |
| | | } |
| | | |
| | | .pagination-container { |
| | | margin-top: 15px; |
| | | text-align: right; |
| | | } |
| | | |
| | | .no-result { |
| | | padding: 50px 0; |
| | | text-align: center; |
| | | } |
| | | /* 已选成员标签样式 */ |
| | | .selected-members { |
| | | margin-bottom: 12px; |
| | | .el-tag { |
| | | margin-right: 8px; |
| | | margin-bottom: 8px; |
| | | } |
| | | } |
| | | |
| | | </style> |