初始化

缺陷:主题配色需要优化整体的同风格
This commit is contained in:
2026-08-14 23:21:21 +08:00
parent 6e2769c528
commit bcf54c2727
152 changed files with 13521 additions and 141 deletions

View File

@@ -17,7 +17,7 @@ class AdminController extends BaseController
$this->service = AdminService::getInstance();
$this->insertField = [ 'phone', 'nick_name', 'password', 'role_id' ];
$this->updateField = [ 'id', 'phone', 'nick_name', 'role_id' ];
$this->notRequest = ['qr_code', 'avatar', 'email', 'status'];
$this->notRequest = ['qr_code', 'avatar', 'email', 'status', 'department_id', 'desc'];
}
/**
@@ -115,7 +115,9 @@ class AdminController extends BaseController
}
/**
* 获取菜单列表
* 获取当前账号的权限码
*
* 码由接口路径推导admin/list admin:list),前端 v-access TableAction auth 用的就是它。
* @Method GET
* @return JsonResponse
* @throws Exception
@@ -123,7 +125,7 @@ class AdminController extends BaseController
public function codes(): JsonResponse
{
return jok(
[],
$this->service->codes(),
'获取成功'
);
}

View File

@@ -0,0 +1,35 @@
<?php
namespace App\Http\Controllers\Api;
use App\BaseApp\BaseController;
use App\Service\business\CardClassService;
use Exception;
use Illuminate\Http\JsonResponse;
/**
* 色卡分类
*/
class CardClassController extends BaseController
{
public function __construct()
{
parent::__construct();
$this->service = CardClassService::getInstance();
$this->insertField = ['name'];
$this->updateField = ['id', 'name'];
$this->notRequest = ['status'];
}
/**
* 启用 / 禁用
* @Method POST
* @throws Exception
*/
public function status(): JsonResponse
{
$this->insertField = ['id', 'status'];
$params = $this->checkRequiredFields(request()->post());
return jok($this->service->status($params['id'], $params['status']), '操作成功');
}
}

View File

@@ -0,0 +1,35 @@
<?php
namespace App\Http\Controllers\Api;
use App\BaseApp\BaseController;
use App\Service\business\CarouselService;
use Exception;
use Illuminate\Http\JsonResponse;
/**
* 小程序轮播图
*/
class CarouselController extends BaseController
{
public function __construct()
{
parent::__construct();
$this->service = CarouselService::getInstance();
$this->insertField = ['url'];
$this->updateField = ['id', 'url'];
$this->notRequest = ['to_path', 'sort', 'status'];
}
/**
* 启用 / 禁用
* @Method POST
* @throws Exception
*/
public function status(): JsonResponse
{
$this->insertField = ['id', 'status'];
$params = $this->checkRequiredFields(request()->post());
return jok($this->service->status($params['id'], $params['status']), '操作成功');
}
}

View File

@@ -0,0 +1,35 @@
<?php
namespace App\Http\Controllers\Api;
use App\BaseApp\BaseController;
use App\Service\business\CatalogueService;
use Exception;
use Illuminate\Http\JsonResponse;
/**
* 商品图册
*/
class CatalogueController extends BaseController
{
public function __construct()
{
parent::__construct();
$this->service = CatalogueService::getInstance();
$this->insertField = ['title', 'category_id', 'cover', 'identifier'];
$this->updateField = ['id', 'title', 'category_id', 'cover', 'identifier'];
$this->notRequest = ['alias', 'pdf', 'price', 'status'];
}
/**
* 启用 / 禁用
* @Method POST
* @throws Exception
*/
public function status(): JsonResponse
{
$this->insertField = ['id', 'status'];
$params = $this->checkRequiredFields(request()->post());
return jok($this->service->status($params['id'], $params['status']), '操作成功');
}
}

View File

@@ -0,0 +1,35 @@
<?php
namespace App\Http\Controllers\Api;
use App\BaseApp\BaseController;
use App\Service\business\CategoryService;
use Exception;
use Illuminate\Http\JsonResponse;
/**
* 商品分类
*/
class CategoryController extends BaseController
{
public function __construct()
{
parent::__construct();
$this->service = CategoryService::getInstance();
$this->insertField = ['name'];
$this->updateField = ['id', 'name'];
$this->notRequest = ['url', 'pid', 'status', 'sort'];
}
/**
* 启用 / 禁用
* @Method POST
* @throws Exception
*/
public function status(): JsonResponse
{
$this->insertField = ['id', 'status'];
$params = $this->checkRequiredFields(request()->post());
return jok($this->service->status($params['id'], $params['status']), '操作成功');
}
}

View File

