首页
关于
友链
Search
1
时间戳转换
68 阅读
2
vue后台管理系统切换页面动画
59 阅读
3
移动端适配
48 阅读
4
H5+ 常用API
46 阅读
5
前端常用网站
46 阅读
默认分类
vue知识点
小程序
js
H5
Html,css
uiapp
App
移动端
登录
Search
慎独
累计撰写
16
篇文章
累计收到
0
条评论
首页
栏目
默认分类
vue知识点
小程序
js
H5
Html,css
uiapp
App
移动端
页面
关于
友链
搜索到
16
篇与
whq
的结果
2021-12-08
前端导出Excel
导入依赖 首先拷贝以下两个文件代码: Export2Excel.js/* eslint-disable */ require('script-loader!file-saver'); require('script-loader!vendor/Blob'); require('script-loader!xlsx/dist/xlsx.core.min'); function generateArray(table) { var out = []; var rows = table.querySelectorAll('tr'); var ranges = []; for (var R = 0; R < rows.length; ++R) { var outRow = []; var row = rows[R]; var columns = row.querySelectorAll('td'); for (var C = 0; C < columns.length; ++C) { var cell = columns[C]; var colspan = cell.getAttribute('colspan'); var rowspan = cell.getAttribute('rowspan'); var cellValue = cell.innerText; if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue; //Skip ranges ranges.forEach(function (range) { if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) { for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null); } }); //Handle Row Span if (rowspan || colspan) { rowspan = rowspan || 1; colspan = colspan || 1; ranges.push({s: {r: R, c: outRow.length}, e: {r: R + rowspan - 1, c: outRow.length + colspan - 1}}); } ; //Handle Value outRow.push(cellValue !== "" ? cellValue : null); //Handle Colspan if (colspan) for (var k = 0; k < colspan - 1; ++k) outRow.push(null); } out.push(outRow); } return [out, ranges]; }; function datenum(v, date1904) { if (date1904) v += 1462; var epoch = Date.parse(v); return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000); } function sheet_from_array_of_arrays(data, opts) { var ws = {}; var range = {s: {c: 10000000, r: 10000000}, e: {c: 0, r: 0}}; for (var R = 0; R != data.length; ++R) { for (var C = 0; C != data[R].length; ++C) { if (range.s.r > R) range.s.r = R; if (range.s.c > C) range.s.c = C; if (range.e.r < R) range.e.r = R; if (range.e.c < C) range.e.c = C; var cell = {v: data[R][C]}; if (cell.v == null) continue; var cell_ref = XLSX.utils.encode_cell({c: C, r: R}); if (typeof cell.v === 'number') cell.t = 'n'; else if (typeof cell.v === 'boolean') cell.t = 'b'; else if (cell.v instanceof Date) { cell.t = 'n'; cell.z = XLSX.SSF._table[14]; cell.v = datenum(cell.v); } else cell.t = 's'; ws[cell_ref] = cell; } } if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range); return ws; } function Workbook() { if (!(this instanceof Workbook)) return new Workbook(); this.SheetNames = []; this.Sheets = {}; } function s2ab(s) { var buf = new ArrayBuffer(s.length); var view = new Uint8Array(buf); for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF; return buf; } export function export_table_to_excel(id) { var theTable = document.getElementById(id); console.log('a') var oo = generateArray(theTable); var ranges = oo[1]; /* original data */ var data = oo[0]; var ws_name = "SheetJS"; console.log(data); var wb = new Workbook(), ws = sheet_from_array_of_arrays(data); /* add ranges to worksheet */ // ws['!cols'] = ['apple', 'banan']; ws['!merges'] = ranges; /* add worksheet to workbook */ wb.SheetNames.push(ws_name); wb.Sheets[ws_name] = ws; var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'}); saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), "test.xlsx") } function formatJson(jsonData) { console.log(jsonData) } export function export_json_to_excel(th, jsonData, defaultTitle) { /* original data */ var data = jsonData; data.unshift(th); var ws_name = "SheetJS"; var wb = new Workbook(), ws = sheet_from_array_of_arrays(data); /* add worksheet to workbook */ wb.SheetNames.push(ws_name); wb.Sheets[ws_name] = ws; var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'}); var title = defaultTitle || '列表' saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), title + ".xlsx") } Blob.js(function (view) { "use strict"; view.URL = view.URL || view.webkitURL; if (view.Blob && view.URL) { try { new Blob; return; } catch (e) {} } // Internally we use a BlobBuilder implementation to base Blob off of // in order to support older browsers that only have BlobBuilder var BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || (function(view) { var get_class = function(object) { return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1]; } , FakeBlobBuilder = function BlobBuilder() { this.data = []; } , FakeBlob = function Blob(data, type, encoding) { this.data = data; this.size = data.length; this.type = type; this.encoding = encoding; } , FBB_proto = FakeBlobBuilder.prototype , FB_proto = FakeBlob.prototype , FileReaderSync = view.FileReaderSync , FileException = function(type) { this.code = this[this.name = type]; } , file_ex_codes = ( "NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR " + "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR" ).split(" ") , file_ex_code = file_ex_codes.length , real_URL = view.URL || view.webkitURL || view , real_create_object_URL = real_URL.createObjectURL , real_revoke_object_URL = real_URL.revokeObjectURL , URL = real_URL , btoa = view.btoa , atob = view.atob , ArrayBuffer = view.ArrayBuffer , Uint8Array = view.Uint8Array ; FakeBlob.fake = FB_proto.fake = true; while (file_ex_code--) { FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1; } if (!real_URL.createObjectURL) { URL = view.URL = {}; } URL.createObjectURL = function(blob) { var type = blob.type , data_URI_header ; if (type === null) { type = "application/octet-stream"; } if (blob instanceof FakeBlob) { data_URI_header = "data:" + type; if (blob.encoding === "base64") { return data_URI_header + ";base64," + blob.data; } else if (blob.encoding === "URI") { return data_URI_header + "," + decodeURIComponent(blob.data); } if (btoa) { return data_URI_header + ";base64," + btoa(blob.data); } else { return data_URI_header + "," + encodeURIComponent(blob.data); } } else if (real_create_object_URL) { return real_create_object_URL.call(real_URL, blob); } }; URL.revokeObjectURL = function(object_URL) { if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) { real_revoke_object_URL.call(real_URL, object_URL); } }; FBB_proto.append = function(data/*, endings*/) { var bb = this.data; // decode data to a binary string if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) { var str = "" , buf = new Uint8Array(data) , i = 0 , buf_len = buf.length ; for (; i < buf_len; i++) { str += String.fromCharCode(buf[i]); } bb.push(str); } else if (get_class(data) === "Blob" || get_class(data) === "File") { if (FileReaderSync) { var fr = new FileReaderSync; bb.push(fr.readAsBinaryString(data)); } else { // async FileReader won't work as BlobBuilder is sync throw new FileException("NOT_READABLE_ERR"); } } else if (data instanceof FakeBlob) { if (data.encoding === "base64" && atob) { bb.push(atob(data.data)); } else if (data.encoding === "URI") { bb.push(decodeURIComponent(data.data)); } else if (data.encoding === "raw") { bb.push(data.data); } } else { if (typeof data !== "string") { data += ""; // convert unsupported types to strings } // decode UTF-16 to binary string bb.push(unescape(encodeURIComponent(data))); } }; FBB_proto.getBlob = function(type) { if (!arguments.length) { type = null; } return new FakeBlob(this.data.join(""), type, "raw"); }; FBB_proto.toString = function() { return "[object BlobBuilder]"; }; FB_proto.slice = function(start, end, type) { var args = arguments.length; if (args < 3) { type = null; } return new FakeBlob( this.data.slice(start, args > 1 ? end : this.data.length) , type , this.encoding ); }; FB_proto.toString = function() { return "[object Blob]"; }; FB_proto.close = function() { this.size = this.data.length = 0; }; return FakeBlobBuilder; }(view)); view.Blob = function Blob(blobParts, options) { var type = options ? (options.type || "") : ""; var builder = new BlobBuilder(); if (blobParts) { for (var i = 0, len = blobParts.length; i < len; i++) { builder.append(blobParts[i]); } } return builder.getBlob(type); }; }(typeof self !== "undefined" && self || typeof window !== "undefined" && window || this.content || this));因为我们在Export2Excel.js中设置的Blob路径为vendor,所以我们要在src下建立相关文件夹并放入这两个js。 设置导出表格数据 假设我们需要导出一个这样的表格 数据// data dataList: [ { name: "张明", loginTime: 16, id: 1, department: "生产部", sex: "男" }, { name: "小金", loginTime: 11, id: 2, department: "生产部", sex: "女" }, { name: "小凌", loginTime: 21, id: 3, department: "生产部", sex: "男" }, { name: "盖伦", loginTime: 5, id: 4, department: "测试部", sex: "男" } ] html<table border> <tr> <th>ID</th> <th>名称</th> <th>登陆次数</th> <th>部门</th> </tr> <tr v-for="item in dataList" :key="item.id"> <td>{{ item.id }}</td> <td>{{ item.name }}</td> <td>{{ item.loginTime }}</td> <td>{{ item.department }}</td> </tr> </table> <button @click="exportExcel">导出信息</button>methods// 导出excel exportExcel() { // 引入文件 const { export_json_to_excel } = require("vendor/Export2Excel.js"); // 表头 const tHeader = ["ID", "名称", "登陆次数", "部门"]; // table表格中对应的属性名 const filterVal = ["id", "name", "loginTime", "department"]; // 表格绑定数据转json const data = this.formatJson(filterVal, this.dataList); export_json_to_excel( tHeader, data, "部门登陆信息" + new Date().toLocaleDateString() ); // 对应下载文件的名字 }, // 导出列表格式化数据的方法 formatJson(filterVal, jsonData) { return jsonData.map(v => filterVal.map(j => v[j])); }展示效果
2021年12月08日
35 阅读
0 评论
9 点赞
2021-12-08
前端常用网站
vant-weapp:https://vant-contrib.gitee.io/vant-weapp/#/intro vant-vue(移动端):https://youzan.github.io/vant/#/zh-CN/intro 大厂获取当前北京时间戳api:https://www.jsjiami.com/article/get-now-time.html 腾讯位置服务我的应用:https://lbs.qq.com/dev/console/application/mine 腾讯位置服务入门指南:https://lbs.qq.com/guides/startup.html uniapp开发工具hbuider下载地址: https://www.dcloud.io/hbuilderx.html vue.js教程:https://learning.dcloud.io/#/?vid=1 uniapp模板及实例项目:https://github.com/privateEye-zzy/mpvue-meituan 微信小程序介绍与开发环境:https://developers.weixin.qq.com/ebook?action=get_post_info&docid=0008aeea9a8978ab0086a685851c0a weui官网地址:https://developers.weixin.qq.com/miniprogram/dev/extended/weui/ 下载weui地址:https://github.com/Tencent/weui-wxss vue大屏数据展示组件库:http://datav.jiaminghi.com/ 跨平台微信支付:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6 日常必备的JS工具函数大全:https://mp.weixin.qq.com/s/BRq_QOHu9wWD9q0SkV3txQ 十几个CSS高级常见技巧汇总:https://mp.weixin.qq.com/s/ilhBpOZkoJ2zReVAIyNWEA JS基础学习:http://c.biancheng.net/js/ 前端开发:http://caibaojian.com/c/front/ swiper: https://www.swiper.com.cn/download/index.html JSDelivr: https://cdn.jsdelivr.net/ UNI-APP 开发微信公众号(H5)JSSDK 的使用方式:https://ask.dcloud.net.cn/article/35380 微信网页开发 /JS-SDK说明文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#58 uniapp社区: https://ask.dcloud.net.cn/explore/ H5+app产业联盟(plus):https://www.html5plus.org/doc/zh_cn/storage.html eslint: https://cloud.tencent.com/developer/doc/1078 Element UI 3.0:https://element-plus.gitee.io/#/zh-CN/component/affix vue-cli:https://cli.vuejs.org/zh/guide/creating-a-project.html#vue-create e-Chart官网实例: https://echarts.apache.org/examples/zh/index.html 微信开发者工具下载:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html
2021年12月08日
46 阅读
0 评论
9 点赞
2021-12-08
vue后台管理系统切换页面动画
<transition name="fade-transform" mode="out-in"> <router-view></router-view> </transition>在公共样式中添加// global transition css /* fade */ .fade-enter-active, .fade-leave-active { transition: opacity 0.28s; } .fade-enter, .fade-leave-active { opacity: 0; } /* fade-transform */ .fade-transform-leave-active, .fade-transform-enter-active { transition: all .5s; } .fade-transform-enter { opacity: 0; transform: translateX(-30px); } .fade-transform-leave-to { opacity: 0; transform: translateX(30px); } /* breadcrumb transition */ .breadcrumb-enter-active, .breadcrumb-leave-active { transition: all .5s; } .breadcrumb-enter, .breadcrumb-leave-active { opacity: 0; transform: translateX(20px); } .breadcrumb-move { transition: all .5s; } .breadcrumb-leave-active { position: absolute; }
2021年12月08日
59 阅读
0 评论
8 点赞
2021-12-08
时间戳转换
时间戳转换,时间戳之间的天数差// 获取当前时间 let Time = new Date(); // 转换为时间戳 Time.getTime();时间戳天数差<! sDate1 , sDate2 是时间戳----> ConTime(sDate1,sDate2){ <! timeNumber 是天数 ----> this.timeNumber = parseInt(Math.abs(sDate2 - sDate1) / 1000 / 60 / 60 / 24) +1; //把相 },
2021年12月08日
68 阅读
0 评论
4 点赞
2021-12-08
移动端适配
移动端适配 安装lib-fiexible 引入 lib-flexible 安装px2rem-loader 配置px2rem-loader 第一种情况:vue-lic 2.x 在 build/utils.js 中,找到 exports.cssLoaders,作出如下修改: const px2remLoader = { loader: 'px2rem-loader', options: { remUint: 75 // 以设计稿 750 为例, 750 / 10 = 75 } } 2.继续找到 generateLoaders 中的 loaders 配置,作出如下配置: // 注 释 掉 这 一 行 // const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]// 修改为 const loaders = [cssLoader, px2remLoader] if (options.usePostCSS) { loaders.push(postcssLoader) 第二种情况 vue-lin 3.x 在根目录创建新文件vue.config.js. 配置如下: module.exports = { css: { loaderOptions: { css: {}, postcss: { plugins: [ require('postcss-px2rem')({ // 以设计稿 750 为例, 750 / 10 = 75 remUnit: 75 }), ] } } }, } 第三种情况:如果屏幕尺寸3840X2160 在remUnit改为384 打开./node_modules/lib-flexible/flexible.js,找到如下片段源码:知道 function refreshRem 这个函数改为如下: function refreshRem(){ var width = docEl.getBoundingClientRect().width if (width / dpr < 1980) { width = 1980 * dpr; } else if (width / dpr > 5760) { width = 5760 * dpr; } var rem = width / 10; docEl.style.fontSize = rem + 'px'; flexible.rem = win.rem = rem; } 配置完成 重启 这是rem布局
2021年12月08日
48 阅读
0 评论
5 点赞
1
2
...
4