浏览代码

20250216 优化去掉验证码,故障调试

贾小兵 1 周之前
父节点
当前提交
288b6776bb

+ 262 - 1
application/admin/controller/department/Admin.php

@@ -13,6 +13,13 @@ use think\Db;
 use think\Model;
 use think\Validate;
 
+use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
+use PhpOffice\PhpSpreadsheet\IOFactory;
+use PhpOffice\PhpSpreadsheet\Spreadsheet;
+use PhpOffice\PhpSpreadsheet\Reader\Csv;
+use PhpOffice\PhpSpreadsheet\Reader\Xls;
+use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
+
 
 /**
  * 部门成员
@@ -32,7 +39,7 @@ class Admin extends Backend
      * @var array
      */
     protected $allDepartment = [];//
-    protected $noNeedRight=['selectpage','getDepartmentIds','departadmintotal'];
+    protected $noNeedRight=['selectpage','getDepartmentIds','departadmintotal','export','import'];
 
 
     public function _initialize()
@@ -685,5 +692,259 @@ class Admin extends Backend
         return json($result);
     }
 
+    //导入
+    public function import(){
+        error_reporting(E_ALL);
+        ini_set("memory_limit","8000M");
+        $file = $this->request->request('file');
+        if (!$file) {
+            $this->error(__('Parameter %s can not be empty', 'file'));
+        }
+        $filePath = ROOT_PATH . DS . 'public' . DS . $file;
+        if (!is_file($filePath)) {
+            $this->error(__('No results were found'));
+        }
+        //实例化reader
+        $ext = pathinfo($filePath, PATHINFO_EXTENSION);
+        if (!in_array($ext, ['csv', 'xls', 'xlsx'])) {
+            $this->error(__('Unknown data format'));
+        }
+        if ($ext === 'csv') {
+            $file = fopen($filePath, 'r');
+            $filePath = tempnam(sys_get_temp_dir(), 'import_csv');
+            $fp = fopen($filePath, "w");
+            $n = 0;
+            while ($line = fgets($file)) {
+                $line = rtrim($line, "\n\r\0");
+                $encoding = mb_detect_encoding($line, ['utf-8', 'gbk', 'latin1', 'big5']);
+                if ($encoding != 'utf-8') {
+                    $line = mb_convert_encoding($line, 'utf-8', $encoding);
+                }
+                if ($n == 0 || preg_match('/^".*"$/', $line)) {
+                    fwrite($fp, $line . "\n");
+                } else {
+                    fwrite($fp, '"' . str_replace(['"', ','], ['""', '","'], $line) . "\"\n");
+                }
+                $n++;
+            }
+            fclose($file) || fclose($fp);
+
+            $reader = new Csv();
+        } elseif ($ext === 'xls') {
+            $reader = new Xls();
+        } else {
+            $reader = new Xlsx();
+        }
+
+        //导入文件首行类型,默认是注释,如果需要使用字段名称请使用name
+        $importHeadType = isset($this->importHeadType) ? $this->importHeadType : 'comment';
+        $this->model = new \app\admin\model\department\AuthAdmin();
+        $table = $this->model->getQuery()->getTable();
+
+        $fieldArr['学号'] = 'username';
+        $fieldArr['姓名'] = 'nickname';
+        $fieldArr['区队'] = 'depart_id';
+        //加载文件
+        $insert = [];
+        try {
+            if (!$PHPExcel = $reader->load($filePath)) {
+                $this->error(__('Unknown data format'));
+            }
+            $currentSheet = $PHPExcel->getSheet(0);  //读取文件中的第一个工作表
+            $allColumn = $currentSheet->getHighestDataColumn(); //取得最大的列号
+            $allRow = $currentSheet->getHighestRow(); //取得一共有多少行
+            $maxColumnNumber = Coordinate::columnIndexFromString($allColumn);
+            $fields = [];
+            for ($currentRow = 1; $currentRow <= 1; $currentRow++) {
+                for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) {
+                    $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue();
+                    $fields[] = $val;
+                }
+            }
+            for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) {
+                $values = [];
+                for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) {
+                    $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue();
+                    $values[] = is_null($val) ? '' : $val;
+                }
+                $row = [];
+                $temp = array_combine($fields, $values);
+                foreach ($temp as $k => $v) {
+                    if (isset($fieldArr[$k]) && $k !== '') {
+                        $row[$fieldArr[$k]] = trim($v);
+                    }
+                }
+
+                if ($row) {
+                    $insert[] = $row;
+                }
+            }
+        } catch (Exception $exception) {
+            $this->error($exception->getMessage());
+        }
+        if (!$insert) {
+            $this->error(__('No rows were updated'));
+        }
+        foreach ($insert as $key => $v)
+        {          
+            $admin_info = Db::name('admin')->where('username',$v['username'])->find();
+            if(empty($admin_info)){
+                $salt = Random::alnum(); 
+                $depart_id = Db::name('department')->where('name',$v['depart_id'])->value('id');
+                $data = [
+                    'username'=>$v['username'],
+                    'nickname'=>$v['username'],
+                    'salt'=>$salt,
+                    'password'=>$this->auth->getEncryptPassword('123456', $salt),
+                    'avatar'=>'/assets/img/avatar.png',
+                    'loginfailure'=>0,
+                    'email'=>$v['username'].'@163.com',
+                    'status'=>'normal',
+                    'createtime'=>time(),
+                    'updatetime'=>time(),
+                    'depart_id'=>$depart_id??0,
+                ];
+                $adminId = Db::name('admin')->insertGetId($data);
+                
+                $add = [
+                    'department_id'=>$depart_id??0,
+                    'admin_id'=>$adminId,
+                    'create_time'=>time(),
+                    'update_time'=>time(),
+                ];
+                $departmentId = Db::name('department_admin')->insertGetId($add);
+
+
+                $group_info = Db::name('auth_group_access')->where('uid',$adminId)->find();
+                if(empty($group_info)){
+                    $arr = [
+                        'uid'=>$adminId,
+                        'group_id'=>8
+                    ];
+                    Db::name('auth_group_access')->insertGetId($arr);
+                }
+            }
+        }
+        
+        $this->success('导入成功');
+
+    }
+
+
+
+    //导出
+    public function export(){
+
+        $this->model = new \app\admin\model\department\AuthAdmin();
+        list($where, $sort, $order, $offset, $limit) = $this->buildparams();
+        $list = $this->model->where($where)->where(['depart_id'=>['>',0]])->order($sort, $order)->select();
+
+        $xlsName = '学员信息';
+        $this->exportExcel($xlsName,'Excel2007', $list);
+    }
+
+
+    /**
+     * 输出到浏览器(需要设置header头)
+     * @param string $fileName 文件名
+     * @param string $fileType 文件类型
+     */
+    function exportExcel($fileName, $fileType,$data)
+    {
+        //文件名称校验
+        if (!$fileName) {
+            trigger_error('文件名不能为空', E_USER_ERROR);
+        }
+        //Excel文件类型校验
+        $type = ['Excel2007', 'Xlsx', 'Excel5', 'xls'];
+        if (!in_array($fileType, $type)) {
+            trigger_error('未知文件类型', E_USER_ERROR);
+        }
+
+        $ext = '';
+
+        if ($fileType == 'Excel2007' || $fileType == 'Xlsx') {
+            header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
+            header('Content-Disposition: attachment;filename="' . $fileName . '.xlsx"');
+            header('Cache-Control: max-age=0');
+            $ext = 'Xlsx';
+        } else { //Excel5
+            header('Content-Type: application/vnd.ms-excel');
+            header('Content-Disposition: attachment;filename="' . $fileName  . '.xls"');
+            header('Cache-Control: max-age=0');
+            $ext = 'Xls';
+        }
+        $spreadsheet = new Spreadsheet();
+        $worksheet = $spreadsheet->getActiveSheet();
+        $worksheet->getColumnDimension('A')->setWidth(15);
+        $worksheet->getColumnDimension('B')->setWidth(15);
+        $worksheet->getColumnDimension('C')->setWidth(15);
+        $worksheet->getColumnDimension('D')->setWidth(15);
+
+        $worksheet->getRowDimension('1')->setRowHeight(25);
+
+        //设置工作表标题名称
+        $worksheet->setTitle('学员信息');
+
+        $worksheet->setCellValue('A1',"序号");
+        $worksheet->setCellValue('B1',"学号");
+        $worksheet->setCellValue('C1',"姓名");
+        $worksheet->setCellValue('D1',"区队");
+        
+        
+        foreach ($data as $ky => $value)
+        {
+            $qudui = Db::name('department')->where('id',$value['depart_id'])->value('name');
+            $lie = $ky+2; 
+            $worksheet->setCellValue('A'.$lie,++$ky);
+            $worksheet->setCellValue('B'.$lie,$value['username']);
+            $worksheet->setCellValue('C'.$lie,$value['nickname']);
+            $worksheet->setCellValue('D'.$lie,$qudui);
+        }
+        
+
+        $titlestyleArray = [
+            'font' => [
+                'name' => '黑体',
+                'size' => 14
+            ],
+        ];
+        $headerStyleArray = [
+            'font' => [
+                'name' => '方正小标宋简体',
+                'size' => 18
+            ],
+        ];
+
+        $commonStyleArray = [
+            'alignment' => [
+                'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
+                'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER,
+                'wrapText' => true,
+            ]
+        ];
+        $borderStyleArray = [
+            'borders' => [
+                'allBorders' => [
+                    'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
+                ],
+            ],
+            'font' => [
+                'name' => '黑体',
+            ],
+        ];
+        $worksheet->getStyle('A1:D1')->applyFromArray($titlestyleArray);
+        $worksheet->getStyle('A1:D1')->applyFromArray($commonStyleArray);
+        // $worksheet->getStyle('A2:R2')->applyFromArray($commonStyleArray);
+        // $worksheet->getStyle('A3:R3')->applyFromArray($commonStyleArray);
+        // $worksheet->getStyle('A'.$footer_total.':R'.$footer_total)->applyFromArray($commonStyleArray);
+        // $worksheet->getStyle('A1:C1')->applyFromArray($borderStyleArray);
+        // $worksheet->mergeCells('A1:R1');
+        $writer = IOFactory::createWriter($spreadsheet,$ext);
+        $writer->save('php://output');
+        die();
+    }
+
+
 
 }

