This commit is contained in:
2021-12-01 13:34:38 +08:00
parent 52f73b3bc3
commit dffa07e4eb
22 changed files with 701 additions and 109 deletions

View File

@@ -25,7 +25,7 @@ class IndexController extends AdminController
$filter->equal('categories.id', '所属分类')
->select(Category::selectOptions(function ($model) {
return $model->where('status', 1)
->whereIn('type', [Category::TYPE_ARTICLE, Category::TYPE_SHOW]);
->whereIn('type', [Category::TYPE_ARTICLE, Category::TYPE_SHOW,Category::TYPE_PERSON]);
}, '所有分类'));
});

View File

@@ -81,7 +81,7 @@ class IndexController extends AdminController
$payload .= " [ID:{$branch['id']}] - ";
$payload .= " <strong>{$branch['title']}</strong> ";
$payload .= " <small>{$branch['type']}</small> ";
$payload .= " <small style='color:#999'>{$branch['description']}</small>";
$payload .= " <small style='color:#999'>{$branch['template']}</small>";
return $payload;
});

View File

@@ -0,0 +1,43 @@
<?php
namespace App\Admin\Controllers\Resume;
use App\Models\ResumeGroup;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Form;
use Encore\Admin\Grid;
class GroupController extends AdminController
{
protected $title = '科室管理';
public function grid()
{
$grid = new Grid(new ResumeGroup());
$grid->model()->orderBy('id', 'desc');
$grid->filter(function ($filter) {
$filter->column(1 / 2, function ($filter) {
$filter->like('name', '名称');
});
$filter->disableIdFilter();
});
$grid->column('id', '#ID#');
$grid->column('name', '名称');
$grid->column('status', '状态')->switch();
$grid->column('created_at', '创建时间');
return $grid;
}
public function form(): Form
{
$form = new Form(new ResumeGroup);
$form->text('name', '名称')->rules('min:2')->required();
$form->switch('status', '状态')->default(1);
return $form;
}
}

View File

@@ -0,0 +1,88 @@
<?php
namespace App\Admin\Controllers\Resume;
use App\Models\Category;
use App\Models\Resume;
use App\Models\ResumeGroup;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Form;
use Encore\Admin\Grid;
class IndexController extends AdminController
{
protected $title = '简历管理';
public function grid()
{
$grid = new Grid(new Resume());
$grid->model()->orderBy('id', 'desc');
$grid->filter(function ($filter) {
$filter->column(1 / 2, function ($filter) {
$filter->like('name', '姓名');
$filter->equal('categories.id', '所属分类')
->select(Category::selectOptions(function ($model) {
return $model->where('status', 1)->whereIn('type', [Category::TYPE_PERSON]);
}, '所有分类'));
});
$filter->disableIdFilter();
});
$grid->column('id', '#ID#');
$grid->column('name', '姓名');
$grid->column('cover', '封面图片')->image('', 100);
$grid->column('category.title', '所属分类');
$grid->column('status', '状态')->switch();
$grid->column('created_at', '创建时间');
return $grid;
}
public function form(): Form
{
$form = new Form(new Resume());
$form->text('name', '姓名')->rules('min:2')->required();
$form->textarea('description', '简介');
$form->image('cover', '封面')
->move('person/'.date('Y/m/d'))
->removable()
->uniqueName()
->required();
$form->select('category_id', '所属分类')
->options(function () {
return Category::where('status', 1)->where('type', Category::TYPE_PERSON)->pluck('title', 'id');
})
->required();
$form->select('group_id', '所属科室')
->options(function () {
return ResumeGroup::where('status', 1)->pluck('name', 'id');
})
->required();
$form->embeds('information', '基本信息', function ($form) {
$form->text('duty', '职务');
$form->text('rank', '职称')->required();
$form->text('education', '学历')->required();
$form->text('mobile', '电话')->required();
$form->text('email', '电子邮件')->required();
$form->text('address', '通讯地址')->required();
});
$form->textarea('direction', '研究方向');
$form->ueditor('content', '简历')->rules('required', ['required' => '简历不能为空']);
$form->ueditor('outcome', '代表成果')->rules('required', ['required' => '代表成果不能为空']);
$form->ueditor('project', '承担科研项目情况')->rules('required', ['required' => '承担科研项目情况不能为空']);
$form->datetime('created_at', '发布时间');
$form->switch('status', '状态')->default(1);
return $form;
}
}

View File

