linwu 1 жил өмнө
parent
commit
e0ea884403

+ 143 - 0
app/admin/controller/Activity.php

@@ -0,0 +1,143 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\BaseController;
+
+use app\common\model\Activity as ActivityModel;
+use app\common\model\ActivityJoin as ActivityJoinModel;
+
+class Activity extends BaseController
+{
+
+    public function index()
+    {
+        return view('activity/index');
+    }
+
+    public function listActivity()
+    {
+        $limit = input('limit');
+        $page  = input('page');
+
+        $where = [];
+        $title = input('title', '');
+        if (!empty($title)) {
+            $where[] = ['title', 'like', "%{$title}%"];
+        }
+        $status = input('status', 0);
+        if (!empty($status)) {
+            $where[] = ['status', '=', $status];
+        }
+
+        $list  = ActivityModel::order(['priority' => 'desc', 'id' => 'desc'])->where($where)->limit($limit)->page($page)->select()->append(['status_text']);
+        $count = ActivityModel::where($where)->count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+
+    public function form()
+    {
+        $id   = input('id/d, 0');
+        $info = ActivityModel::findOrEmpty($id);
+        return view('activity/form', [
+            'info' => $info,
+        ]);
+    }
+
+    public function edit()
+    {
+        $id = input('id/d');
+        if (empty($id)) {
+            ActivityModel::create([
+                'title'       => input('title/s'),
+                'main_image'  => input('main_image/s'),
+                'content'     => input('content/s'),
+                'address'     => input('address/s'),
+                'start_time'  => strtotime(input('start_time/s')),
+                'create_time' => time(),
+                'priority'    => input('priority/d'),
+                'status'      => input('status/d') == 1 ? 1 : 2,
+            ]);
+        } else {
+            ActivityModel::update([
+                'id'         => $id,
+                'title'      => input('title/s'),
+                'main_image' => input('main_image/s'),
+                'content'    => input('content/s'),
+                'address'    => input('address/s'),
+                'start_time' => strtotime(input('start_time/s')),
+                'priority'   => input('priority/d'),
+                'status'     => input('status/d') == 1 ? 1 : 2,
+            ]);
+        }
+        exit(json_encode([
+            'code' => 0,
+        ]));
+    }
+
+    public function del()
+    {
+        $id    = input('id/d');
+        $count = ActivityJoinModel::where('activity_id', $id)->where('status', 1)->count();
+        if ($count > 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "已有报名的活动无法删除",
+            ]));
+        }
+
+        ActivityModel::where('id', $id)->delete();
+        ActivityJoinModel::where('activity_id', $id)->delete();
+        exit(json_encode([
+            'code' => 0,
+            'msg'  => "",
+        ]));
+    }
+
+    public function joinList()
+    {
+        return view('activity/joinlist');
+    }
+
+    public function listJoin()
+    {
+        $limit = input('limit');
+        $page  = input('page');
+
+        $where  = [];
+        $status = input('status', 0);
+        if (!empty($status)) {
+            $where[] = ['status', '=', $status];
+        }
+
+        $list  = ActivityJoinModel::with(['user'])->order(['create_time' => 'desc'])->where($where)->limit($limit)->append(['status_text'])->page($page)->select();
+        $count = ActivityJoinModel::where($where)->count();
+        if ($count == 0) {
+            exit(json_encode([
+                'code' => 1,
+                'msg'  => "未查询到数据",
+            ]));
+        }
+        foreach ($list as $v) {
+            $v['realname'] = $v['user']['realname'];
+            $v['mobile']   = $v['user']['mobile'];
+        }
+        exit(json_encode([
+            'code'  => 0,
+            'msg'   => "",
+            'count' => $count,
+            'data'  => $list,
+        ]));
+    }
+}

+ 166 - 0
app/admin/view/activity/form.html