@@ -0,0 +1,35 @@
<?php
namespace App\Http\Controllers\Api;
use App\BaseApp\BaseController;
use App\Service\business\ColorcardService;
use Exception;
use Illuminate\Http\JsonResponse;
/**
* 色卡
*/
class ColorcardController extends BaseController
{
public function __construct()
{
parent::__construct();
$this->service = ColorcardService::getInstance();
$this->insertField = ['card_class', 'company', 'cover'];
$this->updateField = ['id', 'card_class', 'company'];
$this->notRequest = ['price', 'description', 'cover', 'status'];
}
/**
* 启用 / 禁用
* @Method POST
* @throws Exception
*/
public function status(): JsonResponse
{
$this->insertField = ['id', 'status'];
$params = $this->checkRequiredFields(request()->post());
return jok($this->service->status($params['id'], $params['status']), '操作成功');
}
}

View File

@@ -0,0 +1,35 @@
<?php
namespace App\Http\Controllers\Api;
use App\BaseApp\BaseController;
use App\Service\business\CompanyService;
use Exception;
use Illuminate\Http\JsonResponse;
/**
* 色卡所属公司
*/
class CompanyController extends BaseController
{
public function __construct()
{
parent::__construct();
$this->service = CompanyService::getInstance();
$this->insertField = ['name'];
$this->updateField = ['id', 'name'];
$this->notRequest = ['phone', 'address', 'status'];
}
/**
* 启用 / 禁用
* @Method POST
* @throws Exception
*/
public function status(): JsonResponse
{
$this->insertField = ['id', 'status'];
$params = $this->checkRequiredFields(request()->post());
return jok($this->service->status($params['id'], $params['status']), '操作成功');
}
}

View File

@@ -0,0 +1,47 @@
<?php
namespace App\Http\Controllers\Api;
use App\BaseApp\BaseController;
use App\Service\DepartmentService;
use Exception;
use Illuminate\Http\JsonResponse;
class DepartmentController extends BaseController
{
public function __construct()
{
parent::__construct();
$this->service = DepartmentService::getInstance();
// insertField / updateField 既是必填校验清单,也是入库字段白名单,漏写的字段不会被收进 params
$this->insertField = ['name'];
$this->updateField = ['id', 'name'];
// 这几个允许缺省pid 缺省为顶级status 缺省为正常
$this->notRequest = ['pid', 'desc', 'status', 'color'];
}
/**
* 部门树下拉(表单选上级部门用)
* @Method GET
*/
public function treeOption(): JsonResponse
{
$isSelect = filter_var(request()->get('is_select', false), FILTER_VALIDATE_BOOLEAN);
return jok($this->service->getTreeOption($isSelect), '列表获取成功');
}
/**
* 停用 / 启用部门
* @Method POST
* @throws Exception
*/
public function status(): JsonResponse
{
$id = request()->post('id');
$status = request()->post('status');
if (empty($id) || !in_array((string) $status, ['0', '1'], true)) {
return jerr('参数错误');
}
return jok($this->service->status($id, $status), '操作成功');
}
}

View File

@@ -0,0 +1,38 @@
<?php
namespace App\Http\Controllers\Api;
use App\BaseApp\BaseController;
use App\Service\business\EnterpriseService;
use Exception;
use Illuminate\Http\JsonResponse;
/**
* 企业管理
*/
class EnterpriseController extends BaseController
{
public function __construct()
{
parent::__construct();
$this->service = EnterpriseService::getInstance();
$this->insertField = ['name'];
$this->updateField = ['id', 'name'];
$this->notRequest = [
'logo', 'contact_name', 'phone', 'address',
'tax_no', 'settle_type', 'price_number', 'status', 'remark',
];
}
/**
* 启用 / 禁用
* @Method POST
* @throws Exception
*/
public function status(): JsonResponse
{
$this->insertField = ['id', 'status'];
$params = $this->checkRequiredFields(request()->post());
return jok($this->service->status($params['id'], $params['status']), '操作成功');
}
}

View File

@@ -0,0 +1,35 @@
<?php
namespace App\Http\Controllers\Api;
use App\BaseApp\BaseController;
use App\Service\business\FactoryClassificationService;
use Exception;
use Illuminate\Http\JsonResponse;
/**
* 工厂分类
*/
class FactoryClassificationController extends BaseController
{
public function __construct()
{
parent::__construct();
$this->service = FactoryClassificationService::getInstance();
$this->insertField = ['name'];
$this->updateField = ['id', 'name'];
$this->notRequest = ['status'];
}
/**
* 启用 / 禁用
* @Method POST
* @throws Exception
*/
public function status(): JsonResponse
{
$this->insertField = ['id', 'status'];
$params = $this->checkRequiredFields(request()->post());
return jok($this->service->status($params['id'], $params['status']), '操作成功');
}
}

View File

