Files
duolamaojiazhen/application/api/controller/Moments.php
gitfjn 16d1adacca 后台:
添加服务逻辑的编辑
接口:
添加服务列表
添加服务详情
添加服务点赞、收藏
2025-12-24 23:03:48 +08:00

314 lines
11 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace app\api\controller;
use app\admin\model\Moments as MomentsModel;
use app\common\server\UrlServer;
use think\Db;
use think\facade\Log;
class Moments extends ApiBase
{
//服务业务
public $like_not_need_login = ['index'];
//列表
public function index()
{
$dataArray = MomentsModel::with('getStaff')
->where('state',1)
->order('page_views desc, like desc')
->paginate(10);
$data = [];
if ($dataArray != null){
foreach ($dataArray as $value){
$img = '';
if (!empty($value['goods_image'])) {
$images = explode(',', $value['goods_image']);
$img = trim($images[0]);
$img = UrlServer::getFileUrl($img);
}
// 1. 去除HTML标签
$plain_text = strip_tags($value['content']);
$intro = mb_substr($plain_text, 0, 8, 'UTF-8');
$data[] = [
'id' => $value['id'],
'staff_name' => $value['getStaff']['name'] ?? "",
'cover' => $img,
'goods_id' => $value['goods_id'],
'title' => $value['title'],
'introduction' => $intro,
'page_views' => $value['page_views'],
'like' => $value['like'],
'create_time' => $value['create_time'],
];
}
}
//处理分页数据
$datas = ['list' => $data, 'total' => $dataArray->total()];
return $this->_success('成功',$datas);
}
//详情
public function details()
{
$get = $this->request->get();
if (empty($get['id'])){
return $this->_error('参数错误');
}
$data = MomentsModel::with(['getStaff','getProduct'])
->where('id',$get['id'])
->where('state',1)
->find();
$dataInfo = [];
if ($data != null){
//注册浏览量
$this->pageViews($get['id']);
$img = [];
if (!empty($data['goods_image'])) {
$images = explode(',', $data['goods_image']);
foreach ($images as $value){
$img[] = UrlServer::getFileUrl($value);
}
}
//查询是否点赞、收藏
$is_like = 0;
$is_collection = 0;
if (!empty($this->user_id)) {
$userRecord = Db::name('service_account')
->where('mid', $get['id'])
->where('uid', $this->user_id)
->find();
if ($userRecord) {
$is_like = intval($userRecord['is_like'] ?? 0);
$is_collection = intval($userRecord['is_collection'] ?? 0);
}
}
$dataInfo = [
'id' => $data['id'],
'staff_name' => $data['getStaff']['name'] ?? "",
'img' => $img,
'goods_id' => $data['goods_id'],
'goods_name' => $data['getProduct']['name'] ?? "",
'title' => $data['title'],
'content' => $data['content'],
'page_views' => $data['page_views'],
'like' => $data['like'],
'collection' => $data['collection'] ?? 0,
'is_like' => $is_like,
'is_collection' => $is_collection,
'create_time' => $data['create_time'],
];
}
return $this->_success('成功',$dataInfo);
}
//注册浏览量(使用原子操作解决并发问题)
public function pageViews($id)
{
try {
if (empty($id)){
Log::write('pageViews方法接收到空ID参数', 'error');
return false;
}
// 使用原子操作 setInc 保证并发安全
$result = Db::name('moments')
->where('id', $id)
->setInc('page_views', 1);
return $result != false;
} catch (\Exception $e) {
Log::write('更新浏览量失败: ' . $e->getMessage(), 'error');
return false;
}
}
/**
* 点赞、收藏服务(切换模式:已操作则取消,未操作则添加)
* 使用数据库原子操作解决并发问题
* 参数:
* id: 动态ID必填
* type: 'like' 或 'collection'(必填)
*/
public function like()
{
$post = $this->request->post();
// 参数验证
if (empty($post['id'])) {
return $this->_error('参数错误缺少动态ID');
}
$uid = $this->user_id;
if (empty($post['type']) || !in_array($post['type'], ['like', 'collection'])) {
return $this->_error('参数错误type必须是like或collection');
}
$id = intval($post['id']);
$type = $post['type'];
// 检查动态是否存在
$moment = MomentsModel::where('id', $id)->where('state', 1)->find();
if (empty($moment)) {
return $this->_error('动态不存在或已下架');
}
try {
// 查询用户是否已经操作过
$userRecord = null;
if (!empty($uid)) {
try {
$userRecord = Db::name('service_account')
->where('mid', $id)
->where('uid', $uid)
->find();
} catch (\Exception $e) {
// 表不存在时忽略,继续执行主操作
Log::write('查询用户操作记录失败(表可能不存在): ' . $e->getMessage(), 'error');
}
}
// 根据类型判断当前状态
if ($type == 'like') {
// 判断是否已点赞
$is_liked = false;
if ($userRecord && isset($userRecord['is_like']) && $userRecord['is_like'] == 1) {
$is_liked = true;
}
if ($is_liked) {
// 已点赞,执行取消点赞
$result = Db::name('moments')
->where('id', $id)
->where('like', '>', 0)
->setDec('like', 1);
$msg = '取消点赞成功';
$new_status = 0;
} else {
// 未点赞,执行点赞
$result = Db::name('moments')
->where('id', $id)
->setInc('like', 1);
$msg = '点赞成功';
$new_status = 1;
}
// 记录用户点赞状态(失败不影响主操作)
if ($result !== false && !empty($uid)) {
try {
$this->likeColl($id, $uid, 'like', $new_status);
} catch (\Exception $e) {
// 记录失败不影响主操作成功
Log::write('记录点赞状态失败: ' . $e->getMessage(), 'error');
}
}
} else {
// 收藏操作
// 判断是否已收藏
$is_collected = false;
if ($userRecord && isset($userRecord['is_collection']) && $userRecord['is_collection'] == 1) {
$is_collected = true;
}
if ($is_collected) {
// 已收藏,执行取消收藏
$result = Db::name('moments')
->where('id', $id)
->where('collection', '>', 0)
->setDec('collection', 1);
$msg = '取消收藏成功';
$new_status = 0;
} else {
// 未收藏,执行收藏
$result = Db::name('moments')
->where('id', $id)
->setInc('collection', 1);
$msg = '收藏成功';
$new_status = 1;
}
// 记录用户收藏状态(失败不影响主操作)
if ($result && !empty($uid)) {
try {
$this->likeColl($id, $uid, 'collection', $new_status);
} catch (\Exception $e) {
// 记录失败不影响主操作成功
Log::write('记录收藏状态失败: ' . $e->getMessage(), 'error');
}
}
}
if ($result) {
return $this->_success($msg);
} else {
return $this->_error('操作失败');
}
} catch (\Exception $e) {
Log::write('点赞/收藏操作失败: ' . $e->getMessage(), 'error');
return $this->_success("操作成功");
}
}
/**
* 记录点赞、收藏记录
* @param int $mid 动态ID
* @param int $uid 用户ID
* @param string $type 操作类型:'like' 或 'collection'
* @param int $status 状态1-点赞/收藏0-取消
* @return bool
*/
private function likeColl($mid, $uid, $type, $status)
{
try {
if (empty($mid) || empty($uid)) {
Log::write('likeColl方法参数错误mid=' . $mid . ', uid=' . $uid, 'error');
return false;
}
if (!in_array($type, ['like', 'collection'])) {
Log::write('likeColl方法类型错误' . $type, 'error');
return false;
}
// 查询是否已存在记录
$record = Db::name('service_account')
->where('mid', $mid)
->where('uid', $uid)
->find();
$data = [
'mid' => intval($mid),
'uid' => intval($uid),
'update_time' => date('Y-m-d H:i:s'),
];
// 根据类型设置对应字段
if ($type === 'like') {
$data['is_like'] = intval($status);
} else {
$data['is_collection'] = intval($status);
}
if ($record) {
// 更新记录
$result = Db::name('service_account')
->where('id', $record['id'])
->update($data);
} else {
// 插入新记录
$data['create_time'] = date('Y-m-d H:i:s');
// 如果只操作一个字段另一个字段设为null
if ($type === 'like') {
$data['is_collection'] = null;
} else {
$data['is_like'] = null;
}
$result = Db::name('service_account')->insert($data);
}
return $result !== false;
} catch (\Exception $e) {
Log::write('记录点赞/收藏失败: ' . $e->getMessage(), 'error');
return false;
}
}
}