<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>折乙</title><description>blog</description><link>https://zheyi.in/</link><language>zh_CN</language><item><title>从2.3到3.6绩点, 我做了什么 一个计算机学生大二上期末考后的一些思考</title><link>https://zheyi.in/posts/%E6%A0%A1%E5%9B%AD%E6%9D%82%E8%B0%88/semester2term1finalexam/</link><guid isPermaLink="true">https://zheyi.in/posts/%E6%A0%A1%E5%9B%AD%E6%9D%82%E8%B0%88/semester2term1finalexam/</guid><description>纯标题党, 以及其实这学期这考的也挺低的呜</description><pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本文未经任何AI润色, 如有错别字,语病等问题, 我心情好就改&lt;/p&gt;
&lt;h1&gt;闲话&lt;/h1&gt;
&lt;p&gt;正如我的副标题所言 标题是瞎扯的, 不过倒是事实; 2.3的绩点我大一下的学期绩点; 那学期我刚转完专业飘了,以及当时觉得自己不可能用的上绩点了, 压根没好好上过几门课 期末考也瞎考的所以考得差; 3.6则是本学期(大二上)的学期绩点 &lt;s&gt;其实完全没达到我预期目标 好烂啊喂&lt;/s&gt;;&lt;/p&gt;
&lt;p&gt;原本我是抱着证明我 &lt;code&gt;想做的话什么都能做到的哦, 就算是保研什么的 也只是我选择了不去追求而已&lt;/code&gt; 的心理, 想这学期考个超高分, 结果给两三门平时好好学的课背刺了 掉的就剩这点了&lt;/p&gt;
&lt;p&gt;不过这学期也是我大学一年多以来在学业上最努力的一学期了, 想稍微记录一下自己的辉煌&lt;s&gt;虽然也没多辉煌&lt;/s&gt;, 另一方面是想分享下学习方法&lt;/p&gt;
&lt;p&gt;嘛 众所周知呢, 在大学里绩点4.0+的一大把, 也就是我这点成绩压根没啥好炫耀的, 那为什么我还要写这篇文章呢?&lt;/p&gt;
&lt;p&gt;首先, 虽然考得好的人多, 但是同时会愿意主动分享学习方法的也没几个; 在此之上, 会分享学习方法又会写文章记录的更少了; 就算有 也不一定和你一个专业;&lt;/p&gt;
&lt;p&gt;另外 虽然我有的科考得差 但我也有的考得好啊, 抛开考得差的科目我每一科都考得很好!&lt;/p&gt;
&lt;p&gt;考得差的科目我少说几句不就是了, 哎哎&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/source-of-blog/blog-8%20S2T1FE/Screenshot_20260207_095825.webp&quot; alt=&quot;1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;另外，平时分怎么刷我不讲 怎么让数字性质的人体在课堂而物理性质的人体不在课堂也不可能讲&lt;/p&gt;
&lt;h1&gt;方法类总述&lt;/h1&gt;
&lt;p&gt;首先我觉得我没什么学习的才能, 我考得好的科目大家花像我这么多的时间并且用对地方肯定也能考很好; 而且我一个期末一共考了10门(因为转专业补课多考了3门 程序设计基础C, 离散数学, 线性代数),
正常考的不像我这么多平均每门课会有更多的时间来复习 绩点自然更高;&lt;/p&gt;
&lt;p&gt;我也自知没有速成的才能, 所以对期末考的准备从&lt;code&gt;14周&lt;/code&gt;就开始了(包括学还没学的科目), 我的期末考期间因为考的科目多没有多少额外复习的空闲时间&lt;/p&gt;
&lt;p&gt;众所周知刷卷子是很重要, 我那时候就印了两本试卷(最后大概做了一半)&lt;/p&gt;
&lt;p&gt;(图为其中一本)
&lt;img src=&quot;/source-of-blog/blog-8%20S2T1FE/81be1bb4daf97d2e5df91261f7154243.webp&quot; alt=&quot;2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;既然要&lt;code&gt;刷卷子&lt;/code&gt; 那哪里找卷子呢?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;老师钉钉, Q群, 微信群直接发的&lt;/li&gt;
&lt;li&gt;学习通对应课程的&lt;code&gt;学习资料&lt;/code&gt;, 如高数,大物都可以从这找到&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/zjutjh/zjut-icicles&quot;&gt;浙江工业大学课程攻略共享计划&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;找学长学姐要&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;卷子除了思政类这种感觉刷了题也没啥用的, 一定要每科都搞到几套; 相信自己认识的学长学姐一定是有的, 扯下脸皮向他们要, 他们一般都是愿意帮助你的, 毕竟每个人都这么过来的 &lt;strong&gt;学长学姐也是被他们的学长学姐帮助着过来的&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;复习大纲之类的 除非确定是能限定考试内容的(如思政类) 不然感觉没什么必要性, 你直接网上找复习材料也一样用&lt;/p&gt;
&lt;p&gt;理想情况我觉得应该预留一周专门用来刷卷子, 在此之前把所有科目都学完, 我的情况最后就剩了半周, 因为突然发现写&lt;strong&gt;数据结构课设&lt;/strong&gt; 和 &lt;strong&gt;计网课设&lt;/strong&gt; 花了很多时间, 有几个科目最后变成了考前一两天突击复习和刷卷子 所以考烂了&lt;/p&gt;
&lt;p&gt;部分理工科学习部分就是靠Gemini+看课本+b站搜点辅助视频 来自学全部内容,
个别是纯上课学的, 计网是跟b站课学的&lt;/p&gt;
&lt;p&gt;期末复习阶段除了两个思政类科目, 总的复习思路都是
刷卷子找不会的→问Gemini or B站上搜相关视频来学会 →再做相关题目&lt;/p&gt;
&lt;h1&gt;85+科目经验分享&lt;/h1&gt;
&lt;p&gt;按成绩从高到低讲吧; 其实我觉得没到90的科目都不算考得好 大概看点学习思路就行&lt;/p&gt;
&lt;h2&gt;程序设计C&lt;/h2&gt;
&lt;p&gt;容我skip;
这学期会考这门是因为转专业补课; 我一个大二上考这成绩只能说正常, (主要是我压根没学)&lt;/p&gt;
&lt;h2&gt;数据结构&lt;/h2&gt;
&lt;p&gt;91&lt;/p&gt;
&lt;p&gt;首先我很惊讶我很这么高, 不是因为我学的不好, 是这卷子出的确实太难了&lt;/p&gt;
&lt;p&gt;虽然我觉得老师发的模拟卷是有点简单了吧, 不过这神秘的考卷题量大抵是模拟卷的两倍, 我考试的时候一拿到就一直写写到考试结束, 大题全是画图和手写代码; 最后还险些选填忘抄到答题卡上,  还好我以高考锻炼出来的紧急手速, 在肾上腺素加持下以自己都难以相信的手速写下狂草, 填空题有两三空抄出来的我自己都看不懂 百分百是要被算错的, 考完试出来&lt;strong&gt;双腿发抖&lt;/strong&gt;都没力气骑自行车回宿舍了&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;言归正传 讲下我怎么学的&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;一学期下来的学习进度大概如下&lt;/p&gt;
&lt;h3&gt;开学1~5周 就实验跟着写了课没另外学&lt;/h3&gt;
&lt;p&gt;有一说一数据结构实验自己写感觉还是有用的, 毕竟是实实在在的学代码的东西&lt;/p&gt;
&lt;p&gt;花费时间约&lt;code&gt;9h&lt;/code&gt;, 每次实验1~2h, 偶尔上课有假装听一听(&lt;/p&gt;
&lt;h3&gt;6~8周期中考备考 认真学了学, 期中考考86&lt;/h3&gt;
&lt;p&gt;这感觉是一门学科考好的基本了, 期中考都考烂了期末考拉回来有点难; 一方面会丢了好几分, 一方面你自己估计都不信自己能学好了, 再一方面期末复习的量会大大增多;&lt;/p&gt;
&lt;p&gt;复习材料就对着课本自学, 把相关问题问了问gemini, 然后再刷了点王道的数据结构书&lt;/p&gt;
&lt;p&gt;时间约为&lt;code&gt;9h&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;9~13周&lt;/h3&gt;
&lt;p&gt;基本没学 还是就写写实验, 个别一两个实验还不是自己写的&lt;/p&gt;
&lt;p&gt;少于&lt;code&gt;7h&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;14~16 期末复习~~(学习·)~~&lt;/h3&gt;
&lt;p&gt;学完课本剩余内容大概花了&lt;code&gt;9h&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;学习方法&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;课本+gemini答疑&lt;/li&gt;
&lt;li&gt;看B站视频&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;/source-of-blog/blog-8%20S2T1FE/Pastedimage20260204211706.webp&quot; alt=&quot;5&quot; /&gt;
推荐此UP这一系列视频, 主要是方便一个知识点一个知识点的碎片的学, 不用从头跟到尾, 以及数据结构动画非常方便理解&lt;/p&gt;
&lt;p&gt;另外复习的时候要注意要把各类数据结构的经典例题看一眼, 你可以不做, 但是得看一眼;
因为数据结构题目会用到的一些的专有术语, 题目想要你做的事情你没看过是不明白的;&lt;/p&gt;
&lt;p&gt;学完所有课本要求的数据结构和算法, 再稍微看眼例题后能不能考好就看你的代码水平了;
数据结构相关画图题很多你也不用刷过, 相关的知识点会考场上就能推; 代码题也是如此&lt;/p&gt;
&lt;p&gt;写卷子+复习约&lt;code&gt;5h&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;复习完全可以看王道的数据结构考研书&lt;/p&gt;
&lt;p&gt;&lt;code&gt;科技传播叙事与话语博弈是通识课 skip; 另外 不对英语和国际事件感兴趣别选这门课&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;大学物理II B&lt;/h2&gt;
&lt;p&gt;89&lt;/p&gt;
&lt;p&gt;好好听课的几门课里唯一一门坚持与努力得到回报的科目&lt;/p&gt;
&lt;p&gt;因为这门课一半多学习时间都是上课学的 这里主要讲下我对于上课好好听和&lt;strong&gt;期末考考好&lt;/strong&gt;之间的关系的思考&lt;/p&gt;
&lt;p&gt;前面的数据结构就是经典的自学出来的成绩&lt;/p&gt;
&lt;p&gt;另外两门我上课好好听的了是&lt;/p&gt;
&lt;p&gt;&lt;code&gt;离散数学 82(本学期考的第11好的科目)&lt;/code&gt; , `线性代数B 79(本学期考的第13好的科目)&lt;/p&gt;
&lt;p&gt;这两科真的气煞我也, 出了分后让我只得哀叹 这b课以后再也不听了!
不过冷静下来反思为什么考得差 其实就觉得合理了&lt;/p&gt;
&lt;p&gt;首先我上课好好听了, 所以好好上课让我我很好的完成了应试的第一步 学会知识; 但是这不意味着我很好的完成了应试的第二步, 学会做题;&lt;/p&gt;
&lt;p&gt;这两科平时的作业量很少, 只能是掌握题型怎么做的地步; 虽然期末也都有做一套卷子(才一套), 但是总的刷题量不多, 而且零零散散的, 我也没去回顾; 相比起来呢, 其他自学的科目虽然知识的掌握没那么好, 但是我应试刷的到位啊;  不得不品的会了不等于能考好&lt;/p&gt;
&lt;p&gt;大物的关键在于平时作业量算充足, 并且是练习册形式的, 非常方便复习; 事实上我约15周就过了一遍大物, 后面考试再复习了一遍 也是相当游刃有余了&lt;/p&gt;
&lt;p&gt;那么这里就提出大物很好的一种学习方案, 因为平时你不得不要做练习册, 所以你可以把80%的刷题量就压在这练习册上, 期末再复习练习册 达到确实掌握就可以了;
练习册平时做不明白的话 Gemini2.5Pro同水平或往上的AI可以解答的清清楚楚的;
不过平时没做练习册的话期末就不要再去看了, 很多题型不考而且难度偏高 不如直接做卷子&lt;/p&gt;
&lt;p&gt;大物自学起来不算方便, b站也没有看到非常优质的速成视频之类的; 真要自学感觉也只能自己看书, 问问AI, 然后直接往年卷上找对应题型, 因为大物的卷子是公开的 , 我的大物老师就直接放在学习通里, 量也完全够刷;&lt;/p&gt;
&lt;p&gt;还有一点提一下, 大学物理期末考上有些平时学的很难的是不会考的, 老师好的话会和你说大概哪些会考哪些不考(练习册上有些题也不考, 你写的时候应该就有感觉这怎么这么难了)
所以很多章节只要记住几个核心公式就行 如德布罗意波小节只要背$\lambda = \frac{h}{p}$, 不过我不是很想列出来(不然又要写1k字)&lt;/p&gt;
&lt;h2&gt;Java程序设计&lt;/h2&gt;
&lt;p&gt;88&lt;/p&gt;
&lt;p&gt;这真是我临阵突破出来的成绩; 众所周知呢浙工大Java考试是一页开卷考; 此外Java考试又不能真指望你学多深, 所以大部分东西浅浅的过一遍然后不会的抄到开卷纸上就行了;&lt;/p&gt;
&lt;p&gt;简单来说就是考前对考试内容(课表 or PPT) 从头到尾过一遍, 边过边把不会的抄到开卷纸上, 过完一遍再刷两套卷子(Java卷子有点难找 看你手段了)&lt;/p&gt;
&lt;p&gt;我就是考前晚上从20:00边过课本边抄开卷纸到1:30然后看了两张卷子, 也就是复习花了&lt;code&gt;6h&lt;/code&gt;,
平时也稍微有学一些, 花了大概&lt;code&gt;10h&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;另外还要注意Java写程序的大题比较麻烦, 比如手写线程题, GUI题, 都要求能写对应的代码, 所以我推荐专门给会考的几类大题记录对应代码(可以看我的第二页开卷纸来参考 主要是线程, GUI 流和文件 三类大题; 手写类相关的大题不用专门抄写大题代码也写得出来)&lt;/p&gt;
&lt;p&gt;以下是我的开卷纸 看了的也请别到处传 之前有一次在某位学长讲东西的时候有人在下面发弹幕: 折乙的博客上说xxxxx; 丢的是我的面子啊喂
&lt;img src=&quot;/source-of-blog/blog-8%20S2T1FE/f132bfb981e37422970b923d4d5c4f70.webp&quot; alt=&quot;3&quot; /&gt;
&lt;img src=&quot;/source-of-blog/blog-8%20S2T1FE/IMG_20260120_014221.webp&quot; alt=&quot;4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;不过我今年的考试程序题全考的手写类的题, GUI什么的都没有, 我也是白准备了; 但这显然不意味着以后不会考, 如果你消息灵通搞得到几张往年卷就会知道往年GUI和线程考的频率有多高了&lt;/p&gt;
&lt;h2&gt;计网课设 | 数据结构课设&lt;/h2&gt;
&lt;p&gt;计网课设88&lt;/p&gt;
&lt;p&gt;数据结构课设 优秀(95)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;两个课设简直是地狱口牙&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我的期末复习安排最失败的就是没想到写课设会花这么多时间; 两个课设每个平均花了我将近2天, 写一个课设的时间够我复习两遍Java了; 如果你是在期末周前看到这篇文章, 注意分配好写课设的时间, 别让课设毁了你的期末复习计划&lt;/p&gt;
&lt;h3&gt;计网课设&lt;/h3&gt;
&lt;p&gt;主要难点在于用Packet Tracer搭建网络集成设计这一个任务
&lt;img src=&quot;/source-of-blog/blog-8%20S2T1FE/Pastedimage20260205082231.webp&quot; alt=&quot;4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我搭建了一个模拟学校校园网环境的设计, 难点在于内外网之间的连接, 端口映射等,
用了&lt;strong&gt;NAT&lt;/strong&gt;, &lt;strong&gt;Web浏览器&lt;/strong&gt;, &lt;strong&gt;端口映射&lt;/strong&gt;, &lt;strong&gt;DNS&lt;/strong&gt;, &lt;strong&gt;ospf&lt;/strong&gt; 几个感觉可能是加分项的技术 (我的老师感觉挺按点加分的, 具体可以看下自己的老师然后问问学长学姐这个老师的风格)&lt;/p&gt;
&lt;p&gt;然后验收的时候就对着这个设计讲了七八分钟 老师中途没插嘴 就轻松通过了, 我说要申优(我老师会让想拿高分的自己提出来)老师也觉得没什么问题, 最后只拿了88估计是报告写太烂了(写起来真的好麻烦啊), 想报告也拿高分的可以找一份95+的往年学长学姐的报告来看&lt;/p&gt;
&lt;h3&gt;数据结构课设&lt;/h3&gt;
&lt;p&gt;我写的Avl树模拟 图书管理系统 , 90+% 的人的选择; 目前还没出分也不怎么能吹; 主要就是得有自己的优秀的点 验收的时候老师会比较关注&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;同计网具体看自己老师关注什么&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我提出来Avl树的比大小可以改造成多级比大小, &lt;strong&gt;依次比 分类, 作者, 标题&lt;/strong&gt;; 这样同分类,同作者的书就&lt;strong&gt;数据结构上天然的临近&lt;/strong&gt;, 不用刻意整理; 验收的时候老师看起来还是觉得有这么一个创新点不错的; 如果没这个创新点我就和其他人写的一样了 那肯定是拿不了多少分&lt;/p&gt;
&lt;h2&gt;毛概&lt;/h2&gt;
&lt;p&gt;87&lt;/p&gt;
&lt;p&gt;话说博客里写这东西应该不会出问题吧(?)
其实我想写全称的 不过感觉写出来更容易出事&lt;/p&gt;
&lt;p&gt;这分数又惊喜又失望; 首先我也是约等于考前几天临阵突破学的, 但是考试的时候明明感觉全都会的说, 怎么才这点&lt;/p&gt;
&lt;p&gt;毛概重点就完全不在刷题的, 会背确实就是拿得到分; 千万要把老师提的重点都背下来, 一般来说老师划重点的就是大概率要考的(如果划的重点不是很多的话)&lt;/p&gt;
&lt;p&gt;消息灵通的话你会找到很多往届的资料; 大多其实感觉也用处不大, 不用去搞一大堆, 有一两份辅助学习就行; 部分重点确实很准&lt;/p&gt;
&lt;p&gt;我这次所有毛概老师统一划了10个课本重点, 3个延伸点, 95%覆盖考试考点了; 而我之前就听往届学长说要好好把老师划得重点背下来 所以就基本都会背;
这种课真感觉为了提分的话听课的意义没多大, 很遗憾; 学的太深也没啥用, 反正背了就会&lt;/p&gt;
&lt;h1&gt;85-科目&lt;/h1&gt;
&lt;p&gt;考得差的科目我就稍微说说 大多其实我也好好学了的&lt;/p&gt;
&lt;h2&gt;马原&lt;/h2&gt;
&lt;p&gt;84&lt;/p&gt;
&lt;p&gt;考的应该不差 但是我平时分大抵烂了, 再多旷一次课期末考都要被禁止了;
另外我考前一天晚上把没学过的舍友教到七十多 所以我应该还是算会的&lt;/p&gt;
&lt;p&gt;虽然都是思政类不过和毛概也不完全一样; 马原我的老师压根没划重点, 而且感觉确实这个科目不好划重点; 知识都是自成体系的, 不像毛概那样一个个单独抽出来可以背&lt;/p&gt;
&lt;p&gt;个人感觉马原不好考前突破, 因为要学的实在太多了; 你需要老老实实的把会考的几章确实都学会才能考好&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我真不知道考前才背还能考好的到底有多天才, 相比起来我真的毫无才能&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;所以学习方案大概就是老老实实把每一个知识点都看懂, 然后记住; 马原不像其他思政类那样那么要死记硬背 理解了基本就会了&lt;/p&gt;
&lt;p&gt;觉得看课本|资料 实在看不下去可以看看这个系列视频&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV148izYpEMf/?share_source=copy_web&amp;amp;vd_source=e970904627a47198d9fad46da04134b7&quot;&gt;{爆肝制作}一口气看完马克思主义哲学&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这个链接只是哲学部分, 这个up也有做马原其他部分视频&lt;/p&gt;
&lt;p&gt;另外马原在我这届已经是全考大题的了, 有余力可以看眼大概怎么考(反正别浪费时间刷不会考的选择题)&lt;/p&gt;
&lt;p&gt;&lt;code&gt;体育skip, 概率论还真没好好学 skip, 离散数学和线性代数考太烂了不想讲skip&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;计网&lt;/h2&gt;
&lt;p&gt;82&lt;/p&gt;
&lt;p&gt;可以算最难的科目了, 学起来量确实很大; 考差了也没太多好抱怨的&lt;/p&gt;
&lt;p&gt;想用B站视频跟着学的话普遍选择就两个&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1NT411g7n6/?spm_id_from=333.1387.favlist.content.click&amp;amp;vd_source=90a1fb599bb5f5caeab5f4192ae1e503&quot;&gt;深入浅出计算机网络 微课视频_哔哩哔哩_bilibili&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1JV411t7ow/?vd_source=90a1fb599bb5f5caeab5f4192ae1e503&quot;&gt;中科大郑烇、杨坚全套《计算机网络（自顶向下方法 第7版，James F.Kurose，Keith W.Ross）》课程_哔哩哔哩_bilibili&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;只是想考好 看第一个, 主要是为了多学一些计网知识看第二个; 我看的第二个 花了非常多时间在不会考的知识上, 不过确实学了很多有用的 并不后悔&lt;/p&gt;
&lt;h1&gt;如何度过煎熬的期末周(月)&lt;/h1&gt;
&lt;p&gt;当然这个我只能讲讲我是怎么度过的了&lt;/p&gt;
&lt;p&gt;有一说一我觉得自己还算是努力的, 好歹连续两周坐在宿舍电脑前接近从早学到晚(不过全都是中等强度的学习)&lt;/p&gt;
&lt;p&gt;挂一张当时学习拍的照, 我是超级死宅, 学习都不愿意离开宿舍
&lt;img src=&quot;/source-of-blog/blog-8%20S2T1FE/91c80dcc3c4b6a35ac237bab27fcf0da.webp&quot; alt=&quot;alt text&quot; /&gt;
能坚持下来的技巧性的可分享的点有两个&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;吃巧克力&lt;/li&gt;
&lt;li&gt;朋友的陪伴&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;第一个换成自己喜欢吃的比较轻巧的东西; 期末考两周我吃了两盒巧克力,200+g,  平时我根本不会买巧克力, 因为太爱吃了绝对会忍不住一直吃, 但是期末考为了考好我愿意以胖一斤为代价, 解封两周的巧克力食用权 缓解压力用; 不过最后竟然没胖;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/source-of-blog/blog-8%20S2T1FE/image.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;第二个其实也决定了你复习的位置, 状态之类的;
我和朋友陪伴的形式是用&lt;code&gt;网易云一起听&lt;/code&gt;功能; 现在想起来还是觉得很温暖&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/source-of-blog/blog-8%20S2T1FE/Screenshot_20260113_172535.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;尾声&lt;/h1&gt;
&lt;p&gt;期末考最大的感受是&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;年轻人的脑子真好用!&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;啊呀 还没老真是太好了, 脑子目前还好用着 可以学很多很多东西&lt;/p&gt;
&lt;p&gt;三周我就能学十科, 假想我就算一直维持这个学习强度的80%, 那也非常不得了了;&lt;/p&gt;
&lt;p&gt;所以寒假我重新拾起了&lt;code&gt;日语学习&lt;/code&gt;, 另外还开始学&lt;code&gt;食品营养学&lt;/code&gt;;&lt;/p&gt;
&lt;p&gt;前者是兴趣, 后者是为了活的健康; 有着这么强的学习力, 多学些东西多好, 感觉其实不用怕学不过来; 经历期末月的狂风暴雨才发觉学这点东西不过是柔和的细雨&lt;/p&gt;
&lt;p&gt;关于这两部分的学习, 其实还想说挺多的, 不过感觉再在这篇文章里写更多东西也不好 这些内容也与本文主题无关, 况且写博客也挺累的 摆咯&lt;/p&gt;
</content:encoded></item><item><title>SSR篇1-从认识渲染方式到简单的SSR问题</title><link>https://zheyi.in/posts/%E5%89%8D%E7%AB%AF/ssr1/</link><guid isPermaLink="true">https://zheyi.in/posts/%E5%89%8D%E7%AB%AF/ssr1/</guid><description>终于挤出时间写篇博客了, 后续大概率会更SSR-2 ,3 (吧)</description><pubDate>Sun, 09 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;唠叨&lt;/h3&gt;
&lt;p&gt;上一篇博客 (9月末) 的时候, 本人在写Nuxt 操作localstorage的时候遇到了一个问题, 起初以为是代码设计的问题, 后来发现是需要避免的 &lt;code&gt;水合(Hydration)问题&lt;/code&gt;。
当时其实就挺想写一篇文章的, 不过无奈现实生活的繁忙 加上才疏学浅, ssr的水又太深 得花大精力研究我才能写出一篇文章。就拖到现在才写一小篇。悲&lt;/p&gt;
&lt;p&gt;一开始我研究 &lt;code&gt;水合问题&lt;/code&gt; 我想着就解决水合问题是什么就行了, 然后随便总结几个可能触发水合问题的情况。 后来再看, 水合问题是 &lt;code&gt;SSR(Server Side Rendering)&lt;/code&gt; 和 &lt;code&gt;SSG(Static Side Generation)&lt;/code&gt; 两种 &lt;code&gt;渲染方式(Rendering Patterns)&lt;/code&gt; 共有的一种问题, 那我也得搞懂SSR和SSG是什么, 不然无法理解为什么要水合, 以及水合到底是在干什么。 那要理解SSR和SSG, 我又得知道渲染方式是什么 现在大概有哪些渲染方式......&lt;/p&gt;
&lt;p&gt;所以那也只能原谅我了吧, 原谅我拖了这么久才写出这一小篇文章&lt;/p&gt;
&lt;p&gt;不过虽然我好像关于SSR和水合问题没多少经验, 但回头一算我竟发现自己已经接触了三个带SSR的项目 (算上我的博客,它是Astro的孤岛渲染方式, 我对博客也改造过)。 那看来我应该还是有底气写好文章的吧。&lt;/p&gt;
&lt;h1&gt;概念引入&lt;/h1&gt;
&lt;p&gt;从知识体系的层层递进来说吧, 我应当先说什么是渲染方式再说下什么是SSR再说什么是水合问题...&lt;/p&gt;
&lt;p&gt;不过这可真是条长路, 那就先非常笼统的讲下几个核心名次概念(&lt;code&gt;渲染方式&lt;/code&gt;, &lt;code&gt;SSR&lt;/code&gt;), 再容我用简单的例子来让大家基本的理解理解SSR和水合问题,能明白几个简单的SSR报错情况, 之后再谈对SSR什么的深刻理解吧。&lt;/p&gt;
&lt;h2&gt;从渲染说起吧&lt;/h2&gt;
&lt;p&gt;渲染指的是从三件套代码变为具体的页面的过程 这里我对于其具体含义掌握也不深, 直接放一段gemini的解释。总的来说你需要理解渲染是比较耗时的, 是有一定成本的, 所以我们才会有不同的渲染方式&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/source-of-blog/blog-7%20ssr1/Snipaste_2026-03-04_14-33-23.webp&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;SSR —— Server Side Rendering —— 服务端渲染&lt;/code&gt;, 是一种渲染方式, 渲染方式描述的是: 浏览器是如何把你写的前端代码渲染成网页; 以下我举例两个读者大概率接触过的渲染方式&lt;/p&gt;
&lt;h3&gt;静态渲染&lt;/h3&gt;
&lt;p&gt;比如你直接写个&lt;code&gt;Hello.html&lt;/code&gt;文件 然后跑起来, 那么采用的就是&lt;code&gt;Static WebSites——静态渲染&lt;/code&gt;, 就啥也不操作, 纯纯把你的&lt;code&gt;Hello.html&lt;/code&gt;搬到浏览器上让浏览器把他渲染出来就完成了。
那么如果你想要分页面, 你就应该在url里写 &lt;code&gt;/page1.html&lt;/code&gt; ,&lt;code&gt;/page2.html&lt;/code&gt; 通过切换访问的文件来切换页面&lt;/p&gt;
&lt;h3&gt;客户端渲染&lt;/h3&gt;
&lt;p&gt;相对应的比如说我们直接用&lt;code&gt;npm create vue@latest&lt;/code&gt; 创建一个新的Vue项目, 那么它的渲染方式默认就是 &lt;code&gt;CSR - Client Side Rendering - 客户端渲染&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;在一个CSR的前端项目里, 服务器返回的html一开始只是一个空壳, 后续再由js动态的去在这个html里生成页面内容;&lt;/p&gt;
&lt;p&gt;如vue里就是给你一个&lt;code&gt;&amp;lt;div id=&quot;app&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt;, 你所写的所有.vue文件, 都是通过js操作来嵌到前面那个id为app的div里, 进而展示内容的; 在这里呢, js和html始终都是一体的&lt;/p&gt;
&lt;h1&gt;服务端渲染&lt;/h1&gt;
&lt;p&gt;通过上面两种大家熟悉但是不知道名字的渲染方式, 相信大家已经对于浏览器&lt;code&gt;渲染&lt;/code&gt;这一操作有了一定的理解了吧。 接下来来到重头戏&lt;code&gt;SSR(服务端渲染)&lt;/code&gt;了&lt;/p&gt;
&lt;p&gt;那么经常改造自己博客的朋友们都知道, 一般来说博客都是采用 ssr来渲染的 (Hexo是纯静态); 它的具体渲染逻辑,
简单来说就是 &lt;strong&gt;在服务器上预先把页面渲染成完整的 HTML 字符串，然后返回给浏览器, 之后再想办法把js代码嵌到HTML上(实际表现为接管已经渲染好的DOM节点)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;相比于CSR呢, 比如说如果你的博客采用CSR, 那么在用户进入博客的时候, 服务器传给用户的会是一个的空壳, 然后浏览器再运行服务器传来的js代码, 在空壳里渲染;&lt;/p&gt;
&lt;p&gt;而如果用SSR, 那么服务器会直接把完整的&lt;strong&gt;预先&lt;/strong&gt;渲染好的博客首页内容以&lt;strong&gt;带内容的HTML文件&lt;/strong&gt;的形式传过来, 用户不用再去渲染; 也就是说&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;首屏加载速度&lt;/strong&gt; 相比起来会非常的快, 类比餐饮就相当于给了你&lt;strong&gt;预制菜&lt;/strong&gt;, 而CSR是&lt;s&gt;搞了半天还得自己煮&lt;/s&gt;;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;前置步骤-服务端渲染&lt;/h2&gt;
&lt;p&gt;这一步对于用户来说并不能算一个第一步, 因为往往服务器都是提前把&lt;strong&gt;html&lt;/strong&gt;, &lt;strong&gt;js代码&lt;/strong&gt;渲染好的, 用户(客户端)只要等着获取就行了;&lt;/p&gt;
&lt;p&gt;需要注意, html和js代码这里是分开的, 正如我前面所说。 &lt;strong&gt;js代码&lt;/strong&gt;会在后面通过&lt;code&gt;客户端水合&lt;/code&gt; 嵌到html上&lt;/p&gt;
&lt;p&gt;另一方面但是其他如CSR的渲染方式, 都是在客户端渲染的, 那服务端和客户端的环境是有区别的, 这会导致书写SSR时容易造成一些报错; 关于这点, 本文后面有一些相关的例子。&lt;/p&gt;
&lt;h2&gt;第一步-获取静态文件&lt;/h2&gt;
&lt;p&gt;客户端获取服务端提前渲染的html和js文件, 并直接使用html来填充浏览器页面; 于是用户就很快的得到了一个静态的页面——SSR的核心优势之一&lt;/p&gt;
&lt;p&gt;至于&lt;strong&gt;js文件&lt;/strong&gt;呢, 将在下一步起作用。&lt;/p&gt;
&lt;h2&gt;第二步- 客户端水合&lt;/h2&gt;
&lt;p&gt;这一步是SSR最特殊于其他渲染方式的, 也是最难理解的一步; 在这一步, 我们需要把在上一步还没用到的&lt;strong&gt;js文件&lt;/strong&gt;和已经用于呈现静态页面的&lt;strong&gt;html文件&lt;/strong&gt;拼装起来, 拼装完成后的整体才是一个前端页面完整体&lt;/p&gt;
&lt;p&gt;比如说, 我写了一个登录页, 通过一开始服务端传来的HTML我当然可以把登录按钮什么的渲染出来, 但是显然没有js的话, 这个按钮就是一个空壳, 没法实际登录的;
我们得 给它绑定上 &lt;strong&gt;@click=login()&lt;/strong&gt; 以及 login函数的具体实现, 两段js代码, 这样页面才能正常运行; 这个把js绑定到对应html元素的操作 就叫做 &lt;code&gt;水合(hydrate)&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;也就是说, 水合是 &lt;code&gt;将在前置步骤(此处是服务端渲染)拆开的, 原就应当是一体的一份html代码和其对应的js代码, 重新关联起来的过程&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;第三步-客户端正常运行&lt;/h2&gt;
&lt;p&gt;最后就是在客户端正常运行已经水合完毕的完整前端了 同CSR&lt;/p&gt;
&lt;h1&gt;常见报错问题&lt;/h1&gt;
&lt;p&gt;以下来讲下SSR使用过程中的&lt;/p&gt;
&lt;h2&gt;localStorage无法调用&lt;/h2&gt;
&lt;p&gt;首先我们假设已经在localStorage(即浏览器缓存) 中存好了一个 key为&lt;strong&gt;API_KEY&lt;/strong&gt;的键值对&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script setup lang=&quot;ts&quot;&amp;gt;
const key = localStorage.getItem(&quot;API_KEY&quot;)
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那么请问, 这么写在ssr渲染的情况下能正常运行吗?
并不能 我们会收获如下报错
&lt;img src=&quot;/source-of-blog/blog-7%20ssr1/image.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里我们会报错; 原因是在 &lt;strong&gt;前置步骤-服务端渲染&lt;/strong&gt;
因为在&lt;strong&gt;服务端上并没有localStorage这个api&lt;/strong&gt; , localStorage是浏览器相关的操作，是用来调用浏览器缓存的;&lt;/p&gt;
&lt;p&gt;那么这样会报错吗&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { getKey } from &quot;~/use-key.ts&quot;;
const key = getKey()
//下为use-key.ts
export const getKey = () =&amp;gt; {
  const key = localStorage.getItem(&quot;API_KEY&quot;)
  return key;
};

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也是会的, 也就是即使是&lt;code&gt;import操作&lt;/code&gt;, 也会在服务端渲染的时候执行&lt;/p&gt;
&lt;p&gt;正确的不报错操作应该是如下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function getKey() {
	return ...
}
onMounted(()=&amp;gt; {
	getKey();
})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如上报错的原因均为服务端渲染时没有localStorage这个api导致的
而正确写法中, onMounted是会在&lt;code&gt;第三步-客户端正常运行&lt;/code&gt; 中触发的(这里是&lt;code&gt;onMounted&lt;/code&gt;的性质, 会在页面挂载后运行)&lt;/p&gt;
&lt;h2&gt;部分请求不该在服务端发送&lt;/h2&gt;
&lt;p&gt;我们很经常写 &lt;code&gt;当进入xxx页面就打xxx请求&lt;/code&gt; 的逻辑&lt;/p&gt;
&lt;p&gt;然而, 有些请求在 &lt;code&gt;前置步骤-服务端渲染&lt;/code&gt; 不应该被打出, 如你打请求时需要附带一些需要用户提交的东西, 例如有登录功能的项目里, 很多请求都要求带有用户登录态相关的东西(比如需要token鉴权),
那么这种情况这些请求在服务端渲染时打出就是没有意义的&lt;/p&gt;
&lt;p&gt;那咋办呢? 哎, 像Nuxt框架里就有一个东西叫&lt;code&gt;&amp;lt;client-only&amp;gt;&lt;/code&gt; 如下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;client-only&amp;gt;
    &amp;lt;!-- 内容物 --&amp;gt;
&amp;lt;/client-only&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你可以把要打请求的部分封装成一个组件, 然后填到&lt;code&gt;&amp;lt;client-only&amp;gt;&lt;/code&gt;里, 这个元素的意思是只会在 第三步-客户端正常运行 时渲染相关的玩意, 那自然就不会有问题了&lt;/p&gt;
&lt;h2&gt;客户端水合时报错 (水合问题)&lt;/h2&gt;
&lt;p&gt;这里我举出的例子就是我上一篇文章;因为这个问题本身非常的复杂, 我觉得值得单独放在一篇文章里讲述;&lt;/p&gt;
&lt;p&gt;虽然那篇文章标记着发布时间为9月份, 不过核心的&lt;strong&gt;根本解决方案&lt;/strong&gt;部分是我在写完这篇&lt;code&gt;SSR1&lt;/code&gt;后才再次撰写的, 其他部分也经过修改过, 可以放心观看&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://zheyi.in/posts/%E5%89%8D%E7%AB%AF/yibu/&quot;&gt;自动保存apiKey功能遇初始化异步, 最终确诊水合问题&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;尾声&lt;/h1&gt;
&lt;p&gt;其实我还有好多想写的, 像是在我的博客astro项目里见到的如下神秘写法&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
//本文件是一个组件 叫ConfigCarrier.astro, 被直接挂载到layout.astro (即挂载到所有页面上)
import { siteConfig } from &quot;../config&quot;;
---

&amp;lt;div id=&quot;config-carrier&quot; data-hue={siteConfig.themeColor.hue} data-lightDarkMode={siteConfig.lightDarkMode.defaultMode}&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;首先解释下, 这里&lt;code&gt;config&lt;/code&gt;文件是博客使用者的设置, siteConfig是里面的存储设置的const变量; 这个组件在其他文件里会被通过dom操作获取到存储的config信息。&lt;/p&gt;
&lt;p&gt;那, 为什么不直接在需要这些信息的地方import siteConfig呢?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我&lt;strong&gt;目前&lt;/strong&gt;理解是: 因为config文件并不会被服务端渲染, 也就是说实际压根不会发给客户端&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这个东西我接下来也会再研究, 上述猜想要是错了的话, 这篇文章里我也不再修改了, 会在下一篇SSR相关文章写一大段来讲述这相关的内容&lt;/p&gt;
&lt;p&gt;碍于时间以及篇幅, 这里就先停笔了 希望你们很快就能看到我的&lt;code&gt;SSR篇2&lt;/code&gt;文章捏&lt;/p&gt;
&lt;h3&gt;参考&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Dkx5ydvtpCA&quot;&gt;视频: 10 Rendering Patterns for Web Apps&lt;/a&gt; (这分类的有点泛, 不过讲的够广)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.saeloun.com/2021/12/16/hydration/&quot;&gt;文章: Understanding Hydration in React applications(SSR)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bing搜索&lt;/p&gt;
&lt;p&gt;ChatGpt&lt;/p&gt;
&lt;p&gt;我的项目代码&lt;/p&gt;
&lt;p&gt;折乙先生的大脑&lt;/p&gt;
</content:encoded></item><item><title>一次水合问题的修复经验 (于SSR篇1写完后大改了后半段)</title><link>https://zheyi.in/posts/%E5%89%8D%E7%AB%AF/yibu/</link><guid isPermaLink="true">https://zheyi.in/posts/%E5%89%8D%E7%AB%AF/yibu/</guid><description>我在开发中遇到了一个涉及初始化异步的问题, 一开始我认为是链路设计问题; 在前辈的点拨下发现应当是SSR的水合问题</description><pubDate>Sun, 21 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;本文一开始写的有问题, 但是因为思绪混乱, 短时间内没改好;
后来在&lt;code&gt;2025-11-09&lt;/code&gt;的&lt;a href=&quot;https://zheyi.in/posts/%E5%89%8D%E7%AB%AF/ssr1/&quot;&gt;SSR篇1-从认识渲染方式到简单的SSR水合问题&lt;/a&gt;发布后,&lt;/p&gt;
&lt;p&gt;重新大改了一次, 可以把本文视作一个&lt;code&gt;水合问题&lt;/code&gt;的修复例子&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;场景描述&lt;/h1&gt;
&lt;p&gt;前端开发, 写的是登录页 (不过没有实际后端登录接口)
整个项目没有账号的概念, 是通过在请求的headers里放key来鉴权的&lt;/p&gt;
&lt;p&gt;所以在登录页的时候只需要输入一行key就行, 如下图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/source-of-blog/blog-6%20yibuDesign/image-1.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;功能设计&lt;/h2&gt;
&lt;p&gt;因而 我自发的设计了两个功能&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;缓存key, 并且在每使用时自动调用缓存里的key补全输入框(这样之后要是你还是手动来到login页,就可以直接点击登录不用再输一遍key了)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;检测输入框有无内容,无内容时登录按钮 disabled 无法点击&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;按钮我使用的是&lt;code&gt;&amp;lt;el-button&amp;gt;&lt;/code&gt; 因而disabled功能就是使用它的 &lt;code&gt;:disabled&lt;/code&gt; 属性来实现的&lt;/p&gt;
&lt;h1&gt;初版设计&lt;/h1&gt;
&lt;p&gt;既然要进缓存, 那正常来说就得直接调&lt;code&gt;localStorage&lt;/code&gt;, 不过这有点不是很优雅, 所以项目里创建了一个
&lt;code&gt;useApiKey.ts&lt;/code&gt;来把这份缓存单独管理(这样就不用手动调取&lt;code&gt;localStorage&lt;/code&gt;了) 具体代码如下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// use-api-key.ts
import { useStorage } from &quot;@vueuse/core&quot;;

export const API_KEY_STORAGE_KEY = &quot;xxxxxxxxxxxxxxxxx&quot;;

export const useApiKey = () =&amp;gt; {
  const apiKey = useStorage(API_KEY_STORAGE_KEY, &quot;&quot;);

  return apiKey;
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;useStorage是vueuse的一个方法, 是创建一个&lt;code&gt;localStorage&lt;/code&gt;名为 &lt;code&gt;API_KEY_STORAGE_KEY&lt;/code&gt; 的对象
所以在login页代码里我只用这么写&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- login.vue --&amp;gt;
&amp;lt;template&amp;gt;
&amp;lt;el-input
    v-model=&quot;apiKey&quot;
/&amp;gt;
&amp;lt;!-- handleConfirmApiKey相当于登录函数(校验下key对不对) --&amp;gt;
&amp;lt;el-button
    :disabled=&quot;apiKey.length &amp;lt;= 0&quot;
    @click=&quot;handleConfirmAPIKey&quot;
&amp;gt;
    登录
&amp;lt;/el-button&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;script setup lang=&quot;ts&quot;&amp;gt;
const apiKey = useApiKey();
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后在要使用到&lt;code&gt;Key&lt;/code&gt;的页面里, 也只需要用useApiKey() 这个 &lt;strong&gt;Composable&lt;/strong&gt; 就获取到一个优雅的叫做apiKey的变量啦&lt;/p&gt;
&lt;h2&gt;问题&lt;/h2&gt;
&lt;p&gt;当然, 初版设计一定是有问题的, 不然就不会是初版设计了; 首先这次设计的优点当然是优雅——代码量也少, 使用方式也非常的舒服&lt;/p&gt;
&lt;p&gt;问题在于&lt;code&gt;&amp;lt;el-button&amp;gt;&lt;/code&gt;的 &lt;code&gt;:disabled&lt;/code&gt;属性, 这个属性传入的是一个 &lt;strong&gt;boolean&lt;/strong&gt; 值, 自动更新表现不理想, 出现了如下bug&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/source-of-blog/blog-6%20yibuDesign/image-2.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里, 我在已有&lt;code&gt;apiKey&lt;/code&gt;缓存的情况下进入页面(或者原地刷新), 会出现输入框里有字, 但是&lt;code&gt;&amp;lt;el-button&amp;gt;&lt;/code&gt;的&lt;code&gt;:disable=true&lt;/code&gt;的情况&lt;/p&gt;
&lt;h1&gt;解决方案&lt;/h1&gt;
&lt;p&gt;我一开始想了一个简单粗暴的解决方案, 如下&lt;/p&gt;
&lt;h2&gt;简单粗暴的方案&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- login.vue --&amp;gt;
&amp;lt;template&amp;gt;
  &amp;lt;el-input
      v-model=&quot;apiKey&quot;
  /&amp;gt;
  &amp;lt;el-button
      :disabled=&quot;isDisabled&quot;
      @click=&quot;handleConfirmAPIKey&quot;
  &amp;gt;
      登录
  &amp;lt;/el-button&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;script setup lang=&quot;ts&quot;&amp;gt;
const apiKey = useApiKey();

const isDisabled = ref();

onMounted(() =&amp;gt; {
  isDisabled.value = apiKey.value.length &amp;lt;= 0;
})

watch(apiKey, () =&amp;gt; {
  isDisabled.value = apiKey.value.length &amp;lt;= 0;
});
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也就是我手动把后续&lt;code&gt;:disabled&lt;/code&gt;不会自动刷新的问题解决了, 我手动让它进行刷新(&lt;code&gt;onMounted&lt;/code&gt;触发比apiKey初始化晚),
watch则是让 &lt;code&gt;isDisabled&lt;/code&gt; 变量与&lt;code&gt;apiKey&lt;/code&gt;动态同步&lt;/p&gt;
&lt;h2&gt;根本解决 (25-11-11撰写)&lt;/h2&gt;
&lt;p&gt;在前辈的提示下, 我打开了控制台发现了如下报错&lt;img src=&quot;/source-of-blog/blog-6%20yibuDesign/image.png&quot; alt=&quot;alt text&quot; /&gt;
让我知道这原来是个&lt;code&gt;水合问题&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;问题为: &lt;code&gt;服务端渲染&lt;/code&gt;时认为按钮是 disabled=true; (因为)
但客户端（浏览器）执行逻辑时认为按钮 disabled=false；
两边渲染结果不一致, 所以被认为是水合问题 就给我弹报错了&lt;/p&gt;
&lt;p&gt;这里我给代码修改下进行测试&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// use-api-key.ts
import { useStorage } from &quot;@vueuse/core&quot;;

export const useApiKey = () =&amp;gt; {
  const apiKey = useStorage&amp;lt;string&amp;gt;(API_KEY_STORAGE_KEY, &quot;&quot;, undefined);
  console.log(&quot;渲染useApiKey&quot;, apiKey.value ? &quot;apiKey有值&quot; : &quot;apiKey无值&quot;);
  return apiKey;
};
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;// login.vue
&amp;lt;!-- 省略template部分 --&amp;gt;
&amp;lt;script setup&amp;gt;
import { useApiKey } from &quot;~/composables/use-api-key&quot;;
// 省略其他代码
const apiKey = useApiKey();

onMounted(() =&amp;gt; {
  console.log(&quot;login页面的onMounted触发&quot;, apiKey.value ? &quot;apiKey有值&quot; : &quot;apiKey无值&quot;);
});
&amp;lt;/script&amp;gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/source-of-blog/blog-6%20yibuDesign/image-3.png&quot; alt=&quot;alt text&quot; /&gt;
我们就可以直观的明白, 在SSR服务端渲染阶段没获取到localStorage里的apiKey, 而在客户端渲染时可以正常获取到apiKey;&lt;/p&gt;
&lt;p&gt;另一方面, 我们可以知道, 时序来说是&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;服务端渲染 → 客户端渲染 → 页面挂载完成(onMounted触发)&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;关于修复呢, 这里&lt;a href=&quot;https://vueuse.org/core/useStorage/#usage&quot;&gt;VueUse&lt;/a&gt;提供了一个字段, &lt;code&gt;initOnMounted&lt;/code&gt;,&lt;/p&gt;
&lt;p&gt;这里我们来测试下把useApiKey里的useStorage加上&lt;code&gt;initOnMounted: true&lt;/code&gt;后, 会怎么样&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// use-api-key.ts
import { useStorage } from &quot;@vueuse/core&quot;;

export const useApiKey = () =&amp;gt; {
  const apiKey = useStorage&amp;lt;string&amp;gt;(API_KEY_STORAGE_KEY, &quot;&quot;, undefined, { initOnMounted: true });
  console.log(&quot;渲染useApiKey&quot;, apiKey.value ? &quot;apiKey有值&quot; : &quot;apiKey无值&quot;);
  return apiKey;
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;/source-of-blog/blog-6%20yibuDesign/image-4.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如图, useApiKey在客户端渲染的时候也没有拿到apiKey的值; 也就是说这个字段的作用是让 useStorage在页面挂载(Mounted)之后才获取值&lt;/p&gt;
&lt;p&gt;这样, &lt;code&gt;服务端渲染&lt;/code&gt;和&lt;code&gt;客户端渲染&lt;/code&gt; 的apiKey就都为空字符串, &lt;code&gt;:disabled&lt;/code&gt;也都是true了, 于是没有了水合问题, 程序正常执行;&lt;/p&gt;
&lt;p&gt;这样按钮的是否disabled就变成了&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;初始一定是:disabled: true, 按钮无法点击; 在页面挂载后判断本地localStorage里是否有存储key, 有就让:disabled变为false&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;逻辑很清晰, 代码也很优雅 万事大吉咯&lt;/p&gt;
</content:encoded></item><item><title>浙工大转专业(计算机) 经验分享 | 指南(?</title><link>https://zheyi.in/posts/%E6%A0%A1%E5%9B%AD%E6%9D%82%E8%B0%88/zhuanzhuanye/</link><guid isPermaLink="true">https://zheyi.in/posts/%E6%A0%A1%E5%9B%AD%E6%9D%82%E8%B0%88/zhuanzhuanye/</guid><description>24届,大一下转的, 平转(没降), 这一年也研究转专业的比较多,写篇小文章给小登看</description><pubDate>Wed, 04 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;如果你是刚入学看的本篇博客 推荐之后也再看看&lt;/p&gt;
&lt;p&gt;因为我写这篇博客主要希望你能够因此完成对大一一整年以转专业为主基调之一的规划&lt;/p&gt;
&lt;p&gt;对你有所帮助就再好不过了&lt;/p&gt;
&lt;h1&gt;我的情况&lt;/h1&gt;
&lt;p&gt;首先 我转的&lt;code&gt;计算机(软工)&lt;/code&gt;
转别的大类的可以蛮参考参考除机考外部分&lt;/p&gt;
&lt;p&gt;原专业化学工程 大一上考虑过打acm 以及平时有在干前端开发 代码经验比较丰富 所以机考准备不是很足也是勉强水过&lt;/p&gt;
&lt;p&gt;面试的话我有端项目前 不过最主要感觉是&lt;code&gt;大学生服务外包区域三等&lt;/code&gt;这个竞赛起了作用&lt;/p&gt;
&lt;p&gt;但是按我这么个水平来说 也不算特别轻松的通过(主要机考5题才过3题给喷了)
就算是打acm的小登来了 也得稍微注视点机考(我们这届还真有打acm的机考没过的)&lt;/p&gt;
&lt;p&gt;所以要转专业的别拖 从进校园开始就得规划了 不然很容易被降转甚至不通过&lt;/p&gt;
&lt;h1&gt;时间线/难度描述&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;转专业大一下 大二上 大二下 三次机会&lt;/li&gt;
&lt;li&gt;大抵上默认读者是大一下就转&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;大一上:刷绩点,特定课分达标 → 大一下: 自主加课(辅修) → 转专业考: (机考 → 面试)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;每一步我都见过有人失败 都看看吧
难度因人而异吧我只能说, 学业好的绩点就没问题 反过来说也有人高数没达70直接给刷掉的&lt;/p&gt;
&lt;p&gt;机考和面试难度我用通过率来描述
数据都是左右 偏差个1~2人吧&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;(25届)软工收20人 计科收18人 网安6人&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;机考 130 →34&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;第一志愿面试 34→ 软工12, 计科 13 (共25）网工2 数媒5&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意面试人数是一面 均未达招收的最大人数哦 所以转专业与其视为参与者之间
大概这样 贴个图(24届第一志愿通过人的图)(反正官网可查)
降转率看得出来 还是比较高的
&lt;img src=&quot;/source-of-blog/blog-4%20zzy/9aa0b3b49ea34e89c4f99487bc0ac0b.jpg&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;需要找的资料 注意的消息&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;转专业标准 细则
当届的&lt;code&gt;转专业标准&lt;/code&gt; 以及 &lt;code&gt;浙江工业大学2024级普通本科学生转专业实施细则汇总一览表&lt;/code&gt; 类似这玩意&lt;/li&gt;
&lt;li&gt;转入专业的培养方案
一来是 你要根据这个来找出你需要补的课 你不需要上的课
二是 面试可能会问你: 你看过我们培养方案了吗 喜欢我们培养方案上的什么课啊&lt;/li&gt;
&lt;li&gt;录取人数
看看你这届计科啊 软工啊收几人
我这届计科18 软工20 其他几个合起来大概13
有助于填报志愿&lt;/li&gt;
&lt;li&gt;转专业填报时间
正常都该学期的&lt;code&gt;第12周&lt;/code&gt;开考 也就是&lt;code&gt;一旦快到12周了&lt;/code&gt; 时刻注意什么时候允许报名转专业(不要忘了报转专业啊www)&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;实力上的准备&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;自主提前修课&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;不提前修的话 要是差的课太多 会给降转(大概差4门就给降 我差3门 勉强稳住了)&lt;/p&gt;
&lt;p&gt;大一上大概率是没法自己调课的 如果你比较有手段去找教务处给你提前加上课 那你也是大神了
比较好的是在大一下&lt;code&gt;辅修课程&lt;/code&gt; 在大一上结束 选大一下课程的时候在正方上报辅修(早点报 可能被报满) 我就辅修了一门C++&lt;/p&gt;
&lt;p&gt;然后大一下可以尝试把非计算机需要的专业课退了(比如我就退了工程图学) 方法是&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;选课的时候偷偷不选这个课(我就这么成的) 你的教务处很可能不会发现 或者发现了也懒得管&lt;/li&gt;
&lt;li&gt;如果已选课 可以试试找教务处退(很难成)&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;绩点/特定课程达标&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;24届要求:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大学物理70(如果有)&lt;/li&gt;
&lt;li&gt;数学类科(如高数)70 &lt;code&gt;(最勤学)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;大学英语70 &lt;code&gt;(最拜佛)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;编程类(如py,C)70&lt;code&gt;(最简单)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;数学和大学英语多小心点 平时分拿满满 不然你期末考等出分会很煎熬(本人亲身体验)&lt;/p&gt;
&lt;p&gt;绩点的话 我自己是3出头 总的来说不下3正常就还是很合格的 比较高的优势大概就面试夸夸你
可刷可不刷 但是起码得到3左右 太低了确实不好看&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;机考&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;5题 过3题才算通过机考&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;机考是最大筛选器 主要难度集中处&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;编程语言&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;机考只允许用C/C++
别嚷嚷浙江有选信息的考生们你们最的python了 老老实实学C++吧
练习用&lt;code&gt;devC++&lt;/code&gt;来练 只有这个是机考考场包有的
喜欢用&lt;code&gt;vscode&lt;/code&gt;的有福了 自觉苦练下devC++吧&lt;/p&gt;
&lt;p&gt;机考还是推荐C++ 用&amp;lt;bits/stdc++.h&amp;gt;库 爽写
C++的基础学习这里就不教了 自己想办法 指针啊 class 啥的都不用学 能写题就行
&lt;strong&gt;练习&lt;/strong&gt;:
考试的OJ: [http://acm.zjut.edu.cn/onlinejudge/] &lt;em&gt;(要校园网)&lt;/em&gt;
这上面也有很多通关考练习题 不过转专业机考的难度是比通关考大的 练到&lt;strong&gt;四十分钟能稳定AC一套通关考&lt;/strong&gt;
以及熟悉下这个OJ的特性 如卡行末空格 不卡样例末尾的换行
报错中Prensentation Error WA Routime Error 比较常见 熟悉分别是什么意思&lt;/p&gt;
&lt;p&gt;转专业机考也有往年题 我自己这次考的我也有记下来 不过我这里就不具体发出来了 毕竟学校要求不能外传 (所以私下找我我可能告诉你大概?怎么考的 咳咳)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;竞赛/项目&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我说了好几个项目 但面试老师感觉不怎么因此理我 估摸着项目多半作用有限&lt;/p&gt;
&lt;p&gt;竞赛还是推荐水个 比较差的竞赛也没事 面试的时候你一说你有个竞赛 面试老师就会肯定你对计算机的兴趣 加分很大&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;推荐的竞赛&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;只推荐计算机的比赛 其他用处不一定大&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;我校acm迎新赛 acm校赛&lt;/strong&gt; 都推荐参加 认可度高 也相当于模拟机考(模拟下环境 机考肯定更简单)&lt;/li&gt;
&lt;li&gt;学校的其他计算机比赛 比如&lt;code&gt;寒软&lt;/code&gt; 可以看看能不能水&lt;/li&gt;
&lt;li&gt;认可度高的全国性计算机相关比赛(如&lt;code&gt;大学生服务外包创新创业大赛&lt;/code&gt;)打这种就比较难了 有拿到这种比赛奖项的话帮助也很大&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;志愿填报&lt;/h1&gt;
&lt;p&gt;正常就 &lt;code&gt;计算机科学与技术&lt;/code&gt; 和 &lt;code&gt;软件工程&lt;/code&gt;里选&lt;/p&gt;
&lt;p&gt;其他我不熟 这里就不讲了 计算机大类下除了计科软工 其他几个人数占比都不高&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一志愿/第二志愿 机制&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;具体机制根据你那届情况来看(比如我前几届&lt;code&gt;机考是可以两次的&lt;/code&gt;) 不过感觉以后顶多比我这个惨&lt;/p&gt;
&lt;p&gt;我这届只机考一次 第一志愿第二志愿只是面试面两场
也就是机考通过后大概下一周 第一志愿面试
面试结束后一天 正常就发布面试通过名单 如果没通过 你就会参与第二志愿面试&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;不同专业分支介绍&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;计科肯定最王牌 其次软工 再其他的拿出去交简历的时候 如果非对口工作(比如你网安面个前端开发) 容易不好看
计科的课程更难 比如有电路啥的
软工比起来会比较简单&lt;/p&gt;
&lt;p&gt;然后如果想保研的话 选软工肯定简单, 计科养蛊比较严重&lt;/p&gt;
&lt;h1&gt;我的机考+面试经验&lt;/h1&gt;
&lt;h2&gt;机考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;机考时长&lt;strong&gt;90min&lt;/strong&gt; 共&lt;strong&gt;5题&lt;/strong&gt; 过&lt;strong&gt;3题&lt;/strong&gt;及以上算通过 可以进入面试阶段&lt;/li&gt;
&lt;li&gt;只看题数 不罚时&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;具体往届数据可以上 [http://acm.zjut.edu.cn/onlinejudge]
的contest里找往届转专业考 榜单是允许看的&lt;/p&gt;
&lt;p&gt;24届大一下(也就是我这次) 是18人个3题 16个人4~5题&lt;/p&gt;
&lt;p&gt;我的考试情况是&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;10min调好电脑(用的电脑上DevC++) 过第一题&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;20+min卡在第二题(卡细节 题目要求我每行输出两个数 我以为直接输出 考完发现要比大小然后换顺序)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;40min做出第三题 没被卡细节&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;55min调出第四题 但是因为忘记0和1不是质数被卡了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;55~77min这二十分钟最紧张 一直在找第二题第四题两道题卡哪里了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;77min发现第四题细节错误 做出第四题&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最后三十分钟非常紧张 实际做题感觉就60min有效时间(实力不够 实在无奈)
要是C++还行的话 正常就是考虑细节问题 总体机考题难度相当于&lt;code&gt;洛谷 入门~普通-&lt;/code&gt; 但是细节会故意卡你&lt;/p&gt;
&lt;h2&gt;面试&lt;/h2&gt;
&lt;p&gt;我这次规则:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;时长5min 不会死卡 包括自我介绍+提问&lt;/li&gt;
&lt;li&gt;面试者站讲台上 教室第一排第二排坐两排老师&lt;/li&gt;
&lt;li&gt;一个主面试官一直问你问题 其他的菜市场讨论
问题:
问题大多数是针对你&lt;code&gt;自我介绍&lt;/code&gt;中讲的东西来问&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;自我介绍&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;这自己想办法 我的话就说了自己的项目和竞赛情况&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;你自己有学些什么&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;答: 前端开发. 但是感觉几个老师不懂这个 听了也不说话&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;补课和缺课情况&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;答: 目前还缺三门(离散 程C 线代) 其中程C可以轻松通过(自学了) 以及我辅修了C++&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;问这个问题基本说明你过了 在看你要降转还是平转
要是这里你欠的课4+门 基本准备降转吧&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;你有看过我们的培养方案吗? 有没有什么比较喜欢的课&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;答: web开发, java, 计网 什么的.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;你为什么转软工而不是计科&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;答: 计科要学电路什么的 太难了 学不来(其实我是懒得花那么多时间去学)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;后续讨论要不要我降转感觉几个老师之间聊了一会 不过我面试的时候比较幸运
我辅修的C++课的老师有来面我 在下面给我说好话 不希望我降转
所以大一一年别得罪什么计算机学院的老师 比如你要是在老师课上睡觉 到时候来面你 你基本可以滚蛋了(泪)&lt;/p&gt;
</content:encoded></item><item><title>elmUI真王朝了? 使用经验分享</title><link>https://zheyi.in/posts/%E5%89%8D%E7%AB%AF/elmui/</link><guid isPermaLink="true">https://zheyi.in/posts/%E5%89%8D%E7%AB%AF/elmui/</guid><description>之前就用过elmUI 但这次单人写服外前端Vue项目用了大量elmUI组件 感觉甚好 分享下喜悦</description><pubDate>Mon, 28 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;elmUI介绍&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;(给没用过elmUI的小登写的 老登别看啦)&lt;/code&gt;
先给伟大的ElmUI贴个链接
&lt;a href=&quot;https://element-plus.org/zh-CN/&quot;&gt;elm&lt;/a&gt;
&lt;a href=&quot;https://element-plus.org/zh-CN/component/overview.html&quot;&gt;组件库&lt;/a&gt;
最新版本全称Element Plus 套用官方说明就是个&quot;基于 Vue 3，面向设计师和开发者的组件库&quot;&lt;/p&gt;
&lt;p&gt;也就是说比如这样一个登录按钮&lt;img src=&quot;/source-of-blog/blog-3%20elmUI/image.png&quot; alt=&quot;alt text&quot; /&gt;
你不用手搓 直接写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;button type=&quot;primary&quot;&amp;gt;登录&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;就行啦 也就是说可以当场找到你想要的组件 当场写入你的前端项目&lt;/p&gt;
&lt;h1&gt;组件介绍&lt;/h1&gt;
&lt;h2&gt;内容组件&lt;/h2&gt;
&lt;p&gt;elmUI中如 &lt;code&gt;Card&lt;/code&gt;,&lt;code&gt;Button&lt;/code&gt;, &lt;code&gt;input&lt;/code&gt;, &lt;code&gt;icon&lt;/code&gt; 这些 是作为&lt;code&gt;某一个&lt;/code&gt;页面布局的一部分来使用的
用起来最大的感受就是省时间 舒服 &lt;code&gt;拆包即用&lt;/code&gt;
组件的拓展性都不错 比如&lt;code&gt;input&lt;/code&gt;组件
&lt;img src=&quot;/source-of-blog/blog-3%20elmUI/image-1.png&quot; alt=&quot;alt text&quot; /&gt;
如图 左边的几个input 像邮箱那里 可以直接在input里添加上右侧的&lt;strong&gt;发送验证码&lt;/strong&gt;按钮
右上的是大型文本框 写学期总结的地方()&lt;/p&gt;
&lt;h2&gt;布局(功能)组件&lt;/h2&gt;
&lt;p&gt;如&lt;code&gt;el-dialog&lt;/code&gt;(弹窗组件) &lt;code&gt;el-info&lt;/code&gt;(提示信息功能) &lt;code&gt;el-message&lt;/code&gt;
这些组件的泛用性个人认为会高于&lt;code&gt;Button&lt;/code&gt;什么的 而且也更重要
毕竟搓个&lt;code&gt;button&lt;/code&gt;谁不会 就是懒 搓个&lt;code&gt;弹窗组件&lt;/code&gt;这种还是很头疼的&lt;/p&gt;
&lt;p&gt;刚开始用的时候 特别是&lt;code&gt;el-dialog&lt;/code&gt; 会让我感觉: 哦 原来这么轻松就能实现这样的布局结构
&lt;img src=&quot;/source-of-blog/blog-3%20elmUI/image-2.png&quot; alt=&quot;一个el-dialog的使用&quot; /&gt;
然后我就在我的项目里用了快10个el-dialog 比起只有只有页面的跳转 网页高级了个档次&lt;/p&gt;
&lt;h2&gt;缺点&lt;/h2&gt;
&lt;p&gt;因为是用来布局的 所以会&lt;strong&gt;附带着elm自己的一套风格&lt;/strong&gt;
也就是说 这些组件拿来写写个人项目还是很不赖的，拿来多人开发的正式场景，就容易遇到风格问题
可能UI要求的风格和elm的不兼容 那就用不了了 所以还是别依赖过头了()&lt;/p&gt;
&lt;h1&gt;其他&lt;/h1&gt;
&lt;h2&gt;bug&lt;/h2&gt;
&lt;h3&gt;手动添加elm内置的class名&lt;/h3&gt;
&lt;p&gt;elmUI有内置的class名以及对应属性 所以不要乱使用可能和&lt;code&gt;内置class名&lt;/code&gt;&lt;strong&gt;重叠&lt;/strong&gt;的&lt;code&gt;class名&lt;/code&gt;
如下 我由于在一个&lt;code&gt;&amp;lt;el-upload/&amp;gt;&lt;/code&gt;的最外层额外写了个&lt;strong&gt;class=&quot;el-upload&quot;&lt;/strong&gt; 导致如下属性侵入
&lt;img src=&quot;/source-of-blog/blog-3%20elmUI/image-class.png&quot; alt=&quot;alt text&quot; /&gt;
其中display:inline-flex; 导致此处变为flex布局 故导致如下bug&lt;/p&gt;
&lt;p&gt;正常的&lt;img src=&quot;/source-of-blog/blog-3%20elmUI/image-4.png&quot; alt=&quot;正常的&quot; /&gt;
在组件最外层多写了&lt;code&gt;class=&quot;el-upload&quot;&lt;/code&gt;&lt;img src=&quot;/source-of-blog/blog-3%20elmUI/image-3.png&quot; alt=&quot;套了层flex&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;样式渗透时多加了scoped&lt;/h3&gt;
&lt;p&gt;elm的组件源码正常我们不会去改 那这时候要是我们想稍微对这组件小改个色 或控个尺寸 咋办呢
这时候就可以在&lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt;里写 来操作
具体操作如下
先F12找到这个组件你要改的那一层的class名
&lt;code&gt;这里注意 elm的组件基本都好几层 别改错层了&lt;/code&gt;
&lt;img src=&quot;/source-of-blog/blog-3%20elmUI/image-5.png&quot; alt=&quot;alt text&quot; /&gt;
如果你有在.vue的style里都加上&lt;code&gt;scoped&lt;/code&gt;的习惯的话 就单独起一个&lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; 不加scoped 或者在外层套个&lt;code&gt;:global()&lt;/code&gt;
如下
&lt;img src=&quot;/source-of-blog/blog-3%20elmUI/image-6.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;scoped&lt;/code&gt;这个属性 会让你写的&lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt;只对当前文件起效果 而显然elm组件在其他文件里 所以记得&lt;strong&gt;别加scoped捏&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;水项目小技巧&lt;/h2&gt;
&lt;p&gt;因为elmUI够出名 所以&lt;strong&gt;AI&lt;/strong&gt;也认识
你用elm组件写项目的话 可以直接叫AI 比如&lt;code&gt;生成一个ElMessageBox 里面要有账号和密码....&lt;/code&gt; 就能光速水完
哎 这是真无敌了
不过要这样用多了自己再改的不认真 大概率整个项目要变shi山了&lt;/p&gt;
&lt;h2&gt;感受&lt;/h2&gt;
&lt;p&gt;显然elmUI不是万能的 但是也算是非常实用全能的
用起来让我对一些已有规范的组件有所认识(比如switch组件)&lt;img src=&quot;/source-of-blog/blog-3%20elmUI/image-7.png&quot; alt=&quot;alt text&quot; /&gt;
这样的组件虽然html里没有 但是大家都这么叫这个名 都大概是这么个写法&lt;/p&gt;
&lt;p&gt;没用过elmUI的 还是很推荐写个人项目时用一用的 既有效率 又能带来提升(使用方法直接看官网文档 链接在本博客最上方 或者直接浏览器搜索elmUI)&lt;/p&gt;
</content:encoded></item><item><title>正规团队项目初体验</title><link>https://zheyi.in/posts/%E5%89%8D%E7%AB%AF/zgkf/</link><guid isPermaLink="true">https://zheyi.in/posts/%E5%89%8D%E7%AB%AF/zgkf/</guid><description>讲述下自己最近参与正规开发的苦难</description><pubDate>Sun, 29 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;杂话&lt;/h1&gt;
&lt;p&gt;好久没更博客，但是最近学的杂七杂八的太多了，就先写篇非技术类文章抒发下情感(&lt;em&gt;水一下&lt;/em&gt;)
之后有空还可能再写点技术文()&lt;/p&gt;
&lt;h1&gt;开发团队中的体验&lt;/h1&gt;
&lt;p&gt;团队是对应功能拉的小群
人员有 &lt;code&gt;后端&lt;/code&gt; &lt;code&gt;前端&lt;/code&gt;(我) &lt;code&gt;前辈&lt;/code&gt;(视察组)
主要的苦难在于 自身技术不足，就时不时要接受前辈的&quot;拷打&quot;，要失去对技术的信心啦 &lt;code&gt;:(&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;然后原先习惯的是非常业余的开发，在团队里要非常有理有据，不断思考功能到底需要怎么样 容易不习惯&lt;/p&gt;
&lt;p&gt;所以对于如果读者未来或者现在将要初步进入开发团队，请做好语言管理和心理防御 别破防了()&lt;/p&gt;
&lt;h1&gt;写码时的体验&lt;/h1&gt;
&lt;h2&gt;痛苦&lt;/h2&gt;
&lt;p&gt;接手的是&lt;strong&gt;陌生&lt;/strong&gt;的团队项目，由于能力不足一开始啥都看不懂
就不停翻文件夹 不停搜这是什么东西
写的时候也会质疑: &lt;strong&gt;自己写的规不规范，性能高不高 可读性强不强&lt;/strong&gt;
还是比较痛苦的&lt;/p&gt;
&lt;p&gt;期待自己混成老登了来拷打小登捏&lt;/p&gt;
&lt;h2&gt;对陌生项目技巧&lt;/h2&gt;
&lt;p&gt;先看&lt;code&gt;Src文件夹&lt;/code&gt;里的布局对应下自己熟知的前端文件夹标准 大概能了解文件分布
若有没见过的文件夹 可以搜索这是个什么功能(前提是你项目的文件夹比较标准 不是瞎命名的)&lt;/p&gt;
&lt;p&gt;建议边看文件夹边启动项目，把实际页面和文件夹对应起来 更有实体感&lt;/p&gt;
&lt;p&gt;自己研究了发现实在不懂了还是老老实实问前辈吧 虽然大概率会有点问不清楚然后被说两句 心理素质所以还是关键的()&lt;/p&gt;
&lt;p&gt;由于项目需要标准化规范化，变量 函数 往往是包装在某一块然后export import一套到你着眼的文件夹上
这时候可以用上&lt;code&gt;搜索&lt;/code&gt;功能 如vscode里的搜索，来搜索变量名 ，可以找到一堆 &lt;strong&gt;types, store, 变量的产生, 变量的使用&lt;/strong&gt;
就大抵知道这个东西的来龙去脉了(还能用来搜&lt;code&gt;console.log()&lt;/code&gt;销赃) &lt;img src=&quot;/source-of-blog/blog-2/Snipaste_2024-12-30_22-49-32.png&quot; alt=&quot;搜索&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;投降喵&lt;/h1&gt;
&lt;p&gt;投降喵 给前端跪了喵 这辈子就是被前端毁了 &lt;img src=&quot;/source-of-blog/blog-2/124646799_p4_master1200.jpg&quot; alt=&quot;哭泣&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;后记&lt;/h1&gt;
&lt;p&gt;我草 好羞耻 --25年末&lt;/p&gt;
</content:encoded></item><item><title>前端文件夹结构浅讲解</title><link>https://zheyi.in/posts/%E5%89%8D%E7%AB%AF/filestore/</link><guid isPermaLink="true">https://zheyi.in/posts/%E5%89%8D%E7%AB%AF/filestore/</guid><description>从一个前端入门者(不专业)的角度浅浅讲下前端项目结构,便于入门</description><pubDate>Sun, 27 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;叠甲&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;这篇文章适用于偏新手的前端观看写的本意在于便于前端入门者看得懂&lt;br /&gt;
仅讲解少量文件夹 一是入门者不需要知道那么多 二是我也不会(bushi)&lt;br /&gt;
如有描述不当处 感谢指出&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;总结构&lt;/h1&gt;
&lt;p&gt;我们先来看一个&lt;code&gt;vue&lt;/code&gt;基础项目的文件结构
&lt;img src=&quot;/source-of-blog/blog-1/Snipaste_2024-11-20_10-55-27.png&quot; alt=&quot;vue文件夹&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;分类&lt;/h2&gt;
&lt;p&gt;这里作为一个前端入门者 我们只需要知道哪些是我们需要用的 哪些是我们不需要的就行
所以我姑且将文件分为以下几类&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;src文件夹----你的源码存储处 &lt;strong&gt;主要的工作场所&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;各类配置文件----如图中的 &lt;code&gt;vite.config&lt;/code&gt; 当你需要配置一些东西的时候需要使用 &lt;strong&gt;偶尔使用&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;其他各类文件----比如&lt;code&gt;README.md&lt;/code&gt; 这个是用于在&lt;code&gt;github&lt;/code&gt;中向用户介绍这个项目 &lt;strong&gt;几乎不碰&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;也就是说 在实际编程中 你大部分时间只需要在&lt;code&gt;src&lt;/code&gt;中操作 偶尔在如XXX.js XXX.josn中配置一些东西 比如刚刚的&lt;code&gt;vite.config&lt;/code&gt;在&lt;code&gt;vue项目&lt;/code&gt;编写过程中 就可以用来配置&lt;code&gt;跨域&lt;/code&gt;(简单来说就是填入你的后端的地址 帮你连上你的后端)&lt;/p&gt;
&lt;h2&gt;src文件夹&lt;/h2&gt;
&lt;p&gt;那么 现在来具体介绍下&lt;code&gt;src文件夹&lt;/code&gt;下的结构 能不能认清里面的文件结构对于写码体验有极大影响 (&lt;em&gt;可不要成为文件瞎放的人呐&lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;以下放我的blog项目(一个&lt;code&gt;astro项目&lt;/code&gt;)的文件配置
&lt;img src=&quot;/source-of-blog/blog-1/Snipaste_2024-11-20_21-42-17.png&quot; alt=&quot;1730044807805.png&quot; /&gt;
这里不同类型的项目下&lt;code&gt;src&lt;/code&gt;里的东西会不一样 主要先认识下共有的一些东西&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;pages(&lt;code&gt;vue&lt;/code&gt;中为views)字面意思 也就是存放前端项目的&lt;code&gt;页面&lt;/code&gt; 比如 loign.vue ,register.vue.... 每一个&lt;code&gt;页面&lt;/code&gt;对应着一个项目中实际的页面&lt;/li&gt;
&lt;li&gt;assets--静态资源存储 也就是图片之类的东西放里面 然后用来在前端页面里渲染出来&lt;/li&gt;
&lt;li&gt;components--组件库 这里延伸一个&lt;code&gt;组件&lt;/code&gt;的知识点(&lt;em&gt;如果你不知道的话看一下&lt;/em&gt;)比如像我博客最上方的导航栏 就是一个&lt;code&gt;组件&lt;/code&gt; 组件能够在不同的页面中&lt;code&gt;复用&lt;/code&gt; 像我的blog的每个页面最上方都有导航栏 但是其实我的库里只有一份代码 可以说是一个前端项目的核心之一了&lt;br /&gt;
&lt;strong&gt;也就是说&lt;/strong&gt; components中储存着各种各样的&lt;code&gt;组件&lt;/code&gt; 大多项目中components中还有分文件夹 比如分为用来控制的组件等等 &lt;strong&gt;如果你对于这个概念非常不了解 推荐单独去了解下&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;以上是基础中的基础 什么项目中一定都会有的部分 接下来再说一些&lt;code&gt;src&lt;/code&gt;常见的文件夹/文件夹&lt;/p&gt;
&lt;p&gt;这里再贴个&lt;code&gt;vue项目&lt;/code&gt;的&lt;code&gt;src&lt;/code&gt;文件夹结构&lt;img src=&quot;/source-of-blog/blog-1/Snipaste_2024-11-20_21-43-06.png&quot; alt=&quot;1730044777003.png&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;router--&lt;code&gt;vue&lt;/code&gt;中&lt;code&gt;router&lt;/code&gt;功能的配置文件的储存位置 详细可以查一查vue中的router的相关信息&lt;/li&gt;
&lt;li&gt;layout-- 这里又牵引到一个嵌套结构 也就是说我们可以提前写一个&lt;code&gt;大模板&lt;/code&gt;(比如一个layout.astro/layout.vue)用来&lt;code&gt;复用性的&lt;/code&gt;写你想要配置的&lt;code&gt;page&lt;/code&gt;的总布局 然后再在你正在写的那个&lt;code&gt;page&lt;/code&gt;中引用这个模板 把内容丢到模板里&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h3&gt;最后&lt;/h3&gt;
&lt;p&gt;首先 很多文件夹因为本人能力有限 可能也很重要但是没提到 这里推荐&lt;code&gt;把文件夹名译成中文看看&lt;/code&gt; 大多数情况就能理解是用来干嘛的了(&lt;em&gt;可能吧&lt;/em&gt;)&lt;br /&gt;
相信你也发现 很多文件其实对应的就是一大块的前端知识 所以一定程度上 你可以依据你的项目文件夹(或者可以看看别人的项目) 进行一块一块的学习&lt;/p&gt;
</content:encoded></item></channel></rss>