@@ -0,0 +1,44 @@
<?php
namespace App\Http\Controllers\Api;
use App\BaseApp\BaseController;
use App\Service\business\FactoryImageService;
use Exception;
use Illuminate\Http\JsonResponse;
/**
* 工厂产品图
*/
class FactoryImageController extends BaseController
{
public function __construct()
{
parent::__construct();
$this->service = FactoryImageService::getInstance();
$this->insertField = ['factory', 'url'];
$this->updateField = ['id', 'url'];
$this->notRequest = ['factory', 'status'];
}
/**
* 某工厂的全部产品图(入参 factory
* @Method GET
*/
public function imageList(): JsonResponse
{
return jok($this->service->imageList((int) request()->get('factory', 0)), '列表获取成功');
}
/**
* 启用 / 禁用
* @Method POST
* @throws Exception
*/
public function status(): JsonResponse
{
$this->insertField = ['id', 'status'];
$params = $this->checkRequiredFields(request()->post());
return jok($this->service->status($params['id'], $params['status']), '操作成功');
}
}

View File

@@ -0,0 +1,35 @@
<?php
namespace App\Http\Controllers\Api;
use App\BaseApp\BaseController;
use App\Service\business\FactoryInfoService;
use Exception;
use Illuminate\Http\JsonResponse;
/**
* 工厂管理
*/
class FactoryInfoController extends BaseController
{
public function __construct()
{
parent::__construct();
$this->service = FactoryInfoService::getInstance();
$this->insertField = ['name', 'classification'];
$this->updateField = ['id', 'name', 'classification'];
$this->notRequest = ['phone', 'cover', 'address', 'status'];
}
/**
* 启用 / 禁用
* @Method POST
* @throws Exception
*/
public function status(): JsonResponse
{
$this->insertField = ['id', 'status'];
$params = $this->checkRequiredFields(request()->post());
return jok($this->service->status($params['id'], $params['status']), '操作成功');
}
}

View File

@@ -0,0 +1,22 @@
<?php
namespace App\Http\Controllers\Api;
use App\BaseApp\BaseController;
use App\Service\FileFolderService;
/**
* 素材文件夹(标准 CRUD + 目录树)
*/
class FileFolderController extends BaseController
{
public function __construct()
{
parent::__construct();
$this->service = FileFolderService::getInstance();
$this->insertField = ['name'];
$this->updateField = ['id', 'name'];
// pid = 0 就是根目录sort / status 也允许留空走默认值
$this->notRequest = ['pid', 'sort', 'status'];
}
}

View File

@@ -0,0 +1,53 @@
<?php
namespace App\Http\Controllers\Api;
use App\BaseApp\BaseController;
use App\Service\business\ImageService;
use Exception;
use Illuminate\Http\JsonResponse;
/**
* 商品相册
*/
class ImageController extends BaseController
{
public function __construct()
{
parent::__construct();
$this->service = ImageService::getInstance();
$this->insertField = ['catalogue_id', 'url', 'type'];
$this->updateField = ['id', 'url'];
$this->notRequest = ['catalogue_id', 'type', 'status'];
}
/**
* 渲染图列表(入参 catalogue_id
* @Method GET
*/
public function renderGraph(): JsonResponse
{
return jok($this->service->renderGraph((int) request()->get('catalogue_id', 0)), '列表获取成功');
}
/**
* 实物图列表(入参 catalogue_id
* @Method GET
*/
public function physicalDrawing(): JsonResponse
{
return jok($this->service->physicalDrawing((int) request()->get('catalogue_id', 0)), '列表获取成功');
}
/**
* 启用 / 禁用
* @Method POST
* @throws Exception
*/
public function status(): JsonResponse
{
$this->insertField = ['id', 'status'];
$params = $this->checkRequiredFields(request()->post());
return jok($this->service->status($params['id'], $params['status']), '操作成功');
}
}

View File

@@ -0,0 +1,61 @@
<?php
namespace App\Http\Controllers\Api;
use App\BaseApp\BaseController;
use App\Service\business\ListService;
use Illuminate\Http\JsonResponse;
/**
* 清单管理
*/
class ListController extends BaseController
{
public function __construct()
{
parent::__construct();
$this->service = ListService::getInstance();
$this->insertField = ['name', 'user_id'];
$this->updateField = ['id', 'name'];
$this->notRequest = ['remark', 'enterprise_id'];
}
/**
* 某用户的清单
* @Method GET
*/
public function byUser(): JsonResponse
{
return jok($this->service->byUser((int) request()->get('user_id', 0)));
}
/**
* 清单生成订单
* @Method POST
*/
public function toOrder(): JsonResponse
{
return jok(
$this->service->toOrder((int) request()->post('id', 0), request()->post()),
'订单已生成'
);
}
/**
* 保存清单明细
* @Method POST
*/
public function saveItem(): JsonResponse
{
return jok($this->service->saveItem(request()->post()), '保存成功');
}
/**
* 删除清单明细
* @Method POST
*/
public function deleteItem(): JsonResponse
{
return jok($this->service->deleteItem(request()->post('ids', [])), '删除成功');
}
}

