| ¶Ô±ÈÐÂÎļþ | 
|  |  |  | 
|---|
|  |  |  | <template> | 
|---|
|  |  |  | <!-- æ°å»º/修湠--> | 
|---|
|  |  |  | <GlobalWindow | 
|---|
|  |  |  | :title="title" | 
|---|
|  |  |  | :visible.sync="visible" | 
|---|
|  |  |  | :confirm-working="isWorking" | 
|---|
|  |  |  | @confirm="confirm" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <el-form :model="form" ref="form" :rules="rules"> | 
|---|
|  |  |  | <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> | 
|---|
|  |  |  | <el-input v-model="form.realname" placeholder="请è¾å
¥å§å" v-trim maxlength="50"/> | 
|---|
|  |  |  | </el-form-item> | 
|---|
|  |  |  | <el-form-item label="æ§å«" prop="sex" required> | 
|---|
|  |  |  | <el-radio-group v-model="form.sex"> | 
|---|
|  |  |  | <el-radio label="1">ç·</el-radio> | 
|---|
|  |  |  | <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="@/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="birthday"> | 
|---|
|  |  |  | <el-date-picker v-model="form.birthday" value-format="yyyy-MM-dd" placeholder="è¯·éæ©ç¨æ·çæ¥"/> | 
|---|
|  |  |  | </el-form-item> | 
|---|
|  |  |  | </el-form> | 
|---|
|  |  |  | </GlobalWindow> | 
|---|
|  |  |  | </template> | 
|---|
|  |  |  |  | 
|---|
|  |  |  | <script> | 
|---|
|  |  |  | import BaseOpera from '@/components/base/BaseOpera' | 
|---|
|  |  |  | import GlobalWindow from '@/components/common/GlobalWindow' | 
|---|
|  |  |  | import { checkMobile, checkEmail } from '@/utils/form' | 
|---|
|  |  |  |  | 
|---|
|  |  |  | export default { | 
|---|
|  |  |  | name: 'OperaUserWindow', | 
|---|
|  |  |  | extends: BaseOpera, | 
|---|
|  |  |  | components: { GlobalWindow }, | 
|---|
|  |  |  | data () { | 
|---|
|  |  |  | return { | 
|---|
|  |  |  | // è¡¨åæ°æ® | 
|---|
|  |  |  | form: { | 
|---|
|  |  |  | id: null, | 
|---|
|  |  |  | username: '', // ç¨æ·å | 
|---|
|  |  |  | realname: '', // å§å | 
|---|
|  |  |  | empNo: '', // å·¥å· | 
|---|
|  |  |  | avatar: '/avatar/man.png', // å¤´å | 
|---|
|  |  |  | password: '', // å¯ç  | 
|---|
|  |  |  | mobile: '', // ææºå·ç  | 
|---|
|  |  |  | email: '', // é®ç®± | 
|---|
|  |  |  | sex: '1', // æ§å« | 
|---|
|  |  |  | birthday: '' // çæ¥ | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // éªè¯è§å | 
|---|
|  |  |  | rules: { | 
|---|
|  |  |  | username: [ | 
|---|
|  |  |  | { required: true, message: '请è¾å
¥ç¨æ·å' } | 
|---|
|  |  |  | ], | 
|---|
|  |  |  | realname: [ | 
|---|
|  |  |  | { required: true, message: '请è¾å
¥å§å' } | 
|---|
|  |  |  | ], | 
|---|
|  |  |  | password: [ | 
|---|
|  |  |  | { required: true, message: '请è¾å
¥å¯ç ', trigger: 'blur' }, | 
|---|
|  |  |  | { validator: this.validatePassword, trigger: 'blur' } | 
|---|
|  |  |  | ], | 
|---|
|  |  |  | avatar: [ | 
|---|
|  |  |  | { required: true, message: 'è¯·éæ©ç¨æ·å¤´å' } | 
|---|
|  |  |  | ], | 
|---|
|  |  |  | sex: [ | 
|---|
|  |  |  | { required: true, message: 'è¯·éæ©ç¨æ·æ§å«' } | 
|---|
|  |  |  | ], | 
|---|
|  |  |  | mobile: [ | 
|---|
|  |  |  | { validator: checkMobile } | 
|---|
|  |  |  | ], | 
|---|
|  |  |  | email: [ | 
|---|
|  |  |  | { validator: checkEmail } | 
|---|
|  |  |  | ] | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | 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() // éªè¯éè¿ | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * æå¼çªå£ | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param title çªå£æ é¢ | 
|---|
|  |  |  | * @param target è¡å¯¹è±¡ï¼ä»
ç¼è¾éè¯¥åæ°ï¼ | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | open (title, target) { | 
|---|
|  |  |  | this.title = title | 
|---|
|  |  |  | this.visible = true | 
|---|
|  |  |  | // æ°å»º | 
|---|
|  |  |  | if (target == null) { | 
|---|
|  |  |  | this.$nextTick(() => { | 
|---|
|  |  |  | this.$refs.form.resetFields() | 
|---|
|  |  |  | this.form.id = null | 
|---|
|  |  |  | this.form.departmentId = null | 
|---|
|  |  |  | this.form.positionIds = [] | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | return | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // ç¼è¾ | 
|---|
|  |  |  | this.$nextTick(() => { | 
|---|
|  |  |  | for (const key in this.form) { | 
|---|
|  |  |  | this.form[key] = target[key] | 
|---|
|  |  |  | } | 
|---|
|  |  |  | this.form.departmentId = target.department == null ? null : target.department.id | 
|---|
|  |  |  | this.form.positionIds = target.positions == null ? [] : target.positions.map(p => p.id) | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | created () { | 
|---|
|  |  |  | this.config({ | 
|---|
|  |  |  | api: '/system/user' | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | </script> | 
|---|
|  |  |  |  | 
|---|
|  |  |  | <style lang="scss" scoped> | 
|---|
|  |  |  | .global-window { | 
|---|
|  |  |  | /deep/ .el-date-editor { | 
|---|
|  |  |  | width: 100%; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // è¡¨å头åå¤ç | 
|---|
|  |  |  | /deep/ .form-item-avatar { | 
|---|
|  |  |  | .el-radio.is-bordered { | 
|---|
|  |  |  | height: auto; | 
|---|
|  |  |  | padding: 6px; | 
|---|
|  |  |  | margin: 0 10px 0 0; | 
|---|
|  |  |  | .el-radio__input { | 
|---|
|  |  |  | display: none; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | .el-radio__label { | 
|---|
|  |  |  | padding: 0; | 
|---|
|  |  |  | width: 48px; | 
|---|
|  |  |  | display: block; | 
|---|
|  |  |  | img { | 
|---|
|  |  |  | width: 100%; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | </style> | 
|---|