* Date: 2019-7-30
*/
namespace app\home\model;
use think\Model;
use think\Db;
use think\Page;
use think\Config;
use app\home\logic\AskLogic;
/**
* 模型
*/
class Ask extends Model
{
//初始化
protected function initialize()
{
// 需要调用`Model`的`initialize`方法
parent::initialize();
$this->users_db = Db::name('users'); // 会员表
$this->ask_db = Db::name('ask'); // 问题表
$this->ask_answer_db = Db::name('ask_answer'); // 答案表
$this->ask_type_db = Db::name('ask_type'); // 问题栏目分类表
$this->ask_answer_like_db = Db::name('ask_answer_like'); // 问题回答点赞表
$this->AskLogic = new AskLogic;
}
// 用户信息及问题回答数据
public function GetUsersAskCount($view_uid = null)
{
// 返回参数
$result = [];
// 查询会员信息
$users = session('users');
if (!empty($users) && $users['users_id'] == $view_uid) {
$result = [
'NickName' => $users['nickname'],
'HeadPic' => $users['head_pic'],
'IsLogin' => 1,
];
} else {
$UsersInfo = $this->users_db->field('nickname,head_pic')->where('users_id', $view_uid)->find();
if (!empty($UsersInfo)) {
$result = [
'NickName' => $UsersInfo['nickname'],
'HeadPic' => $UsersInfo['head_pic'],
'IsLogin' => 0,
];
}
}
// 问答数量
if (!empty($result['NickName'])) {
// 查询问题数量
$result['AskCount'] = $this->ask_db->where('users_id', $view_uid)->count();
// 查询回答数量
$result['AnswerCount'] = $this->ask_answer_db->where('users_id', $view_uid)->count();
}
// 拼装URL
$result['UsersAskUrl'] = askurl('home/Ask/ask_index', ['view_uid' => $view_uid]);
// ROOT_DIR.'/index.php?m=home&c=Ask&a=ask_index&view_uid='.$view_uid;
$result['UsersAnswerUrl'] = askurl('home/Ask/ask_index', ['view_uid' => $view_uid, 'method' => 'answer']);
// ROOT_DIR.'/index.php?m=home&c=Ask&a=ask_index&view_uid='.$view_uid.'&method=answer';
return $result;
}
// 会员问题回答数据
public function GetUsersAskData($view_uid = null, $is_ask = true)
{
// 返回参数
$result = [];
$field = 'a.ask_id, a.type_id, a.ask_title, a.click, a.replies, a.add_time, a.is_review, b.users_id, b.nickname';
if (!empty($is_ask)) {
// 提问问题查询列表
$where = [
'a.status' => ['IN', [0, 1]],
'a.users_id' => $view_uid,
];
/* 分页 */
$count = $this->ask_db->alias('a')->where($where)->count('ask_id');
$pageObj = new Page($count, 10);
$result['pageStr'] = $pageObj->show();
/* END */
/*问题表数据(问题表+会员表+问题分类表)*/
$result['AskData'] = $this->ask_db->field($field)
->alias('a')
->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')
->where($where)
->order('a.add_time desc')
->limit($pageObj->firstRow . ',' . $pageObj->listRows)
->select();
/* END */
/*问题回答人查询*/
$ask_id = get_arr_column($result['AskData'], 'ask_id');
$RepliesData = $this->ask_answer_db->field('a.ask_id, a.users_id, b.nickname')
->alias('a')
->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')
->where('ask_id', 'IN', $ask_id)
->select();
/* END */
} else {
// 回答问题查询列表
/*问题回答人查询*/
$RepliesData = $this->ask_answer_db->field('a.ask_id, a.users_id, b.nickname')
->alias('a')
->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')
->select();
/* END */
/* 查询条件 */
$UsersIds = group_same_key($RepliesData, 'users_id');
$ask_ids = get_arr_column($UsersIds[$view_uid], 'ask_id');
// 按主键去重
$ask_ids = array_unique($ask_ids, SORT_REGULAR);
$where = [
'a.status' => ['IN', [0, 1]],
'a.ask_id' => ['IN', $ask_ids],
];
/* END */
/* 分页 */
$count = $this->ask_db->alias('a')->where($where)->count('ask_id');
$pageObj = new Page($count, 10);
$result['pageStr'] = $pageObj->show();
/* END */
/*问题表数据(问题表+会员表+问题分类表)*/
$result['AskData'] = $this->ask_db->field($field)
->alias('a')
->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')
->where($where)
->order('a.add_time desc')
->limit($pageObj->firstRow . ',' . $pageObj->listRows)
->select();
/* END */
}
// 取出提问问题的ID作为主键
$RepliesData = group_same_key($RepliesData, 'ask_id');
/*数据处理*/
foreach ($result['AskData'] as $key => $value) {
// 时间友好显示处理
$result['AskData'][$key]['add_time'] = friend_date($value['add_time']);
// 问题内容Url
$result['AskData'][$key]['AskUrl'] = askurl('home/Ask/details', ['ask_id' => $value['ask_id']]);
// ROOT_DIR.'/index.php?m=home&c=Ask&a=details&ask_id='.$value['ask_id'];
// 回复处理
if (!empty($RepliesData[$value['ask_id']])) {
$UsersConut = array_values(array_unique($RepliesData[$value['ask_id']], SORT_REGULAR));
$result['AskData'][$key]['UsersConut'] = '等' . count($UsersConut) . '人参与讨论';
} else {
$UsersConut = ['0' => ['nickname' => $value['nickname']]];
$result['AskData'][$key]['UsersConut'] = $value['nickname'];
}
// 处理参与讨论者的A标签跳转
foreach ($UsersConut as $kkk => $vvv) {
$nickname = $vvv['nickname'];
if (($kkk + 1) == count($UsersConut) || 2 == $kkk) {
$result['AskData'][$key]['NickName'] .= '' . $nickname . '';
break;
} else {
$result['AskData'][$key]['NickName'] .= '' . $nickname . '、';
}
}
}
/* END */
return $result;
}
// 问题数据
public function GetNewAskData($where = array(), $limit = 20, $field = null)
{
// 返回参数
$result = [];
// 没有传入则默认查询这些字段
if (empty($field)) {
$field = 'a.*, b.nickname, b.head_pic, c.type_name';
}
$result['PendingAsk'] = '';
if (isset($where['a.replies']) && 0 == $where['a.replies']) {
$result['PendingAsk'] = '待回答';
}
// 提取搜索关键词
if (!empty($where['SearchName']) || null == $where['SearchName']) {
$SearchName = $where['SearchName'];
unset($where['SearchName']);
$result['SearchName'] = $SearchName;
$result['SearchNameRed'] = "搜索 " . $SearchName . " 结果";
}
if (!empty($where['a.type_id'])) {
// 存在栏目ID则执行
$TypeData = $this->ask_type_db->where('parent_id', $where['a.type_id'])->field('type_id')->select();
if (!empty($TypeData)) {
// 将顶级栏目ID合并到新条件中
$type_id = get_arr_column($TypeData, 'type_id');
$type_id = array_merge($type_id, array(0 => $where['a.type_id']));
$where['a.type_id'] = ['IN', $type_id];
}
// 查询满足要求的总记录数
$count = $this->ask_db->alias('a')->where($where)->count('ask_id');
// 实例化分页类 传入总记录数和每页显示的记录数
$pageObj = new Page($count, $limit);
/*问题表数据(问题表+会员表+问题分类表)*/
$result['AskData'] = $this->ask_db->field($field)
->alias('a')
->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')
->join('ask_type c', 'a.type_id = c.type_id', 'LEFT')
->where($where)
->order('a.ask_id desc')
->limit($pageObj->firstRow . ',' . $pageObj->listRows)
->select();
// 分页显示输出
$result['pageStr'] = $pageObj->show();
} else {
/*问题表数据(问题表+会员表+问题分类表)*/
$result['AskData'] = $this->ask_db->field($field)
->alias('a')
->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')
->join('ask_type c', 'a.type_id = c.type_id', 'LEFT')
->where($where)
->order('a.ask_id desc')
->limit($limit)
->select();
/* END */
$result['pageStr'] = '';
}
/*问题回答人查询*/
$ask_id = get_arr_column($result['AskData'], 'ask_id');
$RepliesData = $this->ask_answer_db->field('a.ask_id, a.users_id, b.head_pic, b.nickname')
->alias('a')
->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')
->where('ask_id', 'IN', $ask_id)
->select();
$RepliesDataNew = [];
foreach ($RepliesData as $key => $value) {
/*头像处理*/
$value['head_pic'] = get_head_pic($value['head_pic']);
/*个人主页URL*/
$value['usershomeurl'] = usershomeurl($value['users_id']);
// 将二维数组以ask_id值作为键,并归类数组,效果同等group_same_key
$RepliesDataNew[$value['ask_id']][] = $value;
}
/* END */
/*数据处理*/
foreach ($result['AskData'] as $key => $value) {
/*头像处理*/
$value['head_pic'] = get_head_pic($value['head_pic']);
$result['AskData'][$key]['head_pic'] = $value['head_pic'];
/* END */
// 若存在搜索关键词则标红关键词
if (isset($SearchName) && !empty($SearchName)) {
$result['AskData'][$key]['ask_title'] = $this->AskLogic->GetRedKeyWord($SearchName, $value['ask_title']);
}
// 时间友好显示处理
$result['AskData'][$key]['add_time'] = friend_date($value['add_time']);
// 栏目分类Url
$result['AskData'][$key]['TypeUrl'] = askurl('home/Ask/index', ['type_id' => $value['type_id']]);
// 问题内容Url
$result['AskData'][$key]['AskUrl'] = askurl('home/Ask/details', ['ask_id' => $value['ask_id']]);
// 回复处理
if (!empty($RepliesDataNew[$value['ask_id']])) {
$UsersConut = array_unique($RepliesDataNew[$value['ask_id']], SORT_REGULAR);
// 读取前三条数据
$result['AskData'][$key]['HeadPic'] = array_slice($UsersConut, 0, 3);
$result['AskData'][$key]['UsersConut'] = '等' . count($UsersConut) . '人参与讨论';
} else {
$result['AskData'][$key]['HeadPic'] = ['0' => ['head_pic' => $value['head_pic'], 'usershomeurl'=>usershomeurl($value['users_id'])]];
$result['AskData'][$key]['UsersConut'] = $value['nickname'];
}
// 内容处理
$preg = '//i';
$value['content'] = strip_tags(preg_replace($preg, '[图片]', htmlspecialchars_decode($value['content'])));
$result['AskData'][$key]['content'] = $value['content'];
// $result['AskData'][$key]['content'] = mb_strimwidth($value['content'], 0, 120, "...");
}
/* END */
// 是否推荐
if (!empty($where['a.is_recom'])) {
$result['IsRecom'] = 1;
} else {
$result['IsRecom'] = 0;
}
if (!empty($where['a.money'])) {
$result['IsRecom'] = 3;
}
return $result;
}
// 加急问题列表(默认10条数据)
public function GetUrgentAskData($limit = 10)
{
$field = 'ask_id, type_id, ask_title, money';
$where = [
'is_del' => 0,
'is_review' => 1,
'money' => ['>', 0]
];
$result['UrgentAsk'] = $this->ask_db->field($field)->where($where)->order('money desc')->limit($limit)->select();
foreach ($result['UrgentAsk'] as &$value) {
$value['AskUrl'] = askurl('home/Ask/details', ['ask_id' => $value['ask_id']]);
}
return $result;
}
// 统计会员提问、回答、被评论、被点赞次数
public function GetCountAskData($users_id = null)
{
// 查询提问数据
$where = [
'is_del' => 0,
'users_id' => $users_id
];
$AskListID = $this->ask_db->field('ask_id')->where($where)->column('ask_id');
// 统计会员所有提问数
$CountAsk = count($AskListID);
// 查询回答、评论、回复数据
$where = [
'is_del' => 0
];
$answer_list = $this->ask_answer_db->where($where)->select();
$CountAnswer = $CountBeLike = $CountBeAnswer = 0;
$CountBeLikeID = $CountAnswerID = [];
foreach ($answer_list as $key => $value) {
// 统计数量
if (($users_id == $value['users_id'])) {
// 统计会员所有回答数
if (empty($value['answer_pid'])) $CountAnswer += 1;
// 统计会员所有回答、评论、回复被点赞ID,用于查询点赞数据表中符合的点赞数
if (!empty($value['click_like'])) array_push($CountBeLikeID, $value['answer_id']);
// 统计会员所有回答、评论、回复ID,用于下一个foreach做被评论、被@回复计算
array_push($CountAnswerID, $value['answer_id']);
}
}
// 统计会员所有提问、回答、评论、回复被点赞数
$LikeWhere = '';
if (!empty($AskListID) && empty($CountBeLikeID)) {
$AskListID = implode(',', $AskListID);
$LikeWhere = '(`like_source` = 1 AND `ask_id` IN ('.$AskListID.') AND `users_id` <> '.$users_id.')';
} else if (empty($AskListID) && !empty($CountBeLikeID)) {
$CountBeLikeID = implode(',', $CountBeLikeID);
$LikeWhere = '(`users_id` <> '.$users_id.' AND `answer_id` IN ('.$CountBeLikeID.'))';
} else if (!empty($AskListID) && !empty($CountBeLikeID)) {
$AskListID = implode(',', $AskListID);
$CountBeLikeID = implode(',', $CountBeLikeID);
$LikeWhere = '(`like_source` IN (2,3) AND `answer_id` IN ('.$CountBeLikeID.') AND `users_id` <> '.$users_id.') OR (`like_source` = 1 AND `ask_id` IN ('.$AskListID.') AND `users_id` <> '.$users_id.')';
}
$CountBeLike = !empty($LikeWhere) ? $this->ask_answer_like_db->where($LikeWhere)->count() : $CountBeLike;
// 统计会员所有回答被、评论、被@回复数量,仅针对会员回答的层级下
if (!empty($CountAnswerID)) {
foreach ($answer_list as $value) {
if (in_array($value['answer_pid'], $CountAnswerID) && $users_id != $value['users_id']) {
$CountBeAnswer += 1;
}
}
}
// 返回统计结果
$result['CountUsersAsk'] = [
'CountAsk' => $CountAsk,
'CountAnswer' => $CountAnswer,
'CountBeLike' => $CountBeLike,
'CountBeAnswer' => $CountBeAnswer
];
return $result;
}
// 问题栏目分类数据
public function GetAskTypeData($param = array(), $is_add = null)
{
// 数据初始化
$result = [
'IsTypeId' => 0,
'ParentId' => 0,
'TypeId' => 0,
'TypeName' => '',
'HtmlCode' => '请先让管理员在问答栏目列表中添加分类!',
'TypeData' => []
];
/*栏目处理*/
$TypeData = $this->ask_type_db->order('sort_order asc, type_id asc')->select();
if (empty($TypeData)) return [];
foreach ($TypeData as $key => $value) {
/*若存在分类ID且和数据中的值相等则执行*/
if (!empty($param['type_id']) && $value['type_id'] == $param['type_id']) {
$result['TypeName'] = $value['type_name'];
$result['TypeId'] = $value['type_id'];
$result['ParentId'] = $value['parent_id'];
// 描点标记焦点
if (!empty($value['parent_id'])) {
$result['IsTypeId'] = $value['parent_id'];
} else {
$result['IsTypeId'] = $value['type_id'];
}
}
/* END */
// 是否顶级栏目
if ($value['parent_id'] == 0) {
$value['SelectType'] = 0;
$PidData[] = $value;
} else {
$value['SelectSubType'] = 0;
$TidData[] = $value;
}
}
// 调用来源
if (isset($is_add) && 'add_ask' == $is_add) {
// 问题发布调用
$return['HtmlCode'] = $this->AskLogic->GetTypeHtmlCode($PidData, $TidData, $param['type_id']);
return $return;
} else if (isset($is_add) && 'edit_ask' == $is_add) {
// 问题编辑调用
$return['HtmlCode'] = $this->AskLogic->GetTypeHtmlCode($PidData, $TidData, $param['type_id']);
return $return;
} else {
// 列表或内容页调用
$TidData = !empty($TidData) ? group_same_key($TidData, 'parent_id') : [];
// 一级栏目处理
foreach ($PidData as $P_key => $PidValue) {
$result['TypeData'][] = $PidValue;
$result['TypeData'][$P_key]['Url'] = askurl('home/Ask/index', ['type_id' => $PidValue['type_id']]);
// ROOT_DIR.'/index.php?m=home&c=Ask&a=index&type_id='.$PidValue['type_id'];
$result['TypeData'][$P_key]['SubType'] = [];
if (!empty($TidData[$PidValue['type_id']])) {
// 所属子栏目处理
foreach ($TidData[$PidValue['type_id']] as $T_key => $TidValue) {
if ($TidValue['parent_id'] == $PidValue['type_id']) {
array_push($result['TypeData'][$P_key]['SubType'], $TidValue);
$result['TypeData'][$P_key]['SubType'][$T_key]['Url'] = askurl('home/Ask/index', ['type_id' => $TidValue['type_id']]);
// ROOT_DIR.'/index.php?m=home&c=Ask&a=index&type_id='.$TidValue['type_id'];
}
}
}
}
}
/* END */
return $result;
}
// 周榜
public function GetAskWeekListData()
{
$time1 = strtotime(date('Y-m-d H:i:s', time()));
$time2 = $time1 - (86400 * 7);
$where = [
'a.add_time' => ['between time', [$time2, $time1]],
'a.is_review' => 1,
];
$result['WeekList'] = [];
$WeekList = $this->ask_db->field('a.ask_id, a.type_id, a.ask_title, a.click, a.replies, b.head_pic, c.type_name')
->alias('a')
->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')
->join('__ASK_TYPE__ c', 'c.type_id = a.type_id', 'LEFT')
->order('click desc, replies desc')
->where($where)
->limit('0, 10')
->select();
if (empty($WeekList)) return $result;
foreach ($WeekList as $key => $value) {
// 内页详情URL
$result['WeekList'][$key]['AskUrl'] = askurl('home/Ask/details', ['ask_id' => $value['ask_id']]);
// 问题标题
$result['WeekList'][$key]['ask_title'] = $value['ask_title'];
// 问答栏目板块URL
$result['WeekList'][$key]['type_url'] = askurl('home/Ask/index', ['type_id' => $value['type_id']]);
// 问答栏目板块名称
$result['WeekList'][$key]['type_name'] = $value['type_name'];
// 回答数
$result['WeekList'][$key]['replies'] = $value['replies'];
}
return $result;
}
// 总榜
public function GetAskTotalListData()
{
$result['TotalList'] = [];
$TotalList = $this->ask_db->field('a.ask_id, a.type_id, a.ask_title, a.click, a.replies, b.head_pic')
->alias('a')
->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')
->order('click desc, replies desc')
->where('a.is_review', 1)
->limit('0, 10')
->select();
if (empty($TotalList)) {
return $result;
}
foreach ($TotalList as $key => $value) {
$result['TotalList'][$key]['AskUrl'] = askurl('home/Ask/details', ['ask_id' => $value['ask_id']]);
$result['TotalList'][$key]['ask_title'] = $value['ask_title'];
}
return $result;
}
// 问题详情数据
public function GetAskDetailsData($param = array(), $parent_id = null, $users_id = null)
{
$info = $this->ask_db->field('a.*, b.username, b.nickname, b.head_pic, c.type_name')
->alias('a')
->join('ask_type c', 'c.type_id = a.type_id', 'LEFT')
->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')
->where('ask_id', $param['ask_id'])
->find();
if (empty($info)) return ['code' => 0, 'msg' => '浏览的问题不存在'];
if (0 !== $parent_id && 0 == $info['is_review'] && $info['users_id'] !== $users_id) {
return ['code' => 0, 'msg' => '问题未审核通过,暂时不可浏览'];
}
// 问答栏目板块URL
$info['type_url'] = askurl('home/Ask/index', ['type_id' => $info['type_id']]);
// 问题的回答数
$info['ques_answer_count'] = $this->ask_answer_db->where(['answer_pid'=>0, 'ask_id'=>$info['ask_id']])->count();
// 问题的点赞数
$info['ques_like_count'] = $this->ask_answer_like_db->where(['ask_id'=>$info['ask_id'], 'like_source'=>1])->count();
// 头像处理
$info['head_pic'] = get_head_pic($info['head_pic']);
// 时间友好显示处理
$info['add_time'] = friend_date($info['add_time']);
// 处理格式
$info['content'] = htmlspecialchars_decode($info['content']);
// seo信息
$info['seo_title'] = $info['ask_title'].' - '.$info['type_name'];
$info['seo_keywords'] = $info['ask_title'];
$info['seo_description'] = @msubstr(checkStrHtml($info['content']), 0, config('global.arc_seo_description_length'), false);
// 个人主页URL
$info['usershomeurl'] = usershomeurl($info['users_id']);
// 返回数据
$ResultData = [
'code' => 1,
'info' => $info,
// 搜索的内容
'SearchName' => null,
// 登录者是否为问题的发布者
'IsUsers' => $info['users_id'] == session('users_id') ? 1 : 0
];
return $ResultData;
}
// 问题回答数据
public function GetAskReplyData($param = array(), $parent_id = null)
{
/*查询条件*/
$WhereOr = [];
$RepliesWhere = ['ask_id' => $param['ask_id'], 'is_review' => 1];
$bestanswer_id = $this->ask_db->where('ask_id', $param['ask_id'])->getField('bestanswer_id');
if (!empty($param['answer_id'])) {
$WhereOr = ['answer_pid' => $param['answer_id']];
$RepliesWhere = ['answer_id' => $param['answer_id'], 'is_review' => 1];
}
// 若为则创始人则去除仅查询已审核评论这个条件,$parent_id = 0 表示为创始人
if (isset($parent_id) && 0 == $parent_id) unset($RepliesWhere['is_review']);
/* END */
/*评论读取条数*/
$firstRow = !empty($param['firstRow']) ? $param['firstRow'] : 0;
$listRows = !empty($param['listRows']) ? $param['listRows'] : 5;
$result['firstRow'] = $firstRow;
$result['listRows'] = $listRows;
/* END */
/*排序*/
$OrderBy = !empty($param['click_like']) ? 'a.click_like ' . $param['click_like'] . ', a.add_time asc' : 'a.add_time asc';
$click_like = isset($param['click_like']) ? $param['click_like'] : '';
$result['SortOrder'] = 'desc' == $click_like ? 'asc' : 'desc';
/* END */
/*评论回答*/
$RepliesData = $this->ask_answer_db->field('a.*, b.head_pic, b.nickname, c.nickname as `at_usersname`')
->alias('a')
->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')
->join('__USERS__ c', 'a.at_users_id = c.users_id', 'LEFT')
->order($OrderBy)
->where($RepliesWhere)
->whereOr($WhereOr)
->select();
if (empty($RepliesData)) return [];
/* END */
/*点赞数据*/
$AnswerIds = get_arr_column($RepliesData, 'answer_id');
$AnswerLikeData = $this->ask_answer_like_db->field('a.*, b.nickname')
->alias('a')
->join('__USERS__ b', 'a.users_id = b.users_id', 'LEFT')
->order('like_id desc')
->where('answer_id', 'IN', $AnswerIds)
->select();
$AnswerLikeData = group_same_key($AnswerLikeData, 'answer_id');
/* END */
/*回答处理*/
$PidData = $AnswerData = [];
foreach ($RepliesData as $key => $value) {
// 友好显示时间
$value['add_time'] = friend_date($value['add_time']);
// 处理格式
$value['content'] = htmlspecialchars_decode($value['content']);
// 头像处理
$value['head_pic'] = get_head_pic($value['head_pic']);
// 个人主页URL
$value['usershomeurl'] = usershomeurl($value['users_id']);
// 会员昵称
$value['nickname'] = !empty($value['nickname']) ? $value['nickname'] : $value['username'];
// 是否上一级回答
if ($value['answer_pid'] == 0) {
$PidData[] = $value;
} else {
$AnswerData[] = $value;
}
}
/* END */
/*一级回答*/
foreach ($PidData as $key => $PidValue) {
$result['AnswerData'][] = $PidValue;
// 子回答
$result['AnswerData'][$key]['AnswerSubData'] = [];
// 点赞数据
$result['AnswerData'][$key]['AnswerLike'] = [];
/*所属子回答处理*/
foreach ($AnswerData as $AnswerValue) {
if ($AnswerValue['answer_pid'] == $PidValue['answer_id']) {
array_push($result['AnswerData'][$key]['AnswerSubData'], $AnswerValue);
}
}
// 回答的评论回复数
$result['AnswerData'][$key]['CommentReplyNum'] = count($result['AnswerData'][$key]['AnswerSubData']);
/* END */
/*读取指定数据*/
// 以是否审核排序,审核的优先
array_multisort(get_arr_column($result['AnswerData'][$key]['AnswerSubData'], 'is_review'), SORT_DESC, $result['AnswerData'][$key]['AnswerSubData']);
// 读取指定条数
$result['AnswerData'][$key]['AnswerSubData'] = array_slice($result['AnswerData'][$key]['AnswerSubData'], $firstRow, $listRows);
/* END */
$result['AnswerData'][$key]['AnswerLike']['LikeNum'] = null;
$result['AnswerData'][$key]['AnswerLike']['LikeName'] = null;
/*点赞处理*/
foreach ($AnswerLikeData as $LikeKey => $LikeValue) {
if ($PidValue['answer_id'] == $LikeKey) {
// 点赞总数
$LikeNum = count($LikeValue);
$result['AnswerData'][$key]['AnswerLike']['LikeNum'] = $LikeNum;
for ($i = 0; $i < $LikeNum; $i++) {
// 获取前三个点赞人处理后退出本次for
if ($i > 2) break;
// 点赞人用户名\昵称
$LikeName = $LikeValue[$i]['nickname'];
// 在第二个数据前加入顿号,拼装a链接
if ($i != 0) {
$LikeName = ' 、' . $LikeName . '';
} else {
$LikeName = '' . $LikeName . '';
}
$result['AnswerData'][$key]['AnswerLike']['LikeName'] .= $LikeName;
}
}
}
/* END */
}
/* END */
/*最佳答案数据*/
foreach ($result['AnswerData'] as $key => $value) {
if ($bestanswer_id == $value['answer_id']) {
$result['BestAnswer'][$key] = $value;
unset($result['AnswerData'][$key]);
}
}
/* NED */
// 统计回答数
$result['AnswerCount'] = count($RepliesData);
return $result;
}
// 操作问题表回复数
public function UpdateAskReplies($ask_id = null, $IsAdd = true, $DelNum = 0)
{
if (empty($ask_id)) return false;
if (!empty($IsAdd)) {
$Updata = [
'replies' => Db::raw('replies+1'),
'update_time' => getTime(),
];
} else {
$Updata = [
'replies' => Db::raw('replies-1'),
'update_time' => getTime(),
];
if ($DelNum > 0) $Updata['replies'] = Db::raw('replies-' . $DelNum);
}
$this->ask_db->where('ask_id', $ask_id)->update($Updata);
}
// 增加问题浏览点击量
public function UpdateAskClick($ask_id = null)
{
if (empty($ask_id)) return false;
$Updata = [
'click' => Db::raw('click+1'),
'update_time' => getTime(),
];
$this->ask_db->where('ask_id', $ask_id)->update($Updata);
}
// 会员中心--问题中心--我的问题\回复
public function GetUsersAskDataNew($view_uid = null, $is_ask = true)
{
// 返回参数
$result = [];
if (!empty($is_ask)) {
// 提问问题查询列表
/*查询字段*/
$field = 'a.ask_id, a.ask_title, a.click, a.replies, a.add_time, a.is_review, b.type_name';
/* END */
/*查询条件*/
$where = [
'a.status' => ['IN', [0, 1]],
'a.users_id' => $view_uid,
];
/* END */
/* 分页 */
$count = $this->ask_db->alias('a')->where($where)->count('ask_id');
$pageObj = new Page($count, 10);
$result['pageStr'] = $pageObj->show();
/* END */
/*问题表数据(问题表+会员表+问题分类表)*/
$result['AskData'] = $this->ask_db->field($field)
->alias('a')
->join('ask_type b', 'a.type_id = b.type_id', 'LEFT')
->where($where)
->order('a.add_time desc')
->limit($pageObj->firstRow . ',' . $pageObj->listRows)
->select();
/* END */
} else {
// 回答问题查询列表
/*查询字段*/
$field = 'a.*, b.ask_title';
/* END */
/*查询条件*/
$where = [
'a.users_id' => $view_uid,
];
/* END */
/* 分页 */
$count = $this->ask_answer_db->alias('a')->where($where)->count('answer_id');
$pageObj = new Page($count, 5);
$result['pageStr'] = $pageObj->show();
/* END */
/*问题回答人查询*/
$result['AskData'] = $this->ask_answer_db->field($field)
->alias('a')
->join('ask b', 'a.ask_id = b.ask_id', 'LEFT')
->where($where)
->order('a.add_time desc')
->limit($pageObj->firstRow . ',' . $pageObj->listRows)
->select();
/* END */
}
/*数据处理*/
foreach ($result['AskData'] as $key => $value) {
// 问题内容Url
$result['AskData'][$key]['AskUrl'] = askurl('home/Ask/details', ['ask_id' => $value['ask_id']]);
// ROOT_DIR.'/index.php?m=home&c=Ask&a=details&ask_id='.$value['ask_id'];
if (empty($is_ask)) {
$result['AskData'][$key]['AskUrl'] .= !empty($value['answer_pid']) ? '#ul_div_li_' . $value['answer_pid'] : '#ul_div_li_' . $value['answer_id'];
}
if (isset($value['answer_id']) && !empty($value['answer_id'])) {
$preg = '//i';
$value['content'] = htmlspecialchars_decode($value['content']);
$value['content'] = preg_replace($preg, '[图片]', $value['content']);
$value['content'] = strip_tags($value['content']);
$result['AskData'][$key]['content'] = $value['content'];
}
}
/* END */
return $result;
}
//贡献榜(积分)score 财富榜(金币)money
public function GetOrderList($type = 'score')
{
if ($type == 'score') {
$list = Db::name('users')
->field('nickname,head_pic,users_id,scores,devote')
->order('scores desc')
->limit(10)
->select();
$level = Db::name('ask_score_level')->order('min', 'asc')->select();
foreach ($list as $key => $val) {
foreach ($level as $k => $v) {
if ($val['scores'] >= $v['min'] && ( $val['scores'] <= $v['max'] || $v['max'] == 0)) {
$val['level'] = $v['name'];
} else {
continue;
}
}
if (!empty($val['head_pic'])) {
$val['head_pic'] = handle_subdir_pic($val['head_pic']);
} else {
$val['head_pic'] = get_head_pic();
}
$val['usershomeurl'] = usershomeurl($val['users_id']); // 个人主页
$list[$key] = $val;
}
} elseif ($type == 'money') {
$list = Db::name('users_score')
->field('sum(money) as money,users_id')
->where('type', 3)
->group('users_id')
->order('money desc')
->limit(10)
->select();
if (!empty($list)) {
$ids = [];
foreach ($list as $k => $v) {
$ids[] = $v['users_id'];
}
$users_data = Db::name('users')
->field('nickname,head_pic,users_id,devote,scores')
->where('users_id', 'in', $ids)
->getAllWithIndex('users_id');
$level = Db::name('ask_score_level')->order('min', 'asc')->select();
if (!empty($users_data)) {
foreach ($list as $key => $val) {
$val = array_merge($val, $users_data[$val['users_id']]);
if (!empty($v['head_pic'])) {
$val['head_pic'] = handle_subdir_pic($val['head_pic']);
} else {
$val['head_pic'] = get_head_pic();
}
foreach ($level as $k => $v) {
if ($val['scores'] >= $v['min'] && ( $val['scores'] <= $v['max'] || $v['max'] == 0)) {
$val['level'] = $v['name'];
} else {
continue;
}
}
$val['usershomeurl'] = usershomeurl($val['users_id']); // 个人主页
$list[$key] = $val;
}
}
}
}
return $list;
}
/**
* 增加余额(设为最佳答案)$act='inc'
*/
public function setMoney($users_id = 0, $money = 0, $ask_id = 0, $reply_id = 0)
{
Db::name('users')->where('users_id', $users_id)->setInc('users_money', $money);
$data = [
'ask_id' => $ask_id,
'reply_id' => $reply_id,
'users_id' => $users_id,
'money' => $money,
'info' => '最佳答案',
'type' => 3,
'add_time' => getTime(),
'update_time' => getTime(),
];
Db::name('users_score')->insert($data);
}
/**
* 编辑问题增加悬赏金额
*/
public function updateMoney($users_id = 0, $money = 0, $ori_money = 0, $ask_id = 0)
{
Db::name('users')->where('users_id', $users_id)->setDec('users_money', $money - $ori_money);
$data = [
'money' => $money,
'update_time' => getTime(),
];
Db::name('users_score')->where(['ask_id' => $ask_id, 'users_id' => $users_id, 'type' => 1])->update($data);
}
/**
* 添加赠送积分记录
* $type 1-提问 2-回答
*/
public function setScore($users_id = 0, $ask_id = 0, $reply_id = 0, $type = 1, $money = 0)
{
//先判断是否开启问答送积分
$data = getUsersConfigData('score');
if (empty($data['score_ask_status']) && $money == 0) {
//未开启问答送积分+没有悬赏
return false;
}
if ($type == 1) {
$score = $data['score_ask_score'];
$count = $data['score_ask_count'];
$info = '问答提问';
} elseif ($type == 2) {
$score = $data['score_reply_score'];
$count = $data['score_reply_count'];
$info = '问答回答';
}
if (empty($data['score_ask_status'])) {
$score = 0;
}
if (!empty($count) && 0 < $count) {
//有次数限制 判断当日次数是是否已用完
$counts = Db::name('users_score')
->where('type', $type)
->where('users_id', $users_id)
->where('score', '>', 0)
->whereTime('add_time', 'today')
->count();
if ($counts >= $count) {
if ((1 == $type && $money == 0) || 2 == $type) {
return false;
} elseif (1 == $type && !empty($money)) {
$score = 0;
}
}
}
$data = [
'ask_id' => $ask_id,
'reply_id' => $reply_id,
'users_id' => $users_id,
'money' => -$money,
'info' => $info,
'score' => !empty($score) ? '+' . $score : $score,
'devote' => $score,
'type' => $type,
'add_time' => getTime(),
'update_time' => getTime(),
];
Db::name('users_score')->insert($data);
//会员表更新
$update = [];
if (!empty($score)) {
$update['scores'] = Db::raw('scores+' . $score);
$update['devote'] = Db::raw('devote+' . $score);
}
if (!empty($money)) {
$update['users_money'] = Db::raw('users_money-' . $money);
}
Db::name('users')->where('users_id', $users_id)->update($update);
}
public function RebackDel($ask_id = 0,$ask = [])
{
$money = $ask['money'];
$users_id = $ask['users_id'];
if ($money > 0) {
//退钱
Db::name('users')->where('users_id', $users_id)->setInc('users_money', $money);
// adminLog($users_id . '删除问题,id:' . $ask_id . ',标题:' . $ask['ask_title']);
}
$count_score = Db::name('users_score')->where(['ask_id' => $ask_id, 'users_id' => $users_id])->sum('score');
Db::name('users_score')->where(['ask_id' => $ask_id, 'users_id' => $users_id])->delete();
$user_info = Db::name('users')->where('users_id', $users_id)->field('users_money,scores')->find();
if (!empty($user_info)) {
//更新
$update['scores'] = ($user_info['scores'] - $count_score) > 0 ? $user_info['scores'] - $count_score : 0;
$update['update_time'] = getTime();
Db::name('users')->where('users_id', $users_id)->update($update);
}
}
// 获取问答设置内容
public function getAskSetting($action = null)
{
$result = [];
$data = tpSetting('ask');
if (!empty($data)) {
$AskQuesSteps = in_array($action, ['add_ask', 'edit_ask']) ? str_replace("\n", "
", $data['ask_ques_steps']) : '';
$result = [
// 一键入群设置
'Qq' => [
'ask_qq' => !empty($data['ask_qq']) ? $data['ask_qq'] : '',
'ask_intro' => !empty($data['ask_intro']) ? $data['ask_intro'] : '',
'ask_qq_link' => !empty($data['ask_qq_link']) ? $data['ask_qq_link'] : '',
],
// 问答提问步骤
'ask_ques_steps' => $AskQuesSteps,
// 积分管理设置的积分名称
'score_name' => getUsersConfigData('score.score_name'),
];
}
return $result;
}
}