View File

@@ -8,7 +8,11 @@ use Illuminate\Http\JsonResponse;
class LoginController extends BaseController
{
//
/**
* 登录控制器注册在免登录组里,继承来的 CRUD 会变成 /api/list/api/create 这种
* 无需鉴权、指向 LoginService根本没有这些方法的路由必须排除
*/
protected array $exceptRoute = ['list', 'option', 'detail', 'create', 'update', 'delete'];
public function __construct()
{
@@ -54,20 +58,32 @@ class LoginController extends BaseController
);
}
public function logout()
/**
* 退出登录
* @Method POST
* @throws \Exception
*/
public function logout(): JsonResponse
{
return jok(
[],
$this->service->logout(),
'退出成功'
);
}
public function codes()
/**
* 续签 token
*
* 前端拦截器在 401 时调用,此时 token 已过期,所以只能放在免登录组里,
* LoginService::refresh 自己校验签名与 Redis 会话。
* @Method POST
* @throws \Exception
*/
public function refresh(): JsonResponse
{
return jok(
[],
'获取成功'
$this->service->refresh(),
'续签成功'
);
}
}

View File

@@ -0,0 +1,111 @@
<?php
namespace App\Http\Controllers\Api;
use App\BaseApp\BaseController;
use App\Service\common\UtilsService;
use App\Service\MaterialService;
use Exception;
use Illuminate\Http\JsonResponse;
/**
* 素材库
*
* 素材记录只有两个来源:上传接口写入、从 OSS 反向同步补录,
* 所以没有「手工新增」,也不需要下拉选项 —— 把继承来的 create / option 排掉。
*/
class MaterialController extends BaseController
{
protected array $exceptRoute = ['create', 'option'];
public function __construct()
{
parent::__construct();
$this->service = MaterialService::getInstance();
// 只放行素材名与文件夹:对象键、体积、哈希都是同步结果,不接受手工改
$this->updateField = ['id', 'name', 'folder_id'];
$this->notRequest = ['name', 'folder_id'];
}
/**
* 素材概览统计
*
* @Method GET
* @throws Exception
*/
public function stat(): JsonResponse
{
return jok($this->service->stat(), '统计获取成功');
}
/**
* OSS 增量同步对象
*
* @Method POST
* @throws Exception
*/
public function syncFromOss(): JsonResponse
{
$this->insertField = ['oss_config_id'];
$this->notRequest = ['prefix', 'marker', 'limit'];
$params = $this->checkRequiredFields(request()->post());
return jok($this->service->syncFromOss($params), '同步完成');
}
/**
* 全库引用扫描
*
* @Method POST
* @throws Exception
*/
public function scanReferences(): JsonResponse
{
// 表多、正文长时会跑几十秒,先把执行时限和内存放开
cc_set_time_limit();
return jok($this->service->scanReferences(request()->post()), '扫描完成');
}
/**
* 无引用素材清单
*
* @Method GET
* @throws Exception
*/
public function unusedList(): JsonResponse
{
return jok($this->service->unusedList(request()->query()), '列表获取成功');
}
/**
* 回收:删远端对象并软删记录
*
* @Method POST
* @throws Exception
*/
public function reclaim(): JsonResponse
{
$ids = request()->post('ids');
if (empty($ids) || !is_array($ids)) {
UtilsService::getInstance()->notFound('参数错误');
}
return jok($this->service->reclaim($ids), '回收完成');
}
/**
* 批量移动到文件夹
*
* @Method POST
* @throws Exception
*/
public function moveToFolder(): JsonResponse
{
$ids = request()->post('ids');
if (empty($ids) || !is_array($ids)) {
UtilsService::getInstance()->notFound('参数错误');
}
return jok(
$this->service->moveToFolder($ids, (int) request()->post('folder_id', 0)),
'移动成功'
);
}
}

View File

@@ -0,0 +1,79 @@
<?php
namespace App\Http\Controllers\Api;
use App\BaseApp\BaseController;
use App\Service\business\OrderService;
use Illuminate\Http\JsonResponse;
/**
* 订单管理
*/
class OrderController extends BaseController
{
public function __construct()
{
parent::__construct();
$this->service = OrderService::getInstance();
$this->insertField = ['list_id'];
$this->updateField = ['id'];
$this->notRequest = [
'receiver_name', 'receiver_phone', 'receiver_address',
'remark', 'delivery_type',
];
}
/**
* 概览统计
* @Method GET
*/
public function stat(): JsonResponse
{
return jok($this->service->stat());
}
/**
* 某用户的订单
* @Method GET
*/
public function byUser(): JsonResponse
{
return jok($this->service->byUser((int) request()->get('user_id', 0)));
}
/**
* 审核转账凭证
* @Method POST
*/
public function auditPayment(): JsonResponse
{
return jok($this->service->auditPayment(request()->post()), '处理成功');
}
/**
* 发货
* @Method POST
*/
public function ship(): JsonResponse
{
return jok($this->service->ship(request()->post()), '已发货');
}
/**
* 取消订单
* @Method POST
*/
public function cancel(): JsonResponse
{
return jok($this->service->cancel((int) request()->post('id', 0)), '已取消');
}
/**
* 完成订单
* @Method POST
*/
public function complete(): JsonResponse
{
return jok($this->service->complete((int) request()->post('id', 0)), '已完成');
}
}

