重构系统附件字段逻辑

修改各模块附件功能
This commit is contained in:
乐风 2021-03-21 05:07:01 +08:00
parent fb37c7110b
commit decaabd448
45 changed files with 656 additions and 1513 deletions

View File

@ -30,7 +30,7 @@
</div>
<div class="wrapper-sm">
@include('attachment/view')
@include('attachment/show')
</div>
</div>
</div>

View File

@ -285,12 +285,9 @@ class EventController extends DefaultController
$repeats['repeat_date'] = '';
$repeats['repeat_year'] = 'bydate';
$attachment['model'] = 'calendar_attachment';
$attachment['path'] = 'calendar';
$attachment['draft'] = AttachmentService::draft(Auth::id());
$attachment = AttachmentService::edit('', 'calendar_object', 'attachment', 'calendar');
return $this->render(array(
'attachList' => $attachment,
'attachment' => $attachment,
'options' => $options,
'repeats' => $repeats,
));
@ -594,14 +591,10 @@ class EventController extends DefaultController
$repeats['repeat_year'] = 'bydate';
}
$attachment['model'] = 'calendar_attachment';
$attachment['path'] = 'calendar';
$attachment['draft'] = AttachmentService::draft(Auth::id());
$attachment['queue'] = AttachmentService::get($event['attachment']);
$attachment = AttachmentService::edit($event['attachment'], 'calendar_object', 'attachment', 'calendar');
$share = ShareService::getItem('event', $gets['id']);
return $this->render(array(
'attachList' => $attachment,
'attachment' => $attachment,
'repeats' => $repeats,
'options' => $options,
'share' => $share,
@ -673,7 +666,7 @@ class EventController extends DefaultController
$attach['model'] = 'calendar_attachment';
$attach['path'] = 'calendar';
$attach['main'] = AttachmentService::get($event['attachment']);
$attach['rows'] = AttachmentService::get($event['attachment']);
$calendar = CalendarService::getCalendar($event['calendarid'], false);
$share = ShareService::getItem('event', $id);
@ -692,6 +685,7 @@ class EventController extends DefaultController
if ($id > 0) {
CalendarService::remove($id);
ShareService::removeItem('event', $id);
return $this->json('删除成功。', true);
}
}

View File

@ -73,7 +73,7 @@
<tr>
<td align="right">附件列表</td>
<td align="left">
@include('attachment/add')
@include('attachment/create')
</td>
</tr>

View File

@ -16,6 +16,7 @@ use Gdoo\Chat\Models\Message;
use Gdoo\Chat\Services\ChatService;
use Gdoo\Index\Controllers\Controller;
use Str;
class ChatController extends Controller
{
@ -76,10 +77,10 @@ class ChatController extends Controller
$upload_path = upload_path().'/'.$path;
// 文件新名字
$filename = date('dhis_').str_random(4).'.'.$extension;
$filename = date('dhis_').Str::random(4).'.'.$extension;
$filename = mb_strtolower($filename);
$size = $file->getClientSize();
$size = $file->getSize();
$name = mb_strtolower($file->getClientOriginalName());
$mime = $file->getMimeType();

View File

@ -48,7 +48,7 @@ class AttachmentController extends DefaultController
// 扩展名称
$extension = $file->getClientOriginalExtension();
// 附件新名字
$filename = date('dhis_').str_random(4).'.'.$extension;
$filename = date('dhis_').Str::random(4).'.'.$extension;
$filename = mb_strtolower($filename);
$uploadSuccess = $file->move($upload_path, $filename);
@ -58,7 +58,7 @@ class AttachmentController extends DefaultController
$draft->name = mb_strtolower($file->getClientOriginalName());
$draft->path = $path.'/'.$filename;
$draft->type = $extension;
$draft->size = $file->getClientSize();
$draft->size = $file->getSize();
$draft->save();
return $draft->id;
}

View File

@ -85,6 +85,7 @@ class InspectReportController extends DefaultController
// 附件新名字
$filename = date('dhis_').Str::random(4).'.'.$extension;
$filename = mb_strtolower($filename);
$filesize = $file->getSize();
$uploadSuccess = $file->move($upload_path, $filename);
if ($uploadSuccess) {
// 数据库写入
@ -92,7 +93,7 @@ class InspectReportController extends DefaultController
$draft->name = $name;
$draft->path = $path.'/'.$filename;
$draft->type = $extension;
$draft->size = $file->getClientSize();
$draft->size = $filesize;
$draft->save();
return $this->json('文件上传成功。', true);
}

View File

@ -11,12 +11,22 @@ use URL;
class AttachmentController extends DefaultController
{
public $permission = ['list','view','preview','create','delete','download','show', 'uploader', 'draft', 'qrcode'];
public $permission = [
'list',
'preview',
'create',
'upload',
'delete',
'download',
'show',
'draft',
'qrcode'
];
/**
* 上传文件
*/
public function uploader()
public function upload()
{
if (Request::method() == 'POST') {
$file = Request::file('file');
@ -34,7 +44,8 @@ class AttachmentController extends DefaultController
}
// 获取上传uri第一个目录
$key = Request::get('key', 'default');
$table = Request::get('table');
$field = Request::get('field');
$node = Request::get('path', 'default');
$path = $node.date('/Ym/');
@ -43,15 +54,16 @@ class AttachmentController extends DefaultController
// 文件新名字
$filename = date('dhis_').Str::random(4).'.'.$extension;
$filename = mb_strtolower($filename);
$filesize = $file->getSize();
if ($file->move($upload_path, $filename)) {
$data = [
'name' => mb_strtolower($file->getClientOriginalName()),
'node' => $node,
'table' => $table,
'field' => $field,
'path' => $path.$filename,
'type' => $extension,
'key' => $key,
'size' => $file->getClientSize(),
'size' => $filesize,
];
$insertId = DB::table('attachment')->insertGetId($data);
$data['id'] = $insertId;
@ -61,68 +73,12 @@ class AttachmentController extends DefaultController
}
}
$query = Request::all();
$SERVER_URL = url("index/attachment/uploader", $query);
$SERVER_URL = url("index/attachment/upload", $query);
return $this->render([
'SERVER_URL' => $SERVER_URL,
'key' => $query['key'],
'key' => $query['table'].'_'.$query['field'],
]);
}
/**
* 新建文件
*/
public function create()
{
set_time_limit(0);
$file = Request::file('Filedata');
$rules = [
'file' => 'mimes:'.$this->setting['upload_type'],
];
$v = Validator::make(['file' => $file], $rules);
if ($file->isValid() && $v->passes()) {
// 获取上传uri第一个目录
$path = Request::get('path', 'main').date('/Y/m/');
$upload_path = upload_path().'/'.$path;
// 文件后缀名
$extension = $file->getClientOriginalExtension();
// 文件新名字
$filename = date('dhis_').Str::random(4).'.'.$extension;
$filename = mb_strtolower($filename);
if ($file->move($upload_path, $filename)) {
return DB::table('attachment')->insertGetId([
'name' => mb_strtolower($file->getClientOriginalName()),
'path' => $path.$filename,
'type' => $extension,
'size' => $file->getClientSize(),
]);
}
}
return 0;
}
/**
* 二维码上传
*/
public function qrcode()
{
$key = Request::get('key');
$path = Request::get('path');
list($table, $field) = explode('.', $key);
$model = DB::table('model')->where('table', $table)->first();
$token = Request::get('x-auth-token');
return $this->render([
'model' => $model,
'token' => $token,
'key' => $key,
], 'attachment.qrcode');
}
/**
* 获取文件列表

View File

@ -3,6 +3,7 @@
use Request;
use DB;
use Auth;
use Str;
class AttachmentService
{
@ -26,15 +27,16 @@ class AttachmentService
}
// 文件新名字
$name = date('dhis_').str_random(4).'.'.$extension;
$name = date('dhis_').Str::random(4).'.'.$extension;
$name = mb_strtolower($name);
$size = $file->getSize();
if ($file->move($upload_path, $name)) {
$res[] = DB::table('attachment')->insertGetId([
'name' => $name,
'path' => $path.'/'.$name,
'type' => $extension,
'size' => $file->getClientSize(),
'size' => $size,
'status' => 1,
]);
}
@ -55,7 +57,7 @@ class AttachmentService
$res = [];
foreach ($images as $image) {
$name = date('dhis_').str_random(4).'.'.$extension;
$name = date('dhis_').Str::random(4).'.'.$extension;
$name = mb_strtolower($name);
$image = base64_decode(str_replace(' ', '+', $image));
@ -81,8 +83,7 @@ class AttachmentService
if (is_array($ids)) {
return $ids;
}
$ids = array_filter(explode("\n", $ids));
$ids = array_filter(explode(",", $ids));
return (array)$ids;
}
@ -91,7 +92,7 @@ class AttachmentService
*/
public static function get($ids)
{
$ids = self::getIds($ids);
$ids = static::getIds($ids);
return DB::table('attachment')
->whereIn('id', $ids)
->where('status', 1)->get();
@ -100,10 +101,13 @@ class AttachmentService
/**
* 获取当前ID附件和草稿
*/
public static function edit($ids, $key)
public static function edit($ids, $table, $field, $path = 'default')
{
$res['rows'] = self::get($ids);
$res['draft'] = self::draft($key);
$res['path'] = $path;
$res['table'] = $table;
$res['field'] = $field;
$res['rows'] = static::get($ids);
$res['draft'] = static::draft($table, $field);
return $res;
}
@ -112,7 +116,7 @@ class AttachmentService
*/
public static function show($ids)
{
$res['rows'] = self::get($ids);
$res['rows'] = static::get($ids);
return $res;
}
@ -121,7 +125,7 @@ class AttachmentService
*/
public static function publish($ids)
{
$ids = self::getIds($ids);
$ids = static::getIds($ids);
$rows = DB::table('attachment')
->whereIn('id', $ids)
->where('status', 0)
@ -137,9 +141,9 @@ class AttachmentService
/**
* 发布附件,改成状态为可用
*/
public static function store($key)
public static function store($table, $field)
{
$rows = self::draft($key);
$rows = static::draft($table, $field);
foreach ($rows as $row) {
DB::table('attachment')->where('id', $row['id'])->update([
'status' => 1,
@ -151,14 +155,15 @@ class AttachmentService
/**
* 获取草稿文件
*/
public static function draft($key, $user_id = 0)
public static function draft($table, $field, $user_id = 0)
{
if ($user_id == 0) {
$user_id = auth()->id();
}
return DB::table('attachment')
->where('created_id', $user_id)
->where('key', $key)
->where('table', $table)
->where('field', $field)
->where('status', '0')
->get();
}

View File

@ -469,10 +469,6 @@ class Form
$attribute = [];
if ($action == 'show') {
$field['is_show'] = true;
}
$permission_table = $permission[$flow['table']];
$p = $permission_table[$field['field']];
$field['is_print'] = $action == 'print';
@ -481,12 +477,13 @@ class Form
$field['is_auto'] = $p['m'] == 1 ? 1 : 0;
$field['is_hide'] = $p['s'] == 1 ? 1 : $field['is_hide'];
$validate = (array) $p['v'];
if ($action == 'print') {
$field['is_show'] = true;
if ($action == 'show' || $action == 'print') {
$field['is_show'] = 1;
$field['is_write'] = 0;
}
$validate = (array) $p['v'];
if ($action == 'print') {
} else {
$required = '';
@ -2000,7 +1997,7 @@ class Form
// 权限可写
if ($permission['w'] == 1) {
// 自定义过滤器
$_field_data = Hook::fire($table.'.onFieldFilter', ['table' => $table, 'master' => $master, 'field' => $field, 'values' => $values]);
extract($_field_data);
@ -2033,7 +2030,7 @@ class Form
case 'files':
$value = (array)$value;
$dataFiles = array_merge($dataFiles, $value);
$value = join("\n", $value);
$value = join(",", $value);
break;
case 'images':
$value = join("\n", (array)$value);

View File

@ -1343,6 +1343,38 @@ class FieldService
return join(' ', $str);
}
public static function content_location($field, $content = '', $row)
{
$field = static::content_field($field);
$setting = $field['setting'];
$attribute = $field['attribute'];
$id = $attribute['id'];
$name = $attribute['name'];
$attribute['readonly'] = 'readonly';
if ($field['is_show']) {
return '
<div id="'.$id.'-media" class="media-controller">
<i class="icon icon-map-marker text-info text-sm"></i><a href="javascript:;" data-location="'.$row['location'].'" data-longitude="'.$row['longitude'].'" data-latitude="'.$row['latitude'].'" data-toggle="map-show">'.$content.'</a>
</div>';
} else {
$str = '
<div class="input-group">
<div class="input-group-btn">
<a href="javascript:;" data-location="'.$row['location'].'" data-name="'.$name.'" data-id="'.$id.'" data-longitude="'.$row['longitude'].'" data-latitude="'.$row['latitude'].'" data-toggle="map-select" class="btn btn-sm btn-info"><i class="fa fa-map"></i> 选择位置</a>
</div>
</div>
<div id="'.$id.'-media" class="media-controller media-input">
<input type="text" class="form-control input-sm" autocomplete="off" id="'.$id.'" value="' .$content. '" name="' .$name. '">
<input type="hidden" id="'.$id.'_longitude" value="'.$row['longitude'].'" name="' .$field['table']. '[longitude]" />
<input type="hidden" id="'.$id.'_latitude" value="'.$row['latitude'].'" name="' .$field['table']. '[latitude]" />
</div>';
}
return $str;
}
public static function content_image($field, $content = '')
{
$field = static::content_field($field);
@ -1453,38 +1485,6 @@ class FieldService
return $html;
}
public static function content_location($field, $content = '', $row)
{
$field = static::content_field($field);
$setting = $field['setting'];
$attribute = $field['attribute'];
$id = $attribute['id'];
$name = $attribute['name'];
$attribute['readonly'] = 'readonly';
if ($field['is_show']) {
return '
<div id="'.$id.'-media" class="media-controller">
<i class="icon icon-map-marker text-info text-sm"></i><a href="javascript:;" data-location="'.$row['location'].'" data-longitude="'.$row['longitude'].'" data-latitude="'.$row['latitude'].'" data-toggle="map-show">'.$content.'</a>
</div>';
} else {
$str = '
<div class="input-group">
<div class="input-group-btn">
<a href="javascript:;" data-location="'.$row['location'].'" data-name="'.$name.'" data-id="'.$id.'" data-longitude="'.$row['longitude'].'" data-latitude="'.$row['latitude'].'" data-toggle="map-select" class="btn btn-sm btn-info"><i class="fa fa-map"></i> 选择位置</a>
</div>
</div>
<div id="'.$id.'-media" class="media-controller media-input">
<input type="text" class="form-control input-sm" autocomplete="off" id="'.$id.'" value="' .$content. '" name="' .$name. '">
<input type="hidden" id="'.$id.'_longitude" value="'.$row['longitude'].'" name="' .$field['table']. '[longitude]" />
<input type="hidden" id="'.$id.'_latitude" value="'.$row['latitude'].'" name="' .$field['table']. '[latitude]" />
</div>';
}
return $str;
}
public static function content_file($name, $content = '', $field = '')
{
// 配置
@ -1502,140 +1502,100 @@ class FieldService
{
$field = static::content_field($field);
$setting = $field['setting'];
$attribute = $field['attribute'];
$name = $attribute['name'];
$key = $attribute['key'];
$input_id = $attribute['id'];
$config = Setting::where('type', 'system')->pluck('value', 'key');
$input_id = $attribute['id'];
$attachment = AttachmentService::edit($content, $field['table'], $field['field']);
$attachment = AttachmentService::edit($content, $key);
$str = '<div id="file_'.$input_id.'" class="uploadify-queue">';
if ($field['is_read'] || $field['is_show']) {
$str = '<div id="fileQueue_'.$input_id.'" class="uploadify-queue">';
if ($field['is_write']) {
$str .= '<a class="btn btn-sm btn-info hinted" title="文件大小限制: '.$config['upload_max'].'MB" href="javascript:viewBox(\'attachment\', \'上传\', \''.url('index/attachment/upload', ['path' => Request::module(), 'table' => $field['table'], 'field' => $field['field']]).'\');"><i class="fa fa-cloud-upload"></i> 文件上传</a>';
$str .= '<div class="clear"></div>';
}
if (count((array)$attachment['rows'])) {
foreach ($attachment['rows'] as $file) {
$str .= '<div id="file_queue_'.$file['id'].'" class="uploadify-queue-item">
<span class="file-name"><i class="icon icon-paperclip"></i> <a class="option" title="下载" download="'.$file['name'].'" href="'.URL::to('uploads').'/'.$file['path'].'">'.$file['name'].'</a></span>
<input type="hidden" class="'.$input_id.' id" value="'.$file['id'].'">';
if (in_array($file['type'], ['pdf'])) {
$str .= '<a href="'.URL::to('uploads').'/'.$file['path'].'" class="btn btn-xs btn-default" target="_blank">[预览]</a>';
} elseif (in_array($file['type'], ['jpg','png','gif','bmp'])) {
// $str .= '<a data-toggle="dialog-image2" src="'.URL::to('uploads').'/'.$file['path'].'" data-original="'.URL::to('uploads').'/'.$file['path'].'" data-title="附件预览" class="option">[预览]</a>';
$str .= '<img data-original="'.URL::to('uploads').'/'.$file['path'].'" /><a data-toggle="image-show" data-title="附件预览" class="option">[预览]</a>';
}
$str .= '<span class="file-size">('.human_filesize($file['size']).')</span> <span class="file-created_by"> '.$file['created_by'].' </span>';
$str .= '</div><div class="clear"></div>';
if (count((array)$attachment['rows'])) {
foreach ($attachment['rows'] as $file) {
$str .= '<div id="file_queue_'.$file['id'].'" class="uploadify-queue-item">
<span class="file-name"><i class="icon icon-paperclip"></i> <a class="option" title="下载" download="'.$file['name'].'" href="'.URL::to('uploads').'/'.$file['path'].'">'.$file['name'].'</a></span>
<input type="hidden" class="'.$input_id.' id" name="'. $name . '[]" value="'.$file['id'].'">';
// pdf
if (in_array($file['type'], ['pdf'])) {
$str .= '<a href="'.URL::to('uploads').'/'.$file['path'].'" class="btn btn-xs btn-default" target="_blank">[预览]</a>';
}
// 图片
if (in_array($file['type'], ['jpg','png','gif','bmp'])) {
$str .= '<img data-original="'.URL::to('uploads').'/'.$file['path'].'" /><a data-toggle="image-show" class="option">[预览]</a>';
}
// 删除
if ($field['is_write']) {
$str .= '<span class="cancel"><a class="option gray hinted" title="删除文件" href="javascript:uploader.cancel(\'file_queue_'.$file['id'].'\');"><i class="fa fa-times-circle"></i></a></span>';
}
$str .= '<span class="file-size">('.human_filesize($file['size']).')</span> <span class="file-created_by"> '.$file['created_by'].' </span>';
$str .= '</div><div class="clear"></div>';
}
$str .= '</div>';
$str .= '<script type="text/javascript">
(function($) {
var galley_id = "fileQueue_'.$input_id.'";
var galley = document.getElementById(galley_id);
var viewer = new Viewer(galley, {
navbar: false,
url: "data-original",
});
$("#" + galley_id).on("click", \'[data-toggle="image-show"]\', function() {
$(this).prev().click();
});
})(jQuery);
</script>';
return $str;
} else {
//$qrcode = url('index/attachment/qrcode', ['path' => Request::module(), 'key' => $key, 'x-auth-token' => create_token(auth()->id(), 7)]);
$str = '<script id="uploader-item-tpl" type="text/html">
}
if ($field['is_write']) {
$str .= '<script id="upload-item-tpl" type="text/html">
<div id="file_draft_<%=id%>" class="uploadify-queue-item">
<span class="file-name"><span class="text-danger hinted" title="草稿状态">!</span> <a class="option" href="javascript:uploader.file(\'file_draft_<%=id%>\', \''.URL::to('uploads').'/<%=path%>\');"><%=name%></a></span>
<span class="file-size">(<%=size%>)</span>
<img data-original="'.URL::to('uploads').'/<%=path%>" /><a data-toggle="image-show" data-title="附件预览" class="option">[预览]</a>
<span class="cancel"><a class="option gray hinted" title="删除文件" href="javascript:uploader.cancel(\'file_draft_<%=id%>\');"><i class="fa fa-times-circle"></i></a></span>
<input type="hidden" class="'.$input_id.' id" name="'. $name . '[]" value="<%=id%>" />
</div>
<div class="clear"></div>
</script>
<div class="uploadify-queue">';
/*
<script src="'.URL::to('/assets').'/vendor/jquery.qrcode.min.js"></script>
<style>
.layui-layer-tips .layui-layer-content {
background-color: #eee;
padding: 8px;
}
.layui-layer-tips i.layui-layer-TipsL, .layui-layer-tips i.layui-layer-TipsR {
border-bottom-color: #eee;
}
</style>
*/
$str .= '<a class="btn btn-sm btn-info hinted" title="文件大小限制: '.$config['upload_max'].'MB" href="javascript:viewBox(\'attachment\', \'上传\', \''.url('index/attachment/uploader', ['path' => Request::module(), 'key' => $key]).'\');"><i class="fa fa-cloud-upload"></i> 文件上传</a>';
/*
<a class="btn btn-sm btn-info" id="qrcode_'.$input_id.'_btn" href="javascript:;"><i class="fa fa-qrcode"></i> 扫码上传</a>
<div id="qrcode_'.$input_id.'" style="display:none;"></div>
*/
$str .= '<div class="clear"></div>
<div id="fileQueue_'.$input_id.'" class="uploadify-queue">';
if (count((array)$attachment['rows'])) {
foreach ($attachment['rows'] as $file) {
$str .= '<div id="file_queue_'.$file['id'].'" class="uploadify-queue-item">
<span class="file-name"><span class="icon icon-paperclip"></span> <a class="option" href="javascript:uploader.file(\'file_queue_'.$file['id'].'\', \''.URL::to('uploads').'/'.$file['path'].'\');">'.$file['name'].'</a></span>
<span class="file-size">('.human_filesize($file['size']).')</span>
<span class="cancel"><a class="option gray hinted" title="删除文件" href="javascript:uploader.cancel(\'file_queue_'.$file['id'].'\');"><i class="fa fa-times-circle"></i></a></span>
<input type="hidden" class="'.$input_id.' id" name="'. $name . '[]" value="'.$file['id'].'">
</div>
<div class="clear"></div>';
}
}
$str .= '</div><div id="fileDraft_'.$input_id.'">';
</script>';
$str .= '<div id="fileDraft_'.$input_id.'">';
if (count($attachment['draft'])) {
foreach ($attachment['draft'] as $file) {
$str .= '<div id="queue_draft_'.$file['id'].'" class="uploadify-queue-item">
<span class="file-name"><span class="text-danger hinted" title="草稿附件">!</span> <a class="option" href="javascript:uploader.file(\'queue_draft_'.$file['id'].'\', \''.URL::to('uploads').'/'.$file['path'].'\');">'.$file['name'].'</a></span>
<span class="file-size">('.human_filesize($file['size']).')</span>
<span class="cancel"><a class="option gray hinted" title="删除文件" href="javascript:uploader.cancel(\'queue_draft_'.$file['id'].'\');"><i class="fa fa-times-circle"></i></a></span>
<span class="file-size">('.human_filesize($file['size']).')</span>';
// pdf
if (in_array($file['type'], ['pdf'])) {
$str .= '<a href="'.URL::to('uploads').'/'.$file['path'].'" class="btn btn-xs btn-default" target="_blank">[预览]</a>';
}
// 图片
if (in_array($file['type'], ['jpg','png','gif','bmp'])) {
$str .= '<img data-original="'.URL::to('uploads').'/'.$file['path'].'" /><a data-toggle="image-show" class="option">[预览]</a>';
}
$str .= '<span class="cancel"><a class="option gray hinted" title="删除文件" href="javascript:uploader.cancel(\'queue_draft_'.$file['id'].'\');"><i class="fa fa-times-circle"></i></a></span>
<input type="hidden" class="'.$input_id.' id" name="'. $name . '[]" value="'.$file['id'].'">
</div>
<div class="clear"></div>';
}
}
$str .= '</div></div>';
/*
$str .= '<script type="text/javascript">
(function($) {
$("#qrcode_'.$input_id.'").qrcode({
render: "canvas",
text: "'.$qrcode.'",
width: 150,
height: 150
});
var qr = $("#qrcode_'.$input_id.'").find("canvas")[0];
var qrimg = "<img src="+ qr.toDataURL() +" />";
var qrcode_index = 0;
var timer_'.$input_id.' = null;
$("#qrcode_'.$input_id.'_btn").on("mouseenter", function() {
qrcode_index = layer.tips(qrimg, "#qrcode_'.$input_id.'_btn", {
time: 0,
});
// 激活扫码上传功能
if(timer_'.$input_id.' == null) {
timer_'.$input_id.' = setInterval(\'FindFile("'.$input_id.'", "'.$key.'")\', 3000);
}
}).on("mouseleave", function() {
layer.close(qrcode_index);
});
})(jQuery);
</script>';
*/
return $str;
$str .= '</div>';
}
$str .= '</div><script type="text/javascript">
(function($) {
var galley_id = "file_'.$input_id.'";
var galley = document.getElementById(galley_id);
var viewer = new Viewer(galley, {
navbar: false,
url: "data-original",
});
$("#" + galley_id).on("click", \'[data-toggle="image-show"]\', function() {
$(this).prev().click();
});
})(jQuery);
</script>';
return $str;
}
}

View File

@ -13,6 +13,7 @@ use Gdoo\Project\Models\Task;
use Gdoo\Project\Models\Log;
use Gdoo\Index\Controllers\DefaultController;
use Gdoo\Index\Services\AttachmentService;
class CommentController extends DefaultController
{
@ -43,7 +44,9 @@ class CommentController extends DefaultController
$task_id = $request->input('task_id');
$attachment = AttachmentService::edit('', 'project_task_log', 'attachment', 'project');
return $this->render([
'attachment' => $attachment,
'task_id' => $task_id,
]);
}
@ -68,7 +71,9 @@ class CommentController extends DefaultController
$id = $request->input('id');
$log = Log::find($id);
$attachment = AttachmentService::edit($log['attachment'], 'project_task_log', 'attachment', 'project');
return $this->render([
'attachment' => $attachment,
'log' => $log,
]);
}
@ -84,8 +89,13 @@ class CommentController extends DefaultController
return $this->json('请先选择数据。');
}
$rows = Log::whereIn('id', $id)->get();
Log::whereIn('id', $id)->delete();
foreach($rows as $row) {
AttachmentService::remove($row['attachment']);
}
return $this->json('恭喜你,删除评论成功。', true);
}
}

View File

@ -23,8 +23,9 @@ class ProjectController extends DefaultController
public function index()
{
$search = search_form([
'advanced' => '',
'referer' => 1,
'status' => 0
'status' => 1
], [
['text', 'project.title', '名称'],
['text', 'project.user_id', '拥有者'],
@ -62,25 +63,14 @@ class ProjectController extends DefaultController
$rows = $model->paginate()->appends($query);
$tabs = [
'name' => 'status',
'items' => Project::$tabs
];
return $this->display([
'auth_id' => $auth_id,
'rows' => $rows,
'search' => $search,
'tabs' => $tabs,
'query' => $query,
'search' => $search
]);
}
// 项目详情
public function show(Request $request)
{
return $this->display([]);
}
// 添加项目
public function add(Request $request)
{

View File

@ -27,14 +27,29 @@ class TaskController extends DefaultController
public function index(Request $request)
{
$search = search_form([
'advanced' => '',
'project_id' => '',
'tpl' => 'gantt',
'referer' => '',
'tpl' => 'index',
], [
['text','project_task.name','任务名称'],
['text','project_task.user_id','执行者'],
]);
['form_type' => 'text', 'name' => '任务名称', 'field' => 'project_task.name', 'value' => '', 'options' => []],
['form_type' => 'text', 'name' => '执行者', 'field' => 'project_task.user_id', 'value' => '', 'options' => []],
], 'model');
$header = [
'master_name' => '项目任务',
'simple_search_form' => 1,
'table' => 'project_task',
'master_table' => 'project_task',
];
/*
$header['buttons'] = [
['name' => '删除', 'icon' => 'fa-remove', 'action' => 'delete', 'display' => $this->access['delete']],
['name' => '导出', 'icon' => 'fa-share', 'action' => 'export', 'display' => 1],
];
*/
$header['search_form'] = $search;
$query = $search['query'];
if ($request->ajax() && $request->wantsJson()) {
@ -62,38 +77,14 @@ class TaskController extends DefaultController
'add_task' => $project['user_id'] == $user_id,
];
// 返回页面
$referer = session()->get('referer_'.$request->module().'_project_index');
return $this->display([
'header' => $header,
'project' => $project,
'search' => $search,
'query' => $query,
'referer' => $referer,
'permission' => $permission,
], 'index/'.$query['tpl']);
}
// 显示任务
public function show(Request $request)
{
$search = search_form([
'project_id' => ''
], [
['text','project.title','任务名称'],
['text','project.created_at','执行者'],
]);
$project_id = $request->input('project_id');
$project = Project::find($project_id);
return $this->render([
'project' => $project,
'search' => $search,
]);
}
// 移动任务
public function drag(Request $request)
{
@ -180,8 +171,11 @@ class TaskController extends DefaultController
->get();
$tpl = $type == 'item' ? 'item/add' : 'add';
$attachment = AttachmentService::edit('', 'project_task', 'attachment', 'project');
return $this->render([
'items' => $items,
'attachment' => $attachment,
'project_id' => $project_id,
'parent_id' => $parent_id,
'type' => $type,
@ -300,12 +294,15 @@ class TaskController extends DefaultController
];
}
$tpl = $type == 'item' ? 'item/edit' : 'edit';
$attachment = AttachmentService::edit($task['attachment'], 'project_task', 'attachment', 'project');
return $this->render([
'task' => $task,
'logs' => $logs,
'items' => $items,
'tasks' => $tasks,
'type' => $type,
'attachment' => $attachment,
'permission' => $permission,
], $tpl);
}

View File

@ -1,29 +1,21 @@
<style>
.modal-body { overflow:hidden; }
</style>
<form method="post" action="{{url()}}" id="comment-form" name="comment-form">
<div class="panel m-b-none">
<table class="table table-form m-b-none">
<tr>
<td>
<textarea class="form-control" type="text" name="content" id="content"></textarea>
</td>
</tr>
<tr>
<td align="left">
{{attachment_uploader('comment_attachment', $comment['attachment'], 'project_task_log')}}
@include('attachment/create')
</td>
</tr>
</table>
</div>
</div>
<input type="hidden" name="task_id" value="{{$task_id}}">
</form>

View File

@ -4,26 +4,19 @@
<form method="post" action="{{url()}}" id="comment-form" name="comment-form">
<div class="panel m-b-none">
<table class="table table-form m-b-none">
<tr>
<td>
<textarea class="form-control" type="text" name="content" id="content"></textarea>
</td>
</tr>
<tr>
<td align="left">
{{attachment_uploader('comment_attachment', $comment['attachment'], 'project_task_log')}}
@include('attachment/create')
</td>
</tr>
</table>
</div>
</div>
<input type="hidden" name="id" value="{{$comment->id}}">
</form>

View File

@ -1,6 +1,6 @@
<div class="panel">
<div class="wrapper-sm">
<div class="wrapper-xs">
@include('project/query')
</div>
@ -16,7 +16,7 @@
@if($row->tasks->count())
<span class="text-base badge bg-danger">{{$row->tasks->count()}}</span>
@endif
<a class="m-t-sm" href="{{url('task/index', ['project_id' => $row->id])}}">
<a class="m-t-sm" data-toggle="tab-frame-url" data-name="项目任务详情" data-id="project_task_index" data-url="project/task/index?project_id={{$row->id}}" href="javascript:;">
{{$row->name}}
</a>
</h4>
@ -48,7 +48,7 @@
<div class="col-sm-1 hidden-xs">
</div>
<div class="col-sm-11 text-right text-center-xs">
{{$rows->render()}}
{{$rows->links()}}
</div>
</div>
</div>

View File

@ -3,8 +3,8 @@
</style>
<form method="post" action="{{url()}}" id="task-form" name="task-form">
<input type="hidden" name="type" value="{{$type}}">
@if($type == 'subtask')
<input type="hidden" name="parent_id" value="{{$parent_id}}">
@endif
@ -72,7 +72,7 @@
<tr>
<td align="right">附件</td>
<td align="left">
{{attachment_uploader('attachment', '', 'project_task')}}
@include('attachment/create')
</td>
</tr>

View File

@ -1,11 +1,10 @@
<style>
.modal-body {
overflow: hidden;
}
.wrapper-sm {
background-color: #f0f3f4;
}
.modal-body {
overflow: hidden;
}
.wrapper-sm {
background-color: #f0f3f4;
}
</style>
<div class="wrapper-sm">
@ -126,9 +125,9 @@
<td align="right">附件</td>
<td align="left">
@if($permission['attachment'])
{{attachment_uploader('attachment', $task['attachment'], 'project_task')}}
@include('attachment/create')
@else
{{attachment_show('attachment', $task['attachment'], 'project_task')}}
@include('attachment/show')
@endif
</td>
</tr>
@ -179,10 +178,8 @@
</ul>
</div>
</div>
<div class="task-log" id="task-log-{{$task->id}}">
<div class="panel b-a m-b-none">

View File

@ -4,11 +4,9 @@
<script src="{{$asset_url}}/vendor/dhtmlxgantt/locale_cn.js" type="text/javascript"></script>
<link rel="stylesheet" href="{{$asset_url}}/vendor/dhtmlxgantt/dhtmlxgantt.css" type="text/css">
<style type="text/css">
/* 新样式 */
html, body {
overflow: hidden;
}
.gantt_side_content.gantt_right {
padding-left: 10px;
}
@ -18,7 +16,7 @@ html, body {
}
.gantt_container {
border: 1px solid #eee;
border: 1px solid #fff;
border-top: 1px solid #cecece;
}
@ -106,52 +104,8 @@ html, body {
</style>
<div class="panel">
<div class="wrapper-sm b-b">
<span class="text-md">{{$project['name']}}</span> <span class="text-muted">{{$project['description']}}</span>
</div>
<div class="wrapper-xs" id="gantt-wrapper">
<form id="search-task-form" class="form-inline" name="mytasksearch" method="get">
<div class="pull-right">
<div class="btn-group">
<a href="{{url('index', ['project_id' => $project['id'], 'tpl' => 'index'])}}" class="btn btn-sm btn-default @if($query['tpl'] == 'index') active @endif">列表</a>
<a href="{{url('index', ['project_id' => $project['id'], 'tpl' => 'gantt'])}}" class="btn btn-sm btn-default @if($query['tpl'] == 'gantt') active @endif">甘特图</a>
<!--
<a href="{{url('index', ['project_id' => $project['id'], 'tpl' => 'board'])}}" class="btn btn-sm btn-default @if($query['tpl'] == 'board') active @endif">看板</a>
-->
</div>
</div>
<a href="{{url($referer)}}" class="btn btn-sm btn-default"><i class="fa fa-reply"></i> 返回</a>
@if(isset($access['add']))
@if($permission['add_item'])
<a href="javascript:addItem();" title="添加列表" class="hinted btn btn-sm btn-info"><i class="icon icon-plus"></i> 添加列表</a>
@endif
@if($permission['add_task'])
<a href="javascript:addTask();" title="添加任务" class="hinted btn btn-sm btn-info"><i class="icon icon-plus"></i> 添加任务</a>
@endif
@endif
@include('searchForm')
<script type="text/javascript">
$(function() {
$('#search-task-form').searchForm({
data: {{json_encode($search['forms'])}},
init:function(e) {
var self = this;
}
});
});
</script>
</form>
</div>
<div class="panel no-border" id="{{$header['master_table']}}-controller">
@include('task/index/header')
<div id="gantt-view"></div>
</div>
@ -163,7 +117,6 @@ var params = {project_id:project_id};
gantt.config.columns = [
{name:"name", label:"任务列表", tree:true, width:'*', resize: true}
];
gantt.config.scale_unit = 'month';
gantt.config.date_scale = '%Y - %m';
gantt.config.scale_height = 50;
@ -284,7 +237,7 @@ gantt._do_autosize = function() {
// 设置高度
var height = $('#gantt-wrapper').outerHeight();
var iframeHeight = $(window).height();
$('#gantt-view').height(iframeHeight - height - 68 + 'px');
$('#gantt-view').height(iframeHeight - height - 102 + 'px');
var resize = this._get_resize_options();
var boxSizes = this._get_box_styles();
@ -308,15 +261,6 @@ gantt._do_autosize = function() {
gantt.init("gantt-view");
gantt.load(app.url('project/task/index', params));
$('#search-submit').on('click', function() {
var query = $('#search-task-form').serializeArray();
$.map(query, function(row) {
params[row.name] = row.value;
});
dataReload();
return false;
});
function dataReload() {
gantt.clearAll();
gantt.load(app.url('project/task/index', params));

View File

@ -0,0 +1,35 @@
<div class="wrapper-sm b-b">
<span class="text-md">{{$project['name']}}</span> <span class="text-muted">{{$project['description']}}</span>
</div>
<div id="index-wrapper">
<form id="{{$header['master_table']}}-search-form" class="form-inline" name="mytasksearch" method="get">
<div class="pull-right wrapper-xs">
<div class="btn-group">
<a href="{{url('index', ['project_id' => $project['id'], 'tpl' => 'index'])}}" class="btn btn-sm btn-default @if($header['search_form']['query']['tpl'] == 'index') active @endif">列表</a>
<a href="{{url('index', ['project_id' => $project['id'], 'tpl' => 'gantt'])}}" class="btn btn-sm btn-default @if($header['search_form']['query']['tpl'] == 'gantt') active @endif">甘特图</a>
</div>
</div>
@section('left_buttons')
@if(isset($access['add']))
@if($permission['add_item'])
<a href="javascript:addItem();" title="添加列表" class="hinted btn btn-sm btn-info"><i class="icon icon-plus"></i> 添加列表</a>
@endif
@if($permission['add_task'])
<a href="javascript:addTask();" title="添加任务" class="hinted btn btn-sm btn-info"><i class="icon icon-plus"></i> 添加任务</a>
@endif
@endif
@endsection
@include('headers')
</form>
</div>
<style type="text/css">
.ag-theme-balham .ag-root {
border-bottom: 0;
}
</style>

View File

@ -1,40 +1,8 @@
<div class="panel">
<div class="wrapper-sm b-b">
<span class="text-md">{{$project['name']}}</span> <span class="text-muted">{{$project['description']}}</span>
</div>
<div class="wrapper-xs" id="index-wrapper">
<form id="search-task-form" class="form-inline" name="mytasksearch" method="get">
<div class="pull-right">
<div class="btn-group">
<a href="{{url('index', ['project_id' => $project['id'], 'tpl' => 'index'])}}" class="btn btn-sm btn-default @if($query['tpl'] == 'index') active @endif">列表</a>
<a href="{{url('index', ['project_id' => $project['id'], 'tpl' => 'gantt'])}}" class="btn btn-sm btn-default @if($query['tpl'] == 'gantt') active @endif">甘特图</a>
</div>
</div>
<a href="{{url($referer)}}" class="btn btn-sm btn-default"><i class="fa fa-reply"></i> 返回</a>
@if(isset($access['add']))
@if($permission['add_item'])
<a href="javascript:addItem();" title="添加列表" class="hinted btn btn-sm btn-info"><i class="icon icon-plus"></i> 添加列表</a>
@endif
@if($permission['add_task'])
<a href="javascript:addTask();" title="添加任务" class="hinted btn btn-sm btn-info"><i class="icon icon-plus"></i> 添加任务</a>
@endif
@endif
@include('searchForm')
</form>
</div>
<div class="panel" id="{{$header['master_table']}}-controller">
@include('task/index/header')
<div class="gdoo-list-grid">
<div id="jqgrid-table" class="ag-theme-balham" style="width:100%;"></div>
</div>
</div>
<script>
@ -43,25 +11,6 @@ var project_id = "{{(int)$project['id']}}";
var params = {project_id:project_id};
var auth_id = '{{auth()->id()}}';
function progressRenderer(params) {
var data = params.data;
if (data.type == 'task' || data.type == 'subtask') {
if (params.value == 1) {
return '<div class="label label-success">已完成</div>';
} else {
return '<div class="label label-' + (auth_id == data.user_id ? 'danger' : 'info') + '">进行中</div>';
}
}
return '';
}
function durationRenderer(params) {
if (params.value) {
return '<span class="hinted" title="任务持续' + params.value + '">' + params.value + '</span>';
}
return '';
}
(function($) {
grid = new agGridOptions();
grid.remoteDataUrl = '{{url()}}';
@ -90,6 +39,25 @@ function durationRenderer(params) {
return data.tree_path;
};
function progressRenderer(params) {
var data = params.data;
if (data.type == 'task' || data.type == 'subtask') {
if (params.value == 1) {
return '<div class="label label-success">已完成</div>';
} else {
return '<div class="label label-' + (auth_id == data.user_id ? 'danger' : 'info') + '">进行中</div>';
}
}
return '';
}
function durationRenderer(params) {
if (params.value) {
return '<span class="hinted" title="任务持续' + params.value + '">' + params.value + '</span>';
}
return '';
}
grid.columnDefs.push(
{cellClass:'text-center', sortable: false, field: 'user_name', headerName: '执行者', width: 140},
{cellClass:'text-center', sortable: false, field: 'users', headerName: '参与者', minWidth: 200},
@ -115,24 +83,11 @@ function durationRenderer(params) {
};
var gridDiv = document.querySelector("#jqgrid-table");
gridDiv.style.height = getPanelHeight(12);
gridDiv.style.height = getPanelHeight(11);
new agGrid.Grid(gridDiv, grid);
grid.remoteData();
var search = $('#search-task-form').searchForm({
data: JSON.parse('{{json_encode($search["forms"])}}'),
init:function(e) {
var self = this;
}
});
search.find('#search-submit').on('click', function() {
var query = search.serializeArray();
params.page = 1;
grid.remoteData(params);
return false;
});
})(jQuery);
function dataReload() {
@ -141,7 +96,6 @@ function dataReload() {
}
function getTask(id) {
console.log(grid.api.getRowNode(id));
return grid.api.getRowNode(id);
}
</script>

View File

@ -1,4 +1,59 @@
<script>
(function($) {
var table = '{{$header["master_table"]}}';
var search = JSON.parse('{{json_encode($header["search_form"])}}');
search.advanced = {};
search.simple = {};
search.advanced.el = $('#' + table + '-search-form-advanced').searchForm({
data: search.forms,
advanced: true
});
search.simple.el = $('#' + table + '-search-form').searchForm({
data: search.forms
});
search.simple.el.find('#search-submit').on('click', function() {
var query = search.simple.el.serializeArray();
search.queryType = 'simple';
$.map(query, function(row) {
params[row.name] = row.value;
});
dataReload();
return false;
});
// 过滤数据
var panel = $('#' + table + '-controller');
panel.on('click', '[data-toggle="' + table + '"]', function() {
var data = $(this).data();
if (data.action == 'filter') {
$(search.advanced.el).dialog({
title: '高级搜索',
modalClass: 'no-padder',
buttons: [{
text: "取消",
'class': "btn-default",
click: function() {
$(this).dialog("close");
}
},{
text: "确定",
'class': "btn-info",
click: function() {
var query = search.advanced.el.serializeArray();
search.queryType = 'advanced';
$.map(query, function(row) {
params[row.name] = row.value;
});
dataReload();
$(this).dialog("close");
return false;
}
}]
});
}
});
})(jQuery);
function formsBox(title, url, id, success, remove, error)
{
var options = {
@ -11,7 +66,7 @@ function formsBox(title, url, id, success, remove, error)
if (typeof success === 'function') {
options.buttons.push({
text: '<i class="fa fa-check"></i> 提交',
text: '<i class="fa fa-check"></i> 保存',
class: 'btn-info',
click: function() {
var me = this;

View File

@ -1,106 +0,0 @@
<style>
.modal-body { overflow:hidden; }
</style>
<form method="post" enctype="multipart/form-data" id="mytaskform" name="mytaskform">
<div class="panel m-b-none">
<table class="table table-form m-b-none">
<tr>
<td align="right" width="15%">名称</td>
<td align="left">
<input type="text" name="name" id="name" value="{{$task['name']}}" class="form-control input-sm">
</td>
</tr>
<tr>
<td align="right">列表</td>
<td align="left">
<select class="form-control input-inline input-sm" id="item_id" name="item_id">
<option value="1">测试日程1_</option>
<option value="2">abc123</option>
<option value="408">一般事件</option>
</select>
</td>
</tr>
<tr>
<td align="right">执行者</td>
<td align="left">
{{App\Support\Dialog::user('user','user_id', $task['user_id'], 0, 0)}}
</td>
</tr>
<tr>
<td align="right">参与者</td>
<td align="left">
{{App\Support\Dialog::user('user', 'users', $task['users'], 1, 0)}}
</td>
</tr>
<tr>
<td align="right">时间</td>
<td align="left">
<input type="text" name="start_at" autocomplete="off" data-toggle="datetime" value="@datetime($task->start_at,time())" id="start_at" class="form-control input-sm input-inline">
-
<input type="text" name="end_at" autocomplete="off" data-toggle="datetime" value="@datetime($task->end_at)" id="end_at" class="form-control input-sm input-inline">
</td>
</tr>
<tr>
<td align="right">备注</td>
<td>
<textarea class="form-control" type="text" name="purchase_plan[remark]" id="remark" placeholder="暂无备注"></textarea>
</td>
</tr>
<tr>
<td align="right">附件</td>
<td align="left">
{{attachment_uploader('attachment', $task['attachment'])}}
</td>
</tr>
<tr>
<td align="right">子任务</td>
<td>
<a href="#" class="option"><i class="fa fa-fw fa-plus"></i>添加子任务</a>
</div>
</td>
</tr>
<tr>
<td align="right">评论</td>
<td>
<a href="#" class="option"><i class="fa fa-fw fa-plus"></i>添加评论</a>
<!--
<textarea class="form-control" rows="2" type="text" name="comment" id="comment" placeholder="内容"></textarea>
{{attachment_uploader('comment_attachment', '', false)}}
<a href="#" class="btn btn-sm btn-success"> 提交</a>
-->
</td>
</tr>
<tr>
<td align="right">活动</td>
<td>
<div class="project-task-log">
@if($logs)
@foreach($logs as $log)
<p><span class="time">@datetime($log->created_at)</span>{{$log->description}}</p>
@endforeach
@endif
</div>
</td>
</tr>
</table>
</div>
</div>
<input type="hidden" name="id" value="{{$task->id}}">
<input type="hidden" name="project_id" value="{{$project_id}}">
</form>

View File

@ -297,7 +297,7 @@ class MaterialController extends DefaultController
if ($image->move($upload_path, $filename)) {
// 修改图片大小
imageResize($upload_path.'/'.$filename, 1024, 1024);
image_resize($upload_path.'/'.$filename, 1024, 1024);
$rows[] = DB::table('promotion_material_file')->insertGetId([
'material_id' => $material_id,

View File

@ -12,23 +12,7 @@ use Illuminate\Support\Str;
class MediaController extends DefaultController
{
public $permission = ['dialog', 'qrcode', 'create', 'delete', 'download', 'folder'];
/**
* 二维码上传
*/
public function qrcode()
{
$key = Request::get('key');
list($table, $field) = explode('.', $key);
$model = DB::table('model')->where('table', $table)->first();
$token = Request::get('x-auth-token');
return $this->render([
'model' => $model,
'token' => $token,
'key' => $key,
], 'qrcode');
}
public $permission = ['dialog', 'create', 'delete', 'download', 'folder'];
public function create()
{
@ -53,6 +37,7 @@ class MediaController extends DefaultController
$fileTypes = ['image/png', 'image/jpg', 'image/jpeg'];
$mimeType = $file->getMimeType();
$filesize = $file->getSize();
if ($file->move($upload_path, $filename)) {
$data = [
@ -60,13 +45,12 @@ class MediaController extends DefaultController
'path' => $path.'/'.$filename,
'type' => $extension,
'folder_id' => $folderId,
'size' => $file->getClientSize(),
'size' => $filesize,
];
if (in_array($mimeType, $fileTypes)) {
thumb($upload_path.'/'.$filename, 420, 420);
$path = pathinfo($path.'/'.$filename);
$thumb = $path['dirname'].'/thumb-420-'.$path['basename'];
$thumb = $path['dirname'].'/'.thumb($upload_path.'/'.$filename, 750);
$data['thumb'] = $thumb;
}
@ -85,7 +69,7 @@ class MediaController extends DefaultController
public function dialog()
{
if (Request::method() == 'POST') {
$folder = Request::get('folder');
$folder = Request::get('folder');
$folderId = Request::get('folder_id');
$userId = auth()->id();
@ -103,9 +87,9 @@ class MediaController extends DefaultController
if (in_array($row['type'], ['png', 'jpg', 'jpeg'])) {
$file = $row['path'];
$path = pathinfo($file);
$thumb = $path['dirname'].'/thumb-420-'.$path['basename'];
$thumb = $path['dirname'].'/t750_'.$path['basename'];
if (!is_file(upload_path().'/'.$thumb)) {
thumb(upload_path().'/'.$file, 420, 420);
thumb(upload_path().'/'.$file, 750);
}
$row['path'] = $file;
$row['thumb'] = $thumb;

View File

@ -10,6 +10,8 @@ use App\Illuminate\Database\MySqlConnection;
use App\Illuminate\Database\SqlsrvConnection;
use Illuminate\Database\Events\StatementPrepared;
use Illuminate\Pagination\Paginator;
use Event;
use PDO;
@ -47,6 +49,7 @@ class AppServiceProvider extends ServiceProvider
*/
public function boot()
{
Paginator::defaultView('vendor/pagination/gdoo');
Event::listen(StatementPrepared::class, function ($event) {
$event->statement->setFetchMode(\PDO::FETCH_ASSOC);
});

View File

@ -135,7 +135,7 @@ class Image
{
// 原文件不存在
if (!is_file($file)) {
throw new Exception('原文件不存在。');
throw new \Exception('原文件不存在。');
}
$temp = getimagesize($file);
$this->srcw = $srcw = $temp[0];

View File

@ -488,256 +488,73 @@ function authorise($action = null, $asset_name = null)
return Gdoo\User\Services\UserService::authorise($action, $asset_name);
}
/**
* 附件上传
*/
function attachment_uploader($field, $ids, $key, $draft = true)
{
$attachments = Gdoo\Index\Services\AttachmentService::edit($ids, $key . '.' . $field);
if ($draft == false) {
unset($attachments['draft']);
}
return view('attachment/create2', [
'field' => $field,
'key' => $key,
'attachments' => $attachments,
]);
}
/**
* 附件显示
*/
function attachment_show($field, $ids = '')
{
$attachments = Gdoo\Index\Services\AttachmentService::show($ids);
return view('attachment/show2', [
'attachments' => $attachments,
]);
}
/**
* 附件编辑
*/
function attachment_edit($table, $id, $path = '')
{
$attach['model'] = $table;
$attach['path'] = $path;
$attach['draft'] = DB::table($table)->where('created_id', Auth::id())->where('status', 0)->get();
$id = array_filter(explode(',', $id));
if ($id) {
$queue = DB::table($table)->whereIn('id', $id)->where('status', 1)->get();
}
$attach['queue'] = array_by($queue);
return $attach;
}
/**
* 附件编辑
*/
function attachment_view($table, $id)
{
$attach['model'] = $table;
$id = array_filter(explode(',', $id));
if ($id) {
$queue = DB::table($table)->whereIn('id', $id)->where('status', 1)->get();
}
$attach['view'] = array_by($queue);
return $attach;
}
/**
* 查询附件
*/
function attachment_get($table, $id)
{
$id = array_filter(explode(',', $id));
if ($id) {
return DB::table($table)->whereIn('id', $id)->get();
}
return [];
}
/**
* 附件删除
*/
function attachment_delete($table, $id)
{
if ($id) {
$rows = DB::table($table)->whereIn('id', $id)->get();
foreach ($rows as $row) {
// 文件路径
$name = $row['path'] == '' ? $row['name'] : $row['path'];
$file = upload_path() . '/' . $name;
if (is_file($file)) {
unlink($file);
}
// 旧版文件删除
$old = upload_path() . '/' . $row['path'] . '/' . $row['name'];
if (is_file($old)) {
unlink($old);
}
DB::table($table)->where('id', $row['id'])->delete();
}
}
return true;
}
/**
* 将草稿附件存储为可用
*/
function attachment_store($table, $id)
{
if (empty($id)) {
return '';
}
foreach ($id as $_id) {
DB::table($table)->where('id', $_id)->update([
'status' => 1,
]);
}
return join(',', array_filter($id));
}
// 多图片base64上传保存
function attachment_base64($table, $images, $path = 'default', $extension = 'jpg')
{
$path = $path . '/' . date('Y/m');
$directory = upload_path() . '/' . $path;
if (!is_dir($directory)) {
@mkdir($directory, 0777, true);
}
$res = [];
foreach ($images as $image) {
$name = date('dhis_') . str_random(4) . '.' . $extension;
$name = mb_strtolower($name);
$image = base64_decode(str_replace(' ', '+', $image));
$size = file_put_contents($directory . '/' . $name, $image);
if ($size) {
$res[] = DB::table($table)->insertGetId([
'path' => $path,
'name' => $name,
'title' => $name,
'type' => $extension,
'status' => 1,
'size' => $size,
'created_id' => Auth::id(),
'created_at' => time(),
]);
}
}
return join(',', array_filter($res));
}
// 多图片上传保存
function attachment_images($table, $name, $path = 'default')
{
$images = Request::file($name);
$path = $path . '/' . date('Y/m');
$upload_path = upload_path() . '/' . $path;
$res = [];
foreach ($images as $image) {
if ($image->isValid()) {
// 文件后缀名
$extension = $image->getClientOriginalExtension();
// 兼容do开发的客户端上传
if ($extension == 'do') {
$clientName = $image->getClientOriginalName();
$extension = pathinfo(substr($clientName, 0, -3), PATHINFO_EXTENSION);
}
// 文件新名字
$filename = date('dhis_') . str_random(4) . '.' . $extension;
$filename = mb_strtolower($filename);
if ($image->move($upload_path, $filename)) {
$res[] = DB::table($table)->insertGetId([
'path' => $path,
'name' => $filename,
'title' => $filename,
'type' => $extension,
'status' => 1,
'size' => $image->getClientSize(),
'created_id' => Auth::id(),
'created_at' => time(),
]);
}
}
}
return join(',', array_filter($res));
}
/**
* 单图片上传,并删除旧图片
*/
function image_create($path, $name = 'image', $oldfile = '')
{
if (Request::hasFile($name)) {
$file = Request::file($name);
// 文件后缀名
$extension = $file->getClientOriginalExtension();
// 文件新名字
$filename = date('dhis_') . str_random(4) . '.' . $extension;
$filename = mb_strtolower($filename);
$path = $path . '/' . date('Y/m');
$upload_path = upload_path() . '/' . $path;
if ($file->move($upload_path, $filename)) {
// 上传成功删除旧文件
if ($oldfile) {
image_delete($oldfile);
}
return $path . '/' . $filename;
}
}
return null;
}
/**
* 删除单个图片
*/
function image_delete($file)
{
$file = upload_path() . '/' . $file;
if (is_file($file)) {
unlink($file);
}
}
/**
* 生成缩略图
*/
function thumb($file, $width, $hight)
function image_thumb($file, $width = 750)
{
$info = pathinfo($file);
$thumb = $info['dirname'] . '/thumb-' . $width . '-' . $info['basename'];
$thumb = $info['dirname'] . '/t' . $width . '_' . $info['basename'];
if (is_file($thumb)) {
return 'thumb-' . $width . '-' . $info['basename'];
return 't' . $width . '_' . $info['basename'];
}
$img = new App\Support\Image();
if (is_file($file)) {
$img->crop($file, $width, $hight, 3, true);
$img->save($thumb);
$temp = getimagesize($file);
$srcw = $temp[0];
$srch = $temp[1];
$type = $temp[2];
if ($srcw > $width) {
// 1=gif 2=jpg 3=png
switch ($type) {
case 1:
$image = imagecreatefromgif($file);
break;
case 2:
$image = imagecreatefromjpeg($file);
break;
case 3:
$image = imagecreatefrompng($file);
break;
}
if (function_exists('imageantialias')) {
imageantialias($image, true);
}
// 计算绽放比例
$rate = $width / $srcw;
// 计算出缩放后的高度
$height = floor($srch * $rate);
// 创建一个缩放的画布
$dest = imagecreatetruecolor($width, $height);
// 处理png透明
imagealphablending($dest, false);
imagesavealpha($dest, true);
// 缩放
imagecopyresampled($dest, $image, 0, 0, 0, 0, $width, $height, $srcw, $srch);
switch ($type) {
case 1:
imagegif($dest, $thumb);
break;
case 2:
imagejpeg($dest, $thumb, 75);
break;
case 3:
imagepng($dest, $thumb);
break;
}
if ($image) {
imagedestroy($image);
}
return 't' . $width . '_' . $info['basename'];
}
return $info['basename'];
}
return 'thumb-' . $width . '-' . $info['basename'];
}
/**
@ -746,7 +563,7 @@ function thumb($file, $width, $hight)
* $dst_w:目标输出的宽
* $dst_h:目标输出的高
*/
function imageResize($src_file, $dst_w, $dst_h)
function image_resize($src_file, $dst_w, $dst_h)
{
# 获取图片信息
$imarr = getimagesize($src_file);

File diff suppressed because one or more lines are too long

View File

@ -400,8 +400,8 @@ jQuery(function() {
uploader.on('uploadSuccess', function(file, res) {
res.fileId = file.id;
res.size = WebUploader.formatSize(res.size);
var html = template('uploader-item-tpl', res);
$('#fileDraft_' + res.key.replace('.','_')).append(html);
var html = template('upload-item-tpl', res);
$('#fileDraft_' + res.table + '_' + res.field).append(html);
});
uploader.on('all', function(type) {

View File

@ -1,87 +0,0 @@
<script type="text/javascript">
var uploader = {
file:function(fileId)
{
var id = $('#'+fileId).find(".id").val();
location.href = '{{url("file/attachment/file")}}?model={{$attachList["model"]}}&id='+id;
},
cancel:function(fileId)
{
var id = $('#'+fileId).find(".id").val();
if (id > 0) {
var name = $('#'+fileId).find(".fileName a").text();
$.messager.confirm('操作警告', '确定要删除 <strong>'+name+'</strong> 此文件吗', function(btn) {
if (btn == true) {
var url = '{{url("file/attachment/delete")}}';
$.get(url,{model:'{{$attachList["model"]}}',id:id},function(res) {
if (res == 1) {
$('#'+fileId).remove();
}
});
}
});
} else {
$('#'+fileId).remove();
}
},
insert:function(fileId)
{
var id = $('#'+fileId).find(".id").val();
var name = $('#'+fileId).find(".file-name a").text();
// 检查图片类型
if (/\.(gif|jpg|jpeg|png|GIF|JPG|PNG)$/.test(name))
{
var html = '<img src="{{url("file/attachment/view")}}?model={{$attachList["model"]}}&id='+id+'" title="'+name+'">';
}
else
{
var html = '<a href="{{url("file/attachment/file")}}?model={{$attachList["model"]}}&id='+id+'" title="'+name+'">'+name+'</a>';
}
UE.getEditor('content').execCommand('insertHtml', html);
}
}
</script>
<script id="uploader-item-tpl" type="text/html">
<div id="file_draft_<%=id%>" class="uploadify-queue-item">
<span class="file-name"><span class="text-danger" title="草稿状态">!</span> <a href="javascript:uploader.file('file_draft_<%=id%>');"><%=title%></a></span>
<span class="file-size">(<%=size%>)</span>
<span class="insert"><a class="option" href="javascript:uploader.insert('file_draft_<%=id%>');">插入编辑器</a></span>
<span class="cancel"><a class="option" href="javascript:uploader.cancel('file_draft_<%=id%>');">删除</a></span>
<input type="hidden" class="id" name="attachment[]" value="<%=id%>" />
</div>
<div class="clear"></div>
</script>
<a class="btn btn-sm btn-info" href="javascript:viewBox('reader', '文件上传', '{{url('file/attachment/uploader', ['model' => $attachList['model'], 'path' => $attachList['path']])}}');"><i class="fa fa-cloud-upload"></i> 文件上传</a>
<span class="uploader-size">&nbsp;文件大小限制{{$setting['upload_max']}} MB</span>
<div class="clear"></div>
<div id="fileQueue">
@if($attachList['queue'])
@foreach($attachList['queue'] as $n => $v)
<div id="file_queue_{{$n}}" class="uploadify-queue-item">
<span class="file-name"><span class="icon icon-paperclip"></span> <a href="javascript:uploader.file('file_queue_{{$n}}');">{{$v['title']}}</a></span>
<span class="file-size"> ({{human_filesize($v['size'])}})</span>
<span class="insert"><a class="option" href="javascript:uploader.insert('file_queue_{{$n}}');">插入编辑器</a></span>
<span class="cancel"><a class="option" href="javascript:uploader.cancel('file_queue_{{$n}}');">删除</a></span>
<input type="hidden" class="id" name="attachment[]" value="{{$v['id']}}" />
</div><div class="clear"></div>
@endforeach
@endif
</div>
<div id="fileQueueDraft">
@if($attachList['draft'])
@foreach($attachList['draft'] as $n => $v)
<div id="queue_draft_{{$n}}" class="uploadify-queue-item">
<span class="file-name"><strong class="red" title="草稿附件">!</strong> <a href="javascript:uploader.file('queue_draft_{{$n}}');">{{$v['title']}}</a></span>
<span class="file-size">({{human_filesize($v['size'])}})</span>
<span class="insert"><a class="option" href="javascript:uploader.insert('queue_draft_{{$n}}');">插入编辑器</a></span>
<span class="cancel"><a class="option" href="javascript:uploader.cancel('queue_draft_{{$n}}');">删除</a></span>
<input type="hidden" class="id" name="attachment[]" value="{{$v['id']}}" />
</div><div class="clear"></div>
@endforeach
@endif
</div>

View File

@ -1,4 +1,4 @@
<script id="uploader-item-tpl" type="text/html">
<script id="upload-item-tpl" type="text/html">
<div id="<%=fileId%>" class="uploadify-queue-item">
<span class="file-name"><span class="text-danger" title="草稿状态">!</span> <a href="javascript:uploader.file('<%=fileId%>');"><%=name%></a></span>
<span class="file-size">(<%=size%>)</span>
@ -10,17 +10,26 @@
<div class="uploadify-queue">
<a class="btn btn-sm btn-info" href="javascript:viewBox('reader', '文件上传', '{{url('index/attachment/uploader', ['path' => Request::module()])}}');"><i class="fa fa-cloud-upload"></i> 文件上传</a>
<a class="btn btn-sm btn-info" href="javascript:viewBox('reader', '文件上传', '{{url('index/attachment/upload', ['path' => Request::module(), 'table' => $attachment['table'], 'field' => $attachment['field']])}}');"><i class="fa fa-cloud-upload"></i> 文件上传</a>
<span class="uploader-size">&nbsp;文件大小限制 {{$setting['upload_max']}}MB</span>
<div class="clear"></div>
<div id="fileQueue" class="uploadify-queue">
@if($attachment['rows'])
@foreach($attachment['rows'] as $n => $v)
<div id="file_attach_{{$n}}" class="uploadify-queue-item">
<span class="file-name"><span class="icon icon-paperclip"></span> <a href="javascript:uploader.file('file_attach_{{$n}}');">{{$v['name']}}</a></span>
<div id="file_queue_{{$n}}" class="uploadify-queue-item">
<span class="file-name"><span class="icon icon-paperclip"></span> <a class="option" href="javascript:uploader.file('file_queue_{{$n}}');">{{$v['name']}}</a></span>
<span class="file-size"> ({{human_filesize($v['size'])}})</span>
<span class="cancel"><a class="option" href="javascript:uploader.cancel('file_attach_{{$n}}');">删除</a></span>
@if(in_array($v['type'], ['pdf']))
<a href="{{$upload_url}}/{{$v['path']}}" class="btn btn-xs btn-default" target="_blank">[预览]</a>
@endif
@if(in_array($v['type'], ['jpg','png','gif','bmp']))
<img data-original="{{$upload_url}}/{{$v['path']}}" /><a data-toggle="image-show" class="option">[预览]</a>
@endif
<span class="cancel"><a class="option" href="javascript:uploader.cancel('file_queue_{{$n}}');">删除</a></span>
<input type="hidden" class="id" name="attachment[]" value="{{$v['id']}}" />
</div>
<div class="clear"></div>
@ -28,11 +37,11 @@
@endif
</div>
<div id="fileQueueDraft">
<div id="fileDraft_{{$attachment['table']}}_{{$attachment['field']}}">
@if($attachment['draft'])
@foreach($attachment['draft'] as $n => $file)
<div id="queue_draft_{{$n}}" class="uploadify-queue-item">
<span class="file-name"><span class="text-danger" title="草稿附件">!</span> <a href="javascript:uploader.file('queue_draft_{{$n}}');">{{$file['name']}}</a></span>
<span class="file-name"><span class="text-danger" title="草稿附件">!</span> <a class="option" href="javascript:uploader.file('queue_draft_{{$n}}');">{{$file['name']}}</a></span>
<span class="file-size">({{human_filesize($file['size'])}})</span>
<span class="cancel"><a class="option" href="javascript:uploader.cancel('queue_draft_{{$n}}');">删除</a></span>
<input type="hidden" class="id" name="attachment[]" value="{{$file['id']}}">
@ -42,3 +51,16 @@
@endif
</div>
</div>
<script>
(function($) {
var galley_id = "fileQueue";
var galley = document.getElementById(galley_id);
var viewer = new Viewer(galley, {
navbar: false,
url: "data-original",
});
$("#" + galley_id).on("click", '[data-toggle="image-show"]', function() {
$(this).prev().click();
});
})(jQuery);
</script>

View File

@ -1,45 +0,0 @@
<script id="uploader-item-tpl" type="text/html">
<div id="<%=fileId%>" class="uploadify-queue-item">
<span class="file-name"><span class="text-danger" title="草稿状态">!</span> <a href="javascript:uploader.file('<%=fileId%>');"><%=name%></a></span>
<span class="file-size">(<%=size%>)</span>
<span class="cancel"><a class="option" href="javascript:uploader.cancel('<%=fileId%>');"><i class="fa fa-fw fa-remove"></i></a></span>
<input type="hidden" class="id" name="{{$field}}[]" value="<%=id%>" />
</div>
<div class="clear"></div>
</script>
<div class="uploadify-queue">
<a class="btn btn-sm btn-info" href="javascript:viewBox('reader', '文件上传', '{{url('index/attachment/uploader', ['path' => Request::module(), 'key' => $key.'.'.$field])}}');"><i class="fa fa-cloud-upload"></i> 附件</a>
<div class="clear"></div>
<div id="fileQueue_{{$key}}_{{$field}}" class="uploadify-queue">
@if($attachments['rows'])
@foreach($attachments['rows'] as $n => $file)
<div id="file_queue_{{$n}}" class="uploadify-queue-item">
<span class="file-name"><span class="icon icon-paperclip"></span> <a href="javascript:uploader.file('file_queue_{{$n}}');">{{$file['name']}}</a></span>
<span class="file-size">({{human_filesize($file['size'])}})</span>
<span class="cancel"><a class="option" href="javascript:uploader.cancel('file_queue_{{$n}}');"><i class="fa fa-fw fa-remove"></i></a></span>
<input type="hidden" class="id" name="{{$field}}[]" value="{{$file['id']}}">
</div>
<div class="clear"></div>
@endforeach
@endif
</div>
<div id="fileDraft_{{$key}}_{{$field}}">
@if($attachments['draft'])
@foreach($attachments['draft'] as $n => $file)
<div id="queue_draft_{{$n}}" class="uploadify-queue-item">
<span class="file-name"><span class="text-danger" title="草稿附件">!</span> <a href="javascript:uploader.file('queue_draft_{{$n}}');">{{$file['name']}}</a></span>
<span class="file-size">({{human_filesize($file['size'])}})</span>
<span class="cancel"><a class="option" href="javascript:uploader.cancel('queue_draft_{{$n}}');"><i class="fa fa-remove"></i></a></span>
<input type="hidden" class="id" name="{{$field}}[]" value="{{$file['id']}}">
</div>
<div class="clear"></div>
@endforeach
@endif
</div>
</div>

View File

@ -1,97 +0,0 @@
<script type="text/javascript">
var uploader = {
file:function(fileId) {
var id = $('#'+fileId).find(".id").val();
location.href = '{{url('file/attachment/file')}}?model={{$attach['model']}}&id='+id;
},
cancel:function(fileId) {
var id = $('#'+fileId).find(".id").val();
if (id > 0) {
var name = $('#'+fileId).find(".fileName a").text();
$.messager.confirm('操作警告', '确定要删除 <strong>'+name+'</strong> 此文件吗', function(btn) {
if (btn == true) {
var url = "{{url('file/attachment/delete')}}";
$.get(url,{model:"{{$attach['model']}}",id:id},function(res) {
if (res == 1) {
$('#'+fileId).remove();
}
});
}
});
} else {
$('#'+fileId).remove();
}
},
copyLink:function() {
var clipBoardContent = this.location.href;
window.clipboardData.setData("Text", clipBoardContent);
alert("复制成功。");
}
}
</script>
<script id="uploader-item-tpl" type="text/html">
<div id="file_draft_<%=id%>" class="uploadify-queue-item">
<span class="file-name"><span class="text-danger" title="草稿状态">!</span> <a href="javascript:uploader.file('file_draft_<%=id%>');"><%=title%></a></span>
<span class="file-size">(<%=size%>)</span>
<span class="cancel"><a class="option" href="javascript:uploader.cancel('file_draft_<%=id%>');">删除</a></span>
<input type="hidden" class="id" name="attachment[]" value="<%=id%>" />
</div>
<div class="clear"></div>
</script>
@if($attach['auth']['add'] == true)
<a class="btn btn-sm btn-info" href="javascript:viewBox('reader', '文件上传', '{{url('file/attachment/uploader', ['model' => $attach['model'], 'path' => $attach['path']])}}');"><i class="fa fa-cloud-upload"></i> 文件上传</a>
<span class="uploader-size">&nbsp;文件大小限制{{$setting['upload_max']}} MB</span>
<!--
<input type="file" name="uploadify" id="uploadify">
<div class="uploadify-info text-ellipsis">&nbsp;支持{{strtoupper($setting['upload_type'])}}, 不超过{{$setting['upload_max']}}MB</div>
<div class="clear"></div>
-->
@endif
<div id="fileQueue">
@if($attach['queue'])
@if($attach['queue'])
@foreach($attach['queue'] as $v)
<div id="file_queue_{{$v['id']}}" class="uploadify-queue-item">
<span class="file-name"><a href="javascript:uploader.file('file_queue_{{$v['id']}}');">{{$v['title']}}</a></span>
<span class="file-size">(
上传者: {{get_user($v['add_user_id'], 'name')}}
&nbsp;上传时间: @datetime($v['add_time'])
&nbsp;大小: {{human_filesize($v['size'])}}
)</span>
@if($attach['auth']['add'] == true)
<span class="insert"><a class="option" href="javascript:uploader.cancel('file_queue_{{$v['id']}}');">删除</a></span>
@endif
<input type="hidden" class="id" name="attachment[]" value="{{$v['id']}}">
</div><div class="clearfix"></div>
@endforeach
@endif
@endif
</div>
<div id="fileQueueDraft">
@if($attach['draft'])
@foreach($attach['draft'] as $k => $v)
<div id="queue_draft_{{$v['id']}}" class="uploadify-queue-item">
<span class="file-name"><strong class="red" title="草稿附件">!</strong> <a href="javascript:uploader.file('queue_draft_{{$v['id']}}');">{{$v['title']}}</a></span>
<span class="file-size">(
&nbsp;上传者: {{get_user($v['add_user_id'], 'name')}}
&nbsp;上传时间: @datetime($v['add_time'])
&nbsp;大小: {{human_filesize($v['size'])}}
)</span>
@if($attach['auth']['add'] == true)
<span class="insert"><a class="option" href="javascript:uploader.cancel('queue_draft_{{$v['id']}}');">删除</a></span>
@endif
<input type="hidden" class="id" name="attachment[]" value="{{$v['id']}}">
</div><div class="clearfix"></div>
@endforeach
@endif
</div>

View File

@ -1 +0,0 @@
<img src="{{$stream}}">

View File

@ -1,90 +0,0 @@
<script type="text/javascript">
var uploader = {
file:function(fileId) {
var id = $('#'+fileId).find(".id").val();
location.href = '{{url('file/attachment/file')}}?model={{$attach['model']}}&id='+id;
},
cancel:function(fileId) {
var id = $('#'+fileId).find(".id").val();
if (id > 0) {
var name = $('#'+fileId).find(".fileName a").text();
$.messager.confirm('操作警告', '确定要删除 <strong>'+name+'</strong> 此文件吗', function(btn) {
if (btn == true) {
var url = "{{url('file/attachment/delete')}}";
$.get(url,{model:"{{$attach['model']}}",id:id},function(res) {
if(res == 1) {
$('#'+fileId).remove();
}
});
}
});
} else {
$('#'+fileId).remove();
}
},
copyLink:function() {
var clipBoardContent = this.location.href;
window.clipboardData.setData("Text", clipBoardContent);
alert("复制成功。");
}
}
</script>
<!--
<span class="file-name"><span class="text-danger" title="草稿状态">!</span> <a href="javascript:uploader.file('<%=fileId%>');"><%=title%></a></span>
-->
<script id="uploader-item-tpl" type="text/html">
<div id="<%=fileId%>" class="uploadify-queue-item">
<span class="file-name"><span class="text-danger" title="草稿状态">!</span> <a href="javascript:uploader.file('<%=fileId%>');"><%=title%></a></span>
<span class="file-size">(<%=size%>)</span>
<span class="cancel"><a class="option" href="javascript:uploader.cancel('<%=fileId%>');">删除</a></span>
<input type="hidden" class="id" name="attachment[]" value="<%=id%>" />
</div>
<div class="clear"></div>
</script>
@if($attach['auth']['add'] == true)
<a class="btn btn-sm btn-info" href="javascript:viewBox('reader', '文件上传', '{{url('file/attachment/uploader', ['model' => $attach['model'], 'path' => $attach['path']])}}');"><i class="fa fa-cloud-upload"></i> 文件上传</a>
<span class="uploader-size">&nbsp;文件大小限制{{$setting['upload_max']}} MB</span>
@endif
<div id="fileQueue">
@if($attach['queue'])
@if($attach['queue'])
@foreach($attach['queue'] as $v)
<div id="file_queue_{{$v['id']}}" class="uploadify-queue-item">
<span class="file-name"><a href="javascript:uploader.file('file_queue_{{$v['id']}}');">{{$v['title']}}</a></span>
<span class="file-size">(
上传者: {{get_user($v['add_user_id'], 'name')}}
&nbsp;上传时间: @datetime($v['add_time'])
&nbsp;大小: {{human_filesize($v['size'])}}
)</span>
@if($attach['auth']['add'] == true)
<span class="insert"><a class="option" href="javascript:uploader.cancel('file_queue_{{$v['id']}}');">删除</a></span>
@endif
<input type="hidden" class="id" name="attachment[]" value="{{$v['id']}}">
</div><div class="clearfix"></div>
@endforeach
@endif
@endif
</div>
<div id="fileQueueDraft">
@if($attach['draft'])
@foreach($attach['draft'] as $k => $v)
<div id="queue_draft_{{$v['id']}}" class="uploadify-queue-item">
<span class="file-name"><strong class="red" title="草稿附件">!</strong> <a download="{{$v['title']}}" href="{{$upload_url.'/'.$v['path'].'/'.$v['name']}}">{{$v['title']}}</a> ({{human_filesize($v['size'])}})</span>
<span class="file-size">
{{get_user($v['add_user_id'], 'name')}} - @datetime($v['add_time'])
</span>
@if($attach['auth']['add'] == true)
<span class="insert"><a class="option" href="javascript:uploader.cancel('queue_draft_{{$v['id']}}');">删除</a></span>
@endif
<input type="hidden" class="id" name="attachment[]" value="{{$v['id']}}">
</div><div class="clearfix"></div>
@endforeach
@endif
</div>

View File

@ -1,108 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>{{$setting['title']}}</title>
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
<link href="{{mix('/assets/dist/vendor.min.css')}}" rel="stylesheet" type="text/css">
<link href="{{mix('/assets/dist/gdoo.min.css')}}" rel="stylesheet" type="text/css">
<script src="{{$asset_url}}/vendor/jquery.js"></script>
</head>
<style>
li { list-style: none; }
body {
margin: 0 auto;
text-align: center;
width: 80%;
}
.header {
text-align: center;
margin-top: 50px;
margin-bottom: 10px;
}
.logo img { border-radius: 500px; width:86px; height:86px; }
.input-group-addon {
background-color: #fff;
}
</style>
<body>
<div class="header">
<div class="logo">
<img class="circle" src="{{$asset_url}}/images/a1.jpg" />
<div>{{auth()->user()->name}}</div>
<div>欢迎使用{{$setting['title']}} 扫一扫</div>
<p class="message text-sm" style="color:red;"></p>
</div>
</div>
<form id="fileForm" class="form-horizontal">
<div class="form-group input-group">
<span class="input-group-addon">单据名称</span>
<input id="name" name="name" type="text" value="{{$model['name']}}" class="form-control input-sm" readonly="readonly" />
</div>
<div class="form-group input-group">
<span class="input-group-addon">文件名称</span>
<input type="text" id="filename" class="form-control input-sm" name="filename" />
</div>
<div class="form-group">
<a class="btn btn-info btn-lg btn-block" id="qrcode-btn"><i class="fa fa-qrcode"></i> 扫一扫</a>
<span style="display:none;">
<input type="file" name="file" id="fileToUpload" capture="camera" accept="image/*" onchange="fileSelected();">
</span>
</div>
<input type="hidden" name="key" value="{{$key}}" />
<input type="hidden" name="x-auth-token" value="{{$token}}" />
</form>
</body>
</html>
<script>
$(function() {
$('#qrcode-btn').on('click', function() {
$('#fileToUpload').click();
});
});
var btn = '<i class="fa fa-qrcode"></i> 扫一扫';
function fileSelected() {
var formData = new FormData($('#fileForm')[0]);
$('.message').html('');
$('#fileToUpload').attr('disabled', 'disabled');
$.ajax({
url: '{{url("uploader")}}',
type: 'POST',
data: formData,
async: false,
cache: false,
contentType: false,
processData: false,
xhr: function(){
var xhr = $.ajaxSettings.xhr();
if (xhr.upload) {
$('#qrcode-btn').html('上传中...');
// xhr.upload.addEventListener("progress", onprogress, false);
return xhr;
}
},
success: function (returndata) {
$('#qrcode-btn').html(btn);
$('#fileToUpload').removeAttr('disabled');
$('#fileToUpload').val('');
$('.message').html('上传成功,请在提单界面等待图片出现。');
},
error: function (returndata) {
$('#qrcode-btn').html(btn);
$('#fileToUpload').removeAttr('disabled');
$('#fileToUpload').val('');
$('.message').html('上传失败。');
}
});
}
/*
function onprogress(evt) {
// $(".form-footer>a").html("上传中...");
}*/
</script>

View File

@ -1,19 +1,35 @@
<div class="uploadify-queue">
<div id="fileQueue" class="uploadify-queue">
@if(count($attachments['main']))
@foreach($attachments['main'] as $n => $file)
<div id="file_queue_{{$n}}" class="uploadify-queue-item">
<span class="file-name"><span class="icon icon-paperclip"></span> <a href="javascript:uploader.file('file_queue_{{$n}}');">{{$file['name']}}</a></span>
<span class="file-size">({{human_filesize($file['size'])}})</span>
<span class="cancel"><a class="option" href="javascript:uploader.cancel('file_queue_{{$n}}');"><i class="fa fa-fw fa-remove"></i></a></span>
<input type="hidden" class="id" name="{{$field}}[]" value="{{$file['id']}}">
</div>
<div class="clear"></div>
@endforeach
@if($attachment['rows'])
@foreach($attachment['rows'] as $n => $file)
<div id="file_queue_{{$n}}" class="uploadify-queue-item">
<span class="file-name"><span class="icon icon-paperclip"></span> <a href="javascript:uploader.file('file_queue_{{$n}}');">{{$file['name']}}</a></span>
<span class="file-size">({{human_filesize($file['size'])}})</span>
@if(in_array($file['type'], ['pdf']))
<a href="{{$upload_url}}/{{$file['path']}}" class="btn btn-xs btn-default" target="_blank">[预览]</a>
@endif
@if(in_array($file['type'], ['jpg','png','gif','bmp']))
<img data-original="{{$upload_url}}/{{$file['path']}}" /><a data-toggle="image-show" class="option">[预览]</a>
@endif
<div class="clear"></div>
</div>
@endforeach
@endif
</div>
</div>
<script>
(function($) {
var galley_id = "fileQueue";
var galley = document.getElementById(galley_id);
var viewer = new Viewer(galley, {
navbar: false,
url: "data-original",
});
$("#" + galley_id).on("click", '[data-toggle="image-show"]', function() {
$(this).prev().click();
});
})(jQuery);
</script>

View File

@ -1,15 +0,0 @@
<div class="uploadify-queue">
<div id="fileQueue" class="uploadify-queue">
@if($attachments['main'])
@foreach($attachments['main'] as $n => $file)
<div id="file_queue_{{$n}}" class="uploadify-queue-item">
<span class="file-name"><span class="icon icon-paperclip"></span> <a href="javascript:uploader.file('file_queue_{{$n}}');">{{$file['name']}}</a></span>
<span class="file-size">({{human_filesize($file['size'])}})</span>
<span class="cancel"><a class="option" href="javascript:uploader.cancel('file_queue_{{$n}}');"><i class="fa fa-fw fa-remove"></i></a></span>
<input type="hidden" class="id" name="{{$field}}[]" value="{{$file['id']}}">
</div>
<div class="clear"></div>
@endforeach
@endif
</div>
</div>

View File

@ -20,8 +20,8 @@
</div>
<script>
var BASE_URL = '{{$asset_url}}/vendor/webuploader';
var SERVER_URL = '{{$SERVER_URL}}';
var BASE_URL = '{{$asset_url}}/vendor/webuploader';
var SERVER_URL = '{{$SERVER_URL}}';
var UPLOADER_ID = '{{$key}}'.replace('.', '_');
</script>
<script type="text/javascript" src="{{$asset_url}}/vendor/webuploader/webuploader.nolog.min.js"></script>

View File

@ -1,23 +0,0 @@
<span class="btn btn-xs btn-info">
附件 <span class="badge">{{count($attachment['rows'])}}</span>
</span>
<div class="uploadify-queue">
@foreach($attachment['rows'] as $row)
<div class="uploadify-queue-item">
<span class="file-name">
<span class="text-muted icon icon-paperclip"></span> <a download="aaaa" href="{{url('index/attachment/download',['id'=>$row['id']])}}">{{$row['name']}}</a>
</span>
<span class="file-size">&nbsp;({{human_filesize($row['size'])}})</span>
&nbsp;
@if(in_array(strtolower($row['type']), ['pdf']))
<a href="{{URL::to('uploads').'/'.$row['path']}}" class="btn btn-xs btn-default" target="_blank">预览</a>
@elseif(in_array(strtolower($row['type']), ['jpg','png','gif','bmp']))
<a class="btn btn-xs btn-default" onclick="imageBox('preview', '附件预览', '{{URL::to('uploads').'/'.$row['path']}}');">预览</a>
@else
<a class="btn btn-xs btn-default" href="{{url('index/attachment/download',['id'=>$row['id']])}}">下载</a>
@endif
<div class="clear"></div>
</div>
@endforeach
</div

View File

@ -44,7 +44,9 @@
@if(isset($access['create']) && $header['create_btn'])
<a href="javascript:;" data-toggle="{{$header['master_table']}}" data-action="create" class="btn btn-sm btn-success hinted" title="新建{{$header['name']}}"><i class="icon icon-plus"></i> 新建</a>
@endif
@yield('left_buttons')
{{:$button_count = 0}}
@foreach($header['buttons'] as $button)
@if($button['display'])
@ -62,10 +64,6 @@
<li class="divider"></li>
@else
@if($button['display'])
<!-- 此处跳过查询子表的删除按钮 -->
@if($header['exist_sub_table'] == 1 && $button['action'] == 'delete')
<?php continue; ?>
@endif
<li><a data-toggle="{{$header['master_table']}}" data-action="{{$button['action']}}" href="javascript:;"><i class="fa {{$button['icon']}}"></i> {{$button['name']}}</a></li>
@endif
@endif
@ -110,13 +108,6 @@
</li>
</ul>
</div>
<!--
@if($header['search_form']['params'])
@foreach($header['search_form']['params'] as $key => $param)
<input name="{{$key}}" type="hidden" value="{{$param}}">
@endforeach
@endif
-->
</form>
@else
<a class="btn btn-sm btn-default" data-toggle="{{$header['master_table']}}" data-action="filter" href="javascript:;"><i class="fa fa-search"></i> 筛选</a>
@ -147,11 +138,6 @@
<li class="@if($header['search_form']['query'][$header['bys']['name']] == $item['value']) active @endif"><a href="{{url('', $params)}}">{{$item['name']}}</a></li>
@endif
@endforeach
<!--
<li>
<a href="javascript:;">添加自定义筛选</a>
</li>
-->
</ul>
</div>
@endif
@ -195,14 +181,6 @@
@endforeach
</div>
</div>
<!--
@if($header['search_form']['params'])
@foreach($header['search_form']['params'] as $key => $param)
<input name="{{$key}}" type="hidden" value="{{$param}}">
@endforeach
@endif
-->
</form>
</div>
</div>

View File

@ -63,6 +63,7 @@
<div class="btn-group">
<button id="search-submit" type="submit" class="btn btn-sm btn-default">
<i class="fa fa-search"></i> 搜索</button>
@if(is_numeric($search['query']['advanced']))
<button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown">
<span class="caret"></span>
@ -74,6 +75,7 @@
<i class="fa fa-search"></i> 高级搜索</a>
</li>
</ul>
@endif
</div>