feat(zy): 添加俱乐部功能和用户消息功能

- 新增俱乐部相关接口和功能,包括创建俱乐部、申请加入俱乐部、邀请加入俱乐部等
- 添加用户消息功能,包括发送消息、查看消息等
- 优化了部分代码结构,提高了可维护性
- 更新了文档,添加了新的接口说明
This commit is contained in:
2025-05-04 11:11:44 +08:00
parent 207e6b8a5d
commit 98eda4e5ff
23 changed files with 544 additions and 126 deletions

View File

@@ -0,0 +1,118 @@
<?php
namespace addons\shopro\controller\zy;
use think\Db;
use think\Cache;
use think\Exception;
use think\exception\PDOException;
use addons\shopro\library\RedisCache;
use think\exception\ValidateException;
use addons\shopro\service\order\OrderCreate;
class Activity extends Base
{
protected $noNeedLogin = ['test'];
public function __construct()
{
$this->model = new \app\admin\model\zy\game\Activity;
parent::__construct();
}
public function index()
{
$params = $this->request->param();
$model = $this->model;
if (isset($params['name'])) {
$model->where('name', 'like', '%' . $params['name'] . '%');
}
if (isset($params['club_id'])) {
$model->where('club_id', $params['club_id']);
}
if (isset($params['week'])) {
$model->where('week', $params['week']);
}
if (isset($params['pid'])) {
$model->where('pid', $params['pid']);
} else {
$model->where('pid', 0);
}
$res = $model->select();
foreach ($res as &$v) {
$v['public_time'] = json_decode($v['public_time'] ?? '[]', true);
$v['join_start_time'] = json_decode($v['join_start_time'] ?? '[]', true);
$v['join_end_time'] = json_decode($v['join_end_time'] ?? '[]', true);
$v['quit_time'] = json_decode($v['quit_time'] ?? '[]', true);
$v['cost'] = json_decode($v['cost'] ?? '[]', true);
$v['referee'] = explode(',', $v['referee']);
}
$this->success('Success', $res);
}
public function view()
{
$model = $this->model->get($this->request->param('id'));
if (empty($model)) {
$this->error(__('No rows were found'));
}
$model['public_time'] = json_decode($model['public_time'] ?? '[]', true);
$model['join_start_time'] = json_decode($model['join_start_time'] ?? '[]', true);
$model['join_end_time'] = json_decode($model['join_end_time'] ?? '[]', true);
$model['quit_time'] = json_decode($model['quit_time'] ?? '[]', true);
$model['cost'] = json_decode($model['cost'] ?? '[]', true);
$model['referee'] = explode(',', $model['referee']);
$this->success('Success', $model);
}
// 启动周期性活动创建比赛任务
public function test()
{
if (!\think\Cache::has('addons\shopro\job\Test@zy')) {
$res = \think\Queue::push('\addons\shopro\job\Test@zy', time(), 'shopro');
\think\Cache::set('addons\shopro\job\Test@zy', $res);
$this->success('Success', $res);
}
$this->success('Success', '任务已存在');
}
// 比赛报名
public function gameJoin()
{
Db::startTrans();
try {
$params = $this->request->param();
$game = \app\admin\model\zy\game\Game::where('id', $params['act_id'] ?? NULL)
->where('date', $params['date'] ?? NULL)->find();
if (empty($game)) {
$this->error(__('No rows were found'));
}
$this->svalidate($params, ".create");
$orderCreate = new OrderCreate($params);
$result = $orderCreate->calc('create');
$order = $orderCreate->create($result);
$join = new \app\admin\model\zy\game\GameJoin;
$join->allowField(true)->save([
'act_id' => $game['act_id'],
'game_id' => $game['id'],
'user_id' => $this->auth->id,
'orer_id' => $order['order_sn'],
'status' => 1,
'users' => json_encode($params['users'] ?? [])
]);
Db::commit();
} catch (ValidateException | PDOException | Exception $e) {
Db::rollback();
$this->error($e->getMessage(), $e);
}
$this->success('Success', $join);
}
}

View File

@@ -10,7 +10,18 @@ use think\exception\ValidateException;
class Base extends Common
{
protected $noNeedLogin = [];
protected $noNeedRight = ['*'];
protected $model;
protected $user;
public function _initialize()
{
parent::_initialize();
$this->user = auth_user();
}
public function index()
{
@@ -21,7 +32,7 @@ class Base extends Common
$res = $this->model->select();
$this->success('获取成功', $res);
$this->success('Success', $res);
}
public function add()
@@ -39,7 +50,7 @@ class Base extends Common
if ($result === false) {
$this->error(__('No rows were inserted'));
}
$this->success();
$this->success('Success');
}
public function update()
@@ -61,7 +72,7 @@ class Base extends Common
if ($result === false) {
$this->error(__('No rows were inserted'));
}
$this->success();
$this->success('Success');
}
public function view()
@@ -70,6 +81,6 @@ class Base extends Common
if (empty($model)) {
$this->error(__('No rows were found'));
}
$this->success($model);
$this->success('Success', $model);
}
}

