| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | <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> |