index.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. <template>
  2. <view class="login-container">
  3. <!-- 暂不登录-->
  4. <view class="page-header">
  5. <text class="back-icon" @click="goBack">←</text>
  6. <text class="page-title">登录</text>
  7. <text class="placeholder"></text>
  8. </view>
  9. <view class="logo-section">
  10. <image class="logo" src="/static/images/logo.png" mode="aspectFit"></image>
  11. <text class="app-name">农小禹</text>
  12. <text class="app-slogan">智慧农业,从此开始</text>
  13. </view>
  14. <view class="login-section">
  15. <button type="primary" class="wechat-login-btn" bindtap="getUserProfile" @click="getUserProfile()">
  16. <view class="wechat-icon">微</view>
  17. <text>一键登录</text>
  18. </button>
  19. </view>
  20. <view class="privacy-agreement">
  21. <checkbox :checked="agreed" @click="toggleAgreement"></checkbox>
  22. <text class="agreement-text">
  23. 登录即表示您已同意
  24. <text class="link" @click="navigateToTerms">用户协议</text>
  25. <text class="link" @click="navigateToPrivacy">隐私政策</text>
  26. </text>
  27. </view>
  28. </view>
  29. </template>
  30. <script>
  31. import {
  32. mpAutoLogin
  33. } from "@/api/services/connect.js";
  34. import storage from "@/utils/storage.js";
  35. export default {
  36. data() {
  37. return {
  38. // 以下是登录页面测试功能 结束
  39. agreed: false,
  40. // 是否展示手机号码授权弹窗,默认第一步不展示,要先获取用户基础信息
  41. phoneAuthPopup: false,
  42. // 授权信息展示,商城名称
  43. // projectName: config.name,
  44. //微信返回信息,用于揭秘信息,获取sessionkey
  45. code: "",
  46. //微信昵称
  47. nickName: "",
  48. //微信头像
  49. avatarUrl: "",
  50. gender: ""
  51. }
  52. },
  53. onLoad() {
  54. // // 检查是否已登录
  55. // if (isLoggedIn()) {
  56. // this.redirectToHome();
  57. // }
  58. //获取code
  59. uni.login({
  60. success: (res) => {
  61. if (res.errMsg === "login:ok") {
  62. this.code = res.code
  63. } else {
  64. uni.showToast({
  65. title: "系统异常,请联系管理员!"
  66. })
  67. }
  68. },
  69. });
  70. },
  71. methods: {
  72. goBack() {
  73. uni.navigateBack();
  74. },
  75. toggleAgreement() {
  76. this.agreed = !this.agreed;
  77. console.log("this.agreed", this.agreed);
  78. },
  79. navigateToTerms() {
  80. uni.navigateTo({
  81. url: '/pages/privacy/terms'
  82. });
  83. },
  84. navigateToPrivacy() {
  85. uni.navigateTo({
  86. url: '/pages/privacy/index'
  87. });
  88. },
  89. showAgreementWarning() {
  90. uni.showToast({
  91. title: '请同意用户协议和隐私政策',
  92. icon: 'none'
  93. });
  94. },
  95. getUserProfile(e) {
  96. if (!this.agreed) {
  97. uni.showToast({
  98. title: "请同意用户协议和隐私政策",
  99. icon: 'none'
  100. })
  101. return
  102. }
  103. this.logingFlag = true;
  104. if (this.code) {
  105. // 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认
  106. uni.getUserProfile({
  107. desc: "获取你的昵称、头像、地区及性别", // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
  108. success: (res) => {
  109. console.log("success", res)
  110. this.nickName = res.userInfo.nickName;
  111. this.avatarUrl = res.userInfo.avatarUrl;
  112. this.gender = res.userInfo.gender;
  113. let iv = res.iv;
  114. let encryptedData = res.encryptedData;
  115. let code = this.code;
  116. let avatarUrl = this.avatarUrl;
  117. let nickName = this.nickName;
  118. let gender = this.gender;
  119. this.isLogin = 2
  120. mpAutoLogin({
  121. encryptedData,
  122. iv,
  123. code,
  124. avatarUrl,
  125. nickName,
  126. gender,
  127. }).then((apiRes) => {
  128. console.log("apiRes", apiRes);
  129. storage.setAccessToken(apiRes.data.data.token);
  130. // storage.setRefreshToken(apiRes.data.result.refreshToken);
  131. uni.showToast({
  132. title: "登录成功!",
  133. icon: "none",
  134. });
  135. //存储用户信息
  136. storage.setUserInfo(apiRes.data.data.userInfo);
  137. storage.setHasLogin(true);
  138. // 用户手动授权头像昵称
  139. if(apiRes.data.data.isNewUser){
  140. // 新用户跳转上传头像昵称界面
  141. uni.navigateTo({
  142. url: `/pages/userInfo/index?openId=${apiRes.data.data.userInfo.openId}`
  143. });
  144. }else{
  145. // 老用户直接跳转首页
  146. wx.switchTab({
  147. url: '/pages/user/index'
  148. });
  149. }
  150. // uni.navigateBack({
  151. // delta: 1,
  152. // });
  153. });
  154. },
  155. fail: (res) => {
  156. console.log("fail", res)
  157. },
  158. });
  159. this.logingFlag = false;
  160. }
  161. },
  162. redirectToHome() {
  163. uni.navigateBack();
  164. }
  165. }
  166. }
  167. </script>
  168. <style>
  169. .login-container {
  170. min-height: 100vh;
  171. padding: 0 40rpx;
  172. background-color: #fff;
  173. display: flex;
  174. flex-direction: column;
  175. }
  176. .page-header {
  177. display: flex;
  178. justify-content: space-between;
  179. align-items: center;
  180. padding: 40rpx 0;
  181. }
  182. .back-icon {
  183. font-size: 50rpx;
  184. color: #333;
  185. width: 60rpx;
  186. }
  187. .page-title {
  188. font-size: 36rpx;
  189. font-weight: bold;
  190. color: #333;
  191. }
  192. .placeholder {
  193. width: 60rpx;
  194. }
  195. .logo-section {
  196. display: flex;
  197. flex-direction: column;
  198. align-items: center;
  199. /* margin-bottom: 60rpx; */
  200. }
  201. .logo {
  202. width: 150rpx;
  203. height: 150rpx;
  204. /* margin-bottom: 20rpx; */
  205. }
  206. .app-name {
  207. font-size: 48rpx;
  208. font-weight: bold;
  209. color: #4CAF50;
  210. /* margin-bottom: 10rpx; */
  211. }
  212. .app-slogan {
  213. font-size: 28rpx;
  214. color: #666;
  215. }
  216. .login-section {
  217. display: flex;
  218. flex-direction: column;
  219. align-items: center;
  220. padding: 20rpx 0;
  221. position: relative;
  222. }
  223. .login-bg {
  224. width: 100%;
  225. max-width: 600rpx;
  226. margin: 20rpx 0 60rpx;
  227. }
  228. .wechat-login-btn {
  229. width: 80%;
  230. height: 90rpx;
  231. background-color: #07C160;
  232. color: #fff;
  233. border-radius: 45rpx;
  234. font-size: 32rpx;
  235. font-weight: bold;
  236. display: flex;
  237. align-items: center;
  238. justify-content: center;
  239. border: none;
  240. margin-bottom: 40rpx;
  241. padding: 0;
  242. margin-top: 20rpx;
  243. }
  244. .wechat-login-btn::after {
  245. border: none;
  246. }
  247. .wechat-icon {
  248. width: 40rpx;
  249. height: 40rpx;
  250. background-color: rgba(255, 255, 255, 0.2);
  251. color: #fff;
  252. border-radius: 20rpx;
  253. font-size: 20rpx;
  254. display: flex;
  255. align-items: center;
  256. justify-content: center;
  257. margin-right: 10rpx;
  258. }
  259. .privacy-agreement {
  260. display: flex;
  261. align-items: center;
  262. justify-content: center;
  263. /* margin-top: auto; */
  264. padding: 40rpx 0;
  265. }
  266. .agreement-text {
  267. font-size: 24rpx;
  268. color: #666;
  269. margin-left: 10rpx;
  270. }
  271. .link {
  272. color: #4CAF50;
  273. }
  274. </style>