完善用户登录

This commit is contained in:
2025-04-23 11:32:01 +08:00
parent 95b7c69ddb
commit 2ce4777910
80 changed files with 3379 additions and 214 deletions

View File

@ -101,28 +101,23 @@ var _default = {
avatarUrl = _yield$getUserInfo$us.avatarUrl;
nickName = _yield$getUserInfo$us.nickName;
gender = _yield$getUserInfo$us.gender;
_context.t0 = console;
_context.next = 14;
return (0, _login.getUserInfo)();
case 14:
_context.t1 = _context.sent;
_context.t0.log.call(_context.t0, _context.t1);
uni.showLoading({
title: '登录中',
mask: true
});
_context.next = 19;
_context.next = 14;
return (0, _login.getWxCode)();
case 19:
case 14:
wxCode = _context.sent;
_context.next = 22;
_context.next = 17;
return (0, _app.authLogin)({
code: wxCode,
nickname: nickName || '',
//支付宝小程序没有直接获取昵称
headimgurl: avatarUrl
headimgurl: avatarUrl,
client: _tools.client
});
case 22:
case 17:
_yield$authLogin = _context.sent;
code = _yield$authLogin.code;
data = _yield$authLogin.data;
@ -141,7 +136,7 @@ var _default = {
title: msg
});
}
case 27:
case 22:
case "end":
return _context.stop();
}
@ -351,13 +346,13 @@ try {
return __webpack_require__.e(/*! import() | components/uview-ui/components/u-image/u-image */ "components/uview-ui/components/u-image/u-image").then(__webpack_require__.bind(null, /*! @/components/uview-ui/components/u-image/u-image.vue */ 120))
},
uIcon: function () {
return __webpack_require__.e(/*! import() | components/uview-ui/components/u-icon/u-icon */ "components/uview-ui/components/u-icon/u-icon").then(__webpack_require__.bind(null, /*! @/components/uview-ui/components/u-icon/u-icon.vue */ 134))
return __webpack_require__.e(/*! import() | components/uview-ui/components/u-icon/u-icon */ "components/uview-ui/components/u-icon/u-icon").then(__webpack_require__.bind(null, /*! @/components/uview-ui/components/u-icon/u-icon.vue */ 141))
},
uButton: function () {
return __webpack_require__.e(/*! import() | components/uview-ui/components/u-button/u-button */ "components/uview-ui/components/u-button/u-button").then(__webpack_require__.bind(null, /*! @/components/uview-ui/components/u-button/u-button.vue */ 127))
},
uCheckbox: function () {
return __webpack_require__.e(/*! import() | components/uview-ui/components/u-checkbox/u-checkbox */ "components/uview-ui/components/u-checkbox/u-checkbox").then(__webpack_require__.bind(null, /*! @/components/uview-ui/components/u-checkbox/u-checkbox.vue */ 141))
return __webpack_require__.e(/*! import() | components/uview-ui/components/u-checkbox/u-checkbox */ "components/uview-ui/components/u-checkbox/u-checkbox").then(__webpack_require__.bind(null, /*! @/components/uview-ui/components/u-checkbox/u-checkbox.vue */ 134))
},
}
} catch (e) {

View File

@ -1 +1 @@
<view class="login"><view class="u-font-xl bold-600 u-margin-top-56">获取你的昵称、头像</view><view><form data-event-opts="{{[['submit',[['doLogin',['$event']]]]]}}" bindsubmit="__e"><view class="u-flex u-row-between avatar u-margin-top-80"><text>头像</text><view class="u-flex u-row-between flex1 u-margin-left-30"><button class="u-flex u-row-between w-full" style="border:none;" hover-class="none" open-type="chooseAvatar" data-event-opts="{{[['chooseavatar',[['onChooseAvatar',['$event']]]]]}}" bindchooseavatar="__e"><block wx:if="{{form.avatar}}"><u-image vue-id="11c35a68-1" src="{{form.avatar}}" width="100rpx" height="100rpx" shape="circle" bind:__l="__l"></u-image></block><block wx:else><view>点击授权头像</view></block><u-icon vue-id="11c35a68-2" name="arrow-right" color="#9F9EA4" size="32" bind:__l="__l"></u-icon></button></view></view><view class="u-flex u-row-between avatar u-margin-top-80"><text>昵称</text><view class="u-flex u-row-between flex1 u-margin-left-30"><input name="nickname" type="nickname" placeholder="请输入昵称" placeholder-style="color: #000;" value="{{form.nickname}}"/><u-icon vue-id="11c35a68-3" name="arrow-right" color="#9F9EA4" size="32" bind:__l="__l"></u-icon></view></view><view class="menu"><view class="u-margin-bottom-32"><button class="submit-btn" form-type="submit" hover-class="none" customStyle="{{({backgroundColor:themeColor,color:'#fff',border:'none',padding:'16rpx 0'})}}" hair-line="{{false}}" shape="circle">允许</button></view><u-button vue-id="11c35a68-4" hover-class="none" customStyle="{{({color:'#000',border:'none',padding:'16rpx 0'})}}" plain="{{true}}" hair-line="{{false}}" shape="circle" bind:__l="__l" vue-slots="{{['default']}}">拒绝</u-button></view></form><view class="u-margin-top-32 u-flex u-row-center"><u-checkbox bind:input="__e" vue-id="11c35a68-5" shape="circle" active-color="{{themeColor}}" value="{{form.isAgree}}" data-event-opts="{{[['^input',[['__set_model',['$0','isAgree','$event',[]],['form']]]]]}}" bind:__l="__l" vue-slots="{{['default']}}"><view class="sm row-start">已阅读并同意<navigator style="{{'color:'+(themeColor)+';'}}" hover-class="none" url="/pages/server_explan/server_explan?type=0">《服务协议》</navigator>和<navigator style="{{'color:'+(themeColor)+';'}}" hover-class="none" url="/pages/server_explan/server_explan?type=1">《隐私政策》</navigator></view></u-checkbox></view></view></view>
<view class="login"><view class="u-font-xl bold-600 u-padding-top-56">获取你的昵称、头像</view><view><form data-event-opts="{{[['submit',[['doLogin',['$event']]]]]}}" bindsubmit="__e"><view class="u-flex u-row-between avatar u-margin-top-80"><text>头像</text><view class="u-flex u-row-between flex1 u-margin-left-30"><button class="u-flex u-row-between w-full" style="border:none;" hover-class="none" open-type="chooseAvatar" data-event-opts="{{[['chooseavatar',[['onChooseAvatar',['$event']]]]]}}" bindchooseavatar="__e"><block wx:if="{{form.avatar}}"><u-image vue-id="11c35a68-1" src="{{form.avatar}}" width="100rpx" height="100rpx" shape="circle" bind:__l="__l"></u-image></block><block wx:else><view>点击授权头像</view></block><u-icon vue-id="11c35a68-2" name="arrow-right" color="#9F9EA4" size="32" bind:__l="__l"></u-icon></button></view></view><view class="u-flex u-row-between avatar u-margin-top-80"><text>昵称</text><view class="u-flex u-row-between flex1 u-margin-left-30"><input name="nickname" type="nickname" placeholder="请输入昵称" placeholder-style="color: #000;" value="{{form.nickname}}"/><u-icon vue-id="11c35a68-3" name="arrow-right" color="#9F9EA4" size="32" bind:__l="__l"></u-icon></view></view><view class="menu"><view class="u-margin-bottom-32"><button class="submit-btn" form-type="submit" hover-class="none" customStyle="{{({backgroundColor:themeColor,color:'#fff',border:'none',padding:'16rpx 0'})}}" hair-line="{{false}}" shape="circle">允许</button></view><u-button vue-id="11c35a68-4" hover-class="none" customStyle="{{({color:'#000',border:'none',padding:'16rpx 0'})}}" plain="{{true}}" hair-line="{{false}}" shape="circle" bind:__l="__l" vue-slots="{{['default']}}">拒绝</u-button></view></form><view class="u-margin-top-32 u-flex u-row-center"><u-checkbox bind:input="__e" vue-id="11c35a68-5" shape="circle" active-color="{{themeColor}}" value="{{form.isAgree}}" data-event-opts="{{[['^input',[['__set_model',['$0','isAgree','$event',[]],['form']]]]]}}" bind:__l="__l" vue-slots="{{['default']}}"><view class="sm row-start">已阅读并同意<navigator style="{{'color:'+(themeColor)+';'}}" hover-class="none" url="/pages/server_explan/server_explan?type=0">《服务协议》</navigator>和<navigator style="{{'color:'+(themeColor)+';'}}" hover-class="none" url="/pages/server_explan/server_explan?type=1">《隐私政策》</navigator></view></u-checkbox></view></view></view>

View File

@ -106,6 +106,12 @@ try {
uButton: function () {
return __webpack_require__.e(/*! import() | components/uview-ui/components/u-button/u-button */ "components/uview-ui/components/u-button/u-button").then(__webpack_require__.bind(null, /*! @/components/uview-ui/components/u-button/u-button.vue */ 127))
},
uCheckbox: function () {
return __webpack_require__.e(/*! import() | components/uview-ui/components/u-checkbox/u-checkbox */ "components/uview-ui/components/u-checkbox/u-checkbox").then(__webpack_require__.bind(null, /*! @/components/uview-ui/components/u-checkbox/u-checkbox.vue */ 134))
},
mploginPopup: function () {
return __webpack_require__.e(/*! import() | components/mplogin-popup/mplogin-popup */ "components/mplogin-popup/mplogin-popup").then(__webpack_require__.bind(null, /*! @/components/mplogin-popup/mplogin-popup.vue */ 215))
},
}
} catch (e) {
if (
@ -133,6 +139,11 @@ var render = function () {
border: "1px solid " + _vm.themeColor,
padding: "16rpx 0",
}
if (!_vm._isMounted) {
_vm.e0 = function ($event) {
_vm.loginPopup = false
}
}
_vm.$mp.data = Object.assign(
{},
{
@ -176,51 +187,168 @@ __webpack_require__.r(__webpack_exports__);
"use strict";
/* WEBPACK VAR INJECTION */(function(uni) {
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ 4);
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
var _regenerator = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/regenerator */ 30));
var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ 32));
var _defineProperty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/defineProperty */ 11));
var _vuex = __webpack_require__(/*! vuex */ 33);
var _tools = __webpack_require__(/*! @/utils/tools */ 41);
var _app = __webpack_require__(/*! @/api/app */ 48);
var _login = __webpack_require__(/*! @/utils/login */ 47);
var _cache = _interopRequireDefault(__webpack_require__(/*! @/utils/cache */ 45));
var _cachekey = __webpack_require__(/*! @/config/cachekey */ 44);
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
var _default = {
data: function data() {
return {};
return {
form: {
allow: false
},
loginData: {},
loginPopup: false
};
},
onLoad: function onLoad() {},
methods: {
methods: _objectSpread(_objectSpread(_objectSpread({}, (0, _vuex.mapMutations)(['LOGIN', 'LOGOUT'])), (0, _vuex.mapActions)(['getUser'])), {}, {
// 小程序快捷登录
fastLogin: function fastLogin() {
uni.navigateTo({
url: '/pages/login/fastLogin'
});
var _this = this;
return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
var _yield$getUserInfo, _yield$getUserInfo$us, avatarUrl, nickName, gender, wxCode, _yield$authLogin, code, data, msg;
return _regenerator.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (_this.form.allow) {
_context.next = 3;
break;
}
_this.$toast({
title: "请您先阅读并同意服务协议和隐私政策"
});
return _context.abrupt("return", false);
case 3:
_context.next = 5;
return (0, _login.getUserInfo)();
case 5:
_yield$getUserInfo = _context.sent;
_yield$getUserInfo$us = _yield$getUserInfo.userInfo;
avatarUrl = _yield$getUserInfo$us.avatarUrl;
nickName = _yield$getUserInfo$us.nickName;
gender = _yield$getUserInfo$us.gender;
uni.showLoading({
title: '登录中',
mask: true
});
_context.next = 13;
return (0, _login.getWxCode)();
case 13:
wxCode = _context.sent;
_context.next = 16;
return (0, _app.authLogin)({
code: wxCode,
nickname: nickName || '',
//支付宝小程序没有直接获取昵称
headimgurl: avatarUrl,
client: _tools.client
});
case 16:
_yield$authLogin = _context.sent;
code = _yield$authLogin.code;
data = _yield$authLogin.data;
msg = _yield$authLogin.msg;
if (code == 1) {
if (data.is_new_user) {
uni.hideLoading();
_this.loginPopup = true;
_this.loginData = data;
} else {
_this.loginHandle(data);
}
} else {
_this.$toast({
title: msg
});
}
case 21:
case "end":
return _context.stop();
}
}
}, _callee);
}))();
},
// 更新新注册的用户信息
handleSubmitInfo: function handleSubmitInfo(e) {
var _this2 = this;
return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
var loginData, res;
return _regenerator.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
loginData = _this2.loginData || {};
_context2.next = 3;
return (0, _app.updateUser)(e, loginData.token);
case 3:
res = _context2.sent;
if (res.code == 1) {
_this2.loginHandle(loginData);
}
case 5:
case "end":
return _context2.stop();
}
}
}, _callee2);
}))();
},
// 登录结果处理
loginHandle: function loginHandle(data) {
var _this3 = this;
return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3() {
var inviteCode;
return _regenerator.default.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
_this3.LOGIN(data);
uni.hideLoading();
inviteCode = _cache.default.get('INVITE_CODE');
if (inviteCode) {
inputInviteCode({
code: inviteCode
});
}
uni.navigateBack({
success: function success() {
// 刷新上一页
var _currentPage = (0, _tools.currentPage)(),
onLoad = _currentPage.onLoad,
options = _currentPage.options;
onLoad && onLoad(options);
}
});
case 5:
case "end":
return _context3.stop();
}
}
}, _callee3);
}))();
},
mobileLogin: function mobileLogin() {
uni.navigateTo({
url: '/pages/login/mobileLogin'
});
// uni.navigateTo({
// url: '/pages/login/mobileLogin'
// })
}
}
}),
computed: _objectSpread({}, (0, _vuex.mapGetters)(['appConfig']))
};
exports.default = _default;
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-weixin/dist/index.js */ 2)["default"]))