@@ -0,0 +1,166 @@
+<div class="layui-fluid">
+	<div class="layui-row layui-col-space15">
+		<div class="layui-col-md12">
+			<div class="layui-card">
+				<div class="layui-card-header">活动信息</div>
+				<div class="layui-card-body" pad15>
+					<div class="layui-form layui-form-pane" lay-filter="LAY-activity-form">
+						<input type="hidden" name="id" value="{$info.id}">
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>标题</label>
+							<div class="layui-input-block">
+								<input type="text" name="title" value="{$info.title}" lay-verify="required" placeholder="请输入标题" autocomplete="off"
+								 class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label">主图</label>
+							<div class="layui-input-block">
+								<div class="layui-upload">
+									<button type="button" class="layui-btn attachment-upload-images" data-input="main_image" data-amount="1">上传图片</button>
+									<div class="layui-inline layui-word-aux"> 尺寸建议:560px*300px</div>
+									<div class="layui-upload-list echo-attachment-image-list" id="main_image">
+										{notempty name="info.main_image"}
+										<div>
+											<input type="hidden" name="main_image" value="{$info.main_image}">
+											<img src="{$info.main_image}">
+											<button type="button" class="attachmentdel layui-btn layui-btn-primary layui-btn-xs layui-btn-fluid">删除</button>
+										</div>
+										{/notempty}
+									</div>
+								</div>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>内容</label>
+							<div class="layui-input-block">
+								<textarea class="layui-textarea" name="content" id="content" placeholder="请输入详情" style="display: none"
+										  lay-verify="editcontent">
+											{$info.content}
+										</textarea>
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>活动地点</label>
+							<div class="layui-input-block">
+								<input type="text" name="address" value="{$info.address}" lay-verify="required" placeholder="请输入活动地点" autocomplete="off"
+									   class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>开始时间</label>
+							<div class="layui-input-block">
+								<input type="text" name="start_time" id="start_time" value="{$info.start_time}" lay-verify="required"
+									   placeholder="请选择活动开始时间" autocomplete="off" class="layui-input">
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label"><span style="color:#f90c05;">*</span>排序</label>
+							<div class="layui-input-block">
+								<input type="text" name="priority" value="{$info.priority|default=255}" lay-verify="required" placeholder="请输入排序值(倒序,值越大越靠前)"
+								 autocomplete="off" class="layui-input">
+								<div class="layui-form-mid layui-word-aux">倒序,值越大越靠前</div>
+							</div>
+						</div>
+						<div class="layui-form-item" pane>
+							<label class="layui-form-label">状态</label>
+							<div class="layui-input-block">
+								<input type="checkbox" lay-filter="switch" name="status" {eq name="info.status|default=1" value="1" }checked{/eq}
+								 lay-skin="switch" lay-text="显示|隐藏" value="1" />
+							</div>
+						</div>
+						<div class="layui-form-item">
+							<div class="layui-input-block">
+								<input type="button" lay-submit lay-filter="LAY-activity-form-submit" value="确认提交" class="layui-btn">
+							</div>
+						</div>
+					</div>
+
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
+
+<script>
+	layui.config({
+		base: '/static/echoui/' //静态资源所在路径
+	}).extend({
+		index: 'lib/index' //主入口模块
+	}).use(['index', 'form', 'set','layedit','laydate', 'upload'], function() {
+		var $ = layui.$,
+			setter = layui.setter,
+			admin = layui.admin,
+			form = layui.form,
+			layedit = layui.layedit,
+			laydate = layui.laydate,
+			upload = layui.upload;
+			form.render();
+
+		var details = layedit.build('content', {
+			uploadImage: { url: setter.baseAdminUrl + 'attachment/tplfieldimage', type: 'post' }
+		});
+		form.verify({
+			editcontent: function(value) {
+				layedit.sync(details);
+			}
+		});
+
+		laydate.render({
+			elem: '#start_time',
+			type: 'datetime'
+		});
+
+		form.on('submit(LAY-activity-form-submit)', function(obj) {
+			var index = parent.layer.getFrameIndex(window.name);
+			admin.req({
+				url: setter.baseAdminUrl + 'activity/edit',
+				data: obj.field,
+				done: function(res) {
+					layer.msg("提交成功", {
+						icon: 1
+					});
+					parent.layui.table.reload('LAY-activity-index-table'); //重载表格
+					parent.layer.close(index);
+				}
+			});
+		});
+
+		$('.echo-attachment-image-list').on('click', '.attachmentdel', function() {
+			$(this).parent().remove();
+		});
+		upload.render({
+			elem: '.attachment-upload-images',
+			url: setter.baseAdminUrl + 'attachment/tplfieldimage',
+			accept: 'images',
+			exits: 'jpg|png|jpeg',
+			acceptMime: 'image/*',
+			size: 2048,
+			number: 1,
+			method: 'post',
+			before: function(obj) {
+				var item = this.item;
+				upload_input = $(item).data('input');
+				upload_amount = $(item).data('amount');
+				layer.load();
+			},
+			done: function(res, index, upload) {
+				layer.closeAll('loading');
+				var html = "";
+				if (upload_amount == 1) {
+					html += '<div> <input type="hidden" name="' + upload_input + '" value="' + res.data.src + '"> ';
+					html += '<img src="' + res.data.src + '"><button type="button" class="attachmentdel layui-btn layui-btn-primary layui-btn-xs layui-btn-fluid">删除</button></div>';
+					$("#" + upload_input).html(html);
+				} else {
+					html += '<div> <input type="hidden" name="' + upload_input + '[]" value="' + res.data.src + '"> ';
+					html += '<img src="' + res.data.src +
+							'"> <button type="button" class="attachmentdel layui-btn layui-btn-primary layui-btn-xs layui-btn-fluid">删除</button></div>';
+					$("#" + upload_input).append(html);
+				}
+			},
+			error: function(index, upload) {
+				layer.closeAll('loading');
+			}
+		});
+	});
+</script>

