This commit is contained in:
bwstudio
2025-10-22 08:19:00 +08:00
parent 467b04e5b0
commit 97fbfe08d7
6040 changed files with 529099 additions and 9685 deletions
@@ -0,0 +1,211 @@
<template>
<view class="dept-management">
<!-- 顶部导航栏 -->
<view class="nav-bar">
<view class="nav-back" @click="navigateBack">
<u-icon name="arrow-left" size="24" color="#606266"></u-icon>
</view>
<view class="nav-title">部门管理</view>
<view class="nav-right">
<u-button type="text" @click="addDepartment">添加</u-button>
</view>
</view>
<!-- 搜索框 -->
<view class="search-box">
<u-search placeholder="搜索部门名称" v-model="searchKeyword"></u-search>
</view>
<!-- 部门列表 -->
<view class="dept-list">
<u-cell-group v-if="filteredDepartments.length > 0">
<u-cell
v-for="dept in filteredDepartments"
:key="dept.id"
:title="dept.name"
:label="dept.description ? `描述:${dept.description}` : '暂无描述'"
:right-text="dept.leader ? dept.leader : '未分配负责人'"
:right-icon="'arrow-right'"
is-link
@click="editDepartment(dept)"
>
</u-cell>
</u-cell-group>
<u-empty v-else text="暂无部门数据"></u-empty>
</view>
<!-- 添加/编辑部门弹窗 -->
<u-popup v-model="showDeptModal" mode="bottom" :round="true" :closeable="true">
<view class="modal-content">
<view class="modal-title">{{ isEditing ? '编辑部门' : '添加部门' }}</view>
<u-form :model="formData" ref="uForm">
<u-form-item label="部门名称">
<u-input v-model="formData.name" placeholder="请输入部门名称"></u-input>
</u-form-item>
<u-form-item label="部门描述">
<u-input v-model="formData.description" type="textarea" placeholder="请输入部门描述"></u-input>
</u-form-item>
<u-form-item label="部门负责人">
<u-picker
mode="selector"
:range="managers"
:rangeKey="'name'"
v-model="formData.leaderIndex"
placeholder="请选择部门负责人"
></u-picker>
</u-form-item>
</u-form>
<view class="modal-buttons">
<u-button @click="showDeptModal = false" style="flex: 1; margin-right: 20rpx;">取消</u-button>
<u-button type="primary" @click="submitForm" style="flex: 1;">确定</u-button>
</view>
</view>
</u-popup>
</view>
</template>
<script>
export default {
data() {
return {
searchKeyword: '',
showDeptModal: false,
isEditing: false,
editDeptId: '',
formData: {
name: '',
description: '',
leaderIndex: 0
},
// 模拟的部门负责人数据(部门负责人和管理员)
managers: [
{ id: 1, name: '张三' },
{ id: 2, name: '李四' },
{ id: 3, name: '王五' },
{ id: 6, name: '孙八' }
],
departments: [
{ id: 1, name: '技术部', description: '负责系统开发和维护', leader: '张三' },
{ id: 2, name: '市场部', description: '负责市场推广和销售', leader: '李四' },
{ id: 3, name: '财务部', description: '负责财务管理和核算', leader: '王五' },
{ id: 4, name: '人力资源部', description: '负责人事招聘和管理', leader: '' },
{ id: 5, name: '行政部', description: '负责公司日常行政事务', leader: '孙八' }
]
}
},
computed: {
filteredDepartments() {
if (!this.searchKeyword) {
return this.departments
}
return this.departments.filter(dept =>
dept.name.includes(this.searchKeyword) ||
(dept.description && dept.description.includes(this.searchKeyword))
)
}
},
methods: {
navigateBack() {
uni.navigateBack()
},
addDepartment() {
this.isEditing = false
this.formData = {
name: '',
description: '',
leaderIndex: 0
}
this.showDeptModal = true
},
editDepartment(dept) {
this.isEditing = true
this.editDeptId = dept.id
const leaderIndex = this.managers.findIndex(m => m.name === dept.leader)
this.formData = {
name: dept.name,
description: dept.description || '',
leaderIndex: leaderIndex !== -1 ? leaderIndex : 0
}
this.showDeptModal = true
},
submitForm() {
if (!this.formData.name) {
uni.showToast({ title: '请输入部门名称', icon: 'none' })
return
}
const deptData = {
name: this.formData.name,
description: this.formData.description,
leader: this.managers[this.formData.leaderIndex]?.name || ''
}
if (this.isEditing) {
// 编辑部门
const index = this.departments.findIndex(d => d.id === this.editDeptId)
if (index !== -1) {
this.departments[index] = { ...this.departments[index], ...deptData }
uni.showToast({ title: '编辑成功', icon: 'success' })
}
} else {
// 添加部门
const newId = Math.max(...this.departments.map(d => d.id), 0) + 1
this.departments.push({ id: newId, ...deptData })
uni.showToast({ title: '添加成功', icon: 'success' })
}
this.showDeptModal = false
}
}
}
</script>
<style lang="scss">
.dept-management {
padding-bottom: 20rpx;
background-color: #f5f5f5;
.nav-bar {
display: flex;
align-items: center;
justify-content: space-between;
height: 88rpx;
padding: 0 30rpx;
background-color: #fff;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
.nav-title {
font-size: 36rpx;
font-weight: bold;
color: #333;
}
}
.search-box {
padding: 20rpx;
background-color: #fff;
}
.dept-list {
margin-top: 20rpx;
padding: 0 20rpx;
}
.modal-content {
padding: 30rpx;
.modal-title {
font-size: 36rpx;
font-weight: bold;
text-align: center;
margin-bottom: 30rpx;
color: #333;
}
.modal-buttons {
display: flex;
margin-top: 30rpx;
}
}
}
</style>