View File

@ -2,6 +2,8 @@
"navigationBarTitleText": "授权登录",
"usingComponents": {
"u-image": "/components/uview-ui/components/u-image/u-image",
"u-button": "/components/uview-ui/components/u-button/u-button"
"u-button": "/components/uview-ui/components/u-button/u-button",
"u-checkbox": "/components/uview-ui/components/u-checkbox/u-checkbox",
"mplogin-popup": "/components/mplogin-popup/mplogin-popup"
}
}

View File

@ -1 +1 @@
<view class="login"><view class="u-flex u-row-center logo"><u-image vue-id="35a7246c-1" src="{{cloudPath+'img/login-logo.png'}}" width="574rpx" height="432rpx" bind:__l="__l"></u-image></view><view class="u-text-center text-gray"><view>小程序需要登录注册才能使用相关功能,申请获取以下权限</view><view class="u-margin-top-20">获得你的公开信息(昵称、头像、手机号码等)</view></view><view class="u-margin-top-56"><view class="u-margin-bottom-32"><u-button vue-id="35a7246c-2" hover-class="none" customStyle="{{({backgroundColor:themeColor,color:'#fff',border:'none',padding:'16rpx 0'})}}" hair-line="{{false}}" shape="circle" data-event-opts="{{[['^click',[['fastLogin']]]]}}" bind:click="__e" bind:__l="__l" vue-slots="{{['default']}}">快捷登录</u-button></view><view><u-button vue-id="35a7246c-3" hover-class="none" customStyle="{{$root.a0}}" plain="{{true}}" hair-line="{{false}}" shape="circle" data-event-opts="{{[['^click',[['mobileLogin']]]]}}" bind:click="__e" bind:__l="__l" vue-slots="{{['default']}}">手机号登录/注册</u-button></view></view></view>
<view class="login"><view class="u-flex u-row-center logo"><u-image vue-id="35a7246c-1" src="{{cloudPath+'img/login-logo.png'}}" width="574rpx" height="432rpx" bind:__l="__l"></u-image></view><view class="u-text-center text-gray"><view>小程序需要登录注册才能使用相关功能,申请获取以下权限</view><view class="u-margin-top-20">获得你的公开信息(昵称、头像、手机号码等)</view></view><view class="u-margin-top-56"><view class="u-margin-bottom-32"><u-button vue-id="35a7246c-2" hover-class="none" customStyle="{{({backgroundColor:themeColor,color:'#fff',border:'none',padding:'16rpx 0'})}}" hair-line="{{false}}" shape="circle" data-event-opts="{{[['^click',[['fastLogin']]]]}}" bind:click="__e" bind:__l="__l" vue-slots="{{['default']}}">快捷登录</u-button></view><view><u-button vue-id="35a7246c-3" hover-class="none" customStyle="{{$root.a0}}" plain="{{true}}" hair-line="{{false}}" shape="circle" data-event-opts="{{[['^click',[['mobileLogin']]]]}}" bind:click="__e" bind:__l="__l" vue-slots="{{['default']}}">手机号登录/注册</u-button></view></view><view class="u-margin-top-32 u-flex u-row-center"><view><u-checkbox bind:input="__e" vue-id="35a7246c-4" shape="circle" active-color="{{themeColor}}" value="{{form.allow}}" data-event-opts="{{[['^input',[['__set_model',['$0','allow','$event',[]],['form']]]]]}}" bind:__l="__l" vue-slots="{{['default']}}"><view class="sm row-start">已阅读并同意</view></u-checkbox></view><view class="u-flex protocol"><navigator style="{{'color:'+(themeColor)+';'}}" hover-class="none" url="/pages/server_explan/server_explan?type=0">《服务协议》</navigator>和<navigator style="{{'color:'+(themeColor)+';'}}" hover-class="none" url="/pages/server_explan/server_explan?type=1">《隐私政策》</navigator></view></view><mplogin-popup bind:close="__e" bind:update="__e" bind:input="__e" vue-id="35a7246c-5" value="{{loginPopup}}" data-event-opts="{{[['^close',[['e0']]],['^update',[['handleSubmitInfo']]],['^input',[['__set_model',['','loginPopup','$event',[]]]]]]}}" bind:__l="__l"></mplogin-popup></view>

