自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(111)
  • 问答 (2)
  • 收藏
  • 关注

原创 项目实战——28个例子思想总结

经过这三个例子的研究,现在觉得,面向对象不该看作一种方式,或者说技术,而应当看作一种可以用来优化种种细节的理念,比如,只要遇到重复的东西,就可以考虑要不要抽象,可不可以抽象。我觉得有必要明白的是,像分环境这样在行业内普遍存在的东西,那么很大概率背后是无数开发者,无数项目组摸索出来的东西,是前人的经验,是巨人的肩膀,所以应当拥有一种敬畏的心,去体会去思考,在项目实践中感受它的价值,将其转变为自己的认知。想到曾经自己画的原型,其实就有很多重复的元素,但是当时如果想到封装组件的话,那么当时的工作效率会高很多。

2023-03-18 16:21:06 832

原创 项目实战17—环境混用带来的影响

既然项目分出来了开发、测试、生产三个环境,那么自己作为开发人员思维上也要明确分环境的意义,不能心里还是一套环境的思维。如果造成用户的使用故障,那么会严重影响用户的好感度,影响软件的口碑。3.后续排查:去d-fastdfs.dmsd.tech服务器curl访问www.baidu.com很慢,因此怀疑哪里连接出现了问题,导致了超时,当时重启了本机的nginx也没有效果,最后重启了系统才行了。2.明确权限:没有权限的人不能操作,如果操作需要申请,同时在各个环节加入审核机制,这样在工作流程上大大减少工作量。

2023-03-18 11:20:09 182

原创 项目实战15—登录之后我加入的课程调用接口报错

如下图,这里遇到了一个非线程安全的全局变量ArrayList,当new了一个显得ArrayList,向里面存值,但是ArrayList中之前的值还没有及时被清空,所以拼接出来的地址是错的。在多线程的情况下,有的线程在修改数据,有的线程在读取,所以读取出来的可能是错的,ArrayList线程是不安全的,所以出现了这种情况,可以选择加synchronized锁。首先存入redis的域名是不全的,是错误的,当然从redis中查询出来的也是错误的。下面的红框的代码里设置了存入redis失效的时间是一天。

2023-03-17 21:28:42 655

原创 项目实战25—用户、第三方系统和项目之间的耦合性

这样造成的问题就是AR助教机器人和第三方平台的耦合度太高,如果出现网络问题访问不通第三方平台接口,或者出现爬取失败的情况,那么我们的系统就无法正常使用了,需要第三方平台来辅助实现功能,就会造成这种不可控因素。系统想要正常上课,之前的情况是,教师需要在第三方平台上制作好课程,然后AR系统去第三方平台上爬取到系统上给学生使用,同时学生登录系统也需要使用第三方平台的账号密码进行校验。1.对于登录需要在第三方平台校验的问题,改成只要在第三方平台登录成功,就往自己的库中记录数据,下一次登录通过自己的库校验即可。

2023-03-17 15:14:24 139

原创 项目实战12—数据库数据类型不一致导致查询慢

两个分别有76015和217096条数据的表,都涉及到了is_Delete字段,发现了查询很慢的问题,根据is_Delete传参的数据类型不一样,推测问题原因是索引失效。Mysql添加索引的情况下,如果数据库数据类型是数值类型,传入数值类型和字符串类型索引都生效;如果数据库类型是字符串类型,只有传入的是字符串类型索引才生效。is_delete=0是数值类型 is_delete=“0”是字符串类型。

2023-03-17 11:26:28 158

原创 项目实战6—没有复用思想的反例

三个红框内都有一样的参数,#{course_id}和#{class_id},在“相同”的情况下,是不是可以考虑抽象出来呢?避免传三次参数的麻烦。两个接口看起来很相似,第一个有入参而第二个没有,那么可以合并为一个实现吗?反例2.SQL语句没有复用思想的反例。反例1.接口没有复用思想的反例子。