+ 146 - 0
app/admin/view/activity/index.html

@@ -0,0 +1,146 @@
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-form layui-form-pane layui-card-header layuiadmin-card-header-auto"
+             lay-filter="LAY-activity-index-search">
+            <div class="layui-form-item">
+                <div class="layui-inline">
+                    <label class="layui-form-label">标题</label>
+                    <div class="layui-input-block">
+                        <input type="text" name="title" placeholder="请输入标题" autocomplete="off" class="layui-input">
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">状态</label>
+                    <div class="layui-input-block">
+                        <select name="status">
+                            <option value="">全部状态</option>
+                            <option value="1">显示</option>
+                            <option value="2">隐藏</option>
+                        </select>
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <button class="layui-btn" lay-submit lay-filter="LAY-activity-index-btn">
+                        <i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
+                    </button>
+                </div>
+            </div>
+        </div>
+
+        <div class="layui-card-body">
+            <div style="padding-bottom: 10px;">
+                <button class="layui-btn layuiadmin-btn" data-type="add">添加</button>
+            </div>
+            <table id="LAY-activity-index-table" lay-filter="LAY-activity-index-table"></table>
+            <script type="text/html" id="setTpl">
+                <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="join"><i
+                        class="layui-icon layui-icon-edit"></i>报名情况</a>
+                <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit"><i
+                        class="layui-icon layui-icon-edit"></i>编辑</a>
+                <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i
+                        class="layui-icon layui-icon-delete"></i>删除</a>
+            </script>
+        </div>
+    </div>
+</div>
+
+<script>
+    layui.config({
+        base: '/static/echoui/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index' //主入口模块
+    }).use(['index', 'form', 'set', 'table'], function () {
+        var $ = layui.$,
+            setter = layui.setter,
+            admin = layui.admin,
+            form = layui.form,
+            table = layui.table;
+        form.render();
+
+        table.render({
+            elem: '#LAY-activity-index-table',
+            url: setter.baseAdminUrl + 'activity/listActivity',
+            cols: [
+                [
+                    {field: 'title', title: '标题'},
+                    {field: 'start_time', width: 180, title: '开始时间'},
+                    {field: 'address', title: '活动地点'},
+                    {field: 'join_num', with:60, title: '报名人数'},
+                    {field: 'priority', width: 80, title: '排序'},
+                    {field: 'status_text', width: 80, title: '状态', minWidth: 80, align: 'center'},
+                    {title: '操作', width: 250, align: 'center', fixed: 'right', toolbar: '#setTpl'}
+                ]
+            ],
+            page: true,
+            limit: 50,
+            cellMinWidth: 150,
+            text: '对不起,加载出现异常!'
+        });
+
+        //事件
+        var active = {
+            add: function () {
+                var index = layer.open({
+                    type: 2,
+                    title: '添加活动',
+                    content: 'form.html?id=0',
+                    maxmin: true,
+                    area: ['550px', '550px']
+                });
+                layer.full(index);
+            },
+        };
+
+        form.on('submit(LAY-activity-index-btn)', function(data) {
+            table.reload('LAY-activity-index-table', {
+                where: data.field,
+                page: {
+                    curr: 1
+                }
+            });
+        });
+
+        //监听工具条
+        table.on('tool(LAY-activity-index-table)', function (obj) {
+            var data = obj.data;
+            if (obj.event === 'del') {
+                layer.confirm('确定删除此活动吗?', function (index) {
+                    admin.req({
+                        url: setter.baseAdminUrl + 'activity/del',
+                        data: {
+                            id: data.id
+                        },
+                        done: function (res) {
+                            obj.del();
+                            layer.msg('已删除');
+                        }
+                    });
+                    layer.close(index);
+                });
+            } else if (obj.event === 'edit') {
+                var index = layer.open({
+                    type: 2,
+                    title: '编辑活动',
+                    content: 'form.html?id=' + data.id,
+                    maxmin: true,
+                    area: ['550px', '550px']
+                });
+                layer.full(index);
+            } else if (obj.event === 'join') {
+                var index = layer.open({
+                    type: 2,
+                    title: '报名情况 - ' + data.title,
+                    content: 'joinList.html?id=' + data.id,
+                    maxmin: true,
+                    area: ['550px', '550px']
+                });
+                layer.full(index);
+            }
+        });
+
+        $('.layui-btn.layuiadmin-btn').on('click', function () {
+            var type = $(this).data('type');
+            active[type] ? active[type].call(this) : '';
+        });
+    });
+</script>

