doum
2025-09-26 9057e04efad1b7d61c77a72e5c37a504d0aee935
admin/src/components/system/user/OperaUserWindow.vue
@@ -7,7 +7,7 @@
    @confirm="confirm"
  >
    <el-form :model="form" ref="form" :rules="rules">
      <el-form-item label="用户名" prop="username" required v-if="form.id ==null">
      <el-form-item label="用户名" prop="username" required>
        <el-input v-model="form.username" placeholder="请输入用户名" v-trim maxlength="50"/>
      </el-form-item>
      <el-form-item label="姓名" prop="realname" required>
@@ -19,30 +19,24 @@
          <el-radio label="0">女</el-radio>
        </el-radio-group>
      </el-form-item>
<!--      <el-form-item label="头像" prop="avatar" required>-->
<!--        <el-radio-group v-model="form.avatar" class="form-item-avatar">-->
<!--          <el-radio label="/avatar/man.png" border><img src="/avatar/man.png" alt=""></el-radio>-->
<!--          <el-radio label="/avatar/woman.png" border><img src="/avatar/woman.png" alt=""></el-radio>-->
<!--        </el-radio-group>-->
<!--      </el-form-item>-->
<!--      <el-form-item v-if="form.id == null" label="初始密码" prop="password" required>-->
<!--        <el-input v-model="form.password" type="password" placeholder="请输入初始密码" maxlength="30" show-password/>-->
<!--      </el-form-item>-->
<!--            <el-form-item label="所属部门" prop="departmentId" required>-->
<!--        <DepartmentSelect v-model="form.departmentId" placeholder="请选择用户所属部门" :inline="false" clearable/>-->
<!--      </el-form-item>-->
<!--      <el-form-item label="岗位" prop="positionId">-->
<!--        <PositionSelect v-model="form.positionIds" placeholder="请选择用户所在岗位" :inline="false" :multiple="true" clearable/>-->
<!--      </el-form-item>-->
      <el-form-item label="头像" prop="avatar" required>
        <el-radio-group v-model="form.avatar" class="form-item-avatar">
          <el-radio label="avatar/man.png" border><img src="@/assets/avatar/man.png" alt=""></el-radio>
          <el-radio label="avatar/woman.png" border><img src="@/assets/avatar/woman.png" alt=""></el-radio>
        </el-radio-group>
      </el-form-item>
      <el-form-item v-if="form.id == null" label="初始密码" prop="password" required>
        <el-input v-model="form.password" type="password" placeholder="请输入初始密码" maxlength="30" show-password/>
      </el-form-item>
      <el-form-item label="工号" prop="empNo">
        <el-input v-model="form.empNo" placeholder="请输入工号" v-trim maxlength="50"/>
      </el-form-item>
      <el-form-item label="手机号码" prop="mobile">
        <el-input v-model="form.mobile" placeholder="请输入手机号码" v-trim maxlength="11"/>
      </el-form-item>
<!--      <el-form-item label="邮箱" prop="email">-->
<!--        <el-input v-model="form.email" placeholder="请输入邮箱" v-trim maxlength="200"/>-->
<!--      </el-form-item>-->
      <el-form-item label="邮箱" prop="email">
        <el-input v-model="form.email" placeholder="请输入邮箱" v-trim maxlength="200"/>
      </el-form-item>
      <el-form-item label="生日" prop="birthday">
        <el-date-picker v-model="form.birthday" value-format="yyyy-MM-dd" placeholder="请选择用户生日"/>
      </el-form-item>
@@ -53,14 +47,12 @@
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import DepartmentSelect from '@/components/common/DepartmentSelect'
import PositionSelect from '@/components/common/PositionSelect'
import { checkMobile, checkEmail } from '@/utils/form'
export default {
  name: 'OperaUserWindow',
  extends: BaseOpera,
  components: { PositionSelect, DepartmentSelect, GlobalWindow },
  components: { GlobalWindow },
  data () {
    return {
      // 表单数据
@@ -69,8 +61,6 @@
        username: '', // 用户名
        realname: '', // 姓名
        empNo: '', // 工号
        departmentId: null, //  所属部门ID
        positionIds: [], //  所属岗位ID集
        avatar: '/avatar/man.png', // 头像
        password: '', // 密码
        mobile: '', // 手机号码
@@ -87,10 +77,8 @@
          { required: true, message: '请输入姓名' }
        ],
        password: [
          { required: true, message: '请输入密码' }
        ],
        departmentId: [
          { required: true, message: '请选择部门' }
          { required: true, message: '请输入密码', trigger: 'blur' },
          { validator: this.validatePassword, trigger: 'blur' }
        ],
        avatar: [
          { required: true, message: '请选择用户头像' }
@@ -108,9 +96,31 @@
    }
  },
  methods: {
    validatePassword (rule, value, callback) {
      if (!value) {
        callback(new Error('请输入密码'))
      } else {
        const lengthValid = /^.{6,20}$/.test(value)
        const hasLetter = /[a-zA-Z]/.test(value)
        const hasNumber = /[0-9]/.test(value)
        const hasSpecial = /[!@#$%^&*(),.?":{}|<>]/.test(value)
        const typesCount = [hasLetter, hasNumber, hasSpecial].filter(Boolean).length
        if (!lengthValid) {
          callback(new Error('密码长度需为6到20个字符'))
        } else if (typesCount < 2) {
          callback(new Error('密码需包含字母、数字及特殊字符中的至少两种'))
        } else {
          callback() // 验证通过
        }
      }
    },
    /**
     * @title 窗口标题
     * @target 编辑的用户对象
     * 打开窗口
     *
     * @param title 窗口标题
     * @param target 行对象(仅编辑需该参数)
     */
    open (title, target) {
      this.title = title
@@ -122,7 +132,6 @@
          this.form.id = null
          this.form.departmentId = null
          this.form.positionIds = []
          this.form.username=null
        })
        return
      }