Files
bsh_sample/app/common/logic/UserLogic.php
T
2025-12-08 17:37:34 +08:00

207 lines
4.9 KiB
PHP

<?php
namespace app\common\logic;
use app\common\traits\crud\CrudLogicTrait;
use app\common\model\User;
use app\common\service\WechatService;
use support\exception\BusinessException;
class UserLogic
{
use CrudLogicTrait;
/**
* 指定当前要操作的模型
*/
protected string $modelClass = User::class;
/**
* 构建 JWT 令牌有效载荷
*
* @param User $user
* @return array
*/
public function buildJwtPayload(User $user): array
{
$now = time();
return [
'sub' => 'user_' . $user->id,
'aud' => 'bsh.yw.hnzhwlkj.cn',
'iat' => $now,
'nbf' => $now,
'exp' => $now + config('jwt.jwt_expiration'),
'typ' => 'access',
'user_id' => $user->id,
'name' => $user->name,
'meta' => $user->toArray(),
'uid' => $user->id,
];
}
/**
* 用户信息
*/
public function userInfo(int $uid)
{
$user = User::find($uid);
if (!$user) {
throw new BusinessException('账户不存在', 404);
}
if ($user->status != 1) {
throw new BusinessException('账号已禁用', 403);
}
return $user;
}
/**
* 检测用户是否存在
*
* @param string $openid
* @param string $unionid
* @return User|bool
*/
public function checkUser(string $openid, string $unionid): User|bool
{
$uinfo = User::where('status', 1)
->where('openid', $openid)
->where('unionid', $unionid)
->first();
return $uinfo === null ? false : $uinfo;
}
/**
* 绑定用户
*
* @param array $data
* @return User|bool
*/
public function bindUser(array $data): User|bool
{
$uinfo = User::where('status', 1)
->where('name', $data['name'])
->where('mobile', $data['mobile'])
->where('sn', $data['sn'])
->first();
if ($uinfo !== null) {
$uinfo->update([
'openid' => $data['openid'],
'unionid' => $data['unionid'],
'nickname' => $data['nickname'],
'avatar' => $data['avatar'],
'password' => password_hash($data['password'], PASSWORD_DEFAULT)
]);
return $uinfo;
}
return false;
}
/**
* 创建用户
*
* @param array $data
* @return User
*/
public function createUser(array $data): User
{
return User::create($data);
}
/**
* 获取微信access_token
*
* @param string $code
* @param string $state
* @return array
*/
public function getAccessToken(string $code, string $state): array
{
$wechat = new WechatService();
return $wechat->wechatWebAccessToken($code, $state);
}
/**
* 获取微信用户信息
*
* @param array $token
* @return array
*/
public function getWechatUserInfo(array $token)
{
$wechat = new WechatService();
return $wechat->wechatWebUserInfo($token);
}
/**
* 获取用户列表
*/
public function getList()
{
$list = User::where('status', 1)->orderBy('id', 'desc')->get();
$arr = [];
foreach ($list->toArray() as $item) {
$arr[] = [
'name' => $item['name'],
'id' => $item['id'],
];
}
return $arr;
}
/**
* 修改密码
*/
public function savePassword(int $uid, array $data)
{
$password = password_hash($data['password_new'], PASSWORD_DEFAULT);
$res = User::where('id',$uid)->update(['password' => $password]);
return $res;
}
//---------------------------------------------小程序------------------------------------------------------------
/**
* 获取微信小程序access_token
*
* @param string $code
* @param string $state
* @return array
*/
public function getMiniAccessToken(): array
{
$wechat = new WechatService();
return $wechat->getMiniAccessToken();
}
/**
* 获取 openid / session_key
*
* @param string $code
* @param string $state
* @return array
*/
public function miniCode2Session($loginCode): array
{
$wechat = new WechatService();
return $wechat->miniCode2Session($loginCode);
}
/**
* 获取 openid / session_key
*
* @param string $code
* @param string $state
* @return array
*/
public function getMiniPhoneNumber($access_token, $phone_code): array
{
$wechat = new WechatService();
return $wechat->getMiniPhoneNumber($access_token, $phone_code);
}
}