linwu 1 سال پیش
والد
کامیت
16bcb253b9

+ 88 - 0
app/admin/controller/Vote.php

@@ -0,0 +1,88 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\AdminBaseController;
+use app\common\model\VoteApplyModel;
+use app\common\model\VoteModel;
+use app\common\service\QrcodeService;
+use app\common\validate\VoteValidate;
+use think\exception\ValidateException;
+
+class Vote extends AdminBaseController
+{
+
+    /**
+     * 列表
+     */
+    public function index()
+    {
+        return view();
+    }
+
+    public function listVote()
+    {
+        $list  = VoteModel::limit(input('limit'))->page(input('page'))->select();
+        $count = VoteModel::count();
+        if ($count == 0) {
+            ajax_return(1, '未查询到数据');
+        }
+        list_return($list, $count);
+    }
+
+    /**
+     * 编辑
+     */
+    public function voteForm()
+    {
+        $id   = input('id/d, 0');
+        $info = VoteModel::find($id);
+
+        return view('', [
+            'info' => $info,
+        ]);
+    }
+
+    public function editVote()
+    {
+        $data = input('post.');
+        try {
+            validate(VoteValidate::class)->check($data);
+        } catch (ValidateException $e) {
+            ajax_return(1, $e->getError());
+        }
+
+        if (empty($data['id'])) {
+            VoteModel::create($data);
+        } else {
+            VoteModel::update($data, ['id' => $data['id']]);
+        }
+
+        ajax_return();
+    }
+
+    public function delVote()
+    {
+        $id    = input('id/d');
+        $check = VoteApplyModel::where('vote_id', $id)->find();
+        if (!empty($check)) {
+            ajax_return(1, '已有投票的活动无法删除!');
+        }
+        VoteModel::destroy($id);
+        ajax_return();
+    }
+
+    /**
+     * 二维码
+     */
+    public function qrcodeVote()
+    {
+        $id = input('id/d', 0);
+
+        $file_name = "/vote_{$id}.png";
+        $link      = url('/mobile/vote/detail') . '?id=' . $id;
+        $file_url  = QrcodeService::getQrcode($file_name, $link);
+
+        ajax_return(0, '', $file_url);
+    }
+}

+ 118 - 0
app/admin/view/vote/index.html