View File

@@ -0,0 +1,63 @@
<?php
namespace App\Http\Controllers\Api;
use App\BaseApp\BaseController;
use App\Service\business\PriceSheetService;
use Exception;
use Illuminate\Http\JsonResponse;
/**
* 报价单(商品规格)
*/
class PriceSheetController extends BaseController
{
public function __construct()
{
parent::__construct();
$this->service = PriceSheetService::getInstance();
$this->insertField = ['catalogue_id'];
$this->updateField = ['id'];
$this->notRequest = ['specification', 'dimension', 'routine', 'rows', 'status'];
}
/**
* 某商品的全部规格行(报价单抽屉回填用)
* @Method GET
*/
public function rows(): JsonResponse
{
return jok($this->service->rowsOf((int) request()->get('catalogue_id', 0)), '列表获取成功');
}
/**
* 覆盖式保存某商品的全部规格行
* @Method POST
* @throws Exception
*/
public function saveRows(): JsonResponse
{
$this->insertField = ['catalogue_id'];
$this->notRequest = ['rows'];
$this->checkRequiredFields(request()->post());
return jok(
$this->service->saveRows(
(int) request()->post('catalogue_id'),
(array) request()->post('rows', [])
),
'保存成功'
);
}
/**
* 启用 / 禁用
* @Method POST
* @throws Exception
*/
public function status(): JsonResponse
{
$this->insertField = ['id', 'status'];
$params = $this->checkRequiredFields(request()->post());
return jok($this->service->status($params['id'], $params['status']), '操作成功');
}
}

View File

@@ -17,6 +17,7 @@ class RoleController extends BaseController
parent::__construct();
$this->insertField = ['name', 'value', 'desc'];
$this->updateField = ['id', 'name', 'value', 'desc'];
$this->notRequest = ['status', 'color', 'pid'];
$this->service = RoleService::getInstance();
}
@@ -51,4 +52,52 @@ class RoleController extends BaseController
$this->service->saveRoleMenu($roleId, $menuIds)
);
}
/**
* 接口授权树:按控制器分组的全部可授权接口
* @Method GET
*/
public function endpointTree(): JsonResponse
{
return jok($this->service->endpointTree(), '获取成功');
}
/**
* 角色已授权的接口 id
* @Method GET
* @throws Exception
*/
public function getEndpointIdsByRoleIds(): JsonResponse
{
return jok($this->service->getEndpointIdsByRoleId(request()->get('role_id')));
}
/**
* 保存角色接口授权
* @Method POST
* @throws Exception
*/
public function saveRoleEndpoint(): JsonResponse
{
$this->insertField = ['role_id'];
$this->checkRequiredFields(request()->post());
return jok(
$this->service->saveRoleEndpoint(
(int) request()->post('role_id'),
(array) request()->post('endpoint_id', [])
)
);
}
/**
* 启用 / 停用角色
* @Method POST
* @throws Exception
*/
public function status(): JsonResponse
{
$this->insertField = ['id', 'status'];
$params = $this->checkRequiredFields(request()->post());
return jok($this->service->status($params['id'], $params['status']), '操作成功');
}
}

View File

@@ -44,4 +44,19 @@ class UploadController extends BaseController
'上传成功'
);
}
/**
* 文档上传PDF 等)
* @Method POST
* @return JsonResponse
* @throws \Exception
*/
public function file()
{
$file = request()->file('file');
return jok(
$this->service->uploadDocument($file),
'上传成功'
);
}
}

View File

@@ -0,0 +1,46 @@
<?php
namespace App\Http\Controllers\Api;
use App\BaseApp\BaseController;
use App\Service\WxAppConfigService;
use Illuminate\Http\JsonResponse;
/**
* 小程序应用配置
*/
class WxAppController extends BaseController
{
public function __construct()
{
parent::__construct();
$this->service = WxAppConfigService::getInstance();
$this->insertField = ['code', 'name', 'app_id'];
$this->updateField = ['id'];
$this->notRequest = [
'app_secret', 'mch_id', 'mch_key', 'mch_serial_no', 'mch_private_key',
'platform_public_key', 'notify_url', 'template_code', 'remark', 'name', 'app_id',
];
}
/**
* 启用/停用
* @Method POST
*/
public function status(): JsonResponse
{
return jok(
$this->service->status(request()->post('id'), request()->post('status')),
'操作成功'
);
}
/**
* .env 引导创建/更新一条应用壳子(不含 AppSecret
* @Method POST
*/
public function initFromEnv(): JsonResponse
{
return jok($this->service->initFromEnv(), '初始化成功');
}
}