@@ -0,0 +1,12 @@
<?php
use Illuminate\Routing\Router;
Route::group([
'prefix' => config('admin.route.prefix'),
'namespace' => config('admin.route.namespace').'\\Resume',
'middleware' => config('admin.route.middleware'),
], function (Router $router) {
$router->resource('persons', 'IndexController');
$router->resource('groups', 'GroupController');
});

View File

@@ -19,3 +19,4 @@ require __DIR__ . '/Routes/article.php';
require __DIR__.'/Routes/category.php';
require __DIR__.'/Routes/link.php';
require __DIR__.'/Routes/advert.php';
require __DIR__.'/Routes/resume.php';

View File

@@ -3,6 +3,7 @@
use App\Models\Advert;
use App\Models\Category;
use App\Models\Article;
use App\Models\Resume;
use Encore\Admin\Config\ConfigModel;
function getConfigList($name, $take = 8)
@@ -41,6 +42,7 @@ function getOneCategory($categoryId, $return = '')
/**
* Notes: 获取文章分类详情
*
* @Author: 玄尘
* @Date : 2020/9/10 13:21
* @param $categoryId
@@ -67,21 +69,21 @@ function getOneArticleBYCate($categoryId, $result = '')
return '';
}
return new Article;
}
/**
* Notes: 获取分类下的文章
*
* @Author: 玄尘
* @Date : 2020/9/10 10:05
* @Date: 2021/12/1 13:27
* @param $categoryId
* @param int $take
* @param string $mark 显示多少当前分类还是当前分类+子分类
* @param bool $hasCover
* @param string $mark
* @param false $hasCover
* @param string $order
* @return \App\Models\Article
* @return mixed
*/
function getArticlesBYCate($categoryId, $take = 8, $mark = 'one', $hasCover = false, $order = 'desc')
function getArticlesBYCate($categoryId, int $take = 8, string $mark = 'one', $hasCover = false, string $order = 'desc')
{
if ($mark == 'one') {
$articles = Article::where('status', 1)
@@ -152,11 +154,18 @@ function getOneAdvertByCate($categoryId, $result = '')
} else {
return '';
}
return new Advert;
}
function getAdvertsByCate($categoryId, $take = 8)
/**
* Notes: 获取广告
*
* @Author: 玄尘
* @Date: 2021/12/1 13:27
* @param $categoryId
* @param int $take
* @return mixed
*/
function getAdvertsByCate($categoryId, int $take = 8)
{
return Advert::where('category_id', $categoryId)
->latest('sort')
@@ -167,18 +176,19 @@ function getAdvertsByCate($categoryId, $take = 8)
/**
* Notes: 根据分类id 获取文章
*
* @Author: 玄尘
* @Date : 2021/5/21 9:45
* @param int $take
* @param false $hasCover
* @return mixed
*/
function getArticlesByCateIds($take = 8, $hasCover = false)
function getArticlesByCateIds(int $take = 8, $hasCover = false)
{
//分院新闻 媒体报道 科研动态 交流合作 党建文化 专题学习
$ids = [7, 17, 8, 5, 12, 30];
$articles = Article::query()->where('status', 1)
return Article::query()->where('status', 1)
->whereHas('categories', function ($q) use ($ids) {
$q->whereIn('id', $ids);
})
@@ -190,12 +200,11 @@ function getArticlesByCateIds($take = 8, $hasCover = false)
->take($take)
->get();
return $articles;
}
/**
* Notes: 获取推荐文章
*
* @Author: 玄尘
* @Date : 2021/4/16 13:31
* @param $postion
@@ -203,12 +212,27 @@ function getArticlesByCateIds($take = 8, $hasCover = false)
*/
function getArticlesByPosition($postion)
{
$articles = Article::ofPosition($postion)
return Article::ofPosition($postion)
->latest('sort')
->latest('created_at')
->take(5)
->get();
return $articles;
}
/**
* Notes: 根据分类获取简历
*
* @Author: 玄尘
* @Date: 2021/12/1 13:28
* @param $category_id
* @param int $take
*/
function getResumesByCate($category_id, $take = 8)
{
return Resume::query()
->where('status', 1)
->where('category_id', $category_id)
->take($take)
->get();
}

View File

@@ -10,6 +10,7 @@ class CategoryController extends Controller
/**
* 显示分类
*
* @param Category $category [description]
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View [type] [description]
*/
@@ -18,10 +19,16 @@ class CategoryController extends Controller
if ($category->type == Category::TYPE_SHOW && $category->article_id) {
return redirect("articles/".$category->article_id);
} else {
$directory = 'category';
$template = 'show';
if ($category->template) {
$template = $category->template;
}
if ($category->type == Category::TYPE_PERSON) {
$directory = 'resume';
}
$articles = $category->relations(Category::TYPE_ARTICLE)
->where('status', 1)
->latest('sort')
@@ -35,7 +42,7 @@ class CategoryController extends Controller
$advert = Advert::where('category_id', 73)->first();
return view('category.' . $template, compact('articles', 'category', 'parent', 'advert'));
return view($directory.'.'.$template, compact('articles', 'category', 'parent', 'advert'));
}
}

