index.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  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. uni.navigateBack({
  150. delta: 1,
  151. });
  152. }
  153. // uni.navigateBack({
  154. // delta: 1,
  155. // });
  156. });
  157. },
  158. fail: (res) => {
  159. console.log("fail", res)
  160. },
  161. });
  162. this.logingFlag = false;
  163. }
  164. },
  165. redirectToHome() {
  166. uni.navigateBack();
  167. }
  168. }
  169. }
  170. </script>
  171. <style>
  172. .login-container {
  173. min-height: 100vh;
  174. padding: 0 40rpx;
  175. background-color: #fff;
  176. display: flex;
  177. flex-direction: column;
  178. }
  179. .page-header {
  180. display: flex;
  181. justify-content: space-between;
  182. align-items: center;
  183. padding: 40rpx 0;
  184. }
  185. .back-icon {
  186. font-size: 50rpx;
  187. color: #333;
  188. width: 60rpx;
  189. }
  190. .page-title {
  191. font-size: 36rpx;
  192. font-weight: bold;
  193. color: #333;
  194. }
  195. .placeholder {
  196. width: 60rpx;
  197. }
  198. .logo-section {
  199. display: flex;
  200. flex-direction: column;
  201. align-items: center;
  202. /* margin-bottom: 60rpx; */
  203. }
  204. .logo {
  205. width: 150rpx;
  206. height: 150rpx;
  207. /* margin-bottom: 20rpx; */
  208. }
  209. .app-name {
  210. font-size: 48rpx;
  211. font-weight: bold;
  212. color: #4CAF50;
  213. /* margin-bottom: 10rpx; */
  214. }
  215. .app-slogan {
  216. font-size: 28rpx;
  217. color: #666;
  218. }
  219. .login-section {
  220. display: flex;
  221. flex-direction: column;
  222. align-items: center;
  223. padding: 20rpx 0;
  224. position: relative;
  225. }
  226. .login-bg {
  227. width: 100%;
  228. max-width: 600rpx;
  229. margin: 20rpx 0 60rpx;
  230. }
  231. .wechat-login-btn {
  232. width: 80%;
  233. height: 90rpx;
  234. background-color: #07C160;
  235. color: #fff;
  236. border-radius: 45rpx;
  237. font-size: 32rpx;
  238. font-weight: bold;
  239. display: flex;
  240. align-items: center;
  241. justify-content: center;
  242. border: none;
  243. margin-bottom: 40rpx;
  244. padding: 0;
  245. margin-top: 20rpx;
  246. }
  247. .wechat-login-btn::after {
  248. border: none;
  249. }
  250. .wechat-icon {
  251. width: 40rpx;
  252. height: 40rpx;
  253. background-color: rgba(255, 255, 255, 0.2);
  254. color: #fff;
  255. border-radius: 20rpx;
  256. font-size: 20rpx;
  257. display: flex;
  258. align-items: center;
  259. justify-content: center;
  260. margin-right: 10rpx;
  261. }
  262. .privacy-agreement {
  263. display: flex;
  264. align-items: center;
  265. justify-content: center;
  266. /* margin-top: auto; */
  267. padding: 40rpx 0;
  268. }
  269. .agreement-text {
  270. font-size: 24rpx;
  271. color: #666;
  272. margin-left: 10rpx;
  273. }
  274. .link {
  275. color: #4CAF50;
  276. }
  277. </style>