View File

@@ -0,0 +1,91 @@
<?php
namespace App\Http\Controllers\Api;
use App\BaseApp\BaseController;
use App\Service\business\WxTemplateSchemaService;
use App\Service\business\WxTemplateService;
use Illuminate\Http\JsonResponse;
/**
* 小程序装修模板
*/
class WxTemplateController extends BaseController
{
public function __construct()
{
parent::__construct();
$this->service = WxTemplateService::getInstance();
$this->insertField = ['name', 'code'];
$this->updateField = ['id'];
$this->notRequest = [
'preview', 'style_tag', 'tokens', 'layout', 'app_code', 'sort', 'name', 'code',
];
}
/**
* 启用/停用
* @Method POST
*/
public function status(): JsonResponse
{
return jok(
$this->service->status(request()->post('id'), request()->post('status')),
'操作成功'
);
}
/**
* 设为默认
* @Method POST
*/
public function setDefault(): JsonResponse
{
return jok($this->service->setDefault((int) request()->post('id', 0)), '已设为默认');
}
/**
* 导出模板 JSON
* @Method POST
*/
public function export(): JsonResponse
{
return jok($this->service->export((array) request()->post('ids', [])));
}
/**
* 导入模板 JSON
* @Method POST
*/
public function import(): JsonResponse
{
return jok(
$this->service->import((array) request()->post('payload', []), (bool) request()->post('overwrite', false)),
'导入完成'
);
}
/**
* 用内置 20 套预设初始化模板库
* @Method POST
*/
public function initPresets(): JsonResponse
{
return jok(
$this->service->initPresets((bool) request()->post('overwrite', false)),
'初始化完成'
);
}
/**
* 令牌与布局的可选项,前端渲染编辑表单用
* @Method GET
*/
public function schema(): JsonResponse
{
return jok([
'tokens' => WxTemplateSchemaService::TOKEN_SCHEMA,
'layout' => WxTemplateSchemaService::LAYOUT_SCHEMA,
]);
}
}

View File

@@ -0,0 +1,107 @@
<?php
namespace App\Http\Controllers\Api;
use App\BaseApp\BaseController;
use App\Service\business\WxUserService;
use Exception;
use Illuminate\Http\JsonResponse;
/**
* 微信用户管理
*/
class WxUserController extends BaseController
{
/**
* 微信用户只能由小程序授权登录产生,后台没有新建入口
*/
protected array $exceptRoute = ['create'];
public function __construct()
{
parent::__construct();
$this->service = WxUserService::getInstance();
$this->updateField = ['id'];
$this->notRequest = ['nick_name', 'phone', 'enterprise_id', 'show_price', 'price_number', 'is_p'];
}
/**
* 设置 / 取消代理商身份
* @Method POST
* @throws Exception
*/
public function updateUserIsP(): JsonResponse
{
$this->insertField = ['id'];
$this->notRequest = ['is_p'];
$params = $this->checkRequiredFields(request()->post());
return jok(
$this->service->updateUserIsP($params['id'], $params['is_p'] ?? null),
'操作成功'
);
}
/**
* 设置价格倍率
* @Method POST
* @throws Exception
*/
public function updateShowPrice(): JsonResponse
{
$this->insertField = ['id', 'number'];
$this->notRequest = [];
$params = $this->checkRequiredFields(request()->post());
return jok($this->service->updateShowPrice($params['id'], $params['number']), '操作成功');
}
/**
* 单独开关价格可见性
* @Method POST
* @throws Exception
*/
public function updateShowPriceStatus(): JsonResponse
{
$this->insertField = ['id', 'show_price'];
$this->notRequest = [];
$params = $this->checkRequiredFields(request()->post());
return jok($this->service->updateShowPriceStatus($params['id'], $params['show_price']), '操作成功');
}
/**
* 绑定所属企业
* @Method POST
* @throws Exception
*/
public function bindUser(): JsonResponse
{
$this->insertField = ['id', 'enterprise_id'];
$this->notRequest = [];
$params = $this->checkRequiredFields(request()->post());
return jok($this->service->bindUser($params['id'], $params['enterprise_id']), '绑定成功');
}
/**
* 经销商绑定专属装修模板template_code =跟随品牌默认)
* @Method POST
* @throws Exception
*/
public function bindTemplate(): JsonResponse
{
$this->insertField = ['id'];
$this->notRequest = ['template_code'];
$params = $this->checkRequiredFields(request()->post());
return jok(
$this->service->bindTemplate($params['id'], $params['template_code'] ?? ''),
'模板绑定成功'
);
}
/**
* 该代理商名下的下级用户
* @Method GET
*/
public function children(): JsonResponse
{
return jok($this->service->children((int) request()->get('id', 0)), '列表获取成功');
}
}

