Files
huangjingfen/pro_v3.5.1/app/controller/api/v1/user/UserSign.php
danaisuiyuan b3a1dabf87 feat(api): add sign required-article endpoint
GET /api/sign/required_article returns one random article from the
"签到广告" article category (status=1, is_del=0, hidden=0). Empty
category or no articles returns null so clients can fall through to
direct sign-in. Powers the pre-sign-in reading gate per
docs/project-shaoyaoju/prd-require.md §6.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 15:47:48 +08:00

174 lines
5.1 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
// +----------------------------------------------------------------------
// | Author: ScottPan Team
// +----------------------------------------------------------------------
namespace app\controller\api\v1\user;
use app\Request;
use app\services\article\ArticleServices;
use app\services\user\member\MemberCardServices;
use app\services\user\UserServices;
use app\services\user\UserSignServices;
use think\annotation\Inject;
/**
* 用户签到
* Class UserSign
* @package app\api\controller\v1\user
*/
class UserSign
{
/**
* @var UserSignServices
*/
#[Inject]
protected UserSignServices $services;
/**
* 签到 配置
* @param Request $request
* @param UserServices $userServices
* @return mixed
* @throws \throwable
*/
public function sign_config(Request $request, UserServices $userServices)
{
$uid = (int)$request->uid();
$signConfig = $this->services->signConfig($uid);
//是否是付费会员
if ($userServices->checkUserIsSvip($uid)) {
//看是否开启签到积分翻倍奖励
/** @var MemberCardServices $memberCardService */
$memberCardService = app()->make(MemberCardServices::class);
$sign_rule_number = $memberCardService->isOpenMemberCardCache('sign');
if ($sign_rule_number) {
foreach ($signConfig['signList'] as &$value) {
$value['point'] = (int)$sign_rule_number * $value['point'];
}
$signConfig['signData']['sign_point'] = (int)$sign_rule_number * $signConfig['signData']['sign_point'];
}
}
return app('json')->successful($signConfig);
}
/**
* 日历数据
* @param Request $request
* @param UserServices $userServices
* @return mixed
* @throws \throwable
*/
public function sign_calendar(Request $request)
{
[$time] = $request->getMore([
['time', '']
], true);
$uid = (int)$request->uid();
$signCalendar = $this->services->getCalendarDate($uid, $time);
return app('json')->successful($signCalendar);
}
/**
* 签到 列表
* @param Request $request
* @return mixed
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function sign_list(Request $request)
{
[$page, $limit] = $request->getMore([
['page', 0],
['limit', 0]
], true);
if (!$limit) return app('json')->successful([]);
$uid = (int)$request->uid();
return app('json')->successful($this->services->getUserSignList($uid));
}
/**
* 签到
* @param Request $request
* @return mixed
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function sign_integral(Request $request)
{
$uid = (int)$request->uid();
$sign = $this->services->sign($uid);
if ($sign) {
return app('json')->successful('签到成功', $sign);
} else {
return app('json')->fail('签到失败');
}
}
/**
* 签到用户信息
* @param Request $request
* @return mixed
*/
public function sign_user(Request $request)
{
[$sign, $integral, $all] = $request->postMore([
['sign', 0],
['integral', 0],
['all', 0],
], true);
$uid = (int)$request->uid();
return app('json')->success($this->services->signUser($uid, $sign, $integral, $all));
}
/**
* 签到列表(年月)
*
* @param Request $request
* @return mixed
*/
public function sign_month(Request $request)
{
$uid = (int)$request->uid();
return app('json')->successful($this->services->getSignMonthList($uid));
}
/**
* 用户设置签到提醒
* @param Request $request
* @param $status
* @return \think\Response
*/
public function sign_remind(Request $request, $status)
{
$uid = (int)$request->uid();
$this->services->setSignRemind($uid, $status);
return app('json')->success('设置成功');
}
/**
* 签到前置阅读:从"签到广告"分类下随机返回一篇文章
* 分类不存在 / 无文章 时返回 null前端跳过门槛直接签到
*/
public function required_article(ArticleServices $articleServices)
{
$article = $articleServices->getRandomByCategoryTitle('签到广告');
if (!$article) {
return app('json')->successful(null);
}
$img = $article['image_input'] ?? '';
if (is_array($img)) {
$img = $img[0] ?? '';
}
return app('json')->successful([
'id' => (int)($article['id'] ?? 0),
'title' => (string)($article['title'] ?? ''),
'image' => (string)$img,
'view_required_seconds' => 10,
]);
}
}