index.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <!--
  2. * @Author: wanglj wanglijie@dashoo.cn
  3. * @Date: 2025-03-11 18:02:10
  4. * @LastEditors: wanglj wanglijie@dashoo.cn
  5. * @LastEditTime: 2025-03-21 10:12:40
  6. * @FilePath: \vant-demo-master\vant\vue3-ts\src\view\login\index.vue
  7. * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  8. -->
  9. <template>
  10. <div class="login-container">
  11. <header>
  12. <div class="logo mt20 mb20">
  13. <img width="100" src="../../assets/img/logo-login.png" />
  14. <h4>临床医学公共实验中心</h4>
  15. </div>
  16. <van-field v-model="state.form.userName" placeholder="请输入用户名" />
  17. <van-field v-model="state.form.password" type="password" placeholder="请输入密码" class="mt10" />
  18. <!-- <van-row justify="space-between">
  19. <van-button size="mini" round class="mt10 w50">找回密码</van-button>
  20. <van-button size="mini" round class="mt10 w50">找回密码</van-button>
  21. </van-row> -->
  22. <van-button type="primary" round class="mt10" @click="onSignIn">登录</van-button>
  23. <van-button round class="mt10" @click="onRegister">注册</van-button>
  24. <!-- <van-button round class="mt10" @click="blueTooth">蓝牙</van-button> -->
  25. </header>
  26. <footer>
  27. <img width="124" src="../../assets/img/slogan.png" />
  28. </footer>
  29. </div>
  30. </template>
  31. <script lang="ts" setup>
  32. import { onMounted, reactive } from 'vue'
  33. import to from 'await-to-js'
  34. import { useLoginApi } from '/@/api/login/index'
  35. import { Local } from '/@/utils/storage'
  36. import crypto from 'sm-crypto'
  37. import { useRouter, useRoute } from 'vue-router'
  38. import { storeToRefs } from 'pinia'
  39. import { useUserInfo } from '/@/stores/userInfo'
  40. import { showDialog } from 'vant'
  41. const router = useRouter()
  42. const route = useRoute()
  43. const sm3 = crypto.sm3
  44. const loginApi = useLoginApi()
  45. const storesUseUserInfo = useUserInfo()
  46. const { userInfos, openId } = storeToRefs(storesUseUserInfo)
  47. const state = reactive({
  48. loading: {
  49. signIn: false
  50. },
  51. form: {
  52. userName: '',
  53. password: ''
  54. }
  55. })
  56. const onSignIn = async () => {
  57. state.loading.signIn = true
  58. const params = JSON.parse(JSON.stringify(state.form))
  59. params.password = sm3(params.password)
  60. params.openId = openId.value
  61. // params.password = (params.password)
  62. // sm3
  63. console.log(openId.value, 'openIdddddddddddd');
  64. const post = params.openId ? loginApi.weChatLogin : loginApi.signIn
  65. const [err, res]: ToResponse = await to(post(params))
  66. if (err) {
  67. state.loading.signIn = false
  68. return
  69. }
  70. // 存储 token 到浏览器缓存
  71. Local.set('token', res?.data.token)
  72. router.push('/home')
  73. }
  74. const openIdLogin = async () => {
  75. const [err, res]: ToResponse = await to(loginApi.weChatLoginOpenId({ openId: openId.value }))
  76. if (err) return
  77. Local.set('token', res?.data.token)
  78. router.push('/home')
  79. }
  80. const onRegister = () => {
  81. router.push('/register')
  82. }
  83. const blueTooth = async () => {
  84. try {
  85. // 请求蓝牙设备
  86. // @ts-ignore
  87. if (!navigator?.bluetooth?.requestDevice) {
  88. showDialog({
  89. message: '当前浏览器不支持蓝牙功能,请升级浏览器版本或更换浏览器。',
  90. confirmButtonText: '确定'
  91. })
  92. }
  93. // @ts-ignore
  94. const device = await navigator.bluetooth.requestDevice({
  95. filters: [{ services: ['generic_access'] }],
  96. optionalServices: [],
  97. acceptAllDevices: false
  98. })
  99. // 连接到设备
  100. const server = await device.gatt.connect()
  101. // 获取服务
  102. const service = await server.getPrimaryService('generic_access')
  103. // 获取特征
  104. const characteristic = await service.getCharacteristic('device_name')
  105. // 读取特征值
  106. const value = await characteristic.readValue()
  107. // 将特征值转换为字符串
  108. const decoder = new TextDecoder('utf-8')
  109. const deviceName = decoder.decode(value)
  110. console.log('Device Name:', deviceName)
  111. } catch (error) {
  112. console.error('Error:', error)
  113. }
  114. }
  115. onMounted(async () => {
  116. const code: string = route.query.code ? route.query.code.toString() : ''
  117. if(code) {
  118. await storesUseUserInfo.setOpenId(code)
  119. openIdLogin()
  120. }
  121. })
  122. </script>
  123. <style lang="scss" scoped>
  124. .login-container {
  125. height: calc(100% - 80px);
  126. width: 300px;
  127. display: flex;
  128. margin: 0 auto;
  129. padding: 40px 0;
  130. flex-direction: column;
  131. .logo {
  132. display: flex;
  133. flex-direction: column;
  134. align-items: center;
  135. }
  136. header {
  137. display: flex;
  138. flex-direction: column;
  139. flex: 1;
  140. }
  141. footer {
  142. flex: 0 0 30px;
  143. display: flex;
  144. align-items: center;
  145. justify-content: center;
  146. }
  147. h4 {
  148. text-align: center;
  149. font-size: 24px;
  150. margin: 40px 0;
  151. }
  152. .w50 {
  153. width: 120px;
  154. background-color: #e8effc;
  155. }
  156. .van-cell {
  157. background-color: #f3f5f6;
  158. border-radius: 22px;
  159. overflow: hidden;
  160. :v-deep .van-van-field__control {
  161. text-align: center;
  162. }
  163. :deep(.van-van-field__control) {
  164. text-align: center;
  165. }
  166. }
  167. }
  168. </style>