2023-03-17 10:58:02 76

原创 项目实战8—用户成为设计者

软件和用户,指的可以不仅仅是传统意义上的开发的APP和用户。如上图,一个表格也可以看作一个软件,每一个需要查看和编辑这个表格的人,而如何让表格这个产品更好呢,让每一个表格的协作者,变成这个表格的设计者,正如让每个软件的使用者成为我们软件的设计者。最常用的就是我们的手机界面,我们平时可以自由的在上面排列APP,拖动即可,可以根据自己的需要或者兴趣自由添加图片卡片、小组件等,自由选择壁纸,这样一来,每个手机用户的界面都是不一样的,也是最适合自己需要的。

2023-03-17 10:23:08 202

原创 项目实战26—nacos的命名空间名字和id不一致带来的思考

由于dev和localhost使用的同一个命名空间,我们多个服务相互调用的时候,开发人员本地启动把本地服务注册到和dev同一个命名空间;导致dev环境部分功能不能用(在线人员列表无法加载出数据)2023.3.16 目前项目依赖存在报错,正在排查中,解决好了会更新。在这一步,我把命名空间ID和命名空间名写成了一致的,避免记忆混乱。然后查看配置列表,点击+号新建配置。配置的冒号后面要有一个空格。

2023-03-16 21:32:58 325

原创 项目实战11——生产环境重大事故

为的是避免意外,虽然出现问题很难免,但是如果让用户感受到了问题导致的无法使用或者使用不便,就很可能造成用户流失的重大损失,造成难以修复的软件口碑下降,所以两套环境就是需要有一份保证没问题的备份,以备不时之需。2.工作中,同事之间关于工作的交流,有时候面对面是最容易避免误会的方式,最直接简单的方式就是口头的方式,但有的时候也是最不靠谱的方式。所以,如果没有同时维护好两套环境,比如其中一套环境没有及时构建,那么两套环境就失去了意义,让正常的一套环境陷入了遇到问题没有备份的危险境地。1.生产A环境没有及时构建。

2023-03-16 21:05:30 112

原创 项目实战09—数据类型不一致导致equals判断为false

equals如果没有进行重写操作,比较的是两个对象的地址,如果重写,那么按照重写方法内的逻辑进行判断。:包装类重写了equals方法,在equals方法中判断传入的对象是不是包装类的实例(instanceof),如果不是的话就返回false,这是本问题的原因所在。在这里发现了问题是,左边long类型,右边string类型,值相同,但是用equals()判断不相等,类型不匹配返回false的问题。是 Java 的保留关键字,它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。

2023-03-16 15:19:44 293

原创 项目实战23—tar部分服务频繁掉线

IP地址注册混乱,删除了用来存储注册信息的protocol文件夹。2.删除data目录下的protocol文件夹。图中这个服务会出现频繁掉线的问题。1.找到nacos的data目录。

2023-03-16 11:44:30 165

原创 项目实战24—xxljob控制台不打印日志

1.首先,项目用到了xxljob,通过了解xxljob在项目中是如何工作的,xxljob会将日志持久化到数据库中,然后会从表中读取数据显示到控制台。遇到问题解决问题,我觉得前提是对所用的工具、技术的特性有个充分的了解,同时要有个平稳冷静的心态,逐步排查,最终解决问题。3.既然用到了数据库,这个时候也要查看数据库在项目中是如何工作的,如何发挥作用的。5.项目用到了主从数据库,问题最终定定位到了mysql主从读写不一致的问题。上面主库插入了一条数据,从库不进行同步的操作,因此判断为主从问题。

2023-03-16 10:47:00 688

原创 项目实战18—面向对象的开门小例子

