You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

224 lines
6.3 KiB

  1. <template>
  2. <view class="login">
  3. <view class="login-logo">
  4. <image class="logo" :src="configList && configList.applet_info ? configList.applet_info.paramValueImage : ''" mode="aspectFill"></image>
  5. <image class="d" :src="configList && configList.logo_icon ? configList.logo_icon.paramValueImage : ''" mode="aspectFill"></image>
  6. </view>
  7. <view class="login-submit">
  8. <up-button class="mt24" type="primary" text="手机号登录"
  9. open-type="getPhoneNumber" @getphonenumber="onGetPhoneNumber"
  10. shape="circle" color="#FFBF60" style="margin-top: 20rpx;"></up-button>
  11. </view>
  12. <view class="flex-rowc">
  13. <view>
  14. <up-checkbox v-model="isAgree" size="29rpx" icon-size="29rpx" name="agree" usedAlone
  15. shape="circle" activeColor="#FFBF60">
  16. </up-checkbox>
  17. </view>
  18. <view class="size-26 agreement">
  19. <text>我已阅读并同意猫爸狗妈</text>
  20. <text @click="privacyPolicy('login_xy')" class="main-color">注册协议</text>
  21. <text></text>
  22. <text @click="privacyPolicy('login_ys')" class="main-color">隐私政策</text>
  23. </view>
  24. </view>
  25. <view class="login-footer flex-rowc">
  26. <button @click="cancelLogin" class="btn-cancel" plain>暂不登录</button>
  27. </view>
  28. </view>
  29. <up-popup :show="show" @close="close" :round="10">
  30. <view style="padding: 10rpx 20rpx;height: 50vh;overflow-y: scroll;" v-html="content"></view>
  31. </up-popup>
  32. </template>
  33. <script>
  34. import {
  35. getOpenIdKey,
  36. getToken,
  37. setIsLogin,
  38. setOpenIdKey,
  39. setStorage,
  40. setToken
  41. } from "../../utils/auth";
  42. import {
  43. getOpenId,
  44. getPersonalInfo,
  45. getPhoneNumber
  46. } from "../../api/system/user";
  47. import { mapGetters } from 'vuex';
  48. export default {
  49. name: 'AuthIndex',
  50. data() {
  51. return {
  52. value: false,
  53. show: false,
  54. content: '',
  55. isAgree: false
  56. }
  57. },
  58. computed: {
  59. ...mapGetters(['configList'])
  60. },
  61. mounted() {
  62. // 组件挂载后的逻辑
  63. },
  64. methods: {
  65. // 微信授权登陆
  66. loginWx() {
  67. if (!this.isAgree) {
  68. return uni.showToast({
  69. title: '请先同意隐私协议',
  70. icon: 'none'
  71. })
  72. }
  73. this.login()
  74. },
  75. login() {
  76. uni.login({
  77. provider: 'weixin',
  78. success: (loginRes) => {
  79. this.getOpenId(loginRes.code)
  80. },
  81. fail: function(error) {
  82. // 授权失败处理
  83. uni.showToast('授权失败,请授权后再试')
  84. }
  85. });
  86. },
  87. getOpenId(code) {
  88. getOpenId(code).then(res => {
  89. if (res.code == 200 && res.data) {
  90. let resData = JSON.parse(res.data)
  91. let token = resData.token;
  92. let openId = resData.openId;
  93. setOpenIdKey(openId)
  94. if(token){
  95. setToken(token)
  96. setIsLogin(true)
  97. this.getUserInfo()
  98. }else{
  99. // 如果没有token,可能需要获取手机号
  100. uni.showToast({
  101. title: '请授权手机号登录',
  102. icon: 'none'
  103. })
  104. }
  105. }
  106. })
  107. },
  108. // 获取用户信息
  109. async getUserInfo() {
  110. try {
  111. const res = await getPersonalInfo()
  112. if(res && (res.id || res.id === 0)){
  113. setStorage('userInfo', res)
  114. uni.navigateBack()
  115. }
  116. } catch (error) {
  117. console.error('获取用户信息失败:', error)
  118. }
  119. },
  120. // 获取token
  121. onGetPhoneNumber(e) {
  122. if(e.detail.errMsg=="getPhoneNumber:fail user deny"){ //用户拒绝授权
  123. //拒绝授权后弹出一些提示
  124. }else{ //允许授权
  125. if(getOpenIdKey()){
  126. this.getPhoneNumber({"openId":getOpenIdKey(),"code":e.detail.code})
  127. }
  128. }
  129. },
  130. getPhoneNumber(data){
  131. getPhoneNumber(data).then(res=>{
  132. if(res&&res.code==200){
  133. let token = res.data.token
  134. setToken(token)
  135. setIsLogin(true)
  136. this.getUserInfo()
  137. } else{
  138. uni.showToast({
  139. icon:'error',
  140. title:'获取手机号失败'
  141. })
  142. }
  143. })
  144. },
  145. cancelLogin() {
  146. uni.switchTab({
  147. url: "/pages/workbenchManage/index"
  148. })
  149. },
  150. close() {
  151. this.show = false
  152. },
  153. privacyPolicy(key) {
  154. this.content = this.configList && this.configList[key] ? this.configList[key].paramValueArea || "" : "";
  155. this.show = true;
  156. }
  157. }
  158. }
  159. </script>
  160. <style scoped lang="scss">
  161. .login {
  162. height: 100vh;
  163. background: #ffffff;
  164. &-logo {
  165. display: flex;
  166. flex-direction: column;
  167. justify-content: center;
  168. align-items: center;
  169. height: 504rpx;
  170. background: linear-gradient(360deg, #FFFFFF 0%, #FFBF60 99%);
  171. .logo {
  172. width: 180rpx;
  173. height: 180rpx;
  174. }
  175. .d {
  176. width: 200rpx;
  177. height: 80rpx;
  178. margin-top: 20rpx;
  179. }
  180. }
  181. &-submit {
  182. padding: 0 76rpx;
  183. margin: 150rpx 0 40rpx 0;
  184. }
  185. }
  186. .agreement {
  187. color: #C7C7C7;
  188. font-size: 22rpx;
  189. line-height: 29rpx;
  190. }
  191. .login-footer {
  192. width: 100vw;
  193. position: fixed;
  194. bottom: 127rpx;
  195. .btn-cancel {
  196. color: #C7C7C7;
  197. font-size: 30rpx;
  198. line-height: 40rpx;
  199. border: none;
  200. display: inline-block;
  201. padding: 0;
  202. }
  203. }
  204. </style>