myheader.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. <template>
  2. <div class="header-container">
  3. <div class="wrapper">
  4. <!-- logo -->
  5. <div class="left-wrapper v-link selected">
  6. <img style="width: 50px" width="50" height="50" src="~assets/images/logo.png">
  7. <span class="text">尚医通 预约挂号统一平台</span>
  8. </div>
  9. <!-- 搜索框 -->
  10. <div class="search-wrapper">
  11. <div class="hospital-search animation-show">
  12. <div id="search" style="display: block;">
  13. <el-autocomplete
  14. class="search-input"
  15. prefix-icon="el-icon-search"
  16. v-model="hosname"
  17. :fetch-suggestions="querySearchAsync"
  18. :trigger-on-focus="false"
  19. @select="handleSelect"
  20. placeholder="点击输入医院名称"
  21. >
  22. <span slot="suffix" class="search-btn v-link highlight clickable selected">搜索 </span>
  23. </el-autocomplete>
  24. </div>
  25. </div>
  26. </div>
  27. <!-- 右侧 -->
  28. <div class="right-wrapper">
  29. <span class="v-link clickable">帮助中心</span>
  30. <span v-if="name == ''" class="v-link clickable" @click="showLogin()" id="loginDialog">登录/注册</span>
  31. <el-dropdown v-if="name != ''" @command="loginMenu">
  32. <span class="el-dropdown-link">
  33. {{ name }}<i class="el-icon-arrow-down el-icon--right"></i>
  34. </span>
  35. <el-dropdown-menu class="user-name-wrapper" slot="dropdown">
  36. <el-dropdown-item command="/user">实名认证</el-dropdown-item>
  37. <el-dropdown-item command="/order">挂号订单</el-dropdown-item>
  38. <el-dropdown-item command="/patient">就诊人管理</el-dropdown-item>
  39. <el-dropdown-item command="/logout" divided>退出登录</el-dropdown-item>
  40. </el-dropdown-menu>
  41. </el-dropdown>
  42. </div>
  43. </div>
  44. <!-- 登录弹出层 -->
  45. <el-dialog :visible.sync="dialogUserFormVisible" style="text-align: left;" top="50px" :append-to-body="true" width="960px" @close="closeDialog()">
  46. <div class="container">
  47. <!-- 手机登录 #start -->
  48. <div class="operate-view" v-if="dialogAtrr.showLoginType === 'phone'">
  49. <div class="wrapper" style="width: 100%">
  50. <div class="mobile-wrapper" style="position: static;width: 70%">
  51. <span class="title">{{ dialogAtrr.labelTips }}</span>
  52. <el-form>
  53. <el-form-item>
  54. <el-input v-model="dialogAtrr.inputValue" :placeholder="dialogAtrr.placeholder" :maxlength="dialogAtrr.maxlength" class="input v-input">
  55. <span slot="suffix" class="sendText v-link" v-if="dialogAtrr.second > 0">{{ dialogAtrr.second }}s </span>
  56. <span slot="suffix" class="sendText v-link highlight clickable selected" v-if="dialogAtrr.second == 0" @click="getCodeFun()">重新发送 </span>
  57. </el-input>
  58. </el-form-item>
  59. </el-form>
  60. <div class="send-button v-button" @click="btnClick()"> {{ dialogAtrr.loginBtn }}</div>
  61. </div>
  62. <div class="bottom">
  63. <div class="wechat-wrapper" @click="weixinLogin()"><span
  64. class="iconfont icon"></span></div>
  65. <span class="third-text"> 第三方账号登录 </span></div>
  66. </div>
  67. </div>
  68. <!-- 手机登录 #end -->
  69. <!-- 微信登录 #start -->
  70. <div class="operate-view" v-if="dialogAtrr.showLoginType === 'weixin'" >
  71. <div class="wrapper wechat" style="height: 400px">
  72. <div>
  73. <div id="weixinLogin"></div>
  74. </div>
  75. <div class="bottom wechat" style="margin-top: -80px;">
  76. <div class="phone-container">
  77. <div class="phone-wrapper" @click="phoneLogin()"><span
  78. class="iconfont icon"></span></div>
  79. <span class="third-text"> 手机短信验证码登录 </span></div>
  80. </div>
  81. </div>
  82. </div>
  83. <!-- 微信登录 #end -->
  84. <div class="info-wrapper">
  85. <div class="code-wrapper">
  86. <div><img src="//img.114yygh.com/static/web/code_login_wechat.png" class="code-img">
  87. <div class="code-text"><span class="iconfont icon"></span>微信扫一扫关注
  88. </div>
  89. <div class="code-text"> “快速预约挂号”</div>
  90. </div>
  91. <div class="wechat-code-wrapper"><img
  92. src="//img.114yygh.com/static/web/code_app.png"
  93. class="code-img">
  94. <div class="code-text"> 扫一扫下载</div>
  95. <div class="code-text"> “预约挂号”APP</div>
  96. </div>
  97. </div>
  98. <div class="slogan">
  99. <div>xxxxxx官方指定平台</div>
  100. <div>快速挂号 安全放心</div>
  101. </div>
  102. </div>
  103. </div>
  104. </el-dialog>
  105. </div>
  106. </template>
  107. <script>
  108. import cookie from 'js-cookie'
  109. import Vue from 'vue'
  110. import userInfoApi from '@/api/user/userInfo'
  111. import smsApi from '@/api/sms/sms'
  112. import hospitalApi from '@/api/hosp/hospital'
  113. import weixinApi from '@/api/user/weixin'
  114. const defaultDialogAtrr = {
  115. showLoginType: 'phone', // 控制手机登录与微信登录切换
  116. labelTips: '手机号码', // 输入框提示
  117. inputValue: '', // 输入框绑定对象
  118. placeholder: '请输入您的手机号', // 输入框placeholder
  119. maxlength: 11, // 输入框长度控制
  120. loginBtn: '获取验证码', // 登录按钮或获取验证码按钮文本
  121. sending: true, // 是否可以发送验证码
  122. second: -1, // 倒计时间 second>0 : 显示倒计时 second=0 :重新发送 second=-1 :什么都不显示
  123. clearSmsTime: null // 倒计时定时任务引用 关闭登录层清除定时任务
  124. }
  125. export default {
  126. data() {
  127. return {
  128. userInfo: {
  129. phone: '',
  130. code: '',
  131. openid: ''
  132. },
  133. dialogUserFormVisible: false,
  134. // 弹出层相关属性
  135. dialogAtrr:defaultDialogAtrr,
  136. name: '' // 用户登录显示的名称
  137. }
  138. },
  139. created() {
  140. this.showInfo()
  141. },
  142. mounted() {
  143. // 注册全局登录事件对象
  144. window.loginEvent = new Vue();
  145. // 监听登录事件
  146. loginEvent.$on('loginDialogEvent', function () {
  147. document.getElementById("loginDialog").click();
  148. })
  149. // 触发事件,显示登录层:loginEvent.$emit('loginDialogEvent')
  150. //初始化微信js
  151. const script = document.createElement('script')
  152. script.type = 'text/javascript'
  153. script.src = 'https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js'
  154. document.body.appendChild(script)
  155. // 微信登录回调处理
  156. let self = this;
  157. window["loginCallback"] = (name,token, openid) => {
  158. debugger
  159. self.loginCallback(name, token, openid);
  160. }
  161. },
  162. methods: {
  163. loginCallback(name, token, openid) {
  164. // 打开手机登录层,绑定手机号,改逻辑与手机登录一致
  165. if(openid != '') {
  166. this.userInfo.openid = openid
  167. this.showLogin()
  168. } else {
  169. this.setCookies(name, token)
  170. }
  171. },
  172. // 绑定登录或获取验证码按钮
  173. btnClick() {
  174. // 判断是获取验证码还是登录
  175. if(this.dialogAtrr.loginBtn == '获取验证码') {
  176. this.userInfo.phone = this.dialogAtrr.inputValue
  177. // 获取验证码
  178. this.getCodeFun()
  179. } else {
  180. // 登录
  181. this.login()
  182. }
  183. },
  184. // 绑定登录,点击显示登录层
  185. showLogin() {
  186. this.dialogUserFormVisible = true
  187. // 初始化登录层相关参数
  188. this.dialogAtrr = { ...defaultDialogAtrr }
  189. },
  190. // 登录
  191. login() {
  192. debugger
  193. this.userInfo.code = this.dialogAtrr.inputValue
  194. if(this.dialogAtrr.loginBtn == '正在提交...') {
  195. this.$message.error('重复提交')
  196. return;
  197. }
  198. if (this.userInfo.code == '') {
  199. this.$message.error('验证码必须输入')
  200. return;
  201. }
  202. if (this.userInfo.code.length != 6) {
  203. this.$message.error('验证码格式不正确')
  204. return;
  205. }
  206. this.dialogAtrr.loginBtn = '正在提交...'
  207. userInfoApi.login(this.userInfo).then(response => {
  208. console.log(response.data)
  209. // 登录成功 设置cookie
  210. this.setCookies(response.data.name, response.data.token)
  211. }).catch(e => {
  212. this.dialogAtrr.loginBtn = '马上登录'
  213. })
  214. },
  215. setCookies(name, token) {
  216. cookie.set('token', token, { domain: 'localhost' })
  217. cookie.set('name', name, { domain: 'localhost' })
  218. window.location.reload()
  219. },
  220. // 获取验证码
  221. getCodeFun() {
  222. if (!(/^1[34578]\d{9}$/.test(this.userInfo.phone))) {
  223. this.$message.error('手机号码不正确')
  224. return;
  225. }
  226. // 初始化验证码相关属性
  227. this.dialogAtrr.inputValue = ''
  228. this.dialogAtrr.placeholder = '请输入验证码'
  229. this.dialogAtrr.maxlength = 6
  230. this.dialogAtrr.loginBtn = '马上登录'
  231. // 控制重复发送
  232. if (!this.dialogAtrr.sending) return;
  233. // 发送短信验证码
  234. this.timeDown();
  235. this.dialogAtrr.sending = false;
  236. smsApi.sendCode(this.userInfo.phone).then(response => {
  237. this.timeDown();
  238. }).catch(e => {
  239. this.$message.error('发送失败,重新发送')
  240. // 发送失败,回到重新获取验证码界面
  241. this.showLogin()
  242. })
  243. },
  244. // 倒计时
  245. timeDown() {
  246. if(this.clearSmsTime) {
  247. clearInterval(this.clearSmsTime);
  248. }
  249. this.dialogAtrr.second = 60;
  250. this.dialogAtrr.labelTips = '验证码已发送至' + this.userInfo.phone
  251. this.clearSmsTime = setInterval(() => {
  252. --this.dialogAtrr.second;
  253. if (this.dialogAtrr.second < 1) {
  254. clearInterval(this.clearSmsTime);
  255. this.dialogAtrr.sending = true;
  256. this.dialogAtrr.second = 0;
  257. }
  258. }, 1000);
  259. },
  260. // 关闭登录层
  261. closeDialog() {
  262. if(this.clearSmsTime) {
  263. clearInterval(this.clearSmsTime);
  264. }
  265. },
  266. showInfo() {
  267. let token = cookie.get('token')
  268. if (token) {
  269. this.name = cookie.get('name')
  270. console.log(this.name)
  271. }
  272. },
  273. loginMenu(command) {
  274. if('/logout' == command) {
  275. cookie.set('name', '', {domain: 'localhost'})
  276. cookie.set('token', '', {domain: 'localhost'})
  277. //跳转页面
  278. window.location.href = '/'
  279. } else {
  280. window.location.href = command
  281. }
  282. },
  283. // 搜索
  284. querySearchAsync(queryString, cb) {
  285. if(queryString == '') return
  286. hospitalApi.getByHosname(queryString).then(response => {
  287. for (let i = 0, len = response.data.length; i < len; i++) {
  288. response.data[i].value = response.data[i].hosname
  289. }
  290. cb(response.data)
  291. })
  292. },
  293. handleSelect(item) {
  294. window.location.href = '/hospital/' + item.hoscode
  295. },
  296. weixinLogin() {
  297. this.dialogAtrr.showLoginType = 'weixin'
  298. weixinApi.getLoginParam().then(response => {
  299. var obj = new WxLogin({
  300. self_redirect:true,
  301. id: 'weixinLogin', // 需要显示的容器id
  302. appid: response.data.appid, // 公众号appid wx*******
  303. scope: response.data.scope, // 网页默认即可
  304. redirect_uri: response.data.redirectUri, // 授权成功后回调的url
  305. state: response.data.state, // 可设置为简单的随机数加session用来校验
  306. style: 'black', // 提供"black"、"white"可选。二维码的样式
  307. href: '' // 外部css文件url,需要https
  308. })
  309. })
  310. },
  311. phoneLogin() {
  312. this.dialogAtrr.showLoginType = 'phone'
  313. this.showLogin()
  314. }
  315. }
  316. }
  317. </script>