@@ -0,0 +1,118 @@
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-form layui-card-header layuiadmin-card-header-auto">
+            <button class="layui-btn layuiadmin-btn" data-type="add">添加</button>
+        </div>
+
+        <div class="layui-card-body">
+            <table id="{$lay_table}" lay-filter="{$lay_table}"></table>
+            <script type="text/html" id="setOption">
+                {{# d.option.forEach(function(v){ }}
+                <button class="layui-btn layui-btn-normal layui-btn-sm">{{ v }}</button>
+                {{# }) }}
+            </script>
+            <script type="text/html" id="setTpl">
+                <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>
+                <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">
+                    <i class="layui-icon layui-icon-picture-fine"></i>查看二维码
+                </a>
+                <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">
+                    <i class="layui-icon layui-icon-form"></i>查看票数
+                </a>
+                <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="edit">
+                    <i class="layui-icon layui-icon-table"></i>投票明细
+                </a>
+            </script>
+        </div>
+    </div>
+</div>
+
+<script>
+    layui.use(['index', 'admin', 'form', 'table'], function () {
+        const $ = layui.$;
+        const admin = layui.admin;
+        const form = layui.form;
+        const table = layui.table;
+        form.render();
+
+        table.render({
+            elem: '#{$lay_table}',
+            url: "{:url('vote/listVote')}",
+            cols: [
+                [
+                    {field: 'title', title: '标题', width: 200},
+                    {field: 'option', title: '选项', toolbar: '#setOption'},
+                    {field: 'start_time', title: '开始时间', width: 160, align: 'center'},
+                    {field: 'end_time', title: '结束时间', width: 160, align: 'center'},
+                    {field: 'create_time', title: '创建时间', width: 160, align: 'center'},
+                    {title: '操作', width: 430, align: 'center', fixed: 'right', toolbar: '#setTpl'}
+                ]
+            ],
+            page: true,
+            limit: 50,
+            cellMinWidth: 150,
+            text: '对不起,加载出现异常!'
+        });
+
+        form.on('submit({$lay_btn})', function (data) {
+            table.reload('{$lay_table}', {
+                where: data.field,
+                page: {
+                    curr: 1
+                }
+            });
+        });
+
+        //事件
+        const active = {
+            add: function () {
+                const index = layer.open({
+                    type: 2,
+                    title: '添加系统消息',
+                    content: "{:url('vote/voteForm')}",
+                    maxmin: true,
+                    area: ['550px', '550px']
+                });
+                layer.full(index);
+            }
+        };
+
+        //监听工具条
+        table.on('tool({$lay_table})', function (obj) {
+            const data = obj.data;
+            if (obj.event === 'del') {
+                layer.confirm('确定删除吗?', function (index) {
+                    admin.req({
+                        url: "{:url('vote/delVote')}",
+                        data: {
+                            id: data.id
+                        },
+                        done: function (res) {
+                            layui.table.reload('{$lay_table}');
+                        }
+                    });
+                    layer.close(index);
+                });
+            } else if (obj.event === 'edit') {
+                const index = layer.open({
+                    type: 2,
+                    title: '编辑系统消息',
+                    content: "{:url('vote/voteForm')}?id=" + data.id,
+                    maxmin: true,
+                    area: ['550px', '550px']
+                });
+                layer.full(index);
+            }
+        });
+
+        $('.layui-btn.layuiadmin-btn').on('click', function () {
+            const type = $(this).data('type');
+            active[type] ? active[type].call(this) : '';
+        });
+    });
+</script>

+ 116 - 0
app/admin/view/vote/vote_form.html

@@ -0,0 +1,116 @@
+<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_table}">
+                        <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"><span style="color:#f90c05;">*</span>选项</label>
+                            <div class="layui-input-block">
+                                <div class="tags" id="tags">
+                                    <input type="text" id="inputTags" placeholder="回车生成选项" autocomplete="off">
+                                </div>
+                            </div>
+                        </div>
+                        <div class="layui-form-item" id="form-content">
+                            <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="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="end_time" id="end_time" value="{$info.end_time}" lay-verify="required"
+                                       placeholder="请选择..." autocomplete="off" class="layui-input">
+                            </div>
+                        </div>
+                        <div class="layui-form-item">
+                            <div class="layui-input-block">
+                                <input type="button" lay-submit lay-filter="{$lay_btn}" value="确认提交" class="layui-btn">
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script>
+    layui.use(['index', 'form', 'layedit', 'upload','inputTags','laydate'], function () {
+        const admin = layui.admin;
+        const layedit = layui.layedit;
+        const inputTags = layui.inputTags;
+        const laydate = layui.laydate;
+        const form = layui.form;
+        form.render();
+
+        laydate.render({
+            elem: '#start_time',
+            type: 'datetime'
+        });
+
+        laydate.render({
+            elem: '#end_time',
+            type: 'datetime'
+        });
+
+        inputTags.render({
+            elem: '#inputTags',
+            name: 'option',
+            content: {:json_encode($info.option)} == null ? [] : {:json_encode($info.option)},
+            aldaBtn: true,
+            count: 6,
+            done: function(value) {}
+        });
+
+        const content = layedit.build('content', {
+            uploadImage: { url: "{:url('upload/image')}", type: 'post' }
+        });
+
+        form.verify({
+            editcontent: function (value) {
+                layedit.sync(content);
+            }
+        });
+
+        form.on('submit({$lay_btn})', function (obj) {
+            const index = parent.layer.getFrameIndex(window.name);
+            admin.req({
+                url: "{:url('vote/editVote')}",
+                type: 'post',
+                data: obj.field,
+                done: function (res) {
+                    layer.msg("提交成功", {
+                        icon: 1
+                    });
+                    parent.layui.table.reload('lay-vote-index-table'); //重载表格
+                    parent.layer.close(index);
+                }
+            });
+        });
+
+    });
+</script>

+ 22 - 0
app/common/model/VoteApplyModel.php

@@ -0,0 +1,22 @@
+<?php
+
+namespace app\common\model;
+
+class VoteApplyModel extends BaseModel
+{
+    // 设置表名
+    protected $name = 'vote_apply';
+
+    //自动完成
+    protected $autoWriteTimestamp = true;
+
+    public function User()
+    {
+        return $this->hasMany(UserModel::class, "id", "user_id");
+    }
+
+    public function Vote()
+    {
+        return $this->hasMany(VoteModel::class, "id", "vote_id");
+    }
+}

+ 20 - 0
app/common/model/VoteModel.php

@@ -0,0 +1,20 @@
+<?php
+
+namespace app\common\model;
+
+class VoteModel extends BaseModel
+{
+    // 设置表名
+    protected $name = 'vote';
+
+    //自动完成
+    protected $autoWriteTimestamp = true;
+
+    // 设置字段自动转换类型
+    protected $type = [
+        'start_time' => 'timestamp:Y-m-d H:i:s',
+        'end_time'   => 'timestamp:Y-m-d H:i:s',
+        'option'     => 'array',
+    ];
+
+}

+ 42 - 0
app/common/service/QrcodeService.php

@@ -0,0 +1,42 @@
+<?php
+
+namespace app\common\service;
+
+use Endroid\QrCode\Color\Color;
+use Endroid\QrCode\Encoding\Encoding;
+use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelLow;
+use Endroid\QrCode\QrCode;
+use Endroid\QrCode\RoundBlockSizeMode\RoundBlockSizeModeMargin;
+use Endroid\QrCode\Writer\PngWriter;
+
+class QrcodeService
+{
+    public static function getQrcode($file_name, $content, $size = 150, $margin = 20)
+    {
+        //创建文件夹
+        $path = public_path() . '/storage/qrcode';
+        if (!file_exists($path)) {
+            mkdir($path);
+        }
+
+        $file_path = $path . '/' . $file_name;
+        if (!file_exists($file_path)) {
+            $writer = new PngWriter();
+            $qrCode = QrCode::create($content)
+                ->setEncoding(new Encoding('UTF-8'))
+                ->setErrorCorrectionLevel(new ErrorCorrectionLevelLow())
+                ->setSize($size)//大小
+                ->setMargin($margin)//边距
+                ->setRoundBlockSizeMode(new RoundBlockSizeModeMargin())
+                ->setForegroundColor(new Color(0, 0, 0))
+                ->setBackgroundColor(new Color(255, 255, 255));
+            $result = $writer->write($qrCode);
+            $result->getString();
+
+            $result->saveToFile($file_path);
+        }
+
+        $file_url = url('/') . '/storage/qrcode/' . $file_name;
+        return $file_url;
+    }
+}

+ 25 - 0
app/common/validate/VoteValidate.php

@@ -0,0 +1,25 @@
+<?php
+
+namespace app\common\validate;
+
+use think\Validate;
+
+class VoteValidate extends Validate
+{
+    protected $rule = [
+        'title'      => 'require',
+        'option'     => 'require',
+        'content'    => 'require',
+        'start_time' => 'require',
+        'end_time'   => 'require',
+    ];
+
+    protected $message = [
+        'title'      => '标题不能为空',
+        'option'     => '选项不能为空',
+        'content'    => '内容不能为空',
+        'start_time' => '开始时间不能为空',
+        'end_time'   => '结束时间不能为空',
+    ];
+
+}

+ 0 - 0
extend/.gitignore → public/storage/.gitignore