staff/pagesB/permissions/addStaff.vue

408 lines
11 KiB
Vue

<template>
<view class="container">
<!-- 自定义导航栏 -->
<wd-navbar :bordered="false"
custom-style="background: transparent !important; backdrop-filter: blur(10px) !important; -webkit-backdrop-filter: blur(20px) !important;"
safeAreaInsetTop fixed placeholder>
<template #left>
<view class="li-ml-15 li-mt-10 li-flex li-items-center">
<text class="ri-arrow-left-s-line li-text-70" @click="goBack"></text>
<text class="li-text-42">添加员工</text>
</view>
</template>
</wd-navbar>
<!-- 导航栏背景 -->
<view class="nav-bg-layer"></view>
<!-- 页面背景 -->
<view class="page-bg"></view>
<view class="content">
<!-- 表单区域 -->
<wd-form ref="form" :model="formData" :rules="rules" class="form-wrapper">
<wd-cell-group border class="form-card">
<wd-input
v-model="formData.name"
label="员工姓名"
placeholder="请输入姓名"
prop="name"
label-width="100px"
clearable
/>
<wd-input
v-model="formData.phone"
label="手机号码"
type="number"
placeholder="请输入手机号"
prop="phone"
label-width="100px"
clearable
/>
<wd-input
v-model="formData.password"
label="初始密码"
placeholder="123456"
prop="password"
label-width="100px"
disabled
/>
<wd-cell
title="所属小区"
:value="villageName"
@click="showVillagePopup = true"
is-link
title-width="100px"
/>
<wd-cell
title="权限设置"
@click="openPermissionPopup"
is-link
title-width="100px"
>
<view class="permission-summary">
<text>{{ getPermissionSummary() }}</text>
</view>
</wd-cell>
</wd-cell-group>
<!-- 提交按钮 -->
<view class="submit-btn-wrapper">
<wd-button type="primary" block @click="submitForm" custom-style="background: linear-gradient(135deg, #42a5ff, #0070F0);">创建员工</wd-button>
</view>
</wd-form>
<!-- 选择小区弹窗 -->
<wd-popup v-model="showVillagePopup" position="bottom" title="选择小区" round>
<view class="village-popup">
<view
v-for="(item, index) in villages"
:key="index"
class="village-item"
:class="{ active: formData.villageId === item.id }"
@click="selectVillage(item)"
>
<view class="village-name">{{ item.name }}</view>
<view class="village-check">
<text class="ri-checkbox-circle-fill" v-if="formData.villageId === item.id"></text>
</view>
</view>
</view>
</wd-popup>
<!-- 权限设置弹窗 -->
<wd-popup v-model="showPermissionPopup" position="bottom" custom-style="border-radius: 20rpx 20rpx 0 0;" :safe-area-inset-bottom="true">
<permission-settings
:staff="staffWithPermissions"
:permissions="allPermissions"
@save="savePermissions"
@cancel="closePermissionPopup"
/>
</wd-popup>
</view>
</view>
</template>
<script setup lang="ts">
import { ref, computed, reactive } from 'vue';
import { useNavigation } from '@/hooks/useNavigation';
import PermissionSettings from '@/components/PermissionSettings.vue';
// 导航相关
const { toPages } = useNavigation();
// 表单引用
const form = ref(null);
// 表单数据
const formData = reactive({
name: '',
phone: '',
password: '123456',
villageId: '',
permissions: []
});
// 表单验证规则
const rules = {
name: [
{ required: true, message: '请输入员工姓名' }
],
phone: [
{ required: true, message: '请输入手机号码' },
{ pattern: /^1\d{10}$/, message: '手机号格式不正确' }
],
password: [
{ required: true, message: '默认初始密码' }
]
};
// 小区数据
const villages = ref([
{ id: '1', name: '阳光花园小区' },
{ id: '2', name: '幸福家园小区' },
{ id: '3', name: '时代广场小区' }
]);
// 显示小区选择弹窗
const showVillagePopup = ref(false);
// 当前选中的小区名称
const villageName = computed(() => {
const village = villages.value.find(v => v.id === formData.villageId);
return village ? village.name : '请选择';
});
// 选择小区
const selectVillage = (village) => {
formData.villageId = village.id;
showVillagePopup.value = false;
};
// 权限弹窗
const showPermissionPopup = ref(false);
// 权限数据,用于传递给权限设置组件
const staffWithPermissions = computed(() => {
return {
name: formData.name || '新员工',
permissions: formData.permissions
};
});
// 所有权限列表
const allPermissions = [
{ value: 'delivery', label: '配送权限', icon: 'ri-truck-line', description: '允许配送相关的订单处理', colorClass: 'delivery-color', isCommon: true },
{ value: 'maintenance', label: '维修权限', icon: 'ri-tools-line', description: '允许接受维修工单和处理', colorClass: 'maintenance-color', isCommon: true },
{ value: 'finance', label: '财务管理', icon: 'ri-money-cny-circle-line', description: '允许处理财务相关事务', colorClass: 'finance-color', isCommon: true },
{ value: 'resident', label: '住户管理', icon: 'ri-user-line', description: '允许管理小区住户信息', colorClass: 'general-color', isCommon: false },
{ value: 'security', label: '安防权限', icon: 'ri-shield-line', description: '允许管理小区安防系统', colorClass: 'general-color', isCommon: false },
{ value: 'admin', label: '管理员权限', icon: 'ri-admin-line', description: '系统管理员权限', colorClass: 'admin-color', isCommon: false },
{ value: 'parking', label: '车位管理', icon: 'ri-parking-line', description: '允许管理小区车位', colorClass: 'general-color', isCommon: false },
{ value: 'visitor', label: '访客管理', icon: 'ri-user-location-line', description: '允许管理小区访客', colorClass: 'general-color', isCommon: false },
{ value: 'complaint', label: '投诉处理', icon: 'ri-customer-service-line', description: '允许处理业主投诉', colorClass: 'general-color', isCommon: true },
{ value: 'facility', label: '设施管理', icon: 'ri-building-4-line', description: '允许管理小区公共设施', colorClass: 'general-color', isCommon: false },
{ value: 'notice', label: '通知发布', icon: 'ri-notification-line', description: '允许发布小区通知', colorClass: 'general-color', isCommon: false },
{ value: 'inspection', label: '巡检权限', icon: 'ri-survey-line', description: '允许进行小区巡检记录', colorClass: 'maintenance-color', isCommon: true },
];
// 打开权限设置弹窗
const openPermissionPopup = () => {
showPermissionPopup.value = true;
};
// 关闭权限设置弹窗
const closePermissionPopup = () => {
showPermissionPopup.value = false;
};
// 保存权限设置
const savePermissions = (staffData) => {
formData.permissions = [...staffData.permissions];
closePermissionPopup();
};
// 获取权限摘要文本
const getPermissionSummary = () => {
if (formData.permissions.length === 0) {
return '未设置权限';
}
// 获取已选权限的名称
const permNames = formData.permissions.map(code => {
const perm = allPermissions.find(p => p.value === code);
return perm ? perm.label : '';
}).filter(name => name);
if (permNames.length <= 2) {
return permNames.join('、');
} else {
return `${permNames[0]}${permNames[1]}${permNames.length}`;
}
};
// 返回上一页
const goBack = () => {
uni.navigateBack();
};
// 提交表单
const submitForm = () => {
form.value.validate()
.then(({ valid, errors }) => {
if (valid) {
if (!formData.villageId) {
uni.showToast({ title: '请选择所属小区', icon: 'none' });
return;
}
// 显示加载
uni.showLoading({ title: '提交中...' });
// 模拟提交
setTimeout(() => {
uni.hideLoading();
uni.showToast({ title: '添加成功', icon: 'success' });
// 延迟返回
setTimeout(() => {
uni.navigateBack();
}, 1500);
}, 1000);
} else {
console.log('表单校验失败', errors);
}
})
.catch(error => {
console.error('表单校验异常', error);
});
};
</script>
<style lang="scss" scoped>
/* 主容器 */
.container {
min-height: 100vh;
background-color: transparent;
position: relative;
font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, Helvetica, Segoe UI, Arial, Roboto, PingFang SC, sans-serif;
padding-bottom: env(safe-area-inset-bottom);
}
/* 导航栏背景 */
.nav-bg-layer {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: calc(var(--status-bar-height) + 88rpx);
background: linear-gradient(180deg, rgba(255, 255, 255, 0.95) 0%, rgba(255, 255, 255, 0.9) 100%);
z-index: -1;
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
}
/* 页面背景 */
.page-bg {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(135deg, #f8fafd 0%, #eef2f9 100%);
z-index: -2;
&::before {
content: '';
position: absolute;
top: 0;
right: 0;
width: 100%;
height: 30%;
background: linear-gradient(135deg, rgba(66, 165, 255, 0.03), rgba(0, 112, 240, 0));
z-index: -1;
}
&::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 40%;
background: linear-gradient(315deg, rgba(66, 165, 255, 0.02), rgba(0, 112, 240, 0));
z-index: -1;
}
}
/* 内容区域 */
.content {
position: relative;
z-index: 2;
padding: 30rpx;
padding-bottom: 50rpx;
/* #ifdef MP-WEIXIN */
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
/* #endif */
}
/* 表单包装器 */
.form-wrapper {
width: 100%;
}
/* 表单卡片 */
.form-card {
background-color: #fff;
border-radius: 16rpx;
overflow: hidden;
margin-bottom: 40rpx;
box-shadow: 0 8rpx 16rpx rgba(0, 112, 240, 0.06);
}
/* 提交按钮 */
.submit-btn-wrapper {
margin-top: 60rpx;
padding: 0 20rpx;
}
/* 小区选择弹窗 */
.village-popup {
padding: 30rpx;
max-height: 60vh;
}
.village-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 24rpx 16rpx;
border-bottom: 1px solid #f5f5f5;
&:last-child {
border-bottom: none;
}
&.active {
background-color: rgba(66, 165, 255, 0.05);
}
.village-name {
font-size: 28rpx;
color: #333;
}
.village-check {
color: #42a5ff;
font-size: 40rpx;
}
}
/* 权限摘要 */
.permission-summary {
display: flex;
align-items: center;
justify-content: flex-end;
font-size: 28rpx;
color: #666;
}
:deep(.wd-input__label) {
font-size: 28rpx !important;
color: #333 !important;
}
:deep(.wd-cell__title) {
font-size: 28rpx !important;
color: #333 !important;
}
:deep(.wd-cell__value) {
color: #666 !important;
}
:deep(.wd-button--primary) {
background: linear-gradient(135deg, #42a5ff, #0070F0) !important;
border: none !important;
}
</style>