Procházet zdrojové kódy

留言功能完成

sys před 3 roky
rodič
revize
c2ef43b3c0

+ 38 - 0
app/Http/Controllers/Api/NewsController.php

@@ -6,6 +6,8 @@ namespace App\Http\Controllers\Api;
 
 use App\Http\Controllers\FrontController;
 use App\Models\Banner;
+use App\Models\Member;
+use App\Models\Message;
 use App\Models\Notice;
 use App\Servers\CommonServer;
 use App\Servers\RedisDataServer;
@@ -87,4 +89,40 @@ class NewsController extends FrontController
     }
 
 
+    /**
+     * 添加留言
+     * @return \Illuminate\Http\JsonResponse
+     */
+    function addMsg(){
+        $content=CommonServer::creatServer()->filtrationStr('content','');
+        if(empty($content)){
+            return $this->apiResponseError('请输入留言内容');
+        }
+        $m_id = request()->member['id'];
+        $nickname = Member::where('id',$m_id)->value('nickname');
+        $msg=Message::create([
+            'm_id' => $m_id,
+            'username' => $nickname,
+            'content' => $content,
+            'reply' => '',
+            'show' => '1',
+        ]);
+        if(empty($msg)){
+            return $this->apiResponseError('留言失败');
+        }else{
+            return $this->apiResponseSuccess('留言成功',$msg);
+        }
+
+    }
+
+    /**
+     * 获取留言列表
+     * @return \Illuminate\Http\JsonResponse
+     */
+    function getMsgList(){
+        $m_id = request()->member['id'];
+        $list=Message::where('m_id',$m_id)->where('show',1)->paginate(20);
+        return $this->apiResponseSuccess('',['total'=>$list->total(),'items'=>$list->items()]);
+    }
+
 }

+ 82 - 0
app/Http/Controllers/Message/MessagesController.php

@@ -0,0 +1,82 @@
+<?php
+
+namespace App\Http\Controllers\Message;
+
+use App\Http\Controllers\AdminBaseController;
+use App\Http\Requests\MessageCreateRequest;
+use App\Http\Requests\MessageUpdateRequest;
+use App\Repositories\Eloquent\MessageRepositoryEloquent;
+use App\Validators\MessageValidator;
+
+/**
+ * Class MessagesController.
+ *
+ * @package namespace App\Http\Controllers;
+ */
+class MessagesController extends AdminBaseController
+{
+    /**
+     * @var MessageRepositoryEloquent
+     */
+    protected $repository;
+
+    /**
+     * @var MessageValidator
+     */
+    protected $validator;
+
+    /**
+     * MessagesController constructor.
+     *
+     * @param MessageRepositoryEloquent $repository
+     * @param MessageValidator $validator
+     */
+    public function __construct(MessageRepositoryEloquent $repository, MessageValidator $validator)
+    {
+        parent::__construct($repository, $validator);
+    }
+
+    /**
+     * 数据检索
+     */
+     public function _indexScopeQuery()
+        {
+            $where = [];
+            $search = explode(";", request()->input('search', ""));
+            $start = $end = null;
+            $fieldSearchable=$this->repository->getFieldsSearchable();
+            foreach ($search as $value) {
+                if (!empty($value)) {
+                    list($one, $tow) = explode(":", $value);
+                    if (!empty($fieldSearchable[$one])) {
+                        if($fieldSearchable[$one]=='like')$tow="%{$tow}%";
+                        $where[]=[$one,$fieldSearchable[$one],$tow];
+                    } elseif ($one == 'start') {
+                        $start = $tow . " 00:00:00";
+                    } elseif ($one == 'end') {
+                        $end = $tow . " 23:59:59";
+                    } else {
+                        continue;
+                    }
+                }
+            }
+            return function ($query) use ($where, $start, $end) {
+
+                if ($start) $where[] = ['created_at', '>=', $start];
+                if ($end) $where[] = ['created_at', '<=', $end];
+                if ($where) {
+                    $query->where($where);
+                }
+
+            };
+        }
+
+   /**
+     * 数据更新
+     */
+    protected function _indexPost($datum)
+    {
+        return $datum;
+    }
+
+}

+ 13 - 15
app/Http/Middleware/MemberAuthMiddleware.php