1.利用抽象、封装、消息监听、事件和委托的形式,抽象出来的四个类分别是:发消息人类、收消息人类、业务处理类、客户端。1.一个现实中常见的业务场景:米老师需要进入办公室,需要何老师帮忙开门,或者说需要一个开门的人。对于这个业务场景进行抽象的话,可以抽象出四个类:发消息人类、收消息人类、业务处理类、客户端。2.面向过程的思路:何老师告诉米老师钥匙在哪里,然后米老师去取了钥匙,最后去开门。2.面向对象加入反射的形式(不再被人所局限,更加灵活),同样抽象出四个类。2.我们注重的是有多少人干事,而不是干多少事。

2023-03-16 10:07:34 282

原创 项目实战28—生产环境nginx限制上传大小带来的灾难

起初调整nginx大小的解决方案,就是从外部解决问题,存在侥幸心理,因为总是寻求外部的帮助,自己的思考就少了,解决问题的能力也就很难增长。同时,外部环境是牵一发而动全身的,可能自己一个看似简单的修改,会造成严重的后果,在用户量足够多的情况下,任何问题都会被放大。既然上传大小受到了限制,那么可以分多次请求,比如nginx限制1.5k,那么可以传10次,通过循环的方式10次上传。通过后续的思考,其实是完全可以在不改变外部环境的情况下解决问题的,还避免了增加负载。当然,还会有更好的方案,想到会补充。

2023-03-16 09:22:58 115

原创 项目实战3——feign调用404

(Nacos在springcloud项目中发挥着注册中心和配置中心的作用,作为配置中心将配置从应用中抽离出来,交给nacos统一的来管理配置,可以配置多套环境,发生改变各个微服务各自到nacos配置中心拉取相关配置,实现配置中心化避免频繁修改配置文件)生产部署了两台,做了负载,用了同一个nacos命名空间,只更新了一台,导致请求到了没有更新的那一台,所以出现了404问题。两个服务提供者权重配置相同,consumer调用到没有更新过的provider的方法时,显示服务调用成功。

2023-03-15 21:24:22 438

原创 项目实战7——在线人员列表逻辑混乱反例

原本入参里面已经包括了所有需要传的参数,而实体里的参数可以赋不同的值,比如红框里表示状态的参数是“1”,但涉及到了不同的状态也可能是0或者2,那么这里参数写1就不合适了,所以要保持和方法传进来的入参一致。问题2:create_date与接收的createDate一致的时候,条件才成立,但是问题来了,这个字段的值是具体到日期的时间,所以只有在当天两个值才相等,超过24点,则createDate日期加一,那么就不会满足这个条件了,所有在线的人就无法下线了。7.SQL不考虑业务导致的明确的逻辑漏洞。

2023-03-14 21:07:54 191

原创 项目实战16——消息队列的意义

消息队列,英文简称是MQ,“消息队列”是在消息的传输过程中保存消息的容器。ProduceClient 消息生产者。ConsumeClient 消息消费者。消息处理中心 Broker。

2023-03-14 14:58:59 156

原创 项目实战21——面向对象的复用、实现、立体化权限落地

在项目开发的过程中,发现了激励规则配置之中的元素,图片、音效等,还有拖动条这样的组件,不止在一个页面能用得到,如果每个页面都写一遍组件的对应代码的话,那么不仅麻烦,还需要多花很多时间。比如我们在电脑桌面上常见的悬浮球,它是一个功能入口,是一个软件界面,其实可以看作一个封装好的对象。流程图,原本是过程化的体现,体现出来的是面向过程的思想。图片和音效同理,作为一个组件起初只让它在项目里存在一份,哪里需要,哪里调用,不需要的时候则释放。比如图中的拖动条,可以封装成一个公共的组件,哪个页面需要,哪个页面调用。

2023-03-13 19:36:06 96

原创 项目实战20—内存长期占用导致系统缓慢

发现问题,解决问题,是贯穿整个项目开发过程的事情,能够处理更多的问题,随着经验的丰富,提前预知更多的问题,让问题不出现是最好的解决问题方式。Windows+R > cmd > 输入命令 java -XX:+PrintCommandLineFlags -version。2.项目运行过程中有大量的对象被创建出来,可是没有及时被GC回收,或者具有引用的GC无法回收。3.经过了GC之后,堆内的对象被清理,但是操作系统的内存没有被立刻释放。双击对应的行,查看详细的信息,根据信息选择针对性的解决方案。