+ 69 - 0
app/admin/view/activity/joinlist.html

@@ -0,0 +1,69 @@
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-form layui-form-pane layui-card-header layuiadmin-card-header-auto"
+             lay-filter="LAY-activity-index-search">
+            <div class="layui-form-item">
+                <div class="layui-inline">
+                    <label class="layui-form-label">状态</label>
+                    <div class="layui-input-block">
+                        <select name="status">
+                            <option value="">全部状态</option>
+                            <option value="1">报名成功</option>
+                            <option value="2">取消</option>
+                        </select>
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <button class="layui-btn" lay-submit lay-filter="LAY-activity-index-btn">
+                        <i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
+                    </button>
+                </div>
+            </div>
+        </div>
+
+        <div class="layui-card-body">
+            <table id="LAY-activity-index-table" lay-filter="LAY-activity-index-table"></table>
+        </div>
+    </div>
+</div>
+
+<script>
+    layui.config({
+        base: '/static/echoui/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index' //主入口模块
+    }).use(['index', 'form', 'set', 'table'], function () {
+        var $ = layui.$,
+            setter = layui.setter,
+            form = layui.form,
+            table = layui.table;
+        form.render();
+
+        table.render({
+            elem: '#LAY-activity-index-table',
+            url: setter.baseAdminUrl + 'activity/listJoin',
+            cols: [
+                [
+                    {field: 'realname', width: 120, title: '姓名'},
+                    {field: 'mobile', width: 150, title: '手机号'},
+                    {field: 'create_time', width: 160, title: '报名时间'},
+                    {field: 'status_text', width: 100, title: '状态', minWidth: 80, align: 'center'},
+                    {field: 'cancel_time', with:160, title: '取消时间'},
+                ]
+            ],
+            page: true,
+            limit: 50,
+            cellMinWidth: 150,
+            text: '对不起,加载出现异常!'
+        });
+
+        form.on('submit(LAY-activity-index-btn)', function(data) {
+            table.reload('LAY-activity-index-table', {
+                where: data.field,
+                page: {
+                    curr: 1
+                }
+            });
+        });
+    });
+</script>

+ 34 - 0
app/common/model/Activity.php

@@ -0,0 +1,34 @@
+<?php
+
+namespace app\common\model;
+
+use think\Model;
+
+class Activity extends Model
+{
+    // 设置字段信息
+    protected $schema = [
+        'id'          => 'int',
+        'title'       => 'string',
+        'main_image'  => 'string',
+        'start_time'  => 'int',
+        'address'     => 'string',
+        'content'     => 'string',
+        'create_time' => 'int',
+        'join_num'    => 'int',
+        'status'      => 'int',
+        'priority'    => 'int',
+    ];
+
+    // 设置字段自动转换类型
+    protected $type = [
+        'start_time'  => 'timestamp:Y-m-d H:i:s',
+        'create_time' => 'timestamp:Y-m-d H:i:s',
+    ];
+
+    public function getStatusTextAttr($value, $data)
+    {
+        $status = [1 => '显示', 2 => '隐藏'];
+        return $status[$data['status']];
+    }
+}

