logo 范 · 拾光录
网址收集 关于作者 Github Gitee
杂文随笔5
Hexo博客:基础使用Hexo博客:Next主题Hexo博客:Next进阶使用Hexo博客:Next高级配置基于Node的WIKI管理
前端知识16
HTML常用知识CSS常用知识CSS美化checkbox复选框JavaScript常用知识JavaScript格式化时间戳JavaScript窗口宽高处理JavaScript黑夜主题切换实现方案JavaScript数字转大写简易图片查看器TypeScript基础知识Threejs基础三要素Threejs网格辅助和轨道控制器Threejs物体绘制Electron基础使用Nodejs基础知识animate.css页面动画
Vue框架19
Vite的使用及扩展Vue3父子组件Vue3使用Marked解析MarkdownMermaid图表生成库初始化页面加载动画Axios表单提交二维码解决方案NProgress加载进度条Vue3动态菜单实现Vue3使用ECharts图表Vue3处理Excel导入导出keep-alive页面缓存及setup问题Element:文件上传Element:结合Pinia实现动态菜单Element:图片上传组件Element:自定义统一弹窗组件Element:表格自定义指令控制按钮显示(鉴权)可视化大屏使用缩放适配分辨率
UniApp15
UniApp的基础使用封装网络请求工具及文件上传uni-app的开发记录微信小程序分享原生文件上传Pinia取消滚动条(兼容小程序)tabbar消息数量显示scroll-view上滑到底部加载数据状态栏高度动态设配数据共享与传递uview-plus导航栏实现背景融合Wot UIWot UI实现顶部背景图融合uni-app x
Java基础知识10
基础知识面向对象Lambda表达式常用API常用知识积累try-with-resource注解反射多线程经纬度距离计算
SpringBoot31
application配置Maven创建聚合项目全局异常处理锁机制项目启动初始化数据方式邮件功能集成原生定时任务异步集成阿里云OSS阿里OSS预签名上传基于hutool读excelJSR303WebSocketWebSocket版AI接口流式调用Smart-Doc接口文档生成器application配置信息加密雪花算法工具AOP实现请求参数脱敏思路JWT生成Token及工具类SpringBoot默认JSON与对象转换若依框架:安装使用若依框架:优化和调整文件上传若依框架:管理后台页面优化若依框架:后端接口代码优化SpringAISpringBoot实现AI接口流式调用服务启动时创建MySQL连接自建项目工程树形结构处理工具微信支付代码微信手机号登录
SpringMVC14
跨域处理拦截器RESTful风格伪前后端分离Jackson转换器调整Thymeleaf基于拦截器做权限校验AOP打印接口请求响应日志AOP打印接口请求响应耗时文件上传和回显POST请求加解密实现(AES)POST请求加解密实现(RSA+AES)参数动态校验实现方案真实IP和归属地
MyBatis8
MyBatis基本使用与配置Mapper使用相关MaBatis多数据源配置MyBatisPlus数据统计类处理方案MyBatisPlus条件查询正向工程的实现(H2)mybatis-plus-join
SpringCloud15
Netflix:微服务与搭建Netflix:服务的消费与提供Netflix:EurekaNetflix:ActuatorNetflix:RibbonNetflix:FeignNetflix:HystrixNetflix:ZuulAlibaba:简介与搭建Alibaba:Nacos注册中心Alibaba:RibbonAlibaba:OpenFeignAlibaba:Nacos配置中心Alibaba:GetewayAlibaba:Sentinel
MySQL6
MySQL基础知识MySQL多表查询与事务MySQL常用函数及解决方案MySQL视图MySQL索引安装MySQL
Redis7
Redis介绍和安装Redis配置文件Redis持久化Redis集群Redis语法基础Redis相关问题及解决方案SpringBoot集成Redis使用记录
MongoDB10
Linux安装MongoDBMongoDB基础语法MongoTemplate及SpringBoot配置MongoTemplate中Update操作MongoTemplate中聚合查询MongoTemplate日期归档示例项目使用相关知识归纳地理位置存储与距离查询MongoDB副本集与事务获取类名和属性名工具类
其他数据库1
H2数据库
Python编程6
Python基础知识Python语法yolo目标检测OpenCV的使用及树莓派平台condauv
工具集合13
IDEAMavenGradleGitNginx安装Nginx配置VSCodeJMeter压测DockerOllamaRustFSPicGoObs录制
Linux知识11
Linux常用命令Jar启动脚本VirtualBox安装CentOSVirtualBox安装Ubuntu树莓派安装及使用frp内网穿透ArchLinux:基础系统安装ArchLInux:图形化界面安装ArchLinux:常用软件ArchLinux:深度优化ArchLinux:Niri
创意设计2
Blender:入门知识UI设计基础知识
AI相关9
Claude CodeHermes AgentOpenAI基本使用OpenAI工具调用OpenAI记忆管理OpenAI推理执行OpenAI开发框架Langchainllama.cpp

下载安装

https://nodejs.org/zh-cn

Yarn

npm i -g yarn
yarn --version

