近日,一则"恶犬伤人"的惨剧登上了热搜,震惊全国。这起悲剧事件再次敲响了科学养狗的警钟,呼吁全社会重视养狗责任和安全。作为科学养狗的倡导者,我们更应当以此为鉴,坚定理念,传播正确的狗狗知识,努力提高全民的养狗文化素养。
正文伤亡无辜,我们内疚且愧疚。作为爱狗人士,我们痛心看到这起悲剧发生,但也应该反思是否做足了科学养狗的宣传工作?是否还有很多人对狗狗的习性和需求缺乏正确认知?
养狗不仅是一种个人爱好,更是一种社会责任。狗狗虽然是人类的好朋友,但它们终归是另一个物种,有着独特的生理和心理需求。如果我们缺乏正确的科学养狗知识,很容易在照顾和管理过程中产生误会和疏忽,给自己和他人带来安全隐患。
科学养狗的核心是:了解狗狗、尊重生命、管理有度。我们要学习狗狗的行为习性、生理需求、压力来源等,通过正确的方式满足它们,建立良好的人狗关系。同时,我们要尊重生命,用友善但不放纵的方式对待狗狗,确保它们受到人性化的照顾,但不会伤害他人。最后,我们要严格管理狗狗,在公共场合给予足够的注意力,做好安全防护措施。
曾经一度,养狗被视为上层阶级的"奢侈品"。而现在,越来越多普通家庭都能享受到狗狗这个"毛孩子"带来的欢乐。但与此同时,随着养狗数量的增加,我们也要提高科学养狗的意识,减少各种冲突和风险。
这不仅关乎狗狗和主人自身的利益,也关系到整个社会的和谐有序。无论你是否养狗,提高科学养狗意识都是应尽的义务。让我们携手共建文明和谐的养狗环境,努力消除人狗矛盾,传递更多正能量!
结语有爱无伤害,科学养狗路更宽。虽然这起惨剧给我们带来了沉重一课,但我们永不放弃公众号初心,继续传播科学养狗的正确理念,用知识和文化的力量让这片土地上的人狗关系更加融洽、和谐。
prisma使用两个数据库
本文大概介绍怎么操作使用两个数据库及多个数据,需要了解prisma的一些基本操作
1.初始化prisma,一般会在你的项目根目录有个prisma文件夹,文件夹里有个schema.prisma文件,这里可以定义第一个数据库
我的db1的schema.prisma文件的开头为:
2.然后在prisma文件夹里新建一个schema2.prisma 文件,这个作为db2,请看注释
db2开头为:
3.关键——更改db2的模型,每次都需要指定schema.prisma的文件
比如你在schema2.prisma 文件里新建了模型,需要执行
或者拉取已经定义好的模型到指定的schema 文件
npx prisma db pull --schema=./prisma/schema2.prisma4.客户端使用时,需要指定导入的client schema文件
先生成客户端使用的schema
然后使用DB2
import { PrismaClient } from "@/prisma/DB2Client/testClient; #这里的路径为步骤2定义的路径 const db2_prisma = new PrismaClient();浏览器渲染页面是一个相对复杂的过程,涉及多个步骤。了解这个过程有助于进行性能优化和编写高效的Web应用。以下是浏览器渲染原理的高级概述:
1. 处理HTML文档- 解析HTML:浏览器下载HTML文件后,解析器(Parser)开始工作,将HTML解析成DOM(Document Object Model)树。DOM树是文档的对象表示,它将文档表示为节点和对象的树结构。
2. 处理CSS- 解析CSS:同时,浏览器解析内部、外部(通过<link>引入)和内联(在<style>标签内)CSS样式,生成CSSOM(CSS Object Model)树。CSSOM树反映了CSS文件中的所有选择器及其属性。
- 构建渲染树:DOM树和CSSOM树构建完成后,浏览器将它们结合形成渲染树(Render Tree)。渲染树只包含需要显示的节点和这些节点的样式信息。隐藏的元素(例如,由于display: none属性)不会包含在渲染树中。
- 布局/回流:有了渲染树后,浏览器就会进行布局(Layout),也称为回流(Reflow),计算每个节点的准确位置和大小。这个阶段确定了页面中所有元素的几何信息(比如宽、高、位置)。
4. 绘制(重绘)- 绘制/重绘:布局完成后,浏览器将渲染树的节点绘制到屏幕上,这个过程叫做绘制(Painting)或重绘(Repaint)。如果元素的外观被改变(例如,颜色或阴影等),但不影响布局,那么就会发生重绘而不是回流。
5. 合成- 合成(Compositing):现代浏览器通过分层技术优化渲染性能。不同的元素会被分配到不同的图层(Layer),然后浏览器会合成这些图层来显示最终的页面。一些特定的CSS属性会触发新图层的生成(如will-change、transform等),这可以提高性能,因为合成过程中只需要处理变化的图层。
性能优化在这个过程中,优化的目标是减少重绘和回流的次数,因为它们很耗费资源。一些常见的性能优化策略包括:
- 尽量减少对DOM的操作,或者在离线(off-DOM)状态下进行,比如先把元素隐藏(display: none),完成修改后再显示。
- 使用transform和opacity属性来实现动画,这些属性可以通过合成器直接处理,不需要回流和重绘。
- 避免使用表格布局,因为表格中一个小的改变可能会影响到其他所有的布局。
- 批量读取或修改样式,避免布局抖动(Layout Thrashing),例如使用getComputedStyle或者offsetHeight等触发回流的操作时。
理解浏览器的渲染原理能够帮助开发者写出更高效、性能更优的代码,提升用户体验。
JavaScript的事件循环(Event Loop)是理解JavaScript运行机制的重要概念,特别是它的异步编程模型。JavaScript语言的执行环境(如浏览器和Node.js)是单线程的,这意味着在任何给定时刻只能执行一个代码块。事件循环就是一种机制,使得JavaScript引擎能够在执行完当前代码块后,从任务队列中取出并执行新的任务,从而实现非阻塞的异步行为。
事件循环的工作流程执行栈(Call Stack):
当一个脚本首次运行时,JavaScript引擎会创建一个执行栈,用于跟踪所有运行中的函数调用。 执行栈是LIFO(后进先出)的结构,当前执行的函数位于栈顶。 当一个函数完成执行后,它会从栈顶被移除,控制权回到下一个栈顶的函数。任务队列(Task Queue):
当异步事件(如点击事件、定时器、网络请求等)发生且相应的回调函数准备好执行时,这些回调函数会被添加到任务队列中。 任务队列遵循FIFO(先进先出)原则。事件循环(Event Loop):
事件循环的主要任务是监视执行栈和任务队列。 如果执行栈为空,事件循环就会从任务队列中取出第一个任务,放入执行栈中执行。 这个过程是循环进行的,因此被称为“事件循环”。 宏任务(MacroTasks)与微任务(MicroTasks)在现代JavaScript中,任务队列又被细分为宏任务队列和微任务队列。
- 宏任务包括:设置定时器(setTimeout、setInterval)、I/O操作、UI渲染等。
- 微任务包括:Promise回调、MutationObserver、queueMicrotask等。
事件循环的一个周期(tick)的大致流程如下:
执行当前执行栈中的同步代码。 执行栈清空后,检查并执行所有微任务。如果在执行微任务时产生了更多微任务,这些新的微任务也会在当前事件循环周期内执行完成。 进入下一个事件循环周期,从宏任务队列中取出一个任务执行。 每完成一个宏任务,就回到第2步,再次检查微任务队列。 事件循环的重要性事件循环模型使得JavaScript可以执行非阻塞的异步操作,即使它是单线程的。这对于需要响应用户操作、网络请求等异步事件的Web和Node.js开发至关重要。理解事件循环对于编写高效、避免性能瓶颈的JavaScript代码非常有帮助。
在JavaScript中,处理非常大的数(超出Number.MAX_SAFE_INTEGER的范围)时,直接相加会导致精度丢失。为了精确处理大数相加,我们可以使用字符串来表示这些大数,并通过模拟手算加法的方式来逐位计算结果。
以下是实现大数相加的JavaScript函数示例:
function addBigInt(num1, num2) { // 将两个数字字符串逆序,便于从最低位开始相加 let a = num1.split('').reverse(); let b = num2.split('').reverse(); // 结果数组 let result = []; // 进位 let carry = 0; // 以较长的数字为循环次数 let length = Math.max(a.length, b.length); for (let i = 0; i < length; i++) { // 将当前位的数字相加(如果某个数已经没有更多的位,则视为0),加上之前的进位 let sum = (parseInt(a[i] || '0', 10) + parseInt(b[i] || '0', 10)) + carry; // 如果和大于等于10,则需要进位 if (sum >= 10) { carry = 1; sum -= 10; // 取余数作为当前位的结果 } else { carry = 0; } // 将当前位的结果存入结果数组 result.push(sum); } // 如果最后还有进位,增加一个1 if (carry) { result.push(1); } // 将结果数组逆序并转换为字符串 return result.reverse().join(''); } // 测试示例 console.log(addBigInt('123456789123456789', '987654321987654321')); // 输出: "1111111111111111110"这个实现通过逐位相加并处理进位的方式来确保大数相加的精确性。首先,将输入的数字字符串逆序,然后对应位置的数字相加,处理进位,最后将结果数组逆序并拼接成字符串。这种方法能够有效处理任意长度的数字加法,不受JavaScript数字精度限制的影响。
最长递增子序列(Longest Increasing Subsequence,简称LIS)是在一个序列中找到一个最长的子序列(不一定连续),使得这个子序列中的所有元素都按照严格递增的顺序排列。这里的“子序列”是指从给定序列中删除某些(或不删除)元素后剩余元素保持原有的顺序。关键点在于,“递增”要求每个后面的元素都严格大于前面的元素,且“最长”的递增子序列是长度最大的那个。
示例说明假设有序列 A 如下:
A = [10, 9, 2, 5, 3, 7, 101, 18]在这个序列中,存在多个递增子序列,例如:
- [2, 3] 是其中一个递增子序列。
- [10, 101] 也是一个递增子序列。
- [2, 5, 7, 101] 是更长的递增子序列。
在所有可能的递增子序列中,最长的是 [2, 3, 7, 101](长度为4)或者其他长度为4的序列,比如 [2, 5, 7, 101]。因此,对于序列 A,其最长递增子序列的长度是4。
关键点- 子序列不需要在原序列中连续出现。在上面的例子中,[2, 3, 7, 101] 就不是连续出现在原序列中的。
- 最长递增子序列关注的是最大的长度,具体的序列可能不是唯一的,即可能存在多个不同的序列都是最长递增子序列,但长度相同。
- 解决这个问题常用的方法是动态规划,其核心思想是逐步构建每个位置能达到的最长递增子序列的长度,以及使用二分查找法进行优化,达到更高效的解决方案。
最长递增子序列的概念在计算机科学中有广泛的应用,比如数据分析、生物信息学中的序列对齐、以及其他需要分析序列或路径问题的领域。
还是没懂?如果还没看懂,那么下面用一个简单的例子说明下:
让我们用一个更通俗的比喻来理解最长递增子序列(LIS)的概念。
假设你有一串珍珠,这串珍珠按照一定的顺序排列,每颗珍珠上都写有一个数字。现在你的任务是从这串珍珠中挑选出尽可能多的珍珠,但有两个规则需要遵守:
你挑选的珍珠必须保持在原串珍珠中的顺序。也就是说,如果你先挑选了第3颗珍珠,然后想挑选第2颗珍珠,那是不行的,因为这改变了它们原有的顺序。 你挑选的珍珠上的数字必须是递增的。也就是说,如果你挑选了一颗数字为3的珍珠,那么你下一次挑选必须挑选数字大于3的珍珠。 示例假设有一串珍珠,数字依次是:[10, 9, 2, 5, 3, 7, 101, 18]。
根据上述规则,我们可以有多种挑选方式,比如我们可以挑选 [2, 3, 7, 18],这一组就是一个符合规则的递增序列。
但我们的目标是要找到最长的那个符合规则的递增序列。在这个例子中,最长的递增序列之一是 [2, 3, 7, 101],长度为4。这就是我们所说的最长递增子序列。
关键点- 顺序性:我们挑选珍珠的时候不能改变它们原来的顺序。
- 递增性:挑选的珍珠上的数字必须是递增的。
- 目标是最长:我们要尽可能多地挑选珍珠,使得挑选出的珍珠串是最长的。
通过这个珍珠的比喻,希望你能更好地理解最长递增子序列(LIS)的概念了。
实际应用场景最长递增子序列(LIS)这个概念在实际应用中有多种有趣且重要的应用场景,其中包括:
信息技术:
数据库优化:在数据库查询优化中,可以用来调整数据的存取顺序,减少查询时间。 网络传输:在数据包的传输顺序优化中,如确保数据包的正确排序以优化网络流量和提高传输效率。生物信息学:
基因序列分析:在比对基因序列时,寻找最长公共子序列(LCS)可以认为是LIS问题的一个变种,用于识别不同物种之间的遗传关系或进化过程。软件开发:
版本历史管理:在版本控制系统中,可以利用LIS来优化数据存储,通过保持修改的递增序列来减少存储空间。计算机图形学:
动画和游戏开发:动画关键帧的优化处理,确保动画的流畅性和渲染效率。数学与算法竞赛:
算法设计:LIS是许多算法问题的基础或部分,是解决更复杂问题的一步。用户行为分析:
购物行为分析:通过分析顾客购买商品的顺序,找出潜在的购买模式或偏好,帮助零售商优化库存和销售策略。文本处理:
文本相似性分析:在比较两段文本的相似性时,最长递增子序列可以用来评估它们的相似度,例如,在抄袭检测软件中。教育与学习:
学习路径推荐:在在线教育平台,根据学生的学习进度和兴趣,利用LIS算法为他们推荐个性化的学习路径。这些应用虽然多种多样,但它们共同的基础在于对序列、数据、或事件的排序和优化,以及在这个基础上做出的决策优化或模式识别。通过LIS,我们可以找到在特定约束条件下的最优解或最优路径,这对于提高效率、优化性能和增强用户体验至关重要。
解决最长递增子序列(Longest Increasing Subsequence,简称LIS)的问题,一个常见且有效的方法是使用动态规划。本题的目标是在一个未排序的数组中找到最长递增子序列的长度。
动态规划方法基本思想是创建一个数组 dp,其中 dp[i] 代表以第 i 个元素结尾的最长递增子序列的长度。对于每个新的元素,你都需要遍历之前的所有元素,如果当前元素大于之前的某个元素,那么就更新 dp[i] 的值。
算法步骤: 初始化一个长度与原数组相同的 dp 数组,每个位置的值设为1,因为最长递增子序列的最小长度为1。 双层循环遍历原数组。外层循环遍历每个元素,内层循环遍历当前元素之前的所有元素。 如果外层循环的当前元素大于内层循环的元素,那么就检查 dp[j] + 1 > dp[i] 是否成立,如果成立,则更新 dp[i] = dp[j] + 1。 通过所有迭代后,dp 数组中的最大值即为最长递增子序列的长度。 JavaScript 实现: function lengthOfLIS(nums) { if (nums.length === 0) return 0; // Step 1 const dp = new Array(nums.length).fill(1); let maxLen = 1; // Step 2 for (let i = 1; i < nums.length; i++) { for (let j = 0; j < i; j++) { // Step 3 if (nums[i] > nums[j]) { dp[i] = Math.max(dp[i], dp[j] + 1); } } // Update max length maxLen = Math.max(maxLen, dp[i]); } return maxLen; } // 示例 console.log(lengthOfLIS([10, 9, 2, 5, 3, 7, 101, 18])); // 输出:4这段代码的时间复杂度是 (O(n^2)),其中 (n) 是数组 nums 的长度,因为需要双层循环遍历数组。空间复杂度是 (O(n)),因为需要额外的数组 dp 来存储每个元素为结尾的最长递增子序列的长度。
二分查找优化注意,还有一个时间复杂度为 (O(n \log n)) 的解决方案,通过使用二分查找来维护一个递增子序列。这种方法的实现较为复杂,但在处理大数据集时更为高效。
利用二分查找优化最长递增子序列(Longest Increasing Subsequence, LIS)问题的解法,其核心思想是维护一个数组 tails,其中 tails[i] 存储长度为 i+1 的所有递增子序列的最末元素的最小值。通过这种方式,可以确保 tails 数组是一个递增数组,从而可以使用二分查找来优化搜索过程。
算法步骤: 初始化:创建数组 tails,但开始时为空,因为最初没有找到任何递增子序列。 迭代:遍历输入数组 nums 的每个数字 x,对于每个 x,在 tails 中通过二分查找确定 x 应该放置的位置 i。这个位置满足 tails[i-1] < x <= tails[i]。 更新:如果 x 大于 tails 中所有的元素,则将其添加到 tails 末尾;否则,用 x 替换掉 tails[i]。 结果:最终,tails 的长度就是最长递增子序列的长度。 JavaScript 实现: function lengthOfLIS(nums) { let tails = []; for (let x of nums) { let i = 0, j = tails.length; // 二分查找 while (i < j) { let m = Math.floor((i + j) / 2); if (tails[m] < x) { i = m + 1; } else { j = m; } } if (i === tails.length) tails.push(x); else tails[i] = x; } return tails.length; } // 示例 console.log(lengthOfLIS([10, 9, 2, 5, 3, 7, 101, 18])); // 输出:4此解法的时间复杂度为 (O(n \log n)),其中 (n) 是数组 nums 的长度。空间复杂度为 (O(n)),因为需要维护数组 tails。
在这种方法中,tails 数组的长度即为我们要求的最长递增子序列的长度。需要注意的是,tails 数组本身并不一定是最长递增子序列,但其长度确实反映了LIS的长度。这种方法通过聪明地维护一组“潜在”的递增子序列来避免了复杂的动态规划解法中的重复计算,大大提高了效率。
这个问题是经典的爬楼梯问题,可以通过动态规划解决。基本思路是:如果你在第 (n) 个台阶,那么你是从第 (n-1) 个台阶走上一步上来的,或者是从第 (n-2) 个台阶走上两步上来的。因此,到达第 (n) 个台阶的方法总数就是到第 (n-1) 个台阶和第 (n-2) 个台阶的方法数之和。
这里是一个实现这一思路的JavaScript代码:
function climbStairs(n) { // 初始化前两个台阶的走法 if (n === 1) return 1; if (n === 2) return 2; let oneStepBefore = 2; // 初始化为到达第二个台阶的走法 let twoStepsBefore = 1; // 初始化为到达第一个台阶的走法 let allWays = 0; // 从第三个台阶开始计算 for (let i = 3; i <= n; i++) { // 到达当前台阶的走法等于到达前一个台阶和前两个台阶的走法之和 allWays = oneStepBefore + twoStepsBefore; // 更新前两个台阶的走法,为下一次迭代准备 twoStepsBefore = oneStepBefore; oneStepBefore = allWays; } return allWays; } console.log(climbStairs(5)); // 输出:8这段代码通过递推而不是递归来解决问题,从而避免了递归可能导致的大量重复计算,提高了效率。此代码运行的时间复杂度为 (O(n)),空间复杂度为 (O(1))。
在求解时钟时针与分针夹角的问题时,您可以参考以下JavaScript代码。此代码可以计算出任意给定时间的时针与分针之间的夹角。请注意,返回的角度是两针之间较小的那个角度,并且以度为单位。
function calculateAngle(hour, minute) { // 每分钟时针移动的角度 const anglePerMinuteHourHand = 0.5; // 每分钟分针移动的角度 const anglePerMinute = 6; // 计算时针的位置,注意将分钟转化为小时的一部分 const hourPosition = (hour % 12) * 30 + minute * anglePerMinuteHourHand; // 计算分针的位置 const minutePosition = minute * anglePerMinute; // 计算两针之间的夹角 let angle = Math.abs(hourPosition - minutePosition); // 确保返回的是两针之间较小的角度 angle = Math.min(angle, 360 - angle); return angle; } // 示例:计算2:30的时针和分针的夹角 console.log(calculateAngle(2, 30)); // 输出:105这段代码中,calculateAngle 函数接受两个参数:小时(hour)和分钟(minute)。这两个参数分别用来表示特定的时间。
代码逻辑如下:
首先计算每个时刻时针和分针的角度位置。时针每小时移动30度(360度/12小时 = 30度),但也需要加上由于分钟导致的额外移动,这是因为当分钟针移动时,时针也在缓慢移动向下一个小时的位置。分针每分钟移动6度(360度/60分钟 = 6度)。
计算两针之间的绝对夹角。
从得到的夹角和它与360度的差中选取较小的一个,因为我们寻找的是两者之间的最小夹角。
返回这个角度作为结果。
通过这种方式,您可以计算任何给定时间的时针和分针之间的夹角。
什么是T3 Stack?原文地址:Why I chose T3 stack as the full-stack to build the react app
“T3 Stack”是 Theo 制作的 Web 开发堆栈,专注于简单性、模块化和全堆栈类型安全。它包括:
TypeScript Tailwind CSS Next.js NextAuth.js Prisma tRPCcreate-t3-app 是 @nexxeln 制作的简单 CLI,用于使用 t3 堆栈构建入门项目。如果你还没有尝试过堆栈,看到明星的火箭上升曲线,在六个月内攀升至超过 11k,作为一个现代开发者如何不尝试一下😉
22c81650-682d-42ea-a445-ee94ef1fc2cb-image.png
不管你信不信,在我意识到之前我实际上选择了T3堆栈。经过对市场的大量研究后,我很高兴最终选择了“完美”的全栈作为我将要构建的网络应用程序的标准。然后突然T3冲进了我的眼帘,一切都完美匹配,感觉有点复杂,如下:
7cca4b8a-ca04-4c22-ab28-34d2f4278447-image.png
我认为我最终选择与 T3 堆栈相同的堆栈的原因是我完全同意 T3 的公理。
1.解决问题很容易陷入“添加所有内容”的陷阱 - 我们明确不想这样做。添加到 create-t3-app 的所有内容都应该解决所包含的核心技术中存在的特定问题。
2.负责任地流血我们热爱我们的尖端技术。说实话,新事物带来的速度和乐趣真的很酷。我们认为负责任地流血很重要,在风险较小的部分使用风险较高的技术。
3.类型安全不是可选的create-t3-app 的既定目标是提供启动新的全栈、类型安全 Web 应用程序的最快方法。我们认真对待这些部分的类型安全,因为它提高了我们的生产力并帮助我们减少错误。
2和3都是我选择堆栈时的重要原则。
那么替代方案呢?“每个硬币都有两个面”,那么为什么选择这个而不是其他选择呢?嗯,一般来说,我认为这取决于你拥有什么和你相信什么。我将一一给你展示我的。
1.TypeScript尽管“类型安全不是可选的”是原则,但我认为我们不再需要讨论 TypeScript 与 JavaScript。已经是 2022 年了。
2.Tailwind CSS作为一个最近刚进入前端世界的长期后端开发人员,CSS 对我来说始终是最困难的怪物。在阅读了 Tailwind CSS 的创建者 Adam Wathan 的“几千字”之后,我长期以来对 CSS 麻烦的模糊感觉终于清晰了——管理 CSS 的最好方法就是根本不写 CSS。
因此,我完全支持效用优先的方法。在那个世界里,唯一值得一提的就是超光速粒子(Tachyons)。然而,尽管它比 Tailwind 早得多,但据说它的功能很完整,并且不能指望添加新功能或讨论问题。最新版本已经发布快五年了,这绝对违反了“Bleed Responsibly”的原则。从明星趋势上也可以看出:
f8ed010a-3657-4aa1-ad68-8023f28104d4-image.png
本来我以为这是又一个无需讨论的,就像 Typescript 一样,Nextjs 和 Vercel 给前端世界带来的戏剧性的宣传。但在写这篇文章的过程中,我注意到了一个新贵:Remix。
说实话,我对 Remix 的了解并不多。但 Theo 在他的一条推文中确实表达了关于 Remix 的观点,如下:
6f9bdc5d-b451-4510-b182-db3427dc2261-image.png
虽然体量无法与现在的 Next.js 相比,但它带来了有趣的体验改进,如 Rewrite、Mutation、Unhandled Errors 等,并且有良好的上升趋势。也许这将是另一个前沿,所以让我们密切关注。
ed8ae4ba-079f-41d4-b801-a33756a18d83-image.png
如果您想要一个具有内置提供商(Google、Facebook、GitHub...)、JWT、JWE、电子邮件/密码、魔术链接等的全功能身份验证系统...请使用 next-auth 。
Next.js 的官方文档中对此有明确规定。
5.Prisma由于“类型安全不是可选的”,ORM 是强制性的。
就我个人而言,这是唯一有真正竞争对手的领域:TypeORM
3b99251c-a22b-42a7-ae1c-1816ae521e85-image.png
抛开明星趋势不谈,Prisma 缺乏稳定性,因为他们对版本 2 和版本 3 都做出了重大改变,这对一些人来说是一个主要的反感。
事实上,我自己已经使用 TypeORM 好几年了,一切都运行得很好。
主要原因仍然是“类型安全不是可选的”这一原则。由于 Prisma 会动态为其查询生成类型,因此在很多情况下它可以为查询结果的类型提供比 TypeORM 更强的保证。
另一个考虑因素是 TypeORM 更接近于在其 API 中镜像 SQL,如下所示:
const posts = await postRepository.find({ where: { title: ILike('Hello World'), }, })对于后端开发人员来说这不是问题,但作为全栈解决方案,最好完全避免 SQL 概念。
6.tRPC看看tRPC网站的标题,你肯定知道我为什么选择它。
ec88b2f3-d7f2-4459-b7a0-369125a9be5d-image.png
是的,“类型安全不是可选的。
如果您使用 GraphQL,您可能会认为由于前端和后端之间达成了一致的架构,它最终也获得了类型安全。它可能最适合分离的前端和后端(这有一个不可避免的版本管理问题),但不适用于全栈单一存储库。它必须经历代码生成过程,其代价是类型检查时间长、IDE 智能支持较少、客户端包大小较大。此外,它确实引入了一个新的重要术语,这意味着您需要先学习并理解它,然后才能正确理解它。
相反,tRPC 依赖于一个非常大的假设:您的服务器是用 TypeScript 编写的,并且与客户端代码位于同一位置。 tRPC 让您为您的过程定义一个服务器端路由器,然后导出 Typescript 自动推断的类型,然后导入该类型以在客户端使用。由于编译 Typescript 代码时会自动删除类型,因此不会向客户端捆绑包添加额外的代码,也不会减慢类型检查器的速度。只需输入安全即可。
它来自一篇从 GraphQL 切换到 tRPC 的真实案例的帖子,其中详细阐述了 GraphQL 和 tRPC 之间的比较。
反思有一点我需要承认,虽然我一开始确实考虑过使用 tRPC,但最终我没有使用它。
原因之一是,既然 Prisma 已经为后端生成了 CRUD,为什么不进一步生成前端查询呢?
另一个原因是,与 GraphQL 相比,客户端无法选择要获取的字段。
我最终使用了新的工具包 ZenStack:一个使用 Next.js + Typescript 构建安全 CRUD 应用程序的工具包。您将获得架构中定义的每种数据类型的类型安全挂钩,而无需定义 API。此外,由客户决定结果。
查看我用于构建 SaaS 应用程序的实际堆栈:
16de472c-e04f-415f-aa30-a7834e6dd42f-image.png
04a0e3c4-bb60-4808-ad66-9bad27844505-image.png
90a752e1-57d2-4888-bc7a-75e38031b9c4-image.png
这份数据表呈现了一系列经济指标及其变化,涵盖了货币、股市、国内生产总值(GDP)增长率、失业率、通货膨胀率、利率、存款准备金率、贸易差额、经常账户余额、政府债务、政府预算、商业信心、制造业和非制造业采购经理人指数(PMI)、服务业PMI、消费者信心指数、零售销售、以及税率等多个方面。
从这些数据中可以观察到几个关键点:
货币与股市:货币相比前次数据有所贬值,股市则上升,表明投资者对市场的信心可能有所增强。 GDP增长率:国内生产总值的增长率和年增长率都有所提高,说明经济正在增长。 失业率有所下降,但变化幅度不大,表明就业市场相对稳定。 通货膨胀率:月度通货膨胀率出现下降,年度通货膨胀率则显著低于前次数据,表明物价水平的增长放缓。 利率与存款准备金率保持不变,这可能意味着中央银行正在采取稳健的货币政策。 贸易差额和经常账户余额显示出一定程度的波动,但仍需结合更多信息来分析其对经济的具体影响。 政府债务占GDP的比重上升,这可能增加了政府的偿债压力。 商业、制造业和服务业的信心指数相对稳定,表明企业对未来经济发展持谨慎乐观态度。 消费者信心指数微幅上升,表明消费者对经济前景的信心有所增强。 税率方面,企业所得税和个人所得税税率保持不变,显示出税收政策的稳定性。总体来说,这份数据反映了一个正在逐渐增长且相对稳定的经济环境,但也提示了一些潜在的挑战,如政府债务水平的上升和贸易差额的波动。对政策制定者而言,可能需要关注通货膨胀率的变化、维持就业市场的稳定以及控制政府债务水平,以支持经济的持续增长。
动画与物理是动画与系列的第九部,也是动画与教育系列的第二部。
概要 阴谋 经典物理学在“动画与数学”之后,动画以“第二次降临”漂浮在太空中开始,然后落到白色地板上。第二次降临行走时,底部会出现一条距离线,指示他走了多少米,紧接着顶部会出现一个速度矢量,以米/秒为单位计算他的速度。第二次降临在距离线上轻击了几下,然后出现一条位移线,显示他已经走了多少米。
由于摩擦,第二次降临最终会走进“湿滑的地板”。然后,他从夜空中似乎有一颗星星以绳子和球的形式得到了帮助。他抓住一根绳子并用它来抓住一个球。他将球和绳子变成套索,并利用线性动量推动自己前进。他能够毫不费力地滑行,直到他看到前面有一个更大的球。他无法阻止自己前进的脚步,结果却撞上了。
大球滚到陡峭山谷的边缘,中间有一棵树。一根绳子从山谷的另一边垂下来。第二次降临轻轻推了球一下,球就从斜坡上滚下来,滚到另一边,它的能量刚好足以到达另一边。他尝试了同样的事情,用套索作为抓钩,将其固定在树枝上。他往下滑,但由于他不是从上面开始,所以他的动力和能量不足以到达另一边。
他到达了绳子并返回到起始位置,在那里他给了自己一点额外的推力。这足以到达另一边,他收起绳子,看到一枚火箭漂浮在他上方。他思考如何到达那里,但绳子和更大的球给了他一个想法。他将绳子绕在球上,然后带着球滑下斜坡。他回到另一边,爬上树,踩上一根树枝,然后像跳水板一样跳上去。他把绳子绑在树枝上,并将球推得更远一点,将绳子牢牢地固定住。他站在上面,用力推了推它。它像弹射器一样将树枝拉下来,而第二次降临则以一种离心力围绕它旋转。他加速并放手,将自己直接发射到空中,冲向火箭。
天体物理学他轻轻一踢火箭,火箭就启动了,并缓慢加速。他发现一支火炬漂浮在真空中,并简要研究了光波的行为。火箭到达另一个恒星系统,并且发现自己被附近的一颗行星吸引,他改变了飞行器的轨迹,绕着行星的轨道飞行并转身离开。当他对其他两颗行星和恒星重复此操作时,该操作会呈指数级增加速度。
接下来,他遇到了一块小磁铁。他跳起来接住它,并用它把自己拉回到火箭上。他发现了一排巨大的磁环,将磁铁固定在火箭上,南极在前面。这会将火箭吸引到磁环的北极(面向第二次降临)。火箭在穿过每个环时都会加速,并最终离开银河系。
接近类星体时,第二次降临会穿过吸积盘到达中心,直到绕黑洞运行。一个苹果从黑洞的奇点扔向他,然后又落回原处。他从早些时候的黑洞内看到了这个闪亮的物体,然后将火箭俯冲到这个目标上。在里面,他点燃了手电筒,发现黑洞的巨大引力也会影响光(这在标题“外部视角”中显示,显示了当简笔画接近事件视界时,观众看到的“第二次降临”图像发生了扭曲)。随着他越陷越深,引力将他拉长(意大利面条化)。他接住了苹果,但尺寸逐渐缩小,穿过苹果的细胞和分子结构,直到到达亚原子。
亚原子、弦理论和时间旅行第二次降临穿过原子核和形成质子的夸克,收缩到世界片以下到时间之外的水平,在那里粒子由弦形成。在那里,他发现了以前的帮助的来源:它来自未来的自己。未来的第二次降临邀请现在的第二次降临观看他们过去的自己,扔下打开和闭合的绳子作为绳索和重球,以及火箭、其他工具和苹果。
未来版本将世界线滚动为蒂普勒圆柱体,使他们的时间观念倒退,展示现在的第二次降临在他过去的自我到来之前建造宇宙。未来的第二次降临然后前进到绕黑洞运行的过去的第二次降临。现在的第二次降临会掉落苹果,将第二次降临引诱到黑洞中。未来的二次降临拿起苹果,再次将其掉落,并指向过去的二次降临从世界纸上掉下来。然后他拿走了现在的第二次降临的牛仔帽并消失了。
原文: https://animatorvsanimation.fandom.com/wiki/Animation_vs._Physics
1.Inpaint(图片修复、放大)工具下载:https://www.freedidi.com/12226.html
2.高效的网站克隆软件:https://www.freedidi.com/12234.html
3.免费强悍的视频播放器:https://www.freedidi.com/12241.html
4.非常棒的图片编辑软件:https://www.freedidi.com/12250.html
5.Google Earth Pro 版:https://www.freedidi.com/12255.html
mall项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现,采用Docker容器化部署。 前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。 后台管理系统包含商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。
evershopOpen-Source NodeJS Ecommerce Platform
NodeJS ecommerce platform with essential commerce features
Built with React, modular and fully customizable
React Storefront - 用于电子商务的 PWA。 100% 离线、平台无关、无头、支持 Magento 2。始终开源,Apache-2.0 许可证。加入我们作为贡献者 (contributors@reactstorefront.io)。
Azon ShopE-Commerce website with Prisma PlanetScale db, optimistic updates with React Query, rating system, persistent cart, algolia search, categories, in stock indicator, infinite scroll and order tracking
skateshopAn e-commerce skateshop built with everything new in Next.js
Buy and sell skateboarding gears from independent brands and stores around the world with ease
Fullstack Next.js E-Commerce made with NextAuth + Prisma, Docker + TypeScript + React Query + Stripe + Tailwind Sentry and much more 🛒
web 全栈 create-t3-appThe best way to start a full-stack, typesafe Next.js app
ShipA toolkit for makers to ship better products faster 🚀
制造商可以更快地🚀交付更好的产品的工具包
Pet overlay app built with tauri and react that lets you have adorable companion such as pets, anime characters on your screen.
a21a4fb3-686c-454a-9442-f96bccc65188-image.png
An open world, open source voxel RPG inspired by Dwarf Fortress and Cube World. This repository is a mirror. Please submit all PRs and issues on our GitLab page.
AI Flutter flutter-chat-craft出海第一步,搞定工具库。 https://chuhai.tools/
本仓库只收录独立开发者出海技术栈和工具,持续整理中……
收录标准:
- 帮助独立开发者提升开发效率
- 帮助独立开发者降低成本
- 市场上足够流行
欢迎提 pr 和 issues 更新。
Web 开发模板 模板 特性 smart-excel-ai(免费) Next.js。集成了登录、支付(lemon squeezy)、AI功能 Opensaas(免费) React + Node.js。集成了登录、支付(stripe)、邮件、AI功能 Shipfast(付费) Next.js。集成了登录、支付(stripe)、邮件、AI功能 Chrome 插件开发模板 模板 特性 Plasmo 支持 React、Vue 等多种前端框架 wxt.dev 支持 Vue、Svelte 等多种前端框架 Landing Page 模板 平台 备注 tailsc 提供了很多组件,开发者:推特@zissy_w、Github@ZissyW landing-page-boilerplate 开源、免费、0设计资源的模板 技术栈与工具推荐 前端 技术栈 备注 Next.js🌟 基于 React,附属学习教程:Next.js Practice Remix 基于 React,Next.js最大竞争对手 Nuxt 基于 Vue 后端 技术栈 备注 Nest.js 基于 Node.js Midway.js 基于 Node.js 数据库 技术栈 备注 Supabase🌟 支持数据库、文件存储、登录鉴权 Upstash🌟 支持 Redis、kafka、向量数据库 Mongodb Mongodb 官方提供一个免费数据库 Realm SQLite 的快速、可扩展的替代方案 TiDB Cloud 兼容 Mysql 的 TiDB serverless,支持高可用,5G以内免费 ORM 技术栈 备注 Prisma🌟 TypeORM 样式与UI库 技术栈 备注 Tailwind CSS🌟 Shadcn/ui🌟 NextUI🌟 radix-ui Framer Motion 动效库 Responsive Viewer chrome 插件。可以一键验证多端响应式布局状态 原型设计 平台 备注 v0 Text to UI, 免费用户有 200 Credits / 每月 vx.dev Text to UI, v0.dev的开源替代品 https://framer.com/ 一个设计你的网站的网站,framer-motion就是他们的 usegalileo Text to UI, 免费用户有 200 Credits saaslandingpage <br/> framer landing page landing page / 落地页 登录鉴权 技术栈 备注 Clerk🌟 Supabase PostgreSQL数据库、文件存储、登录鉴权 Lucia 登录鉴权 Next-Auth v4 Next-Auth v5 v5 配置和 v4 不同,请注意区分<br> v5 Demo Logto 登录鉴权,有云端版和开源的私有化部署版 支付 技术栈 备注 Lemon Squeezy🌟 支持个人香港卡、虚拟卡,国内开发者首选 Stripe 需要企业资质 邮件 技术栈 备注 Resend Nodemailer React Mail 网站分析 平台 备注 Google Analytics Plausible Umami 开源可自部署 Clarity 微软出的分析工具 AITDK Extension 🌟 Chrome 插件。网站 SEO 分析工具 在线客服和反馈服务 技术栈 备注 Tawk 在线客服,中国地区可注册 腾讯兔小巢 产品反馈平台,面向国内提供服务可使用 部署与托管 平台 备注 Vercel🌟 首选,国内大部分访问不了 Aircode 字节跳动出品 Zeabur 国内出海团队出品,作者:@MichaelYuhe Railway 国内也可直接访问 Github Pages 免费 Cloudflare Pages 阿里云服务器 <br> 腾讯云服务器 国内云,经常有优惠 域名购买 平台 备注 Namesilo🌟 自动屏蔽whois Namecheap 据说比较便宜 Godaddy 狗爹,懂的都懂 Cloudflare 阿里云 <br> 腾讯云 <br> 字节火山引擎 国内平台,cn域名首选平台 文档管理 平台 备注 Notion VitePress Vite & Vue 驱动的静态站点生成器 Astro Starlight 建立在 Astro 框架之上的全功能文档主题。<br>Astro 团队成员与中文文档翻译者:@liruifengv logo 平台 备注 iconbuddy logo 设计 iconray logo 设计 logodiffusion 生成你的logo icon horse logo 探测 favicon generator 生成多平台多种类logo(ico、PNG、SVG) bit bug PNG/JPG 转 ico 图标库 平台 备注 iconbuddy fontawesome MingCute iconify 图片视频素材 平台 备注 vectorove 完全免费,风格统一的插画库,支持预定义颜色以及png和svg格式导出 图片视频处理工具 平台 备注 Tinypng 图片压缩 Tinify 图片压缩 - 国内版 video-to-gif 视频转 GIF 录屏 平台 备注 focusee Screen Studio OBS Studio 开源、windows、mac、linux 短链 平台 备注 dub 免费用户每个月可以创建25个链接 信息渠道 平台 备注 Product Hunt 新产品打榜聚集地 Hacker News Indie Hackers w2solo 中文独立开发者社区 出海团 专注于分享优秀出海产品的拼团平台 产品发布提交 平台 备注 Product Hunt 新产品主打阵地,发布后其他导航站回来爬取,首选发布地 Hacker News 发布注意要写软文,否则容易被删帖 PoweredByAI 免费提交产品 Pinterest 发布视频频道也会被Google收录(免费)开源的 Node.js 和 TypeScript ORM,具有直观的数据模型、自动迁移、类型安全、以及自动补齐。
Stripe为各种规模的商家提供线上和线下支付处理和金融解决方案。使用一套API 和无代码工具接受付款、发送提现并自动化财务流程
Clerk最全面的用户管理平台
需要的不仅仅是一个登录框? Clerk 是一套完整的嵌入式 UI、灵活的 API 和管理仪表板,用于验证和管理您的用户。
Algolia 是一家美国的创业公司,他们提供了很容易使用的搜索引擎的服务,让开发者可以快速对站内内容进行检索和搜索。
NextAuth.jsNextAuth.js is a complete open-source authentication solution for Next.js applications.
It is designed from the ground up to support Next.js and Serverless.
cloudinaryCloudinary's Programmable Media is a software–as-a-service (SaaS) solution for developers. Programmable Media provides APIs that enable you to automate the entire lifecycle of your image and video assets via these functional areas:
Resendemail system
uploadthingSpecify if you want image uploads
loglib Upstash liveblocks upstash liveblocks biomejs planetscale openweathermap我们提供高度认可的天气产品,使天气数据的处理变得更加容易。我们与数百万开发人员全天候合作,相信这些优势可能适合大多数应用程序,甚至复杂的企业系统。
前端有很多小而美的库,接入成本很低又能满足日常开发需求,同时无论是 npm 方式引入还是直接复制到本地使用都可以。
2024年推荐以下小而美的库。
radash实用的工具库,相比与 lodash,更加面向现代,提供更多新功能(tryit,retry 等函数),源码可读性高,如果不想安装它,大部分函数可以直接复制到本地使用。
c5ecdff1-cdfc-417f-b60b-fa4b5258bce5-image.png
use-debounceReact Hook Debouce 库,让你不再为使用防抖烦恼。库的特点:体积小 < 1 Kb、与 underscore / lodash impl 兼容 - 一次学习,随处使用、服务器渲染友好。
06eccbd9-d1fa-4a1c-ad02-0b33425cea2e-image.png
格式化日期时间库,比如:“3 hours ago”,支持多语言,仅 2Kb 大小。同时提供了 React 版本 timeago-react。
timeage.format(1544666010224, 'zh_CN') // 输出 “5 年前” timeage.format(Date.now() - 1000, 'zh_CN') // 输出 “刚刚” timeage.format(Date.now() - 1000 * 60 * 5, 'zh_CN') // 输出 “5 分钟前” timeage.format(1544666010224, 'zh_CN') // 输出 “5 年前” timeage.format(Date.now() - 1000, 'zh_CN') // 输出 “刚刚” timeage.format(Date.now() - 1000 * 60 * 5, 'zh_CN') // 输出 “5 分钟前” react-use实用 Hook 大合集 - 内容丰富,从跟踪电池状态和地理位置,到设置收藏夹、防抖和播放视频,无所不包。
d67da994-a01a-4b7d-a257-c8d09c497dc5-image.png
Day.js 是一个简约的 JavaScript 库,仅 2 Kb 大小。它可以使用基本兼容 Moment.js,为你提供日期的解析、处理和显示,支持多语言能力。
3e17a98d-6cd9-46fe-b2e9-058fce20a31f-image.png
filesize.js 提供了一种简单方法,便于从数字(浮点数或整数)或字符串转换成可读性高的文件大小。
import {filesize} from "filesize"; filesize(265318, {standard: "jedec"}); // "259.1 KB" driver.js:driver.js 是一款用原生 js 实现的页面引导库,上手非常简单,体积在 gzip 压缩下仅仅 5kb。 import {filesize} from "filesize"; filesize(265318, {standard: "jedec"}); // "259.1 KB" driver.js:driver.js 是一款用原生 js 实现的页面引导库,上手非常简单,体积在 gzip 压缩下仅仅 5kb。 driver.jsdriver.js 是一款用原生 js 实现的页面引导库,上手非常简单,体积在 gzip 压缩下仅仅 5kb。
8b4d186e-4740-471a-898e-0863429909e1-image.png
FormKit DnD 是一个小型库,它简单、灵活、与框架无关,压缩后只有 4Kb 左右,设计理念为数据优先。
bd0e4a27-13f5-4da1-8883-da2175579955-image.png
玩手机对孩子的大脑会有哪些影响
脑白质(髓鞘)异常
多巴胺
催产素
内啡肽
皮质醇
血清素