# vue2-ssr-template



### 常用正则表达式

#### 表单验证

```
/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/   // 邮箱
/^1[3-9]\d{9}$/                                  // 中国大陆手机号
const ID_REGEX = {
  mainland: /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}(\d|X|x)$/, // 大陆身份证
  hongkong: /^[A-Z]{1,2}\d{6}\([0-9A]\)$/, // 香港身份证
  macau: /^[157]\/\d{6}\(\d\)$/, // 澳门身份证
  taiwan: /^[A-Z][0-9]{9}$/ // 台湾身份证
};
/^[a-zA-Z0-9]{6,20}$/                 // 6-20位数字或字母
/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{6,20}$/ // 6-20位字母+数字组合
```



#### 数字相关

```
/^\d+$/                // 纯数字（整数）
/^-?\d+$/               // 整数（含负数）
/^\d+(\.\d+)?$/         // 正数（整数 + 小数）
/^-?\d+(\.\d+)?$/       // 数字（整数 + 小数 + 负数）
```



#### 字母 & 字符串

```
/^[a-zA-Z]+$/           // 纯英文
/^[A-Z]+$/              // 全大写
/^[a-z]+$/              // 全小写
/^[a-zA-Z0-9]+$/        // 英文 + 数字
/^[\u4e00-\u9fa5]+$/    // 纯中文
```



#### 其它

```
/^\s+|\s+$/g                            // 去除首尾空格（配合 .replace 使用）
/[\u4e00-\u9fa5]/                       // 匹配中文字符
/^(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)){3}$/  // IPv4
```



### 常用工具函数 

#### 数字 & 字符串

```
export const clamp = (n, min, max) => Math.min(max, Math.max(min, n));  //将数值限制在 [min, max] 区间内
export const pad = (n, len = 2) => String(n).padStart(len, '0');      //左侧补0
export const capitalize = (s) => (isStr(s) && s ? s.charAt(0).toUpperCase() + s.slice(1) : '');  //单词首字母大写
```



#### 时间格式化

```
/**
 * 按模板格式化日期（YYYY-MM-DD HH:mm:ss）
 * @param {Date|number|string} [date=new Date()]
 * @param {string} [fmt='YYYY-MM-DD HH:mm:ss']
 * @returns {string}
 */
export const formatDate = (date = new Date(), fmt = 'YYYY-MM-DD HH:mm:ss') => {
  const d = date instanceof Date ? date : new Date(date);
  const rep = {
    YYYY: d.getFullYear(),
    MM: pad(d.getMonth() + 1),
    DD: pad(d.getDate()),
    HH: pad(d.getHours()),
    mm: pad(d.getMinutes()),
    ss: pad(d.getSeconds()),
  };
  return fmt.replace(/YYYY|MM|DD|HH|mm|ss/g, (k) => String(rep[k]));
};
```



#### 复制文本到剪贴板

```
/**
 * 复制文本到剪贴板（非安全上下文降级方案）
 * @param {string} text
 * @returns {Promise<void>|void}
 */
export const copyText = (text) => {
  if (typeof navigator !== 'undefined' && navigator.clipboard && window.isSecureContext) {
    return navigator.clipboard.writeText(text);
  }
  const ta = document.createElement('textarea');
  ta.value = text;
  ta.style.position = 'fixed';
  ta.style.opacity = '0';
  document.body.appendChild(ta);
  ta.select();
  document.execCommand('copy');
  ta.remove();
};
```



#### 