View File

@@ -0,0 +1,33 @@
<?php
namespace App\Http\Controllers;
use App\Models\Advert;
use App\Models\Article;
use App\Models\Resume;
use Illuminate\Http\Request;
class ResumeController extends Controller
{
/**
* Notes: 显示详情
*
* @Author: 玄尘
* @Date: 2021/12/1 10:46
* @param \App\Models\Resume $resume
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function show(Resume $resume)
{
$category = $resume->category;
$parent = $category;
if ($category->childrens->isEmpty() && $category->parent) {
$parent = $category->parent;
}
return view('resume.show', compact('resume', 'category','parent'));
}
}

View File

@@ -14,10 +14,12 @@ class Category extends Model
public const TYPE_SHOW = 'show';
public const TYPE_ARTICLE = 'article';
public const TYPE_ADVERT = 'advert';
public const TYPE_PERSON = 'person';
public const TYPES = [
self::TYPE_ARTICLE => '文章列表',
self::TYPE_SHOW => '文章详情',
self::TYPE_ADVERT => '图片',
self::TYPE_PERSON => '简历',
];
public function getLinkAttribute()
@@ -27,6 +29,7 @@ class Category extends Model
/**
* 关联的数据
*
* @return [type] [description]
*/
public function relations()
@@ -41,6 +44,9 @@ class Category extends Model
case self::TYPE_ADVERT:
return $this->hasMany(Advert::class);
break;
case self::TYPE_PERSON:
return $this->hasMany(Resume::class);
break;
default:
return null;
}
@@ -63,6 +69,7 @@ class Category extends Model
/**
* Notes: 获取当前分类及子分类ID
*
* @Author: <C.Jason>
* @Date : 2020/4/6 3:12 下午
* @return array

65
app/Models/Resume.php Normal file
View File

@@ -0,0 +1,65 @@
<?php
namespace App\Models;
use App\Models\Traits\HasOneCover;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Support\Arr;
class Resume extends Model
{
use HasOneCover;
protected $casts = [
'information' => 'json'
];
/***
* Notes: 所属分类
*
* @Author: 玄尘
* @Date: 2021/12/1 9:57
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function category(): BelongsTo
{
return $this->belongsTo(Category::class);
}
/**
* Notes: 所属科室
*
* @Author: 玄尘
* @Date: 2021/12/1 9:58
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function group(): BelongsTo
{
return $this->belongsTo(ResumeGroup::class);
}
/**
* Notes: 跳转链接
*
* @Author: 玄尘
* @Date: 2021/12/1 13:11
* @return string
*/
public function getLinkAttribute(): string
{
return route('resume.show', $this);
}
/**
* Notes: 获取基础数据
*
* @Author: 玄尘
* @Date: 2021/12/1 13:11
* @param $key
* @param string $default
*/
public function getInformation($key, string $default = '')
{
return Arr::get($this->information, $key, $default);
}
}

View File

@@ -0,0 +1,8 @@
<?php
namespace App\Models;
class ResumeGroup extends Model
{
}

View File

@@ -27,8 +27,11 @@ class AppServiceProvider extends ServiceProvider
public function boot()
{
$table = config('admin.extensions.config.table', 'admin_config');
if (! $this->app->runningInConsole()) {
if (Schema::hasTable($table)) {
Config::load();
}
}
}
}

View File

@@ -0,0 +1,41 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateResumesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('resumes', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('category_id')->index();
$table->unsignedBigInteger('group_id')->index();
$table->string('name');
$table->string('cover');
$table->json('information')->comment('基本信息');
$table->text('content')->comment('简历');
$table->string('direction')->comment('研究方向');
$table->text('outcome')->comment('代表成果');
$table->text('project')->comment('承担科研项目情况');
$table->boolean('status')->default(1);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('resumes');
}
}

View File

