Browse Source

feat(admin): 新增套餐管理功能

- 添加套餐模型、控制器、服务层和验证规则
- 实现套餐的增删改查及列表展示接口
- 配置权限控制和路由规则
- 提供下拉数据接口用于前端选择框
- 完善事务处理和异常捕获机制
master
zhangf@suq.cn 2 days ago
parent
commit
a578f9d6c9
  1. 67
      app/controller/admin/PackageController.php
  2. 15
      app/dao/admin/PackageDao.php
  3. 33
      app/model/admin/Package.php
  4. 13
      app/route/admin.php
  5. 119
      app/service/admin/PackageService.php
  6. 36
      app/validate/PackageValidate.php

67
app/controller/admin/PackageController.php

@ -0,0 +1,67 @@
<?php
namespace app\controller\admin;
use app\service\admin\PackageService;
use app\validate\PackageValidate;
use plugin\piadmin\app\utils\ArrayUtils;
use support\Response;
class PackageController
{
public function save(PackageService $service): Response
{
$params = requestOnly([
'type' => 1,
'name' => '',
'price' => '',
'level' => '',
'point' => 0,
'status' => 1
]);
validate(PackageValidate::class)->check($params, 'save');
return success($service->saveData($params));
}
public function update(PackageService $service): Response
{
$params = requestOnly([
'id' => '',
'type' => 1,
'name' => '',
'price' => '',
'level' => '',
'point' => 0,
'status' => 1
]);
validate(PackageValidate::class)->check($params, 'update');
return success($service->updateData(ArrayUtils::filterNotEmpty($params)));
}
public function index(PackageService $service): Response
{
$params = requestOnly([
'name' => '',
'type' => '',
'begin_time' => '',
'end_time' => ''
]);
return success($service->listData($params));
}
public function read(PackageService $service): Response
{
$id = input('id');
return success($service->readData($id));
}
public function delete(PackageService $service): Response
{
$ids = input('ids');
return success($service->deleteData($ids));
}
public function pureIndex(PackageService $service)
{
return success($service->selectData());
}
}

15
app/dao/admin/PackageDao.php

@ -0,0 +1,15 @@
<?php
namespace app\dao\admin;
use app\model\admin\Package;
use plugin\piadmin\app\base\BaseDao;
class PackageDao extends BaseDao
{
protected function setModel(): string
{
return Package::class;
}
}

33
app/model/admin/Package.php

@ -0,0 +1,33 @@
<?php
namespace app\model\admin;
use plugin\piadmin\app\base\BaseModel;
/**
* 套餐模型
*/
class Package extends BaseModel
{
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'geo_package';
/**
* The primary key associated with the table.
*
* @var string
*/
protected $primaryKey = 'id';
/**
* Indicates if the model should be timestamped.
*
* @var bool
*/
public $timestamps = true;
}

13
app/route/admin.php

