You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

312 lines
9.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace app\admin\controller\research;
use app\api\controller\Research;
use app\common\controller\Backend;
use app\admin\library\Auth;
use Exception;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
use PhpOffice\PhpSpreadsheet\Reader\Xls;
use PhpOffice\PhpSpreadsheet\Reader\Csv;
use think\Db;
use think\db\exception\BindParamException;
use think\db\exception\DataNotFoundException;
use think\db\exception\ModelNotFoundException;
use think\exception\DbException;
use think\exception\PDOException;
use think\exception\ValidateException;
use think\response\Json;
use fast\Http;
use think\Cache;
/**
* research
*
* @icon fa fa-circle-o
*/
class Index extends Backend
{
/**
* Index模型对象
* @var \app\admin\model\research\Index
*/
protected $model = null;
public function _initialize()
{
parent::_initialize();
$this->model = new \app\admin\model\research\Index;
$this->view->assign("statusList", $this->model->getStatusList());
}
/**
* 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
* 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
* 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
*/
/**
* 查看
*/
public function index()
{
//当前是否为关联查询
$this->relationSearch = true;
//设置过滤方法
$this->request->filter(['strip_tags', 'trim']);
if ($this->request->isAjax()) {
//如果发送的来源是Selectpage则转发到Selectpage
if ($this->request->request('keyField')) {
return $this->selectpage();
}
list($where, $sort, $order, $offset, $limit) = $this->buildparams();
$list = $this->model
->with(['topic','author'])
->where($where)
->order($sort, $order)
->paginate($limit);
foreach ($list as $row) {
$topic_ids = \app\admin\model\research\Topic::where(['id'=>['in',$row->topic_ids]])->column('title');
$row->topic_ids_text = implode(',',$topic_ids);
$author_ids = \app\admin\model\research\Author::where(['id'=>['in',$row->author]])->column('name');
$row->author_ids_text = implode(',',$author_ids);
}
$result = array("total" => $list->total(), "rows" => $list->items());
return json($result);
}
return $this->view->fetch();
}
/**
* 添加
*
* @return string
* @throws \think\Exception
*/
public function add()
{
if (false === $this->request->isPost()) {
return $this->view->fetch();
}
$params = $this->request->post('row/a');
if (empty($params)) {
$this->error(__('Parameter %s can not be empty', ''));
}
if(count(explode(',',$params['tag'])) > 3){
$this->error(__("Set up to three tag",''));
}
$params = $this->preExcludeFields($params);
if ($this->dataLimit && $this->dataLimitFieldAutoFill) {
$params[$this->dataLimitField] = $this->auth->id;
}
$result = false;
Db::startTrans();
try {
//是否采用模型验证
if ($this->modelValidate) {
$name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
$validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : $name) : $this->modelValidate;
$this->model->validateFailException()->validate($validate);
}
if(!empty($params['status'])){
$params['publishedtime'] = strtotime($params['publishedtime']);
}
if(!empty($params['status'] && $params['status'] == 'Scheduled')){
$params['publishedtime'] = '';
}
$params['content'] = str_replace('background-color:#FFFFFF',' ',$params['content']);
$result = $this->model->allowField(true)->save($params);
Db::commit();
} catch (ValidateException|PDOException|Exception $e) {
Db::rollback();
$this->error($e->getMessage());
}
if ($result === false) {
$this->error(__('No rows were inserted'));
}
$this->success();
}
/**
* 编辑
*
* @param $ids
* @return string
* @throws DbException
* @throws \think\Exception
*/
public function edit($ids = null)
{
$row = $this->model->get($ids);
if (!$row) {
$this->error(__('No Results were found'));
}
$adminIds = $this->getDataLimitAdminIds();
if (is_array($adminIds) && !in_array($row[$this->dataLimitField], $adminIds)) {
$this->error(__('You have no permission'));
}
if (false === $this->request->isPost()) {
$this->view->assign('row', $row);
return $this->view->fetch();
}
$params = $this->request->post('row/a');
if (empty($params)) {
$this->error(__('Parameter %s can not be empty', ''));
}
if(count(explode(',',$params['tag'])) > 3){
$this->error(__("Set up to three tag",''));
}
$params = $this->preExcludeFields($params);
$result = false;
Db::startTrans();
try {
//是否采用模型验证
if ($this->modelValidate) {
$name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
$validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.edit' : $name) : $this->modelValidate;
$row->validateFailException()->validate($validate);
}
if(!empty($params['status'])){
$params['publishedtime'] = strtotime($params['publishedtime']);
}
if(!empty($params['status'] && $params['status'] == 'Scheduled')){
$params['publishedtime'] = '';
}
$params['content'] = str_replace('background-color:#FFFFFF',' ',$params['content']);
$result = $row->allowField(true)->save($params);
Db::commit();
} catch (ValidateException|PDOException|Exception $e) {
Db::rollback();
$this->error($e->getMessage());
}
if (false === $result) {
$this->error(__('No rows were updated'));
}
$this->success();
}
/**
* 删除
*
* @param $ids
* @return void
* @throws DbException
* @throws DataNotFoundException
* @throws ModelNotFoundException
*/
public function del($ids = null)
{
if (false === $this->request->isPost()) {
$this->error(__("Invalid parameters"));
}
$ids = $ids ?: $this->request->post("ids");
if (empty($ids)) {
$this->error(__('Parameter %s can not be empty', 'ids'));
}
$pk = $this->model->getPk();
$adminIds = $this->getDataLimitAdminIds();
if (is_array($adminIds)) {
$this->model->where($this->dataLimitField, 'in', $adminIds);
}
$list = $this->model->where($pk, 'in', $ids)->select();
$count = 0;
Db::startTrans();
try {
foreach ($list as $item) {
$count += $item->save(['status'=>'Delisted']);
}
Db::commit();
} catch (PDOException|Exception $e) {
Db::rollback();
$this->error($e->getMessage());
}
if ($count) {
$this->success();
}
$this->error(__('No rows were deleted'));
}
//Sync Medium
public function syncMedium($ids){
//get research info
$info = $this->model->where(['id'=>$ids])->find();
//get Medium Tokens
$tokens = config('site.medium_tokens');
//get user info
$id = Cache::get('medium_userid');
if(!$id){
$res = $this->getUser($tokens);
if(!isset($res['data'])){
$this->error(__('Sync failed One'));
}
$id = $res['data']['id'];
Cache::set('medium_userid',$res['data']['id']);
}
//create posts
$header = [
CURLOPT_HTTPHEADER => [
'Authorization:Bearer '.$tokens,
'Content-Type:application/json',
]
];
$data = [
'title' =>$info['title'],
'contentFormat' =>'html',
'content' =>$info['content'],
'publishStatus' =>'public',
];
if(!empty($info['tag'])){
$data['tags'] = explode(',',$info['tag']);
}
$api = 'https://api.medium.com/v1/users/'.$id.'/posts';
$res = Http::post($api,json_encode($data),$header);
$res_arr = json_decode($res,true);
if(!isset($res['data'])){
$this->success(__('Sync succeeded'));
}else{
$this->error(__('Sync failed Two'));
}
}
//get user info
public function getUser($tokens){
$api = 'https://api.medium.com/v1/me';
$header = [CURLOPT_HTTPHEADER => ['Authorization:Bearer '.$tokens]];
$res = Http::get($api,[],$header);
$res_arr = json_decode($res,true);
return $res_arr;
}
}