我花了5天时间,开发了一个在线学习的小网站

大三寒假赋闲在家,闲来无事,用了5天时间做了一个在线学习的小网站,一鼓作气部署上线,制作的过程比较坎坷。内心经历过奔溃,也经历过狂喜。

按照惯例先放出网址,欢迎大家来访问学习:www.pbjlovezjy.com

咪猫学习网 (pbjlovezjy.com)​​​​​​

我采用的技术栈是:SpringBoot + MySQL + Mybatis + Vue.js + Redis

虽然最开始有想过用微服务来做,但后来考虑到这只是一个小网站,秉持着杀鸡焉用牛刀的原则,就直接采用前后端分离的架构来做了。

做这个网站的浅层目的:主要是提供一些能够在线学习的资料,比如之前在复习新思想、毛中特这些思政课的时候,会发现找不到课后题的答案,最后花费了很多时间,东拼西凑,才最终找齐,感觉很浪费时间。

同时资料也很难做到随时随地背诵,有时候上厕所想背一下,都要把电脑上的PDF传到QQ里,才能打开看看,而且字体很小,看着很累人。

所以我就做了一个能够在线学习的网站,同学们不论是走路、坐车、吃饭还是睡觉,只需要打开网页,然后想看哪章点哪章就能在线复习了,简直就是懒人福音,非常nice。

做这个网站的深层目的:是为了能够给更多的大学生提供便捷的资源获取渠道,网络上的那些资料质量参差不齐,像我以前年少、涉世未深的时候也经常被骗,所以不希望有同学被一些不良商家割了韭菜,无情坑骗,买到不适合的资料。

因此我只收取少额的费用,比如购买1门课1.2元,5门课4.88元,平均1门课不到1元钱,在1年时间内可以无限次在线看,为的是能够让更广大的学生同胞们能够负担的起。

同时勉强维持我运营维护的费用,比如租一台服务器要大几百块,购买资料也要小几百块,平均一年的支出是千把块,当前仍处于入不敷出的状态o(╥﹏╥)o,也希望好心朋友们能捐赠一下。

我计划将捐赠和付费的金额,用于购买更多资料的使用权,在征得同意的前提下,开源分享给那些有需要的学子们。

下面厚颜无耻贴个赞赏码,如果愿意给俺捐款,请务必备注清名称,让我知道您是哪位好心人。

下面言归正传:

我主要想说开发过程中3件令我感觉比较崩溃的事情:

第1件事,让我足足奔溃了1个晚上——数据录入。没错就是数据录入,整个网站虽然只有2张表,但content这张表却让我足足录入了6个小时...

起初我是想把数据直接写在html中,但这样写死之后后期不方便维护,所以我就想:通过搭建一个html模板来实时获取数据库中的数据,对数据进行展示。这样后期需要改动的时候,我只需要打开数据库进行修改就好。html框架如下:

<template>
<div class="app sidebar-mini" id="app"><div :style="{ marginLeft: this.$store.getters.status ? '70px' : '240px', width:'84%' , marginTop: '60px' }"><div  class="tile mb-4" ><h2 id="typography">第一章:新时代坚持和发展中国特色社会主义</h2></div><div v-for="(section, index) in sections" :key="index"><div class="tile mb-4"><h4>{{section.title}}</h4><div v-for="(part,index) in section.content" :key="index"><p style="text-align: left;font-size: 18px;line-height: 1.9;text-indent: 2em;">{{part}}</p></div></div></div></div>
</div>
</template>

但是数据录入数据库的过程真的很枯燥繁琐,我也没想到有什么好方法能一次性把数据录入。

就拿新思想来举例,一门新思想课程分为17个大章节,在每个大章节里面还有4-5个问题,这样一门课下来要录入6、7十条的数据,一方面录入的数量很多,另一方面还要考虑分段和展示的问题,所以要求录入很精细,速度很慢,加上做的是重复动作,因此感觉很疲劳崩溃。

甚至有那么一瞬间,我似乎明白了程序员为啥会戏称自己为码农了。。

第2件事,让我整整难受了1天。那当属用拦截器来做权限的管理

之所以在我的这个网站中需要做权限的管理,主要是为了区分出3类用户:1.未登录用户。2.已登录用户,但未付费。3.已付费用户。

