Tablet.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
  5. <meta http-equiv="Pragma" content="no-cache" />
  6. <meta http-equiv="Expires" content="0" />
  7. <meta charset="utf-8">
  8. <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  9. <link rel="shortcut icon" href="/img/logo.png" />
  10. <link rel="bookmark" href="/img/logo.png" />
  11. <link rel="stylesheet" href="/plugins/bootstrap-4.3.1/css/bootstrap.min.css">
  12. <link rel="stylesheet" href="/plugins/font-awesome-4.7.0/css/font-awesome.min.css">
  13. <link href="/Plugins/bootstrap-select/css/bootstrap-select.min.css" rel="stylesheet" />
  14. <link rel="stylesheet" href="../common/StyleSheet.css" />
  15. <link href="/Plugins/bootstrap-4.3.1/css/bootstrap4-modal-fullscreen.css" rel="stylesheet" />
  16. <script src="/Plugins/jquery-3.4.1/jquery-3.4.1.min.js"></script>
  17. <script src="/Plugins/virtualkeyboard/xvirtualkeyboard.js"></script>
  18. <style type="text/css">
  19. * {
  20. margin: 0;
  21. padding: 0;
  22. }
  23. .button-container {
  24. width: 400px;
  25. display: flex;
  26. /* 水平居中 */
  27. justify-content: center;
  28. /* 垂直居中 */
  29. align-items: center;
  30. }
  31. .button {
  32. /* 按钮之间的间距 */
  33. margin: 0 auto;
  34. }
  35. </style>
  36. <title>东科软件</title>
  37. </head>
  38. <body>
  39. <div>
  40. <canvas id="myCanvas"></canvas>
  41. <img id="myImage"/>
  42. <div class="button-container">
  43. <button type="button" class="btn btn-primary button" onclick="save()">确认</button>
  44. <button type="button" class="btn btn-danger button" onclick="cancel()">取消</button>
  45. <button id="delete" type="button" class="btn btn-danger button" onclick="showcanvas()">删除图片</button>
  46. </div>
  47. </div>
  48. <script>
  49. /**加载前调用*/
  50. $(document).ready(function () {
  51. getQueryParam();
  52. show();
  53. });
  54. /**获取父页面传来的id */
  55. var id=0;
  56. /**取父页面传来的总单id*/
  57. var registerid = 0;
  58. /**签字版以及图片宽 */
  59. const width = 0.985;
  60. /**签字版以及图片高 */
  61. const height = 0.85;
  62. /**配置内容*/
  63. const config = {
  64. /**宽度*/
  65. width: window.innerWidth * width,
  66. /**高度*/
  67. height: window.innerHeight * height,
  68. /**线宽 */
  69. lineWidth: 10,
  70. /**线条颜色*/
  71. strokeStyle: 'black',
  72. /**设置线条两端圆角*/
  73. lineCap: 'round',
  74. /**线条交汇处圆角*/
  75. lineJoin: 'round',
  76. }
  77. /**获取canvas 实例 */
  78. const canvas = document.querySelector('canvas')
  79. /**设置宽高 */
  80. canvas.width = config.width
  81. canvas.height = config.height
  82. /**设置一个边框 */
  83. canvas.style.border = '3px solid #000'
  84. /**创建上下文 */
  85. const ctx = canvas.getContext('2d')
  86. /**设置填充背景色 */
  87. ctx.fillStyle = 'transparent'
  88. /**绘制填充矩形 */
  89. ctx.fillRect(
  90. 0, // x 轴起始绘制位置
  91. 0, // y 轴起始绘制位置
  92. config.width, // 宽度
  93. config.height // 高度
  94. );
  95. /**保存上次绘制的 坐标及偏移量*/
  96. const client = {
  97. offsetX: 0, // 偏移量
  98. offsetY: 0,
  99. endX: 0, // 坐标
  100. endY: 0
  101. }
  102. /**判断是否为移动端 */
  103. const mobileStatus = (/Mobile|Android|iPhone/i.test(navigator.userAgent))
  104. /** 初始化*/
  105. const init = event => {
  106. /**获取偏移量及坐标*/
  107. const { offsetX, offsetY, pageX, pageY } = mobileStatus ? event.changedTouches[0] : event
  108. // 修改上次的偏移量及坐标
  109. client.offsetX = offsetX
  110. client.offsetY = offsetY
  111. client.endX = pageX
  112. client.endY = pageY
  113. // 清除以上一次 beginPath 之后的所有路径,进行绘制
  114. ctx.beginPath()
  115. // 根据配置文件设置相应配置
  116. ctx.lineWidth = config.lineWidth
  117. ctx.strokeStyle = config.strokeStyle
  118. ctx.lineCap = config.lineCap
  119. ctx.lineJoin = config.lineJoin
  120. // 设置画线起始点位
  121. ctx.moveTo(client.endX, client.endY)
  122. // 监听 鼠标移动或手势移动
  123. window.addEventListener(mobileStatus ? "touchmove" : "mousemove", draw)
  124. }
  125. /**绘制*/
  126. const draw = event => {
  127. // 获取当前坐标点位
  128. const { pageX, pageY } = mobileStatus ? event.changedTouches[0] : event
  129. // 修改最后一次绘制的坐标点
  130. client.endX = pageX
  131. client.endY = pageY
  132. // 根据坐标点位移动添加线条
  133. ctx.lineTo(pageX, pageY)
  134. // 绘制
  135. ctx.stroke()
  136. }
  137. /** 结束绘制*/
  138. const cloaseDraw = () => {
  139. // 结束绘制
  140. ctx.closePath()
  141. // 移除鼠标移动或手势移动监听器
  142. window.removeEventListener("mousemove", draw)
  143. }
  144. /**创建鼠标/手势按下监听器*/
  145. window.addEventListener(mobileStatus ? "touchstart" : "mousedown", init)
  146. /**创建鼠标/手势 弹起/离开 监听器*/
  147. window.addEventListener(mobileStatus ? "touchend" : "mouseup", cloaseDraw)
  148. /**取消-清空画布 */
  149. const cancel = () => {
  150. // 清空当前画布上的所有绘制内容
  151. ctx.clearRect(0, 0, config.width, config.height)
  152. }
  153. /**保存-将画布内容保存为图片 */
  154. const save = () => {
  155. // 将canvas上的内容转成blob流
  156. canvas.toBlob(blob => {
  157. const formData = new FormData();
  158. //formData.append('image', blob);
  159. formData.append('image', blob, 'filename.bmp');
  160. formData.append('REGISTERID', registerid);
  161. formData.append('TYPE', id);
  162. //调用保存接口
  163. $.ajax({
  164. url: 'api/GetCheckBarcode.ashx?m=image',
  165. data: formData,
  166. dataType: "json",
  167. type: "post",
  168. processData: false,
  169. contentType: false,
  170. success: function (date) {
  171. //返回值为1(成功)
  172. if (date === 1) {
  173. show();
  174. }
  175. },
  176. });
  177. }, 'image/bmp')
  178. }
  179. /**展示图片并隐藏按钮 */
  180. const show =async() => {
  181. const formData = new FormData();
  182. formData.append('REGISTERID',await registerid);
  183. formData.append('TYPE', await id);
  184. //查找图片
  185. await $.ajax({
  186. url: 'api/GetCheckBarcode.ashx?m=showimage',
  187. data: formData,
  188. dataType: "json",
  189. type: "post",
  190. processData: false,
  191. contentType: false,
  192. success: function (date) {
  193. //调用展示图片
  194. getimage(date);
  195. },
  196. });
  197. }
  198. /**
  199. * 隐藏签字板按钮 展示图片
  200. * @param date 图片二进制
  201. */
  202. const getimage = (date) => {
  203. var canvas = document.getElementById('myCanvas');
  204. var img = document.getElementById('myImage');
  205. var deletebut = document.getElementById('delete');
  206. const buttonContainers = document.querySelectorAll('.button');
  207. // 如果canvas是可见的,隐藏它并显示图片
  208. /* if (canvas.style.display == 'block') {*/
  209. if (date.code == 200) {
  210. canvas.style.display = 'none';
  211. img.style.display = 'block';
  212. img.src = date.htmlString;
  213. img.width = window.innerWidth * width;
  214. img.height =window.innerHeight * height;
  215. // 遍历这些元素并设置它们的可见性为隐藏
  216. buttonContainers.forEach(container => {
  217. container.style.visibility = 'hidden';
  218. if (container.id == 'delete') {
  219. container.style.visibility = 'visible';
  220. }
  221. });
  222. }
  223. // 如果canvas是不可见的(即图片是可见的),显示它并隐藏图片
  224. else {
  225. canvas.style.display = 'block';
  226. img.style.display = 'none';
  227. // 遍历这些元素并设置它们的可见性为显示
  228. buttonContainers.forEach(container => {
  229. container.style.visibility = 'visible';
  230. if (container.id == 'delete') {
  231. container.style.visibility = 'hidden';
  232. }
  233. });
  234. deletebut.style.display = 'none'
  235. }
  236. }
  237. /**显示签字板隐藏图片 */
  238. const showcanvas = () => {
  239. var canvas = document.getElementById('myCanvas');
  240. var img = document.getElementById('myImage');
  241. var deletebut = document.getElementById('delete');
  242. const buttonContainers = document.querySelectorAll('.button');
  243. canvas.style.display = 'block';
  244. img.style.display = 'none';
  245. // 遍历这些元素并设置它们的可见性为隐藏
  246. buttonContainers.forEach(container => {
  247. container.style.visibility = 'visible';
  248. if (container.id == 'delete') {
  249. container.style.visibility = 'hidden';
  250. }
  251. });
  252. deletebut.style.display = 'block'
  253. }
  254. /**获取url内的id */
  255. const getQueryParam = () => {
  256. // 获取URL的查询字符串部分
  257. var search = window.location.search.substring(1);
  258. // 将查询字符串分割成键值对数组
  259. var params = search.split("&");
  260. for (var i = 0; i < params.length; i++) {
  261. //全部赋值后退出
  262. if (id != 0 && registerid != 0) {
  263. break;
  264. }
  265. var val = params[i].split("=");
  266. // 如果找到了匹配的参数名,则返回其值
  267. if (val[0] == 'id') {
  268. id = val[1];
  269. }
  270. if (val[0] == 'REGISTERID') {
  271. registerid = val[1];
  272. }
  273. }
  274. };
  275. </script>
  276. </body>
  277. </html>