View File

@@ -0,0 +1,36 @@
<?php
namespace App\Http\Controllers\Wx;
use App\BaseApp\BaseController;
use App\Service\wx\WxAuthService;
use Illuminate\Http\JsonResponse;
/**
* 小程序登录(免鉴权)
*/
class AuthController extends BaseController
{
/**
* 继承的 CRUD 会被 autoRouteRegister 反射成路由,登录组里绝不能白送这些
*/
protected array $exceptRoute = ['list', 'option', 'detail', 'create', 'update', 'delete'];
public function __construct()
{
parent::__construct();
$this->service = WxAuthService::getInstance();
}
/**
* 微信 code 登录
* @Method POST
*/
public function login(): JsonResponse
{
return jok(
$this->service->login(request()->post()),
'登录成功'
);
}
}

View File

@@ -0,0 +1,39 @@
<?php
namespace App\Http\Controllers\Wx;
use App\BaseApp\BaseController;
use App\Service\wx\WxHomeService;
use Illuminate\Http\JsonResponse;
/**
* 小程序首页(免鉴权)
*/
class HomeController extends BaseController
{
protected array $exceptRoute = ['list', 'option', 'detail', 'create', 'update', 'delete'];
public function __construct()
{
parent::__construct();
$this->service = WxHomeService::getInstance();
}
/**
* 首页轮播
* @Method GET
*/
public function carousel(): JsonResponse
{
return jok($this->service->carousel());
}
/**
* 一级分类
* @Method GET
*/
public function categoryList(): JsonResponse
{
return jok($this->service->categoryList((int) request()->get('pid', 0)));
}
}

View File

@@ -0,0 +1,96 @@
<?php
namespace App\Http\Controllers\Wx;
use App\BaseApp\BaseController;
use App\Service\wx\WxListService;
use Illuminate\Http\JsonResponse;
/**
* 小程序清单
*/
class ListController extends BaseController
{
protected array $exceptRoute = ['option'];
public function __construct()
{
parent::__construct();
$this->service = WxListService::getInstance();
}
/**
* 我的清单
* @Method GET
*/
public function list(): JsonResponse
{
return jok($this->service->list());
}
/**
* 清单详情
* @Method GET
*/
public function detail(): JsonResponse
{
return jok($this->service->detail((int) request()->get('id', 0)));
}
/**
* 新建清单
* @Method POST
*/
public function create(): JsonResponse
{
return jok($this->service->create(request()->post()), '创建成功');
}
/**
* 改清单名称与备注
* @Method POST
*/
public function update(): JsonResponse
{
return jok(
$this->service->update((int) request()->post('id', 0), request()->post()),
'保存成功'
);
}
/**
* 删除清单
* @Method POST
*/
public function delete(): JsonResponse
{
return jok($this->service->delete(request()->post('ids', [])), '删除成功');
}
/**
* 删除清单明细
* @Method POST
*/
public function deleteItem(): JsonResponse
{
return jok($this->service->deleteItem(request()->post('ids', [])), '删除成功');
}
/**
* 加入清单
* @Method POST
*/
public function toCart(): JsonResponse
{
return jok($this->service->toCart(request()->post()), '添加成功');
}
/**
* 改明细的规格与数量
* @Method POST
*/
public function updateItem(): JsonResponse
{
return jok($this->service->updateItem(request()->post()), '保存成功');
}
}

View File

@@ -0,0 +1,84 @@
<?php
namespace App\Http\Controllers\Wx;
use App\BaseApp\BaseController;
use App\Service\wx\WxOrderService;
use Illuminate\Http\JsonResponse;
/**
* 小程序订单
*/
class OrderController extends BaseController
{
protected array $exceptRoute = ['option', 'update', 'delete'];
public function __construct()
{
parent::__construct();
$this->service = WxOrderService::getInstance();
}
/**
* 我的订单
* @Method GET
*/
public function list(): JsonResponse
{
return jok($this->service->list());
}
/**
* 订单详情
* @Method GET
*/
public function detail(): JsonResponse
{
return jok($this->service->detail((int) request()->get('id', 0)));
}
/**
* 清单转订单
* @Method POST
*/
public function create(): JsonResponse
{
return jok($this->service->createFromList(request()->post()), '下单成功');
}
/**
* 上传转账凭证
* @Method POST
*/
public function voucher(): JsonResponse
{
return jok($this->service->submitVoucher(request()->post()), '已提交,等待审核');
}
/**
* 调起微信支付
* @Method POST
*/
public function wechatPay(): JsonResponse
{
return jok($this->service->wechatPay(request()->post()));
}
/**
* 取消订单
* @Method POST
*/
public function cancel(): JsonResponse
{
return jok($this->service->cancel((int) request()->post('id', 0)), '已取消');
}
/**
* 确认收货
* @Method POST
*/
public function complete(): JsonResponse
{
return jok($this->service->complete((int) request()->post('id', 0)), '已完成');
}
}

