linwu 2 dni temu
rodzic
commit
d45d922892

+ 112 - 0
app/admin/controller/Grade.php

@@ -0,0 +1,112 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\AdminBaseController;
+use app\common\model\GradeModel;
+use app\common\service\QrcodeService;
+
+class Grade extends AdminBaseController
+{
+
+    /**
+     * 列表
+     */
+    public function index()
+    {
+        $file_url = QrcodeService::getQrcode('grade_index', url('/mobile/grade/login'), 600);
+        return view('', [
+            'is_final_list' => GradeModel::IS_FINAL,
+            'file_url'       => $file_url,
+        ]);
+    }
+
+    public function listGrade()
+    {
+        $map   = $this->dealEqualInput(['is_final'], $this->dealLikeInput(['name', 'no', 'company']));
+        $list  = GradeModel::where($map)
+            ->order(['rank' => 'asc'])
+            ->limit(input('limit'))
+            ->page(input('page'))
+            ->append(['is_final_text'])
+            ->select();
+        $count = GradeModel::where($map)->count();
+        if ($count == 0) {
+            ajax_return(1, '未查询到数据');
+        }
+        list_return($list, $count);
+    }
+
+    public function delGrade()
+    {
+        $id_arr = input('id_arr/a');
+        GradeModel::destroy($id_arr);
+        ajax_return();
+    }
+
+    /**
+     * 编辑
+     */
+    public function gradeForm()
+    {
+        $id   = input('id/d, 0');
+        $info = GradeModel::find($id);
+
+        return view('', [
+            'info'          => $info,
+            'is_final_list' => GradeModel::IS_FINAL,
+        ]);
+    }
+
+    public function editGrade()
+    {
+        $data = input('post.');
+
+        if (empty($data['id'])) {
+            GradeModel::create($data);
+        } else {
+            GradeModel::update($data, ['id' => $data['id']]);
+        }
+
+        ajax_return();
+    }
+
+    /**
+     * 用户导入
+     */
+    public function import()
+    {
+        return view('public/import', [
+            'url'           => url('grade/importPost'),
+            'last_table'    => 'lay-grade-index-table',
+            'template_file' => '/static/common/exl/grade.xls',
+        ]);
+    }
+
+    /**
+     * 用户导入提交
+     */
+    public function importPost()
+    {
+        $file_url = input('file_url/s', "");
+        if (!file_exists($file_url)) {
+            ajax_return(1, '文件不存在');
+        }
+
+        //初始化数据
+        $data = ['no', 'name', 'company', 'theory_score', 'computer_score', 'total_score', 'rank', 'is_final'];
+        $list = import_exl($file_url, $data, 1);
+        if (empty($list)) {
+            ajax_return(1, '请上传有数据的文件');
+        }
+
+        foreach ($list as &$v) {
+            $v['total_score'] = $v['theory_score'] + $v['computer_score'];
+            $v['name'] = str_replace(' ','',$v['name']);
+        }
+        unset($v);
+
+        GradeModel::insertAll($list);
+        ajax_return(0);
+    }
+}

+ 108 - 0
app/admin/view/grade/grade_form.html

@@ -0,0 +1,108 @@
+<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="{:array_get($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="no" value="{:array_get($info,'no')}" 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="name" value="{:array_get($info,'name')}" 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="company" value="{:array_get($info,'company')}" 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="number" name="theory_score" value="{:array_get($info,'theory_score')}" 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="number" name="computer_score" value="{:array_get($info,'computer_score')}" 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="number" name="total_score" value="{:array_get($info,'total_score')}" 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="number" name="rank" value="{:array_get($info,'rank')}" lay-verify="required"
+                                       placeholder="排名" autocomplete="off"
+                                       class="layui-input">
+                            </div>
+                        </div>
+                        <div class="layui-form-item" pane>
+                            <label class="layui-form-label"><span style="color:#f90c05;">*</span>进入决赛</label>
+                            <div class="layui-input-block">
+                                {volist name="is_final_list" id="v"}
+                                <input type="radio" name="is_final" value="{$key}" title="{$v}" {eq name=":array_get($info,'is_final',2)" value="$key" }checked{/eq}>
+                                {/volist}
+                            </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'], function () {
+        const admin = layui.admin;
+        const form = layui.form;
+        form.render();
+
+        form.on('submit({$lay_btn})', function (obj) {
+            const index = parent.layer.getFrameIndex(window.name);
+            admin.req({
+                url: "{:url('grade/editGrade')}",
+                type: 'post',
+                data: obj.field,
+                done: function (res) {
+                    layer.msg("提交成功", {
+                        icon: 1
+                    });
+                    parent.layui.table.reload('lay-grade-index-table'); //重载表格
+                    parent.layer.close(index);
+                }
+            });
+        });
+
+    });
+</script>