View File

@@ -2,14 +2,18 @@
namespace addons\shopro\controller\zy;
use think\Db;
use think\Exception;
use app\admin\model\User;
use app\admin\model\zy\Menber;
use think\exception\PDOException;
use app\admin\model\zy\link\Apply;
use app\admin\model\zy\link\Message;
use app\admin\model\zy\game\Activity;
use think\exception\ValidateException;
class Club extends Base
{
// protected $noNeedLogin = ['index'];
protected $noNeedLogin = ['*'];
protected $noNeedRight = ['*'];
public function __construct()
{
$this->model = new \app\admin\model\zy\Club;
@@ -25,6 +29,223 @@ class Club extends Base
}
$res = $model->select();
$this->success('获取成功', $res);
$this->success('Success', $res);
}
public function add()
{
$result = false;
$params = $this->request->param();
Db::startTrans();
try {
$params['president'] = $this->user->id;
$result = $this->model->allowField(true)->save($params);
$menber = new Menber;
$menber->allowField(true)->save([
'club_id' => $this->model->id,
'user_id' => $this->user->id,
'role' => 3
]);
Db::commit();
} catch (ValidateException | PDOException | Exception $e) {
Db::rollback();
$this->error($e->getMessage());
}
if ($result === false) {
$this->error(__('No rows were inserted'));
}
$this->success('Success', $result);
}
// 获取俱乐部成员
public function menber()
{
$params = $this->request->param();
$query = Db::table(Menber::$tableName)->alias('m')
->join([User::$tableName => 'u'], 'u.id = m.user_id')
->field('m.*,u.avatar,u.gender,u.nickname');
if (empty($params['id'])) {
return $this->error('参数错误');
}
$query->where('club_id', $params['id']);
if (isset($params['role'])) {
$query->where('role', 'IN', explode(',', $params['role']));
} else {
$query->where('role', '>', 0);
}
$res = $query->select();
$this->success('Success', $res);
}
// 获取俱乐部活动
public function activity()
{
$params = $this->request->param();
$query = Db::table(Activity::$tableName)
->where('pid', 0) //主活动
->field('');
if (isset($params['club_id'])) {
$query->where('club_id', $params['club_id']);
}
if (isset($params['week'])) {
$query->where('week', $params['week']);
}
$res = $query->select();
$this->success('Success', $res);
}
// 申请加入俱乐部
public function apply()
{
$params = $this->request->param();
$club = $this->model->get($params['club_id']);
if (empty($club)) {
return $this->error('俱乐部不存在');
}
if ($club['join_type'] > 1) {
$this->error('该俱乐部不允许申请');
}
if (!empty(Menber::get(['club_id' => $params['club_id'], 'user_id' => $this->user->id]))) {
$this->error('您已经是俱乐部成员,无需重复申请');
}
if ($club['join_type'] == 0) {
(new Menber)->allowField(true)->save([
'club_id' => $params['club_id'],
'user_id' => $this->user->id,
'role' => 1
]);
$this->success('加入成功');
}
(new Apply)->allowField(true)->save([ // 记录申请
'type' => 1,
'user_id' => $this->user->id,
'target_id' => $params['club_id'],
'content' => json_encode(['reason' => $params['reason'] ?? '']),
'reason' => $params['reason'],
'status' => 1
]);
(new Message())->allowField(true)->save([ // 消息通知
'type' => 3,
'name' => $club->name,
'avatar' => $club->logo,
'from_id' => $this->user->id,
'target_id' => $params['club_id'],
'content' => json_encode([
'topic' => '俱乐部加入申请',
'俱乐部名称' => $club->name,
'申请人' => $this->user->nickname,
'申请时间' => date('Y-m-d H:i:s'),
'reason' => $params['reason'] ?? ''
])
]);
$this->success('已申请,请等候审核');
}
//join_type 0:'开放加入,无需审核',1:'开放申请,审核加入',2:'会员邀请,无需审核',3:'会员邀请,审核加入',4:'仅管理员邀请,无需审核'
// 邀请加入俱乐部
public function invite()
{
$params = $this->request->param();
$club = $this->model->get($params['club_id']);
if (empty($club)) {
return $this->error('俱乐部不存在');
}
$menber = Menber::where('club_id', $params['club_id'])
->where('user_id', $this->user->id)
->where('role', '>', 0)->find();
if (empty($menber)) {
$this->error('您无权邀请加入俱乐部');
}
$user = User::get($params['user_id']);
if (empty($user)) {
return $this->error('用户不存在');
}
if ($menber['role'] > 1 || $club['join_type'] == 0 || $club['join_type'] == 2) { // 管理员或者开放加入
(new Menber)->allowField(true)->save([
'club_id' => $club->id,
'user_id' => $user->id,
'role' => 1
]);
$this->success('邀请加入成功');
}
(new Apply)->allowField(true)->save([ // 记录申请
'type' => 1,
'user_id' => $user->id,
'target_id' => $club->id,
'content' => json_encode(['reason' => $params['reason'] ?? '']),
'reason' => $params['reason'],
'status' => 1
]);
(new Message())->allowField(true)->save([ // 消息通知
'type' => 3,
'name' => $club->name,
'avatar' => $club->logo,
'from_id' => $this->user->id,
'target_id' => $params['club_id'],
'content' => json_encode([
'topic' => '俱乐部加入申请',
'俱乐部名称' => $club->name,
'申请人' => $this->user->nickname,
'申请时间' => date('Y-m-d H:i:s'),
'reason' => $params['reason'] ?? ''
])
]);
$this->success('已邀请,请等候审核');
}
// 获取申请列表
public function applyList()
{
$params = $this->request->param();
$club = $this->model->get($params['club_id']);
if (empty($club)) {
return $this->error('俱乐部不存在');
}
$menber = Menber::where('club_id', $params['club_id'])
->where('user_id', $this->user->id)
->where('role', '>', 1)->find();
if (empty($menber)) {
$this->error('您无权处理申请');
}
$query = Apply::where('type', 1)->where('target_id', $params['club_id']);
if (isset($params['status'])) {
$query->where('status', $params['status']);
}
$applyList = $query->select();
$this->success('Success', $applyList);
}
// 处理申请
public function handle()
{
$params = $this->request->param();
$apply = Apply::get($params['apply_id']);
$menber = Menber::where('club_id', $apply['target_id'])
->where('user_id', $this->user->id)
->where('role', '>', 1)->find();
if (empty($menber)) {
$this->error('您无权处理申请');
}
if (empty($apply)) {
return $this->error('申请记录不存在');
}
if ($apply['status'] != 1) {
return $this->error('该申请已处理');
}
if ($params['status'] == 2) {
(new Menber)->allowField(true)->save([
'club_id' => $apply['target_id'],
'user_id' => $apply['user_id'],
'role' => 1
]);
}
$apply->save([
'status' => $params['status'],
'reply' => $params['reply'] ?? ''
]);
$this->success('处理成功');
}
}