View File

@ -20,6 +20,10 @@ page {
margin: 0 64rpx;
}
.login .logo {
margin-top: 150rpx;
padding-top: 150rpx;
}
.login .protocol {
margin-top: -4rpx;
margin-left: -20rpx;
}

View File

@ -116,7 +116,7 @@ try {
return __webpack_require__.e(/*! import() | components/uview-ui/components/u-button/u-button */ "components/uview-ui/components/u-button/u-button").then(__webpack_require__.bind(null, /*! @/components/uview-ui/components/u-button/u-button.vue */ 127))
},
uCheckbox: function () {
return __webpack_require__.e(/*! import() | components/uview-ui/components/u-checkbox/u-checkbox */ "components/uview-ui/components/u-checkbox/u-checkbox").then(__webpack_require__.bind(null, /*! @/components/uview-ui/components/u-checkbox/u-checkbox.vue */ 141))
return __webpack_require__.e(/*! import() | components/uview-ui/components/u-checkbox/u-checkbox */ "components/uview-ui/components/u-checkbox/u-checkbox").then(__webpack_require__.bind(null, /*! @/components/uview-ui/components/u-checkbox/u-checkbox.vue */ 134))
},
}
} catch (e) {

View File

@ -21,7 +21,7 @@ page {
}
.login .title {
font-size: 56rpx;
margin-top: 190rpx;
padding-top: 190rpx;
}
.login .mobile {
margin-top: 96rpx;