{"_id":"@a4901618700/ccutils","name":"@a4901618700/ccutils","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"@a4901618700/ccutils","version":"0.0.1","author":{"name":"zlg"},"homepage":"https://gitee.com/zhuligang/ccutils.git","main":"./dist/index.js","license":"ISC","dependencies":{"axios":"^0.26.1","compressorjs":"^1.1.1","crypto-js":"^4.1.1","dayjs":"^1.11.0","gm-crypto":"^0.1.12","lodash":"^4.17.21","qs":"^6.10.3","sm-crypto":"^0.3.13"},"devDependencies":{"@rollup/plugin-strip":"^2.1.0","@types/crypto-js":"^4.1.1","@types/jest":"^29.5.12","@types/lodash":"^4.14.182","@types/node":"^16.11.14","@types/qs":"^6.9.7","@types/sm-crypto":"^0.3.4","grunt":"^1.4.1","grunt-contrib-clean":"^2.0.0","grunt-contrib-concat":"^2.0.0","grunt-contrib-copy":"^1.0.0","grunt-contrib-uglify":"^5.0.1","grunt-ts":"^6.0.0-beta.22","load-grunt-tasks":"^5.1.0","typescript":"^4.5.2"},"publishConfig":{"registry":"https://registry.npmjs.org/","access":"public"},"types":"./dist/index.d.ts","scripts":{"lint":"eslint --ext .js,.jsx,.vue,.less,.ts,.tsx src","build":"grunt build","pro":"node publish.js"},"_id":"@a4901618700/ccutils@0.0.1","description":"Web 前端公共组件库","_integrity":"sha512-AG0wEuAmPe18eS9QAASBGTwUYktENp33rsfMFM2syTZsBlplOVyPPTgOksecQ15+2Kh5O6zGGv3A1RXZHvSj/Q==","_resolved":"C:\\Users\\16585\\AppData\\Local\\Temp\\5b0cb2eeda922698db2fc28fade3ea23\\a4901618700-ccutils-0.0.1.tgz","_from":"file:a4901618700-ccutils-0.0.1.tgz","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-AG0wEuAmPe18eS9QAASBGTwUYktENp33rsfMFM2syTZsBlplOVyPPTgOksecQ15+2Kh5O6zGGv3A1RXZHvSj/Q==","shasum":"853ae545c4dc4b6e04c16085a1d46fae8d2137dc","tarball":"https://registry.npmjs.org/@a4901618700/ccutils/-/ccutils-0.0.1.tgz","fileCount":92,"unpackedSize":141494,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIE4t+xPe1fAahRUHEul3rWGsa2efHmJkLxPmi4Kg4OmMAiEA+HPyYxZ/tYcmketxgGelc5NmPpzjgz4kqWdRvN0bsCg="}]},"_npmUser":{"name":"a4901618700","email":"1975921431@qq.com"},"directories":{},"maintainers":[{"name":"a4901618700","email":"1975921431@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ccutils_0.0.1_1788669626919_0.3193622342611695"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-06T04:40:26.813Z","0.0.1":"2026-09-06T04:40:27.029Z","modified":"2026-09-06T04:40:27.218Z"},"maintainers":[{"name":"a4901618700","email":"1975921431@qq.com"}],"description":"Web 前端公共组件库","homepage":"https://gitee.com/zhuligang/ccutils.git","author":{"name":"zlg"},"license":"ISC","readme":"# Web 前端公共组件库\r\n\r\nWeb 前端公共组件库\r\n\r\n**Table of Contents**\r\n\r\n- [私有仓发布&使用方法](#私有仓发布使用方法)\r\n  - [使用](#使用)\r\n  - [发布](#发布)\r\n- [Utils](#utils)\r\n  - [ConvertUtil](#convertutil)\r\n    - [strToHexCharCode](#strtohexcharcode)\r\n    - [hexCharCodeToStr](#hexcharcodetostr)\r\n  - [DateUtil](#dateutil)\r\n    - [init](#init)\r\n    - [durationFormat](#durationFormat)\r\n    - [format](#format)\r\n    - [unix](#unix)\r\n    - [unixMillSeconds](#unixMillSeconds)\r\n    - [add](#add)\r\n    - [subtract](#subtract)\r\n    - [timeAgo](#timeAgo)\r\n  - [RegexUtil](#regexutil)\r\n    - [lengthMatch](#lengthMatch)\r\n    - [pwdMatch](#pwdMatch)\r\n    - [isMobile](#isMobile)\r\n    - [isTEL](#isTEL)\r\n    - [isIDCard18](#isIDCard18)\r\n    - [isIDCard18Exact](#isIDCard18Exact)\r\n    - [isEmail](#isEmail)\r\n    - [isURL](#isURL)\r\n    - [isDate](#isDate)\r\n    - [isChinese](#isChinese)\r\n    - [isInteger](#isInteger)\r\n    - [isIP](#isIP)\r\n\r\n  - [FileUtil](#fileutil)\r\n    - [base64ToBlob](#base64toblob)\r\n    - [fileToBase64](#filetobase64)\r\n    - [blobToFile](#blobtofile)\r\n  - [ImageUtil](#imageutil)\r\n    - [compress](#compress)\r\n\r\n  - [SzdWxH5Util](#SzdWxH5Util)\r\n    - [setEnv](#setEnv)\r\n    - [preLogin](#preLogin)\r\n    - [getCode](#getCode)\r\n\r\n- [网络请求（CCNetworking）](#网络请求ccnetworking)\r\n  - [使用方法](#使用方法)\r\n  - [参数详解](#参数详解)\r\n\r\n### 私有仓发布&使用方法\r\n\r\n#### 使用\r\n\r\n1. npm config set @cici:registry=https://verdaccio.chinacici.com -g\r\n2. npm install @cici/ccutils\r\n\r\n#### 发布\r\n\r\n1. 发布： yarn pro\r\n2. 撤销发布： yarn unpublish\r\n\r\n### Utils\r\n\r\n#### ConvertUtil\r\n\r\n##### strToHexCharCode\r\n\r\n```\r\n/**\r\n * 字符串转十六进制-中文兼容\r\n |param str 原始字符串\r\n |returns\r\n */\r\nfunction strToHexCharCode(str: string)\r\n```\r\n\r\n##### hexCharCodeToStr\r\n\r\n```\r\n/**\r\n * 十六进制转原始字符串-中文兼容\r\n |param hexCharCodeStr 十六进制字符串\r\n |returns\r\n */\r\nfunction hexCharCodeToStr(hexCharCodeStr: string)\r\n```\r\n\r\n#### DateUtil\r\n\r\n> 时间日期处理工具类，注意使用方法，必须先调用方法：DateUtil.init(date?, format?)，来创建 CCDate 的实例\r\n> <br/>\r\n> 示例如下：\r\n\r\n```\r\nDateUtil.init('2022/03/21 13:24:11')\r\n  .add(10, 'day')\r\n  .subtract(1, 'month')\r\n  .format('YYYY-MM-DD HH:mm:ss')\r\n```\r\n\r\n所有可用解析标记的列表\r\n\r\n| 标识 |  示例   |        描述        |\r\n| :--: | :-----: | :----------------: |\r\n|  YY  |   18    |     年，两位数     |\r\n| YYYY |  2018   |     年，四位数     |\r\n|  M   |  1-12   |   月，从 1 开始    |\r\n|  MM  |  01-12  |    月，两位数字    |\r\n| MMM  | Jan-Dec |    月，英文缩写    |\r\n|  D   |  1-31   |         日         |\r\n|  DD  |  01-31  |     日，两位数     |\r\n|  H   |  0-23   |      24 小时       |\r\n|  HH  |  00-23  |  24 小时，两位数   |\r\n|  h   |  1-12   |      12 小时       |\r\n|  hh  |  01-12  |  12 小时，两位数   |\r\n|  m   |  0-59   |        分钟        |\r\n|  mm  |  00-59  |    分钟，两位数    |\r\n|  s   |  0-59   |         秒         |\r\n|  ss  |  00-59  |     秒，两位数     |\r\n|  S   |   0-9   | 毫秒（百），一位数 |\r\n|  SS  |  00-99  | 毫秒（十），两位数 |\r\n| SSS  | 000-999 |    毫秒，三位数    |\r\n\r\n##### init\r\n\r\n```\r\n/**\r\n * 初始化时间对象，返回CCDate实例\r\n |param date 时间参数，可以是时间字符串 | 时间戳(number,默认秒，毫秒：format='S') | Date对象，为null|undefined时，返回当前时间对象\r\n |param format 时间字符串格式化参数，当date是特殊的时间字符串时，必填\r\n |returns CCDate实例\r\n */\r\n function init(date?: DateConfig, format?: string): CCDate\r\n```\r\n\r\n##### durationFormat\r\n\r\n```\r\n/**\r\n * 时长格式化\r\n * @param duration 时长（秒）\r\n * @param format 格式化字符串，同init的format\r\n * @param hiddenIfZero 值为0时，隐藏该项 default = true\r\n * @returns\r\n */\r\nfunction durationFormat(duration: number, format?: string, hiddenIfZero = true): string\r\n```\r\n\r\n##### format\r\n\r\n```\r\n  /**\r\n   * 格式化时间字符串\r\n   * @param timestamp\r\n   * @param format\r\n   * @returns 格式化后的字符串\r\n   */\r\nfunction format(format?: string): string\r\n```\r\n\r\n##### unix\r\n\r\n```\r\n  /**\r\n   * Unix时间戳（秒）\r\n   * @returns number\r\n   */\r\nfunction unix(): number\r\n```\r\n\r\n##### unixMillSeconds\r\n\r\n```\r\n  /**\r\n   * Unix时间戳（毫秒）\r\n   * @returns number\r\n   */\r\nfunction unixMillSeconds(): number\r\n```\r\n\r\n##### add\r\n\r\n```\r\n  /**\r\n   * 加上\r\n   * @param value 值\r\n   * @param unit 单位\r\n   * @returns 当前CCDate对象\r\n   */\r\nfunction add(value: number, unit: OprateUnit): CCDate\r\n```\r\n\r\n##### subtract\r\n\r\n```\r\n  /**\r\n   * 减去\r\n   * @param value 值\r\n   * @param unit 单位\r\n   * @returns 当前CCDate对象\r\n   */\r\nfunction subtract(value: number, unit: OprateUnit): CCDate\r\n```\r\n\r\n##### timeAgo\r\n\r\n```\r\n  /**\r\n   * 计算距离当前时间的字符串，如：3秒前\r\n   * @returns string\r\n   */\r\nfunction timeAgo(): string\r\n```\r\n\r\n#### RegexUtil\r\n\r\n##### lengthMatch\r\n```\r\n\r\n/**\r\n * 字符长度校验\r\n * @param input 输入值\r\n * @param min 最小长度，default = 0\r\n * @param max 最大长度，default = Infinity\r\n * @returns\r\n */\r\nconst lengthMatch = (input: string, min = 0, max = Infinity): boolean\r\n```\r\n\r\n##### pwdMatch\r\n```\r\n\r\n/**\r\n * 密码规则校验，其中包含数字、大写字母和小写字母\r\n * @param input\r\n * @param length 密码长度\r\n * @returns\r\n */\r\nconst pwdMatch = (input: string, length = 8): boolean \r\n```\r\n\r\n##### isMobile\r\n```\r\n\r\n/**\r\n * 是否是手机号\r\n * @param {string} input\r\n * @returns {boolean}\r\n */\r\nconst isMobile = (input: string): boolean \r\n```\r\n\r\n##### isTEL\r\n```\r\n\r\n/**\r\n * 是否是固定电话\r\n * @param input\r\n * @returns\r\n */\r\nconst isTEL = (input: string): boolean\r\n```\r\n\r\n##### isIDCard18\r\n```\r\n\r\n/**\r\n * 是否是18位身份证号\r\n * @param input\r\n * @returns\r\n */\r\nconst isIDCard18 = (input: string): boolean\r\n```\r\n\r\n##### isIDCard18Exact\r\n```\r\n\r\n/**\r\n * 是否与长度为18的身份证规则匹配\r\n * @param input\r\n * @returns\r\n */\r\nconst isIDCard18Exact = (input: string): boolean\r\n```\r\n\r\n##### isEmail\r\n```\r\n\r\n/**\r\n * 是否是email\r\n * @param input\r\n * @returns\r\n */\r\nconst isEmail = (input: string): boolean\r\n```\r\n\r\n##### isURL\r\n```\r\n\r\n/**\r\n * 是否是URL\r\n * @param input\r\n * @returns\r\n */\r\nconst isURL = (input: string): boolean\r\n```\r\n\r\n##### isDate\r\n```\r\n\r\n/**\r\n * 是否匹配日期的正则表达式，模式为“yyyy-MM-dd”\r\n * @param input\r\n * @returns\r\n */\r\nconst isDate = (input: string): boolean\r\n```\r\n\r\n##### isChinese\r\n```\r\n\r\n/**\r\n * 是否是中文字符\r\n * @param input\r\n * @returns\r\n */\r\nconst isChinese = (input: string): boolean\r\n```\r\n\r\n##### isInteger\r\n```\r\n\r\n/**\r\n * 是否是数字\r\n * @param input\r\n * @returns\r\n */\r\nconst isInteger = (input: string): boolean\r\n```\r\n\r\n##### isIP\r\n```\r\n\r\n/**\r\n * 是否是IP地址\r\n * @param input\r\n * @returns\r\n */\r\nconst isIP = (input: string): boolean\r\n```\r\n\r\n\r\n\r\n#### FileUtil\r\n\r\n##### base64ToBlob\r\n\r\n```\r\n/**\r\n * Base64转Blob\r\n |param {string} base64Data base64数据，需要带上前缀，如：“data:image/png;base64,”，没有前缀，默认png\r\n */\r\nfunction base64ToBlob(base64Data: string)\r\n```\r\n\r\n##### fileToBase64\r\n\r\n```\r\n/**\r\n * file对象转base64\r\n |param {Object} file 文件对象\r\n */\r\nfunction fileToBase64(file: Blob)\r\n```\r\n\r\n##### blobToFile\r\n\r\n```\r\n/**\r\n * 将blob转换为file\r\n |param {string} theBlob blob对象\r\n |param {string} fileName 文件名称\r\n |param {string} fileType 文件类型 默认image/png\r\n |returns file对象\r\n */\r\nexport function blobToFile(theBlob: BlobPart, fileName: string, fileType: string)\r\n```\r\n\r\n#### ImageUtil\r\n\r\n##### compress\r\n\r\n```\r\n/**\r\n * 图片压缩方法\r\n |param image 待压缩的图片 File | Blob\r\n |param options {\r\n *     quality [optional] 压缩质量 取值范围：0~1，默认0.8，建议0.6 | 0.8\r\n *     checkOrientation [optional] 是否读取图像的Exif方向值（仅限JPEG图像），然后使用该值自动旋转或翻转图像。\r\n *     success [required] 图片压缩成功，回调方法\r\n *     error   [required] 图片压缩失败，回调方法\r\n * }\r\n |return Compressor对象，可以终止  compressor.abort();\r\n *\r\n */\r\nfunction compress(image: File | Blob, options: CompressorOptions) : Compressor\r\n```\r\n\r\n#### SzdWxH5Util\r\n\r\n##### setEnv\r\n\r\n```\r\n/**\r\n * 设置环境变量 默认正式环境，如需调试测试环境，需要在调用其它方法前，先设置环境变量\r\n * @param env 'test' | 'prod'\r\n*/\r\nfunction setEnv(env: 'test'|'prod'|string)\r\n```\r\n\r\n##### preLogin\r\n\r\n> 判断是否在微信H5环境中，如果是，需要在程序入口页先做预登录操作。\r\n\r\n```\r\n/**\r\n * @param appId 苏周到应用的id\r\n * @param redirect_uri 授权后重定向的回调链接地址，重定向后会在链接中返回code参数\r\n * @example await preLogin('sdfsdfsdf', 'wx03d0a3sdfsdfsdf', location.href)\r\n * @description 微信代理用户授权登录，除了跳微信预授权，其它情况都返回 true。\r\n */\r\nasync function preLogin(appId: string, redirect_uri: string)\r\n```\r\n\r\n调用示例\r\n\r\n```\r\nasync main(){\r\n  let preLoginResult = true\r\n  if (window.SZDApi.config.platform == window.SZDPlatforms.WechatH5 && !tokenUtils.getToken()) {\r\n    preLoginResult = await SzdWxH5Util.preLogin('SZD_APP_ID', 'WX_APP_ID', location.href)\r\n  }\r\n  // 防止页面预加载，预登录成功后才挂载页面\r\n  if (preLoginResult) {\r\n    new Vue({\r\n      store,\r\n      router,\r\n      render: (h) => h(App)\r\n    }).$mount('#app')\r\n  }\r\n}\r\n```\r\n\r\n##### getCode\r\n\r\n```\r\n/**\r\n * 获取苏周到code码\r\n * param cb func 回调函数\r\n */\r\nfunction getCode(cb = (val: CodeResultData) => {})\r\n```\r\n\r\n调用示例\r\n\r\n```\r\nif (window.SZDApi.config.platform == window.SZDPlatforms.WechatH5) {\r\n  SzdWxH5Util.getCode((val) => {\r\n\r\n  })\r\n}\r\n```\r\n\r\n### 网络请求（CCNetworking）\r\n\r\n#### 使用方法\r\n\r\n1. 新建 NewsService.ts 文件\r\n2. 创建 CCNetworking 的实例\r\n\r\n```TypeScript\r\nconst newsNetworking = new CCNetworking({\r\n  tokenConfig: {\r\n    use: true,\r\n    expireCode: 20002,\r\n    refreshToken: () => {\r\n      return NewsService.refreshToken()\r\n        .then((response: Resp<AnyModel>) => {\r\n          localStorage.setItem('auth', response.data?.auth);\r\n          return response;\r\n        })\r\n        .catch((error: Error) => {\r\n          return error;\r\n        });\r\n    },\r\n    invalidCode: 20020,\r\n    toLogin:()=>{\r\n      return new Promise(()=>{\r\n        return new Resp()\r\n      })\r\n    }\r\n  },\r\n  interceptors: [ ],\r\n});\r\n```\r\n\r\n3. 封装资讯详情接口\r\n\r\n```TypeScript\r\nexport class NewsService{\r\n  /**\r\n   * 获取资讯列表\r\n   |returns\r\n   */\r\n    static getNewsList() {\r\n        return newsNetworking.get(\r\n            new RespListData<News>(News),\r\n            'news/list');\r\n    }\r\n  /**\r\n   * 获取资讯详情\r\n   |param id 资讯id\r\n   |returns\r\n   */\r\n    static getNewsDetail(id: number) {\r\n        return newsNetworking.get(\r\n        NewsDetail,\r\n        \"news/detail\",\r\n        { id: id},\r\n        );\r\n    }\r\n}\r\n```\r\n\r\n4. 调用示例\r\n\r\n```TypeScript\r\n//获取列表示例\r\nNewsService.getNewsList().then((resp: Resp<RespListData<News>>) => {\r\n    console.log(resp.data?.items)\r\n})\r\n.catch((error) => {\r\n    console.error('获取列表失败--', error);\r\n})\r\n\r\n//获取详情示例\r\nNewsService.getNewsDetail(123).then((resp: Resp<NewsDetail>) => {\r\n    console.log(resp.data)\r\n})\r\n.catch((error) => {\r\n    console.error('获取详情失败--', error);\r\n})\r\n```\r\n\r\n5. CCNetworking 的入参说明\r\n\r\n```TypeScript\r\n  /**\r\n   * get|post|put|delete 网络请求,入参都是一样的\r\n   |param respData 返回JSON对象类型或对象(目前只有RespListData需要传对象)\r\n   |param url 请求地址\r\n   |param params 请求参数，Query & Body参数兼容\r\n   |param config 请求配置，不能包含data|params，参数请放在第三个参数params中，\r\n   *               具体配置可参考axios的配置项\r\n   |returns\r\n   */\r\n  get|post|put|delete<T extends CCModel>(\r\n    respData: T | (new () => T),\r\n    url: string,\r\n    params?: any,\r\n    config?: CCRequestConfig,\r\n  ): Promise<Resp<T>> {\r\n    return this.request('GET'|'POST'|'PUT'|'DELETE', respData, url, params, config);\r\n  }\r\n```\r\n\r\n#### 参数详解\r\n\r\n- CCNetworkingConfig—网络请求配置项\r\n\r\n```TypeScript\r\n/**\r\n * CCNetworking所有的网络请求配置项\r\n */\r\nexport type CCNetworkingConfig = {\r\n  /**\r\n   * Token拦截器配置项\r\n   */\r\n  tokenConfig?: CCTokenConfig;\r\n  /**\r\n   * 自定义拦截器的数组，拦截器按数组顺序执行\r\n   */\r\n  interceptors?: CCInterceptor[];\r\n};\r\n```\r\n\r\n- CCTokenConfig—Token 拦截器配置项\r\n\r\n```TypeScript\r\n/**\r\n * Token拦截器配置项，自动实现刷新Token，重新登录的逻辑\r\n */\r\nexport type CCTokenConfig = {\r\n  /**\r\n   * 是否启用token拦截器\r\n   * 使用token拦截器时，必须配置：expireCode/toLogin/invalidCode/refreshToken\r\n   */\r\n  use: boolean;\r\n  /**\r\n   * 过期，重新刷新token的Code\r\n   */\r\n  expireCode?: number;\r\n  refreshToken?: () => Promise<any>;\r\n  /**\r\n   * 失效，退出登录的Code\r\n   */\r\n  invalidCode?: number;\r\n  toLogin?: () => Promise<Resp>;\r\n};\r\n```\r\n\r\n- CCInterceptor—自定义拦截器类型\r\n\r\n```TypeScript\r\n/**\r\n * 自定义拦截器类型\r\n */\r\nexport type CCInterceptor = {\r\n  /**\r\n   * 请求拦截器\r\n   */\r\n  requestInterceptor?: (\r\n    config: CCRequestConfig,\r\n  ) => CCRequestConfig | Promise<CCRequestConfig>;\r\n  /**\r\n   * 请求成功拦截器\r\n   */\r\n  responseOnFulfilled?: (\r\n    response: CCResponse<Resp>,\r\n  ) => CCResponse<Resp> | Promise<CCResponse<Resp>>;\r\n  /**\r\n   * 请求失败拦截器\r\n   */\r\n  responseOnRejected?: (error: any) => any;\r\n};\r\n```\r\n","readmeFilename":"README.md","_rev":"1-4e60a16851fe0f79a1370e8facd83279"}