String
representation i accordance with RFC 2045.
+ *
+ * @param sArr The bytes to convert. If null
or length 0 an empty array will be returned.
+ * @param lineSep Optional "\r\n" after 76 characters, unless end of file.null
.
+ */
+ public final static String encodeToString(byte[] sArr, boolean lineSep) {
+ // Reuse char[] since we can't create a String incrementally anyway and StringBuffer/Builder would be slower.
+ return new String(encodeToChar(sArr, lineSep));
+ }
+
+ /**
+ * Encodes a raw byte array into a BASE64 byte[]
representation i accordance with RFC 2045.
+ *
+ * @param sArr The bytes to convert. If null
or length 0 an empty array will be returned.
+ * @param lineSep Optional "\r\n" after 76 characters, unless end of file.null
.
+ */
+ public final static byte[] encodeToByte(byte[] sArr, boolean lineSep) {
+ // Check special case
+ int sLen = sArr != null ? sArr.length : 0;
+ if (sLen == 0)
+ return new byte[0];
+
+ int eLen = (sLen / 3) * 3; // Length of even 24-bits.
+ int cCnt = ((sLen - 1) / 3 + 1) << 2; // Returned character count
+ int dLen = cCnt + (lineSep ? (cCnt - 1) / 76 << 1 : 0); // Length of returned array
+ byte[] dArr = new byte[dLen];
+
+ // Encode even 24-bits
+ for (int s = 0, d = 0, cc = 0; s < eLen; ) {
+ // Copy next three bytes into lower 24 bits of int, paying attension to sign.
+ int i = (sArr[s++] & 0xff) << 16 | (sArr[s++] & 0xff) << 8 | (sArr[s++] & 0xff);
+
+ // Encode the int into four chars
+ dArr[d++] = (byte) CA[(i >>> 18) & 0x3f];
+ dArr[d++] = (byte) CA[(i >>> 12) & 0x3f];
+ dArr[d++] = (byte) CA[(i >>> 6) & 0x3f];
+ dArr[d++] = (byte) CA[i & 0x3f];
+
+ // Add optional line separator
+ if (lineSep && ++cc == 19 && d < dLen - 2) {
+ dArr[d++] = '\r';
+ dArr[d++] = '\n';
+ cc = 0;
+ }
+ }
+
+ // Pad and encode last bits if source isn't an even 24 bits.
+ int left = sLen - eLen; // 0 - 2.
+ if (left > 0) {
+ // Prepare the int
+ int i = ((sArr[eLen] & 0xff) << 10) | (left == 2 ? ((sArr[sLen - 1] & 0xff) << 2) : 0);
+
+ // Set last four chars
+ dArr[dLen - 4] = (byte) CA[i >> 12];
+ dArr[dLen - 3] = (byte) CA[(i >>> 6) & 0x3f];
+ dArr[dLen - 2] = left == 2 ? (byte) CA[i & 0x3f] : (byte) '=';
+ dArr[dLen - 1] = '=';
+ }
+ return dArr;
+ }
+
+ public final static byte[] decode(char[] sArr) {
+ // Check special case
+ int sLen = sArr != null ? sArr.length : 0;
+ if (sLen == 0)
+ return new byte[0];
+
+ // Count illegal characters (including '\r', '\n') to know what size the returned array will be,
+ // so we don't have to reallocate & copy it later.
+ int sepCnt = 0; // Number of separator characters. (Actually illegal characters, but that's a bonus...)
+ for (int i = 0; i < sLen; i++) // If input is "pure" (I.e. no line separators or illegal chars) base64 this loop can be commented out.
+ if (IA[sArr[i]] < 0)
+ sepCnt++;
+
+ // Check so that legal chars (including '=') are evenly divideable by 4 as specified in RFC 2045.
+ if ((sLen - sepCnt) % 4 != 0)
+ return null;
+
+ int pad = 0;
+ for (int i = sLen; i > 1 && IA[sArr[--i]] <= 0; )
+ if (sArr[i] == '=')
+ pad++;
+
+ int len = ((sLen - sepCnt) * 6 >> 3) - pad;
+
+ byte[] dArr = new byte[len]; // Preallocate byte[] of exact length
+
+ for (int s = 0, d = 0; d < len; ) {
+ // Assemble three bytes into an int from four "valid" characters.
+ int i = 0;
+ for (int j = 0; j < 4; j++) { // j only increased if a valid char was found.
+ int c = IA[sArr[s++]];
+ if (c >= 0)
+ i |= c << (18 - j * 6);
+ else
+ j--;
+ }
+ // Add the bytes
+ dArr[d++] = (byte) (i >> 16);
+ if (d < len) {
+ dArr[d++] = (byte) (i >> 8);
+ if (d < len)
+ dArr[d++] = (byte) i;
+ }
+ }
+ return dArr;
+ }
+
+ /**
+ * Decodes a BASE64 encoded byte array. All illegal characters will be ignored and can handle both arrays with
+ * and without line separators.
+ *
+ * @param sArr The source array. Length 0 will return an empty array. null
will throw an exception.
+ * @return The decoded array of bytes. May be of length 0. Will be null
if the legal characters
+ * (including '=') isn't divideable by 4. (I.e. definitely corrupted).
+ */
+ public final static byte[] decode(byte[] sArr) {
+ // Check special case
+ int sLen = sArr.length;
+
+ // Count illegal characters (including '\r', '\n') to know what size the returned array will be,
+ // so we don't have to reallocate & copy it later.
+ int sepCnt = 0; // Number of separator characters. (Actually illegal characters, but that's a bonus...)
+ for (int i = 0; i < sLen; i++) // If input is "pure" (I.e. no line separators or illegal chars) base64 this loop can be commented out.
+ if (IA[sArr[i] & 0xff] < 0)
+ sepCnt++;
+
+ // Check so that legal chars (including '=') are evenly divideable by 4 as specified in RFC 2045.
+ if ((sLen - sepCnt) % 4 != 0)
+ return null;
+
+ int pad = 0;
+ for (int i = sLen; i > 1 && IA[sArr[--i] & 0xff] <= 0; )
+ if (sArr[i] == '=')
+ pad++;
+
+ int len = ((sLen - sepCnt) * 6 >> 3) - pad;
+
+ byte[] dArr = new byte[len]; // Preallocate byte[] of exact length
+
+ for (int s = 0, d = 0; d < len; ) {
+ // Assemble three bytes into an int from four "valid" characters.
+ int i = 0;
+ for (int j = 0; j < 4; j++) { // j only increased if a valid char was found.
+ int c = IA[sArr[s++] & 0xff];
+ if (c >= 0)
+ i |= c << (18 - j * 6);
+ else
+ j--;
+ }
+
+ // Add the bytes
+ dArr[d++] = (byte) (i >> 16);
+ if (d < len) {
+ dArr[d++] = (byte) (i >> 8);
+ if (d < len)
+ dArr[d++] = (byte) i;
+ }
+ }
+
+ return dArr;
+ }
+
+ /**
+ * Decodes a BASE64 encoded byte array that is known to be resonably well formatted. The method is about twice as
+ * fast as {@link =#=decode(byte[])}. The preconditions are:null
will throw an exception.
+ * @return The decoded array of bytes. May be of length 0.
+ */
+ public final static byte[] decodeFast(byte[] sArr) {
+ // Check special case
+ int sLen = sArr.length;
+ if (sLen == 0)
+ return new byte[0];
+
+ int sIx = 0, eIx = sLen - 1; // Start and end index after trimming.
+
+ // Trim illegal chars from start
+ while (sIx < eIx && IA[sArr[sIx] & 0xff] < 0)
+ sIx++;
+
+ // Trim illegal chars from end
+ while (eIx > 0 && IA[sArr[eIx] & 0xff] < 0)
+ eIx--;
+
+ // get the padding count (=) (0, 1 or 2)
+ int pad = sArr[eIx] == '=' ? (sArr[eIx - 1] == '=' ? 2 : 1) : 0; // Count '=' at end.
+ int cCnt = eIx - sIx + 1; // Content count including possible separators
+ int sepCnt = sLen > 76 ? (sArr[76] == '\r' ? cCnt / 78 : 0) << 1 : 0;
+
+ int len = ((cCnt - sepCnt) * 6 >> 3) - pad; // The number of decoded bytes
+ byte[] dArr = new byte[len]; // Preallocate byte[] of exact length
+
+ // Decode all but the last 0 - 2 bytes.
+ int d = 0;
+ for (int cc = 0, eLen = (len / 3) * 3; d < eLen; ) {
+ // Assemble three bytes into an int from four "valid" characters.
+ int i = IA[sArr[sIx++]] << 18 | IA[sArr[sIx++]] << 12 | IA[sArr[sIx++]] << 6 | IA[sArr[sIx++]];
+
+ // Add the bytes
+ dArr[d++] = (byte) (i >> 16);
+ dArr[d++] = (byte) (i >> 8);
+ dArr[d++] = (byte) i;
+
+ // If line separator, jump over it.
+ if (sepCnt > 0 && ++cc == 19) {
+ sIx += 2;
+ cc = 0;
+ }
+ }
+
+ if (d < len) {
+ // Decode last 1-3 bytes (incl '=') into 1-3 bytes
+ int i = 0;
+ for (int j = 0; sIx <= eIx - pad; j++)
+ i |= IA[sArr[sIx++]] << (18 - j * 6);
+
+ for (int r = 16; d < len; r -= 8)
+ dArr[d++] = (byte) (i >> r);
+ }
+
+ return dArr;
+ }
+
+ /**
+ * Decodes a BASE64 encoded char array that is known to be resonably well formatted. The method is about twice as
+ * fast as {@link =#=decode(char[])}. The preconditions are:null
will throw an exception.
+ * @return The decoded array of bytes. May be of length 0.
+ */
+ public final static byte[] decodeFast(char[] sArr) {
+ // Check special case
+ int sLen = sArr.length;
+ if (sLen == 0)
+ return new byte[0];
+
+ int sIx = 0, eIx = sLen - 1; // Start and end index after trimming.
+
+ // Trim illegal chars from start
+ while (sIx < eIx && IA[sArr[sIx]] < 0)
+ sIx++;
+
+ // Trim illegal chars from end
+ while (eIx > 0 && IA[sArr[eIx]] < 0)
+ eIx--;
+
+ // get the padding count (=) (0, 1 or 2)
+ int pad = sArr[eIx] == '=' ? (sArr[eIx - 1] == '=' ? 2 : 1) : 0; // Count '=' at end.
+ int cCnt = eIx - sIx + 1; // Content count including possible separators
+ int sepCnt = sLen > 76 ? (sArr[76] == '\r' ? cCnt / 78 : 0) << 1 : 0;
+
+ int len = ((cCnt - sepCnt) * 6 >> 3) - pad; // The number of decoded bytes
+ byte[] dArr = new byte[len]; // Preallocate byte[] of exact length
+
+ // Decode all but the last 0 - 2 bytes.
+ int d = 0;
+ for (int cc = 0, eLen = (len / 3) * 3; d < eLen; ) {
+ // Assemble three bytes into an int from four "valid" characters.
+ int i = IA[sArr[sIx++]] << 18 | IA[sArr[sIx++]] << 12 | IA[sArr[sIx++]] << 6 | IA[sArr[sIx++]];
+
+ // Add the bytes
+ dArr[d++] = (byte) (i >> 16);
+ dArr[d++] = (byte) (i >> 8);
+ dArr[d++] = (byte) i;
+
+ // If line separator, jump over it.
+ if (sepCnt > 0 && ++cc == 19) {
+ sIx += 2;
+ cc = 0;
+ }
+ }
+
+ if (d < len) {
+ // Decode last 1-3 bytes (incl '=') into 1-3 bytes
+ int i = 0;
+ for (int j = 0; sIx <= eIx - pad; j++)
+ i |= IA[sArr[sIx++]] << (18 - j * 6);
+
+ for (int r = 16; d < len; r -= 8)
+ dArr[d++] = (byte) (i >> r);
+ }
+
+ return dArr;
+ }
+
+ /**
+ * Decodes a BASE64 encoded String
. All illegal characters will be ignored and can handle both strings with
+ * and without line separators.decode(str.toCharArray())
instead. That
+ * will create a temporary array though. This version will use str.charAt(i)
to iterate the string.
+ *
+ * @param str The source string. null
or length 0 will return an empty array.
+ * @return The decoded array of bytes. May be of length 0. Will be null
if the legal characters
+ * (including '=') isn't divideable by 4. (I.e. definitely corrupted).
+ */
+ public final static byte[] decode(String str) {
+ // Check special case
+ int sLen = str != null ? str.length() : 0;
+ if (sLen == 0)
+ return new byte[0];
+
+ // Count illegal characters (including '\r', '\n') to know what size the returned array will be,
+ // so we don't have to reallocate & copy it later.
+ int sepCnt = 0; // Number of separator characters. (Actually illegal characters, but that's a bonus...)
+ for (int i = 0; i < sLen; i++) // If input is "pure" (I.e. no line separators or illegal chars) base64 this loop can be commented out.
+ if (IA[str.charAt(i)] < 0)
+ sepCnt++;
+
+ // Check so that legal chars (including '=') are evenly divideable by 4 as specified in RFC 2045.
+ if ((sLen - sepCnt) % 4 != 0)
+ return null;
+
+ // Count '=' at end
+ int pad = 0;
+ for (int i = sLen; i > 1 && IA[str.charAt(--i)] <= 0; )
+ if (str.charAt(i) == '=')
+ pad++;
+
+ int len = ((sLen - sepCnt) * 6 >> 3) - pad;
+
+ byte[] dArr = new byte[len]; // Preallocate byte[] of exact length
+
+ for (int s = 0, d = 0; d < len; ) {
+ // Assemble three bytes into an int from four "valid" characters.
+ int i = 0;
+ for (int j = 0; j < 4; j++) { // j only increased if a valid char was found.
+ int c = IA[str.charAt(s++)];
+ if (c >= 0)
+ i |= c << (18 - j * 6);
+ else
+ j--;
+ }
+ // Add the bytes
+ dArr[d++] = (byte) (i >> 16);
+ if (d < len) {
+ dArr[d++] = (byte) (i >> 8);
+ if (d < len)
+ dArr[d++] = (byte) i;
+ }
+ }
+ return dArr;
+ }
+
+ /**
+ * Decodes a BASE64 encoded string that is known to be resonably well formatted. The method is about twice as
+ * fast as {@link =#=decode(String)}. The preconditions are:null
will throw an exception.
+ * @return The decoded array of bytes. May be of length 0.
+ */
+ public final static byte[] decodeFast(String str) {
+ // Check special case
+ int sLen = str.length();
+ if (sLen == 0)
+ return new byte[0];
+
+ int sIx = 0, eIx = sLen - 1; // Start and end index after trimming.
+
+ // Trim illegal chars from start
+ while (sIx < eIx && IA[str.charAt(sIx) & 0xff] < 0)
+ sIx++;
+
+ // Trim illegal chars from end
+ while (eIx > 0 && IA[str.charAt(eIx) & 0xff] < 0)
+ eIx--;
+
+ // get the padding count (=) (0, 1 or 2)
+ int pad = str.charAt(eIx) == '=' ? (str.charAt(eIx - 1) == '=' ? 2 : 1) : 0; // Count '=' at end.
+ int cCnt = eIx - sIx + 1; // Content count including possible separators
+ int sepCnt = sLen > 76 ? (str.charAt(76) == '\r' ? cCnt / 78 : 0) << 1 : 0;
+
+ int len = ((cCnt - sepCnt) * 6 >> 3) - pad; // The number of decoded bytes
+ byte[] dArr = new byte[len]; // Preallocate byte[] of exact length
+
+ // Decode all but the last 0 - 2 bytes.
+ int d = 0;
+ for (int cc = 0, eLen = (len / 3) * 3; d < eLen; ) {
+ // Assemble three bytes into an int from four "valid" characters.
+ int i = IA[str.charAt(sIx++)] << 18 | IA[str.charAt(sIx++)] << 12 | IA[str.charAt(sIx++)] << 6 | IA[str.charAt(sIx++)];
+
+ // Add the bytes
+ dArr[d++] = (byte) (i >> 16);
+ dArr[d++] = (byte) (i >> 8);
+ dArr[d++] = (byte) i;
+
+ // If line separator, jump over it.
+ if (sepCnt > 0 && ++cc == 19) {
+ sIx += 2;
+ cc = 0;
+ }
+ }
+
+ if (d < len) {
+ // Decode last 1-3 bytes (incl '=') into 1-3 bytes
+ int i = 0;
+ for (int j = 0; sIx <= eIx - pad; j++)
+ i |= IA[str.charAt(sIx++)] << (18 - j * 6);
+
+ for (int r = 16; d < len; r -= 8)
+ dArr[d++] = (byte) (i >> r);
+ }
+
+ return dArr;
+ }
+
+ public static void main(String[] args) {
+ String s = Base64Util.encodeToString(("我搜搜").getBytes());
+ System.out.println(s);
+
+ byte[] decode = Base64Util.decode(s);
+ System.out.println(new String(decode));
+
+ }
+}
diff --git a/src/main/java/xyz/wbsite/framework/utils/CookieUtil.java b/src/main/java/xyz/wbsite/framework/utils/CookieUtil.java
new file mode 100644
index 0000000..66aadd0
--- /dev/null
+++ b/src/main/java/xyz/wbsite/framework/utils/CookieUtil.java
@@ -0,0 +1,34 @@
+package xyz.wbsite.framework.utils;
+
+import javax.servlet.http.Cookie;
+
+/**
+ * CookieUtil
+ *
+ * @author wangbing
+ * @version 0.0.1
+ * @since 2017-01-01
+ */
+public class CookieUtil {
+
+ /**
+ * 通过Cookies获取内容
+ *
+ * @param cookies Cookies
+ * @return passportID
+ */
+ public static String getCookieValue(Cookie[] cookies, String key) {
+ if (cookies != null) {
+ for (Cookie cookie : cookies) {
+ // Cookie中存放的为passport的id ,Cookie名称通过ConfigToolObject获取
+ if (cookie != null && cookie.getName().equals(key)) {
+ try {
+ return cookie.getValue();
+ } catch (Exception ignored) {
+ }
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/xyz/wbsite/framework/utils/IDgenerator.java b/src/main/java/xyz/wbsite/framework/utils/IDgenerator.java
new file mode 100644
index 0000000..56d7eb2
--- /dev/null
+++ b/src/main/java/xyz/wbsite/framework/utils/IDgenerator.java
@@ -0,0 +1,80 @@
+package xyz.wbsite.framework.utils;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+/**
+ * IDgenerator - ID生成器
+ *
+ * @author wangbing
+ * @version 0.0.1
+ * @since 2017-01-01
+ */
+public class IDgenerator {
+
+ private static long workerId = 1L;
+ private static long datacenterId = 1L;
+ private static long sequence = 0L;
+ // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动)
+ private static long twepoch = 1531130104852L;
+ // 机器标识位数
+ private static long workerIdBits = 2L;//分布应用可设置为5,这里减少占位增加可支持时间
+ // 数据中心标识位数
+ private static long datacenterIdBits = 2L;//分布应用可设置为5,这里减少占位增加可支持时间
+ // 机器ID最大值
+ private static long maxWorkerId = -1L ^ (-1L << workerIdBits);
+ // 数据中心ID最大值
+ private static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
+ // 毫秒内自增位
+ private static long sequenceBits = 12L;
+ // 机器ID偏左移12位
+ private static long workerIdShift = sequenceBits;
+ // 数据中心ID左移17位
+ private static long datacenterIdShift = sequenceBits + workerIdBits;
+ // 时间毫秒左移22位
+ private static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
+ private static long sequenceMask = -1L ^ (-1L << sequenceBits);
+ // 上次生产id时间戳
+ private static long lastTimestamp = -1L;
+
+ public static synchronized long nextId() {
+ long timestamp = timeGen();
+
+ if (timestamp < lastTimestamp) {
+ throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
+ }
+
+ if (lastTimestamp == timestamp) {
+ sequence = (sequence + 1) & sequenceMask;
+ if (sequence == 0) {
+ timestamp = tilNextMillis(lastTimestamp);
+ }
+ } else {
+ sequence = 0L;
+ }
+
+ lastTimestamp = timestamp;
+
+ return ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift) | (workerId << workerIdShift) | sequence;
+ }
+
+ protected static long tilNextMillis(long lastTimestamp) {
+ long timestamp = timeGen();
+ while (timestamp <= lastTimestamp) {
+ timestamp = timeGen();
+ }
+ return timestamp;
+ }
+
+ protected static long timeGen() {
+ return System.currentTimeMillis();
+ }
+
+ public static void main(String[] args) {
+ for (int i = 0; i < 10; i++) {
+ long l = IDgenerator.nextId();
+ System.out.println(l);
+ }
+ }
+}
diff --git a/src/main/java/xyz/wbsite/framework/utils/LocalData.java b/src/main/java/xyz/wbsite/framework/utils/LocalData.java
new file mode 100644
index 0000000..f53eb61
--- /dev/null
+++ b/src/main/java/xyz/wbsite/framework/utils/LocalData.java
@@ -0,0 +1,86 @@
+package xyz.wbsite.framework.utils;
+
+import xyz.wbsite.framework.base.Token;
+import org.springframework.context.ApplicationContext;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import org.springframework.web.context.support.WebApplicationContextUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * LocalData - 本地数据存放类
+ *
+ * @author wangbing
+ * @version 0.0.1
+ * @since 2017-01-01
+ */
+public class LocalData {
+ private static final long serialVersionUID = 1L;
+
+ private static Token temp = null;
+
+ private static Token system = null;
+
+ static {
+ temp = new Token();
+ temp.setId(-1);
+ temp.setUserId(-1);
+ temp.setUserName("游客");
+ temp.putResource("/ajax");
+ temp.putResource("/upload");
+ temp.putResource("ajax.example.example");
+ system = new Token();
+ system.setId(0);
+ system.setUserId(0);
+ system.setUserName("system");
+ system.putResource(".*");
+ }
+
+ public static Token getTempToken(){
+ return temp;
+ }
+
+ public static Token getSysToken() {
+ return system;
+ }
+
+ /**
+ * 当请求目标 target = '/aa/bb'
+ */
+ private static final ThreadLocal+ ${msg} +
+Freemarker 是一款模板引擎,是一种基于模版生成静态文件的通用 + 工具,它是为Java程序员提供的一个开发包,或者说是一个类库,它不是面向最终用户的,而是为程序员提供了一款可以嵌入他们开发产品的应用程序。
+ +Freemarker 是使用纯java编写的,为了提高页面的访问速度,需要把页面静态化, 那么Freemarker就是被用来生成html页面。
+ +本工程使用的Freemarker整合了Spring MVC, 与你需要了解或熟悉Spring MVC框架。如果你熟悉EL表达,将有助于该工程Freemarker的使用。
+${r'${hello}'}
+${'<#if status == 0>'}
+ +status is 0
+ +${'<#else>'}
+ +status is not 0
+ +${'</#if>'}
+${'<#if status == 0>'}
+ +status is 0
+ +${'<#elseif status ==1>'}
+ +status = 1
+ +${'<#else>'}
+ +status != 0 && status !=1
+ +${'</#if>'}
+${'<#list citys as city>'}
+ +${r'${city}'}
+ +${'</#list>'}
+${'<#list citys as city>'}
+ +${r' ${city_index} --> ${city}'}
+ +${'</#list>'}
+${'<#macro sayHello name1 name2>'}
+ +${r'hello, ${name1} and ${name2}'}
+ +${r'</#macro>'}
+ +-----------------
+ +${r'<@sayHello name1="zhangsan" name2="lisi"/>'}
+ +hello, zhangsan and lisi
+ +代替调用宏指令时标签对之间包裹的内容
+ +${r'<#macro hw>'}
+ +${r'hello,<#nested>'}
+ +${r'</#macro>'}
+ + + +${r'<@hw>zhangsan,lisi,wangwu,zhaoliu<<@hw>'}
+ +${'<#macro print items >'}
+ +${r'<#nested>:'}
+ +${r'<#list items as item>'}
+ +${''?html}${r'${item}'?html}${''?html}
+ +${'</#list>'}
+ +${'</#macro>'}
+${'<@print items=["A","B","C"]>'}
+ +items is
+ +${'</@print>'}
++ ${r'<#import "/control/macro.ftl"/>'} +
++ ${r'<#import "/control/macro.ftl" as macro/>'} +
++ ${r'${macro.fileName}'} +
++ ${r'<@macro.printEmp employee/>'} +
++ ${r'<#assign fileName = "command.ftl" in util />'} +
++ ${r'<#include "/control/footer.ftl" />'} +
+Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是, + Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或 + 既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
+${''?html} +
+${'
${'...'?html} + +
${'
${''?html}
+ +${''?html}
+ +${''?html}
+ +${''?html}
+${''?html}
+ +${''}
+ +${''?html}
+ +${'"?html}
+hidden-xs-only
- 当视口在 xs
尺寸时隐藏hidden-sm-only
- 当视口在 sm
尺寸时隐藏hidden-sm-and-down
- 当视口在 sm
及以下尺寸时隐藏hidden-sm-and-up
- 当视口在 sm
及以上尺寸时隐藏hidden-md-only
- 当视口在 md
尺寸时隐藏hidden-md-and-down
- 当视口在 md
及以下尺寸时隐藏hidden-md-and-up
- 当视口在 md
及以上尺寸时隐藏hidden-lg-only
- 当视口在 lg
尺寸时隐藏hidden-lg-and-down
- 当视口在 lg
及以下尺寸时隐藏hidden-lg-and-up
- 当视口在 lg
及以上尺寸时隐藏hidden-xl-only
- 当视口在 xl
尺寸时隐藏参数 | +说明 | +类型 | +可选值 | +默认值 | +
---|---|---|---|---|
gutter | +栅格间隔 | +number | +— | +0 | +
type | +布局模式,可选 flex,现代浏览器下有效 | +string | +— | +— | +
justify | +flex 布局下的水平排列方式 | +string | +start/end/center/space-around/space-between | +start | +
align | +flex 布局下的垂直排列方式 | +string | +top/middle/bottom | +top | +
tag | +自定义元素标签 | +string | +* | +div | +
参数 | +说明 | +类型 | +可选值 | +默认值 | +
---|---|---|---|---|
span | +栅格占据的列数 | +number | +— | +24 | +
offset | +栅格左侧的间隔格数 | +number | +— | +0 | +
push | +栅格向右移动格数 | +number | +— | +0 | +
pull | +栅格向左移动格数 | +number | +— | +0 | +
xs | +<768px 响应式栅格数或者栅格属性对象 |
+ number/object (例如: {span: 4, offset: 4}) | +— | +— | +
sm | +≥768px 响应式栅格数或者栅格属性对象 |
+ number/object (例如: {span: 4, offset: 4}) | +— | +— | +
md | +≥992px 响应式栅格数或者栅格属性对象 |
+ number/object (例如: {span: 4, offset: 4}) | +— | +— | +
lg | +≥1200px 响应式栅格数或者栅格属性对象 |
+ number/object (例如: {span: 4, offset: 4}) | +— | +— | +
xl | +≥1920px 响应式栅格数或者栅格属性对象 |
+ number/object (例如: {span: 4, offset: 4}) | +— | +— | +
tag | +自定义元素标签 | +string | +* | +div | +
用于布局的容器组件,方便快速搭建页面的基本结构:
+ +<el-container>
:外层容器。当子元素中包含 <el-header>
或
+ <el-footer>
+ 时,全部子元素会垂直上下排列,否则会水平左右排列。
<el-header>
:顶栏容器。
<el-aside>
:侧边栏容器。
<el-main>
:主要区域容器。
<el-footer>
:底栏容器。
参数 | +说明 | +类型 | +可选值 | +默认值 | +
---|---|---|---|---|
direction | +子元素的排列方向 | +string | +horizontal / vertical | +子元素中有 el-header 或 el-footer 时为 vertical,否则为 horizontal
+ |
+
参数 | +说明 | +类型 | +可选值 | +默认值 | +
---|---|---|---|---|
height | +顶栏高度 | +string | +— | +60px | +
参数 | +说明 | +类型 | +可选值 | +默认值 | +
---|---|---|---|---|
width | +侧边栏宽度 | +string | +— | +300px | +
参数 | +说明 | +类型 | +可选值 | +默认值 | +
---|---|---|---|---|
height | +底栏高度 | +string | +— | +60px | +
Element 主要品牌颜色是鲜艳、友好的蓝色。
+CSS 样式:bg-blue
+除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。
+CSS 样式:bg-success,bg-warning,bg-danger,bg-info
+中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。
+CSS 文字颜色:.text-color-primary + ,.text-color-regular,.text-color-secondary,.text-color-placeholder
+ +CSS + 边框颜色:.bg-border-base,.bg-border-light,.bg-border-lighter,.bg-border-extra-light
+我们对字体进行统一规范,力求在各个操作系统下都有最佳展示效果。
+ +
+ font-family: "
+ Helvetica Neue",
+ Helvetica,"
+ PingFang
+ SC","
+ Hiragino
+ Sans
+ GB","
+ Microsoft
+ YaHei","微软雅黑",
+ Arial,
+ sans-serif;
+
+
+ 主标题 | +用 Element 快速搭建页面 | +20px Extra large | +
标题 | +用 Element 快速搭建页面 | +18px large | +
小标题 | +用 Element 快速搭建页面 | +16px Medium | +
正文 | +用 Element 快速搭建页面 | +14px Small | +
正文(小) | +用 Element 快速搭建页面 | +13px Extra Small | +
辅助文字 | +用 Element 快速搭建页面 | +12px Extra Extra Small | +
提供了一套常用的图标集合。
+ +直接通过设置类名为 el-icon-iconName
来使用即可。例如:
参数 | +说明 | +类型 | +可选值 | +默认值 | +
---|---|---|---|---|
size | +尺寸 | +string | +medium / small / mini | +— | +
type | +类型 | +string | +primary / success / warning / danger / info / text | +— | +
plain | +是否朴素按钮 | +boolean | +— | +false | +
round | +是否圆角按钮 | +boolean | +— | +false | +
circle | +是否圆形按钮 | +boolean | +— | +false | +
loading | +是否加载中状态 | +boolean | +— | +false | +
disabled | +是否禁用状态 | +boolean | +— | +false | +
icon | +图标类名 | +string | +— | +— | +
autofocus | +是否默认聚焦 | +boolean | +— | +false | +
native-type | +原生 type 属性 | +string | +button / submit / reset | +button | +
before-upload
限制用户上传的图片格式和大小。
+ list-type
属性来设置文件列表的样式。
+ on-change
钩子函数来对列表进行控制
+ 嵌套在 el-form-item
中的 el-form-item
标签宽度默认为零,不会继承 el-form
+ 的 label-width
。如果需要可以为其单独设置 label-width
属性。
通过设置 Form 上的 size
属性可以使该表单内所有可调节大小的组件继承该尺寸。Form-Item
+ 也具有该属性。
参数 | +说明 | +类型 | +可选值 | +默认值 | +
---|---|---|---|---|
model | +表单数据对象 | +object | +— | +— | +
rules | +表单验证规则 | +object | +— | +— | +
inline | +行内表单模式 | +boolean | +— | +false | +
label-position | +表单域标签的位置 | +string | +right/left/top | +right | +
label-width | +表单域标签的宽度,作为 Form 直接子元素的 form-item 会继承该值 | +string | +— | +— | +
label-suffix | +表单域标签的后缀 | +string | +— | +— | +
show-message | +是否显示校验错误信息 | +boolean | +— | +true | +
inline-message | +是否以行内形式展示校验信息 | +boolean | +— | +false | +
status-icon | +是否在输入框中显示校验结果反馈图标 | +boolean | +— | +false | +
validate-on-rule-change | +是否在 rules 属性改变后立即触发一次验证 |
+ boolean | +— | +true | +
size | +用于控制该表单内组件的尺寸 | +string | +medium / small / mini | +— | +
disabled | +是否禁用该表单内的所有组件。若设置为 true,则表单内组件上的 disabled 属性不再生效 | +boolean | +— | +false | +
方法名 | +说明 | +参数 | +
---|---|---|
validate | +对整个表单进行校验的方法,参数为一个回调函数。该回调函数会在校验结束后被调用,并传入两个参数:是否校验成功和未通过校验的字段。若不传入回调函数,则会返回一个 + promise + | +Function(callback: Function(boolean, object)) | +
validateField | +对部分表单字段进行校验的方法 | +Function(prop: string, callback: Function(errorMessage: string)) | +
resetFields | +对整个表单进行重置,将所有字段值重置为初始值并移除校验结果 | +— | +
clearValidate | +移除表单项的校验结果。传入待移除的表单项的 prop 属性组成的数组,如不传则移除整个表单的校验结果 | +Function(props: array) | +
事件名称 | +说明 | +回调参数 | +
---|---|---|
validate | +任一表单项被校验后触发 | +被校验的表单项 prop 值,校验是否通过 | +
参数 | +说明 | +类型 | +可选值 | +默认值 | +
---|---|---|---|---|
prop | +表单域 model 字段,在使用 validate、resetFields 方法的情况下,该属性是必填的 | +string | +传入 Form 组件的 model 中的字段 |
+ — | +
label | +标签文本 | +string | +— | +— | +
label-width | +表单域标签的的宽度,例如 '50px' | +string | +— | +— | +
required | +是否必填,如不设置,则会根据校验规则自动生成 | +boolean | +— | +false | +
rules | +表单验证规则 | +object | +— | +— | +
error | +表单域验证错误信息, 设置该值会使表单验证状态变为error ,并显示该错误信息 |
+ string | +— | +— | +
show-message | +是否显示校验错误信息 | +boolean | +— | +true | +
inline-message | +以行内形式展示校验信息 | +boolean | +— | +false | +
size | +用于控制该表单域下组件的尺寸 | +string | +medium / small / mini | +- | +
name | +说明 | +
---|---|
— | +Form Item 的内容 | +
label | +标签文本的内容 | +
方法名 | +说明 | +参数 | +
---|---|---|
resetField | +对该表单项进行重置,将其值重置为初始值并移除校验结果 | +- | +
clearValidate | +移除该表单项的校验结果 | +- | +
默认情况下,Table
+ 组件是不具有竖直方向的边框的,如果需要,可以使用border
属性,它接受一个Boolean
,设置为true
即可启用。
+
固定列需要使用fixed
属性,它接受 Boolean
+ 值或者left
right
,表示左边固定还是右边固定。
+
固定列和表头可以同时使用,只需要将上述两个属性分别设置好即可。
通过设置max-height
属性为 Table
+ 指定最大高度。此时若表格所需的高度大于最大高度,则会显示一个滚动条。
只需要在 el-table-column 里面嵌套 el-table-column,就可以实现多级表头。
+Table 组件提供了单选的支持,只需要配置highlight-current-row
属性即可实现单选。之后由current-change
事件来管理选中时触发的事件,它会传入currentRow
,oldCurrentRow
。如果需要显示索引,可以增加一列el-table-column
,设置type
属性为index
即可显示从
+ 1 开始的索引号。
实现多选非常简单:
+ 手动添加一个el-table-column
,设type
属性为selection
即可;默认情况下若内容过多会折行显示,若需要单行显示可以使用show-overflow-tooltip
属性,它接受一个Boolean
,为true
时多余的内容会在
+ hover 时以 tooltip 的形式显示出来。
+ 在列中设置sortable
属性即可实现以该列为基准的排序,接受一个Boolean
,默认为false
。可以通过
+ Table 的default-sort
属性设置默认的排序列和排序顺序。可以使用sort-method
或者sort-by
使用自定义的排序规则。如果需要后端排序,需将sortable
设置为custom
,同时在
+ Table 上监听sort-change
事件,在事件回调中可以获取当前排序的字段名和排序顺序,从而向接口请求排序后的表格数据。在本例中,我们还使用了formatter
属性,它用于格式化指定列的值,接受一个Function
,会传入两个参数:row
和column
,可以根据自己的需求进行处理。
+
在列中设置filters
filter-method
属性即可开启该列的筛选,filters
+ 是一个数组,filter-method
是一个方法,它用于决定某些数据是否显示,会传入三个参数:value
,
+ row
和 column
。
通过 Scoped slot
可以获取到 row, column, $index 和
+ store(table 内部的状态管理)的数据,用法参考 demo。
姓名: {{ scope.row.name }}
+ +住址: {{ scope.row.address }}
+ +通过设置 type="expand" 和 Scoped slot
+ 可以开启展开行功能,el-table-column
的模板会被渲染成为展开行的内容,展开行可访问的属性与使用自定义列模板时的 Scoped
+ slot
相同。
将show-summary
设置为true
就会在表格尾部展示合计行。默认情况下,对于合计行,第一列不进行数据求合操作,而是显示「合计」二字(可通过sum-text
配置),其余列会将本列所有数值进行求合操作,并显示出来。当然,你也可以定义自己的合计逻辑。使用summary-method
并传入一个方法,返回一个数组,这个数组中的各项就会显示在合计行的各列中,具体可以参考本例中的第二个表格。
+
通过给table
传入span-method
方法可以实现合并行或列,方法的参数是一个对象,里面包含当前行row
、当前列column
、当前行号rowIndex
、当前列号columnIndex
四个属性。该函数可以返回一个包含两个元素的数组,第一个元素代表rowspan
,第二个元素代表colspan
。
+ 也可以返回一个键名为rowspan
和colspan
的对象。
type=index
列的行号。
+ 通过给 type=index
的列传入 index
+ 属性,可以自定义索引。该属性传入数字时,将作为索引的起始值。也可以传入一个方法,它提供当前行的行号(从 0
+ 开始)作为参数,返回值将作为索引展示。
参数 | +说明 | +类型 | +可选值 | +默认值 | +
---|---|---|---|---|
data | +显示的数据 | +array | +— | +— | +
height | +Table 的高度,默认为自动高度。如果 height 为 number 类型,单位 px;如果 height 为 string 类型,则这个高度会设置为 Table + 的 style.height 的值,Table 的高度会受控于外部样式。 + | +string/number | +— | +— | +
max-height | +Table 的最大高度 | +string/number | +— | +— | +
stripe | +是否为斑马纹 table | +boolean | +— | +false | +
border | +是否带有纵向边框 | +boolean | +— | +false | +
size | +Table 的尺寸 | +string | +medium / small / mini | +— | +
fit | +列的宽度是否自撑开 | +boolean | +— | +true | +
show-header | +是否显示表头 | +boolean | +— | +true | +
highlight-current-row | +是否要高亮当前行 | +boolean | +— | +false | +
current-row-key | +当前行的 key,只写属性 | +String,Number | +— | +— | +
row-class-name | +行的 className 的回调方法,也可以使用字符串为所有行设置一个固定的 className。 | +Function({row, rowIndex})/String | +— | +— | +
row-style | +行的 style 的回调方法,也可以使用一个固定的 Object 为所有行设置一样的 Style。 | +Function({row, rowIndex})/Object | +— | +— | +
cell-class-name | +单元格的 className 的回调方法,也可以使用字符串为所有单元格设置一个固定的 className。 | +Function({row, column, rowIndex, columnIndex})/String | +— | +— | +
cell-style | +单元格的 style 的回调方法,也可以使用一个固定的 Object 为所有单元格设置一样的 Style。 | +Function({row, column, rowIndex, columnIndex})/Object | +— | +— | +
header-row-class-name | +表头行的 className 的回调方法,也可以使用字符串为所有表头行设置一个固定的 className。 | +Function({row, rowIndex})/String | +— | +— | +
header-row-style | +表头行的 style 的回调方法,也可以使用一个固定的 Object 为所有表头行设置一样的 Style。 | +Function({row, rowIndex})/Object | +— | +— | +
header-cell-class-name | +表头单元格的 className 的回调方法,也可以使用字符串为所有表头单元格设置一个固定的 className。 | +Function({row, column, rowIndex, columnIndex})/String | +— | +— | +
header-cell-style | +表头单元格的 style 的回调方法,也可以使用一个固定的 Object 为所有表头单元格设置一样的 Style。 | +Function({row, column, rowIndex, columnIndex})/Object | +— | +— | +
row-key | +行数据的 Key,用来优化 Table 的渲染;在使用 reserve-selection 功能的情况下,该属性是必填的。类型为 String
+ 时,支持多层访问:user.info.id ,但不支持 user.info[0].id ,此种情况请使用 Function 。
+ |
+ Function(row)/String | +— | +— | +
empty-text | +空数据时显示的文本内容,也可以通过 slot="empty" 设置 |
+ String | +— | +暂无数据 | +
default-expand-all | +是否默认展开所有行,当 Table 中存在 type="expand" 的 Column 的时候有效 | +Boolean | +— | +false | +
expand-row-keys | +可以通过该属性设置 Table 目前的展开行,需要设置 row-key 属性才能使用,该属性为展开行的 keys 数组。 | +Array | +— | ++ |
default-sort | +默认的排序列的 prop 和顺序。它的prop 属性指定默认的排序的列,order 指定默认排序的顺序 |
+ Object | +order : ascending, descending |
+ 如果只指定了prop , 没有指定order , 则默认顺序是ascending |
+
tooltip-effect | +tooltip effect 属性 |
+ String | +dark/light | ++ |
show-summary | +是否在表尾显示合计行 | +Boolean | +— | +false | +
sum-text | +合计行第一列的文本 | +String | +— | +合计 | +
summary-method | +自定义的合计计算方法 | +Function({ columns, data }) | +— | +— | +
span-method | +合并行或列的计算方法 | +Function({ row, column, rowIndex, columnIndex }) | +— | +— | +
select-on-indeterminate | +在多选表格中,当仅有部分行被选中时,点击表头的多选框时的行为。若为 true,则选中所有行;若为 false,则取消选择所有行 | +Boolean | +— | +true | +
事件名 | +说明 | +参数 | +
---|---|---|
select | +当用户手动勾选数据行的 Checkbox 时触发的事件 | +selection, row | +
select-all | +当用户手动勾选全选 Checkbox 时触发的事件 | +selection | +
selection-change | +当选择项发生变化时会触发该事件 | +selection | +
cell-mouse-enter | +当单元格 hover 进入时会触发该事件 | +row, column, cell, event | +
cell-mouse-leave | +当单元格 hover 退出时会触发该事件 | +row, column, cell, event | +
cell-click | +当某个单元格被点击时会触发该事件 | +row, column, cell, event | +
cell-dblclick | +当某个单元格被双击击时会触发该事件 | +row, column, cell, event | +
row-click | +当某一行被点击时会触发该事件 | +row, event, column | +
row-contextmenu | +当某一行被鼠标右键点击时会触发该事件 | +row, event | +
row-dblclick | +当某一行被双击时会触发该事件 | +row, event | +
header-click | +当某一列的表头被点击时会触发该事件 | +column, event | +
header-contextmenu | +当某一列的表头被鼠标右键点击时触发该事件 | +column, event | +
sort-change | +当表格的排序条件发生变化的时候会触发该事件 | +{ column, prop, order } | +
filter-change | +当表格的筛选条件发生变化的时候会触发该事件,参数的值是一个对象,对象的 key 是 column 的 columnKey,对应的 value + 为用户选择的筛选条件的数组。 + | +filters | +
current-change | +当表格的当前行发生变化的时候会触发该事件,如果要高亮当前行,请打开表格的 highlight-current-row 属性 | +currentRow, oldCurrentRow | +
header-dragend | +当拖动表头改变了列的宽度的时候会触发该事件 | +newWidth, oldWidth, column, event | +
expand-change | +当用户对某一行展开或者关闭的时候会触发该事件 | +row, expandedRows | +
方法名 | +说明 | +参数 | +
---|---|---|
clearSelection | +用于多选表格,清空用户的选择 | +— | +
toggleRowSelection | +用于多选表格,切换某一行的选中状态,如果使用了第二个参数,则是设置这一行选中与否(selected 为 true 则选中) | +row, selected | +
toggleRowExpansion | +用于可展开表格,切换某一行的展开状态,如果使用了第二个参数,则是设置这一行展开与否(expanded 为 true 则展开) | +row, expanded | +
setCurrentRow | +用于单选表格,设定某一行为选中行,如果调用时不加参数,则会取消目前高亮行的选中状态。 | +row | +
clearSort | +用于清空排序条件,数据会恢复成未排序的状态 | +— | +
clearFilter | +用于清空过滤条件,数据会恢复成未过滤的状态 | +— | +
doLayout | +对 Table 进行重新布局。当 Table 或其祖先元素由隐藏切换为显示时,可能需要调用此方法 | +— | +
sort | +手动对 Table 进行排序。参数prop 属性指定排序列,order 指定排序顺序。 |
+ prop: string, order: string | +
name | +说明 | +
---|---|
append | +插入至表格最后一行之后的内容,如果需要对表格的内容进行无限滚动操作,可能需要用到这个 slot。若表格有合计行,该 slot 会位于合计行之上。 | +
参数 | +说明 | +类型 | +可选值 | +默认值 | +
---|---|---|---|---|
type | +对应列的类型。如果设置了 selection 则显示多选框;如果设置了 index 则显示该行的索引(从 1
+ 开始计算);如果设置了 expand 则显示为一个可展开的按钮
+ |
+ string | +selection/index/expand | +— | +
index | +如果设置了 type=index ,可以通过传递 index 属性来自定义索引 |
+ string, Function(index) | +- | +- | +
column-key | +column 的 key,如果需要使用 filter-change 事件,则需要此属性标识是哪个 column 的筛选条件 | +string | +— | +— | +
label | +显示的标题 | +string | +— | +— | +
prop | +对应列内容的字段名,也可以使用 property 属性 | +string | +— | +— | +
width | +对应列的宽度 | +string | +— | +— | +
min-width | +对应列的最小宽度,与 width 的区别是 width 是固定的,min-width 会把剩余宽度按比例分配给设置了 min-width 的列 | +string | +— | +— | +
fixed | +列是否固定在左侧或者右侧,true 表示固定在左侧 | +string, boolean | +true, left, right | +— | +
render-header | +列标题 Label 区域渲染使用的 Function | +Function(h, { column, $index }) | +— | +— | +
sortable | +对应列是否可以排序,如果设置为 'custom',则代表用户希望远程排序,需要监听 Table 的 sort-change 事件 | +boolean, string | +true, false, 'custom' | +false | +
sort-method | +对数据进行排序的时候使用的方法,仅当 sortable 设置为 true 的时候有效,需返回一个数字,和 Array.sort 表现一致 | +Function(a, b) | +— | +— | +
sort-by | +指定数据按照哪个属性进行排序,仅当 sortable 设置为 true 且没有设置 sort-method 的时候有效。如果 sort-by 为数组,则先按照第 1 + 个属性排序,如果第 1 个相等,再按照第 2 个排序,以此类推 + | +String/Array/Function(row, index) | +— | +— | +
sort-orders | +数据在排序时所使用排序策略的轮转顺序,仅当 sortable 为 true 时有效。需传入一个数组,随着用户点击表头,该列依次按照数组中元素的顺序进行排序 | +array | +数组中的元素需为以下三者之一:ascending 表示升序,descending
+ 表示降序,null 表示还原为原始顺序
+ |
+ ['ascending', 'descending', null] | +
resizable | +对应列是否可以通过拖动改变宽度(需要在 el-table 上设置 border 属性为真) | +boolean | +— | +true | +
formatter | +用来格式化内容 | +Function(row, column, cellValue, index) | +— | +— | +
show-overflow-tooltip | +当内容过长被隐藏时显示 tooltip | +Boolean | +— | +false | +
align | +对齐方式 | +String | +left/center/right | +left | +
header-align | +表头对齐方式,若不设置该项,则使用表格的对齐方式 | +String | +left/center/right | +— | +
class-name | +列的 className | +string | +— | +— | +
label-class-name | +当前列标题的自定义类名 | +string | +— | +— | +
selectable | +仅对 type=selection 的列有效,类型为 Function,Function 的返回值用来决定这一行的 CheckBox 是否可以勾选 | +Function(row, index) | +— | +— | +
reserve-selection | +仅对 type=selection 的列有效,类型为 Boolean,为 true 则会在数据更新之后保留之前选中的数据(需指定
+ row-key )
+ |
+ Boolean | +— | +false | +
filters | +数据过滤的选项,数组格式,数组中的元素需要有 text 和 value 属性。 | +Array[{ text, value }] | +— | +— | +
filter-placement | +过滤弹出框的定位 | +String | +与 Tooltip 的 placement 属性相同 |
+ — | +
filter-multiple | +数据过滤的选项是否多选 | +Boolean | +— | +true | +
filter-method | +数据过滤使用的方法,如果是多选的筛选项,对每一条数据会执行多次,任意一次返回 true 就会显示。 | +Function(value, row, column) | +— | +— | +
filtered-value | +选中的数据过滤项,如果需要自定义表头过滤的渲染方式,可能会需要此属性。 | +Array | +— | +— | +
name | +说明 | +
---|---|
— | +自定义列的内容,参数为 { row, column, $index } | +
+ 设置layout
,表示需要显示的内容,用逗号分隔,布局元素会依次显示。prev
表示上一页,next
为下一页,pager
表示页码列表,除此以外还提供了jumper
和total
,size
和特殊的布局符号->
,->
后的元素会靠右显示,jumper
表示跳页元素,total
表示显示页码总数,size
用于设置每页显示的页码数量。
+
默认情况下,当总页数超过 7 页时,Pagination
+ 会折叠多余的页码按钮。通过pager-count
属性可以设置最大页码按钮数。
设置background
属性可以为分页按钮添加背景色。
+ 只需要一个small
属性,它接受一个Boolean
,默认为false
,设为true
即可启用。
+
+ 此例是一个完整的用例,使用了size-change
和current-change
事件来处理页码大小和当前页变动时候触发的事件。page-sizes
接受一个整型数组,数组元素为展示的选择每页显示个数的选项,[100,
+ 200, 300, 400]
表示四个选项,每页显示 100 个,200 个,300 个或者 400 个。
参数 | +说明 | +类型 | +可选值 | +默认值 | +
---|---|---|---|---|
small | +是否使用小型分页样式 | +Boolean | +— | +false | +
background | +是否为分页按钮添加背景色 | +Boolean | +— | +false | +
page-size | +每页显示条目个数 | +Number | +— | +10 | +
total | +总条目数 | +Number | +— | +— | +
page-count | +总页数,total 和 page-count 设置任意一个就可以达到显示页码的功能;如果要支持 page-sizes 的更改,则需要使用 total 属性 | +Number | +— | +— | +
pager-count | +页码按钮的数量,当总页数超过该值时会折叠 | +Number | +大于等于 5 且小于等于 21 的奇数 | +7 | +
current-page | +当前页数,支持 .sync 修饰符 | +Number | +— | +1 | +
layout | +组件布局,子组件名用逗号分隔 | +String | +sizes , prev , pager , next , jumper ,
+ -> , total , slot |
+ 'prev, pager, next, jumper, ->, total' | +
page-sizes | +每页显示个数选择器的选项设置 | +Number[] | +— | +[10, 20, 30, 40, 50, 100] | +
popper-class | +每页显示个数选择器的下拉框类名 | +string | +— | +— | +
prev-text | +替代图标显示的上一页文字 | +string | +— | +— | +
next-text | +替代图标显示的下一页文字 | +string | +— | +— | +
disabled | +是否禁用 | +boolean | +— | +false | +
事件名称 | +说明 | +回调参数 | +
---|---|---|
size-change | +pageSize 改变时会触发 | +每页条数 | +
current-change | +currentPage 改变时会触发 | +当前页 | +
prev-click | +用户点击上一页按钮改变当前页后触发 | +当前页 | +
next-click | +用户点击下一页按钮改变当前页后触发 | +当前页 | +
name | +说明 | +
---|---|
— | +自定义内容,需要在 layout 中列出 slot |
+
从场景上说,MessageBox 的作用是美化系统自带的 alert
、confirm
和
+ prompt
,因此适合展示较为简单的内容。如果需要弹出较为复杂的内容,请使用 Dialog。
调用$alert
方法即可打开消息提示,它模拟了系统的 alert
,无法通过按下
+ ESC
+ 或点击框外关闭。此例中接收了两个参数,message
和title
。值得一提的是,窗口被关闭后,它默认会返回一个Promise
对象便于进行后续操作的处理。若不确定浏览器是否支持Promise
,可自行引入第三方
+ polyfill 或像本例一样使用回调进行后续处理。
调用$confirm
方法即可打开消息提示,它模拟了系统的
+ confirm
。Message Box
+ 组件也拥有极高的定制性,我们可以传入options
作为第三个参数,它是一个字面量对象。type
字段表明消息类型,可以为success
,error
,info
和warning
,无效的设置将会被忽略。注意,第二个参数title
必须定义为String
类型,如果是Object
,会被理解为options
。在这里我们用了
+ Promise 来处理后续响应。
调用$prompt
方法即可打开消息提示,它模拟了系统的 prompt
。可以用inputPattern
字段自己规定匹配模式,或者用inputValidator
规定校验函数,可以返回Boolean
或String
,返回false
或字符串时均表示校验未通过,同时返回的字符串相当于定义了inputErrorMessage
字段。此外,可以用inputPlaceholder
字段来定义输入框的占位符。
+
+ 以上三个方法都是对$msgbox
方法的再包装。本例直接调用$msgbox
方法,使用了showCancelButton
字段,用于显示取消按钮。另外可使用cancelButtonClass
为其添加自定义样式,使用cancelButtonText
来自定义按钮文本(Confirm
+ 按钮也具有相同的字段,在文末的字段说明中有完整的字段列表)。此例还使用了beforeClose
属性,它的值是一个方法,会在
+ MessageBox 的实例关闭前被调用,同时暂停实例的关闭。它有三个参数:action
、实例本身和done
方法。使用它能够在关闭前对实例进行一些操作,比如为确定按钮添加loading
状态等;此时若需要关闭实例,可以调用done
方法(若在beforeClose
中没有调用done
,则实例不会关闭)。
+
弹出层的内容可以是 VNode
,所以我们能把一些自定义组件传入其中。每次弹出层打开后,Vue 会对新老
+ VNode
节点进行比对,然后将根据比较结果进行最小单位地修改视图。这也许会造成弹出层内容区域的组件没有重新渲染,例如 #8931。当这类问题出现时,解决方案是给
+ VNode
加上一个不相同的 key,参考这里。
+
将dangerouslyUseHTMLString
属性设置为 true,message
+ 就会被当作 HTML 片段处理。
message
属性虽然支持传入 HTML 片段,但是在网站上动态渲染任意 HTML 是非常危险的,因为容易导致 XSS 攻击。因此在
+ dangerouslyUseHTMLString
+ 打开的情况下,请确保 message
的内容是可信的,永远不要将用户提交的内容赋值给
+ message
属性。
默认情况下,当用户触发取消(点击取消按钮)和触发关闭(点击关闭按钮或遮罩层、按下 ESC 键)时,Promise 的
+ reject 回调和callback
回调的参数均为
+ 'cancel'。如果将distinguishCancelAndClose
属性设置为 true,则上述两种行为的参数分别为 'cancel'
+ 和 'close'。
将 center
设置为 true
即可开启居中布局
如果你完整引入了 Element,它会为 Vue.prototype 添加如下全局方法:$msgbox, $alert, $confirm 和 $prompt。因此在 Vue
+ instance 中可以采用本页面中的方式调用 MessageBox
。调用参数为:
$msgbox(options)
$alert(message, title, options)
或 $alert(message, options)
+ $confirm(message, title, options)
或 $confirm(message, options)
+ $prompt(message, title, options)
或 $prompt(message, options)
+ 参数 | +说明 | +类型 | +可选值 | +默认值 | +
---|---|---|---|---|
title | +MessageBox 标题 | +string | +— | +— | +
message | +MessageBox 消息正文内容 | +string / VNode | +— | +— | +
dangerouslyUseHTMLString | +是否将 message 属性作为 HTML 片段处理 | +boolean | +— | +false | +
type | +消息类型,用于显示图标 | +string | +success / info / warning / error | +— | +
iconClass | +自定义图标的类名,会覆盖 type |
+ string | +— | +— | +
customClass | +MessageBox 的自定义类名 | +string | +— | +— | +
callback | +若不使用 Promise,可以使用此参数指定 MessageBox 关闭后的回调 | +function(action, instance),action 的值为'confirm', 'cancel'或'close', instance 为 + MessageBox 实例,可以通过它访问实例上的属性和方法 + | +— | +— | +
showClose | +MessageBox 是否显示右上角关闭按钮 | +boolean | +— | +true | +
beforeClose | +MessageBox 关闭前的回调,会暂停实例的关闭 | +function(action, instance, done),action 的值为'confirm', 'cancel'或'close';instance 为 + MessageBox 实例,可以通过它访问实例上的属性和方法;done 用于关闭 MessageBox 实例 + | +— | +— | +
distinguishCancelAndClose | +是否将取消(点击取消按钮)与关闭(点击关闭按钮或遮罩层、按下 ESC 键)进行区分 | +boolean | +— | +false | +
lockScroll | +是否在 MessageBox 出现时将 body 滚动锁定 | +boolean | +— | +true | +
showCancelButton | +是否显示取消按钮 | +boolean | +— | +false(以 confirm 和 prompt 方式调用时为 true) | +
showConfirmButton | +是否显示确定按钮 | +boolean | +— | +true | +
cancelButtonText | +取消按钮的文本内容 | +string | +— | +取消 | +
confirmButtonText | +确定按钮的文本内容 | +string | +— | +确定 | +
cancelButtonClass | +取消按钮的自定义类名 | +string | +— | +— | +
confirmButtonClass | +确定按钮的自定义类名 | +string | +— | +— | +
closeOnClickModal | +是否可通过点击遮罩关闭 MessageBox | +boolean | +— | +true(以 alert 方式调用时为 false) | +
closeOnPressEscape | +是否可通过按下 ESC 键关闭 MessageBox | +boolean | +— | +true(以 alert 方式调用时为 false) | +
closeOnHashChange | +是否在 hashchange 时关闭 MessageBox | +boolean | +— | +true | +
showInput | +是否显示输入框 | +boolean | +— | +false(以 prompt 方式调用时为 true) | +
inputPlaceholder | +输入框的占位符 | +string | +— | +— | +
inputType | +输入框的类型 | +string | +— | +text | +
inputValue | +输入框的初始文本 | +string | +— | +— | +
inputPattern | +输入框的校验表达式 | +regexp | +— | +— | +
inputValidator | +输入框的校验函数。可以返回布尔值或字符串,若返回一个字符串, 则返回结果会被赋值给 inputErrorMessage | +function | +— | +— | +
inputErrorMessage | +校验未通过时的提示文本 | +string | +— | +输入的数据不合法! | +
center | +是否居中布局 | +boolean | +— | +false | +
roundButton | +是否使用圆角按钮 | +boolean | +— | +false | +
使用content
属性来决定hover
时的提示信息。由placement
属性决定展示效果:placement
属性值为:方向-对齐位置
;四个方向:top
、left
、right
、bottom
;三种对齐位置:start
,
+ end
,默认为空。如placement="left-end"
,则提示信息出现在目标元素的左侧,且提示信息的底部与目标元素的底部对齐。
+
通过设置effect
属性来改变主题,默认为dark
。
用具名 slot
+ 分发content
,替代tooltip
中的content
属性。
除了这些基本设置外,还有一些属性可以让使用者更好的定制自己的效果:
+ +transition
属性可以定制显隐的动画效果,默认为fade-in-linear
。
+ 如果需要关闭 tooltip
功能,disabled
+ 属性可以满足这个需求,它接受一个Boolean
,设置为true
即可。
事实上,这是基于 Vue-popper + 的扩展,你可以自定义任意 Vue-popper 中允许定义的字段。 + 当然 Tooltip 组件实际上十分强大,文末的API文档会做一一说明。
+tooltip 内不支持 router-link
组件,请使用 vm.$router.push
+ 代替。
tooltip 内不支持 disabled form 元素,参考MDN,请在 + disabled form 元素外层添加一层包裹元素。
参数 | +说明 | +类型 | +可选值 | +默认值 | +
---|---|---|---|---|
effect | +默认提供的主题 | +String | +dark/light | +dark | +
content | +显示的内容,也可以通过 slot#content 传入 DOM |
+ String | +— | +— | +
placement | +Tooltip 的出现位置 | +String | ++ top/top-start/top-end/bottom/bottom-start/bottom-end/left/left-start/left-end/right/right-start/right-end + | +bottom | +
value(v-model) | +状态是否可见 | +Boolean | +— | +false | +
disabled | +Tooltip 是否可用 | +Boolean | +— | +false | +
offset | +出现位置的偏移量 | +Number | +— | +0 | +
transition | +定义渐变动画 | +String | +— | +el-fade-in-linear | +
visible-arrow | +是否显示 Tooltip 箭头,更多参数可见Vue-popper + | +Boolean | +— | +true | +
popper-options | +popper.js 的参数 | +Object | +参考 popper.js 文档 | +{ boundariesElement: 'body', gpuAcceleration: false } | +
open-delay | +延迟出现,单位毫秒 | +Number | +— | +0 | +
manual | +手动控制模式,设置为 true 后,mouseenter 和 mouseleave 事件将不会生效 | +Boolean | +— | +false | +
popper-class | +为 Tooltip 的 popper 添加类名 | +String | +— | +— | +
enterable | +鼠标是否可进入到 tooltip 中 | +Boolean | +— | +true | +
hide-after | +Tooltip 出现后自动隐藏延时,单位毫秒,为 0 则不会自动隐藏 | +number | +— | +0 | +
trigger
属性用于设置何时触发
+ Popover,支持四种触发方式:hover
,click
,focus
和 manual
。对于触发
+ Popover 的元素,有两种写法:使用 slot="reference"
+ 的具名插槽,或使用自定义指令v-popover
指向 Popover 的索引ref
。
这是一段内容这是一段内容确定删除吗?
+ +参数 | +说明 | +类型 | +可选值 | +默认值 | +
---|---|---|---|---|
trigger | +触发方式 | +String | +click/focus/hover/manual | +click | +
title | +标题 | +String | +— | +— | +
content | +显示的内容,也可以通过 slot 传入 DOM |
+ String | +— | +— | +
width | +宽度 | +String, Number | +— | +最小宽度 150px | +
placement | +出现位置 | +String | ++ top/top-start/top-end/bottom/bottom-start/bottom-end/left/left-start/left-end/right/right-start/right-end + | +bottom | +
disabled | +Popover 是否可用 | +Boolean | +— | +false | +
value(v-model) | +状态是否可见 | +Boolean | +— | +false | +
offset | +出现位置的偏移量 | +Number | +— | +0 | +
transition | +定义渐变动画 | +String | +— | +fade-in-linear | +
visible-arrow | +是否显示 Tooltip 箭头,更多参数可见Vue-popper + | +Boolean | +— | +true | +
popper-options | +popper.js 的参数 | +Object | +参考 popper.js 文档 | +{ boundariesElement: 'body', gpuAcceleration: false } |
+
popper-class | +为 popper 添加类名 | +String | +— | +— | +
open-delay | +触发方式为 hover 时的显示延迟,单位为毫秒 | +Number | +— | +— | +
参数 | +说明 | +
---|---|
— | +Popover 内嵌 HTML 文本 | +
reference | +触发 Popover 显示的 HTML 元素 | +
事件名称 | +说明 | +回调参数 | +
---|---|---|
show | +显示时触发 | +— | +
after-enter | +显示动画播放完毕后触发 | +— | +
hide | +隐藏时触发 | +— | +
after-leave | +隐藏动画播放完毕后触发 | +— | +
+ ajax.example({}).then(function (response) {
+ if (response.errors.length > 0) {
+ nav.e(response.errors[0].message);
+ } else {
+ nav.i("Ajax调用成功!");
+ }
+ })
+
+
+
+
+
+
+
+ showMsg:function(){
+ nav.i('消息')
+ },
+ showErr:function(){
+ nav.e('错误')
+ },
+ showWarn:function(){
+ nav.w('警告')
+ },
+ showSuccess:function(){
+ nav.w('成功')
+ }
+
+
+