im/app/enterprise/model/User.php

378 lines
14 KiB
PHP
Raw Permalink Normal View History

2023-09-26 18:09:46 +08:00
<?php
/**
* raingad IM [ThinkPHP6]
* @author xiekunyu <raingad@foxmail.com>
*/
namespace app\enterprise\model;
use GatewayClient\Gateway;
use app\BaseModel;
use think\facade\Db;
use think\facade\Request;
use think\model\concern\SoftDelete;
use app\manage\model\Config;
use thans\jwt\facade\JWTAuth;
class User extends BaseModel
{
use SoftDelete;
protected $pk = "user_id";
public static $defaultField = 'user_id,realname,account,avatar,name_py,email,last_login_ip';
protected $json = ['setting'];
protected $jsonAssoc = true;
public function getUid()
{
return self::$uid;
}
//查询用户信息
public static function getUserInfo($map=[])
{
if(!$map){
return self::$userInfo;
}
$data = self::where($map)->find();
if ($data) {
$data = $data->toArray();
}
return $data;
}
/**
* 刷新用户token 之前token将被拉黑
* 修改用户数据后 调用该方法 并返回前台更新token
* @param array $info 用户信息
* @param string $terminal 客户端标识
* @return string
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public static function refreshToken($info,$terminal)
{
$info = str_encipher(json_encode($info),true, config('app.aes_token_key'));
$authToken = 'bearer '.JWTAuth::builder(['info' => $info, 'terminal' => $terminal]);
return $authToken;
}
// 获取所有用户列表
public static function getAllUser($map, $user_ids = [],$user_id,$group_id = 0)
{
$field = self::$defaultField;
$list=[];
if($group_id){
$groupUser=GroupUser::where([['group_id','=',$group_id],['role','<>',1],['status','=',1]])->column('user_id');
if($groupUser){
$list=User::where([['user_id','in',$groupUser]])->field($field)->select()->toArray();
}
}else{
$config=Config::getSystemInfo();
// 如果是社区模式,就只查询自己的好友,如果是企业模式,就查询所有用户
if($config['sysInfo']['runMode']==1){
$list = self::where($map)->field($field)->select()->toArray();
}else{
$friendList = Friend::getFriend(['create_user' => $user_id,'status'=>1]);
$userList = array_keys($friendList);
$list = self::where($map)->where('user_id', 'in', $userList)->field($field)->select()->toArray();
}
}
foreach ($list as $k => $v) {
$list[$k]['disabled'] = false;
$list[$k]['avatar'] = avatarUrl($v['avatar'], $v['realname'], $v['user_id']);
if ($user_ids) {
if (in_array($v['user_id'], $user_ids)) {
$list[$k]['disabled'] = true;
}
}
}
return $list;
}
//查询用户列表
public static function getUserList($map, $user_id, $field = "")
{
if (!$field) {
$field = self::$defaultField;
}
$friendList = Friend::getFriend(['create_user' => $user_id]);
$config=Config::getSystemInfo();
// 如果是社区模式,就只查询自己的好友,如果是企业模式,就查询所有用户
if($config['sysInfo']['runMode']==1){
$list = self::where($map)->field($field)->select();
}else{
$userList = array_keys($friendList);
$list = self::where($map)->where('user_id', 'in', $userList)->field($field)->select();
}
$list_chart = chartSort($list, 'realname', false, 'index');
// 查询未读消息
$unread = Db::name('message')
->field('from_user,count(msg_id) as unread')
->where([['to_user', '=', $user_id], ['is_read', '=', 0], ['is_group', '=', 0]])
->group('from_user')
->select();
// 查询最近的联系人
$map1 = [['to_user', '=', $user_id], ['is_last', '=', 1], ['is_group', '=', 0]];
$map2 = [['from_user', '=', $user_id], ['is_last', '=', 1], ['is_group', '=', 0]];
$msgField = 'from_user,to_user,content as lastContent,create_time as lastSendTime,chat_identify,type,del_user';
$lasMsgList = Db::name('message')
->field($msgField)
->whereOr([$map1, $map2])
->order('create_time desc')
->select();
// 查询群聊
$group = Group::getMyGroup(['gu.user_id' => $user_id, 'gu.status' => 1]);
if ($group) {
$group = $group->toArray();
$group_ids = arrayToString($group, 'group_id');
$getGroupLastMsg = Db::name('message')->field($msgField)->where([['to_user', 'in', $group_ids], ['is_group', '=', 1], ['is_last', '=', 1]])->select();
foreach ($group as $k => $v) {
$setting = $v['setting'] ? json_decode($v['setting'], true) : ['manage' => 0, 'invite' => 1, 'nospeak' => 0];
$group_id = 'group-' . $v['group_id'];
$group[$k]['id'] = $group_id;
$group[$k]['account'] = $group_id;
$group[$k]['avatar'] = avatarUrl($v['avatar'], $v['displayName'], $v['group_id'], 120);
$group[$k]['name_py'] = $v['name_py'];
$group[$k]['owner_id'] = $v['owner_id'];
$group[$k]['role'] = $v['role'];
$group[$k]['is_group'] = 1;
$group[$k]['setting'] = $setting;
$group[$k]['index'] = "[2]群聊";
$group[$k]['realname'] = $v['displayName'] . " [群聊]";
$group[$k]['is_notice'] = $v['is_notice'];
$group[$k]['is_top'] = $v['is_top'];
$group[$k]['is_online'] = 1;
if ($getGroupLastMsg) {
foreach ($getGroupLastMsg as $val) {
if ($val['to_user'] == $v['group_id']) {
$group[$k]['type'] =$val['type'];
$group[$k]['lastContent'] = str_encipher($val['lastContent'],false);
$group[$k]['lastSendTime'] = $val['lastSendTime'] * 1000;
break;
}
}
}
}
}
try{
Gateway::$registerAddress = config('gateway.registerAddress');
$onlineList=Gateway::getAllUidList();
}catch(\Exception $e){
$onlineList=[];
}
foreach ($list_chart as $k => $v) {
// 是否有消息通知或者置顶聊天
$friend = isset($friendList[$v['user_id']]) ? $friendList[$v['user_id']] : [];
$list_chart[$k]['id'] = $v['user_id'];
$list_chart[$k]['displayName'] = ($friend['nickname'] ?? '') ? : $v['realname'];
$list_chart[$k]['name_py'] = $v['name_py'];
$list_chart[$k]['avatar'] = avatarUrl($v['avatar'], $v['realname'], $v['user_id'], 120);
$list_chart[$k]['lastContent'] = '';
$list_chart[$k]['unread'] = 0;
$list_chart[$k]['lastSendTime'] = time() * 1000;
$list_chart[$k]['is_group'] = 0;
$list_chart[$k]['setting'] = [];
$list_chart[$k]['last_login_ip'] = $v['last_login_ip'];
$list_chart[$k]['location'] =$v['last_login_ip'] ? implode(" ", \Ip::find($v['last_login_ip'])) : "未知";
$is_online=0;
if(isset($onlineList[$v['user_id']])){
$is_online=1;
}
$list_chart[$k]['is_online'] = $is_online;
$is_top = 0;
$is_notice = 1;
if ($friend) {
$is_top = $friend['is_top'];
$is_notice = $friend['is_notice'];
}
$list_chart[$k]['is_top'] = $is_top;
$list_chart[$k]['is_notice'] = $is_notice;
if ($unread) {
foreach ($unread as $val) {
if ($val['from_user'] == $v['user_id']) {
$list_chart[$k]['unread'] = $val['unread'];
break;
}
}
}
if ($lasMsgList) {
foreach ($lasMsgList as $val) {
if ($val['from_user'] == $v['user_id'] || $val['to_user'] == $v['user_id']) {
$content = str_encipher($val['lastContent'],false);
// 屏蔽已删除的消息
if ($val['del_user']) {
$delUser = explode(',', $val['del_user']);
if (in_array($user_id, $delUser)) {
$content = "";
}
}
$list_chart[$k]['type'] = $val['type'];
$list_chart[$k]['lastContent'] = $content;
$list_chart[$k]['lastSendTime'] = $val['lastSendTime'] * 1000;
break;
}
}
}
}
// 合并群聊和联系人
$data = array_merge($list_chart, $group);
return $data;
}
public static function getList($map)
{
return self::field(self::$defaultField)->where($map)->select();
}
// 匹配用户列表信息(返回用户信息)
public static function matchUser($data, $many = false, $field = 'user_id', $cs = 80)
{
if ($many) {
$idr = arrayToString($data, $field, false);
} else {
$idr = [];
if (is_array($field)) {
foreach ($field as $v) {
$idr[] = $data[$v];
}
} else {
$idr = [$data[$field]];
}
}
$key = array_search(0, $idr);
if ($key) {
array_splice($idr, $key, 1);
}
$userList = self::where([['user_id', 'in', $idr]])->field(self::$defaultField)->select()->toArray();
$list = [];
foreach ($userList as $v) {
$v['avatar'] = avatarUrl($v['avatar'], $v['realname'], $v['user_id'], $cs);
$v['id'] = $v['user_id'];
$list[$v['user_id']] = $v;
}
return $list;
}
// 匹配用户列表信息返回data
public static function matchAllUser($data, $many = false, $field = 'user_id', $key = "userInfo", $cs = 80)
{
if ($many) {
$idr = arrayToString($data, $field);
$userList = self::getList([['user_id', 'in', $idr]]);
foreach ($data as $k => $v) {
foreach ($userList as $vv) {
if ($v[$field] == $vv['user_id']) {
$data[$k][$key] = [
'id' => $vv['user_id'],
'displayName' => $vv['realname'],
'account' => $vv['account'],
'name_py' => $vv['name_py'],
'avatar' => avatarUrl($vv['avatar'], $vv['realname'], $vv['user_id'], $cs),
];
}
}
}
} else {
$user = self::getUserInfo(['user_id' => $data[$field]]);
$data[$key] = [
'id' => $user['user_id'],
'displayName' => $user['realname'],
'account' => $user['account'],
'name_py' => $user['name_py'],
'avatar' => avatarUrl($user['avatar'], $user['realname'], $user['user_id']),
];
}
return $data;
}
// 将用户信息转换成联系人信息
public static function setContact($user_id){
$user=self::where('user_id',$user_id)->field(self::$defaultField)->find();
if($user){
$user['avatar']=avatarUrl($user['avatar'],$user['realname'],$user['user_id']);
$user['id']=$user['user_id'];
$user['displayName']=$user['realname'];
$user['lastContent']="你们已经成功添加为好友,现在开始聊天吧!";
$user['unread']=0;
$user['lastSendTime']=time() * 1000;
$user['is_group']=0;
$user['is_top']=0;
$user['is_notice']=1;
$user['is_online']=1;
$user['type']='event';
$user['index']=getFirstChart($user['realname']);
return $user;
}else{
return false;
}
}
// 验证账号的合法性
public function checkAccount(&$data){
$user_id=$data['user_id'] ?? 0;
if($user_id){
$user=self::find($data['user_id']);
if(!$user){
$this->error='账户不存在';
return false;
}
if($user->user_id==1 && self::$uid!=1){
$this->error='超管账户只有自己才能修改';
return false;
}
$other=self::where([['account','=',$data['account']],['user_id','<>',$data['user_id']]])->find();
if($other){
$this->error='账户已存在';
return false;
}
}else{
$user=self::where('account',$data['account'])->find();
if($user){
$this->error='账户已存在';
return false;
}
}
$config=Config::getSystemInfo();
$regauth=$config['sysInfo']['regauth'] ?? 0;
$acType=\utils\Regular::check_account($data['account']);
switch($regauth){
case 1:
if($acType!=1){
$this->error='当前系统只允许账号为手机号!';
return false;
}
break;
case 2:
if($acType!=2){
$this->error='当前系统只允许账号为邮箱!';
return false;
}
break;
case 3:
// 验证账号是否为手机号或者邮箱
if(!$acType){
$this->error='账户必须为手机号或者邮箱';
return false;
}
break;
default:
break;
}
$data['is_auth'] =$regauth ? 1 : 0;
$email=$data['email'] ?? '';
if($data['is_auth'] && $acType==2 && !$email){
$data['email'] =$data['account'];
}
return true;
}
}