View File

@@ -0,0 +1,52 @@
<?php
namespace App\Http\Controllers\Wx;
use App\BaseApp\BaseController;
use App\Service\wx\WxHomeService;
use App\Service\wx\WxProductService;
use Illuminate\Http\JsonResponse;
/**
* 小程序商品
*/
class ProductController extends BaseController
{
protected array $exceptRoute = ['option', 'create', 'update', 'delete'];
public function __construct()
{
parent::__construct();
$this->service = WxProductService::getInstance();
}
/**
* 商品列表
* @Method GET
*/
public function list(): JsonResponse
{
return jok($this->service->list());
}
/**
* 商品详情p_user_id 为代理商分享来源
* @Method GET
*/
public function detail(): JsonResponse
{
return jok($this->service->detail(
(int) request()->get('id', 0),
(int) request()->get('p_user_id', 0)
));
}
/**
* 按父级取分类
* @Method GET
*/
public function categoryListByPid(): JsonResponse
{
return jok(WxHomeService::getInstance()->categoryList((int) request()->get('pid', 0)));
}
}

View File

@@ -0,0 +1,56 @@
<?php
namespace App\Http\Controllers\Wx;
use App\BaseApp\BaseController;
use App\Service\wx\WxPayService;
use App\Service\wx\WxThemeService;
use Illuminate\Http\JsonResponse;
/**
* 小程序主题下发与支付回调(均免鉴权)
*/
class ThemeController extends BaseController
{
protected array $exceptRoute = ['list', 'option', 'detail', 'create', 'update', 'delete'];
public function __construct()
{
parent::__construct();
$this->service = WxThemeService::getInstance();
}
/**
* 当前主题
* @Method GET
*/
public function theme(): JsonResponse
{
return jok($this->service->current((string) request()->get('code', '')));
}
/**
* 可选风格
* @Method GET
*/
public function themeGallery(): JsonResponse
{
return jok($this->service->gallery());
}
/**
* 微信支付回调
*
* 必须用原始报文验签:先 json_decode encode 回去,字节顺序变了签名就对不上。
* @Method POST
*/
public function payNotify(): JsonResponse
{
$headers = [];
foreach (['wechatpay-timestamp', 'wechatpay-nonce', 'wechatpay-signature', 'wechatpay-serial'] as $key) {
$headers[$key] = (string) request()->header($key, '');
}
$result = WxPayService::getInstance()->handleNotify($headers, request()->getContent());
return response()->json($result);
}
}

View File

@@ -0,0 +1,51 @@
<?php
namespace App\Http\Controllers\Wx;
use App\BaseApp\BaseController;
use App\Service\wx\WxUserCenterService;
use Illuminate\Http\JsonResponse;
/**
* 小程序「我的」
*/
class UserController extends BaseController
{
protected array $exceptRoute = ['list', 'option', 'detail', 'create', 'update', 'delete'];
public function __construct()
{
parent::__construct();
$this->service = WxUserCenterService::getInstance();
}
/**
* 我的信息
* @Method GET
*/
public function myInfo(): JsonResponse
{
return jok($this->service->myInfo());
}
/**
* 绑定手机号
* @Method POST
*/
public function bandPhone(): JsonResponse
{
return jok($this->service->bandPhone(request()->post()), '绑定成功');
}
/**
* 修改昵称
* @Method POST
*/
public function updateNickName(): JsonResponse
{
return jok(
$this->service->updateNickName((string) request()->post('nick_name', '')),
'保存成功'
);
}
}

View File

@@ -0,0 +1,37 @@
<?php
namespace App\Http\Controllers\Wx;
use App\BaseApp\BaseController;
use App\Service\wx\WxUploadService;
use Illuminate\Http\JsonResponse;
/**
* 小程序上传(转账凭证等)。
*
* nl.wx 中间件鉴权(小程序登录态),路径 wx/upload/image。
* 仅暴露 image 方法,避免反射注册把 BaseController create/update/delete 挂成路由。
*/
class WxUploadController extends BaseController
{
protected array $exceptRoute = ['option', 'create', 'update', 'delete'];
public function __construct()
{
parent::__construct();
$this->service = WxUploadService::getInstance();
}
/**
* 图片上传(转账凭证)
* @Method POST
*/
public function image(): JsonResponse
{
$file = request()->file('file');
return jok(
$this->service->uploadImage($file),
'上传成功'
);
}
}