我花了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://www.mzph.cn/news/700446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW串口通信的激光器模块智能控制

LabVIEW串口通信的激光器模块智能控制 介绍了通过于LabVIEW的VISA串口通信技术在激光器模块控制中的应用。通过研究VISA串口通信的方法和流程&#xff0c;实现了对激光器模块的有效控制&#xff0c;解决了数据发送格式的匹配问题&#xff0c;为激光器模块的智能控制提供了一种…

【Nginx】微信小程序后端开发、一个域名访问多个服务

【Nginx】微信小程序后端开发、一个域名访问多个服务 1. 微信小程序后端开发 对于后端程序员&#xff0c;其实你们的职责就是干老本行&#xff0c;即写接口和服务&#xff0c;让前端能够访问你的接口就行&#xff0c;必要时需要查看微信小程序开发文档去向微信服务器发请求。…

c#高级——插件开发

案例&#xff1a;WinForm计算器插件开发 1.建立插件库&#xff0c;设置各种自己所需的插件组件 如下图所示&#xff1a;进行了计算器的加减法插件计算组件 Calculator_DLL为总插件父类 Calculator_DLL_ADD 为插件子类的控件对象 Calculator_DLL_Sub Calculator_DLL_Factory 为…

即时设计和Axure对比,哪一个好用?

无论是国外页面设计工具&#xff0c;页面设计工具的发展从来没有停滞过&#xff0c; Axure&#xff0c;无论是国产设计工具即时设计&#xff0c;其功能都在不断更新迭代&#xff0c;为设计带来更高效的设计体验。今天对比两个设计工具&#xff0c;帮你找到最适合自己的&#xf…

用友NC65与用友NCC对接集成NC65-凭证列表查询打通凭证新增

用友NC65与用友NCC对接集成NC65-凭证列表查询打通凭证新增 数据源平台:用友NC65 用友NC是为集团与行业企业提供的全线管理软件产品&#xff0c;由亚太本土最大的企业管理软件提供商用友公司研发提供&#xff0c;用友NC率先采用J2EE架构和先进开放的集团级开发平台UAP&#xff0…

计算机网络-无线通信网

1.各种移动通信标准 1G&#xff1a;第一代模拟蜂窝&#xff1a;频分双工FDD。2G&#xff1a;第二代数字蜂窝 I.GDM&#xff08;全球移动通信&#xff09;采用TDMA。II.CDMA&#xff08;码分多址通信&#xff09;。2.5G&#xff1a;第2.5代通用分组无线业务GPRS。2.75G&#xf…

C语言-指针详解速成

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

Redis篇之Redis持久化的实现

持久化即把数据保存到可以永久保存的存储设备当中&#xff08;磁盘&#xff09;。因为Redis是基于内存存储数据的&#xff0c;一旦redis实例当即数据将会全部丢失&#xff0c;所以需要有某些机制将内存中的数据持久化到磁盘以备发生宕机时能够进行恢复&#xff0c;这一过程就称…

链表和顺序表的优劣分析及其时间、空间复杂度分析

链表和顺序表的优劣分析及其时间、空间复杂度分析 一、链表和顺序表的优劣分析二、算法复杂度<font face "楷体" size 5 color blue>//上面算法的执行次数大致为&#xff1a;F&#xff08;N&#xff09; N^22*N10;   N 10,F(10) 1002010 130次   N 1…

【Java】多线程编程(实验十)

目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 1、 了解线程的调度和执行过程&#xff0c;掌握Java 语言中多线程编程的基本方法 2、 掌握Runnable 接口实现多线程的方法 3、 掌握Thread 类实 现多线程的用法 二、实验内容 采用多线程机制模拟汇款业务。定…

C++中的STL数据结构

内容来自&#xff1a;代码随想录&#xff1a;哈希表理论基础 1.常见的三种哈希结构 当我们想使用哈希法来解决问题的时候&#xff0c;我们一般会选择如下三种数据结构 数组 set &#xff08;集合&#xff09; map(映射) 在C中&#xff0c;set 和 map 分别提供以下三种数据结构…

数据结构-列表LinkedList

一,链表的简单的认识. 数组,栈,队列是线性数据结构,但都算不上是动态数据结构,底层都是依托静态数组,但是链表是确实真正意义上的动态数组. 为什么要学习链表? 1,链表时最简单的动态数据结构 2,掌握链表有助于学习更复杂的数据结构,例如,二叉树,trie. 3,学习链表有助于更深入…

【SpringCloudAlibaba系列--nacos配置中心】

Nacos做注册中心以及使用docker部署nacos集群的博客在这&#xff1a; 容器化部署Nacos&#xff1a;从环境准备到启动 容器化nacos部署并实现服务发现(gradle) 使用docker部署nacos分布式集群 下面介绍如何使用nacos做配置中心 首先要进行nacos-config的引入&#xff0c;引入…

【QT QML】软件打包,生成安装包

一、版本 Desktop 5.15.2 MinGW 64-bit二、打包 1. 编译Release版本 2. 在工程目录下找到Realse文件夹 3. 拷贝文件 ***-Desktop_Qt_5_15_2_MinGW_64_bit-Release - release - xxx.exe到一个新文件夹中 4. 开启相应打包工具&#xff08;根据自己的编译器和版本选择&#xff0…

【C++】类与对象—— 初始化列表 、static 静态成员、

类与对象 1 再谈构造函数1.1 构造函数体赋值1.2 初始化列表语法&#xff1a;建议&#xff1a;初始化顺序&#xff1a;注意&#xff1a; 1.3 explicit关键字 2 static 静态成员2.1 概念2.2 声明成员变量2.3 使用类的静态成员2.4 定义静态成员总结 Thanks♪(&#xff65;ω&#…

深入了解Kettle工具:数据集成与转换的利器

深入了解Kettle工具&#xff1a;数据集成与转换的利器 在当今数据驱动的时代&#xff0c;企业需要处理大量来自不同来源的数据&#xff0c;并将其整合到统一的数据仓库或数据湖中&#xff0c;以便进行进一步的分析和挖掘。而在这个过程中&#xff0c;数据集成与转换工具扮演着…

Android BitmapDrawable.bitmap与BitmapFactory.decodeResource获取不到原始图像素级真实宽高,Kotlin

Android BitmapDrawable.bitmap与BitmapFactory.decodeResource获取不到原始图像素级真实宽高&#xff0c;Kotlin 当一个图片放在ImageView里面后&#xff0c;用以下方式获取图的宽高&#xff1a; val bmp1 (this.drawable as BitmapDrawable).bitmapLog.d("fly", &…

直流恒流源电路

简介 使用电流源稳压器芯片搭建&#xff0c;该恒流源输出电流Iout1OuA*R2/R1,该电路可用于电阻阻值检测等相关场合。 注意&#xff1a;支持最大电流为200mA LT3092IST#PBF 简介 原理图展示

如何查看电脑使用记录?保障个人隐私和安全

查看电脑使用记录是了解电脑活动的一种重要方式&#xff0c;可以帮助用户追踪应用程序的使用情况、登录和关机时间、文件的访问记录等。在本文中&#xff0c;我们将介绍如何查看电脑使用记录的三个方法&#xff0c;以分步骤详细说明如何查看电脑使用记录&#xff0c;帮助用户更…