dever 6 年之前
父節點
當前提交
885b4a055c
共有 10 個文件被更改,包括 390 次插入15 次删除
  1. 346 0
      assets/html/manage.html
  2. 4 4
      database/file.php
  3. 1 1
      lib/Manage.php
  4. 1 1
      lib/Store/Config.php
  5. 1 1
      lib/Store/Core.php
  6. 2 2
      lib/Store/Handle.php
  7. 2 2
      lib/Store/Local.php
  8. 1 1
      lib/Store/Qiniu.php
  9. 18 1
      src/Save.php
  10. 14 2
      src/View.php

+ 346 - 0
assets/html/manage.html

@@ -0,0 +1,346 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="utf-8">
+  <meta http-equiv="x-ua-compatible" content="ie=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+  <meta name="description" content="JavaScript image cropper.">
+  <title>图片裁剪工具</title>
+  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css">
+  <link rel="stylesheet" href="<{Dever::assets('lib/bootstrap/css/bootstrap.min.css', 'script')}>">
+  <link rel="stylesheet" href="<{Dever::assets('lib/cropper/cropper.min.css', 'script')}>">
+  <link rel="stylesheet" href="<{Dever::assets('lib/cropper/main.css', 'script')}>">
+  <script><{Dever::script()}></script>
+</head>
+<body>
+  <!-- Content -->
+  <div class="container">
+    <div class="row">
+      <div class="col-md-9">
+        <!-- <h3>Demo:</h3> -->
+        <div class="img-container">
+          <img src="<{$pic}>" alt="Picture">
+        </div>
+      </div>
+      <div class="col-md-3">
+        <!-- <h3>Preview:</h3> -->
+        <div class="docs-preview clearfix" style="height: 160px;">
+          <div class="img-preview preview-lg"></div>
+          <div class="img-preview preview-md"></div>
+          <div class="img-preview preview-sm"></div>
+          <div class="img-preview preview-xs"></div>
+        </div>
+
+        <!-- <h3>Data:</h3> -->
+        <div class="docs-data" style="display: none;">
+          <div class="input-group input-group-sm">
+            <span class="input-group-prepend">
+              <label class="input-group-text" for="dataX">X</label>
+            </span>
+            <input type="text" class="form-control" id="dataX" placeholder="x">
+            <span class="input-group-append">
+              <span class="input-group-text">px</span>
+            </span>
+          </div>
+          <div class="input-group input-group-sm">
+            <span class="input-group-prepend">
+              <label class="input-group-text" for="dataY">Y</label>
+            </span>
+            <input type="text" class="form-control" id="dataY" placeholder="y">
+            <span class="input-group-append">
+              <span class="input-group-text">px</span>
+            </span>
+          </div>
+          <div class="input-group input-group-sm">
+            <span class="input-group-prepend">
+              <label class="input-group-text" for="dataWidth">Width</label>
+            </span>
+            <input type="text" class="form-control" id="dataWidth" placeholder="width">
+            <span class="input-group-append">
+              <span class="input-group-text">px</span>
+            </span>
+          </div>
+          <div class="input-group input-group-sm">
+            <span class="input-group-prepend">
+              <label class="input-group-text" for="dataHeight">Height</label>
+            </span>
+            <input type="text" class="form-control" id="dataHeight" placeholder="height">
+            <span class="input-group-append">
+              <span class="input-group-text">px</span>
+            </span>
+          </div>
+          <div class="input-group input-group-sm">
+            <span class="input-group-prepend">
+              <label class="input-group-text" for="dataRotate">Rotate</label>
+            </span>
+            <input type="text" class="form-control" id="dataRotate" placeholder="rotate">
+            <span class="input-group-append">
+              <span class="input-group-text">deg</span>
+            </span>
+          </div>
+          <div class="input-group input-group-sm">
+            <span class="input-group-prepend">
+              <label class="input-group-text" for="dataScaleX">ScaleX</label>
+            </span>
+            <input type="text" class="form-control" id="dataScaleX" placeholder="scaleX">
+          </div>
+          <div class="input-group input-group-sm">
+            <span class="input-group-prepend">
+              <label class="input-group-text" for="dataScaleY">ScaleY</label>
+            </span>
+            <input type="text" class="form-control" id="dataScaleY" placeholder="scaleY">
+          </div>
+        </div>
+
+        <div class="row" id="actions">
+      <div class="col-md-9 docs-buttons">
+        <!-- <h3>Toolbar:</h3> -->
+        <div class="btn-group">
+          <button type="button" class="btn btn-primary" data-method="setDragMode" data-option="move" title="Move">
+            <span class="docs-tooltip" data-toggle="tooltip" title="cropper.setDragMode(&quot;move&quot;)">
+              <span class="fa fa-arrows-alt"></span>
+            </span>
+          </button>
+          <button type="button" class="btn btn-primary" data-method="setDragMode" data-option="crop" title="Crop">
+            <span class="docs-tooltip" data-toggle="tooltip" title="cropper.setDragMode(&quot;crop&quot;)">
+              <span class="fa fa-crop-alt"></span>
+            </span>
+          </button>
+        </div>
+
+        <div class="btn-group">
+          <button type="button" class="btn btn-primary" data-method="zoom" data-option="0.1" title="Zoom In">
+            <span class="docs-tooltip" data-toggle="tooltip" title="cropper.zoom(0.1)">
+              <span class="fa fa-search-plus"></span>
+            </span>
+          </button>
+          <button type="button" class="btn btn-primary" data-method="zoom" data-option="-0.1" title="Zoom Out">
+            <span class="docs-tooltip" data-toggle="tooltip" title="cropper.zoom(-0.1)">
+              <span class="fa fa-search-minus"></span>
+            </span>
+          </button>
+        </div>
+
+        <div class="btn-group">
+          <button type="button" class="btn btn-primary" data-method="move" data-option="-10" data-second-option="0" title="Move Left">
+            <span class="docs-tooltip" data-toggle="tooltip" title="cropper.move(-10, 0)">
+              <span class="fa fa-arrow-left"></span>
+            </span>
+          </button>
+          <button type="button" class="btn btn-primary" data-method="move" data-option="10" data-second-option="0" title="Move Right">
+            <span class="docs-tooltip" data-toggle="tooltip" title="cropper.move(10, 0)">
+              <span class="fa fa-arrow-right"></span>
+            </span>
+          </button>
+          <button type="button" class="btn btn-primary" data-method="move" data-option="0" data-second-option="-10" title="Move Up">
+            <span class="docs-tooltip" data-toggle="tooltip" title="cropper.move(0, -10)">
+              <span class="fa fa-arrow-up"></span>
+            </span>
+          </button>
+          <button type="button" class="btn btn-primary" data-method="move" data-option="0" data-second-option="10" title="Move Down">
+            <span class="docs-tooltip" data-toggle="tooltip" title="cropper.move(0, 10)">
+              <span class="fa fa-arrow-down"></span>
+            </span>
+          </button>
+        </div>
+
+        <div class="btn-group">
+          <button type="button" class="btn btn-primary" data-method="rotate" data-option="-45" title="Rotate Left">
+            <span class="docs-tooltip" data-toggle="tooltip" title="cropper.rotate(-45)">
+              <span class="fa fa-undo-alt"></span>
+            </span>
+          </button>
+          <button type="button" class="btn btn-primary" data-method="rotate" data-option="45" title="Rotate Right">
+            <span class="docs-tooltip" data-toggle="tooltip" title="cropper.rotate(45)">
+              <span class="fa fa-redo-alt"></span>
+            </span>
+          </button>
+        </div>
+
+        <div class="btn-group">
+          <button type="button" class="btn btn-primary" data-method="scaleX" data-option="-1" title="Flip Horizontal">
+            <span class="docs-tooltip" data-toggle="tooltip" title="cropper.scaleX(-1)">
+              <span class="fa fa-arrows-alt-h"></span>
+            </span>
+          </button>
+          <button type="button" class="btn btn-primary" data-method="scaleY" data-option="-1" title="Flip Vertical">
+            <span class="docs-tooltip" data-toggle="tooltip" title="cropper.scaleY(-1)">
+              <span class="fa fa-arrows-alt-v"></span>
+            </span>
+          </button>
+        </div>
+
+        <div class="btn-group">
+          <button type="button" class="btn btn-primary" data-method="crop" title="Crop">
+            <span class="docs-tooltip" data-toggle="tooltip" title="cropper.crop()">
+              <span class="fa fa-check"></span>
+            </span>
+          </button>
+          <button type="button" class="btn btn-primary" data-method="clear" title="Clear">
+            <span class="docs-tooltip" data-toggle="tooltip" title="cropper.clear()">
+              <span class="fa fa-times"></span>
+            </span>
+          </button>
+        </div>
+
+        <div class="btn-group">
+          <button type="button" class="btn btn-primary" data-method="disable" title="Disable">
+            <span class="docs-tooltip" data-toggle="tooltip" title="cropper.disable()">
+              <span class="fa fa-lock"></span>
+            </span>
+          </button>
+          <button type="button" class="btn btn-primary" data-method="enable" title="Enable">
+            <span class="docs-tooltip" data-toggle="tooltip" title="cropper.enable()">
+              <span class="fa fa-unlock"></span>
+            </span>
+          </button>
+        </div>
+
+        <div class="btn-group" style="display: none;">
+          <button type="button" class="btn btn-primary" data-method="reset" title="Reset">
+            <span class="docs-tooltip" data-toggle="tooltip" title="cropper.reset()">
+              <span class="fa fa-sync-alt"></span>
+            </span>
+          </button>
+          <label class="btn btn-primary btn-upload" for="inputImage" title="Upload image file">
+            <input type="file" class="sr-only" id="inputImage" name="file" accept="image/*">
+            <span class="docs-tooltip" data-toggle="tooltip" title="Import image with Blob URLs">
+              <span class="fa fa-upload"></span>
+            </span>
+          </label>
+          <button type="button" class="btn btn-primary" data-method="destroy" title="Destroy">
+            <span class="docs-tooltip" data-toggle="tooltip" title="cropper.destroy()">
+              <span class="fa fa-power-off"></span>
+            </span>
+          </button>
+        </div>
+
+        <div class="btn-group">
+          <button type="button" class="btn btn-primary" data-method="aspectRatio" title="Reset" data-value="16:9">
+            <span class="docs-tooltip" data-toggle="tooltip" title="16:9">
+              16:9
+            </span>
+          </button>
+          <button type="button" class="btn btn-primary" data-method="aspectRatio" title="Reset" data-value="4:3">
+            <span class="docs-tooltip" data-toggle="tooltip" title="16:9">
+              4:3
+            </span>
+          </button>
+          <button type="button" class="btn btn-primary" data-method="aspectRatio" title="Reset" data-value="2:3">
+            <span class="docs-tooltip" data-toggle="tooltip" title="2:3">
+              2:3
+            </span>
+          </button>
+         </div><div class="btn-group">
+          <button type="button" class="btn btn-primary" data-method="aspectRatio" title="Reset" data-value="1:1">
+            <span class="docs-tooltip" data-toggle="tooltip" title="1:1">
+              1:1
+            </span>
+          </button>
+        </div>
+
+        <div class="btn-group">
+          <button type="button" class="btn btn-primary" data-method="save" title="save">
+            <span class="docs-tooltip" data-toggle="tooltip" title="16:9">
+             	保存
+            </span>
+          </button>
+         </div>
+		<div style="display: none;">
+			
+        <!-- Show the cropped image in modal -->
+        <div class="modal fade docs-cropped" id="getCroppedCanvasModal" role="dialog" aria-hidden="true" aria-labelledby="getCroppedCanvasTitle" tabindex="-1">
+          <div class="modal-dialog">
+            <div class="modal-content">
+              <div class="modal-header">
+                <h5 class="modal-title" id="getCroppedCanvasTitle">Cropped</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                  <span aria-hidden="true">&times;</span>
+                </button>
+              </div>
+              <div class="modal-body"></div>
+              <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
+                <a class="btn btn-primary" id="download" href="javascript:void(0);" download="cropped.jpg">Download</a>
+              </div>
+            </div>
+          </div>
+        </div><!-- /.modal -->
+
+        <button type="button" class="btn btn-secondary" data-method="getData" data-option data-target="#putData">
+          <span class="docs-tooltip" data-toggle="tooltip" title="cropper.getData()">
+            Get Data
+          </span>
+        </button>
+        <button type="button" class="btn btn-secondary" data-method="setData" data-target="#putData">
+          <span class="docs-tooltip" data-toggle="tooltip" title="cropper.setData(data)">
+            Set Data
+          </span>
+        </button>
+        <button type="button" class="btn btn-secondary" data-method="getContainerData" data-option data-target="#putData">
+          <span class="docs-tooltip" data-toggle="tooltip" title="cropper.getContainerData()">
+            Get Container Data
+          </span>
+        </button>
+        <button type="button" class="btn btn-secondary" data-method="getImageData" data-option data-target="#putData">
+          <span class="docs-tooltip" data-toggle="tooltip" title="cropper.getImageData()">
+            Get Image Data
+          </span>
+        </button>
+        <button type="button" class="btn btn-secondary" data-method="getCanvasData" data-option data-target="#putData">
+          <span class="docs-tooltip" data-toggle="tooltip" title="cropper.getCanvasData()">
+            Get Canvas Data
+          </span>
+        </button>
+        <button type="button" class="btn btn-secondary" data-method="setCanvasData" data-target="#putData">
+          <span class="docs-tooltip" data-toggle="tooltip" title="cropper.setCanvasData(data)">
+            Set Canvas Data
+          </span>
+        </button>
+        <button type="button" class="btn btn-secondary" data-method="getCropBoxData" data-option data-target="#putData">
+          <span class="docs-tooltip" data-toggle="tooltip" title="cropper.getCropBoxData()">
+            Get Crop Box Data
+          </span>
+        </button>
+        <button type="button" class="btn btn-secondary" data-method="setCropBoxData" data-target="#putData">
+          <span class="docs-tooltip" data-toggle="tooltip" title="cropper.setCropBoxData(data)">
+            Set Crop Box Data
+          </span>
+        </button>
+        <button type="button" class="btn btn-secondary" data-method="moveTo" data-option="0">
+          <span class="docs-tooltip" data-toggle="tooltip" title="cropper.moveTo(0)">
+            Move to [0,0]
+          </span>
+        </button>
+        <button type="button" class="btn btn-secondary" data-method="zoomTo" data-option="1">
+          <span class="docs-tooltip" data-toggle="tooltip" title="cropper.zoomTo(1)">
+            Zoom to 100%
+          </span>
+        </button>
+        <button type="button" class="btn btn-secondary" data-method="rotateTo" data-option="180">
+          <span class="docs-tooltip" data-toggle="tooltip" title="cropper.rotateTo(180)">
+            Rotate 180°
+          </span>
+        </button>
+        <button type="button" class="btn btn-secondary" data-method="scale" data-option="-2" data-second-option="-1">
+          <span class="docs-tooltip" data-toggle="tooltip" title="cropper.scale(-2, -1)">
+            Scale (-2, -1)
+          </span>
+        </button>
+        <textarea class="form-control" id="putData" placeholder="Get data to here or set data with this value"></textarea>
+   	 	</div>
+      </div><!-- /.docs-buttons -->
+    </div>
+      </div>
+    </div>
+    
+  </div>
+
+  <!-- Scripts -->
+  <script src="<{Dever::assets('lib/jquery/jquery.min.js', 'script')}>"></script>
+  <script src="<{Dever::assets('lib/bootstrap/js/bootstrap.min.js', 'script')}>"></script>
+  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.bundle.min.js"></script>
+  <script src="<{Dever::assets('lib/cropper/cropper.min.js', 'script')}>"></script>
+  <script src="<{Dever::assets('lib/cropper/main.js', 'script')}>"></script>
+</body>
+</html>