不同类型的用户只能访问资源的不同章节,比如未登录用户只能访问前10%的章节,已登录但未付费用户,只能访问前30%的章节,只有付费用户才能访问全部章节。

之所以不敢让未登录用户访问太多章节的原因是,怕出现安全问题。比如不排除某些“坏人”,会通过疯狂访问公共资源来破坏数据库,使其过负载。

有人可能会说你可以把公共资源放到redis缓存里呀,这样你就不用害怕“坏人”DOS攻击了(但很显然我想到了,现在还没来得及这么做,不过后面应该会做)。  

因此我选择仅开放一部分的资源,另一部分资源用拦截器拦截下来,避免对数据库造成冲击。

下面给大家简单看一下拦截器:

实话说代码并不复杂, 但逻辑比较复杂。比如JwtTokenAdminInterceptor这个拦截器主要是拦截未登录的用户,放行公共资源。然后TestInterceptor这个拦截器主要是为了拦截未付费用户,放行已登录用户能访问的所有资源。

然而这里面还有更复杂的,比如用户购买2门课程,可以是毛中特和新思想,也可以是近纲和马原。

一开始我觉得这是一个排列组合的问题,一个人在5门课中,可以选择只买1门,也可以选择全买,也可以选择买2门或者3门或者4门。这样子的话组件的情况会变得非常多,差不多是22种情况,难道每种情况都要写一个拦截器吗?

但经过我的苦思冥想(实则是GPT给我的思路),我采用了一个string来模拟bitmap,当某1位上为5代表用户没购买,当某1位上为1代表用户购买,只需要把为5的资源对应的请求地址加入到拦截器中即可,这样就可以实现只拦截用户没购买的资源。

之所以我最开始没想到这点,还是因为对拦截器的性质不太熟练

具体实现可以详见上面的代码。

第3件事,让我整整难受了3天。那当属网站上线后改前端的界面和BUG

因为在电脑上看页面屏宽很宽,可以显示完全,如下图:

但因为手机屏幕的宽度只有450作用,所以PC端看上去好好的界面,一到手机上就会变成一坨*。

此时有2种解决方案:

1.单独设置css样式PC端和移动端的代码,使得用一套代码来实现2种页面效果。

2.写2套代码,2套界面,通过地址访问不同的界面。这种一般是早期的做法,工作量太大。

秉持敏捷开发的原则,我舍弃了第2种方法,采用了第1种方法。

然后涉及到几个问题:

比如学习制作自适应页面代码的语法,然后一步步调试。

还有在一些不熟悉的css组间中反复挣扎,一会儿组间要横向摆放,比如“资源付费”界面,一会儿要竖向摆放;一会儿这个组件消失了,一会儿那个组件被遮挡了,要调位置还要调优先级。

一会儿这里好了,一会儿那里出问题了,在崩溃和喜悦之间反复横跳。

这里的过程就不多说了,实在是辛酸的血泪史。

中间还有一些插曲,比如说我的导航栏和侧栏是单独放在App.vue里的,然后主体界面是在vuews里面,就会涉及到不同组件之间共享变量的调用问题。

所以我感觉最难的根本不是后端代码,而是前端代码。。。

好了好了,接下来就说一些值得开心和喜悦的事吧。

第1件事,当然是独立部署上线了一个网站,能够让亲朋好友们在线访问,跟他们说这是我的网站,真心有满满的自豪感啊。

第2件事,攻克了很多的困难,从0-1搭建了一个网站,包括后端和前端,把一些学习到的知识现学现用,活学活用,加深了对知识的理解,在过程中也很享受改BUG的过程,当一切都基本完成之后,心中的喜悦明显会居多。

下面是一些代办事项,看着一件件待办事项被完成、划掉,内心充满自豪感。

但是不可否认的是网站当前还存在有一些问题,比如但不仅限于如下:

1.没有把公共资源缓存到Redis中;

2.SSL证书还没有办理,导致网站属于不安全状态;

3.数据库的设计不太合理,不符合第3范式。

4.界面上仍旧有需要改进的地方,比如在移动端显示下登录栏和注册栏时常会“分家”,一个掉到下面,一个挂在上面;

