file('file')) { $file = request()->file('file'); } else { return to_assign(1, '没有选择上传文件'); } // dump($file);die; // 获取上传文件的hash散列值 $sha1 = $file->hash('sha1'); $md5 = $file->hash('md5'); $rule = [ 'image' => 'jpg,png,jpeg,gif,ai,psd', 'doc' => 'txt,doc,docx,ppt,pptx,xls,xlsx,pdf,xmind,drawio', 'file' => 'zip,gz,7z,rar,tar', 'video' => 'mpg,mp4,mpeg,avi,wmv,mov,flv,m4v', ]; $fileExt = $rule['image'] . ',' . $rule['doc'] . ',' . $rule['file'] . ',' . $rule['video']; //1M=1024*1024=1048576字节 $fileSize = 100 * 1024 * 1024; if (isset($param['type']) && $param['type']) { $fileExt = $rule[$param['type']]; } if (isset($param['size']) && $param['size']) { $fileSize = $param['size']; } $validate = \think\facade\Validate::rule([ 'image' => 'require|fileSize:' . $fileSize . '|fileExt:' . $fileExt, ]); $file_check['image'] = $file; if (!$validate->check($file_check)) { return to_assign(1, $validate->getError()); } // 日期前綴 $dataPath = date('Ym'); $use = 'thumb'; $filename = \think\facade\Filesystem::disk('public')->putFile($dataPath, $file, function () use ($md5) { return $md5; }); if ($filename) { //写入到附件表 $data = []; $path = get_config('filesystem.disks.public.url'); $data['filepath'] = $path . '/' . $filename; $data['name'] = $file->getOriginalName(); $data['mimetype'] = $file->getOriginalMime(); $data['fileext'] = $file->extension(); $data['filesize'] = $file->getSize(); $data['filename'] = $filename; $data['sha1'] = $sha1; $data['md5'] = $md5; $data['module'] = \think\facade\App::initialize()->http->getName(); $data['action'] = app('request')->action(); $data['uploadip'] = app('request')->ip(); $data['create_time'] = time(); $data['user_id'] = $this->uid; if ($data['module'] = 'admin') { //通过后台上传的文件直接审核通过 $data['status'] = 1; $data['admin_id'] = $data['user_id']; $data['audit_time'] = time(); } $data['use'] = request()->has('use') ? request()->param('use') : $use; //附件用处 $res['id'] = Db::name('file')->insertGetId($data); $res['filepath'] = $data['filepath']; $res['name'] = $data['name']; $res['filename'] = $data['filename']; $res['filesize'] = $data['filesize']; add_log('upload', $data['user_id'], $data); return to_assign(0, '上传成功', $res); } else { return to_assign(1, '上传失败,请重试'); } } // 上传程序 public function upload_files() { if (request()->file('file')) { // 获取文件信息 $file = request()->file('file'); $file_name = $file->getOriginalName(); $file_size = $file->getSize(); $file_extension = pathinfo($file->getOriginalName(), PATHINFO_EXTENSION); // 文件大小限制(单位:字节) $max_file_size = 500 * 1024 * 1024; // 500MB // 检查文件大小 if ($file_size > $max_file_size) { return json([ 'code' => 2, 'msg' => '文件过大,已经超过500MB,请联系管理员!', 'max_size' => $max_file_size, 'file_size' => $file_size ]); } // 创建文件夹 $upload_dir = 'upload/programes/' . date('Y-m-d') . '/'; if (!is_dir($upload_dir)) { if (!mkdir($upload_dir, 0777, true) && !is_dir($upload_dir)) { throw new \RuntimeException(sprintf('Directory "%s" was not created', $upload_dir)); } } // 生成新文件名 $new_name = $this->generateRandomName(5) . '.' . $file_extension; // 保存文件 $file->move($upload_dir, $new_name); // 添加数据到数据库 $data = [ 'path' => $upload_dir . $new_name, 'uid' => $this->uid, 'create_time' => date('Y-m-d H:i:s', time()) ]; Db::name('DownloadFiles')->insert($data); // 获取文件上传域名 $fileDomain = $_SERVER['HTTP_HOST']; // 构建文件访问地址 $url = $fileDomain . '/upload/programes/' . date('Y-m-d') . '/' . $new_name; // 返回 JSON 数据 return json([ 'code' => 200, 'msg' => '文件上传成功!', 'fileDomain' => $fileDomain, 'filename' => $file_name, 'filepath' => $upload_dir . $new_name, 'file_size'=> $file_size, 'file_extension'=> $file_extension, 'url' => $url, 'admin_id' => $this->uid ]); } else { return json(['code' => 400, 'msg' => '未选择上传文件!']); } } // 图床上传 public function upload_picbed() { if (request()->file('file')) { // 获取文件信息 $file = request()->file('file'); $file_name = $file->getOriginalName(); $file_size = $file->getSize(); $file_type = $file->getMime(); $file_extension = pathinfo($file->getOriginalName(), PATHINFO_EXTENSION); // 检查文件类型 $allowed_types = Db::name('FileType')->column('suffix'); if (!in_array($file_extension, $allowed_types)) { return json(['code' => 1, 'msg' => '该文件类型不允许上传!请联系管理员!']); } // 检查文件大小 $max_file_size = 10 * 1024 * 1024; // 10MB if ($file_size > $max_file_size) { return json(['code' => 2, 'msg' => '文件过大,已经超过10M,请联系管理员!']); } // 创建文件夹 $upload_dir = 'upload/' . date('Y-m-d') . '/'; if (!is_dir($upload_dir)) { mkdir($upload_dir, 0777, true); } // 生成新文件名 $new_name = $this->generateRandomName(5) . '.' . $file_extension; // 保存文件 $file->move($upload_dir, $new_name); // 添加数据到数据库 $data = [ 'name' => $file_name, 'new_name' => $new_name, 'path' => $upload_dir . $new_name, 'admin_id' => $this->uid, 'size' => $file_size, 'type' => $file_extension, 'create_time' => time() ]; Db::name('PicbedImages')->insert($data); // 获取文件上传域名 $fileDomain = $_SERVER['HTTP_HOST']; // 构建文件访问地址 $url = $fileDomain . '/upload/' . date('Y-m-d') . '/' . $new_name; // 返回 JSON 数据 return json([ 'code' => 200, 'msg' => '文件上传成功!', 'fileDomain' => $fileDomain, 'filename' => $file_name, 'filepath' => $upload_dir . $new_name, 'url' => $url, 'admin_id' => $this->uid ]); } else { return json(['code' => 400, 'msg' => '未选择上传文件!']); } } // 生成随机文件名 private function generateRandomName($length) { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $random_name = ''; for ($i = 0; $i < $length; $i++) { $random_name .= $characters[rand(0, strlen($characters) - 1)]; } return $random_name; } // 外部站点上传图片到本站接口 public function upload_pic_out() { if (request()->file('file')) { // 获取文件信息 $file = request()->file('file'); $file_name = $file->getOriginalName(); $file_size = $file->getSize(); $file_type = $file->getMime(); $file_extension = pathinfo($file->getOriginalName(), PATHINFO_EXTENSION); // 检查文件类型 $allowed_types = Db::name('FileType')->column('suffix'); if (!in_array($file_extension, $allowed_types)) { return json(['code' => 1, 'msg' => '该文件类型不允许上传!请联系管理员!'], 400); } // 获取文件上传域名 $fileDomain = '//' . $_SERVER['HTTP_HOST']; // 检查文件大小 $max_file_size = 10 * 1024 * 1024; // 10MB if ($file_size > $max_file_size) { return json(['code' => 2, 'msg' => '文件过大,已经超过10M,请联系管理员!'], 400); } // 创建文件夹 $upload_dir = './upload/' . date('Y-m-d') . '/'; $upload_dir_1 = '/upload/' . date('Y-m-d') . '/'; if (!is_dir($upload_dir)) { mkdir($upload_dir, 0777, true); } // 生成新文件名 $file_extension = pathinfo($file->getOriginalName(), PATHINFO_EXTENSION); $new_name = $this->generateRandomName(5) . '.' . $file_extension; // 保存文件 $file_destination = $upload_dir . $new_name; $file_destination1 = $upload_dir_1 . $new_name; $result = $file->move($upload_dir, $new_name); if (!$result) { return json(['code' => 3, 'msg' => '文件保存失败'], 400); } $file_name = urlencode($file_name); // 添加数据到数据库 $data = [ 'name' => $file_name, 'new_name' => $new_name, 'path' => $file_destination, 'admin_id' => request()->param('pr_name'), 'size' => $file_size, 'type' => $file_type, 'create_time' => time() ]; // 检查 admin_id 是否为空 if (empty($data['admin_id'])) { return json(['code' => 4, 'msg' => '上传失败,缺少 pr_name 参数!'], 400); } Db::name('PicbedImages')->insert($data); // 构建文件访问地址 $url = $_SERVER['HTTP_HOST'] . '/upload/' . date('Y-m-d') . '/' . $new_name; // 构建响应数据 $response_data = [ 'code' => 5, 'msg' => '文件上传成功!', 'filename' => $file_name, 'fileDomain' => $fileDomain, 'filepath' => $file_destination1, 'url' => $url ]; // 返回 JSON 格式的响应数据 return json($response_data, 200); } else { return json(['code' => 6, 'msg' => '未选择上传文件!'], 400); } } //编辑器图片上传 public function tinymce_upload() { $param = get_params(); if (request()->file('file')) { $file = request()->file('file'); } else { return json(['error' => 1, 'message' => '没有选择上传文件']); } // 获取上传文件的hash散列值 $sha1 = $file->hash('sha1'); $md5 = $file->hash('md5'); $rule = [ 'image' => 'jpg,png,jpeg,gif', 'doc' => 'doc,docx,ppt,pptx,xls,xlsx,pdf,txt', 'file' => 'zip,gz,7z,rar,tar', ]; $fileExt = $rule['image'] . ',' . $rule['doc'] . ',' . $rule['file']; $fileSize = 2 * 1024 * 1024; // 默认文件大小限制 if (isset($param['type']) && $param['type']) { $fileExt = $rule[$param['type']]; } if (isset($param['size']) && $param['size']) { $fileSize = $param['size']; } $validate = \think\facade\Validate::rule([ 'image' => 'require|fileSize:' . $fileSize . '|fileExt:' . $fileExt, ]); $file_check['image'] = $file; if (!$validate->check($file_check)) { return json(['error' => 1, 'message' => $validate->getError()]); } $dataPath = date('Ym'); $filename = \think\facade\Filesystem::disk('public')->putFile($dataPath, $file, function () use ($md5) { return $md5; }); if ($filename) { $path = get_config('filesystem.disks.public.url'); $filepath = $path . '/' . $filename; return json(['location' => $filepath]); // Tinymce 需要的关键字段是 'location' } else { return json(['error' => 1, 'message' => '上传失败']); } } public function md_upload() { $param = get_params(); if (request()->file('editormd-image-file')) { $file = request()->file('editormd-image-file'); } else { return to_assign(1, '没有选择上传文件'); } // dump($file);die; // 获取上传文件的hash散列值 $sha1 = $file->hash('sha1'); $md5 = $file->hash('md5'); $rule = [ 'image' => 'jpg,png,jpeg,gif', 'doc' => 'doc,docx,ppt,pptx,xls,xlsx,pdf', 'file' => 'zip,gz,7z,rar,tar', ]; $fileExt = $rule['image'] . ',' . $rule['doc'] . ',' . $rule['file']; //1M=1024*1024=1048576字节 $fileSize = 2 * 1024 * 1024; if (isset($param['type']) && $param['type']) { $fileExt = $rule[$param['type']]; } if (isset($param['size']) && $param['size']) { $fileSize = $param['size']; } $validate = \think\facade\Validate::rule([ 'image' => 'require|fileSize:' . $fileSize . '|fileExt:' . $fileExt, ]); $file_check['image'] = $file; if (!$validate->check($file_check)) { return to_assign(1, $validate->getError()); } // 日期前綴 $dataPath = date('Ym'); $use = 'thumb'; $filename = \think\facade\Filesystem::disk('public')->putFile($dataPath, $file, function () use ($md5) { return $md5; }); if ($filename) { //写入到附件表 $data = []; $path = get_config('filesystem.disks.public.url'); $data['filepath'] = $path . '/' . $filename; $data['name'] = $file->getOriginalName(); $data['mimetype'] = $file->getOriginalMime(); $data['fileext'] = $file->extension(); $data['filesize'] = $file->getSize(); $data['filename'] = $filename; $data['sha1'] = $sha1; $data['md5'] = $md5; return json(['success' => 1, 'message' => '上传成功', 'url' => $data['filepath']]); } else { return json(['success' => 0, 'message' => '上传失败', 'url' => '']); } } //清空缓存 public function cache_clear() { \think\facade\Cache::clear(); return to_assign(0, '系统缓存已清空'); } //获取部门树形节点列表 public function get_department_tree() { $department = get_department(); $list = get_tree($department, 0, 2); $data['trees'] = $list; return json($data); } //获取部门树形节点列表2 public function get_department_select() { $keyword = get_params('keyword'); $selected = []; if (!empty($keyword)) { $selected = explode(",", $keyword); } $department = get_department(); $list = get_select_tree($department, 0, 0, $selected); return to_assign(0, '', $list); } //获取子部门所有员工 public function get_employee($did = 0) { $did = get_params('did'); /* if ($did == 1) { $department = $did; } else { $department = get_department_son($did); } */ $department = get_department_son($did); $employee = Db::name('admin') ->field('a.id,a.did,a.position_id,a.mobile,a.name,a.nickname,a.sex,a.status,a.thumb,a.username,d.title as department') ->alias('a') ->join('Department d', 'a.did = d.id') ->where(['a.status' => 1]) ->where('a.did', "in", $department) ->select(); return to_assign(0, '', $employee); } //获取部门所有员工 public function get_employee_select() { $employee = Db::name('admin')->field('id as value,name')->where(['status' => 1])->select(); return to_assign(0, '', $employee); } //获取角色列表 public function get_position() { $position = Db::name('Position')->field('id,title as name')->where([['status', '=', 1], ['id', '>', 1]])->select(); return to_assign(0, '', $position); } //获取工作类型列表 public function get_work() { $cate = Db::name('WorkCate')->field('id,title')->where([['status', '=', 1]])->select(); return to_assign(0, '', $cate); } //获取任务类型列表 public function get_task_cate() { $cate = Db::name('TaskCate')->field('id,title')->where([['status', '=', 1]])->select(); return to_assign(0, '', $cate); } //获取产品列表 public function get_product() { $product = Db::name('Product')->field('id,name as title')->where([['delete_time', '=', 0]])->select(); return to_assign(0, '', $product); } //获取客户列表 public function get_business() { $business = Db::name('Business')->field('id,name as title')->where([['delete_time', '=', 0]])->select(); return to_assign(0, '', $business); } //获取项目列表 public function get_project($pid = 0) { $where = []; $where[] = ['delete_time', '=', 0]; if ($pid > 0) { $where[] = ['product_id', '=', $pid]; } $project = Db::name('Project')->field('id,name as title')->where($where)->select(); //$belong_project = Db::name('Project')->field('id,name_short as title')->where($where)->select(); return to_assign(0, '', $project); } //获取所属项目短名 public function get_belong_project() { $where = []; $where[] = ['delete_time', '=', 0]; if ($pid > 0) { $where[] = ['product_id', '=', $pid]; } $belong_project = Db::name('Project')->field('id,name_short as title')->where($where)->select(); return to_assign(0, '', $belong_project); } //文档列表 public function get_doc_list($kid = 0, $tree = 0) { if ($tree == 2) { $list = Db::name('knowledgeDoc')->where(['knowledge_id' => $kid, 'delete_time' => 0]) ->field('id,pid as pId,title as name,type,link,knowledge_id,sort,read') ->order('sort asc,id asc') ->select(); return to_assign(0, '', $list); } else { $list = Db::name('knowledgeDoc')->where(['knowledge_id' => $kid, 'delete_time' => 0]) ->field('id,pid,title,type,knowledge_id,sort,read') ->order('sort asc,id asc') ->select(); if ($tree == 1) { foreach ($list as $k => &$v) { $v['title'] = sub_str($v['title'], 9); } $tree = get_tree($list, 0, 4); $data['trees'] = $tree; return json($data); } else { return to_assign(0, '', $list); } } } //删除消息附件 public function del_message_interfix() { $id = get_params("id"); $detail = Db::name('MessageFileInterfix')->where('id', $id)->find(); if ($detail['admin_id'] == $this->uid) { if (Db::name('MessageFileInterfix')->where('id', $id)->delete() !== false) { $data = Db::name('MessageFileInterfix')->where('mid', $detail['mid'])->column('file_id'); return to_assign(0, "删除成功", $data); } else { return to_assign(1, "删除失败"); } } else { return to_assign(1, "您没权限删除该消息附件"); } } // 测试邮件发送 public function email_test() { $sender = get_params('email'); //检查是否邮箱格式 if (!is_email($sender)) { return to_assign(1, '测试邮箱码格式有误'); } $email_config = \think\facade\Db::name('config')->where('name', 'email')->find(); $config = unserialize($email_config['content']); $content = $config['template']; //所有项目必须填写 if (empty($config['smtp']) || empty($config['smtp_port']) || empty($config['smtp_user']) || empty($config['smtp_pwd'])) { return to_assign(1, '请完善邮件配置信息!'); } $send = send_email($sender, '测试邮件', $content); if ($send) { return to_assign(0, '邮件发送成功!'); } else { return to_assign(1, '邮件发送失败!'); } } public function get_captcha() { return captcha(); } // 新增接口 public function pullart() { // 允许来自任何来源的跨域请求 header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Headers: Content-Type'); $images = Db::name('PicbedImages')->order('id', 'desc')->select()->toArray(); // 获取当前请求的域名 $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http'; $host = $_SERVER['HTTP_HOST']; $baseUrl = $protocol . '://' . $host; // 筛选出只需要的字段并拼接完整路径 $images = array_map(function ($image) use ($baseUrl) { return [ 'name' => htmlspecialchars($image['name'], ENT_QUOTES), 'path' => $baseUrl . '/' . $image['path'], ]; }, $images); return json(['code' => 0, 'msg' => '', 'data' => $images]); } public function getallstaff() { $employees = Db::name('admin') ->field('id, name, status') // 根据需要选择字段 ->where('status', 1) // 只获取在职员工 ->select(); return to_assign(0, '', $employees); } }