yarn init - 初始化新项目并创建 package.json 文件
yarn add [package] - 将一个或多个包添加到项目中
yarn remove [package] - 从项目中移除一个或多个包
yarn install - 安装项目中所有依赖项
yarn upgrade [package] - 更新一个或多个包至最新版本
yarn run [script] - 运行在 package.json 中定义的脚本
yarn build - 执行构建命令以生成生产环境所需的文件
yarn start - 启动应用程序或服务器
yarn test - 运行测试套件

文件读写

let fs = require('fs')
/**
 * 读取数据
 */
function readFile(path) {
  try {
    return fs.readFileSync(path, { encoding: 'utf-8' })
  } catch (e) {
    return ''
  }
}

/**
 * 写入数据
 */
function writeFile(path, content) {
  fs.writeFileSync(path, content)
}

开启HTTP服务

var http = require('http')
/**
 * 运行服务
 */
function runServer() {
  // 启动前梳理一遍排序
  neatenSort()
  // 项执行一遍目录生成,防止没有文件进行访问
  startGenerate()
  // 需要访问的文件的存放目录(项目所在位置的文件夹路径)
  var documentRoot = './target'
  // 启动服务
  http.createServer(function (req, res) {
    var url = req.url
    if (url == '/' || url == '/article' || url == '/article/**') {
      url = '/index.html'
    }
    var file = documentRoot + url
    fs.readFile(file, function (err, data) {
      if (err) {
        res.writeHeader(404, {
          'content-type': 'text/html;charset="utf-8"'
        })
        res.write(readFile('404.html'))
      } else {
        // 请求头设置
        // html的请求头 Content-Type : text/html ; charset=utf-8
        // CSS的请求头 content-type:  text/css; charset=utf-8
        // JavaScript的请求头 content-type:  text/javascrpt; charset=utf-8
        let contentType = 'text/html;charset="utf-8"'
        if (url.indexOf('.css') > -1) {
          contentType = 'text/css;charset=utf-8'
        } else if (url.indexOf('.js') > -1) {
          contentType = 'application/javascript;charset=utf-8'
        } else if (url.indexOf('.svg') > -1) {
          contentType = 'image/svg+xml;charset=utf-8'
        }
        res.writeHeader(200, {
          'content-type': contentType
        })
        res.write(data)
      }
      res.end()
    })
  }).listen(7981)

  // 监听文件变化,由于监听了所有子文件,所以一次改动会刷新多次,解决办法为限时刷新,即同一时间内只允许刷新一次
  // 这里注意:VSCode的自动保存会定时触发,也就是开启后这里会每隔一段时间就刷新一次,建议不要使用自动保存,而是手动保存,触发文件动态刷新
  let tempTimer = 0
  let number = 1
  fs.watch('./docs', { recursive: true }, (eventType, filename) => {
    let timer = new Date().getTime()
    if (timer - tempTimer > 2000 && eventType == 'rename') {
      // 监听文件名称改动,进行排序整理和重新生成
      setTimeout(() => {
        // 延时执行,避免编辑器打开新建文件立刻执行更名操作的异常问题
        console.log('A file or directory is renamed: ' + filename + ', resort');
        neatenSort()
        startGenerate()
      }, 500);
      tempTimer = timer
    } else if (timer - tempTimer > 2000 && eventType == 'change') {
      // 监听文件改动,重新生成
      console.log('A file is changed: ' + filename + ' > ' + (number++));
      startGenerate()
      tempTimer = timer
    }
  })
  console.log('Service started successfully, url is http://localhost:7981/')
  // 控制台输入
  readCommand()
}

文件夹复制

/**
 * 文件夹复制(递归支持下级目录)
 */
function cpSync(source, destination) {
  let major = process.version.match(/v([0-9]*).([0-9]*)/)[1]
  let minor = process.version.match(/v([0-9]*).([0-9]*)/)[2]
  // 判断node版本不是16.7.0以上的版本
  // 则进入兼容处理
  // 这样处理是因为16.7.0的版本支持了直接复制文件夹的操作
  if (Number(major) < 16 || Number(major) == 16 && Number(minor) < 7) {
    // 如果存在文件夹 先递归删除该文件夹
    if (fs.existsSync(destination)) fs.rmSync(destination, { recursive: true })
    // 新建文件夹 递归新建
    fs.mkdirSync(destination, { recursive: true })
    // 读取源文件夹
    let rd = fs.readdirSync(source)
    for (const fd of rd) {
      // 循环拼接源文件夹/文件全名称
      let sourceFullName = source + "/" + fd
      // 循环拼接目标文件夹/文件全名称
      let destFullName = destination + "/" + fd
      // 读取文件信息
      let lstatRes = fs.lstatSync(sourceFullName)
      // 是否是文件
      if (lstatRes.isFile()) fs.copyFileSync(sourceFullName, destFullName)
      // 是否是文件夹
      if (lstatRes.isDirectory()) cpSync(sourceFullName, destFullName)
    }
  } else {
    fs.cpSync(source, destination, { force: true, recursive: true })
  }
}

Sleep休眠

function sleep(ms) {
    return new Promise(resolve=>setTimeout(resolve, ms))
}
async function main() {
    console.log(1)
    await sleep(1500)
    console.log(2)
}
main()
下载安装
Yarn
文件读写
开启HTTP服务
文件夹复制
Sleep休眠