批量更新租户规则
This commit is contained in:
@@ -0,0 +1,132 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\admin\controller\Cms\Analytics;
|
||||
|
||||
use app\admin\BaseController;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\response\Json;
|
||||
use think\db\exception\DbException;
|
||||
use app\model\Cms\Articles;
|
||||
use app\model\Cms\ArticlesCategory;
|
||||
use app\model\System\AdminUser;
|
||||
|
||||
class AnalyticsController extends BaseController
|
||||
{
|
||||
/**
|
||||
* 内容统计
|
||||
* 包含:总发布量、本月新增、总点赞量、总访问量(均与昨日对比)、热门内容top5
|
||||
* @return Json
|
||||
*/
|
||||
public function getContentStats()
|
||||
{
|
||||
try {
|
||||
$yesterday = date('Y-m-d', strtotime('-1 day'));
|
||||
$monthStart = date('Y-m-01');
|
||||
$monthEnd = date('Y-m-t 23:59:59');
|
||||
|
||||
// 总发布量
|
||||
$totalArticles = Articles::where('delete_time', null)
|
||||
->where('tid', $this->getTenantId())
|
||||
->where('status', 2)
|
||||
->count();
|
||||
|
||||
// 昨日新增发布
|
||||
$yesterdayArticles = Articles::where('delete_time', null)
|
||||
->where('tid', $this->getTenantId())
|
||||
->where('status', 2)
|
||||
->where('publish_date', '>=', $yesterday . ' 00:00:00')
|
||||
->where('publish_date', '<=', $yesterday . ' 23:59:59')
|
||||
->count();
|
||||
|
||||
// 本月新增发布
|
||||
$monthNewArticles = Articles::where('delete_time', null)
|
||||
->where('tid', $this->getTenantId())
|
||||
->where('status', 2)
|
||||
->where('publish_date', '>=', $monthStart . ' 00:00:00')
|
||||
->where('publish_date', '<=', $monthEnd)
|
||||
->count();
|
||||
|
||||
// 总点赞量
|
||||
$totalLikes = Articles::where('delete_time', null)
|
||||
->where('tid', $this->getTenantId())
|
||||
->where('status', 2)
|
||||
->sum('likes');
|
||||
|
||||
// 总访问量
|
||||
$totalViews = Articles::where('delete_time', null)
|
||||
->where('tid', $this->getTenantId())
|
||||
->where('status', 2)
|
||||
->sum('views');
|
||||
|
||||
// 热门内容TOP5
|
||||
$hotArticles = Articles::where('delete_time', null)
|
||||
->where('tid', $this->getTenantId())
|
||||
->where('status', 2)
|
||||
->order('views', 'desc')
|
||||
->limit(5)
|
||||
->withAttr('cate', function ($value) {
|
||||
return ArticlesCategory::where('id', $value)->value('name') ?? '未分类';
|
||||
})
|
||||
->field('id,title,cate,views,likes,publish_date,status')
|
||||
->select();
|
||||
|
||||
$stats = [
|
||||
'total_articles' => $totalArticles,
|
||||
'yesterday_articles' => $yesterdayArticles,
|
||||
'month_articles' => $monthNewArticles,
|
||||
'total_likes' => (int)$totalLikes,
|
||||
'total_views' => (int)$totalViews,
|
||||
'hot_articles' => $hotArticles->toArray()
|
||||
];
|
||||
|
||||
$this->logSuccess('内容统计', '获取内容统计', ['data' => $stats]);
|
||||
return json([
|
||||
'code' => 200,
|
||||
'msg' => '获取成功',
|
||||
'data' => $stats
|
||||
]);
|
||||
} catch (DbException $e) {
|
||||
$this->logFail('内容统计', '获取内容统计', $e->getMessage());
|
||||
return json([
|
||||
'code' => 500,
|
||||
'msg' => '获取失败:' . $e->getMessage(),
|
||||
'data' => []
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户统计
|
||||
* @return Json
|
||||
*/
|
||||
public function getUserStats()
|
||||
{
|
||||
try {
|
||||
$stats = [
|
||||
'total_users' => AdminUser::where('delete_time', null)
|
||||
->where('tid', $this->getTenantId())
|
||||
->count(),
|
||||
];
|
||||
// 记录操作日志
|
||||
$this->logSuccess('用户统计', '获取用户统计', ['data' => $stats]);
|
||||
return json([
|
||||
'code' => 200,
|
||||
'msg' => '获取成功',
|
||||
'data' => $stats
|
||||
]);
|
||||
} catch (DbException $e) {
|
||||
// 记录失败日志
|
||||
$this->logFail('用户统计', '获取用户统计', $e->getMessage());
|
||||
return json([
|
||||
'code' => 500,
|
||||
'msg' => '获取失败:' . $e->getMessage(),
|
||||
'data' => []
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -11,6 +11,7 @@ use think\facade\Session;
|
||||
use think\response\Json;
|
||||
use think\db\exception\DbException;
|
||||
use app\model\Cms\Articles;
|
||||
use app\model\System\AdminUser;
|
||||
|
||||
class ArticleController extends BaseController
|
||||
{
|
||||
@@ -22,18 +23,20 @@ class ArticleController extends BaseController
|
||||
* @param int $pageSize 每页条数(默认10)
|
||||
* @return Json
|
||||
*/
|
||||
public function getArticlesList(string $keyword = '', string $cate = '', int $page = 1, int $pageSize = 10): Json
|
||||
public function getArticlesList(string $author = '', string $keyword = '', string $cate = '', int $page = 1, int $pageSize = 10): Json
|
||||
{
|
||||
try {
|
||||
// 安全处理参数(防止非法参数)
|
||||
$page = max(1, $page); // 页码最小为1
|
||||
$pageSize = max(1, min(100, $pageSize)); // 每页条数限制1-100条
|
||||
$author = trim($author);
|
||||
$keyword = trim($keyword);
|
||||
$cate = trim($cate);
|
||||
|
||||
// 输出参数值
|
||||
trace('查询参数:', 'debug');
|
||||
trace([
|
||||
'author' => $author,
|
||||
'keyword' => $keyword,
|
||||
'cate' => $cate,
|
||||
'page' => $page,
|
||||
@@ -51,6 +54,11 @@ class ArticleController extends BaseController
|
||||
if ($keyword) {
|
||||
$query->where('a.title', 'like', '%' . $keyword . '%');
|
||||
}
|
||||
|
||||
// 作者筛选
|
||||
if ($author) {
|
||||
$query->where('a.publisher', 'like', '%' . $author . '%');
|
||||
}
|
||||
|
||||
// 分类筛选
|
||||
if ($cate) {
|
||||
@@ -208,10 +216,17 @@ class ArticleController extends BaseController
|
||||
public function getArticle(int $id): Json
|
||||
{
|
||||
try {
|
||||
$article = Articles::where('id', $id)
|
||||
->where('tid', $this->getTenantId())
|
||||
->field('id,title,cate,image,desc,author,content,is_trans,transurl,views,likes,publisher,create_time,publish_date,update_time')
|
||||
->find();
|
||||
$article = Articles::alias('a')
|
||||
->where('a.id', $id)
|
||||
->where('a.tid', $this->getTenantId())
|
||||
->leftJoin('mete_admin_user u', 'a.publisher = u.id')
|
||||
->field('a.id,a.title,a.cate,a.image,a.desc,a.author,a.content,a.is_trans,a.transurl,a.views,a.likes,u.name as publisher_name,a.create_time,a.publish_date,a.update_time')
|
||||
->find()
|
||||
->toArray();
|
||||
|
||||
// 将 publisher_name 赋值给 publisher
|
||||
$article['publisher'] = $article['publisher_name'] ?? '';
|
||||
unset($article['publisher_name']);
|
||||
|
||||
if (!$article) {
|
||||
return json(['code' => 404, 'msg' => '文章不存在', 'data' => null]);
|
||||
|
||||
@@ -0,0 +1,241 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\admin\controller\Cms\Banner;
|
||||
|
||||
use app\admin\BaseController;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\Session;
|
||||
use think\response\Json;
|
||||
use think\db\exception\DbException;
|
||||
use app\model\Cms\Banner;
|
||||
|
||||
class BannerController extends BaseController
|
||||
{
|
||||
/**
|
||||
* 获取所有Banner信息
|
||||
* @return Json
|
||||
*/
|
||||
public function getAllBanners()
|
||||
{
|
||||
try {
|
||||
$banners = Banner::where('delete_time', null)
|
||||
->where('tid', $this->getTenantId())
|
||||
->order('sort', 'asc')
|
||||
->field('id, title, desc, url, image, sort, create_time, update_time')
|
||||
->select()
|
||||
->toArray();
|
||||
// 记录操作日志
|
||||
$this->logSuccess('Banner管理', '获取所有Banner', ['data' => $banners]);
|
||||
return json([
|
||||
'code' => 200,
|
||||
'msg' => '获取成功',
|
||||
'data' => $banners
|
||||
]);
|
||||
} catch (DbException $e) {
|
||||
// 记录失败日志
|
||||
$this->logFail('Banner管理', '获取所有Banner', $e->getMessage());
|
||||
return json([
|
||||
'code' => 500,
|
||||
'msg' => '获取失败:' . $e->getMessage(),
|
||||
'data' => []
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建Banner
|
||||
* @return Json
|
||||
*/
|
||||
public function createBanner()
|
||||
{
|
||||
try {
|
||||
// 获取请求参数
|
||||
$data = $this->request->param();
|
||||
|
||||
// 验证参数
|
||||
$this->validate($data, [
|
||||
'title|标题' => 'require|max:255',
|
||||
'desc|简介' => 'max:65535',
|
||||
'url|跳转地址' => 'max:65535',
|
||||
'image|图片地址' => 'max:65535',
|
||||
'sort|排序号' => 'integer',
|
||||
]);
|
||||
|
||||
// 准备Banner数据
|
||||
$bannerData = [
|
||||
'title' => $data['title'],
|
||||
'tid' => $this->getTenantId(),
|
||||
'desc' => $data['desc'] ?? '',
|
||||
'url' => $data['url'] ?? '',
|
||||
'image' => $data['image'] ?? '',
|
||||
'sort' => $data['sort'] ?? 0,
|
||||
'create_time' => date('Y-m-d H:i:s'),
|
||||
];
|
||||
|
||||
// 创建Banner
|
||||
$result = Banner::insertGetId($bannerData);
|
||||
|
||||
if ($result === false) {
|
||||
return json([
|
||||
'code' => 500,
|
||||
'msg' => '创建失败'
|
||||
]);
|
||||
}
|
||||
|
||||
// 记录操作日志
|
||||
$this->logSuccess('Banner管理', '创建Banner', ['id' => $result]);
|
||||
return json([
|
||||
'code' => 200,
|
||||
'msg' => '创建成功',
|
||||
'data' => ['id' => $result]
|
||||
]);
|
||||
} catch (ValidateException $e) {
|
||||
// 记录失败日志
|
||||
$this->logFail('Banner管理', '创建Banner', $e->getMessage());
|
||||
return json([
|
||||
'code' => 400,
|
||||
'msg' => $e->getError()
|
||||
]);
|
||||
} catch (DbException $e) {
|
||||
// 记录失败日志
|
||||
$this->logFail('Banner管理', '创建Banner', $e->getMessage());
|
||||
return json([
|
||||
'code' => 500,
|
||||
'msg' => '创建失败:' . $e->getMessage()
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑Banner
|
||||
* @param int $id Banner ID
|
||||
* @return Json
|
||||
*/
|
||||
public function editBanner(int $id)
|
||||
{
|
||||
try {
|
||||
// 获取请求参数
|
||||
$data = $this->request->param();
|
||||
|
||||
// 验证参数
|
||||
$this->validate($data, [
|
||||
'title|标题' => 'require|max:255',
|
||||
'desc|简介' => 'max:65535',
|
||||
'url|跳转地址' => 'max:65535',
|
||||
'image|图片地址' => 'max:65535',
|
||||
'sort|排序号' => 'integer',
|
||||
]);
|
||||
|
||||
// 检查Banner是否存在(验证tid)
|
||||
$banner = Banner::where('id', $id)
|
||||
->where('tid', $this->getTenantId())
|
||||
->where('delete_time', null)
|
||||
->find();
|
||||
|
||||
if (!$banner) {
|
||||
return json([
|
||||
'code' => 404,
|
||||
'msg' => 'Banner不存在'
|
||||
]);
|
||||
}
|
||||
|
||||
// 准备更新数据
|
||||
$updateData = [
|
||||
'title' => $data['title'],
|
||||
'desc' => $data['desc'] ?? null,
|
||||
'url' => $data['url'] ?? null,
|
||||
'image' => $data['image'] ?? null,
|
||||
'sort' => $data['sort'] ?? 0,
|
||||
'update_time' => date('Y-m-d H:i:s'),
|
||||
];
|
||||
|
||||
// 执行更新
|
||||
Banner::where('id', $id)
|
||||
->where('tid', $this->getTenantId())
|
||||
->update($updateData);
|
||||
|
||||
// 获取更新后的Banner信息
|
||||
$updatedBanner = Banner::where('id', $id)
|
||||
->where('tid', $this->getTenantId())
|
||||
->find();
|
||||
|
||||
// 记录操作日志
|
||||
$this->logSuccess('Banner管理', '更新Banner', ['id' => $id]);
|
||||
return json([
|
||||
'code' => 200,
|
||||
'msg' => '更新成功',
|
||||
'data' => $updatedBanner ? $updatedBanner->toArray() : []
|
||||
]);
|
||||
} catch (ValidateException $e) {
|
||||
// 记录失败日志
|
||||
$this->logFail('Banner管理', '更新Banner', $e->getMessage());
|
||||
return json([
|
||||
'code' => 400,
|
||||
'msg' => $e->getError()
|
||||
]);
|
||||
} catch (DbException $e) {
|
||||
// 记录失败日志
|
||||
$this->logFail('Banner管理', '更新Banner', $e->getMessage());
|
||||
return json([
|
||||
'code' => 500,
|
||||
'msg' => '更新失败:' . $e->getMessage()
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除Banner
|
||||
* @param int $id Banner ID
|
||||
* @return Json
|
||||
*/
|
||||
public function deleteBanner(int $id)
|
||||
{
|
||||
try {
|
||||
// 检查Banner是否存在(验证tid)
|
||||
$banner = Banner::where('id', $id)
|
||||
->where('tid', $this->getTenantId())
|
||||
->where('delete_time', null)
|
||||
->find();
|
||||
|
||||
if (!$banner) {
|
||||
return json([
|
||||
'code' => 404,
|
||||
'msg' => 'Banner不存在'
|
||||
]);
|
||||
}
|
||||
|
||||
// 逻辑删除Banner
|
||||
$result = Banner::where('id', $id)
|
||||
->where('tid', $this->getTenantId())
|
||||
->where('delete_time', null)
|
||||
->update([
|
||||
'delete_time' => time(),
|
||||
'update_time' => time()
|
||||
]);
|
||||
|
||||
if ($result === false) {
|
||||
return json([
|
||||
'code' => 500,
|
||||
'msg' => '删除失败'
|
||||
]);
|
||||
}
|
||||
|
||||
// 记录操作日志
|
||||
$this->logSuccess('Banner管理', '删除Banner', ['id' => $id]);
|
||||
return json([
|
||||
'code' => 200,
|
||||
'msg' => '删除成功'
|
||||
]);
|
||||
} catch (DbException $e) {
|
||||
// 记录失败日志
|
||||
$this->logFail('Banner管理', '删除Banner', $e->getMessage());
|
||||
return json([
|
||||
'code' => 500,
|
||||
'msg' => '删除失败:' . $e->getMessage()
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,7 @@ declare(strict_types=1);
|
||||
|
||||
namespace app\admin\controller\Cms\Demand;
|
||||
|
||||
use app\index\BaseController;
|
||||
use app\admin\BaseController;
|
||||
use Symfony\Component\VarDumper\VarDumper;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Request;
|
||||
@@ -26,6 +26,7 @@ class DemandController extends BaseController
|
||||
{
|
||||
// 查询分类
|
||||
$demandList = Demand::where('delete_time', null)
|
||||
->where('tid', $this->getTenantId())
|
||||
->order('id', 'desc')
|
||||
->select();
|
||||
|
||||
@@ -52,7 +53,7 @@ class DemandController extends BaseController
|
||||
{
|
||||
try {
|
||||
$data = Request::only(['title', 'desc', 'applicant', 'status']);
|
||||
|
||||
|
||||
// 验证数据
|
||||
if (empty($data['title']) || empty($data['desc'])) {
|
||||
return json([
|
||||
@@ -60,15 +61,16 @@ class DemandController extends BaseController
|
||||
'msg' => '标题和描述不能为空',
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
// 创建需求
|
||||
$demand = Demand::create([
|
||||
'title' => $data['title'],
|
||||
'desc' => $data['desc'],
|
||||
'applicant' => $data['applicant'] ?? '',
|
||||
'status' => $data['status'] ?? 'pending',
|
||||
'tid' => $this->getTenantId(),
|
||||
]);
|
||||
|
||||
|
||||
return json([
|
||||
'code' => 200,
|
||||
'msg' => '添加成功',
|
||||
@@ -91,7 +93,7 @@ class DemandController extends BaseController
|
||||
try {
|
||||
$id = Request::param('id');
|
||||
$data = Request::only(['title', 'desc', 'applicant', 'status']);
|
||||
|
||||
|
||||
// 验证数据
|
||||
if (empty($id)) {
|
||||
return json([
|
||||
@@ -99,23 +101,25 @@ class DemandController extends BaseController
|
||||
'msg' => '需求ID不能为空',
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
if (empty($data['title']) || empty($data['desc'])) {
|
||||
return json([
|
||||
'code' => 400,
|
||||
'msg' => '标题和描述不能为空',
|
||||
]);
|
||||
}
|
||||
|
||||
// 查找需求
|
||||
$demand = Demand::find($id);
|
||||
|
||||
// 查找需求(验证tid)
|
||||
$demand = Demand::where('id', $id)
|
||||
->where('tid', $this->getTenantId())
|
||||
->find();
|
||||
if (!$demand) {
|
||||
return json([
|
||||
'code' => 404,
|
||||
'msg' => '需求不存在',
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
// 更新需求
|
||||
$demand->save([
|
||||
'title' => $data['title'],
|
||||
@@ -123,7 +127,7 @@ class DemandController extends BaseController
|
||||
'applicant' => $data['applicant'] ?? '',
|
||||
'status' => $data['status'] ?? 'pending',
|
||||
]);
|
||||
|
||||
|
||||
return json([
|
||||
'code' => 200,
|
||||
'msg' => '编辑成功',
|
||||
@@ -145,7 +149,7 @@ class DemandController extends BaseController
|
||||
{
|
||||
try {
|
||||
$id = Request::param('id');
|
||||
|
||||
|
||||
// 验证数据
|
||||
if (empty($id)) {
|
||||
return json([
|
||||
@@ -153,19 +157,21 @@ class DemandController extends BaseController
|
||||
'msg' => '需求ID不能为空',
|
||||
]);
|
||||
}
|
||||
|
||||
// 查找需求
|
||||
$demand = Demand::find($id);
|
||||
|
||||
// 查找需求(验证tid)
|
||||
$demand = Demand::where('id', $id)
|
||||
->where('tid', $this->getTenantId())
|
||||
->find();
|
||||
if (!$demand) {
|
||||
return json([
|
||||
'code' => 404,
|
||||
'msg' => '需求不存在',
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
// 软删除
|
||||
$demand->delete();
|
||||
|
||||
|
||||
return json([
|
||||
'code' => 200,
|
||||
'msg' => '删除成功',
|
||||
|
||||
@@ -21,14 +21,14 @@ class TenantDomainController extends BaseController
|
||||
{
|
||||
$page = $request->param('page', 1, 'int');
|
||||
$pageSize = $request->param('pageSize', 10, 'int');
|
||||
$tenantId = $request->param('tenant_id', 0, 'int');
|
||||
$tenantId = $request->param('tid', 0, 'int');
|
||||
$status = $request->param('status', '');
|
||||
$subDomain = $request->param('sub_domain', '');
|
||||
|
||||
$where = [['delete_time', '=', null]];
|
||||
|
||||
if ($tenantId > 0) {
|
||||
$where[] = ['tenant_id', '=', $tenantId];
|
||||
$where[] = ['tid', '=', $tenantId];
|
||||
}
|
||||
if ($status !== '' && $status !== null) {
|
||||
$where[] = ['status', '=', $status];
|
||||
@@ -49,7 +49,7 @@ class TenantDomainController extends BaseController
|
||||
->count();
|
||||
|
||||
// 获取租户名称
|
||||
$tenantIds = array_column($list, 'tenant_id');
|
||||
$tenantIds = array_column($list, 'tid');
|
||||
$tenants = [];
|
||||
if ($tenantIds) {
|
||||
$tenantList = Db::name('mete_tenant')
|
||||
@@ -61,7 +61,7 @@ class TenantDomainController extends BaseController
|
||||
|
||||
// 附加租户名称
|
||||
foreach ($list as &$item) {
|
||||
$item['tenant_name'] = $tenants[$item['tenant_id']]['tenant_name'] ?? '';
|
||||
$item['tenant_name'] = $tenants[$item['tid']]['tenant_name'] ?? '';
|
||||
}
|
||||
|
||||
return json([
|
||||
@@ -89,7 +89,7 @@ class TenantDomainController extends BaseController
|
||||
}
|
||||
|
||||
$list = Db::name('mete_tenant_domain')
|
||||
->where('tenant_id', $tid)
|
||||
->where('tid', $tid)
|
||||
->where('delete_time', null)
|
||||
->order('id', 'desc')
|
||||
->select()
|
||||
@@ -107,7 +107,7 @@ class TenantDomainController extends BaseController
|
||||
*/
|
||||
public function apply(Request $request)
|
||||
{
|
||||
$tid = $request->param('tenant_id', 0, 'int');
|
||||
$tid = $request->param('tid', 0, 'int');
|
||||
$subDomain = $request->param('sub_domain', '');
|
||||
$mainDomain = $request->param('main_domain', '');
|
||||
|
||||
@@ -172,7 +172,7 @@ class TenantDomainController extends BaseController
|
||||
$now = date('Y-m-d H:i:s');
|
||||
|
||||
$id = Db::name('mete_tenant_domain')->insertGetId([
|
||||
'tenant_id' => $tid,
|
||||
'tid' => $tid,
|
||||
'sub_domain' => $subDomain,
|
||||
'main_domain' => $mainDomain,
|
||||
'full_domain' => $fullDomain,
|
||||
|
||||
@@ -0,0 +1,266 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\admin\controller\Cms\FrontMenu;
|
||||
|
||||
use app\admin\BaseController;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\Session;
|
||||
use think\response\Json;
|
||||
use think\db\exception\DbException;
|
||||
use app\model\Cms\FrontMenu;
|
||||
|
||||
class FrontMenuController extends BaseController
|
||||
{
|
||||
/**
|
||||
* 获取前端导航接口
|
||||
* @return \think\response\Json
|
||||
*/
|
||||
public function getFrontMenus()
|
||||
{
|
||||
try {
|
||||
// 获取所有未删除的菜单
|
||||
$frontMenus = FrontMenu::where('delete_time', null)
|
||||
->where('tid', $this->getTenantId())
|
||||
->field('id,pid,title,type,image,path,component_path,sort,desc')
|
||||
->order('sort', 'desc')
|
||||
->select()
|
||||
->toArray(); // 转换为数组
|
||||
|
||||
// 使用 buildFrontMenuTree 构建树形结构
|
||||
$treeFrontMenus = $this->buildFrontMenuTree($frontMenus);
|
||||
|
||||
return json([
|
||||
'code' => 200,
|
||||
'msg' => 'success',
|
||||
'data' => $treeFrontMenus
|
||||
]);
|
||||
} catch (DbException $e) {
|
||||
return json([
|
||||
'code' => 500,
|
||||
'msg' => 'fail:' . $e->getMessage(),
|
||||
'data' => $e->getTraceAsString()
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建新菜单
|
||||
* @return \think\response\Json
|
||||
*/
|
||||
public function createFrontMenu()
|
||||
{
|
||||
try {
|
||||
// 获取请求参数
|
||||
$data = $this->request->param();
|
||||
|
||||
// 验证参数
|
||||
$this->validate($data, [
|
||||
'title|菜单名称' => 'require|max:50',
|
||||
'pid|上级菜单ID' => 'integer',
|
||||
'type|菜单类型' => 'require|in:1,2,3,4',
|
||||
'sort|排序号' => 'integer',
|
||||
'path|路由路径' => 'max:200',
|
||||
'component_path|组件路径' => 'max:200',
|
||||
'desc|描述' => 'max:500',
|
||||
]);
|
||||
|
||||
// 准备菜单数据
|
||||
$menuData = [
|
||||
'pid' => $data['pid'] ?? 0,
|
||||
'tid' => $this->getTenantId(),
|
||||
'title' => $data['title'],
|
||||
'type' => $data['type'],
|
||||
'sort' => $data['sort'] ?? 0,
|
||||
'path' => $data['path'] ?? '',
|
||||
'component_path' => $data['component_path'] ?? '',
|
||||
'image' => $data['image'] ?? '',
|
||||
'desc' => $data['desc'] ?? '',
|
||||
'create_time' => date('Y-m-d H:i:s')
|
||||
];
|
||||
|
||||
// 创建菜单
|
||||
$result = FrontMenu::insertGetId($menuData);
|
||||
|
||||
if ($result === false) {
|
||||
return json([
|
||||
'code' => 500,
|
||||
'msg' => 'fail'
|
||||
]);
|
||||
}
|
||||
|
||||
// 记录操作日志
|
||||
$this->logSuccess('前端导航管理', '创建前端导航', ['id' => $result]);
|
||||
return json([
|
||||
'code' => 200,
|
||||
'msg' => 'success'
|
||||
]);
|
||||
} catch (ValidateException $e) {
|
||||
// 记录失败日志
|
||||
$this->logFail('前端导航管理', '创建前端导航', $e->getMessage());
|
||||
return json([
|
||||
'code' => 500,
|
||||
'msg' => 'fail:' . $e->getMessage()
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑前端导航
|
||||
* @param int $id 前端导航ID
|
||||
* @return \think\response\Json
|
||||
*/
|
||||
public function editFrontMenu(int $id)
|
||||
{
|
||||
try {
|
||||
// 获取请求参数
|
||||
$data = $this->request->param();
|
||||
|
||||
// 验证参数
|
||||
$this->validate($data, [
|
||||
'title|菜单名称' => 'require|max:50',
|
||||
'pid|上级菜单ID' => 'integer',
|
||||
'type|菜单类型' => 'require|in:1,2,3,4',
|
||||
'sort|排序号' => 'integer',
|
||||
'path|路由路径' => 'max:200',
|
||||
'component_path|组件路径' => 'max:200',
|
||||
'desc|描述' => 'max:500',
|
||||
]);
|
||||
|
||||
// 准备更新数据
|
||||
$updateData = [
|
||||
'title' => $data['title'],
|
||||
'tid' => $this->getTenantId(),
|
||||
'pid' => $data['pid'] ?? null,
|
||||
'type' => $data['type'],
|
||||
'path' => $data['path'] ?? null,
|
||||
'component_path' => $data['component_path'] ?? null,
|
||||
'image' => $data['image'] ?? null,
|
||||
'desc' => $data['desc'] ?? null,
|
||||
'sort' => $data['sort'] ?? 0,
|
||||
'update_time' => date('Y-m-d H:i:s')
|
||||
];
|
||||
|
||||
// 执行更新
|
||||
FrontMenu::where('id', $id)->update($updateData);
|
||||
|
||||
// 获取更新后的菜单信息
|
||||
$menu = FrontMenu::where('id', $id)->find();
|
||||
|
||||
// 记录操作日志
|
||||
$this->logSuccess('前端导航管理', '更新前端导航', ['id' => $id]);
|
||||
return json([
|
||||
'code' => 200,
|
||||
'msg' => 'success',
|
||||
'data' => $menu ? $menu->toArray() : []
|
||||
]);
|
||||
} catch (ValidateException $e) {
|
||||
// 记录失败日志
|
||||
$this->logFail('前端导航管理', '更新前端导航', $e->getMessage());
|
||||
return json([
|
||||
'code' => 400,
|
||||
'msg' => $e->getError()
|
||||
]);
|
||||
} catch (DbException $e) {
|
||||
// 记录失败日志
|
||||
$this->logFail('前端导航管理', '更新前端导航', $e->getMessage());
|
||||
return json([
|
||||
'code' => 500,
|
||||
'msg' => 'fail:' . $e->getMessage(),
|
||||
'data' => $e->getTraceAsString()
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public function deleteFrontMenu(int $id)
|
||||
{
|
||||
try {
|
||||
// 检查是否有子前端导航
|
||||
$hasChildren = FrontMenu::where('pid', $id)
|
||||
->where('tid', $this->getTenantId())
|
||||
->where('pid', $id)
|
||||
->where('delete_time', null)
|
||||
->count() > 0;
|
||||
|
||||
if ($hasChildren) {
|
||||
return json([
|
||||
'code' => 400,
|
||||
'msg' => '该前端导航下有子导航,无法删除'
|
||||
]);
|
||||
}
|
||||
|
||||
// 逻辑删除前端导航
|
||||
$result = FrontMenu::where('id', $id)
|
||||
->where('id', $id)
|
||||
->where('delete_time', null)
|
||||
->where('tid', $this->getTenantId())
|
||||
->update([
|
||||
'delete_time' => date('Y-m-d H:i:s'),
|
||||
'update_time' => date('Y-m-d H:i:s')
|
||||
]);
|
||||
|
||||
if ($result === false) {
|
||||
return json([
|
||||
'code' => 500,
|
||||
'msg' => 'fail'
|
||||
]);
|
||||
}
|
||||
|
||||
// 记录操作日志
|
||||
$this->logSuccess('前端导航管理', '删除前端导航', ['id' => $id]);
|
||||
return json([
|
||||
'code' => 200,
|
||||
'msg' => 'success'
|
||||
]);
|
||||
} catch (ValidateException $e) {
|
||||
// 记录失败日志
|
||||
$this->logFail('前端导航管理', '删除前端导航', $e->getMessage());
|
||||
return json([
|
||||
'code' => 500,
|
||||
'msg' => 'fail:' . $e->getMessage()
|
||||
]);
|
||||
} catch (DbException $e) {
|
||||
// 记录失败日志
|
||||
$this->logFail('前端导航管理', '删除前端导航', $e->getMessage());
|
||||
return json([
|
||||
'code' => 500,
|
||||
'msg' => 'fail:' . $e->getMessage()
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建前端导航树形结构
|
||||
* @param array $frontMenus 前端导航列表
|
||||
* @param int $pid 父前端导航ID
|
||||
* @return array
|
||||
*/
|
||||
private function buildFrontMenuTree(array $frontMenus, int $pid = 0): array
|
||||
{
|
||||
$tree = [];
|
||||
|
||||
foreach ($frontMenus as $frontMenu) {
|
||||
// 将null的pid视为0处理
|
||||
$menuPid = is_null($frontMenu['pid']) ? 0 : $frontMenu['pid'];
|
||||
if ($menuPid == $pid) {
|
||||
$children = $this->buildFrontMenuTree($frontMenus, $frontMenu['id']);
|
||||
if (!empty($children)) {
|
||||
$frontMenu['children'] = $children;
|
||||
}
|
||||
$tree[] = $frontMenu;
|
||||
}
|
||||
}
|
||||
|
||||
// 按 sort 字段降序排序
|
||||
usort($tree, function ($a, $b) {
|
||||
$sortA = $a['sort'] ?? 0;
|
||||
$sortB = $b['sort'] ?? 0;
|
||||
return $sortB - $sortA;
|
||||
});
|
||||
|
||||
return $tree;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,275 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\admin\controller\Cms\OnePage;
|
||||
|
||||
use app\admin\BaseController;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\Session;
|
||||
use think\response\Json;
|
||||
use think\db\exception\DbException;
|
||||
use app\model\Cms\OnePage;
|
||||
|
||||
class OnePageController extends BaseController
|
||||
{
|
||||
/**
|
||||
* 获取所有单页信息
|
||||
* @return Json
|
||||
*/
|
||||
public function getAllOnePages()
|
||||
{
|
||||
try {
|
||||
$onePages = OnePage::where('delete_time', null)
|
||||
->where('tid', $this->getTenantId())
|
||||
->order('sort', 'asc')
|
||||
->field('id, title, content, path, sort, status, create_time, update_time')
|
||||
->select()
|
||||
->toArray();
|
||||
return json([
|
||||
'code' => 200,
|
||||
'msg' => '获取成功',
|
||||
'data' => $onePages
|
||||
]);
|
||||
} catch (DbException $e) {
|
||||
return json([
|
||||
'code' => 500,
|
||||
'msg' => '获取失败:' . $e->getMessage(),
|
||||
'data' => []
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建单页
|
||||
* @return Json
|
||||
*/
|
||||
public function createOnePage()
|
||||
{
|
||||
try {
|
||||
// 获取请求参数
|
||||
$data = $this->request->param();
|
||||
|
||||
// 验证参数
|
||||
$this->validate($data, [
|
||||
'title|标题' => 'require|max:255',
|
||||
'content|内容' => 'require',
|
||||
'path|路由' => 'require|max:200',
|
||||
'sort|排序号' => 'integer',
|
||||
'status|状态' => 'integer|in:0,1',
|
||||
]);
|
||||
|
||||
// 验证路由格式(必须以 / 开头)
|
||||
if (!preg_match('/^\/[a-zA-Z0-9\/_-]*$/', $data['path'])) {
|
||||
return json([
|
||||
'code' => 400,
|
||||
'msg' => '路由必须以 / 开头,只能包含字母、数字、下划线、横线和斜线'
|
||||
]);
|
||||
}
|
||||
|
||||
// 检查路由是否已存在
|
||||
$exists = OnePage::where('path', $data['path'])
|
||||
->where('tid', $this->getTenantId())
|
||||
->where('delete_time', null)
|
||||
->find();
|
||||
if ($exists) {
|
||||
return json([
|
||||
'code' => 400,
|
||||
'msg' => '路由已存在,请使用其他路由'
|
||||
]);
|
||||
}
|
||||
|
||||
// 准备单页数据
|
||||
$onePageData = [
|
||||
'title' => $data['title'],
|
||||
'content' => $data['content'],
|
||||
'path' => $data['path'],
|
||||
'sort' => $data['sort'] ?? 0,
|
||||
'status' => $data['status'] ?? 1,
|
||||
'tid' => $this->getTenantId(),
|
||||
'create_time' => date('Y-m-d H:i:s'),
|
||||
];
|
||||
|
||||
// 创建单页
|
||||
$result = OnePage::insertGetId($onePageData);
|
||||
|
||||
if ($result === false) {
|
||||
return json([
|
||||
'code' => 500,
|
||||
'msg' => '创建失败'
|
||||
]);
|
||||
}
|
||||
|
||||
// 记录操作日志
|
||||
$this->logSuccess('单页管理', '创建单页', ['id' => $result]);
|
||||
return json([
|
||||
'code' => 200,
|
||||
'msg' => '创建成功',
|
||||
'data' => ['id' => $result]
|
||||
]);
|
||||
} catch (ValidateException $e) {
|
||||
// 记录失败日志
|
||||
$this->logFail('单页管理', '创建单页', $e->getMessage());
|
||||
return json([
|
||||
'code' => 400,
|
||||
'msg' => $e->getError()
|
||||
]);
|
||||
} catch (DbException $e) {
|
||||
// 记录失败日志
|
||||
$this->logFail('单页管理', '创建单页', $e->getMessage());
|
||||
return json([
|
||||
'code' => 500,
|
||||
'msg' => '创建失败:' . $e->getMessage()
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑单页
|
||||
* @param int $id 单页ID
|
||||
* @return Json
|
||||
*/
|
||||
public function editOnePage(int $id)
|
||||
{
|
||||
try {
|
||||
// 获取请求参数
|
||||
$data = $this->request->param();
|
||||
|
||||
// 验证参数
|
||||
$this->validate($data, [
|
||||
'title|标题' => 'require|max:255',
|
||||
'content|内容' => 'require',
|
||||
'path|路由' => 'require|max:200',
|
||||
'sort|排序号' => 'integer',
|
||||
'status|状态' => 'integer|in:0,1',
|
||||
]);
|
||||
|
||||
// 验证路由格式(必须以 / 开头)
|
||||
if (!preg_match('/^\/[a-zA-Z0-9\/_-]*$/', $data['path'])) {
|
||||
return json([
|
||||
'code' => 400,
|
||||
'msg' => '路由必须以 / 开头,只能包含字母、数字、下划线、横线和斜线'
|
||||
]);
|
||||
}
|
||||
|
||||
// 检查单页是否存在(验证tid)
|
||||
$onePage = OnePage::where('id', $id)
|
||||
->where('tid', $this->getTenantId())
|
||||
->where('delete_time', null)
|
||||
->find();
|
||||
|
||||
if (!$onePage) {
|
||||
return json([
|
||||
'code' => 404,
|
||||
'msg' => '单页不存在'
|
||||
]);
|
||||
}
|
||||
|
||||
// 检查路由是否被其他单页使用
|
||||
$exists = OnePage::where('path', $data['path'])
|
||||
->where('id', '<>', $id)
|
||||
->where('tid', $this->getTenantId())
|
||||
->where('delete_time', null)
|
||||
->find();
|
||||
if ($exists) {
|
||||
return json([
|
||||
'code' => 400,
|
||||
'msg' => '路由已被其他单页使用,请使用其他路由'
|
||||
]);
|
||||
}
|
||||
|
||||
// 准备更新数据
|
||||
$updateData = [
|
||||
'title' => $data['title'],
|
||||
'content' => $data['content'],
|
||||
'path' => $data['path'],
|
||||
'sort' => $data['sort'] ?? 0,
|
||||
'status' => $data['status'] ?? 1,
|
||||
'update_time' => date('Y-m-d H:i:s'),
|
||||
];
|
||||
|
||||
// 执行更新
|
||||
OnePage::where('id', $id)->update($updateData);
|
||||
|
||||
// 获取更新后的单页信息
|
||||
$updatedOnePage = OnePage::where('id', $id)->find();
|
||||
|
||||
// 记录操作日志
|
||||
$this->logSuccess('单页管理', '更新单页', ['id' => $id]);
|
||||
return json([
|
||||
'code' => 200,
|
||||
'msg' => '更新成功',
|
||||
'data' => $updatedOnePage ? $updatedOnePage->toArray() : []
|
||||
]);
|
||||
} catch (ValidateException $e) {
|
||||
// 记录失败日志
|
||||
$this->logFail('单页管理', '更新单页', $e->getMessage());
|
||||
return json([
|
||||
'code' => 400,
|
||||
'msg' => $e->getError()
|
||||
]);
|
||||
} catch (DbException $e) {
|
||||
// 记录失败日志
|
||||
$this->logFail('单页管理', '更新单页', $e->getMessage());
|
||||
return json([
|
||||
'code' => 500,
|
||||
'msg' => '更新失败:' . $e->getMessage()
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除单页
|
||||
* @param int $id 单页ID
|
||||
* @return Json
|
||||
*/
|
||||
public function deleteOnePage(int $id)
|
||||
{
|
||||
try {
|
||||
// 检查单页是否存在(验证tid)
|
||||
$onePage = OnePage::where('id', $id)
|
||||
->where('tid', $this->getTenantId())
|
||||
->where('delete_time', null)
|
||||
->find();
|
||||
|
||||
if (!$onePage) {
|
||||
return json([
|
||||
'code' => 404,
|
||||
'msg' => '单页不存在'
|
||||
]);
|
||||
}
|
||||
|
||||
// 逻辑删除单页
|
||||
$result = OnePage::where('id', $id)
|
||||
->where('tid', $this->getTenantId())
|
||||
->where('delete_time', null)
|
||||
->update([
|
||||
'delete_time' => date('Y-m-d H:i:s'),
|
||||
'update_time' => date('Y-m-d H:i:s')
|
||||
]);
|
||||
|
||||
if ($result === false) {
|
||||
return json([
|
||||
'code' => 500,
|
||||
'msg' => '删除失败'
|
||||
]);
|
||||
}
|
||||
|
||||
// 记录操作日志
|
||||
$this->logSuccess('单页管理', '删除单页', ['id' => $id]);
|
||||
return json([
|
||||
'code' => 200,
|
||||
'msg' => '删除成功'
|
||||
]);
|
||||
} catch (DbException $e) {
|
||||
// 记录失败日志
|
||||
$this->logFail('单页管理', '删除单页', $e->getMessage());
|
||||
return json([
|
||||
'code' => 500,
|
||||
'msg' => '删除失败:' . $e->getMessage()
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ use app\admin\BaseController;
|
||||
use app\service\ThemeService;
|
||||
use think\facade\Request;
|
||||
|
||||
|
||||
/**
|
||||
* 模板管理控制器
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user