2023-03-11 21:28:49 359

原创 项目实战5——发送调查问卷流程代码流程优化

根据条件是或否,在后端分别调用sendingQuestionnaires和getActivityConfiguration接口。原因是将调用activityExcuteByConfiguration接口返回值的条件判断逻辑放入后端,这样将不必要的逻辑写入前端进行处理,容易导致逻辑混乱难以管理和维护。从流程图之中不难发现,左侧前端部分。优化后的图通过对比,最直观的是左侧前端虚线框内的元素少了很多。针对这个案例第一遍尝试优化,可能不太完善,欢迎提出建议!左侧虚线框内为前端部分,右侧虚线框内为后端部分。

2023-03-10 19:35:36 110

原创 项目实战22—原型图的复用思想

一个需要有多个页面的项目,这多个页面也对应着多个需要绘制的产品原型图。如果采用传统认知的面向过程的思维方式,那么每个页面的每一个细节都要亲力亲为,遇到相似的地方就Ctrl C+V,如何相似的地方是多个小控件的组合,还要每个都选中,麻烦的很,这是一个让人头疼的工作量。当设计好了圆形的样式,那么下一步前端就需要把样式实现出来,那么开放过程中同样利用面向对象的思想。原型和前端页面想对应,原型中封装了什么组件,那么前端开发也封装什么组件。任何相似的在多个页面有涉及的元素,我们都可以封装成一个组件。

2023-03-09 20:57:51 76

原创 项目实战2—SQL优化操作1

通过把groupby改为distinct和类型一致实现SQL优化

2023-03-08 15:34:02 208

原创 项目实战10——对生产环境要有敬畏之心

有的时候容易被当前做的事情局限,而不去深入的考虑,不去深入想想做当前的事情所处的环境,以及这样做有没有风险?生产环境,是直接面向用户的,动生产环境的数据可能造成的用户数据混乱,使用体验变差。造成公司财产的损失。1、开发环境:专供开发开发人员开发时使用的环境,每位开发开发人员在自己的dev分支上干活,提测前或者开发到一定程度,各位开发人员会合并代码,进行联调。在没有老师在上课的时间,系统内显示出很多在线人员,排查了一圈,确实没有用户使用,最后发现是在生产环境做测试,修改了生产环境的用户数据……

2023-03-07 21:24:09 111

原创 项目实战21—理由Mybatis动态SQL实现复用

在没有复用思想的时候,就只顾着实现功能。比如开发过程中涉及到两个表的更新功能,每需要更新一处,就写一个接口,结果出现了写了11个接口的情况。这样虽然功能实现了,可是可能自己都忘了自己当时写的是什么。别人看起来维护起来更是困难,写得多还更容易出错。4.数据库连接文件 db.properties。这里用到了通用SQL这个概念。这样就避免了写多个接口的麻烦和带来的后续麻烦。7.下面就是最重要的部分,通用SQL。3.项目目录结构,按照这个结构创建。5.MyBatis配置文件。6.MyBatis配置类。

2023-03-07 20:41:36 849

原创 项目实战4——uniapp在线升级关联云空间

uniapp在线升级关联云空间

2023-03-07 16:24:35 1078

原创 MySQL创建四种索引以及索引失效的情况

在MySQL中,索引也叫“键”,是存储引擎用于快速找到记录的一种数据结构。4.索引失效-ISNULL。通过缩小范围实现精确定位。加速查询,提高查询效率。1.索引失效-范围查询。2.索引失效-使用函数。3.索引失效-通配符。

2023-03-07 10:44:26 160

原创 项目实战14—前端代码优化

