Setting.vue 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108
  1. <template>
  2. <div class="setting" v-if="info">
  3. <template v-if="!settingFlag">
  4. <div class="setting-top">
  5. <div class="avator-box">
  6. <el-image
  7. :src="info.sys_user&&info.sys_user.image_url?info.sys_user.image_url:info.image_url?info.image_url:require('../assets/avatar.png')"
  8. fit="cover" style="width:96px;height:96px;">
  9. </el-image>
  10. <a class="img-crop" v-if="page!=='personCheck'">
  11. <upload :datafileList="infoForm.cover_image_list" :filleNumber="99" :changeFillId="handleAvatarSuccess" :fileName="'cover'" :showList="true" uploadType="image" />
  12. </a>
  13. </div>
  14. <div class="center">
  15. <div class="info-items">
  16. <label>用户名:</label>
  17. <span>{{page==='editPerson'||page==='personal'?info.sys_user.user_name:info.user_name}}</span>
  18. </div>
  19. <div class="info-items">
  20. <label>手机号码:</label>
  21. <span>{{(page==='editPerson'||page==='personal')&&info.sys_user.phone?info.sys_user.phone.substring(0,3)+'******'+info.sys_user.phone.substring(9,11):info.phone?info.phone.substring(0,3)+'******'+info.phone.substring(9,11):'-'}}</span>
  22. </div>
  23. <div class="info-items">
  24. <label>账号ID:</label>
  25. <span>{{page==='editPerson'||page==='personal'?info.sys_user.id:info.id}}</span>
  26. </div>
  27. <div class="info-items">
  28. <label>邮箱:</label>
  29. <span>{{(page==='editPerson'||page==='personal')&&info.sys_user.email?info.sys_user.email:info.email?info.email:'-'}}</span>
  30. </div>
  31. <div class="info-items">
  32. <label>{{page==='editPerson'||page==='personal'?'创建时间:':'注册时间:'}}</label>
  33. <span>{{page==='editPerson'||page==='personal'?info.sys_user.create_time:info.register_time}}</span>
  34. </div>
  35. <div class="info-items" v-if="page==='editOrgPerson'||page==='personCheck'">
  36. <label>机构:</label>
  37. <span>{{info.org_name}}</span>
  38. </div>
  39. </div>
  40. </div>
  41. <div class="setting-bottom">
  42. <div class="tabs-box">
  43. <a :class="[tabsIndex===0?'active':'']" @click="handleChangeTabs(0)">基本信息</a>
  44. <a :class="[tabsIndex===1?'active':'']" @click="handleChangeTabs(1)" v-if="page!=='personCheck'">安全设置</a>
  45. <a :class="[tabsIndex===2?'active':'']" @click="handleChangeTabs(2)" v-if="page!=='personCheck'">{{page==='editPerson'||page==='personal'?'我的权限':'权限设置'}}</a>
  46. </div>
  47. <template v-if="tabsIndex===0">
  48. <el-form :model="infoForm" :rules="rules" ref="ruleForm" label-width="150px" class="setting-form">
  49. <el-form-item label="用户名" prop="name">
  50. <el-input v-model="infoForm.name" disabled placeholder="请输入用户名"></el-input>
  51. </el-form-item>
  52. <el-form-item label="真实姓名" prop="realName">
  53. <el-input v-model="infoForm.realName" placeholder="请输入真实姓名" @blur="handleTrim('infoForm','realName')"></el-input>
  54. </el-form-item>
  55. <el-form-item label="性别" prop="sex">
  56. <el-radio-group v-model="infoForm.sex">
  57. <el-radio :label="1">男</el-radio>
  58. <el-radio :label="0">女</el-radio>
  59. </el-radio-group>
  60. </el-form-item>
  61. <el-form-item label="所在省市" prop="selectedOptions">
  62. <el-cascader
  63. size="medium"
  64. :options="$provinceCityList"
  65. v-model="infoForm.selectedOptions"
  66. @change="handleCity">
  67. </el-cascader>
  68. </el-form-item>
  69. <el-form-item label="备注" prop="desc">
  70. <el-input type="textarea" v-model="infoForm.desc" placeholder="请输入备注" maxlength="100" :rows="4" show-word-limit @blur="handleTrim('infoForm','desc')"></el-input>
  71. </el-form-item>
  72. <el-form-item v-if="page!=='personCheck'">
  73. <el-button type="primary" @click="onSubmit('ruleForm')" size="small" :loading="loading">保存</el-button>
  74. <el-button @click="onCancel('ruleForm')" size="small">取消</el-button>
  75. </el-form-item>
  76. <el-form-item v-else>
  77. <el-button type="primary" @click="handleAudit('up')" size="small" :loading="loading">通过</el-button>
  78. <el-button @click="handleAudit('down')" size="small">拒绝</el-button>
  79. </el-form-item>
  80. </el-form>
  81. </template>
  82. <template v-if="tabsIndex===1">
  83. <div class="safe-items">
  84. <label>登录密码</label>
  85. <div class="safe-items-right">
  86. <p class="hasContent">
  87. 已设置。密码至少6位字符,支持数字和字母,且必须同时包含数字和大小写字母。
  88. </p>
  89. <!-- <p v-else class="noContent">
  90. 您暂未设置密码,密码可以有效的保护账号的安全。
  91. </p> -->
  92. <a @click="handleSetting('passwordFlag')">{{'修改'}}</a>
  93. </div>
  94. </div>
  95. <div class="safe-items">
  96. <label>绑定手机</label>
  97. <div class="safe-items-right">
  98. <p v-if="info.phone||info.sys_user&&info.sys_user.phone" class="hasContent">
  99. 已绑定: {{(page==='editPerson'||page==='personal')&&info.sys_user.phone?info.sys_user.phone.substring(0,3)+'******'+info.sys_user.phone.substring(9,11):info.phone?info.phone.substring(0,3)+'******'+info.phone.substring(9,11):'-'}}
  100. </p>
  101. <p v-else class="noContent">
  102. 您暂未绑定手机,绑定手机可以有效的保护账号的安全。
  103. </p>
  104. <a @click="handleSetting('phoneFlag')">{{info.phone||info.sys_user&&info.sys_user.phone?'修改':'设置'}}</a>
  105. </div>
  106. </div>
  107. <div class="safe-items">
  108. <label>绑定邮箱</label>
  109. <div class="safe-items-right">
  110. <p v-if="info.email||info.sys_user&&info.sys_user.email" class="hasContent">
  111. 已绑定: {{info.email||info.sys_user.email}}
  112. </p>
  113. <p v-else class="noContent">
  114. 您暂未设置邮箱,绑定邮箱可以用来找回密码、接收通知等。
  115. </p>
  116. <a @click="handleSetting('emailFlag')">{{info.email||info.sys_user&&info.sys_user.email?'修改':'设置'}}</a>
  117. </div>
  118. </div>
  119. </template>
  120. <template v-if="tabsIndex===2&&(page==='editPerson'||page==='personal')">
  121. <table class="step-table">
  122. <tr>
  123. <td rowspan="2" class="step-table-header">管理权限</td>
  124. <td>系统用户</td>
  125. <td>机构管理</td>
  126. </tr>
  127. <tr>
  128. <td><el-checkbox v-model="manageAuth" :label="10001" :disabled="page==='personal'?true:false"><br/></el-checkbox></td>
  129. <td><el-checkbox v-model="manageAuth" :label="10002" :disabled="page==='personal'?true:false"><br/></el-checkbox></td>
  130. </tr>
  131. </table>
  132. <table class="step-table">
  133. <tr>
  134. <td rowspan="2" class="step-table-header">内容权限</td>
  135. <td class="td1">报纸管理</td>
  136. <td class="td1">画刊管理</td>
  137. <td class="td1">专辑管理</td>
  138. <td class="td1">评测管理</td>
  139. <td class="td1">练习册管理</td>
  140. <td class="td1">课程管理</td>
  141. <td class="td1">广告管理</td>
  142. </tr>
  143. <tr>
  144. <td class="td1"><el-checkbox v-model="manageAuth" :label="20001" :disabled="page==='personal'?true:false"><br/></el-checkbox></td>
  145. <td class="td1"><el-checkbox v-model="manageAuth" :label="20002" :disabled="page==='personal'?true:false"><br/></el-checkbox></td>
  146. <td class="td1"><el-checkbox v-model="manageAuth" :label="20003" :disabled="page==='personal'?true:false"><br/></el-checkbox></td>
  147. <td class="td1"><el-checkbox v-model="manageAuth" :label="20004" :disabled="page==='personal'?true:false"><br/></el-checkbox></td>
  148. <td class="td1"><el-checkbox v-model="manageAuth" :label="20005" :disabled="page==='personal'?true:false"><br/></el-checkbox></td>
  149. <td class="td1"><el-checkbox v-model="manageAuth" :label="20006" :disabled="page==='personal'?true:false"><br/></el-checkbox></td>
  150. <td class="td1"><el-checkbox v-model="manageAuth" :label="20007" :disabled="page==='personal'?true:false"><br/></el-checkbox></td>
  151. </tr>
  152. </table>
  153. <table class="step-table">
  154. <tr>
  155. <td rowspan="2" class="step-table-header">兑换码权限</td>
  156. <td>生成兑换码</td>
  157. <td>查看兑换码使用情况</td>
  158. </tr>
  159. <tr>
  160. <td><el-checkbox v-model="manageAuth" :label="30001"><br/></el-checkbox></td>
  161. <td>
  162. <el-radio-group v-model="codeAuth.viewCode" :disabled="page==='personal'?true:false">
  163. <el-radio :label="1">全部</el-radio>
  164. <el-radio :label="0">自己生成的</el-radio>
  165. </el-radio-group>
  166. </td>
  167. </tr>
  168. </table>
  169. <table class="step-table">
  170. <tr>
  171. <td rowspan="2" class="step-table-header">财务权限</td>
  172. <td>查看数据</td>
  173. <td>导出数据</td>
  174. <td>授权地区</td>
  175. </tr>
  176. <tr>
  177. <td><el-checkbox v-model="manageAuth" :label="40001" :disabled="page==='personal'?true:false"><br/></el-checkbox></td>
  178. <td><el-checkbox v-model="manageAuth" :label="40002" :disabled="page==='personal'?true:false"><br/></el-checkbox></td>
  179. <td>
  180. <el-cascader
  181. :disabled="page==='personal'?true:false"
  182. class="step-cascader"
  183. size="medium"
  184. :props="props"
  185. collapse-tags
  186. clearable
  187. :options="$provinceCityListAll"
  188. v-model="financeAuth.selectedOptions"
  189. @change="handleCity">
  190. </el-cascader>
  191. </td>
  192. </tr>
  193. </table>
  194. <template v-if="page==='editPerson'">
  195. <el-button type="primary" @click="onSubmitAuth()" size="small" :loading="loading">保存</el-button>
  196. <el-button @click="onCancelAuth()" size="small">取消</el-button>
  197. </template>
  198. </template>
  199. <template v-if="tabsIndex===2&&page==='editOrgPerson'">
  200. <el-form :model="managerForm" ref="managerForm" label-width="150px" class="setting-form">
  201. <el-form-item label="机构管理员" prop="is_manager">
  202. <el-radio-group v-model="managerForm.is_manager">
  203. <el-radio label="true">是</el-radio>
  204. <el-radio label="false">否</el-radio>
  205. </el-radio-group>
  206. </el-form-item>
  207. <el-form-item>
  208. <el-button type="primary" @click="onSubmitManager('managerForm')" size="small" :loading="loading">保存</el-button>
  209. <el-button @click="onCancel('managerForm')" size="small">取消</el-button>
  210. </el-form-item>
  211. </el-form>
  212. </template>
  213. </div>
  214. </template>
  215. <div class="setting-iframe" v-if="settingFlag&&passwordFlag">
  216. <p class="title">
  217. <i class="el-icon-arrow-left" @click="handleSetting('passwordFlag')"></i>
  218. 修改登录密码
  219. </p>
  220. <el-form :model="passwordForm" :rules="rulesPassword" ref="passwordForm" label-width="100px" class="passwordForm">
  221. <!-- <el-form-item label="原始密码" prop="oldPwd">
  222. <el-input v-model="passwordForm.oldPwd" :type="oldPwdFlag?'text':'password'" autocomplete="off" placeholder="请输入密码" >
  223. <i slot="suffix" class="el-icon-view show-icon" @click="changeIcon('oldPwdFlag')" v-if="oldPwdFlag"></i>
  224. <i slot="suffix" class="show-icon" @click="changeIcon('oldPwdFlag')" v-else>
  225. <svg-icon icon-class="eye-invisible"></svg-icon>
  226. </i>
  227. </el-input>
  228. </el-form-item> -->
  229. <el-form-item label="修改密码" prop="newPwd">
  230. <el-input v-model="passwordForm.newPwd" :type="newPwdFlag?'text':'password'" autocomplete="off" placeholder="请输入密码" @blur="handleTrim('passwordForm','newPwd')" >
  231. <i slot="suffix" class="el-icon-view show-icon" @click="changeIcon('newPwdFlag')" v-if="newPwdFlag"></i>
  232. <i slot="suffix" class="show-icon" @click="changeIcon('newPwdFlag')" v-else>
  233. <svg-icon icon-class="eye-invisible"></svg-icon>
  234. </i>
  235. </el-input>
  236. <p class="tips">不少于6位,且必须同时包含数字和大小写字母</p>
  237. </el-form-item>
  238. <el-form-item label="再次输入" prop="confirmPwd">
  239. <el-input v-model="passwordForm.confirmPwd" :type="comfirmPwdFlag?'text':'password'" autocomplete="off" placeholder="请输入密码" @blur="handleTrim('passwordForm','confirmPwd')" >
  240. <i slot="suffix" class="el-icon-view show-icon" @click="changeIcon('comfirmPwdFlag')" v-if="comfirmPwdFlag"></i>
  241. <i slot="suffix" class="show-icon" @click="changeIcon('comfirmPwdFlag')" v-else>
  242. <svg-icon icon-class="eye-invisible"></svg-icon>
  243. </i>
  244. </el-input>
  245. </el-form-item>
  246. <el-form-item>
  247. <el-button type="primary" @click="onSubmitPassword('passwordForm')" size="small" :loading="loading">保存</el-button>
  248. <el-button @click="onCancel('passwordForm')" size="small">取消</el-button>
  249. </el-form-item>
  250. </el-form>
  251. </div>
  252. <div class="setting-iframe" v-if="settingFlag&&phoneFlag">
  253. <p class="title">
  254. <i class="el-icon-arrow-left" @click="handleSetting('phoneFlag')"></i>
  255. 修改绑定手机
  256. </p>
  257. <el-form :model="phoneForm" :rules="rulesPhone" ref="phoneForm" label-width="100px" class="phoneForm">
  258. <el-form-item label="原手机号" prop="oldPhone" v-if="phoneForm.oldPhone">
  259. <el-input v-model="phoneForm.oldPhone" autocomplete="off" :disabled="phoneForm.oldPhone?true:false" placeholder="请输入完整手机号" @blur="handleTrim('phoneForm','oldPhone')">
  260. <template slot="prepend">+86</template>
  261. </el-input>
  262. </el-form-item>
  263. <el-form-item label="新手机号" prop="newPhone">
  264. <el-input v-model="phoneForm.newPhone" autocomplete="off" placeholder="请输入完整手机号" @blur="handleTrim('phoneForm','newPhone')" >
  265. <template slot="prepend">+86</template>
  266. </el-input>
  267. </el-form-item>
  268. <el-form-item>
  269. <el-button type="primary" @click="onSubmitPhone('phoneForm')" size="small" :loading="loading">保存</el-button>
  270. <el-button @click="onCancel('phoneForm')" size="small">取消</el-button>
  271. </el-form-item>
  272. </el-form>
  273. </div>
  274. <div class="setting-iframe" v-if="settingFlag&&emailFlag">
  275. <p class="title">
  276. <i class="el-icon-arrow-left" @click="handleSetting('emailFlag')"></i>
  277. 修改安全邮箱
  278. </p>
  279. <el-form :model="emailForm" :rules="rulesEmail" ref="emailForm" label-width="100px" class="emailForm">
  280. <el-form-item label="原邮箱" prop="email" v-if="emailForm.email">
  281. <el-input v-model="emailForm.email" autocomplete="off" :disabled="emailForm.email?true:false" placeholder="请输入邮箱地址" @blur="handleTrim('emailForm','email')">
  282. </el-input>
  283. </el-form-item>
  284. <el-form-item label="新邮箱" prop="newEmail">
  285. <el-input v-model="emailForm.newEmail" autocomplete="off" placeholder="请输入邮箱地址" @blur="handleTrim('emailForm','newEmail')" >
  286. </el-input>
  287. </el-form-item>
  288. <el-form-item>
  289. <el-button type="primary" @click="onSubmitEmail('emailForm')" size="small" :loading="loading">保存</el-button>
  290. <el-button @click="onCancel('emailForm')" size="small">取消</el-button>
  291. </el-form-item>
  292. </el-form>
  293. </div>
  294. </div>
  295. </template>
  296. <script>
  297. //这里可以导入其它文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
  298. //例如:import 《组件名称》from ‘《组件路径》';
  299. import Upload from "./Upload.vue"
  300. import { getLogin } from "@/api/ajax";
  301. import { getToken } from '@/utils/auth'
  302. import { mapState } from 'vuex';
  303. export default {
  304. //import引入的组件需要注入到对象中才能使用
  305. components: { Upload },
  306. props: ["page","info"],
  307. data() {
  308. //这里存放数据
  309. const validatePass = (rule, value, callback) => {
  310. if (value === '') {
  311. callback(new Error('请输入密码'));
  312. } else {
  313. let reg = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z\d]{6,16}$/;
  314. let result = reg.test(value);
  315. if (result) {
  316. callback();
  317. } else {
  318. callback(new Error('密码必须同时包含数字和大小写字母'));
  319. }
  320. }
  321. };
  322. const validatePass2 = (rule, value, callback) => {
  323. if (value === '') {
  324. callback(new Error('请再次输入密码'));
  325. } else if (value !== this.passwordForm.newPwd) {
  326. callback(new Error('两次输入密码不一致!'));
  327. } else {
  328. callback();
  329. }
  330. };
  331. const validatePhone = (rule, value, callback) => {
  332. if (value === '') {
  333. callback(new Error('请输入手机号'));
  334. } else {
  335. let reg = /^1[3-9]\d{9}$/;
  336. let result = reg.test(value);
  337. if (result) {
  338. callback();
  339. } else {
  340. callback(new Error('请输入正确的手机号'));
  341. }
  342. }
  343. };
  344. const validateEmail = (rule, value, callback) => {
  345. if (value === '') {
  346. callback(new Error('请输入邮箱地址'));
  347. } else {
  348. let reg = /^[a-zA-Z0-9_\.-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;
  349. let result = reg.test(value);
  350. if (result) {
  351. callback();
  352. } else {
  353. callback(new Error('请输入正确的邮箱地址'));
  354. }
  355. }
  356. };
  357. const validateProvince = (rule, value, callback) => {
  358. if(value===[]){
  359. callback(new Error('请选择所在省市'));
  360. }else if(value.length===2){
  361. if(value[0]===''||value[1]===''){
  362. callback(new Error('请选择所在省市'));
  363. }else{
  364. callback();
  365. }
  366. }else {
  367. callback();
  368. }
  369. };
  370. return {
  371. show: false, // 编辑头像flag
  372. tabsIndex: 0,
  373. infoForm:{
  374. cover_image_url: '',
  375. cover_image_list: [],
  376. cover_image_id: null,
  377. name:this.page==='editPerson'||this.page==='personal'?JSON.parse(JSON.stringify(this.info.sys_user.user_name)):JSON.parse(JSON.stringify(this.info.user_name)),
  378. realName:this.page==='editPerson'||this.page==='personal'?JSON.parse(JSON.stringify(this.info.sys_user.real_name)):JSON.parse(JSON.stringify(this.info.real_name)),
  379. sex:this.page==='editPerson'||this.page==='personal'?JSON.parse(JSON.stringify(this.info.sys_user.sex)):JSON.parse(JSON.stringify(this.info.sex)),
  380. selectedOptions: this.page==='editPerson'||this.page==='personal'?[JSON.parse(JSON.stringify(this.info.sys_user.province_id)),JSON.parse(JSON.stringify(this.info.sys_user.city_id))]:[JSON.parse(JSON.stringify(this.info.province_id)),JSON.parse(JSON.stringify(this.info.city_id))],
  381. desc:this.page==='editPerson'||this.page==='personal'?JSON.parse(JSON.stringify(this.info.sys_user.memo)):JSON.parse(JSON.stringify(this.info.memo)),
  382. // selectedOptions: '0302',
  383. },
  384. rules: {
  385. name: [
  386. { required: true, message: '请输入用户名', trigger: 'blur' }
  387. ],
  388. selectedOptions: [
  389. { type: 'array', required: true, validator: validateProvince, trigger: 'change' }
  390. ],
  391. sex:[
  392. { required: true, message: '请选择性别', trigger: 'change' },
  393. ],
  394. },
  395. settingFlag: false, // 修改设置
  396. passwordFlag: false, // 修改密码
  397. phoneFlag: false, // 修改手机
  398. emailFlag: false, // 修改邮箱
  399. passwordForm:{
  400. newPwd:'', // 新密码
  401. confirmPwd:'' // 确认密码
  402. },
  403. rulesPassword:{
  404. newPwd:[
  405. { required: true, validator: validatePass, trigger: 'blur' },
  406. { min: 6, max: 16, message: '请输入 6-16 位密码,且必须同时包含数字和大小写字母', trigger:'change' },
  407. ],
  408. confirmPwd:[
  409. { required: true, validator: validatePass2, trigger: 'blur' }
  410. ]
  411. },
  412. oldPwdFlag: false, // 查看旧密码
  413. newPwdFlag: false, // 查看新密码
  414. comfirmPwdFlag: false, // 查看确认密码
  415. phoneForm:{
  416. oldPhone:this.page==='editPerson'||this.page==='personal'?JSON.parse(JSON.stringify(this.info.sys_user.phone)):JSON.parse(JSON.stringify(this.info.phone)), // 旧手机
  417. newPhone:'', // 新手机
  418. },
  419. rulesPhone:{
  420. oldPhone:[
  421. { required: true, validator: validatePhone, trigger: 'blur' },
  422. ],
  423. newPhone:[
  424. { required: true, validator: validatePhone, trigger: 'blur' },
  425. ]
  426. },
  427. time: 60, //获取验证码的时间
  428. verificationCodeShow: false, //是否已经获取了验证码
  429. times: 60, //获取验证码的时间
  430. verificationCodesShow: false, //是否已经获取了验证码
  431. timee: 60, //获取验证码的时间
  432. verificationCodeeShow: false, //是否已经获取了验证码
  433. emailForm:{
  434. email:this.page==='editPerson'||this.page==='personal'?JSON.parse(JSON.stringify(this.info.sys_user.email)):JSON.parse(JSON.stringify(this.info.email)),
  435. newEmail:''
  436. },
  437. rulesEmail:{
  438. email:[
  439. { required: true, validator: validateEmail, trigger: 'blur' },
  440. ],
  441. newEmail:[
  442. { required: true, validator: validateEmail, trigger: 'blur' }
  443. ]
  444. },
  445. manageAuth:this.page==='editPerson'||this.page==='personal'?JSON.parse(JSON.stringify(this.info.popedom_code_list)):[], // 管理权限
  446. codeAuth:{
  447. auth:[],
  448. viewCode:this.page==='editPerson'||this.page==='personal'?JSON.parse(JSON.stringify(this.info.data_scope.discount_code_view_scope)):0
  449. }, // 兑换码权限
  450. financeAuth:{
  451. auth: [],
  452. selectedOptions:this.page==='editPerson'||this.page==='personal'?JSON.parse(JSON.stringify(this.info.data_scope.finance_popedom_data_scope)):[]
  453. }, // 财务权限
  454. props: { multiple: true },
  455. loading: false,
  456. id:this.$route.query.id?this.$route.query.id:'',
  457. managerForm:{
  458. is_manager: this.page==='editOrgPerson'?JSON.parse(JSON.stringify(this.info.is_manager)):"false"
  459. }
  460. }
  461. },
  462. //计算属性 类似于data概念
  463. computed: {
  464. ...mapState(['$provinceCityList','$provinceCityListAll']),
  465. },
  466. //监控data中数据变化
  467. watch: {
  468. },
  469. //方法集合
  470. methods: {
  471. handleAvatarSuccess(fileList,name) {
  472. let MethodName = "/OrgServer/Manager/SysUserManager/UpdateSysUser_Image";
  473. if(this.page==='editOrgPerson'){
  474. MethodName = "/OrgServer/Manager/PersonManager/UpdatePerson_Image";
  475. }
  476. let data = {
  477. id: this.page==='personal'?JSON.parse(getToken()).user_id:this.id,
  478. image_id: fileList.length>0&&fileList[fileList.length-1].response&&fileList[fileList.length-1].response.file_info_list&&fileList[fileList.length-1].response.file_info_list[0]?fileList[fileList.length-1].response.file_info_list[0].file_id:''
  479. }
  480. getLogin(MethodName, data)
  481. .then((res) => {
  482. if(res.status===1){
  483. this.$emit("getInfo")
  484. }
  485. }).catch((res) =>{
  486. })
  487. },
  488. // 切换tabs
  489. handleChangeTabs(value){
  490. this.tabsIndex = value
  491. let breadcrumb = []
  492. if(this.page==='editOrgPerson'){
  493. breadcrumb = [
  494. {
  495. icon:'school-line',
  496. url:'',
  497. text:''
  498. },
  499. {
  500. icon:'',
  501. url:'',
  502. text:'机构管理'
  503. },
  504. {
  505. icon:'',
  506. url:'',
  507. text:this.info.org_name
  508. },
  509. {
  510. icon:'',
  511. url:'',
  512. notLink: true,
  513. text:value===0?'人员信息':value===1?'安全设置':'权限设置'
  514. }
  515. ]
  516. this.$emit("changeBread",breadcrumb)
  517. }
  518. },
  519. // 级联选择器
  520. handleCity(value){
  521. console.log(value)
  522. },
  523. // 提交表单
  524. onSubmit(formName){
  525. this.$refs[formName].validate((valid) => {
  526. if (valid) {
  527. this.loading = true
  528. let MethodName = "/OrgServer/Manager/SysUserManager/UpdateSysUser_BaseInfo";
  529. if(this.page==='editOrgPerson'){
  530. MethodName = "/OrgServer/Manager/PersonManager/UpdatePerson_BaseInfo";
  531. }
  532. let data = {
  533. id: this.page==='personal'?JSON.parse(getToken()).user_id:this.id,
  534. user_name: this.infoForm.name,
  535. real_name: this.infoForm.realName,
  536. sex: this.infoForm.sex,
  537. city_id: this.infoForm.selectedOptions[1],
  538. memo: this.infoForm.desc
  539. }
  540. getLogin(MethodName, data)
  541. .then((res) => {
  542. this.loading = false
  543. if(res.status===1){
  544. this.$emit("getInfo")
  545. }
  546. }).catch((res) =>{
  547. this.loading = false
  548. })
  549. } else {
  550. return false;
  551. }
  552. });
  553. },
  554. // 取消 恢复到修改前状态
  555. onCancel(formName){
  556. this.$refs[formName].resetFields();
  557. },
  558. // 修改设置
  559. handleSetting(flag){
  560. this.settingFlag = !this.settingFlag
  561. this[flag] = !this[flag]
  562. let breadcrumb = []
  563. if(this.page==='editPerson'){
  564. if(this[flag]){
  565. breadcrumb = [
  566. {
  567. icon:'contacts-line',
  568. url:'',
  569. text:''
  570. },
  571. {
  572. icon:'',
  573. url:'',
  574. text:'系统用户'
  575. },
  576. {
  577. icon:'',
  578. url:'',
  579. notLink: true,
  580. text:'安全设置'
  581. },
  582. {
  583. icon:'',
  584. url:'',
  585. text:flag==='passwordFlag'?'修改密码':flag==='phoneFlag'?'绑定手机':'安全邮箱'
  586. }
  587. ]
  588. }else{
  589. breadcrumb = [
  590. {
  591. icon:'contacts-line',
  592. url:'',
  593. text:''
  594. },
  595. {
  596. icon:'',
  597. url:'',
  598. text:'系统用户'
  599. },
  600. {
  601. icon:'',
  602. url:'',
  603. text:'编辑'
  604. }
  605. ]
  606. }
  607. this.$emit("changeBread",breadcrumb)
  608. }
  609. },
  610. changeIcon(flag){
  611. this[flag] = !this[flag]
  612. },
  613. // 修改密码提交表单
  614. onSubmitPassword(formName){
  615. this.$refs[formName].validate((valid) => {
  616. if (valid) {
  617. this.loading = true
  618. let MethodName = "/OrgServer/Manager/SysUserManager/UpdateSysUser_Password";
  619. if(this.page==='editOrgPerson'){
  620. MethodName = "/OrgServer/Manager/PersonManager/UpdatePerson_Password";
  621. }
  622. let data = {
  623. id: this.page==='personal'?JSON.parse(getToken()).user_id:this.id,
  624. password: this.passwordForm.newPwd
  625. }
  626. getLogin(MethodName, data)
  627. .then((res) => {
  628. this.loading = false
  629. if(res.status===1){
  630. this.$message.success("修改成功")
  631. this.$emit("getInfo")
  632. this.handleSetting('passwordFlag')
  633. }
  634. }).catch((res) =>{
  635. this.loading = false
  636. })
  637. } else {
  638. return false;
  639. }
  640. });
  641. },
  642. // 修改手机提交表单
  643. onSubmitPhone(formName){
  644. this.$refs[formName].validate((valid) => {
  645. if (valid) {
  646. this.loading = true
  647. let MethodName = "/OrgServer/Manager/SysUserManager/UpdateSysUser_Phone";
  648. if(this.page==='editOrgPerson'){
  649. MethodName = "/OrgServer/Manager/PersonManager/UpdatePerson_Phone";
  650. }
  651. let data = {
  652. id: this.page==='personal'?JSON.parse(getToken()).user_id:this.id,
  653. phone: this.phoneForm.newPhone
  654. }
  655. getLogin(MethodName, data)
  656. .then((res) => {
  657. this.loading = false
  658. if(res.status===1){
  659. this.$message.success("修改成功")
  660. this.$emit("getInfo")
  661. this.handleSetting('phoneFlag')
  662. this.phoneForm.oldPhone = JSON.parse(JSON.stringify(this.phoneForm.newPhone))
  663. this.phoneForm.newPhone = ''
  664. }
  665. }).catch((res) =>{
  666. this.loading = false
  667. })
  668. } else {
  669. return false;
  670. }
  671. });
  672. },
  673. // 修改邮箱
  674. onSubmitEmail(formName){
  675. this.$refs[formName].validate((valid) => {
  676. if (valid) {
  677. this.loading = true
  678. let MethodName = "/OrgServer/Manager/SysUserManager/UpdateSysUser_Email";
  679. if(this.page==='editOrgPerson'){
  680. MethodName = "/OrgServer/Manager/PersonManager/UpdatePerson_Email";
  681. }
  682. let data = {
  683. id: this.page==='personal'?JSON.parse(getToken()).user_id:this.id,
  684. email: this.emailForm.newEmail
  685. }
  686. getLogin(MethodName, data)
  687. .then((res) => {
  688. this.loading = false
  689. if(res.status===1){
  690. this.$message.success("修改成功")
  691. this.$emit("getInfo")
  692. this.handleSetting('emailFlag')
  693. this.emailForm.email = JSON.parse(JSON.stringify(this.emailForm.newEmail))
  694. this.emailForm.newEmail = ''
  695. }
  696. }).catch((res) =>{
  697. this.loading = false
  698. })
  699. } else {
  700. return false;
  701. }
  702. });
  703. },
  704. // 去掉前后空格
  705. handleTrim(form,fild){
  706. this[form][fild] = this[form][fild].trim()
  707. },
  708. // 修改权限
  709. onSubmitAuth(){
  710. this.loading = true
  711. let MethodName = "/OrgServer/Manager/SysUserManager/UpdateSysUser_Popedom";
  712. let data = {
  713. id: this.page==='personal'?JSON.parse(getToken()).user_id:this.id,
  714. popedom_code_list: this.manageAuth,
  715. data_scope:{
  716. discount_code_view_scope:this.codeAuth.viewCode,
  717. finance_popedom_data_scope:{
  718. province_id_list:['03'],
  719. city_id_list:['02'],
  720. }
  721. }
  722. }
  723. getLogin(MethodName, data)
  724. .then((res) => {
  725. this.loading = false
  726. if(res.status===1){
  727. this.$message.success("修改成功")
  728. }
  729. }).catch((res) =>{
  730. this.loading = false
  731. })
  732. },
  733. // 取消权限
  734. onCancelAuth(){
  735. this.manageAuth = []
  736. this.codeAuth.viewCode = 0
  737. this.financeAuth.selectedOptions = []
  738. },
  739. // 修改管理员权限
  740. onSubmitManager(){
  741. this.loading = true
  742. let MethodName = "/OrgServer/Manager/PersonManager/UpdatePerson_Popedom";
  743. let data = {
  744. id: this.page==='personal'?JSON.parse(getToken()).user_id:this.id,
  745. is_manager: this.managerForm.is_manager,
  746. }
  747. getLogin(MethodName, data)
  748. .then((res) => {
  749. this.loading = false
  750. if(res.status===1){
  751. this.$message.success("修改成功")
  752. }
  753. }).catch((res) =>{
  754. this.loading = false
  755. })
  756. },
  757. // 通过 拒绝
  758. handleAudit(type) {
  759. let Mname = "/OrgServer/Manager/PersonManager/AuditPerson";
  760. let data = {
  761. id_list: [this.id]
  762. };
  763. if (type==='up') {
  764. // 下架状态
  765. data.is_pass = "true";
  766. } else if (type==='down') {
  767. data.is_pass = "false";
  768. }
  769. getLogin(Mname, data).then(res => {
  770. this.$message.success("操作成功");
  771. this.$router.go(-1)
  772. });
  773. },
  774. },
  775. //生命周期 - 创建完成(可以访问当前this实例)
  776. created() {
  777. },
  778. //生命周期 - 挂载完成(可以访问DOM元素)
  779. mounted() {
  780. },
  781. //生命周期-创建之前
  782. beforeCreated() { },
  783. //生命周期-挂载之前
  784. beforeMount() { },
  785. //生命周期-更新之前
  786. beforUpdate() { },
  787. //生命周期-更新之后
  788. updated() { },
  789. //生命周期-销毁之前
  790. beforeDestory() { },
  791. //生命周期-销毁完成
  792. destoryed() { },
  793. //如果页面有keep-alive缓存功能,这个函数会触发
  794. activated() { }
  795. }
  796. </script>
  797. <style lang="scss" scoped>
  798. /* @import url(); 引入css类 */
  799. .setting{
  800. height: 100%;
  801. &-top{
  802. margin: 0 0 12px 0;
  803. background: #FFFFFF;
  804. border-radius: 8px;
  805. display: flex;
  806. align-items: center;
  807. width: 100%;
  808. padding: 22px 40px;
  809. .avator-box{
  810. width: 96px;
  811. height: 96px;
  812. position: relative;
  813. .img-crop{
  814. position: absolute;
  815. // padding: 4px;
  816. width: 30px;
  817. height: 30px;
  818. right: -4px;
  819. bottom: -4px;
  820. border-radius: 50%;
  821. display: block;
  822. text-align: center;
  823. font-size: 0;
  824. border: 2px solid #FFFFFF;
  825. background: #F2F3F5 url("../assets/camera.png") center no-repeat;
  826. background-size: 12px;
  827. }
  828. .el-image{
  829. border-radius: 50%;
  830. overflow: hidden;
  831. }
  832. }
  833. .center{
  834. flex: 1;
  835. display: flex;
  836. flex-flow: wrap;
  837. margin-top: 12px;
  838. .info-items{
  839. margin-bottom: 12px;
  840. width: 40%;
  841. }
  842. label{
  843. font-weight: 400;
  844. font-size: 14px;
  845. line-height: 22px;
  846. color: #86909C;
  847. width: 156px;
  848. text-align: right;
  849. display: inline-block;
  850. padding-right: 10px;
  851. }
  852. span{
  853. font-size: 14px;
  854. line-height: 22px;
  855. color: #1D2129;
  856. }
  857. }
  858. }
  859. &-bottom{
  860. padding: 24px;
  861. background: #FFFFFF;
  862. border-radius: 4px;
  863. min-height: calc(100vh - 270px);
  864. .tabs-box{
  865. display: flex;
  866. padding-bottom: 16px;
  867. a{
  868. font-size: 14px;
  869. line-height: 22px;
  870. color: #4E5969;
  871. border-radius: 100px;
  872. padding: 5px 16px;
  873. margin-right: 12px;
  874. &:hover{
  875. background: #F2F3F5;
  876. }
  877. &.active{
  878. background: #F2F3F5;
  879. font-weight: 500;
  880. color: #165DFF;
  881. }
  882. }
  883. }
  884. .btn{
  885. margin-left: 16px;
  886. }
  887. .safe-items{
  888. display: flex;
  889. width: 100%;
  890. padding: 30px 20px 13px 20px;
  891. label{
  892. font-weight: 500;
  893. font-size: 14px;
  894. line-height: 22px;
  895. color: #4E5969;
  896. }
  897. &-right{
  898. border-bottom: 1px solid #E5E6EB;
  899. padding-bottom: 20px;
  900. flex: 1;
  901. margin-left: 16px;
  902. display: flex;
  903. justify-content: space-between;
  904. p{
  905. margin: 0;
  906. font-weight: 400;
  907. font-size: 14px;
  908. line-height: 22px;
  909. color: #4E5969;
  910. &.noContent{
  911. color: #86909C;
  912. }
  913. }
  914. a{
  915. font-weight: 400;
  916. font-size: 14px;
  917. line-height: 22px;
  918. color: #165DFF;
  919. }
  920. }
  921. }
  922. }
  923. &-iframe{
  924. width: 100%;
  925. height: 100%;
  926. background: #FFFFFF;
  927. padding: 24px;
  928. .title{
  929. margin: 0;
  930. font-weight: 400;
  931. font-size: 20px;
  932. line-height: 28px;
  933. color: #000000;
  934. .el-icon-arrow-left{
  935. margin-right: 8px;
  936. cursor: pointer;
  937. }
  938. }
  939. .passwordForm,.phoneForm,.emailForm{
  940. padding-top: 40px;
  941. .show-icon{
  942. cursor: pointer;
  943. color: #4E5969;
  944. }
  945. }
  946. .code-input{
  947. width: 268px;
  948. .el-input__inner{
  949. border-radius: 2px 0 0 2px;
  950. }
  951. }
  952. }
  953. }
  954. .step-table{
  955. border: 1px solid #E5E6EB;
  956. border-collapse: collapse;
  957. font-size: 14px;
  958. line-height: 22px;
  959. color: #1D2129;
  960. text-align: center;
  961. margin-bottom: 24px;
  962. &-header{
  963. background: #F7F8FA;
  964. width: 120px !important;
  965. color: #86909C;
  966. font-weight: 500;
  967. }
  968. td{
  969. height: 40px;
  970. width: 260px;
  971. border: 1px solid #E5E6EB;
  972. &.td1{
  973. width: 130px;
  974. }
  975. }
  976. .step-cascader{
  977. width: 250px;
  978. height: 32px;
  979. line-height: 32px;
  980. }
  981. }
  982. .tips{
  983. margin: 0;
  984. color: #86909C;
  985. font-size: 12px;
  986. line-height: 20px;
  987. }
  988. </style>
  989. <style lang="scss">
  990. .setting{
  991. .el-input,.el-textarea{
  992. width: 360px;
  993. }
  994. .el-input__inner{
  995. height: 32px;
  996. color: #1D2129;
  997. background: #F2F3F5;
  998. border: none;
  999. }
  1000. .el-textarea__inner,.el-input-group__prepend{
  1001. color: #1D2129;
  1002. background: #F2F3F5;
  1003. border: none;
  1004. }
  1005. .el-input__count{
  1006. background: #F2F3F5;
  1007. }
  1008. .el-form-item__label{
  1009. font-weight: 400;
  1010. font-size: 14px;
  1011. line-height: 32px;
  1012. color: #4E5969;
  1013. }
  1014. .el-form-item__content,.el-input__icon{
  1015. line-height: 32px;
  1016. color: #4E5969 !important;
  1017. }
  1018. .el-form-item{
  1019. margin-bottom: 20px;
  1020. }
  1021. .el-radio__input.is-checked+.el-radio__label{
  1022. color: #165DFF;
  1023. }
  1024. .el-radio__input.is-checked .el-radio__inner{
  1025. background: #165DFF;
  1026. border-color: #165DFF;
  1027. }
  1028. .el-button--primary{
  1029. background: #165DFF;
  1030. border-color: #165DFF;
  1031. border-radius: 2px;
  1032. &:hover{
  1033. background: #4080FF;
  1034. border-color: #4080FF;
  1035. }
  1036. &:focus{
  1037. background: #0E42D2;
  1038. border-color: #0E42D2;
  1039. }
  1040. }
  1041. .el-button--default{
  1042. background: #F2F3F5;
  1043. border-radius: 2px;
  1044. border: none;
  1045. color: #4E5969;
  1046. height: 32px;
  1047. &:hover{
  1048. background: #E5E6EB;
  1049. }
  1050. &:focus{
  1051. background: #C9CDD4;
  1052. }
  1053. }
  1054. .setting-form{
  1055. padding-top: 26px;
  1056. }
  1057. .code-box{
  1058. .el-form-item__content{
  1059. display: flex;
  1060. }
  1061. }
  1062. .code-input{
  1063. height: 32px;
  1064. .el-input__inner{
  1065. border-radius: 4px 0 0 4px;
  1066. }
  1067. }
  1068. .sendCode{
  1069. border-radius: 0 4px 4px 0;
  1070. margin-top: 1px;
  1071. width: 92px;
  1072. }
  1073. .el-input-group__prepend{
  1074. width: 54px;
  1075. height: 32px;
  1076. border: none;
  1077. background: #F2F3F5;
  1078. border-radius: 2px 0px 0px 2px;
  1079. line-height: 32px;
  1080. text-align: center;
  1081. padding: 0;
  1082. }
  1083. .el-input-group--prepend{
  1084. display: flex;
  1085. .el-input__inner{
  1086. margin-left: 8px;
  1087. flex: 1;
  1088. }
  1089. }
  1090. .step-cascader{
  1091. .el-input{
  1092. width: 100% !important;
  1093. }
  1094. }
  1095. .upload{
  1096. width: 30px;
  1097. height: 30px;
  1098. overflow: hidden;
  1099. .upload-demo{
  1100. opacity: 0;
  1101. width: 100% !important;
  1102. }
  1103. }
  1104. }
  1105. </style>