View File

@@ -0,0 +1,60 @@
<?php
namespace addons\shopro\controller\zy;
class Game extends Base
{
public function __construct()
{
$this->model = new \app\admin\model\zy\game\Game;
parent::__construct();
}
public function index()
{
$params = $this->request->param();
$model = $this->model;
if (isset($params['name'])) {
$model->where('name', 'like', '%' . $params['name'] . '%');
}
if (isset($params['club_id'])) {
$model->where('club_id', $params['club_id']);
}
if (isset($params['week'])) {
$model->where('week', $params['week']);
}
if (isset($params['pid'])) {
$model->where('pid', $params['pid']);
} else {
$model->where('pid', 0);
}
if (isset($params['public_time'])) {
$model->where('public_time', $params['public_time']);
} else {
$model->where('public_time', '<=', date('Y-m-d H:i:s'));
}
$res = $model->select();
foreach ($res as &$v) {
$v['cost'] = json_decode($v['cost'] ?? '[]', true);
$v['referee'] = explode(',', $v['referee']);
}
$this->success('Success', $res);
}
public function view()
{
$model = $this->model->get($this->request->param('id'));
if (empty($model)) {
$this->error(__('No rows were found'));
}
$model['cost'] = json_decode($model['cost'] ?? '[]', true);
$model['referee'] = explode(',', $model['referee']);
$this->success('Success', $model);
}
}

View File

@@ -7,10 +7,6 @@ namespace addons\shopro\controller\zy;
class Gym extends Base
{
// protected $noNeedLogin = ['index'];
protected $noNeedLogin = ['*'];
protected $noNeedRight = ['*'];
public function __construct()
{
$this->model = new \app\admin\model\zy\Stadium;
@@ -27,6 +23,6 @@ class Gym extends Base
$res = $model->select();
$this->success('获取成功', $res);
$this->success('Success', $res);
}
}

View File

@@ -7,11 +7,7 @@ use addons\shopro\controller\Common;
class Tags extends Common
{
// protected $noNeedLogin = ['index'];
protected $noNeedLogin = ['*'];
protected $noNeedRight = ['*'];
public function index()
{
$params = $this->request->param();
@@ -24,6 +20,6 @@ class Tags extends Common
}
$res = $model->select();
$this->success('获取成功', $res);
$this->success('Success', $res);
}
}