@@ -36,37 +36,35 @@ class MemberAuthMiddleware
     {
         //验证会员授权信息
         $clientRoute = request()->route()->getName();
+        $token=request()->header('Authorization');
+        if(empty($token)){
+            $token = $request->input('token','');
+        }
         if (!in_array($clientRoute, $this->noAuth)) {
-            $m_id = $request->input('m_id','5');
-            $token = $request->input('token','04c97f7287eb8242ca0fc3cc41b7b555');
-            if (empty($m_id) || empty($token) || !is_numeric($m_id)) {
+            if ( empty($token) ) {
                 throw new MemberAuthException('缺少认证信息', 401);
             }
-            $member = RedisDataServer::creatServer()->getData( 'login_' . $m_id, 'json');
+            $member = RedisDataServer::creatServer()->getData( 'login_' . $token, 'json');
             if (empty($member)) {
-                $member = Member::where('id', $m_id)->where('status',1)->select(['id', 'phone', 'nickname', 'status', 'token_str', 'level_id', 'source'])->first();
+                $member = Member::where('token_str', $token)->where('status',1)->select(['id', 'address', 'status', 'token_str', 'level_id'])->first();
 
                 if(empty($member)){
                     throw new MemberAuthException('认证信息已过期', 401);
                 }
             }
-            if ($member['token_str'] != $token) {
-                throw new MemberAuthException('认证信息已过期', 401);
-            }
+
             //用户信息缓存30秒
-            RedisDataServer::creatServer()->setData($token . '_' . $m_id, $member, 'json', 300);
+            RedisDataServer::creatServer()->setData($token . '_' . $token, $member, 'json', 300);
             $request->member = $member;
         }else{
-            $m_id = $request->input('m_id','');
-            $token = $request->input('token','');
-            if($m_id && $token){
-                $member = RedisDataServer::creatServer()->getData( 'login_' . $m_id, 'json');
+            if( $token){
+                $member = RedisDataServer::creatServer()->getData( 'login_' . $token, 'json');
                 if (empty($member)) {
-                    $member = Member::where('id', $m_id)->where('status',1)->select(['id', 'phone', 'nickname', 'status', 'token_str', 'level_id', 'source'])->first();
+                    $member = Member::where('token_str', $token)->where('status',1)->select(['id', 'address',  'status', 'token_str', 'level_id'])->first();
                 }
                 //用户信息缓存30秒
                 if($member){
-                    RedisDataServer::creatServer()->setData($token . '_' . $m_id, $member, 'json', 300);
+                    RedisDataServer::creatServer()->setData('login_' . $token, $member, 'json', 300);
                     $request->member = $member;
                 }else{
                     $request->member = ['id'=>0];

+ 30 - 0
app/Http/Requests/MessageCreateRequest.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace App\Http\Requests;
+
+use Illuminate\Foundation\Http\FormRequest;
+
+class MessageCreateRequest extends FormRequest
+{
+    /**
+     * Determine if the user is authorized to make this request.
+     *
+     * @return bool
+     */
+    public function authorize()
+    {
+        return false;
+    }
+
+    /**
+     * Get the validation rules that apply to the request.
+     *
+     * @return array
+     */
+    public function rules()
+    {
+        return [
+            //
+        ];
+    }
+}

+ 30 - 0
app/Http/Requests/MessageUpdateRequest.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace App\Http\Requests;
+
+use Illuminate\Foundation\Http\FormRequest;
+
+class MessageUpdateRequest extends FormRequest
+{
+    /**
+     * Determine if the user is authorized to make this request.
+     *
+     * @return bool
+     */
+    public function authorize()
+    {
+        return false;
+    }
+
+    /**
+     * Get the validation rules that apply to the request.
+     *
+     * @return array
+     */
+    public function rules()
+    {
+        return [
+            //
+        ];
+    }
+}

+ 1 - 1
app/Models/Member.php

@@ -100,7 +100,7 @@ class Member extends Model implements Transformable
      */
     public function recomMember()
     {
-        return $this->hasOne('App\Models\Member', 'id', 'recom_id')->select(['id', 'nickname','phone']);
+        return $this->hasOne('App\Models\Member', 'id', 'recom_id')->select(['id', 'nickname']);
     }
 
 }

+ 45 - 0
app/Models/Message.php

@@ -0,0 +1,45 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+use Prettus\Repository\Contracts\Transformable;
+use Prettus\Repository\Traits\TransformableTrait;
+
+/**
+ * Class Message.
+ *
+ * @package namespace App\Models;
+ * @property int $id
+ * @property int $m_id m_id
+ * @property string $username username
+ * @property string $content content
+ * @property string $reply reply
+ * @property int $show show
+ * @property \Illuminate\Support\Carbon|null $created_at
+ * @property \Illuminate\Support\Carbon|null $updated_at
+ * @method static \Illuminate\Database\Eloquent\Builder|Message newModelQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|Message newQuery()
+ * @method static \Illuminate\Database\Eloquent\Builder|Message query()
+ * @method static \Illuminate\Database\Eloquent\Builder|Message whereContent($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Message whereCreatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Message whereId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Message whereMId($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Message whereReply($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Message whereShow($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Message whereUpdatedAt($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Message whereUsername($value)
+ * @mixin \Eloquent
+ */
+class Message extends Model implements Transformable
+{
+    use TransformableTrait;
+
+    /**
+     * The attributes that are mass assignable.
+     *
+     * @var array
+     */
+    protected $guarded = ['id', 'updated_at', 'created_at'];
+
+}

+ 24 - 0
app/Presenters/MessagePresenter.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace App\Presenters;
+
+use App\Transformers\MessageTransformer;
+use Prettus\Repository\Presenter\FractalPresenter;
+
+/**
+ * Class MessagePresenter.
+ *
+ * @package namespace App\Presenters;
+ */
+class MessagePresenter extends FractalPresenter
+{
+    /**
+     * Transformer
+     *
+     * @return \League\Fractal\TransformerAbstract
+     */
+    public function getTransformer()
+    {
+        return new MessageTransformer();
+    }
+}

+ 1 - 0
app/Providers/RepositoryServiceProvider.php

@@ -46,6 +46,7 @@ class RepositoryServiceProvider extends ServiceProvider
         $this->app->bind(\App\Repositories\BlockInfoRepository::class, \App\Repositories\Eloquent\BlockInfoRepositoryEloquent::class);
         $this->app->bind(\App\Repositories\BlockItemsRepository::class, \App\Repositories\Eloquent\BlockItemsRepositoryEloquent::class);
         $this->app->bind(\App\Repositories\BroadcastRepository::class, \App\Repositories\Eloquent\BroadcastRepositoryEloquent::class);
+        $this->app->bind(\App\Repositories\MessageRepository::class, \App\Repositories\Eloquent\MessageRepositoryEloquent::class);
         //:end-bindings:
     }
 }

+ 57 - 0
app/Repositories/Eloquent/MessageRepositoryEloquent.php

@@ -0,0 +1,57 @@
+<?php
+
+namespace App\Repositories\Eloquent;
+
+use Prettus\Repository\Eloquent\BaseRepository;
+use Prettus\Repository\Criteria\RequestCriteria;
+use App\Repositories\MessageRepository;
+use App\Models\Message;
+use App\Validators\MessageValidator;
+
+/**
+ * Class MessageRepositoryEloquent.
+ *
+ * @package namespace App\Repositories\Eloquent;
+ */
+class MessageRepositoryEloquent extends BaseRepository implements MessageRepository
+{
+    /**
+     * 查询检索的字段
+     *
+     * @return string
+     */
+    protected $fieldSearchable = [
+        'id'                => '=',
+    ];
+
+    /**
+     * Specify Model class name
+     *
+     * @return string
+     */
+    public function model()
+    {
+        return Message::class;
+    }
+
+    /**
+    * Specify Validator class name
+    *
+    * @return mixed
+    */
+    public function validator()
+    {
+
+        return MessageValidator::class;
+    }
+
+
+    /**
+     * Boot up the repository, pushing criteria
+     */
+    public function boot()
+    {
+        // $this->pushCriteria(app(RequestCriteria::class));
+    }
+
+}

+ 15 - 0
app/Repositories/MessageRepository.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace App\Repositories;
+
+use Prettus\Repository\Contracts\RepositoryInterface;
+
+/**
+ * Interface MessageRepository.
+ *
+ * @package namespace App\Repositories;
+ */
+interface MessageRepository extends RepositoryInterface
+{
+    //
+}

+ 1 - 0
app/Servers/MemberServer.php

@@ -110,6 +110,7 @@ class MemberServer
         if ($password) {
             $member_info = $pass_server->creatPassword();
         }
+        $member_info['nickname'] = '游客';
         $member_info['address'] = $address;
         $member_info['invite_code'] = $pass_server->getInviteCode();
 

+ 33 - 0
app/Transformers/MessageTransformer.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace App\Transformers;
+
+use League\Fractal\TransformerAbstract;
+use App\Models\Message;
+
+/**
+ * Class MessageTransformer.
+ *
+ * @package namespace App\Transformers;
+ */
+class MessageTransformer extends TransformerAbstract
+{
+    /**
+     * Transform the Message entity.
+     *
+     * @param \App\Models\Message $model
+     *
+     * @return array
+     */
+    public function transform(Message $model)
+    {
+        return [
+            'id'         => (int) $model->id,
+
+            /* place your other model properties here */
+
+            'created_at' => $model->created_at,
+            'updated_at' => $model->updated_at
+        ];
+    }
+}

+ 24 - 0
app/Validators/MessageValidator.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace App\Validators;
+
+use \Prettus\Validator\Contracts\ValidatorInterface;
+use \Prettus\Validator\LaravelValidator;
+
+/**
+ * Class MessageValidator.
+ *
+ * @package namespace App\Validators;
+ */
+class MessageValidator extends LaravelValidator
+{
+    /**
+     * Validation Rules
+     *
+     * @var array
+     */
+    protected $rules = [
+        ValidatorInterface::RULE_CREATE => [],
+        ValidatorInterface::RULE_UPDATE => [],
+    ];
+}

+ 38 - 0
database/migrations/2022_10_18_154046_create_messages_table.php

@@ -0,0 +1,38 @@
+<?php
+
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+/**
+ * Class CreateMessagesTable.
+ */
+class CreateMessagesTable extends Migration
+{
+	/**
+	 * Run the migrations.
+	 *
+	 * @return void
+	 */
+	public function up()
+	{
+		Schema::create('messages', function(Blueprint $table) {
+            $table->increments('id');
+            $table->integer('m_id')->default('0')->comment('m_id');
+            $table->string('username')->default('')->comment('username');
+            $table->string('content')->default('')->comment('content');
+            $table->string('reply')->default('')->comment('reply');
+            $table->integer('show')->default('0')->comment('show');
+            $table->timestamps();
+		});
+	}
+
+	/**
+	 * Reverse the migrations.
+	 *
+	 * @return void
+	 */
+	public function down()
+	{
+		Schema::drop('messages');
+	}
+}

+ 85 - 0
resources/views/admins/messages/create.blade.php

@@ -0,0 +1,85 @@
+<div style="margin-top: 10px;" id="messages-app">
+    <div style="text-align: center;margin-top: 5px;margin-bottom: 10px;font-size: 20px;">
+        新增 - Message
+    </div>
+    <el-form action="{{route('admin.message.save')}}" method="post" id="form-create">
+        <!-- image -->
+        <ui-file label="图片(686*128)" size="0.5" name="image" :data="{uploadName:'messages'}" tips="图片建议(686*128)"></ui-file>
+        <!-- link -->
+{{--        <ui-input-text label="message链接" name="link" placeholder="message跳转链接" maxlength="255" tips="请输入有效的链接" autofocus="true"></ui-input-text>--}}
+        <!-- show -->
+        <ui-radio label="是否开启" :params="params" tips="控制前台是否显示"></ui-radio>
+        <!-- sort -->
+        <ui-input-number label="排序" checked="checked" value="50" name="sort" min="1" max="100" tips="控制前台显示顺序"></ui-input-number>
+        <ui-submit></ui-submit>
+    </el-form>
+</div>
+
+<script type="application/javascript">
+    $(function () {
+        // 注意:Vue组件一定放在jQuery.validator前面验证
+        new Vue({
+            el: '#messages-app',
+            data :function () {
+                return {
+                    params: {
+                        // 注意:group和attr连个属性都不能省略 就算为空
+                        group: {},
+                        attr: {
+                            name: 'status',   // 当前checkbox框的name属性  【必填】
+                            radioCheck:1,   // 当前选中项 int | string   【必填】
+                            label: 'el-radio-button', // 当前样式 默认 el-radio 样式 【非必填】
+                            radios: [ // 每个checkbox 就是一个json对象     【必填】
+                                {
+                                    value:0,      // 当前选中时值也就是value属性的值      【必填】
+                                    label: '关闭',    // 当前提示文字                 【必填】
+                                    disable: false   // 是否禁止点击 默认:false 不禁止
+                                },
+                                {
+                                    value:1,      // 当前选中时值也就是value属性的值      【必填】
+                                    label: '开启',    // 当前提示文字                 【必填】
+                                    disable: false   // 是否禁止点击 默认:false 不禁止
+                                }
+                            ]
+                        }
+                    }
+                };
+            }
+        });
+        jQuery.validator.setDefaults({
+            debug: false,         // 调试模式true不会提交,false允许提交
+            success: "success",   // 匹配成功的class样式名称
+            errorElement: 'div'   // 兼容el标签时使用(兼容el Vue组件label.error标签问题)
+        });
+        // 前台数据验证 验证需要设置window.form全局变量
+        window.form = $('#form-create').validate({
+            rules: {
+                image: {
+                    required: true,
+                    maxlength: 255,
+                    normalizer: function ( value ) {
+                        return $.trim(value);
+                    }
+                },
+                // link: {
+                //     required: true,
+                //     url:true,
+                //     maxlength: 255,
+                //     normalizer: function ( value ) {
+                //         return $.trim(value);
+                //     }
+                // },
+                show: {
+                    required: true
+                },
+                sort: {
+                    required: true,
+                    normalizer: function ( value ) {
+                        return $.trim(value);
+                    }
+                }
+            }
+        });
+    });
+</script>
+@include('layouts.admin.form_script')

+ 86 - 0
resources/views/admins/messages/edit.blade.php

@@ -0,0 +1,86 @@
+<div style="margin-top: 10px;" id="messages-app">
+    <div style="text-align: center;margin-top: 5px;margin-bottom: 10px;font-size: 20px;">
+        编辑Message
+    </div>
+    <el-form action="{{route('admin.message.update',array('id'=>$model->id))}}" method="post" id="form-create">
+        <!-- 图片 -->
+        <ui-file label="图片(686*128)" size="0.5" name="image" :data="{uploadName:'messages'}" imageurl="{{$model->image}}" tips="图片大小建议(686*128)"></ui-file>
+        <!-- 链接 -->
+{{--        <ui-input-text label="链接" name="link" value="{{$model->link}}" placeholder="跳转链接" maxlength="255" tips="请输入有效的链接" autofocus="true"></ui-input-text>--}}
+        <!-- 是否显示 -->
+        <ui-radio label="是否开启" :params="params" tips="控制前台是否显示"></ui-radio>
+        <!-- 排序 -->
+        <ui-input-number label="排序" checked="checked" name="sort" value="{{$model->sort}}" min="1" max="100" tips="控制前台显示顺序"></ui-input-number>
+        <ui-submit></ui-submit>
+    </el-form>
+</div>
+
+<script type="application/javascript">
+    $(function () {
+        // 注意:Vue组件一定放在jQuery.validator前面验证
+        new Vue({
+            el: '#messages-app',
+            data :function () {
+                return {
+                    params: {
+                        // 注意:group和attr连个属性都不能省略 就算为空
+                        group: {},
+                        attr: {
+                            name: 'status',   // 当前checkbox框的name属性  【必填】
+                            radioCheck:{{$model->status}},   // 当前选中项 int | string   【必填】
+                            label: 'el-radio-button', // 当前样式 默认 el-radio 样式 【非必填】
+                            radios: [ // 每个checkbox 就是一个json对象     【必填】
+                                {
+                                    value:0,      // 当前选中时值也就是value属性的值      【必填】
+                                    label: '关闭',    // 当前提示文字                 【必填】
+                                    disable: false   // 是否禁止点击 默认:false 不禁止
+                                },
+                                {
+                                    value:1,      // 当前选中时值也就是value属性的值      【必填】
+                                    label: '开启',    // 当前提示文字                 【必填】
+                                    disable: false   // 是否禁止点击 默认:false 不禁止
+                                }
+                            ]
+                        }
+                    }
+                };
+            }
+        });
+        jQuery.validator.setDefaults({
+            debug: false,         // 调试模式true不会提交,false允许提交
+            success: "success",   // 匹配成功的class样式名称
+            errorElement: 'div'   // 兼容el标签时使用(兼容el Vue组件label.error标签问题)
+        });
+        // 前台数据验证 验证需要设置window.form全局变量
+        window.form = $('#form-create').validate({
+            rules: {
+                image: {
+                    required: true,
+                    maxlength: 255,
+                    normalizer: function ( value ) {
+                        return $.trim(value);
+                    }
+                },
+                // link: {
+                //     required: true,
+                //     maxlength: 255,
+                //     normalizer: function ( value ) {
+                //         return $.trim(value);
+                //     }
+                // },
+                show: {
+                    required: true
+                },
+                sort: {
+                    required: true,
+                    normalizer: function ( value ) {
+                        return $.trim(value);
+                    }
+                }
+            }
+        });
+        // 编辑保存变量
+        window.formDatum = $('form').serialize();
+    });
+</script>
+@include('layouts.admin.form_script')

+ 156 - 0
resources/views/admins/messages/index.blade.php

@@ -0,0 +1,156 @@
+@extends('layouts.admin.app')
+@section('plug-css')
+    <link href="{{ asset('js/bootstrap-table/dist/bootstrap-table.css') }}" rel="stylesheet">
+@endsection
+@section('crumbs')
+    <ol class="breadcrumb crumbs">
+        <li><a href="{{ route('admin.index') }}#">后台导航</a></li>
+        <li><a href="{{ route('admin.message.index') }}">后台Message首页</a></li>
+        <li class="active">Message列表</li>
+    </ol>
+@endsection
+
+@section('content')
+    <form id="searchForm" class="form-inline">
+        <div class="">
+            <div class="form-group">
+                <label for="name" class="label-css"> ID:</label>
+                <input class="form-control" type="text" name="id">
+            </div>
+            &ensp;&ensp;
+            <button type="button" class="btn btn-primary">查询</button>
+        </div>
+    </form>
+    <hr class="hr-css">
+    <div>
+        <div id="toolbar">
+            <div class="columns columns-left btn-group pull-left">
+                <a class="createForm" data-url="{{ route('admin.message.store') }}" data-title="create">
+                    <button class="btn btn-default" type="button">
+                        <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>&ensp;新增Message
+                    </button>
+                </a>
+                <a>
+                    <button id="deleteAll" data-url="{{ route('admin.message.destroys',['is_del'=>1]) }}" class="btn btn-default" type="button">
+                        <span class="glyphicon glyphicon-trash" aria-hidden="true"></span>&ensp;删除
+                    </button>
+                </a>
+            </div>
+        </div>
+        <table id="ContentTable"></table>
+    </div>
+@endsection
+
+@section('plug-js')
+    <script src="{{ asset('js/bootstrap-table/dist/bootstrap-table.js') }}"></script>
+    <script src="{{ asset('js/bootstrap-table/dist/locale/bootstrap-table-zh-CN.js') }}"></script>
+    <script src="{{ asset('js/jquery-validation1.16/dist/jquery.validate.min.js') }}"></script>
+    <script src="{{ asset('js/jquery-validation1.16/dist/additional-methods.min.js') }}"></script>
+    <script src="{{ asset('js/jquery-validation1.16/src/localization/messages_zh.js') }}"></script>
+@endsection
+
+@section('scripts')
+    <script>
+        $(function(){
+            BootStrapInit.init('tableMessage','ContentTable',{
+                searchForm: 'searchForm',   // 表单搜索id 省略默认 'searchForm'
+                url: "{{ route('admin.message.ajax.index') }}",
+                method: 'post',
+                toolbar: '#toolbar',
+                idField: '',        // 指定主键列
+                uniqueId: "id",     // 这里需要指定当前查询表唯一主键字段
+                columns: [
+                    {
+                        checkbox: true,
+                        align: 'center',
+                        valign: 'middle'
+                    },
+                    {
+                        field: 'id',
+                        title: 'ID',
+                        align: 'center',
+                        valign: 'middle',
+                        sortable: true
+                    },
+                    {
+                        field: 'image',
+                        title: 'Image',
+                        align: 'center',
+                        valign: 'middle',
+                        formatter:thumbFormatter
+                    },
+                    // {
+                    //     field: 'link',
+                    //     title: '链接',
+                    //     align: 'center',
+                    //     valign: 'middle'
+                    // },
+                    {
+                        field: 'status',
+                        title: '显示',
+                        align: 'center',
+                        valign: 'middle',
+                        sortable: true,
+                        formatter:yesOrNo,
+                        bool_data:{
+                            'class' : 'cursor',
+//                            'url'   : 'javascript:;',
+                            'table' : 'messages'
+//                            'pk' : 'id'   // 主键名称不写默认id主键
+                        }
+                    },
+                    {
+                        field: 'sort',
+                        title: '排序',
+                        align: 'center',
+                        valign: 'middle',
+                        sortable: true,
+                        formatter:inputData,
+                        input_data: {
+//                        'class' : 'cursor',     // 当前样式
+//                        'url'   : 'javascript', // url存在 及请求指定地址修改数据
+                            'table' : 'messages'   // url为空时采用,
+//                        'pk'    : 'id'          // 默认修改主键名称 不写 默认id为主键
+                        }
+                    },
+                    {
+                        field: 'created_at',
+                        title: '创建时间',
+                        align: 'center',
+                        valign: 'middle',
+                        sortable: true
+                    },
+                    {
+                        field: 'updated_at',
+                        title: '更新时间',
+                        align: 'center',
+                        valign: 'middle',
+                        sortable: true
+                    },
+                    {
+                        pkId: 'id',         // 当前主键id 兼容排序 field='id' 默认值id
+                        title: '操作',
+                        align: 'center',
+                        valign: 'middle',
+                        width: '185px',
+                        formatter:operateFormatter,
+                        btn_group:[
+                            {
+                                'name'  : '编辑',
+                                'class' : 'btn-primary createForm',
+                                'url'   : 'javascript:;',
+                                'confirm_url': '{{ route('admin.message.edit', ['id'=>'-val-'])}}'
+                            },
+                            {
+                                'name'  : '删除',
+                                'class' : 'btn-danger deleteBtn', // class标签 deleteBtn删除 layer弹出框
+                                'url'   : 'javascript:;',
+                                'confirm_url': '{{ route('admin.message.destroy', ['id'=>'-val-','is_del'=>1])}}'   // 选择按钮
+                            }
+                        ]
+                    }
+                ]
+            });
+        });
+    </script>
+@endsection

+ 2 - 0
routes/api/news.php

@@ -9,4 +9,6 @@ Route::group(['domain' => env('APP_HOST_WEB'), 'prefix' => 'news'],function (){
     Route::match(['get','post'],'notices', 'NewsController@notice')->name('news.notices');
     Route::match(['get','post'],'notice', 'NewsController@noticeDetails')->name('news.notice');
     Route::match(['get','post'],'about_us', 'NewsController@getAboutUs')->name('news.about_us');
+    Route::match(['get','post'],'add-msg', 'NewsController@addMsg')->name('news.add-msg');
+    Route::match(['get','post'],'list-msg', 'NewsController@getMsgList')->name('news.list-msg');
 });

+ 21 - 0
routes/web/message.php

@@ -0,0 +1,21 @@
+<?php
+
+use Illuminate\Support\Facades\Route;
+
+Route::group(['domain' => env('APP_HOST'), 'prefix' => 'admin/message'],function(){
+    Route::get('index', 'MessagesController@index')->name('admin.message.index');
+    Route::post('index', 'MessagesController@index')->name('admin.message.ajax.index');
+
+    Route::get('store','MessagesController@store')->name('admin.message.store');
+    Route::post('store','MessagesController@store')->name('admin.message.save');
+
+    Route::post('destroy/{id?}','MessagesController@destroy')->name('admin.message.destroy');
+    Route::post('destroys','MessagesController@destroys')->name('admin.message.destroys');
+
+    Route::get('edit/{id?}','MessagesController@edit')->name('admin.message.edit');
+    Route::post('update/{id?}','MessagesController@update')->name('admin.message.update');
+});
+
+Route::group(['domain' => env('APP_HOST_WEB'), 'prefix' => 'message'],function (){
+    Route::post('list', 'Front\\MessagesController@index');
+});