# Login
# 功能
- 端游只有 QQ 登录,手游支持 QQ&WX 登录
- 不需要记录数据情况下的绑定大区功能,更推荐使用 AMS 模块的绑定大区
# 必读
- 页面中不要再重复引入 milo!!!
- need 以及 milo 中其他函数的使用,务必放在 init 之后,默认会加载
["biz.login", "biz.roleselector", "biz.dialog"]
,分别用loginObj.LoginManager, loginObj.RoleSelector, loginObj.Dialog
表示。不要重复引入!!! - DOM 必须按照指定结构,必须引入,不需要的时候可以隐藏
- logout 的回调禁止刷新页面
# 使用
# DOM 结构
# 老 milo
<div id="unlogin" class="login unlogin" style="display: block">
<!--登录前状态 Start-->
<div class="login__pc">
<a id="btn_qqlogin" href="javascript:" title="QQ登录">【QQ登录】</a>
<a id="btn_wxlogin" href="javascript:" title="微信登录">【微信登录】</a>
</div>
<div class="login__m">
<a id="ptLoginBtn" style="cursor: pointer">【QQ登录】</a>
<a id="wxloginBtn" style="cursor: pointer">【微信登录】</a>
</div>
<!--登录前状态 End-->
</div>
<!--登录后状态 Start-->
<div id="logined" class="login logined center" style="display: none">
<div class="login__pc">欢迎您,<span id="login_qq_span"></span></div>
<div class="login__m">欢迎您, <span id="userinfo"></span></div>
<span class="area_bind">
<a id="noBind">【绑定大区】</a>
<a id="area_info" style="display: none"></a>
<a style="display: none" id="isBind">【更改绑定】</a>
</span>
<div class="login__pc">
<a id="btn_logout" href="javascript:void(0);" title="注销">注销</a>
</div>
<div class="login__m">
<a id="ptLogoutBtn" href="javascript:void(0);" style="cursor: pointer"
>注销</a
>
</div>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 新 milo
<div id="logined">
欢迎您,<span id="milo_userinfo"></span><img id="milo_headimg" />
<span id="logoutBtn">注销</span>
</div>
<div id="unlogin">
<span id="qqLoginBtn">QQ登录</span>
<span id="wxLoginBtn">微信登录</span>
<span id="qqwxLoginBtn">QQ微信联合登录</span>
</div>
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 钩子函数
函数名 | 用法 |
---|---|
init | 初始化,加载完 milo 之后执行 |
logined | 登录后执行 |
logout | 注销后执行 |
bound | 绑定大区后执行 |
unbind | 取消绑定后执行 |
unlogin | 页面登录态失效后的回调(新 milo)| |
# 典型案栗
const { Login } = LOL;
const loginObj = new Login({
pc: {
// 我想pc登录后不刷新
needReloadPage: false,
},
mobile: {
// 我不允许QQ的一键登录
sData: {
pt_no_onekey: 1,
},
},
init() {
// 这里才开始有milo/login/roleselector/dialog,不需要再次定义TGDialogS和closeDialog啦,直接用
// 可以执行一些页面初始化
initDOM();
// 可以这个时候再给页面功能按钮绑定事件处理
startFunction();
},
logined() {
// 这里已经通过了milo的checkRealLogin校验,可以拿到用户信息
console.log(loginObj.userInfo);
},
logout() {
// 注销后需要对页面的状态和变量做初始化哦
initDOM();
initLocalStore();
},
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 函数
_ TIPS _ 新 milo 版本支持所有老版本中的函数,函数调用方式一致,区别是新版本的参数与新 milo 的保持一致。
- 初始化参数在 new Login 时传入
- login/loginByWX 可以传入自己指定的参数,也可以不传
# 校验登录态
【checkLogin】
- 老:更推荐使用
loginObj.LoginManager.checkLogin
哦,当前函数之后不再维护。 - 新:不带有参数,调用方式相同
参数 | 类型 | 含义 |
---|---|---|
noCache | boolean | 是否调用后端接口,默认 true |
返回 | 类型 | 含义 |
---|---|---|
登录状态 | Promise | 在 then 中执行已登录的回调,catch 中执行未登录回调 |
// 校验QQ登录态
const loginObj = new Login();
loginObj
.checkLogin()
.then((userInfo) => {
console.log("已QQ登录");
console.log(userInfo);
})
.catch((e) => {
console.log(e);
});
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# QQ 登录
【login】
会先检测当前登录状态,如果当前未登录才会执行登录操作
const loginObj = new Login();
loginObj.login();
1
2
2
# 获取用户信息
【getUserInfo】
参数 | 类型 | 含义 |
---|---|---|
uin/nickname/缺省 | string | 用户信息 |
返回 | 类型 | 含义 |
---|---|---|
用户信息 | string/object | uin 获取 qq 号/ nickname 获取昵称/ 缺省 用户信息对象 |
// 获取用户uin(QQ号)
const loginObj = new Login();
loginObj.getUserInfo("uin");
1
2
3
2
3
# 注销 QQ 登录
【logout】
PC 端会存在配置项,移动端无。
const loginObj = new Login();
loginObj.logout();
1
2
2
# 大区选择
【getAreaInfo】
获取大区信息,拉起弹窗显示,当未绑定大区和更换大区时使用
当选择大区后,会将大区信息存储在 localStorage 中,具体键值对如下
键 | 值 |
---|---|
${uin}_lolAreaInfo | 大区名 |
${uin}_lolAreaId | 大区 ID |
${uin}_lolAccountInfo | 角色信息 |
const loginObj = new Login();
loginObj.getAreaInfo();
// 选择大区后
console.log(localStorage.getItem("827924130_lolAreaInfo"));
// 艾欧尼亚 电信
console.log(localStorage.getItem("827924130_lolAreaId"));
// 1
console.log(localStorage.getItem("827924130_lolAccountInfo"));
// {"roleName":"小丧尸一号","level":"1","accountId":"2283404133443712"}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 根据 ID 获取大区名称
【zoneToName】
参数 | 类型 | 含义 |
---|---|---|
areaId | number | 大区 ID |
返回 | 类型 | 含义 |
---|---|---|
areaName | string | 大区名称 |
const loginObj = new Login();
loginObj.zoneToName(1);
// 艾欧尼亚 电信
1
2
3
2
3
# 初始化大区信息
【initArea】
登录后自动调用该函数,无参数和返回值
如果绑定大区功能区使用默认的 DOM 结构,则无需绑定事件,否则需要手动为绑定大区和更改大区的 DOM 绑定事件
const loginObj = new Login();
loginObj.initArea();
1
2
2
# 检测绑定大区状态
【checkBind】
参数 | 类型 | 含义 |
---|---|---|
autoBind | boolean | 未绑定时是否自动拉起绑定弹窗,默认 true 拉起 |
返回 | 类型 | 含义 |
---|---|---|
bindStatus | Promise | 大区的绑定情况 |
当用户已绑定大区时会返回用户大区 ID;以下情况会返回 reject 状态
- 未登录
- 未绑定大区
const loginObj = new Login();
// 未绑定时自动拉起大区绑定
loginObj
.checkBind()
.then((areaId)) => {
console.log('已绑定大区');
console.log(areaId);
})
.catch(e => {
// 如果未绑定后拉起大区绑定时执行了绑定,则不会走到catch,catch会捕获错误
console.log(e);
// do something
});
// 未绑定时不自动拉起大区绑定,返回reject,在catch中处理
loginObj
.checkBind(false)
.then((areaId)) => {
console.log(areaId);
})
.catch(e => {
// 此处catch的一般是未绑定大区的情况
console.log(e);
// unBind
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
手游登录 DEMO DEMO (opens new window)
# 背景
LOL 登录功能是十分常见和重要的,为了避免大家到处复制粘贴,以及尽量减少代码的重复率,提高大家开发的体验,将 Login 封装到了 SDK 当中,并且可以单独下载使用。
# 特点
- 组件化的调用方式,封装了大量细节,极易上手,代码量少
- 自动根据环境加载 milo,自动检测当前页面的登录状态,足够智能
- 提供了足量但不过量的配置参数和各个状态钩子,能够分别在初始化/登录后/绑定后/注销后等状态下插入自定义操作,保证了灵活性
- 默认的 DOM 设定满足了大多场景下的需要,避免对 DOM 的频繁操
# 更新日志
2020.10.15
- 修复移动端登录传参失效问题
- 注销回调的 demo 修改
- 加入 AMS 绑定大区自适应
2021.04.16
- 加入手游的微信登录
Ajax →