@ -3,6 +3,7 @@
use app\controller\admin\ApiController; use app\controller\admin\ApiController;
use app\controller\admin\OnlineMediasConfigController; use app\controller\admin\OnlineMediasConfigController;
use app\controller\admin\OnlineMediasController; use app\controller\admin\OnlineMediasController;
use app\controller\admin\PackageController;
use plugin\piadmin\app\middleware\AdminAuthorizationMiddleware; use plugin\piadmin\app\middleware\AdminAuthorizationMiddleware;
use plugin\piadmin\app\middleware\PermissionsMiddleware; use plugin\piadmin\app\middleware\PermissionsMiddleware;
use Webman\Route; use Webman\Route;
@ -38,7 +39,17 @@ Route::group('/service/v1', function () {
Route::group('/medias', function () { Route::group('/medias', function () {
//网媒 //网媒
Route::get('/online', [OnlineMediasController::class, 'index']); Route::get('/online', [OnlineMediasController::class, 'index']);
//自媒体
});
//套餐
Route::group('/package', function () {
Route::post('/save', [PackageController::class, 'save'])->setParams(['perm' => ['packageSave']]);
Route::post('/update', [PackageController::class, 'update'])->setParams(['perm' => ['packageUpdate']]);
Route::get('/index', [PackageController::class, 'index'])->setParams(['perm' => ['packageIndex']]);
Route::get('/read', [PackageController::class, 'read'])->setParams(['perm' => ['packageRead']]);
Route::post('/delete', [PackageController::class, 'delete'])->setParams(['perm' => ['packageDelete']]);
//下拉数据
Route::get('/pure/index', [PackageController::class, 'pureIndex'])->setParams(['perm' => 'packageIndex']);
}); });
})->middleware([ })->middleware([

119
app/service/admin/PackageService.php

@ -0,0 +1,119 @@
<?php
namespace app\service\admin;
use app\dao\admin\PackageDao;
use plugin\piadmin\app\base\BaseService;
use plugin\piadmin\app\exception\ApiException;
use plugin\piadmin\app\utils\RequestUtils;
use support\think\Db;
class PackageService extends BaseService
{
protected $dao;
public function __construct(PackageDao $dao)
{
$this->dao = $dao;
}
/**
* 保存信息
* @param array $params
* @return array
*/
public function saveData(array $params): array
{
Db::startTrans();
try {
$data = $this->dao->save($params);
Db::commit();
} catch (\Exception $exception) {
Db::rollback();
throw new ApiException($exception->getMessage());
}
return $data->toArray();
}
/**
* 修改信息
* @param array $params
* @return array
*/
public function updateData(array $params): array
{
// 落库
Db::startTrans();
try {
$this->dao->update(['id' => $params['id']], $params);
Db::commit();
} catch (\Exception $exception) {
Db::rollback();
throw new ApiException($exception->getMessage());
}
return $params;
}
/**
* 获取列表
* @param array $params
* @return array
*/
public function listData(array $params): array
{
[$page, $limit] = RequestUtils::getPageParameter();
[$sortRule, $sortField] = RequestUtils::getSortParameter();
$query = [
'delete_time' => 0
];
if (isNotBlank($params['name'])) {
$query[] = ['name', 'like', '%' . $params['name'] . '%'];
}
$list = $this->dao->getList($query, '*', $page, $limit, "$sortField $sortRule");
$count = $this->dao->getCount($query);
return compact('list', 'count');
}
/**
* 获取信息
* @param mixed $id
* @return array
*/
public function readData(mixed $id): array
{
$package = $this->dao->get(['id' => $id]);
if (empty($package)) {
throw new ApiException('数据不存在');
}
return $package->toArray();
}
/**
* 删除信息
* @param mixed $id
* @return array
*/
public function deleteData(array $ids): array
{
// 落库
Db::startTrans();
try {
$this->dao->update([['id', 'in', $ids]], ['delete_time' => time()]);
Db::commit();
} catch (\Exception $exception) {
Db::rollback();
throw new ApiException($exception->getMessage());
}
return ['id' => $ids];
}
public function selectData()
{
$query = [
'delete_time' => 0
];
$list = $this->dao->getList($query, '*', 0, 0, 'id DESC');
return $list;
}
}

36
app/validate/PackageValidate.php

@ -0,0 +1,36 @@
<?php
namespace app\validate;
use plugin\piadmin\app\base\BaseValidate;
class PackageValidate extends BaseValidate
{
protected $group = [
'save' => [
'name' => 'require',
'price' => 'require|number',
'level' => 'require|number',
'point' => 'require',
'status' => 'require'
],
'update' => [
'id' => 'require',
'name' => 'require',
'price' => 'require|number',
'level' => 'require|number',
'point' => 'require',
'status' => 'require'
],
];
protected $message = [
'id.require' => 'ID不能为空',
'name.require' => '套餐名称不能为空',
'price.require' => '价格不能为空',
'price.number' => '价格只能为数字',
'level.require' => '等级不能为空',
'level.number' => '等级只能为数字',
'point' => '可得点数不能为空',
'status' => '状态不能为空'
];
}
Loading…
Cancel
Save