+ 4 - 4
database/file.php

@@ -29,8 +29,8 @@ return array
 	'order' => 9,
 	'end' => array
 	(
-		//'insert' => 'upload/manage.add_tag',
-		//'update' => 'upload/manage.add_tag',
+		//'insert' => 'upload/lib/manage.add_tag',
+		//'update' => 'upload/lib/manage.add_tag',
 	),
 
 	/*
@@ -122,7 +122,7 @@ return array
 			'match' 	=> 'is_numeric',
 			'update'	=> 'text',
 			'search'	=> 'fulltext',
-			'autocomplete' => array('upload/manage.search_tag?json=1', 'id', 'upload/manage.search_tag_by_ids'),
+			'autocomplete' => array('upload/lib/manage.search_tag?json=1', 'id', 'upload/lib/manage.search_tag_by_ids'),
 			//'control'	=> 'type',
 			//'list'		=> true,
 		),
@@ -147,7 +147,7 @@ return array
 			'desc' 		=> '请输入后缀名',
 			'match' 	=> 'is_string',
 			'list_name'	=> '文件信息',
-			'list'		=> 'Dever::load("upload/manage.file", {id})',
+			'list'		=> 'Dever::load("upload/lib/manage.file", {id})',
 		),
 		
 		'file'		=> array

+ 1 - 1
src/Manage.php → lib/Manage.php

@@ -1,5 +1,5 @@
 <?php
-namespace Upload\Src;
+namespace Upload\Lib;
 
 use Dever;
 

+ 1 - 1
src/Store/Config.php → lib/Store/Config.php

@@ -1,5 +1,5 @@
 <?php
-namespace Upload\Src\Store;
+namespace Upload\Lib\Store;
 
 interface Config
 {

+ 1 - 1
src/Store/Core.php → lib/Store/Core.php

@@ -1,5 +1,5 @@
 <?php
-namespace Upload\Src\Store;
+namespace Upload\Lib\Store;
 
 use Dever;
 use Dever\String\Helper as Helper;

+ 2 - 2
src/Store/Handle.php → lib/Store/Handle.php

@@ -1,5 +1,5 @@
 <?php
-namespace Upload\Src\Store;
+namespace Upload\Lib\Store;
 
 use Dever;
 
@@ -20,7 +20,7 @@ class Handle
         $yun = $config['yun'];
         if ($this->save_type >= 2) {
             if ($yun == 1) {
-                $yun = 'Upload\Src\Store\Qiniu';
+                $yun = 'Upload\Lib\Store\Qiniu';
             }
             
             $this->yun = new $yun($data);

+ 2 - 2
src/Store/Local.php → lib/Store/Local.php

@@ -1,8 +1,8 @@
 <?php
-namespace Upload\Src\Store;
+namespace Upload\Lib\Store;
 
 use Dever;
-//use Upload\Src\Lib\Img;
+//use Upload\Lib\Lib\Img;
 use Dever\Support\Img;
 
 class Local extends Core implements Config

+ 1 - 1
src/Store/Qiniu.php → lib/Store/Qiniu.php

@@ -1,5 +1,5 @@
 <?php
-namespace Upload\Src\Store;
+namespace Upload\Lib\Store;
 
 use Dever;
 Dever::apply('sdk/qiniu', 'upload');

+ 18 - 1
src/Save.php

@@ -7,7 +7,7 @@
 namespace Upload\Src;
 
 use Dever;
-use Upload\Src\Store\Handle;
+use Upload\Lib\Store\Handle;
 
 class Save
 {
@@ -16,6 +16,23 @@ class Save
 		
 	}
 
+	public function cropper()
+	{
+		$pic = Dever::input('pic');
+		$local = Dever::local($pic);
+		$img = Dever::input('img');
+		$temp = explode('base64,', $img);
+		$img = str_replace(' ', '+', $temp[1]);
+        $img = base64_decode($img);
+
+        $param = Dever::preInput('param');
+        $name = md5(serialize($param));
+
+		$local .= '.cr_' . $name . '.jpg';
+		file_put_contents($local, $img);
+		return Dever::pic($local);
+	}
+
 	private function upload($file = false, $key = 1)
 	{
 		$image['file'] 	= Dever::input('file', $file);

+ 14 - 2
src/View.php

@@ -7,8 +7,8 @@
 namespace Upload\Src;
 
 use Dever;
-use Upload\Src\Store\Handle;
-//use Upload\Src\Lib\Img;
+use Upload\Lib\Store\Handle;
+//use Upload\Lib\Lib\Img;
 use Dever\Support\Img;
 
 class View
@@ -25,6 +25,18 @@ class View
             $this->output = $handle->name();
         }
     }
+
+    public function manage()
+    {
+        $data = array();
+
+        $data['pic'] = Dever::input('pic');
+        $data['search_cate'] = 1;
+        $data['cate'] = Dever::db('upload/cate')->state();
+
+        $data = Dever::render('manage', $data);
+        Dever::out($data);
+    }
     
     public function files()
     {