5.还有登录和注册的安全机制仍旧有待加强,比如还没有限制1人1手机只能注册1个账号;登录的时候也没有验证码,无法防止机器人恶意登录;登录校验也没有用更安全的Spring Security,仅仅只用了一个JWT的Token校验。

综上:我想说的是,尽管世界就像代码一样,仍旧有许多不完美的地方,但我相信在新的一年,会通过你我的共同努力,让其慢慢变得更好。

在此祝新老粉丝朋友们,新的一年心想事成,万事如意,龙年大吉。对那些愿意给西风捐赠的老板们,道一声诚挚的感谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2806415.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

大离谱!AI写作竟让孔子遗体现身巴厘岛,看完笑不活了

大家好&#xff0c;我是二狗。 这两天我在知乎上看到了一个AI写作大翻车的案例&#xff0c;看完简直笑不活了&#xff0c;特地分享给大家一起 happy happy&#xff5e; 知乎网友“打开盒子吓一跳”一上来就抛出来了一个“孔子去世”的王炸。 首先&#xff0c;下面是一条真实新…

每日一题——LeetCode1512.好数对的数目

方法一 暴力循环 var numIdenticalPairs function(nums) {let ans 0;for (let i 0; i < nums.length; i) {for (let j i 1; j < nums.length; j) {if (nums[i] nums[j]) {ans;}}}return ans; }; 消耗时间和内存情况&#xff1a; 方法二&#xff1a;组合计数 var …

智胜未来,新时代IT技术人风口攻略-第七版(弃稿)

文章目录 前言鸿蒙生态科普调研人员画像角色先行结论 - 市场下的增量蛋糕高校助力鸿蒙 - 掀起鸿蒙教育热潮高校鸿蒙课程开设占比 - 巨大需求背后是矛盾冲突教研力量并非唯一原因 - 看重教学成果复用与效率 企业布局规划 - 多元市场前瞻视野全盘接纳仍需一段时间 - 积极正向的一…

植物神经功能紊乱不治疗最坏后果会怎样?

植物神经功能紊乱是一种常见的疾病&#xff0c;它可以对人体的生理和心理产生严重的影响。如果不加以治疗&#xff0c;其最坏的后果将会是非常危险的。 植物神经功能紊乱是由于各种原因导致自主神经系统异常活跃或抑制而引起的一系列症状的总称。自主神经系统是负责自主调…

java基础-正则表达式+文件操作+内置包装类

目录 正则表达式去除字符串前后空格&#xff1a;去除每一行中首尾的空格去除开头的 数字_ 文件操作打印当前项目路径获取文件的上级目录/和\读取文件 内置包装类System类常用方法 Number类Integer类常用方法Float和Double 正则表达式 去除字符串前后空格&#xff1a; str.tri…

uTools:打造你的个性化效率工具箱

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、什么是uTools&#xff1f;①uTools②功能 二…

进程与线程之进程的理解

首先对堆栈等进程运行过程中的内存有了更深层次的理解&#xff1a; 我们之前了解到&#xff0c;程序在运行中存在堆栈&#xff0c;字符串常量区代码区。 现在我们提出虚拟内存的概念&#xff1a;程序在运行的过程中开辟0~4G的虚拟空间使用MUU映射单元映射到物理地址上 简而言…

28V、115V、270V坦克装甲车启动电源:为现代战争注入新能量

28V、115V、270V坦克装甲车启动电源&#xff1a;为现代战争注入新能量 世界新格局的诞生后&#xff0c;现代战争已经从传统的陆地、海洋、空中扩展到了网络空间和外太空。在这种背景下&#xff0c;各种先进的武器装备不断涌现&#xff0c;为国家安全提供有力保障。28V、115V、2…

【Unity】提示No valid Unity Editor liscense found.Please active your liscense.

有两个软件&#xff0c;如果只有一个&#xff0c;点黑的不会有效果、、、、&#xff08;楼主是这个原因&#xff0c;可以对号入座一下&#xff09; 简而言之&#xff0c;就是去下载Unity Hub&#xff0c;再里面激活管理通行证 问题情境&#xff1a; 点击unity出现以下弹窗&a…

C语言-指针详解速成

