Setting.vue 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143
  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. },
  383. rules: {
  384. name: [
  385. { required: true, message: '请输入用户名', trigger: 'blur' }
  386. ],
  387. selectedOptions: [
  388. { type: 'array', required: true, validator: validateProvince, trigger: 'change' }
  389. ],
  390. sex:[
  391. { required: true, message: '请选择性别', trigger: 'change' },
  392. ],
  393. },
  394. settingFlag: false, // 修改设置
  395. passwordFlag: false, // 修改密码
  396. phoneFlag: false, // 修改手机
  397. emailFlag: false, // 修改邮箱
  398. passwordForm:{
  399. newPwd:'', // 新密码
  400. confirmPwd:'' // 确认密码
  401. },
  402. rulesPassword:{
  403. newPwd:[
  404. { required: true, validator: validatePass, trigger: 'blur' },
  405. { min: 6, max: 16, message: '请输入 6-16 位密码,且必须同时包含数字和大小写字母', trigger:'change' },
  406. ],
  407. confirmPwd:[
  408. { required: true, validator: validatePass2, trigger: 'blur' }
  409. ]
  410. },
  411. oldPwdFlag: false, // 查看旧密码
  412. newPwdFlag: false, // 查看新密码
  413. comfirmPwdFlag: false, // 查看确认密码
  414. phoneForm:{
  415. oldPhone:this.page==='editPerson'||this.page==='personal'?JSON.parse(JSON.stringify(this.info.sys_user.phone)):JSON.parse(JSON.stringify(this.info.phone)), // 旧手机
  416. newPhone:'', // 新手机
  417. },
  418. rulesPhone:{
  419. oldPhone:[
  420. { required: true, validator: validatePhone, trigger: 'blur' },
  421. ],
  422. newPhone:[
  423. { required: true, validator: validatePhone, trigger: 'blur' },
  424. ]
  425. },
  426. time: 60, //获取验证码的时间
  427. verificationCodeShow: false, //是否已经获取了验证码
  428. times: 60, //获取验证码的时间
  429. verificationCodesShow: false, //是否已经获取了验证码
  430. timee: 60, //获取验证码的时间
  431. verificationCodeeShow: false, //是否已经获取了验证码
  432. emailForm:{
  433. email:this.page==='editPerson'||this.page==='personal'?JSON.parse(JSON.stringify(this.info.sys_user.email)):JSON.parse(JSON.stringify(this.info.email)),
  434. newEmail:''
  435. },
  436. rulesEmail:{
  437. email:[
  438. { required: true, validator: validateEmail, trigger: 'blur' },
  439. ],
  440. newEmail:[
  441. { required: true, validator: validateEmail, trigger: 'blur' }
  442. ]
  443. },
  444. manageAuth:this.page==='editPerson'||this.page==='personal'?JSON.parse(JSON.stringify(this.info.popedom_code_list)):[], // 管理权限
  445. codeAuth:{
  446. auth:[],
  447. viewCode:this.page==='editPerson'||this.page==='personal'?JSON.parse(JSON.stringify(this.info.data_scope.discount_code_view_scope)):0
  448. }, // 兑换码权限
  449. financeAuth:{
  450. auth: [],
  451. selectedOptions:this.page==='editPerson'||this.page==='personal'?JSON.parse(JSON.stringify(this.info.data_scope.finance_popedom_data_scope)):[]
  452. }, // 财务权限
  453. props: { multiple: true },
  454. loading: false,
  455. id:this.$route.query.id?this.$route.query.id:'',
  456. managerForm:{
  457. is_manager: this.page==='editOrgPerson'?JSON.parse(JSON.stringify(this.info.is_manager)):"false"
  458. }
  459. }
  460. },
  461. //计算属性 类似于data概念
  462. computed: {
  463. ...mapState(['$provinceCityList','$provinceCityListAll']),
  464. },
  465. //监控data中数据变化
  466. watch: {
  467. },
  468. //方法集合
  469. methods: {
  470. handleAvatarSuccess(fileList,name) {
  471. let MethodName = "/OrgServer/Manager/SysUserManager/UpdateSysUser_Image";
  472. if(this.page==='editOrgPerson'){
  473. MethodName = "/OrgServer/Manager/PersonManager/UpdatePerson_Image";
  474. }
  475. let data = {
  476. id: this.page==='personal'?JSON.parse(getToken()).user_id:this.id,
  477. 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:''
  478. }
  479. getLogin(MethodName, data)
  480. .then((res) => {
  481. if(res.status===1){
  482. this.$emit("getInfo")
  483. }
  484. }).catch((res) =>{
  485. })
  486. },
  487. // 切换tabs
  488. handleChangeTabs(value){
  489. this.tabsIndex = value
  490. let breadcrumb = []
  491. if(this.page==='editOrgPerson'){
  492. breadcrumb = [
  493. {
  494. icon:'school-line',
  495. url:'',
  496. text:''
  497. },
  498. {
  499. icon:'',
  500. url:'',
  501. text:'机构管理'
  502. },
  503. {
  504. icon:'',
  505. url:'',
  506. text:this.info.org_name
  507. },
  508. {
  509. icon:'',
  510. url:'',
  511. notLink: true,
  512. text:value===0?'人员信息':value===1?'安全设置':'权限设置'
  513. }
  514. ]
  515. this.$emit("changeBread",breadcrumb)
  516. }
  517. },
  518. // 级联选择器
  519. handleCity(value){
  520. // console.log(value)
  521. },
  522. // 提交表单
  523. onSubmit(formName){
  524. this.$refs[formName].validate((valid) => {
  525. if (valid) {
  526. this.loading = true
  527. let MethodName = "/OrgServer/Manager/SysUserManager/UpdateSysUser_BaseInfo";
  528. if(this.page==='editOrgPerson'){
  529. MethodName = "/OrgServer/Manager/PersonManager/UpdatePerson_BaseInfo";
  530. }
  531. let data = {
  532. id: this.page==='personal'?JSON.parse(getToken()).user_id:this.id,
  533. user_name: this.infoForm.name,
  534. real_name: this.infoForm.realName,
  535. sex: this.infoForm.sex,
  536. city_id: this.infoForm.selectedOptions[1],
  537. memo: this.infoForm.desc
  538. }
  539. getLogin(MethodName, data)
  540. .then((res) => {
  541. this.loading = false
  542. if(res.status===1){
  543. this.$emit("getInfo")
  544. }
  545. }).catch((res) =>{
  546. this.loading = false
  547. })
  548. } else {
  549. return false;
  550. }
  551. });
  552. },
  553. // 取消 恢复到修改前状态
  554. onCancel(formName){
  555. this.$refs[formName].resetFields();
  556. },
  557. // 修改设置
  558. handleSetting(flag){
  559. this.settingFlag = !this.settingFlag
  560. this[flag] = !this[flag]
  561. let breadcrumb = []
  562. if(this.page==='editPerson'){
  563. if(this[flag]){
  564. breadcrumb = [
  565. {
  566. icon:'contacts-line',
  567. url:'',
  568. text:''
  569. },
  570. {
  571. icon:'',
  572. url:'',
  573. text:'系统用户'
  574. },
  575. {
  576. icon:'',
  577. url:'',
  578. notLink: true,
  579. text:'安全设置'
  580. },
  581. {
  582. icon:'',
  583. url:'',
  584. text:flag==='passwordFlag'?'修改密码':flag==='phoneFlag'?'绑定手机':'安全邮箱'
  585. }
  586. ]
  587. }else{
  588. breadcrumb = [
  589. {
  590. icon:'contacts-line',
  591. url:'',
  592. text:''
  593. },
  594. {
  595. icon:'',
  596. url:'',
  597. text:'系统用户'
  598. },
  599. {
  600. icon:'',
  601. url:'',
  602. text:'编辑'
  603. }
  604. ]
  605. }
  606. this.$emit("changeBread",breadcrumb)
  607. }
  608. },
  609. changeIcon(flag){
  610. this[flag] = !this[flag]
  611. },
  612. // 修改密码提交表单
  613. onSubmitPassword(formName){
  614. this.$refs[formName].validate((valid) => {
  615. if (valid) {
  616. this.loading = true
  617. let MethodName = "/OrgServer/Manager/SysUserManager/UpdateSysUser_Password";
  618. if(this.page==='editOrgPerson'){
  619. MethodName = "/OrgServer/Manager/PersonManager/UpdatePerson_Password";
  620. }
  621. let data = {
  622. id: this.page==='personal'?JSON.parse(getToken()).user_id:this.id,
  623. password: this.passwordForm.newPwd
  624. }
  625. getLogin(MethodName, data)
  626. .then((res) => {
  627. this.loading = false
  628. if(res.status===1){
  629. this.$message.success("修改成功")
  630. this.$emit("getInfo")
  631. this.handleSetting('passwordFlag')
  632. }
  633. }).catch((res) =>{
  634. this.loading = false
  635. })
  636. } else {
  637. return false;
  638. }
  639. });
  640. },
  641. // 修改手机提交表单
  642. onSubmitPhone(formName){
  643. this.$refs[formName].validate((valid) => {
  644. if (valid) {
  645. this.loading = true
  646. let MethodName = "/OrgServer/Manager/SysUserManager/UpdateSysUser_Phone";
  647. if(this.page==='editOrgPerson'){
  648. MethodName = "/OrgServer/Manager/PersonManager/UpdatePerson_Phone";
  649. }
  650. let data = {
  651. id: this.page==='personal'?JSON.parse(getToken()).user_id:this.id,
  652. phone: this.phoneForm.newPhone
  653. }
  654. getLogin(MethodName, data)
  655. .then((res) => {
  656. this.loading = false
  657. if(res.status===1){
  658. this.$message.success("修改成功")
  659. this.$emit("getInfo")
  660. this.handleSetting('phoneFlag')
  661. this.phoneForm.oldPhone = JSON.parse(JSON.stringify(this.phoneForm.newPhone))
  662. this.phoneForm.newPhone = ''
  663. }
  664. }).catch((res) =>{
  665. this.loading = false
  666. })
  667. } else {
  668. return false;
  669. }
  670. });
  671. },
  672. // 修改邮箱
  673. onSubmitEmail(formName){
  674. this.$refs[formName].validate((valid) => {
  675. if (valid) {
  676. this.loading = true
  677. let MethodName = "/OrgServer/Manager/SysUserManager/UpdateSysUser_Email";
  678. if(this.page==='editOrgPerson'){
  679. MethodName = "/OrgServer/Manager/PersonManager/UpdatePerson_Email";
  680. }
  681. let data = {
  682. id: this.page==='personal'?JSON.parse(getToken()).user_id:this.id,
  683. email: this.emailForm.newEmail
  684. }
  685. getLogin(MethodName, data)
  686. .then((res) => {
  687. this.loading = false
  688. if(res.status===1){
  689. this.$message.success("修改成功")
  690. this.$emit("getInfo")
  691. this.handleSetting('emailFlag')
  692. this.emailForm.email = JSON.parse(JSON.stringify(this.emailForm.newEmail))
  693. this.emailForm.newEmail = ''
  694. }
  695. }).catch((res) =>{
  696. this.loading = false
  697. })
  698. } else {
  699. return false;
  700. }
  701. });
  702. },
  703. // 去掉前后空格
  704. handleTrim(form,fild){
  705. this[form][fild] = this[form][fild].trim()
  706. },
  707. // 修改权限
  708. onSubmitAuth(){
  709. this.loading = true
  710. let MethodName = "/OrgServer/Manager/SysUserManager/UpdateSysUser_Popedom";
  711. let finance_popedom_data_scope = {}
  712. if(this.financeAuth.selectedOptions.length>0){
  713. if(this.financeAuth.selectedOptions[0][0]&&this.financeAuth.selectedOptions[0][0]==='0'){
  714. finance_popedom_data_scope.is_all = 'true'
  715. }else{
  716. finance_popedom_data_scope.is_all = 'false'
  717. let province_id_list = []
  718. let city_id_list = []
  719. this.financeAuth.selectedOptions.forEach(item => {
  720. if(province_id_list.indexOf(item[0])===-1){
  721. province_id_list.push(item[0])
  722. }
  723. city_id_list.push(item[1]?item[1]:'')
  724. });
  725. finance_popedom_data_scope.province_id_list = province_id_list
  726. finance_popedom_data_scope.city_id_list = city_id_list
  727. }
  728. }
  729. let data = {
  730. id: this.page==='personal'?JSON.parse(getToken()).user_id:this.id,
  731. popedom_code_list: this.manageAuth,
  732. data_scope:{
  733. discount_code_view_scope:this.codeAuth.viewCode,
  734. finance_popedom_data_scope: finance_popedom_data_scope
  735. }
  736. }
  737. getLogin(MethodName, data)
  738. .then((res) => {
  739. this.loading = false
  740. if(res.status===1){
  741. this.$message.success("修改成功")
  742. }
  743. }).catch((res) =>{
  744. this.loading = false
  745. })
  746. },
  747. // 取消权限
  748. onCancelAuth(){
  749. this.handleUserAuth()
  750. // this.manageAuth = []
  751. // this.codeAuth.viewCode = 0
  752. // this.financeAuth.selectedOptions = []
  753. },
  754. // 赋值权限
  755. handleUserAuth(){
  756. if(this.page==='editPerson'||this.page==='personal'){
  757. this.manageAuth = this.info.popedom_code_list?JSON.parse(JSON.stringify(this.info.popedom_code_list)):[]
  758. this.codeAuth.viewCode = this.info.data_scope.discount_code_view_scope?JSON.parse(JSON.stringify(this.info.data_scope.discount_code_view_scope)):0
  759. if(this.info.data_scope.finance_popedom_data_scope&&this.info.data_scope.finance_popedom_data_scope.is_all==='true'){
  760. this.financeAuth.selectedOptions = ['0']
  761. }else{
  762. let arr = []
  763. this.info.data_scope.finance_popedom_data_scope.city_id_list.forEach(item=>{
  764. arr.push([item.substring(0,2),item])
  765. })
  766. this.financeAuth.selectedOptions = arr
  767. }
  768. }
  769. },
  770. // 修改管理员权限
  771. onSubmitManager(){
  772. this.loading = true
  773. let MethodName = "/OrgServer/Manager/PersonManager/UpdatePerson_Popedom";
  774. let data = {
  775. id: this.page==='personal'?JSON.parse(getToken()).user_id:this.id,
  776. is_manager: this.managerForm.is_manager,
  777. }
  778. getLogin(MethodName, data)
  779. .then((res) => {
  780. this.loading = false
  781. if(res.status===1){
  782. this.$message.success("修改成功")
  783. }
  784. }).catch((res) =>{
  785. this.loading = false
  786. })
  787. },
  788. // 通过 拒绝
  789. handleAudit(type) {
  790. let Mname = "/OrgServer/Manager/PersonManager/AuditPerson";
  791. let data = {
  792. id_list: [this.id]
  793. };
  794. if (type==='up') {
  795. // 下架状态
  796. data.is_pass = "true";
  797. } else if (type==='down') {
  798. data.is_pass = "false";
  799. }
  800. getLogin(Mname, data).then(res => {
  801. this.$message.success("操作成功");
  802. this.$router.go(-1)
  803. });
  804. },
  805. },
  806. //生命周期 - 创建完成(可以访问当前this实例)
  807. created() {
  808. if(this.info){
  809. this.handleUserAuth()
  810. }
  811. },
  812. //生命周期 - 挂载完成(可以访问DOM元素)
  813. mounted() {
  814. },
  815. //生命周期-创建之前
  816. beforeCreated() { },
  817. //生命周期-挂载之前
  818. beforeMount() { },
  819. //生命周期-更新之前
  820. beforUpdate() { },
  821. //生命周期-更新之后
  822. updated() { },
  823. //生命周期-销毁之前
  824. beforeDestory() { },
  825. //生命周期-销毁完成
  826. destoryed() { },
  827. //如果页面有keep-alive缓存功能,这个函数会触发
  828. activated() { }
  829. }
  830. </script>
  831. <style lang="scss" scoped>
  832. /* @import url(); 引入css类 */
  833. .setting{
  834. height: 100%;
  835. &-top{
  836. margin: 0 0 12px 0;
  837. background: #FFFFFF;
  838. border-radius: 8px;
  839. display: flex;
  840. align-items: center;
  841. width: 100%;
  842. padding: 22px 40px;
  843. .avator-box{
  844. width: 96px;
  845. height: 96px;
  846. position: relative;
  847. .img-crop{
  848. position: absolute;
  849. // padding: 4px;
  850. width: 30px;
  851. height: 30px;
  852. right: -4px;
  853. bottom: -4px;
  854. border-radius: 50%;
  855. display: block;
  856. text-align: center;
  857. font-size: 0;
  858. border: 2px solid #FFFFFF;
  859. background: #F2F3F5 url("../assets/camera.png") center no-repeat;
  860. background-size: 12px;
  861. }
  862. .el-image{
  863. border-radius: 50%;
  864. overflow: hidden;
  865. }
  866. }
  867. .center{
  868. flex: 1;
  869. display: flex;
  870. flex-flow: wrap;
  871. margin-top: 12px;
  872. .info-items{
  873. margin-bottom: 12px;
  874. width: 40%;
  875. }
  876. label{
  877. font-weight: 400;
  878. font-size: 14px;
  879. line-height: 22px;
  880. color: #86909C;
  881. width: 156px;
  882. text-align: right;
  883. display: inline-block;
  884. padding-right: 10px;
  885. }
  886. span{
  887. font-size: 14px;
  888. line-height: 22px;
  889. color: #1D2129;
  890. }
  891. }
  892. }
  893. &-bottom{
  894. padding: 24px;
  895. background: #FFFFFF;
  896. border-radius: 4px;
  897. min-height: calc(100vh - 270px);
  898. .tabs-box{
  899. display: flex;
  900. padding-bottom: 16px;
  901. a{
  902. font-size: 14px;
  903. line-height: 22px;
  904. color: #4E5969;
  905. border-radius: 100px;
  906. padding: 5px 16px;
  907. margin-right: 12px;
  908. &:hover{
  909. background: #F2F3F5;
  910. }
  911. &.active{
  912. background: #F2F3F5;
  913. font-weight: 500;
  914. color: #165DFF;
  915. }
  916. }
  917. }
  918. .btn{
  919. margin-left: 16px;
  920. }
  921. .safe-items{
  922. display: flex;
  923. width: 100%;
  924. padding: 30px 20px 13px 20px;
  925. label{
  926. font-weight: 500;
  927. font-size: 14px;
  928. line-height: 22px;
  929. color: #4E5969;
  930. }
  931. &-right{
  932. border-bottom: 1px solid #E5E6EB;
  933. padding-bottom: 20px;
  934. flex: 1;
  935. margin-left: 16px;
  936. display: flex;
  937. justify-content: space-between;
  938. p{
  939. margin: 0;
  940. font-weight: 400;
  941. font-size: 14px;
  942. line-height: 22px;
  943. color: #4E5969;
  944. &.noContent{
  945. color: #86909C;
  946. }
  947. }
  948. a{
  949. font-weight: 400;
  950. font-size: 14px;
  951. line-height: 22px;
  952. color: #165DFF;
  953. }
  954. }
  955. }
  956. }
  957. &-iframe{
  958. width: 100%;
  959. height: 100%;
  960. background: #FFFFFF;
  961. padding: 24px;
  962. .title{
  963. margin: 0;
  964. font-weight: 400;
  965. font-size: 20px;
  966. line-height: 28px;
  967. color: #000000;
  968. .el-icon-arrow-left{
  969. margin-right: 8px;
  970. cursor: pointer;
  971. }
  972. }
  973. .passwordForm,.phoneForm,.emailForm{
  974. padding-top: 40px;
  975. .show-icon{
  976. cursor: pointer;
  977. color: #4E5969;
  978. }
  979. }
  980. .code-input{
  981. width: 268px;
  982. .el-input__inner{
  983. border-radius: 2px 0 0 2px;
  984. }
  985. }
  986. }
  987. }
  988. .step-table{
  989. border: 1px solid #E5E6EB;
  990. border-collapse: collapse;
  991. font-size: 14px;
  992. line-height: 22px;
  993. color: #1D2129;
  994. text-align: center;
  995. margin-bottom: 24px;
  996. &-header{
  997. background: #F7F8FA;
  998. width: 120px !important;
  999. color: #86909C;
  1000. font-weight: 500;
  1001. }
  1002. td{
  1003. height: 40px;
  1004. width: 260px;
  1005. border: 1px solid #E5E6EB;
  1006. &.td1{
  1007. width: 130px;
  1008. }
  1009. }
  1010. .step-cascader{
  1011. width: 250px;
  1012. height: 32px;
  1013. line-height: 32px;
  1014. }
  1015. }
  1016. .tips{
  1017. margin: 0;
  1018. color: #86909C;
  1019. font-size: 12px;
  1020. line-height: 20px;
  1021. }
  1022. </style>
  1023. <style lang="scss">
  1024. .setting{
  1025. .el-input,.el-textarea{
  1026. width: 360px;
  1027. }
  1028. .el-input__inner{
  1029. height: 32px;
  1030. color: #1D2129;
  1031. background: #F2F3F5;
  1032. border: none;
  1033. }
  1034. .el-textarea__inner,.el-input-group__prepend{
  1035. color: #1D2129;
  1036. background: #F2F3F5;
  1037. border: none;
  1038. }
  1039. .el-input__count{
  1040. background: #F2F3F5;
  1041. }
  1042. .el-form-item__label{
  1043. font-weight: 400;
  1044. font-size: 14px;
  1045. line-height: 32px;
  1046. color: #4E5969;
  1047. }
  1048. .el-form-item__content,.el-input__icon{
  1049. line-height: 32px;
  1050. color: #4E5969 !important;
  1051. }
  1052. .el-form-item{
  1053. margin-bottom: 20px;
  1054. }
  1055. .el-radio__input.is-checked+.el-radio__label{
  1056. color: #165DFF;
  1057. }
  1058. .el-radio__input.is-checked .el-radio__inner{
  1059. background: #165DFF;
  1060. border-color: #165DFF;
  1061. }
  1062. .el-button--primary{
  1063. background: #165DFF;
  1064. border-color: #165DFF;
  1065. border-radius: 2px;
  1066. &:hover{
  1067. background: #4080FF;
  1068. border-color: #4080FF;
  1069. }
  1070. &:focus{
  1071. background: #0E42D2;
  1072. border-color: #0E42D2;
  1073. }
  1074. }
  1075. .el-button--default{
  1076. background: #F2F3F5;
  1077. border-radius: 2px;
  1078. border: none;
  1079. color: #4E5969;
  1080. height: 32px;
  1081. &:hover{
  1082. background: #E5E6EB;
  1083. }
  1084. &:focus{
  1085. background: #C9CDD4;
  1086. }
  1087. }
  1088. .setting-form{
  1089. padding-top: 26px;
  1090. }
  1091. .code-box{
  1092. .el-form-item__content{
  1093. display: flex;
  1094. }
  1095. }
  1096. .code-input{
  1097. height: 32px;
  1098. .el-input__inner{
  1099. border-radius: 4px 0 0 4px;
  1100. }
  1101. }
  1102. .sendCode{
  1103. border-radius: 0 4px 4px 0;
  1104. margin-top: 1px;
  1105. width: 92px;
  1106. }
  1107. .el-input-group__prepend{
  1108. width: 54px;
  1109. height: 32px;
  1110. border: none;
  1111. background: #F2F3F5;
  1112. border-radius: 2px 0px 0px 2px;
  1113. line-height: 32px;
  1114. text-align: center;
  1115. padding: 0;
  1116. }
  1117. .el-input-group--prepend{
  1118. display: flex;
  1119. .el-input__inner{
  1120. margin-left: 8px;
  1121. flex: 1;
  1122. }
  1123. }
  1124. .step-cascader{
  1125. .el-input{
  1126. width: 100% !important;
  1127. }
  1128. }
  1129. .upload{
  1130. width: 30px;
  1131. height: 30px;
  1132. overflow: hidden;
  1133. .upload-demo{
  1134. opacity: 0;
  1135. width: 100% !important;
  1136. }
  1137. }
  1138. }
  1139. </style>