@@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateResumeGroupsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('resume_groups', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->boolean('status')->default(1);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('resume_groups');
}
}

View File

@@ -0,0 +1,54 @@
@extends('layouts.app')
@section('title', '首页')
@section('content')
<!-- 科学研究 -->
<div class="survey" style="background-image: url(/assets/index/images/studyBack.png);">
<div class="container">
<div class="row">
@include('category.left')
<div class="col-xs-12 col-md-9 secondRight">
<!-- 科研动态 -->
<div class="surveyCont">
<div class="secondTop">
<div class="secondTop-name">
<img src="/assets/index/images/studyIcon_00.png"/>
{{ $category->title }}
</div>
</div>
@if ($articles->isNotEmpty())
<ul class="dateExtend">
@foreach ($articles as $article)
<li>
<a href="{{ $article->link }}" target="_blank">
<div class="ce-img cxtdExtend-img">
<span style="background-image: url({{ $article->cover_path }});"></span>
</div>
<div class="dateExtend-right cxtdExtend-right">
<div class="ce-nowrap indexExtend-ul-name">
{{ $article->title }}
</div>
<div class="ce-nowrap-multi indexExtend-ul-text">
{{ $article->description }}
</div>
</div>
</a>
</li>
@endforeach
</ul>
<!-- 分页 -->
{{ $articles->links('layouts.pagination') }}
@else
<div class="no-searchCont">
<img src="/assets/index/images/org55.png"/>
<span>抱歉,暂无数据</span>
</div>
@endif
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -17,8 +17,8 @@
{{ $category->title }}
</div>
</div>
<ul class="dateExtend">
@if ($articles->isNotEmpty())
<ul class="dateExtend">
@foreach ($articles as $article)
<li>
<a href="{{ $article->link }}" target="_blank">
@@ -38,13 +38,14 @@
</a>
</li>
@endforeach
@endif
</ul>
<!-- 分页 -->
@if ($articles->isNotEmpty())
{{ $articles->links('layouts.pagination') }}
@else
<div class="no-searchCont">
<img src="/assets/index/images/org55.png"/>
<span>抱歉,暂无数据</span>
</div>
@endif
</div>
</div>

View File

@@ -57,10 +57,10 @@
</div>
<div class="swiper-container indexBuild-swiper swiper-container-vertical">
<div class="swiper-wrapper">
@if (getArticlesBYCate(28,36)->isNotEmpty())
@foreach (getArticlesBYCate(28,36) as $article)
<div class="swiper-slide">{{ $article->title }}
<span>{{ $article->description }}</span>
@if (getResumesByCate(28,36)->isNotEmpty())
@foreach (getResumesByCate(28,36) as $resume)
<div class="swiper-slide">{{ $resume->name }}
<span>{{ $resume->description }}</span>
</div>
@endforeach
@endif
@@ -80,22 +80,14 @@
</a>
</div>
<ul class="second-IndexExpert IndexExpertNew" style="margin: 0">
@if (getArticlesBYCate(29,6)->isNotEmpty())
@foreach (getArticlesBYCate(29,6) as $article)
@if (getResumesByCate(29,6)->isNotEmpty())
@foreach (getResumesByCate(29,6) as $resume)
<li>
<a href="{{ $article->link }}" target="_blank">
<a href="{{ $resume->link }}" target="_blank">
<div class="IndexExpertNew-li">
<span class="IndexExpertNew-tips">客座教授</span>
<div class="IndexExpertNew-title">{{ $article->title }}</div>
<div class="IndexExpertNew-title">{{ $resume->name }}</div>
</div>
<!-- <div class="ce-img IndexExpert-img">
<span style="background-image: url({{ $article->cover_path }});"></span>
</div>
<div class="IndexExpert-name">
<div class="IndexExpert-title">
<span>{{ $article->title }}</span>{{ $article->description }}
</div>
</div> -->
</a>
</li>
@endforeach

View File