代码是给自己看的,也是给别人看的,是给一个团队看的。前期编码梳理好清晰的逻辑,写出可读性高的代码。界面是给用户看的,任何一个小的细节问题都会影响观感。3.一个界面,如果想在整体和细节上观感不错,那么页面的元素一定要有所规律,最起码的,就是要对齐。1.谨慎使用 v-if ,避免造成逻辑混乱,一层能解决就不要两层判断嵌套在一起。2.清晰明了的写出注释,代码也不要堆在一起,而是根据接口清晰分层。特性:(1)是块级元素,不能与其他元素并列的,单独占一行。(2)可以设置宽和高,如果不设置的话,宽度默认100%

2023-03-04 21:29:09 66

原创 项目实战19——临时解决方案和最终解决方案

都会遇到一个治标还是治本的问题,前者就是临时解决方案,一时好转但是隐患还在,在紧急情况下适合用来安顿局面,后者则是最终解决方案,事情都最好从根本上解决问题。去年阳了的时候,有两种药很火爆,分别是布洛芬和连花清瘟,为什么两种药一起吃效果最好呢,因为前者药效是退烧,减轻不舒服的感觉,这是临时解决方案,治标。可是课程结束之后,为了避免再次发生这种情况,为了避免每次上课都要重复1和2操作的麻烦,就要采用最终解决方案了,课程过后由专业的人员仔细排查问题,从用户的角度出发去思考,彻底解决。1.重新登录一下即可。

2023-03-04 17:31:37 202

原创 项目实战1——redis缓存不一致的问题

当开发一个需求,像上面这样,既涉及到了普通的关系型数据库,也用到了redis这种不同的数据库形式,要结合起来,练习起来看,明确其发挥作用,使用的界限,避免发生这样不对应的情况。所以说,如何添加数据的时候如果没有及时清空缓存,那么方法判断缓存有数据,于是直接加载了现有的数据,数据库里最新的数据则没有显示出来。(1)查看缓存中的数据,还是上一次的数据(根据hash类型的key获取value,缓存是hash数据类型)原因:添加新的数据,但是没有及时清空缓存,打开页面加载的还是上次的数据。(3)再次查询缓存数据。

2023-03-04 11:48:41 516

原创 项目实战13—localStorage总结

选择使用一种技术,首先到对这种技术的性质特点有充分的了解,然后结合需求的使用场景,选择合适的技术。比如页面的实时数据就不适合用缓存,因为localStorge里面的数据只要不手动清除就一直在,这样会导致第二次打开页面显示的是第一次的数据,所以这种情况不适合用,拿到数据直接渲染到页面比较适合。如果涉及到实时的显示到不同的页面,那么可以用父子页面传值的技术,能保证每一次打开的数据都是最新的,实时变化的数据不需要缓存存储。拓展了cookie的4kb的限制,存储空间达到5MB,相当于属于前端页面的一个数据库。

2023-03-03 20:34:30 722

原创 关于线程池

线程池,顾名思义就是事先创建若干个可执行的线程放入一个容器(池)中,需要的时候从池中获取线程,而不用自行创建,使用完之后不需要销毁,而是放回池中,从而减少创建和销毁线程对象的开销。4.TIDYING:线程池在所有的任务已经终止,任务数量为0的时候,变成TIDYING,此时会执行terminated()函数。固定数量的线程池,每提交一个任务就是一个线程,直到达到线程池的最大数量,然后后面进入等待队列直到前面的任务完成才继续执行。单个线程的线程池,就是说线程池中每次只有一个线程在工作,单线程串行执行任务。

2023-02-10 18:23:06 596

原创 关于MySQL存储引擎

存储引擎是什么,和常用存储引擎的详细区别

2023-02-09 18:21:09 45

原创 12月产品原型设计总结

1.关于违规审核的解冻功能的逆向思考2.想象与现实的差距3.从发个身边的日常着手获得启发

2022-12-30 10:32:32 88

原创 架构学习之——字斟句酌

