| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482 | <?phpnamespace app\admin\library\traits;use app\admin\library\Auth;use Exception;use PhpOffice\PhpSpreadsheet\Cell\Coordinate;use PhpOffice\PhpSpreadsheet\Reader\Xlsx;use PhpOffice\PhpSpreadsheet\Reader\Xls;use PhpOffice\PhpSpreadsheet\Reader\Csv;use think\Db;use think\exception\PDOException;use think\exception\ValidateException;trait Backend{    /**     * 排除前台提交过来的字段     * @param $params     * @return array     */    protected function preExcludeFields($params)    {        if (is_array($this->excludeFields)) {            foreach ($this->excludeFields as $field) {                if (key_exists($field, $params)) {                    unset($params[$field]);                }            }        } else {            if (key_exists($this->excludeFields, $params)) {                unset($params[$this->excludeFields]);            }        }        return $params;    }    /**     * 查看     */    public function index()    {        //设置过滤方法        $this->request->filter(['strip_tags', 'trim']);        if ($this->request->isAjax()) {            //如果发送的来源是Selectpage,则转发到Selectpage            if ($this->request->request('keyField')) {                return $this->selectpage();            }            list($where, $sort, $order, $offset, $limit) = $this->buildparams();            $list = $this->model                ->where($where)                ->order($sort, $order)                ->paginate($limit);            $result = array("total" => $list->total(), "rows" => $list->items());            return json($result);        }        return $this->view->fetch();    }    /**     * 回收站     */    public function recyclebin()    {        //设置过滤方法        $this->request->filter(['strip_tags', 'trim']);        if ($this->request->isAjax()) {            list($where, $sort, $order, $offset, $limit) = $this->buildparams();            $list = $this->model                ->onlyTrashed()                ->where($where)                ->order($sort, $order)                ->paginate($limit);            $result = array("total" => $list->total(), "rows" => $list->items());            return json($result);        }        return $this->view->fetch();    }    /**     * 添加     */    public function add()    {        if ($this->request->isPost()) {            $params = $this->request->post("row/a");            if ($params) {                $params = $this->preExcludeFields($params);                if ($this->dataLimit && $this->dataLimitFieldAutoFill) {                    $params[$this->dataLimitField] = $this->auth->id;                }                $result = false;                Db::startTrans();                try {                    //是否采用模型验证                    if ($this->modelValidate) {                        $name = str_replace("\\model\\", "\\validate\\", get_class($this->model));                        $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : $name) : $this->modelValidate;                        $this->model->validateFailException(true)->validate($validate);                    }                    $result = $this->model->allowField(true)->save($params);                    Db::commit();                } catch (ValidateException $e) {                    Db::rollback();                    $this->error($e->getMessage());                } catch (PDOException $e) {                    Db::rollback();                    $this->error($e->getMessage());                } catch (Exception $e) {                    Db::rollback();                    $this->error($e->getMessage());                }                if ($result !== false) {                    $this->success();                } else {                    $this->error(__('No rows were inserted'));                }            }            $this->error(__('Parameter %s can not be empty', ''));        }        return $this->view->fetch();    }    /**     * 编辑     */    public function edit($ids = null)    {        $row = $this->model->get($ids);        if (!$row) {            $this->error(__('No Results were found'));        }        $adminIds = $this->getDataLimitAdminIds();        if (is_array($adminIds)) {            if (!in_array($row[$this->dataLimitField], $adminIds)) {                $this->error(__('You have no permission'));            }        }        if ($this->request->isPost()) {            $params = $this->request->post("row/a");            if ($params) {                $params = $this->preExcludeFields($params);                $result = false;                Db::startTrans();                try {                    //是否采用模型验证                    if ($this->modelValidate) {                        $name = str_replace("\\model\\", "\\validate\\", get_class($this->model));                        $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.edit' : $name) : $this->modelValidate;                        $row->validateFailException(true)->validate($validate);                    }                    $result = $row->allowField(true)->save($params);                    Db::commit();                } catch (ValidateException $e) {                    Db::rollback();                    $this->error($e->getMessage());                } catch (PDOException $e) {                    Db::rollback();                    $this->error($e->getMessage());                } catch (Exception $e) {                    Db::rollback();                    $this->error($e->getMessage());                }                if ($result !== false) {                    $this->success();                } else {                    $this->error(__('No rows were updated'));                }            }            $this->error(__('Parameter %s can not be empty', ''));        }        $this->view->assign("row", $row);        return $this->view->fetch();    }    /**     * 删除     */    public function del($ids = "")    {        if (!$this->request->isPost()) {            $this->error(__("Invalid parameters"));        }        $ids = $ids ? $ids : $this->request->post("ids");        if ($ids) {            $pk = $this->model->getPk();            $adminIds = $this->getDataLimitAdminIds();            if (is_array($adminIds)) {                $this->model->where($this->dataLimitField, 'in', $adminIds);            }            $list = $this->model->where($pk, 'in', $ids)->select();            $count = 0;            Db::startTrans();            try {                foreach ($list as $k => $v) {                    $count += $v->delete();                }                Db::commit();            } catch (PDOException $e) {                Db::rollback();                $this->error($e->getMessage());            } catch (Exception $e) {                Db::rollback();                $this->error($e->getMessage());            }            if ($count) {                $this->success();            } else {                $this->error(__('No rows were deleted'));            }        }        $this->error(__('Parameter %s can not be empty', 'ids'));    }    /**     * 真实删除     */    public function destroy($ids = "")    {        if (!$this->request->isPost()) {            $this->error(__("Invalid parameters"));        }        $ids = $ids ? $ids : $this->request->post("ids");        $pk = $this->model->getPk();        $adminIds = $this->getDataLimitAdminIds();        if (is_array($adminIds)) {            $this->model->where($this->dataLimitField, 'in', $adminIds);        }        if ($ids) {            $this->model->where($pk, 'in', $ids);        }        $count = 0;        Db::startTrans();        try {            $list = $this->model->onlyTrashed()->select();            foreach ($list as $k => $v) {                $count += $v->delete(true);            }            Db::commit();        } catch (PDOException $e) {            Db::rollback();            $this->error($e->getMessage());        } catch (Exception $e) {            Db::rollback();            $this->error($e->getMessage());        }        if ($count) {            $this->success();        } else {            $this->error(__('No rows were deleted'));        }        $this->error(__('Parameter %s can not be empty', 'ids'));    }    /**     * 还原     */    public function restore($ids = "")    {        if (!$this->request->isPost()) {            $this->error(__("Invalid parameters"));        }        $ids = $ids ? $ids : $this->request->post("ids");        $pk = $this->model->getPk();        $adminIds = $this->getDataLimitAdminIds();        if (is_array($adminIds)) {            $this->model->where($this->dataLimitField, 'in', $adminIds);        }        if ($ids) {            $this->model->where($pk, 'in', $ids);        }        $count = 0;        Db::startTrans();        try {            $list = $this->model->onlyTrashed()->select();            foreach ($list as $index => $item) {                $count += $item->restore();            }            Db::commit();        } catch (PDOException $e) {            Db::rollback();            $this->error($e->getMessage());        } catch (Exception $e) {            Db::rollback();            $this->error($e->getMessage());        }        if ($count) {            $this->success();        }        $this->error(__('No rows were updated'));    }    /**     * 批量更新     */    public function multi($ids = "")    {        if (!$this->request->isPost()) {            $this->error(__("Invalid parameters"));        }        $ids = $ids ? $ids : $this->request->post("ids");        if ($ids) {            if ($this->request->has('params')) {                parse_str($this->request->post("params"), $values);                $values = $this->auth->isSuperAdmin() ? $values : array_intersect_key($values, array_flip(is_array($this->multiFields) ? $this->multiFields : explode(',', $this->multiFields)));                if ($values) {                    $adminIds = $this->getDataLimitAdminIds();                    if (is_array($adminIds)) {                        $this->model->where($this->dataLimitField, 'in', $adminIds);                    }                    $count = 0;                    Db::startTrans();                    try {                        $list = $this->model->where($this->model->getPk(), 'in', $ids)->select();                        foreach ($list as $index => $item) {                            $count += $item->allowField(true)->isUpdate(true)->save($values);                        }                        Db::commit();                    } catch (PDOException $e) {                        Db::rollback();                        $this->error($e->getMessage());                    } catch (Exception $e) {                        Db::rollback();                        $this->error($e->getMessage());                    }                    if ($count) {                        $this->success();                    } else {                        $this->error(__('No rows were updated'));                    }                } else {                    $this->error(__('You have no permission'));                }            }        }        $this->error(__('Parameter %s can not be empty', 'ids'));    }    /**     * 导入     */    protected function import()    {        $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';        $table = $this->model->getQuery()->getTable();        $database = \think\Config::get('database.database');        $fieldArr = [];        $list = db()->query("SELECT COLUMN_NAME,COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ? AND TABLE_SCHEMA = ?", [$table, $database]);        foreach ($list as $k => $v) {            if ($importHeadType == 'comment') {                $fieldArr[$v['COLUMN_COMMENT']] = $v['COLUMN_NAME'];            } else {                $fieldArr[$v['COLUMN_NAME']] = $v['COLUMN_NAME'];            }        }        //加载文件        $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]] = $v;                    }                }                if ($row) {                    $insert[] = $row;                }            }        } catch (Exception $exception) {            $this->error($exception->getMessage());        }        if (!$insert) {            $this->error(__('No rows were updated'));        }        try {            //是否包含admin_id字段            $has_admin_id = false;            foreach ($fieldArr as $name => $key) {                if ($key == 'admin_id') {                    $has_admin_id = true;                    break;                }            }            if ($has_admin_id) {                $auth = Auth::instance();                foreach ($insert as &$val) {                    if (!isset($val['admin_id']) || empty($val['admin_id'])) {                        $val['admin_id'] = $auth->isLogin() ? $auth->id : 0;                    }                }            }            $this->model->saveAll($insert);        } catch (PDOException $exception) {            $msg = $exception->getMessage();            if (preg_match("/.+Integrity constraint violation: 1062 Duplicate entry '(.+)' for key '(.+)'/is", $msg, $matches)) {                $msg = "导入失败,包含【{$matches[1]}】的记录已存在";            };            $this->error($msg);        } catch (Exception $e) {            $this->error($e->getMessage());        }        $this->success();    }}
 |