1.指针是什么 C语言指针是一种特殊的变量&#xff0c;用于存储内存地址。它可以指向其他变量或者其他数据结构&#xff0c;通过指针可以直接访问或修改存储在指定地址的值。指针可以帮助我们在程序中动态地分配和释放内存&#xff0c;以及进行复杂的数据操作。在C语言中&#…

一些PCB整改优化经验总结

一个UP的PCB整改经验&#xff1a; 当正面全局铺铜之后出现很多小铜皮碎片的时候不如不铺铜或者单面铺铜RJ45网口的地和整体的地分开&#xff0c;两地之间通过电容相连&#xff08;整板地一定要相连&#xff09;TVS这种防浪涌高压的器件的地单独铺设&#xff0c;这样当高压来临…

配电网重构知识及matlab实现

配网重构中&#xff0c;很重要的一个约束条件为配网应随时保持开环、辐射的状态&#xff1a; 配电网系统是属于闭环设计但是开环运行的系统&#xff0c;因此&#xff0c;在开关的开闭过程中&#xff0c;随时保持配电网的开环状态时很重要。Mendoza等利用图论&#xff0c;尤其是…

基于ElementUI封装省市区四级联动下拉选择

基于ElementUI封装的省市区下拉级联选择 效果 数据 最新省市区JSON数据获取&#xff1a;https://xiangyuecn.github.io/AreaCity-JsSpider-StatsGov/ 参数说明 参数说明inputNumShow下拉框的数量&#xff0c;最多4个defaultAddress默认显示省市区 例&#xff1a;[‘安徽’, …

音视频剪辑|Windows|抽帧和合帧

什么是抽帧&#xff1f; FFmpeg 抽帧&#xff08;Extracting frames&#xff09;的作用是从视频文件中按需提取单张或多张静止图像&#xff08;帧&#xff09;&#xff0c;并将它们保存为图片文件&#xff08;如 JPEG、PNG 等格式&#xff09;。这一功能在以下场合十分有用&am…

一元函数微分学——刷题(18

目录 1.题目&#xff1a;2.解题思路和步骤&#xff1a;3.总结&#xff1a;小结&#xff1a; 1.题目&#xff1a; 2.解题思路和步骤&#xff1a; 遇到绝对值函数&#xff0c;需要把它转化为分段函数&#xff0c;从而更加方便求导数&#xff1a; 3.总结&#xff1a; 遇到绝对…

Docker容器实战

"爱在&#xff0c;地图上&#xff0c;剥落~" Mysql 容器化安装 我们可以在 docker hub上&#xff0c;进入mysql的镜像仓库&#xff0c;找到适合的版本。 直接拉取镜像: docker pull mysql:latest 我们知道 msyql 的默认端口是 3306 &#xff0c;而且有密码&#x…

计算机网络实验四VLAN与三层交换机

一、实验目的和要求 1&#xff09;掌握VLAN的基本配置方法&#xff0c;理解VLAN的功能和作用&#xff1b; 2&#xff09;掌握三层交换机的基本配置方法。 二、实验环境 1&#xff09;运行Windows 2008 Server/XP/7操作系统的PC一台。 2&#xff09;PacketTracer。 实验内…

电子器件系列63:肖特基二极管NSQ03A04\SS34C

以下是肖特基二极管_SS34C_规格书_SLKOR(萨科微),立创编号C880740 以下是肖特基二极管NSQ03A04的规格书&#xff1a; 稍微比较下参数&#xff0c;发现两者参数接近&#xff0c;ss34的几个参数还要略微好一些&#xff0c;可以用ss34来作替换。 在电源电路中的应用&#xff1a; …

python实现贝尔曼福德算法

对于求图的最短路径问题,如果使用迪杰斯特拉算法,也可以算是一个较为常见的方法,但是对于迪杰斯特拉算法解决最短路径问题的时候,会存在一个问题,那就是所有边所对应的距离都必须是正数,而如果在存在负数的边的时候,迪杰斯特拉算法就会存在问题,而对于存在负数的这种情…

Bean的声明周期

1.创建Bean对象&#xff08;调用无参数构造&#xff09; 2.给bean对象设置相关属性&#xff08;依赖注入&#xff09; 3.bean后置处理器&#xff08;初始化前执行&#xff0c;类似于过滤器和拦截器&#xff09; 首先要定义一个类MyBeanPost&#xff0c;实现BeanPostProcessor…