entry.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. const render = global => {
  2. async function getCloudBaseApp() {
  3. const app = cloudbase.init({
  4. env: "cloud1-6gbxfp9x33ff3b7c",
  5. });
  6. // 登录
  7. const auth = app.auth({ persistence: "local" });
  8. const loginState = await auth.getLoginState();
  9. // 匿名登录
  10. if (!loginState) {
  11. await auth.anonymousAuthProvider().signIn();
  12. }
  13. return app;
  14. }
  15. global.layui.use(["jquery", "laypage"], async function () {
  16. var laypage = layui.laypage;
  17. var $ = layui.jquery;
  18. var selectFiles = [];
  19. var data = {
  20. Administration: [],
  21. page: 1,
  22. pageSize: 20,
  23. };
  24. // 配置环境
  25. const app = await getCloudBaseApp();
  26. const db = app.database();
  27. const _ = db.command;
  28. let database = db.collection("data_asset");
  29. let count = await database.count();
  30. count = count ? count.total : 0;
  31. let ori = await database
  32. .skip(0)
  33. .limit(count)
  34. .get();
  35. let li = ori.data || [];
  36. data.Administration = sort(li);
  37. let len = data.Administration.length;
  38. for (let i = 0; i < len; i++) {
  39. const v = (data.Administration || [])[i];
  40. let url = v.url.split("/").reverse();
  41. url[0] &&
  42. (v.downUrl =
  43. "https://636c-cloud1-6gbxfp9x33ff3b7c-1306051304.tcb.qcloud.la/" +
  44. url[0]);
  45. }
  46. //执行渲染.
  47. laypage.render({
  48. elem: "page",
  49. limit: data.pageSize,
  50. count, //数据总数,从服务端得到
  51. jump: async function (obj, first) {
  52. //obj包含了当前分页的所有参数,比如:
  53. console.log(obj.curr); //得到当前页,以便向服务端请求对应页的数据。
  54. data.page = obj.curr;
  55. render_table();
  56. },
  57. });
  58. // 渲染table
  59. function render_table() {
  60. let tb = $(".tb");
  61. tb.html("");
  62. let act = (data.page - 1) * data.pageSize;
  63. let end = data.page * data.pageSize;
  64. if (end > data.Administration.length) end = data.Administration.length;
  65. for (let i = act; i < end; i++) {
  66. const v = data.Administration[i];
  67. let type = "";
  68. if (v.type == "video") type = "视频";
  69. else type = "图片";
  70. let tr = $("<tr></tr>");
  71. let tdType = $("<td>" + type + "</td>");
  72. let tdImg =
  73. v.type == "img"
  74. ? $("<td><img style='width:80px;' src='" + v.downUrl + "'></td>")
  75. : $("<td>-</td>");
  76. let tdUrl = $("<td>" + v.url + "</td>");
  77. let tdTool = $(
  78. '<td><a class="layui-btn layui-btn-danger layui-btn-xs delete" data-index="' +
  79. i +
  80. '">删除</a></td>'
  81. );
  82. tr.append(tdType);
  83. tr.append(tdUrl);
  84. tr.append(tdImg);
  85. tr.append(tdTool);
  86. tb.append(tr);
  87. }
  88. }
  89. $(".tb").on("click", ".delete", function () {
  90. let obj = data.Administration[$(this).attr("data-index")];
  91. let remove = $(this).parent().parent();
  92. console.log("---");
  93. //删除
  94. layer.confirm("确定要删除该文件么", async function (index) {
  95. layer.close(index);
  96. //向服务端发送删除指令
  97. try {
  98. // 数据库删除
  99. await database
  100. .where({
  101. _id: _.eq(obj._id),
  102. })
  103. .remove();
  104. // 云存储删除
  105. await app.deleteFile({
  106. fileList: [obj.url],
  107. });
  108. remove.remove();
  109. layer.msg("删除成功");
  110. } catch (err) {
  111. layer.msg("删除失败");
  112. }
  113. });
  114. });
  115. $("#up").change(function () {
  116. let filesList = document.getElementById("up").files || [];
  117. let pathlist = document.getElementById("up").value.split("\\");
  118. pathlist.pop();
  119. data.filePath = pathlist.join("\\") + "\\";
  120. selectFiles = [];
  121. let err = "";
  122. for (let i = 0; i < filesList.length; i++) {
  123. const f = filesList[i];
  124. let file = {
  125. name: f.name,
  126. type: /image\/\w+/.test(f.type)
  127. ? "img"
  128. : /^video/.test(f.type)
  129. ? "video"
  130. : "orther",
  131. file: f,
  132. };
  133. if (file.type == "orther") {
  134. err = "已过滤非音视频文件";
  135. continue;
  136. }
  137. if (file.type != "img") {
  138. var url = null;
  139. if (window.createObjectURL != undefined) {
  140. // basic
  141. url = window.createObjectURL(f);
  142. } else if (window.URL != undefined) {
  143. // mozilla(firefox)
  144. url = window.URL.createObjectURL(f);
  145. } else if (window.webkitURL != undefined) {
  146. // webkit or chrome
  147. url = window.webkitURL.createObjectURL(f);
  148. }
  149. $(".upImg").append($("<video src='" + url + "' />"));
  150. selectFiles.push(file);
  151. continue;
  152. }
  153. let reader = new FileReader();
  154. reader.readAsDataURL(f);
  155. reader.onload = function () {
  156. // 当 FileReader 读取文件时候,读取的结果会放在 FileReader.result 属性中
  157. // document.querySelector("#img").src = this.result;
  158. file.base64 = this.result;
  159. compressImg(file.file, file.base64, 2000).then(minifile => {
  160. file.file = minifile;
  161. });
  162. selectFiles.push(file);
  163. $(".upImg").append($("<img src='" + this.result + "' />"));
  164. };
  165. }
  166. err && layer.msg(err);
  167. });
  168. $(".addE").click(function () {
  169. $(".m").show();
  170. });
  171. $(".upfile").click(async function () {
  172. if (!selectFiles.length) return layer.msg("未选择文件");
  173. for (let i = 0; i < selectFiles.length; i++) {
  174. const v = selectFiles[i];
  175. let f = await app.uploadFile({
  176. cloudPath: v.name,
  177. filePath: v.file,
  178. });
  179. let d = {
  180. // 新增数据
  181. create_time: new Date().getTime(),
  182. type: v.type,
  183. url: f.fileID,
  184. };
  185. await database.add(d);
  186. }
  187. $(".close").click();
  188. let list = await database.get();
  189. data.Administration = sort(list.data || []);
  190. render_table();
  191. });
  192. $(".close").click(function () {
  193. $(".m").hide();
  194. $(".upImg").html("");
  195. document.getElementById("up").value = "";
  196. });
  197. /**
  198. *
  199. * @param {*} file 原始文件
  200. * @param {*} width 压缩宽度
  201. */
  202. function compressImg(file, result, width) {
  203. return new Promise((resolve, reject) => {
  204. let img = new Image();
  205. img.src = result;
  206. img.onload = () => {
  207. let oriWidth = img.width;
  208. let resultNum = width / oriWidth;
  209. let resultHeight = resultNum * img.height;
  210. if (oriWidth <= width) return resolve(file);
  211. // 需要压缩的图片:resultHeight是压缩后的高度
  212. let canvas = document.createElement("canvas");
  213. if (!canvas || !canvas.getContext)
  214. return reject({
  215. msg: "浏览器不支持canvas",
  216. });
  217. canvas.width = width;
  218. canvas.height = resultHeight;
  219. let context = canvas.getContext("2d");
  220. context.drawImage(img, 0, 0, width, resultHeight);
  221. canvas.toBlob(
  222. function (blob) {
  223. resolve(blob);
  224. },
  225. file.type,
  226. 0.8
  227. );
  228. };
  229. });
  230. }
  231. function sort(list) {
  232. return list.sort((a, b) => {
  233. return b.create_time - a.create_time;
  234. });
  235. }
  236. });
  237. return Promise.resolve();
  238. };
  239. (global => {
  240. global["purehtml"] = {
  241. bootstrap: () => {
  242. return Promise.resolve();
  243. },
  244. mount: () => {
  245. return render(global);
  246. },
  247. unmount: () => {
  248. return Promise.resolve();
  249. },
  250. };
  251. })(window);