+ 7 - 0
application/admin/view/department/admin/index.html

@@ -107,6 +107,13 @@
                         <div class="widget-body no-padding">
                             <div id="toolbar" class="toolbar">
                                 {:build_toolbar('refresh,add,edit,delete')}
+
+                                <a href="javascript:;" class="btn btn-danger btn-import " title="{:__('导入')}" ><i class="fa fa-upload"></i> {:__('导入')}</a> 
+
+                                <a href="javascript:;" class="btn btn-success btn-export " title="导出" ><i class="fa fa-download"></i> 导出</a>
+
+                                <a href="../../demo.xlsx" download="demo.xlsx" class="btn btn-default"><i class="fa fa-download"></i> 导入模板</a>
+
                                 <div class="dropdown btn-group {:$auth->check('department/admin/multi')?'':'hide'}">
                                     <a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a>
                                     <ul class="dropdown-menu text-left" role="menu">

+ 1 - 1
application/extra/upload.php

@@ -21,7 +21,7 @@ return [
     /**
      * 可上传的文件类型
      */
-    'mimetype'  => 'jpg,png,bmp,jpeg,gif,webp,zip,rar,wav,mp4,mp3,webm',
+    'mimetype'  => 'jpg,png,bmp,jpeg,gif,webp,zip,rar,xls,xlsx,wav,mp4,mp3,webm',
     /**
      * 是否支持批量上传
      */

+ 18 - 0
public/assets/js/backend/department/admin.js

@@ -9,6 +9,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                     add_url: 'department/admin/add',
                     edit_url: 'department/admin/edit',
                     del_url: 'department/admin/del',
+                    import_url: 'department/admin/import',
                     multi_url: 'department/admin/multi',
                 }
             });
@@ -226,6 +227,23 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                 });
             });
 
+
+            //导出
+            $(document).on("click", ".btn-export", function () {
+                var parenttable = table.closest('.bootstrap-table');
+                var options = table.bootstrapTable('getOptions');
+                var toolbar = $(options.toolbar, parenttable);
+
+                // 导出
+                var options = table.bootstrapTable('getOptions');
+                var search = options.queryParams({});
+                var filter = JSON.parse(search.filter);
+                var op = JSON.parse(search.op);
+                url = '/admin/department/admin/export';
+                if(url)
+                    location.href= url + '?filter='+JSON.stringify(filter)+'&op='+JSON.stringify(op);
+            });
+
         },
         add: function () {
             Controller.api.bindevent();

二进制
public/demo.xlsx