@@ -0,0 +1,82 @@
@extends('layouts.app')
@section('title', '详情')
@section('content')
<!-- 科学研究 -->
<div class="survey" style="background-image: url(/assets/index/images/studyBack.png);">
<div class="container">
<div class="row">
@include('category.left')
<div class="col-xs-12 col-md-9 secondRight">
<!-- 科研动态 -->
<div class="surveyCont">
<div class="secondTop">
<div class="secondTop-name">
<img src="/assets/index/images/studyIcon_00.png"/>
{{ $category->title }}
</div>
</div>
<div class="tdrcTop">
<div class="tdrcBrief">
<div class="tdrcBrief-name"><span>{{ $resume->name }}</span></div>
<ul class="tdrcBrief-label">
@if($resume->getInformation('duty'))
<li>
<span>职务:</span>{{ $resume->getInformation('duty') }}
</li>
@endif
<li>
<span>职称:</span>{{ $resume->getInformation('rank') }}
</li>
<li>
<span>学历:</span>{{ $resume->getInformation('education') }}
</li>
<li>
<span>电话:</span>{{ $resume->getInformation('mobile') }}
</li>
<li>
<span>电子邮件:</span>{{ $resume->getInformation('email') }}
</li>
<li>
<span>通讯地址:</span>{{ $resume->getInformation('address') }}
</li>
</ul>
</div>
<div class="ce-img tdrcImg">
<span style="background-image: url({{ $resume->cover_path }});"></span>
</div>
</div>
<div class="tdrcCont">
<div class="tdrcCont-label">
<div class="tdrcCont-title">简历</div>
<div class="tdrcCont-text">
{!! $resume->content !!}
</div>
</div>
<div class="tdrcCont-label">
<div class="tdrcCont-title">研究方向</div>
<div class="tdrcCont-text">
{{ $resume->direction }}
</div>
</div>
<div class="tdrcCont-label">
<div class="tdrcCont-title">代表成果</div>
<div class="tdrcCont-text">
{!! $resume->outcome !!}
</div>
</div>
<div class="tdrcCont-label">
<div class="tdrcCont-title">承担科研项目情况</div>
<div class="tdrcCont-text">
{!! $resume->project !!}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,46 @@
@extends('layouts.app')
@section('title', '首页')
@section('content')
<!-- 科学研究 -->
<div class="survey" style="background-image: url(/assets/index/images/studyBack.png);">
<div class="container">
<div class="row">
@include('category.left')
<div class="col-xs-12 col-md-9 secondRight">
<!-- 科研动态 -->
<div class="surveyCont">
<div class="secondTop">
<div class="secondTop-name">
<img src="/assets/index/images/studyIcon_00.png"/>
{{ $category->title }}
</div>
</div>
@if ($articles->isNotEmpty())
@foreach($articles->groupBy('group_id') as $resumes)
<div class="tdrcList">
<div class="tdrcList-title">
{{ $resumes->first()->group->name }}
</div>
<ul class="row tdrcList-label">
@foreach($resumes as $resume)
<li class="col-xs-6 col-md-3">
<a href="{{ $resume->link }}">{{ $resume->name }}</a>
</li>
@endforeach
</ul>
</div>
@endforeach
@else
<div class="no-searchCont">
<img src="/assets/index/images/org55.png"/>
<span>抱歉,暂无数据</span>
</div>
@endif
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,49 @@
@extends('layouts.app')
@section('title', '首页')
@section('content')
<!-- 科学研究 -->
<div class="survey" style="background-image: url(/assets/index/images/studyBack.png);">
<div class="container">
<div class="row">
@include('category.left')
<div class="col-xs-12 col-md-9 secondRight">
<!-- 科研动态 -->
<div class="surveyCont">
<div class="secondTop">
<div class="secondTop-name">
<img src="/assets/index/images/studyIcon_00.png"/>
{{ $category->title }}
</div>
</div>
@if ($articles->isNotEmpty())
<ul class="indexExtend-ul studyExtend">
@foreach ($articles as $article)
<li>
<a href="{{ $article->link }}" target="_blank">
<div class="ce-nowrap indexExtend-ul-name">
{{ $article->name }}
</div>
<div class="ce-nowrap-multi indexExtend-ul-text">
{{ $article->description }}
</div>
</a>
</li>
@endforeach
</ul>
<!-- 分页 -->
{{ $articles->links('layouts.pagination') }}
@else
<div class="no-searchCont">
<img src="/assets/index/images/org55.png"/>
<span>抱歉,暂无数据</span>
</div>
@endif
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -16,7 +16,10 @@ Route::get('search', 'ArticleController@search')->name('article.search');
Route::get('category/{category}', 'CategoryController@index')->name('category.show');
Route::get('resume/{resume}', 'ResumeController@show')->name('resume.show');
//以下为导入数据
Route::get('test', 'TestController@index');
Route::get('test/set_category', 'TestController@set_category');
Route::get('test/set_article', 'TestController@set_article');
Route::get('test/set_cate_article', 'TestController@setCateArticle');