.从版本2到版本一实现了从有限到无限的扩展,从两个确定数相加到两个任意数相加,实现了从有限2个数相加,到无限个数相加。同时通过a+B实现了对算法的封装,从而实现了在这里面具体的加法复用。...

2022-06-19 18:02:22 224

原创 什么是多态

多态是指为不同数据类型的实体提供统一的接口(不同类型的实体指的是各个子类类型,统一的接口是父类指向子类的对象)……文中不仅有对定义通俗的解释,还有代码的对应

2022-06-07 21:04:27 314

原创 关于E-R(实体-联系)图

E-R图也称实体-联系图,提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型。要素:用矩形表示实体型,矩形框内写明实体名;用椭圆表示实体的属性,并用无向边将其与相应的实体型连接起来;用菱形表示实体型之间的联系,在菱形框内写明联系名,并用无向边分别与有关实体型连接起来,同时在无向边旁标上联系的类型。联系:一对一联系(1:1)一对多联系(1:n)多对多联系(n:n)E-R图不仅能描述两个实体之间的联系,而且还能描述两个以上的实体之间的联系。比如有顾客、商品、售货员三个实体,并且有

2022-05-16 21:21:16 3281

原创 原型图是什么?如何画原型图

在我第一次听说“原型图”的时候,我一度以为“原型图”是圆的,从一开始的不了解,到尝试着画,已经是软件开发过程中不可或缺的一部分。原型图是什么?原型图是一款产品推出市场之前的一个简单的示例,就是将页面的排版布局通过这种形式展现出来,包括每个功能键的交互展示,使产品的初步构思有一个可视化的展示原型图规范:1.不要以截图的形式展现原型图截图是静态的,这样不仅不够专业,且不利于更好的展示。2.结合面向对象中的可复用面向对象程序设计中,我们会把公共的抽象出一个类,需要的时候new一个对象,减少了冗余。原

2022-05-16 21:17:17 5565

原创 面向对象和面向过程的区别

背景:想要面向对象,写出的却经常是面向过程的代码,造成了重复或者说冗余。面向对象和面向过程的区别是什么呢?下面展开来说。面向过程:1.目的:为了提高性能、减少调用的消耗2.缺点:不利于维护、拓展、复用面向对象:1.目的:易于维护、拓展、复用2.缺点:调用消耗大,性能相对较低例子:面向对象好比手机的内部结构,分为屏幕总成、电池模块、主板、小板等,有一次我的屏幕坏了,那我只需要买一个全新的屏幕总成,插上排线就OK了,我不需要关心屏幕是怎么做出来的,由多少层组成的,这不需要知道。屏幕总成相当于封

2022-05-13 20:43:52 2071

原创 关于面向对象思想

或许是以前过程化思维太重了,总是把面向对象,在头脑里解释成面向过程的样子。曾经没有深入思考过,便以为自己已经略知大概。直到昨日听了米老师的课。让我有了启发而想要深入思考一下这个问题。首先,面向对象是什么?面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。简单的定义,但是有很深的内涵需要理解。面向对象的三大特征:封装、继承、多态面向对象的基础:抽象* 抽象:抽象是从众多的事物中抽取出共同的、本质性的特征

2022-05-05 20:38:49 224

原创 为什么没有抽象,就没有封装继承多态

关于这个问题,首先明确一下抽象是什么:抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征的过程。具体地说,抽象就是人们在实践的基础上,对于丰富的感性材料通过去粗取精、去伪存真、由此及彼、由表及里的加工制作,形成概念、判断、推理等思维形式,以反映事物的本质和规律的方法。(摘自百度百科)。由此得知,抽象关键在于从众多食物中抽取出共同的本质性的特征。而封装继承多态,是面向对象的三大特征,为什么没有前者就没有后者呢?**封装**封装是面向对象程序设计的第一步,它是将函数,方法等集合在一个

2022-01-04 15:33:54 222 3

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除