+ 174 - 0
app/admin/view/grade/index.html

@@ -0,0 +1,174 @@
+<style>
+
+</style>
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-form layui-form-pane  layui-card-header layuiadmin-card-header-auto">
+            <div class="layui-form-item">
+                <div class="layui-inline">
+                    <label class="layui-form-label">考生号</label>
+                    <div class="layui-input-block">
+                        <input type="text" name="no" placeholder="请输入考生号" autocomplete="off" class="layui-input">
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">姓名</label>
+                    <div class="layui-input-block">
+                        <input type="text" name="name" placeholder="请输入姓名" autocomplete="off" class="layui-input">
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">单位</label>
+                    <div class="layui-input-block">
+                        <input type="text" name="company" 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>
+                            {volist name="is_final_list" id="v"}
+                                <option value="{$key}">{$v}</option>
+                            {/volist}
+                        </select>
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <button class="layui-btn" lay-submit lay-filter="{$lay_btn}">
+                        <i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
+                    </button>
+                </div>
+            </div>
+        </div>
+        <div class="layui-form layui-card-header layuiadmin-card-header-auto">
+            <button class="layui-btn layuiadmin-btn" data-type="add">添加</button>
+            <button class="layui-btn layuiadmin-btn" data-type="import">批量导入</button>
+            <button class="layui-btn layui-btn-normal layuiadmin-btn" data-type="qrcode">二维码</button>
+        </div>
+
+        <div class="layui-card-body">
+            <table id="{$lay_table}" lay-filter="{$lay_table}"></table>
+            <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>
+            </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('grade/listGrade')}",
+            cols: [
+                [
+                    {field: 'no', title: '考生号' ,width: 100},
+                    {field: 'name', title: '姓名' ,width: 100},
+                    {field: 'company', title: '单位', width: 300},
+                    {field: 'theory_score', title: '理论得分' ,width: 150},
+                    {field: 'computer_score', title: '机操得分' ,width: 150},
+                    {field: 'total_score', title: '初赛得分' ,width: 150},
+                    {field: 'rank', title: '排名' ,width: 100},
+                    {field: 'is_final_text', title: '是否进入决赛' ,width: 200},
+                    {title: '操作', 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('grade/gradeForm')}",
+                    maxmin: true,
+                    area: ['550px', '550px']
+                });
+                layer.full(index);
+            },
+            import: function() {
+                layer.open({
+                    type: 2,
+                    title: '批量导入',
+                    content: "{:url('grade/import')}",
+                    maxmin: true,
+                    area: ['750px', '300px']
+                });
+            },
+            qrcode: function () {
+                layer.photos({
+                    photos: {
+                        "title": "", //相册标题
+                        "id": 123, //相册id
+                        "start": 0, //初始显示的图片序号,默认0
+                        "data": [   //相册包含的图片,数组格式
+                            {
+                                "alt": "图片名",
+                                "pid": 666, //图片id
+                                "src": "{$file_url}", //原图地址
+                                "thumb": "" //缩略图地址
+                            }
+                        ]
+                    }
+                    ,anim: 5 //0-6的选择,指定弹出图片动画类型,默认随机(请注意,3.0之前的版本用shift参数)
+                });
+            },
+        };
+
+        //监听工具条
+        table.on('tool({$lay_table})', function (obj) {
+            const data = obj.data;
+            if (obj.event === 'del') {
+                layer.confirm('确定删除此成绩吗?', function (index) {
+                    admin.req({
+                        url: "{:url('grade/delGrade')}",
+                        data: {
+                            id: data.id
+                        },
+                        done: function (res) {
+                            obj.del();
+                            layer.msg('已删除');
+                        }
+                    });
+                    layer.close(index);
+                });
+            } else if (obj.event === 'edit') {
+                const index = layer.open({
+                    type: 2,
+                    title: '编辑成绩',
+                    content: "{:url('grade/gradeForm')}?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>

+ 1 - 1
app/common.php

@@ -117,7 +117,7 @@ function import_exl($file = '', $cell = [], $crop = 0, $sheet = 0)
             for ($_column = 0; $_column <= $columnCnt; $_column++) {
                 $cellId    = $cellName[$_column] . $_row;
                 $cellValue = $currSheet->getCell($cellId)->getValue();
-                //$cellValue = $currSheet->getCell($cellId)->getCalculatedValue();  #获取公式计算的值
+//                $cellValue = $currSheet->getCell($cellId)->getCalculatedValue();  #获取公式计算的值
                 if ($cellValue instanceof PHPExcel_RichText) {   //富文本转换字符串
                     $cellValue = $cellValue->__toString();
                 } else {

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

@@ -0,0 +1,20 @@
+<?php
+
+namespace app\common\model;
+
+class GradeModel extends BaseModel
+{
+    // 设置表名
+    protected $name = 'grade';
+
+    //自动完成
+    protected $autoWriteTimestamp = true;
+
+    // 常量
+    const IS_FINAL = [1 => '是', 2 => '否'];
+
+    public function getIsFinalTextAttr($value, $data)
+    {
+        return self::IS_FINAL[$data['is_final']];
+    }
+}

+ 48 - 0
app/mobile/controller/Grade.php

@@ -0,0 +1,48 @@
+<?php
+
+namespace app\mobile\controller;
+
+use app\common\model\GradeModel;
+use app\common\model\SoldierModel;
+use app\common\model\SoldierVideoModel;
+use app\common\model\SoldierVideoSeriesModel;
+use app\common\model\SoldierVideoWatchModel;
+use app\mobile\MobileBaseController;
+
+class Grade extends MobileBaseController
+{
+    public function login()
+    {
+        return view();
+    }
+
+    public function doLogin()
+    {
+        $param = input('post.');
+        if (empty($param['no']) || empty($param['name'])) {
+            ajax_return(1, '请输入考生号或姓名');
+        }
+
+        $grade = GradeModel::where('no', $param['no'])->where('name', $param['name'])->find();
+        if (empty($grade)) {
+            ajax_return(1, '考生号或姓名输入错误');
+        }
+
+        session('mobile.grade.no', $grade['no']);
+        ajax_return();
+    }
+
+    public function index()
+    {
+        $no = session('mobile.grade.no');
+        if (empty($no)) {
+            return redirect(url('grade/login'));
+        }
+
+        $grade = GradeModel::where('no', $no)->find();
+        return view('', [
+            'grade' => json_encode($grade),
+        ]);
+    }
+
+}

+ 74 - 0
app/mobile/view/grade/index.html

@@ -0,0 +1,74 @@
+{extend name="public/base"/}
+{block name="css"}
+<style>
+    .text-success {
+        color: var(--blue);
+        font-size: 20px;
+        text-align: center;
+        padding: 20px 0;
+        background: white;
+        border-bottom: 1px solid #eee;
+    }
+    .text-error {
+        color: var(--red);
+        font-size: 20px;
+        text-align: center;
+        padding: 20px 0;
+        background: white;
+        border-bottom: 1px solid #eee;
+    }
+    .score {
+        font-size: 20px;
+        padding-bottom: 5px;
+        font-weight: bold;
+        color: var(--red);
+    }
+</style>
+{/block}
+{block name="body"}
+<van-nav-bar
+        class="nav-theme"
+        :fixed="true"
+        :placeholder="true"
+>
+    <template #title>
+        <span class="text-white">成绩查询</span>
+    </template>
+</van-nav-bar>
+<div class="text-success" v-if="grade.is_final == 1">恭喜您,进入决赛</div>
+<div class="text-error" v-else>抱歉,未进入决赛</div>
+<van-grid :column-num="3">
+    <van-grid-item text="理论最终得分">
+        <template #icon>
+            <div class="score">{{grade.theory_score}}</div>
+        </template>
+    </van-grid-item>
+    <van-grid-item text="机操最终得分">
+        <template #icon>
+            <div class="score">{{grade.computer_score}}</div>
+        </template>
+    </van-grid-item>
+    <van-grid-item text="初赛最终得分">
+        <template #icon>
+            <div class="score">{{grade.total_score}}</div>
+        </template>
+    </van-grid-item>
+</van-grid>
+<van-cell-group inset style="margin-top:10px;">
+    <van-field v-model="grade.no" label="考生号" readonly></van-field>
+    <van-field v-model="grade.name" label="姓名" readonly></van-field>
+    <van-field v-model="grade.company" label="单位" readonly></van-field>
+    <van-field v-model="grade.rank" label="排名" readonly></van-field>
+</van-cell-group>
+{/block}
+{block name="script"}
+<script>
+    function v_setup() {
+        let base = {};
+
+        base.grade = Vue.reactive({$grade});
+
+        return base;
+    }
+</script>
+{/block}

+ 100 - 0
app/mobile/view/grade/login.html

@@ -0,0 +1,100 @@
+{extend name="public/base"/}
+{block name="css"}
+<style>
+    .content {
+        height: 100vh;
+        background-color: aquamarine;
+        background: url("__MIMAGES__/bg_login.jpg") no-repeat;
+        background-size: cover;
+    }
+
+    .topBox {
+        font-size: 17px;
+        color: #fff;
+        padding: 10px 25px;
+    }
+
+    h3 {
+        margin-bottom: 5px;
+    }
+
+    .inputBox {
+        position: fixed;
+        bottom: 0;
+        left: 0;
+        width: 100%;
+        height: 85vh;
+        background-color: #fff;
+        border-top-left-radius: 20px;
+        border-top-right-radius: 20px;
+        padding: 30px;
+        box-sizing: border-box;
+    }
+
+    .ipt {
+        margin-bottom: 25px;
+    }
+
+    .ipt h4 {
+        margin-bottom: 10px;
+        font-size: 18px;
+        color: #333;
+    }
+
+    .ipt input {
+        border:none;
+        border-bottom:1px solid #dedede;
+        width:100%;
+        padding-bottom: 10px;
+        font-size: 14px;
+    }
+
+    .loginBtn {
+        line-height: 43px;
+        text-align: center;
+        background: linear-gradient(to right, rgb(86, 104, 214), rgb(86, 104, 214));
+        border-radius: 20px;
+        color: #fff;
+        margin-top: 25px;
+        width:100%;
+        border:none;
+        display:block;
+    }
+
+</style>
+{/block}
+{block name="body"}
+<div class="content">
+    <div class="topBox">
+        <h3>AI竞赛成绩查询</h3>
+    </div>
+    <div class="inputBox">
+        <div class="ipt">
+            <h4>考生号</h4>
+            <input type="text" v-model="form.no" placeholder="请输入考生号" />
+        </div>
+        <div class="ipt">
+            <h4>姓名</h4>
+            <input type="text" v-model="form.name" placeholder="请输入姓名" />
+        </div>
+        <button class="loginBtn" @click="onLogin">查询成绩</button>
+    </div>
+</div>
+{/block}
+{block name="script"}
+<script>
+    function v_setup() {
+        let base = {};
+
+        base.form = Vue.reactive({});
+
+        base.onLogin = () => {
+            postJson('/grade/doLogin', base.form).then(({data, code}) => {
+                location.href = "{:url('grade/index')}";
+            })
+        };
+
+        return base;
+    }
+</script>
+{/block}

BIN
public/static/common/exl/grade.xls