cms-manage/app/controller/backend/ContentController.php

686 lines
23 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
declare (strict_types = 1);
namespace app\controller\backend;
use app\exception\ModelEmptyException;
use app\exception\ModelException;
use app\model\InnerChart;
use app\model\RecycleBin;
use app\model\SubContent;
use app\model\SubContentCheck;
use app\model\SubContentCheckStep;
use app\model\SysSetting;
use app\service\CacheService;
use app\service\CiZhuaService;
use app\service\ContentService;
use app\service\ModuleFieldService;
use app\service\TranslateService;
use app\validate\ContentValidate;
use think\db\exception\DbException;
use think\Exception;
use think\exception\ValidateException;
use think\facade\Cache;
use think\facade\Db;
use think\facade\Lang;
use Vtiful\Kernel\Excel;
use function Complex\csc;
class ContentController extends BaseController
{
// 文章批量上传
public function articleUpload(ContentService $contentService): \think\response\Json
{
if($this->request->isPost()){
$param = $this->request->param();
$file = $this->request->file('file');
$param['file'] = $file;
if(is_string($param['category_id'])){
$param['category_id'] = explode(',', $param['category_id']);
}
try{
validate(ContentValidate::class)->scene('articleUpload')->check($param);
}catch (ValidateException $e){
return jsonReturn(-1,$e->getError());
}
$param['admin'] = $this->admin;
$res = $contentService->articleUpload($param);
CacheService::clear();
return json($res);
}
return jsonReturn(-1,Lang::get('请求方式错误'));
}
// 提取文章简介
public function descExtraction(ContentService $contentService): \think\response\Json
{
$content = input('content');
$res = $contentService -> descExtraction($content);
return jsonReturn(0,lang('成功'),$res);
}
// 图片本地化
public function imgLocal(ContentService $contentService): \think\response\Json
{
$content = input('content');
$website = input('website');
$res = $contentService -> imgExtraction($content,$this->admin['seller_id'],$website);
return jsonReturn(0,lang('成功'),$res);
}
public function wordSearch(CiZhuaService $ciZhuaService)
{
$content = input('content');
$sysSetting = new SysSetting();
$key = $sysSetting->getSysSettingValue([['title','=','cizhua_secret']])['data'];
if (empty($key)) {
return jsonReturn(-1,lang('没有配置密钥,请去系统设置-第三方设置中填写词爪密钥'));
}
$res = $ciZhuaService->wordSearch($key, $content);
$res = json_decode($res, true);
if ($res['code'] != 0) {
return json($res);
}
return jsonReturn(0,lang('成功'), $res['data']);
}
/**
* 内容添加内链
* @throws DbException
*/
public function addInnerChat(ContentService $contentService): \think\response\Json
{
$param = input('post.');
try{
validate(ContentValidate::class)->scene('addInnerChat')->check($param);
}catch (ValidateException $e){
return jsonReturn(422, $e->getError());
}
$sellerId= $this->admin['seller_id'];
$InnerChart = new InnerChart();
$innerChart = $InnerChart->getAllInnerChart(['seller_id'=>$sellerId,'website_id'=>$param['website_id'],'status'=>1],'weight desc','id,weight,keyword,url,new_page_open')['data'];
if(empty($innerChart)){
return jsonReturn(0,lang('成功'),$param['content']);
}
$subId = (int)input('sub_id');
if($subId){
$SubContent = new SubContent();
$subContent = $SubContent -> getSubContent(['id'=>$subId,'seller_id'=>$this->admin['seller_id'],'is_del'=>1])['data'];
}else{
$subContent = null;
}
$content = $contentService->autoLinks($param['content'],$innerChart,$subContent);
CacheService::clear();
return jsonReturn(0,lang('成功'),$content);
}
/**
* 文章列表
*
* @return \think\Response
*/
public function index(ContentService $contentService): \think\Response
{
$status = input('param.status');
$categoryIds = input('param.category_id');
$title = input('param.title');
$limit = $this->setLimit();
$param = [
'seller_id' => $this->admin['seller_id'],
'category_ids' => $categoryIds,
'limit' => $limit,
'lang' => input('param.lang'),
'website_id' => (int)input('param.website_id'),
'title' => $title,
'is_del' => 1,
];
$where = [];
switch ($status) {
case 1://已发布
$where[] = ['status', '=', 1];
$where[] = ['publish_time', '<=', date('Y-m-d H:i:s')];
$where[] = ['check_status', '=', 3];
break;
case 2://待发布
$where[] = ['status', '=', 1];
$where[] = ['publish_time', '>', date('Y-m-d H:i:s')];
$where[] = ['check_status', '=', 3];
break;
case 3://待审核
$where[] = ['status', '=', 1];
$where[] = ['check_status', 'in', [1,2]];
break;
case 4://被驳回
$where[] = ['status', '=', 1];
$where[] = ['check_status', '=', 4];
break;
case 5://已下线
$where[] = ['status', '=', 2];
break;
case 6://草稿
$where[] = ['status', '=', 3];
break;
}
$param['where'] = $where;
try {
$res = $contentService->indexContent($param);
} catch (ModelEmptyException | ModelException | DbException $e) {
return jsonReturn(50013,$e->getMessage());
}
return $res;
}
/**
* 待审核列表
* @return \think\response\Json
*/
public function checkList(ContentService $contentService)
{
$categoryIds = input('param.category_id');
$title = input('param.title');
$type = $this->request->param('type', 1);
$contentCheckModel = new SubContentCheck();
if ($type == 1) {
// 获取需要自己审核的待审核内容id
$ids = $contentCheckModel->where([
'check_user_id' => $this->admin['uid'],
'status' => 2,
])->column('real_id');
$contentWhere[] = ['id', 'in', $ids];
$contentWhere[] = ['check_status', 'in', [1,2]];
} else {
// 获取自己提交的需要审核的内容id
$contentWhere[] = ['admin_id', '=', $this->admin['uid']];
}
$contentWhere[] = ['status', 'in', [1,2]];
$limit = $this->setLimit();
$param = [
'seller_id' => $this->admin['seller_id'],
'category_ids' => $categoryIds,
'limit' => $limit,
'lang' => input('param.lang'),
'website_id' => (int)input('param.website_id'),
'title' => $title,
'is_del' => 1,
'where' => $contentWhere
];
try {
$res = $contentService->indexContent($param);
} catch (ModelEmptyException | ModelException | DbException $e) {
return jsonReturn(50013,$e->getMessage());
}
return $res;
}
/**
* 回收站列表
* @return \think\response\Json
*/
public function recycleBinList(ContentService $contentService)
{
$categoryIds = input('param.category_id');
$title = input('param.title');
$limit = $this->setLimit();
$param = [
'seller_id' => $this->admin['seller_id'],
'category_ids' => $categoryIds,
'limit' => $limit,
'lang' => input('param.lang'),
'website_id' => (int)input('param.website_id'),
'title' => $title,
'is_del' => 2,
];
try {
$res = $contentService->indexContent($param);
} catch (ModelEmptyException | ModelException | DbException $e) {
return jsonReturn(50013,$e->getMessage());
}
return $res;
}
/**
* 批量审核
* @return \think\response\Json
*/
public function checkAll()
{
$param = $this->request->only([
'check_data' => [],
'status' => 3,
'reason' => '',
'files' => '',
]);
// 内容多版本审核
if (empty($param['check_data']) || !in_array($param['status'], [3,4])) {
return jsonReturn(-1, lang('参数错误'));
}
if (!is_array($param['check_data'])) {
return jsonReturn(-1, lang('参数错误'));
}
if (is_array($param['files'])) {
$param['files'] = implode(',', $param['files']);
}
Db::startTrans();
try {
$contentService = new ContentService();
foreach ($param['check_data'] as $check) {
$newParam = $param;
unset($newParam['check_data']);
$newParam['real_id'] = $check['id'];
$newParam['version'] = $check['version'];
$newParam['admin'] = $this->admin;
$res = $contentService->check($newParam);
if ($res['code'] != 0) {
throw new Exception($check['id'] . lang('审核失败!版本:')."{$check['version']}" . $res['code'] . $res['msg']);
}
}
} catch (\Exception $e) {
Db::rollback();
return jsonReturn(-3, $e->getMessage(), $e->getTrace());
}
Db::commit();
return jsonReturn(0, lang('操作成功'));
}
public function editStatus(ContentService $contentService)
{
$param = $this->request->only([
'id' => [],
'status' => 1,
]);
$param['seller_id'] = $this->admin['seller_id'];
return json($contentService->editStatus($param));
}
/*
* 批量删除
*/
public function delAll(ContentService $contentService)
{
$param = $this->request->only(['ids']);
if (!is_array($param['ids'])) {
$param['ids'] = explode(',', $param['ids']);
}
$subContentModel = new SubContent();
$list = $subContentModel->where('id', 'in', $param['ids'])->column('id, module_id');
foreach ($list as $v) {
$v['seller_id'] = $this->admin['seller_id'];
$v['admin_id'] = $this->admin['uid'];
$v['name'] = $this->admin['name'];
$res = $contentService->deleteContent($v);
CacheService::clear();
}
return $res;
}
// 批量恢复
public function recoverAll(ModuleFieldService $fieldService)
{
$param = $this->request->only(['ids']);
if (!is_array($param['ids'])) {
$param['ids'] = explode(',', $param['ids']);
}
$subContentModel = new SubContent();
$list = $subContentModel->where('id', 'in', $param['ids'])->column('id, module_id');
$ids = array_column($list, 'id');
$module_ids = array_column($list, 'module_id');
$recycleBin = new RecycleBin();
$idArr = $recycleBin->where([
['sub_id', 'in', $ids],
['module_id', 'in', $module_ids]
])->column('id');
foreach ($idArr as $id) {
$res = $fieldService->resotreData($id,$this->admin['seller_id']);
}
CacheService::clear();
return $res;
}
/**
* 获取栏目字段
*
*/
public function create(ContentService $contentService): \think\response\Json
{
$categoryId = (int)input('category_id');
if(!$categoryId){
return jsonReturn(-1,lang('栏目ID不能为空'));
}
$param = [
'seller_id' => $this->admin['seller_id'],
'category_id' => $categoryId
];
try {
$res = $contentService->createContent($param);
} catch (ModelEmptyException | ModelException $e) {
return jsonReturn(-3,$e->getMessage());
}
return $res;
}
/**
* 栏目内容新增
*
* @return \think\Response
*/
public function save(ContentService $contentService): \think\Response
{
if(!request()->isPost()){
return jsonReturn(-2,lang('请求方法错误'));
}
$param = input('post.');
try{
validate(ContentValidate::class)->scene('save')->check($param);
}catch (ValidateException $e){
return jsonReturn(422, $e->getError());
}
$param['admin'] = $this->admin;
unset($param['main_content']['id']);//添加接口以防冲突不需要id
unset($param['sub_content']['id']);//添加接口以防冲突不需要id
if(empty($param['sub_content']['publish_time'])){
$param['sub_content']['publish_time'] = date('Y-m-d H:i:s',time());
}
if(!isset($param['main_content'])){
$param['main_content'] = [];
}
try {
$res = $contentService->saveContent($param);
} catch (ModelEmptyException | ModelException $e) {
return jsonReturn(-3,$e->getMessage());
}
CacheService::clear();
return json($res);
}
/**
* 显示指定的资源
*
*/
public function read(ContentService $contentService): \think\response\Json
{
$param = request()->only(['id','module_id','website_id','lang']);
try {
validate(ContentValidate::class)->scene('read')->check($param);
}catch(ValidateException $e){
return jsonReturn(-422,$e->getError());
}
$param['seller_id'] = $this->admin['seller_id'];
try {
$res = $contentService->readContent($param);
} catch (ModelEmptyException | ModelException $e) {
return jsonReturn(50025,$e->getMessage());
}
return $res;
}
/**
* 保存更新的资源
*
* @return \think\Response
*/
public function update(ContentService $contentService): \think\Response
{
if(!request()->isPost()){
return jsonReturn(-2,lang('请求方法错误'));
}
$param = input('post.');
try{
validate(ContentValidate::class)->scene('update')->check($param);
}catch (ValidateException $e){
return jsonReturn(422, $e->getError());
}
$param['admin'] = $this->admin;
if(empty($param['sub_content']['publish_time'])){
$param['sub_content']['publish_time'] = date('Y-m-d H:i:s',time());
}
try {
$res = $contentService->updateContent($param);
} catch (ModelEmptyException | ModelException $e) {
return jsonReturn(-3,$e->getMessage());
}
CacheService::clear();
return $res;
}
/**
* 删除指定资源
*
*/
public function delete(ContentService $contentService): \think\response\Json
{
$param = request()->only(['id','module_id']);
try {
validate(ContentValidate::class)->scene('delete')->check($param);
}catch(ValidateException $e){
return jsonReturn(-422,$e->getMessage());
}
$param['seller_id'] = $this->admin['seller_id'];
$param['admin_id'] = $this->admin['uid'];
$param['name'] = $this->admin['name'];
CacheService::clear();
return $contentService->deleteContent($param);
}
public function mainContent(ContentService $contentService): \think\response\Json
{
if(!request()->isGet()){
return jsonReturn(-1,lang('请求方法错误'));
}
$param = request()->param(['module_id','website_id','page','limit']);
try {
validate(ContentValidate::class)->scene('mainContent')->check($param);
}catch(ValidateException $e){
return jsonReturn(-422,$e->getMessage());
}
$limit = (int)input('param.limit') ?: 10;
$param = [
'seller_id' => $this->admin['seller_id'],
'website_id' => $param['website_id'],
'module_id' => $param['module_id'],
'limit' => $limit,
];
try {
$res = $contentService->mainContent($param);
} catch (ModelEmptyException | ModelException | DbException $e) {
return jsonReturn(50013,$e->getMessage());
}
return $res;
}
/**
* 修改置顶
* @throws ModelException
*/
public function topOpt(ContentService $contentService): \think\response\Json
{
if(request()->isPost()){
$param = input('post.');
try {
validate(ContentValidate::class)->scene('topOpt')->check($param);
}catch(ValidateException $e){
return jsonReturn(-422,$e->getMessage());
}
$param['seller_id'] = $this->admin['seller_id'];
return $contentService->topOpt($param);
}
return jsonReturn(-1,lang('请求方法错误'));
}
/**
* 推荐和修改状态
* @throws ModelException
*/
public function recommendAndStatus(ContentService $contentService): \think\response\Json
{
if(request()->isPost()){
$param = input('post.');
try {
validate(ContentValidate::class)->scene('recommendAndStatus')->check($param);
}catch(ValidateException $e){
return jsonReturn(-422,$e->getMessage());
}
$param['seller_id'] = $this->admin['seller_id'];
CacheService::clear();
return $contentService->recommendAndStatus($param);
}
return jsonReturn(-1,lang('请求方法错误'));
}
public function moduleContent(ContentService $contentService): \think\response\Json
{
// 关联内容
$table = input('param.table');
// $field = input('param.field');
if(empty($table)){
return jsonReturn(-1,lang('表名不能为空'));
}
// if(empty($field)){
// return jsonReturn(-2,'关联字段不能为空');
// }
$res = $contentService -> getModuleContent($table,$this->admin['seller_id']);
return jsonReturn($res);
}
/**
* excel导入内容
*/
public function importExcel()
{
$lang = $this->request->param('lang/s',"zh");
if(empty($_FILES['file'])){
return jsonReturn(-1,lang("请传入文件"));
}
$fileName = $_FILES['file'];
$temp_file = sys_get_temp_dir();
$config = ['path' => $temp_file];
$excel = new Excel($config);
$tmpName = strrchr($fileName['tmp_name'], '/');
//读取文件
$sheetList = $excel->openFile($tmpName)->sheetList();
if (empty($sheetList)) {
return jsonReturn(-1, lang('上传文件为空'));
}
$sheetData = $excel
->openSheet($sheetList[0], Excel::SKIP_EMPTY_ROW)->getSheetData();
if (!isset($sheetData[1]) || !isset($sheetData[2])) {
return jsonReturn(-1, lang('上传文件为空'));
}
$fieldLocation = array();
foreach ($sheetData[0] as $key => $value) {
$fieldLocation[$value] = $key;
}
unset($sheetData[0]);
$needField = ['标题', '链接', '网站', '类别ID','类别','图片'];
foreach ($needField as $key => $value) {
if (!isset($fieldLocation[$value])) {
return jsonReturn(-1, lang('缺少必要列:') . $value);
}
}
//查询栏目id和内容
$category = Db::name("category")->where(['seller_id'=>$this->admin['seller_id'],'lang'=>$lang])
->column("title","id");
if(empty($category)){
return jsonReturn(-5, lang("请先添加栏目"));
}
try{
$insertData= $files = $filesUrl = $uploadFiles = [];
foreach ($sheetData as $k=>$v){
if(empty($v[0])){
return jsonReturn(-4,lang("标题不能为空"));
}
if(!empty($v[5]) && !preg_match('/(http:\/\/)|(https:\/\/)/i', $v[5])){
return jsonReturn(-4,lang("图片格式错误"));
}
if(empty($category[$v[3]])){
return jsonReturn(-4,$v[3].lang('对应的分类不存在')."[{$v[4]}]");
}
if (!empty($v[5]) && !in_array(trim($v[5]),$files)){
$files[]=trim($v[5]);
$uploadFiles[$k]['url'] = trim($v[5]);
$uploadFiles[$k]['seller_id'] = $this->admin['seller_id'];
$uploadFiles[$k]['name'] = $v[4];
$uploadFiles[$k]['type'] = 2;
$uploadFiles[$k]['storage'] = 1;
}
$insertData[$k]['seller_id'] = $this->admin['seller_id'];
$insertData[$k]['category_id'] = $v[3];
$insertData[$k]['module_id'] = 1;
$insertData[$k]['lang'] = $lang;
$insertData[$k]['title'] = $v[0];
$insertData[$k]['thumbnail'] = $v[5];
$insertData[$k]['admin_id'] = $this->admin['uid'];
$insertData[$k]['author'] = $v[2];
$insertData[$k]['check_status'] = 3;
$insertData[$k]['url'] = $v[1];
$insertData[$k]['publish_time'] = date("Y-m-d H:i:s");
$insertData[$k]['create_time'] =time();
}
}catch (\Exception $e){
throw new ModelException($e->getMessage(),-1);
}
Db::startTrans();
try{
if(!empty($uploadFiles)){
Db::name("attachment")->insertAll($uploadFiles);
$filesUrl = Db::name("attachment")->where([['url',"in",$files]])->column("id","url");
}
foreach ($insertData as $ki=>$data){
$data['thumbnail'] = isset($filesUrl[$data['thumbnail']])?$filesUrl[$data['thumbnail']]:0;
$sub_id = Db::name("sub_content")->insertGetId($data); //文章的id
Db::name("category_sub_content")->insert([
"seller_id"=>$data['seller_id'],
"category_id"=>$data['category_id'],
"sub_content_id"=>$sub_id,
]);
$mainId = Db::name("article")->insertGetId([
"seller_id"=>$data['seller_id'],
"lang"=>$lang,
"sub_id"=>$sub_id,
"create_time"=>time()
]);
Db::name("sub_content")->where(['id'=>$sub_id])->update(['main_id'=>$mainId]);
}
Db::commit();
}catch (\Exception $e){
Db::rollback();
throw new ModelException($e->getMessage(),-2);
}
return jsonReturn(0,lang('导入成功'));
}
}