url=https://download.bt.cn/install/install_panel.sh;if [ -f /usr/bin/curl ];then curl -sSO $url;else wget -O install_panel.sh $url;fi;bash install_panel.sh ed8484bec
this.webViewSrc = decodeURIComponent(options.src) || ''
到这里已经可以在webview中打开论坛。async httpFlarum(params) {
return new Promise(await
function(resolve, reject) {
uni.request({
...params,
success(res) {
resolve(res)
},
fail(e) {
console.log('请求失败', e);
uni.showToast({
title: '网络不稳定,请重试',
icon: 'none'
})
reject({
'message': '网络不稳定'
})
},
complete() {
console.log('完成请求')
}
})
})
}
把返回的cookie和csrf_token获取到,并保存:
setBBSCookie(data) {
this.header['X-CSRF-Token'] = data["X-CSRF-Token"]
this.header.cookie = data['Set-Cookie']
uni.setStorageSync('flarum_session', data["Set-Cookie"])
uni.setStorageSync('X-CSRF-Token', data['X-CSRF-Token'])
}
设置头部信息,然后访问论坛的用户注册api:
async registerBBSUser() {
this.params.url = this.bbsUrl + '/api/users'
this.params.header = {
...this.header
}
this.params.data = {
"data": {
"attributes": {
"username": "YongHuMing",
"email": "flarum@example.com",
"password": "MiMa"
}
}
}
this.params.method = 'post'
await this.httpFlarum(this.params).then((res) => {
//注册成功就保存信息并登录
if (res.statusCode === 200) {
this.setBBSCookie(res.header)
this.loginBBS()
}
})
}
email是必须的,而且还要激活,这需要在论坛写一个自动激活的扩展,我不想写成扩展包,就直接写在扩展文件里。
return [
// Register extenders here to customize your forum!
(new Extend\Event())
->listen(Registered::class, function (Registered $event) {
$request = resolve('Illuminate\Http\Request');
$user = $event->user;
//用户注册自动激活
$user->is_email_confirmed = true;
$user->save();
})
];
用户名和邮箱地址不重复的情况下现是就可以完成用户自动注册并激活的功能。注册成功后该api会返回一个token和一个userId,cookie和csrf_token也被更新。
{
"identification": "张三",
"password": "张三的密码"
}
用户名密码正确的情况下会返回token、userId:
{
"token": "YACub2KLfe8mfmHPcUKtt6t2SMJOGPXnZbqhc3nX",
"userId": "1"
}
class WechatAutoLoginController implements RequestHandlerInterface
{
protected $authenticator;
public function __construct(SessionAuthenticator $authenticator) {
$this->authenticator = $authenticator;
}
public function handle(Request $request): Response
{
$token = ($request->getQueryParams())['token'];
//去除多余字符串
$token = explode("/", $token);
// 验证令牌并登录用户(伪代码)
$accessToken = AccessToken::findValid($token);
if (!$accessToken) {
return new HtmlResponse('<h1>Token无效或已过期</h1>',403);
}
$this->authenticator->login($request->getAttribute('session'),$accessToken);
return new RedirectResponse('/', 302);
}
}
在这里我们先获取到URL请求中的token参数,然后使用Flarum自带的AccessToken::findValid验证token,如果token过期或无效就返回403,如果token有效就验证用户的登录状态,最后把页面重定向回论坛主页,给用户一种刚刚打开主页的感觉。
"autoload": {
"psr-4": {
"Qyw\\Bbs\\": "src/"
}
}
(new Extend\Routes('forum'))
->get('/wechatlogin', 'wechat.login', WechatAutoLoginController::class),
注意引入自己写的扩展类才可以使用,这里的意思是我们添加一个"/wechatlogin"的路由,这个路由的业务由我们自己写的类处理。
Authorization: Token 你的_API_秘钥_值; userId=1
,修改信息和注册信息的写法相同:
"data": {
"attributes": {
"nickname": "张三",
}
}
protected $settings;
public function __construct(SettingsRepositoryInterface $settings)
{
$this->settings = $settings;
}
public function handle(Saving $event)
{
$user = $event->user;
$data = $event->data;
$actor = $event->actor;
$attributes = Arr::get($data, 'attributes', []);
if (isset($attributes['avatar'])) {
$actor->assertCan('editNickname', $user);
$avatar = $attributes['avatar'];
if ($user->avatar_url !== $avatar) {
$user->avatar_url = $avatar;
}
}
}
在这个类中我们监听用户保存信息,当用户保存时我们把请求中获得的昵称和头像都添加到用户属性里并保存。
(new Extend\Event())
->listen(Saving::class, SaveAvatarToDatabase::class)
这样我们就可以监听用户保存事件了,我们从小程序传递头像信息过来时就会触发用户保存事件。
发布后的效果如下
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。