topWindow.vue 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. <template>
  2. <div>
  3. <el-header height="60px" class="header dflex_b" ref="change">
  4. <div class="crpr" @click="foldChange">
  5. <i v-if="!fold" class="el-icon-s-fold"></i>
  6. <i v-else class="el-icon-s-unfold"></i>
  7. </div>
  8. <div class="dflex_vertical_c sele_none">
  9. <!-- <el-link v-if="!false" class="crpr" href="https://www.use-cloud.com" target="_blank">大魏电商 v{{ adminVersion }}</el-link>
  10. <div @click="informDrawer = true" class="margin_l_50 crpr">
  11. <el-badge :value="informDatas.length"><i class="iconfont icontongzhi"></i></el-badge>
  12. </div> -->
  13. <el-dropdown class="crpr margin_l_50" @command="handleCommand">
  14. <div class="dflex_vertical_c">
  15. <el-image
  16. class="headimg_mini"
  17. :src="user.avatar || require('static/img/logo.jpg')"
  18. :preview-src-list="user.avatars"
  19. fit="cover"
  20. ></el-image>
  21. <div class="margin_l_10">{{ user.username || '靖安人家乡村民宿特产商城' }}</div>
  22. </div>
  23. <el-dropdown-menu slot="dropdown">
  24. <!-- <el-dropdown-item class="el-icon-edit-outline dflex" command="pwdChange"><div class="margin_l_5">修改密码</div></el-dropdown-item> -->
  25. <el-dropdown-item class="el-icon-switch-button dflex" command="logOut"><div class="margin_l_5">安全退出</div></el-dropdown-item>
  26. </el-dropdown-menu>
  27. </el-dropdown>
  28. </div>
  29. </el-header>
  30. <el-drawer title="通知" :visible.sync="informDrawer" direction="rtl" :append-to-body="true">
  31. <el-tooltip content="双击已读" placement="top" :hide-after="1000" :enterable="false" effect="light" v-for="(item, i) in informDatas" :key="i">
  32. <div v-if="!item.read" :ref="item.ref" class="inform crpr margin_lr_20 margin_b_20 padding_20 animated" :class="{ fadeOut: item.read == 1 }" @dblclick="read(i)">
  33. <div class="dflex_sb dflex_vertical_c">
  34. <div>{{ item.title + i }}</div>
  35. <div class="bbb margin_t_10">{{ item.time }}</div>
  36. </div>
  37. <div class="bbb margin_t_15">{{ item.content }}</div>
  38. </div>
  39. </el-tooltip>
  40. </el-drawer>
  41. <el-drawer title="修改密码" :visible.sync="pwdDrawer" direction="rtl" :append-to-body="true" :wrapperClosable="false">
  42. <el-form class="add_edit" :model="form" :rules="rules" ref="ruleForm" label-width="100px">
  43. <el-form-item label="原密码" prop="oldPassword" ref="oldPassword"><el-input v-model="form.oldPassword" show-password></el-input></el-form-item>
  44. <el-form-item label="新密码" prop="newPassword" ref="newPassword"><el-input v-model="form.newPassword" show-password></el-input></el-form-item>
  45. <el-form-item label="确认密码" prop="passwordConfirmation" ref="passwordConfirmation">
  46. <el-input v-model="form.passwordConfirmation" show-password></el-input>
  47. </el-form-item>
  48. <el-form-item>
  49. <el-button class="confirm_btn" @click="submitForm('ruleForm')">确 定</el-button>
  50. <el-button @click="pwdDrawer = false">关 闭</el-button>
  51. </el-form-item>
  52. </el-form>
  53. </el-drawer>
  54. <tab></tab>
  55. </div>
  56. </template>
  57. <script>
  58. import bus from '@/common/bus';
  59. import tab from '@/windows/components/tab.vue';
  60. import { version } from '@/package.json';
  61. import {
  62. changePassword
  63. } from '@/util/loginJie.js'
  64. export default {
  65. components: {
  66. tab
  67. },
  68. data() {
  69. const pass = (rule, value, callback) => {
  70. if (value === '') {
  71. callback(new Error('请输入密码'));
  72. } else {
  73. if (this.form.passwordConfirmation !== '') {
  74. this.$refs.ruleForm.validateField('passwordConfirmation');
  75. }
  76. callback();
  77. }
  78. };
  79. const checkPass = (rule, value, callback) => {
  80. if (value === '') {
  81. callback(new Error('请再次输入密码'));
  82. } else if (value !== this.form.newPassword) {
  83. callback(new Error('两次输入密码不一致!'));
  84. } else {
  85. callback();
  86. }
  87. };
  88. const validateLength = {
  89. min: 3,
  90. max: 20,
  91. message: '长度在 3 到 20 个字符',
  92. trigger: 'change'
  93. };
  94. return {
  95. adminVersion: version,
  96. fold: false,
  97. user: {},
  98. informDrawer: false,
  99. pwdDrawer: false,
  100. form: {
  101. oldPassword: '',
  102. newPassword: '',
  103. passwordConfirmation: ''
  104. },
  105. rules: {
  106. oldPassword: [
  107. {
  108. required: true,
  109. message: '请输入原密码',
  110. trigger: 'change'
  111. },
  112. validateLength
  113. ],
  114. newPassword: [{ required: true, validator: pass, trigger: 'change' }, validateLength],
  115. passwordConfirmation: [{ required: true, validator: checkPass, trigger: 'change' }, validateLength]
  116. },
  117. informDatas: [
  118. {
  119. title: '小程序"大魏电商"代码发布审核结果',
  120. ref: 'read0',
  121. read: 0,
  122. time: '2020-05-16 00:00',
  123. content: '你的小程序"大魏电商",提审时间2020-05-08 21:18:05,版本审核未通过。'
  124. }
  125. ]
  126. };
  127. },
  128. methods: {
  129. handleCommand(command) {
  130. if (command == 'logOut') {
  131. this.$confirm('此操作将退出后台系统, 是否继续?', '提示', {
  132. confirmButtonText: '确定',
  133. cancelButtonText: '取消',
  134. type: 'warning'
  135. }).then(() => {
  136. bus.$emit("logOut")
  137. uni.removeStorageSync('uni_id_token');
  138. uni.removeStorageSync('uni_id_token_expired');
  139. uni.removeStorageSync('sys-tags');
  140. this.$message({
  141. type: 'success',
  142. message: '登出成功!'
  143. });
  144. uni.redirectTo({
  145. url: '/pages/login'
  146. });
  147. // this.$func.useadmin.call('user/logout').then(res => {
  148. // if (res.code == 200) {
  149. // bus.$emit("logOut")
  150. // uni.removeStorageSync('uni_id_token');
  151. // uni.removeStorageSync('uni_id_token_expired');
  152. // uni.removeStorageSync('sys-tags');
  153. // this.$message({
  154. // type: 'success',
  155. // message: '登出成功!'
  156. // });
  157. // uni.redirectTo({
  158. // url: '/pages/login'
  159. // });
  160. // }
  161. // });
  162. });
  163. } else if (command == 'pwdChange') {
  164. this.form.oldPassword = '';
  165. this.form.newPassword = '';
  166. this.form.passwordConfirmation = '';
  167. this.pwdDrawer = true;
  168. }
  169. },
  170. foldChange() {
  171. this.fold = !this.fold;
  172. if (this.fold) {
  173. this.$refs.change.$el.style.left = '64px';
  174. document.getElementsByTagName('uni-main')[0].style.left = '64px';
  175. document.getElementsByTagName('uni-main')[0].style.position = 'fixed';
  176. } else {
  177. this.$refs.change.$el.style.left = 'var(--window-left)';
  178. document.getElementsByTagName('uni-main')[0].style.left = 'var(--window-left)';
  179. const timer = setTimeout(() => {
  180. clearTimeout(timer);
  181. document.getElementsByTagName('uni-main')[0].style.position = '';
  182. }, 300);
  183. }
  184. bus.$emit('fold', this.fold);
  185. },
  186. submitForm(formName) {
  187. this.$refs[formName].validate((valid, obj) => {
  188. // 默认获取第一个未验证 form 属性名
  189. this.$api.set_unvalidated_form_focus(this, obj);
  190. if (valid) {
  191. console.log(this.form)
  192. var data=this.form
  193. changePassword(data).then((res) => {
  194. if (res.success) {
  195. this.pwdDrawer = false;
  196. uni.redirectTo({
  197. url: `/pages/login`
  198. });
  199. return;
  200. } else {
  201. this.$message.warning('没有符合条件的数据!')
  202. }
  203. }).catch((err) => {
  204. this.$message.error(err.message)
  205. });
  206. // this.$func.useadmin.call('user/updatePwd', this.form).then(res => {
  207. // if (res.code == 200) {
  208. // this.pwdDrawer = false;
  209. // uni.redirectTo({
  210. // url: `/pages/login`
  211. // });
  212. // return;
  213. // }
  214. // this.$message.error(res.msg);
  215. // });
  216. }
  217. });
  218. },
  219. read(index) {
  220. this.informDatas[index].read = 1;
  221. },
  222. setUserMsg() {
  223. this.user = this.user = uni.getStorageSync('useadmin_user') || {};
  224. if (this.user.avatar) {
  225. this.user.avatars = [this.user.avatar];
  226. return;
  227. }
  228. this.user.avatars = ['/static/img/default.jpg'];
  229. }
  230. },
  231. created() {
  232. this.setUserMsg();
  233. bus.$on('setUserMsg', () => {
  234. this.setUserMsg();
  235. });
  236. bus.$on('loginIn', () => {
  237. this.setUserMsg();
  238. });
  239. }
  240. };
  241. </script>
  242. <style>
  243. >>> .el-drawer__body {
  244. overflow: overlay;
  245. }
  246. >>> .el-link.el-link--default:hover {
  247. color: #ff6a6c;
  248. }
  249. >>> .el-link.is-underline:hover:after {
  250. border-bottom: 1px solid #ff6a6c;
  251. }
  252. .header {
  253. position: fixed;
  254. top: 0;
  255. left: 180px;
  256. right: 0;
  257. background-color: #fff;
  258. transition: all 0.3s ease-in-out;
  259. }
  260. .icontongzhi {
  261. font-size: 24px;
  262. }
  263. .inform {
  264. background-color: #f5f5f5;
  265. border-radius: 10px;
  266. }
  267. .add_edit .el-input {
  268. width: 90%;
  269. }
  270. </style>