分类 学习 下的文章 - 浮川的小窝
首页
休闲直播
4K壁纸
统计
更多
关于
留言
归档
搜 索
1
emby+alist3+cloudDriver2 emby无法播放网盘资源问题
164 阅读
2
HelloWorld!
154 阅读
3
前端算法整理
146 阅读
4
关于服务器配置反代隐藏端口中遇到的问题
141 阅读
5
maptalks 一些基础api的再封装(待解耦改装纯方法类)
121 阅读
生活
学习
随笔
吐槽
小秘密
小故事
登录
/
注册
搜 索
SnowLove
累计撰写
69
篇文章
累计收到
5
条评论
首页
栏目
生活
学习
随笔
吐槽
小秘密
小故事
页面
休闲直播
4K壁纸
统计
关于
留言
归档
用户登录
登录
注册
找到
45
篇与
学习
相关的结果
2023-08-17
自封装小组件评分
因为要在触摸板上加一个评分页面 又不想把整个ui库都引进来 所以直接手写了一个简单的评星组件 还是vue 有全星半星模式 用的svg中的mask实现的模板遮盖 感觉还凑付能用吧
2023年08月17日
17
0
1
2023-08-11
goLang数组初识
最近正在看golang基础 :@(小怒) :@(小怒):@(小怒)(又开新坑了这是= =) 看到数组部分 写demo测试的时候发现有个小不同package main import ( "errors" "fmt" "strconv" ) func main(){ // 指定数组长度 // 传入函数形参时会拷贝一份新的数组值 修改的是函数内部的拷贝副本 arr := [3]int updateArr(arr) // [1,2,3] // 不定数组长度 // 此处为一个切片为一个引用类型 传递的事指针地址遂等同于下方操作 arr := []int updateArrTwo(arr) // 指定数组长度并传入地址值 // 传入地址值好理解 直接修改了原数组数据 arr := []int updateArrThree(&arr) fmt.Println(arr) // [1,7,3] } func updateArr(arr [3]int){ arr[1] = 7 } func updateArrTwo(arr []int){ arr[1] = 7 } func updateArrThree(arr *[]int){ (*arr)[1] = 7 }然后就舔着个脸去问GPT :@(脸红):@(脸红)发现了切片这个概念 于是去官网去找 结合csdn一位博主所说:————————————————切片(slice)是golang中一种特有的数据类型数组有特定的用处,但是却有一些呆板(数组长度固定不可变),所以在 Go 语言的代码里并不是特别常见。相对的切片却是随处可见的,切片是一种建立在数组类型之上的抽象,它构建在数组之上并且提供更强大的能力和便捷。切片(slice)是对数组一个连续片段的引用,所以切片是一个引用类型。这个片段可以是整个数组,或者是由起始和终止索引标识的一些项的子集。需要注意的是,终止索引标识的项不包括在切片内。切片提供了一个相关数组的动态窗口。————————————————package main import ( "fmt" ) func main(){ //定义数组: intarr := [6]int //切片构建在数组之上 slice := intarr[1 : 3] //输出数组 fmt.Println("intarr:", intarr) // [3 6 9 1 4 7] //输出切片 fmt.Println("slice:", slice) // [6 9] 包头不包尾 //输出切片个数 fmt.Println("slice的元素个数", len(slice)) // 2 // 修改切片数据 slice[1] = 55 //输出修改后切片 fmt.Println("slice2:", slice) // [6 55] //输出修改后数组 fmt.Println("intarr2:", intarr) // [3 6 55 1 4 7] 原数组数据也更改了 }如果使用make创建一个空切片并将原值copy到空切片上 这两个变量的字面量是相同的package main import ( "fmt" ) func main(){ // 切片的定义 intarr2 := []int slice2 := intarr2[0:6] // 此处的切片slice2和intarr2共享同一个底层数组 但是两人堆中的地址值不相同 // 并不能简单的理解成地址值相同那这两个变量就是一个完全相同的引用类型变量 } 这句感觉很关键刚在学习阶段 理解的不是很透彻 记录一下 待以后学成而归再修正 :@(装大款) :@(装大款)
2023年08月11日
13
0
0
2023-08-08
node连接mongodb时出错问题
天杀的mongodb :@(愤怒) :@(愤怒):@(愤怒):@(愤怒):@(愤怒):@(愤怒):@(愤怒):@(愤怒)起因是升级了群晖DSM7.2 node版本随之而也升级了 之前的日志项目重新部署发现数据库连不上了...哎哟喂一天啊整整一天啥也没干就死磕这个倒霉数据库 死活连不上 现在记录一下自己解决的心路历程首先我怀疑的是打的docker镜像不是最新版的 然后我就去码云看我的提交记录 发现木的问题。然后我就翻docker日志 去看后端服务为啥连不上 发现就这么个破报错 :@(内伤) 遂谷歌百度了一通 大体意思如以下几个解决方法:修改链接地址 更换url localhost或者127.0.0.1 -> 0.0.0.0 修改 mongo 配置文件 vim /etc/mongod.conf.orig将其中的bindIp: 127.0.0.1注释掉bindIp: 127.0.0.1 或者改成bindIp: 0.0.0.0 即可开启远程连接修改mongodb docker配置文件 vim /etc/sysctl.conf"在文件中添加下面的配置" net.ipv4.ip_forward=1 添加此行配置查看是否修改成功 sysctl net.ipv4.ip_forward 如果返回net.ipv4.ip_forward = 1则表明成功以上方法均无效 :@(吐血倒地):@(吐血倒地):@(吐血倒地):@(吐血倒地):@(吐血倒地)最终的解决办法还是借鉴了n年前的easymock项目 因为在服务器上部署过easymock项目 所以就哼哧哼哧去gitub上翻源码 最后无奈把mongodb和node调用库分别由版本降级到 "mongoose": "^6.3.1"-> "^4.13.9" "mongo":"4.4.9" -> "3.4.1" 我又在easymock项目里写了个一测试js调用同网络下的easymock的mongodb 是能调通的(我比对过docker容器配置 关键参数都有相差不大) 遂我照葫芦画瓢 把mongo全部降低 然后特么的好使了= = 怀疑是升级DSM系统后 docker也进行了升级 要不就是node版本不兼容mongo调用库了 :@(惊喜) :@(惊喜) :@(惊喜) 这破问题太折磨人了 不过最终还是解决了系统跑起来了 过阵子等着重构重构啰啰嗦嗦一大堆没用的 下班!!! :@(呲牙) :@(呲牙) :@(呲牙)
2023年08月08日
17
0
0
2023-08-01
乞丐版虚拟键盘v0.0.1(已升级至v0.0.5)
:@(高兴) 大家好啊我破壁人今天又诈尸了 介于vue3.0发布好久了 最近参考了一下官方项目 发现他的项目结构很有意思 正好同事也在看 遂一起研究着搞个小项目练练手 左思右想 写个啥呢? :@(吐血倒地)于是就比着官方项目在加上一顿搜索再加上二顿虾基霸改 勉勉强强算是搭起来了 :@(呲牙) 这版写的比较急 再加上零零碎碎的时间写的 所以难免有些地方考虑的欠妥 实现的很不优雅 跟同事小伙伴一起(我那同事真大神没有他不会的)边请教着边尝试 写出了这个v0.0.1版 使用了 Monorepo+pnpm+typescript+vite+js原生 写了个简单的键盘 而且还才用了兼容性极差的css :@(赞一个) (想用table来着 但是心思心思也没用过grid 索性就拿他实验实验)实现了一套黑色主题颜色不支持联想和连续输入 :@(哭泣)支持中英切换支持npm安装实现数字键位布局(ps:不要关注版本跳了4次的问题 :@(狂汗) )下一步准备再加上 数字键盘的布局、多国语言选择、添加兼容性更好的css布局方式、自定义键盘背景 等功能 一步步来吧~ 测试版v0.0.1上线 测试版v0.0.5上线 添加数字键盘布局 todo... 删库跑路展示demo: ::(弱) ::(弱) ::(弱) 点击下面::(弱) ::(弱) ::(弱)
2023年08月01日
49
0
1
2023-07-31
自动打包备份脚本
最近看着公司项目打包太过混乱 :@(小怒) 因为协同开发 需要随时更新代码到测试环境 虽然有git的自动化部署脚本 但是上了正式的内网环境(政府项目无互联网环境) 打包还是要手动部署的 所以想写个简单的备份脚本 发包的时候能知道最后发包人及发包时间和版本 :@(深思) 话不多说 上代码项目结构:添加tsconfig.run.json{ "compilerOptions": { "module": "commonjs", "target": "es2018", "strict": true, "esModuleInterop": true, "resolveJsonModule": true, "moduleResolution": "node" }, "include": ["build/index.ts"] }添加build下index.ts注意安装 npm install ts-node archiver @types/archiver -Dimport * as fs from "fs"; import path from "path"; import moment from "moment"; import from "child_process"; import archiver from "archiver"; // 文件数 let files = 0; // 获取文件路径 const getPath = (dir: string) => path.resolve(__dirname, "../", dir), archive = archiver("zip", { zlib: , }), // 获取git用户名 getGitUser = () => { return new Promise((resolve, reject) => { exec("git config user.name", (err, stdout) => { if (err) { console.log("未获取到当前打包人:", err); return reject("未知"); } console.log("当前打包人:", stdout.slice(0, -1)); resolve(stdout.slice(0, -1)); }); }); }, // 获取文件数 dirLen = (srcPath: string) => { fs.readdirSync(srcPath).forEach((dir) => { const filePath = path.join(srcPath, dir); if (fs.lstatSync(filePath).isDirectory()) { dirLen(filePath); } else files += 1; }); }, // 遍历读取文件 readDirErgodic = async ( srcPath: string, toPath: string, callback: () => void ) => { try { const dirList = fs.readdirSync(srcPath); for await (const file of dirList) { //拼接路径 const curPath = path.join(srcPath, file), toCopyPath = path.join(toPath, file); if (fs.lstatSync(curPath).isDirectory()) { fs.mkdirSync(toCopyPath); readDirErgodic(curPath, toCopyPath, callback); } else { const readable = fs.createReadStream(curPath), writable = fs.createWriteStream(toCopyPath); readable.pipe(writable); writable.on("finish", () => { files--; // files === 0 && console.log("finish", callback); files === 0 && callback && callback(); }); } } } catch (err) { console.log("------------读取dist文件失败------------", err); throw new Error(err + ""); } }, // 读取dist下所有文件 readDistDir = async (srcPath: string, toPath: string) => { try { // 计算多少文件数 dirLen(srcPath); // 创建复制过去准备打包的文件夹 fs.mkdirSync(toPath); console.log("打包文件个数:", files); return new Promise((resolve) => { readDirErgodic(srcPath, toPath, () => resolve(true)); }); } catch (err) { return Promise.resolve(false); } }, // 删除指定文件夹下所有文件并删除该文件夹 deleteFolderErgodic = async (folderPath: string) => { const files = fs.readdirSync(folderPath); for await (const filePath of files) { //拼接路径 const curPath = path.join(folderPath, filePath); if (fs.lstatSync(curPath).isDirectory()) { await deleteFolderErgodic(curPath); isEmptyDir(curPath) && fs.rmdirSync(curPath); } else { fs.unlinkSync(curPath); } } return Promise.resolve(true); }, // 是否为空文件夹 isEmptyDir = (folderPath: string) => { try { const list = fs.readdirSync(folderPath); return list && Array.isArray(list) && list.length === 0 ? true : false; } catch (e) { return true; } }, // 删除指定文件夹 deleteFolder = async (folderPath: string) => { await deleteFolderErgodic(folderPath); // 删除现在为空的文件夹 // console.log("isEmptyDir(folderPath)", isEmptyDir(folderPath)); isEmptyDir(folderPath) && fs.rmdirSync(folderPath); }, // 打包文件 compressFolder = async (fileName: string) => { if (fs.existsSync(fileName)) { console.log("------------打包压缩开始------------"); const output = fs.createWriteStream(`$.zip`); // 监听archive对象的错误事件 archive.on("error", (err: any) => { console.log("打包错误", err); throw err; }); output.on("close", () => { let times = 3; console.log("------------删除打包文件中....------------"); const timer: NodeJS.Timer = setInterval(() => { console.log(`$秒`); if (times == 1) { if (fs.existsSync(fileName)) { deleteFolder(fileName); console.log("------------打包压缩流程完成!------------"); return clearInterval(timer); } else console.log( "------------删除打包文件失败,请根据情况手动删除------------" ); } times--; }, 1000); }); // 将archive流导向输出文件 archive.pipe(output); // 添加要打包的文件 archive.directory(fileName, false); // 完成archive archive.finalize(); } }; // 将打包的dist文件存入文件备份中 (async function copyFileToBackFiles(srcFile: string, distFile: string) { console.log("------------打包压缩流程开始!------------"); !fs.existsSync(distFile) && fs.mkdirSync(distFile); const fileName = `$/$-${moment( new Date() ).format("YYYY-MM-DD HH:mm:ss")}-$`; // // console.log("fileName", path.basename(process.cwd())); // 读取dist文件夹下所有文件并拷贝到fileName文件夹下 if (!(await readDistDir(srcFile, fileName))) return console.log("------------打包压缩意外终止------------"); // 压缩文件 compressFolder(fileName); })(getPath("dist"), getPath("dist_back_files"));package.json添加运行脚本{ "build-only": "vite build && ts-node", "ts-node": "ts-node --project tsconfig.run.json build/index", }脚本将在构建完成后 创建一个压缩文件名组成: 项目名-日期-git最后一次提交人 :@(赞一个) 暂时性满足了我的需求 后期准备把他封装成一个插件包发上去 等着再说叭~
2023年07月31日
25
0
0
1
...
3
4
5
...
9