+ 41 - 0
app/common/model/ActivityJoin.php

@@ -0,0 +1,41 @@
+<?php
+
+namespace app\common\model;
+
+use think\Model;
+
+class ActivityJoin extends Model
+{
+    // 设置字段信息
+    protected $schema = [
+        'id'          => 'int',
+        'user_id'     => 'int',
+        'activity_id' => 'int',
+        'create_time' => 'int',
+        'comment'     => 'string',
+        'status'      => 'int',
+        'cancel_time' => 'int',
+    ];
+
+    // 设置字段自动转换类型
+    protected $type = [
+        'create_time' => 'timestamp:Y-m-d H:i:s',
+        'cancel_time' => 'timestamp:Y-m-d H:i:s',
+    ];
+
+    public function getStatusTextAttr($value, $data)
+    {
+        $status = [1 => '报名成功', 2 => '取消'];
+        return $status[$data['status']];
+    }
+
+    public function user()
+    {
+        return $this->hasOne(User::class,'id','user_id');
+    }
+
+    public function activity()
+    {
+        return $this->hasOne(Activity::class,'id','activity_id');
+    }
+}

+ 93 - 0
app/mainapp/controller/Activity.php

@@ -0,0 +1,93 @@
+<?php
+
+namespace app\mainapp\controller;
+
+use app\mainapp\BaseController;
+
+use app\common\model\Activity as ActivityModel;
+use app\common\model\ActivityJoin as ActivityJoinModel;
+
+class Activity extends BaseController
+{
+
+    public function listActivity()
+    {
+        $ppage = input('ppage/d', 1);
+        $psize = input('psize/d', 20);
+        $map[] = ['status', '=', 1];
+        $plist = ActivityModel::where($map)->order(['priority' => 'desc', 'id' => 'desc'])->page($ppage)->limit($psize)->select();
+        page_result(0, "", [
+            'plist'   => $plist,
+            'pstatus' => $psize > count($plist) ? 'noMore' : 'more',
+        ]);
+    }
+
+    public function detailActivity()
+    {
+        $id   = input('id/d', 0);
+        $list = ActivityModel::findOrEmpty($id);
+        if ($list->isEmpty()) {
+            page_result(1, "活动不存在");
+        }
+
+        $userid      = input('userid/d', 0);
+        $join_status = ActivityJoinModel::where([['user_id', '=', $userid], ['activity_id', '=', $id]])->count();
+
+        page_result(0, "", [
+            'list'        => $list,
+            'join_status' => $join_status > 0 ? true : false,
+        ]);
+    }
+
+    public function joinActivity()
+    {
+        $id     = input('id/d', 0);
+        $userid = input('userid/d', 0);
+        if (empty($id) || empty($userid)) {
+            page_result(1, "数据错误");
+        }
+
+        $list = ActivityModel::findOrEmpty($id);
+        if ($list->isEmpty()) {
+            page_result(1, "活动不存在");
+        }
+
+        ActivityJoinModel::create([
+            'user_id'     => $userid,
+            'activity_id' => $id,
+            'create_time' => time(),
+        ]);
+    }
+
+    public function joinList()
+    {
+        $userid = input('userid/d', 0);
+        if (empty($userid)) {
+            page_result(1, "请先登录");
+        }
+
+        $ppage = input('ppage/d', 1);
+        $psize = input('psize/d', 20);
+        $map[] = ['user_id', '=', $userid];
+        $plist = ActivityJoinModel::with('activity')->where($map)->order(['id' => 'desc'])->page($ppage)->limit($psize)->append(['status_text'])->select();
+        page_result(0, "", [
+            'plist'   => $plist,
+            'pstatus' => $psize > count($plist) ? 'noMore' : 'more',
+        ]);
+    }
+
+    public function cancelJoin()
+    {
+        $id = input('id/d', 0);
+        if (empty($userid)) {
+            page_result(1, "数据错误");
+        }
+
+        ActivityJoinModel::update([
+            'cancel_time' => time(),
+            'status'      => 2,
+        ], ['id' => $id]);
+
+        page_result(0, "操作成功");
+    }
+}

+ 0 - 1
app/mainapp/controller/Article.php

@@ -1,7 +1,6 @@
 <?php
 namespace app\mainapp\controller;
 
-use think\facade\Session;
 use app\mainapp\BaseController;
 
 use app\common\model\User as UserModel;