回顾2023编程之旅

    一、前言

  看在给了我一个博客专家的份上就继续写写博客,实事求是的讲如果是工作之余去总结csdn写写技术博客,还想混个专家什么的,真的是精力不够。因为里面的灌水的实在太多,比不过的,写这个玩意必须得淡泊名利才能悠然自得,想写啥就写啥,想写多少是多少,写这种东西纯粹是保持对技术的新鲜度和敏感性,只要不违规就好,不必在乎这些虚的东西。

  二、回顾2023编程之旅       

1、应用的开发

       2023年我主要在开发一个小程序商城,通用的架构还是springCloud全家桶那一套的东西,底层数据库使用了mysql ,clickhouse ,pg 这些数据库,中间件 使用了redis ,rocketMq ,OSS 开发框架使用的是springBoot 3.0 , gateway ,  eureka, apollo 这些组件,前端使用的vue框架,部署框架主要使用nginx, docker ,软件应用层主要是小程序和H5的形式,还有后台管理系统几个。

     我的编程非常简单,因为使用的是springboot的后端框架,我自研了代码逆向生成工具,基本设计好表结构,就能生成整个微服务,基本的增删查改的代码功能都有,其他的是个性化开发。

比如设计好了表: acct_card

逆向工程生成的controller代码示例:

 

/**
  * @Description: 卡账户主账户Controller
  * @Date: 2023-12-19
  */
@RestController
@RequestMapping("acctCard")
@Slf4j
public class AcctCardController {

    @Autowired
    private AcctCardService acctCardService;
    
	@ApiOperation(value = "分页查询卡账户主账户列表", notes = "分页查询卡账户主账户列表")
    @PostMapping("pageList")
    public ResponseData<PageUtils> queryPage(@RequestBody Map<String, Object> param) {
        PageUtils pageUtils = acctCardService.queryPage(param);
        return ResponseData.success(pageUtils);
    }
	
	
	/**
	 * 查询所有卡账户主账户列表
	 * @param  
	 * @return
	 */
	@ApiOperation(value = "查询所有卡账户主账户列表", notes = "查询所有卡账户主账户列表")
    @PostMapping("searchAll")
    public ResponseData<List<AcctCard>> searchAll() {
		List<AcctCard> acctCardList = acctCardService.list();
    	if(!CtgUtils.isCollectionNull(acctCardList)) {
        	return  ResponseData.success(acctCardList);
    	}else {
    		log.info(AcctCardConstant.NOT_EXIST);
    		return  ResponseData.success(acctCardList);
    	}
    }
	
	/**
	 * 保存卡账户主账户
	 * @param acctCard
	 * @return
	 */
	@ApiOperation(value = "保存卡账户主账户", notes = "保存卡账户主账户")
    @PostMapping("save")
    public ResponseData<String> save(@RequestBody AcctCard acctCard) {
    	boolean res = acctCardService.save(acctCard);
    	if(res) {
        	return ResponseData.success(AcctCardConstant.SAVE_SUCCESS);
    	}else {
    		log.error(AcctCardConstant.SAVE_FAILED);
    		return ResponseData.error(AcctCardConstant.SAVE_FAILED);
    	}
    }
	
	/**
	 * 删除卡账户主账户
	 * @param acctCard
	 * @return
	 */
	@ApiOperation(value = "删除卡账户主账户", notes = "删除卡账户主账户")
    @PostMapping("delete")
    public ResponseData<String> delete(@RequestBody AcctCard acctCard) {
    	boolean res = acctCardService.removeById(acctCard);
    	if(res) {
        	return ResponseData.success(AcctCardConstant.DELETE_SUCCESS);
    	}else {
    		log.error(AcctCardConstant.DELETE_FAILED);
    		return ResponseData.error(AcctCardConstant.DELETE_FAILED);
    	}
    }
	
	/**
	 * 根据主键ID更新卡账户主账户
	 * @param acctCard
	 * @return
	 */
	@ApiOperation(value = "根据主键ID更新卡账户主账户", notes = "根据主键ID更新卡账户主账户")
    @PostMapping("update")
    public ResponseData<Boolean> update(@RequestBody AcctCard acctCard) {
		boolean res = acctCardService.updateById(acctCard);
    	if(res) {
        	return  ResponseData.success(true);
    	}else {
    		log.error(AcctCardConstant.UPDATE_FAILED);
    		return  ResponseData.error(AcctCardConstant.UPDATE_FAILED);
    	}
    }
	
	/**
	 * 批量删除卡账户主账户
	 * @param acctCardList
	 * @return
	 */
	@ApiOperation(value = "批量删除卡账户主账户", notes = "批量删除卡账户主账户")
    @PostMapping("deleteList")
    public ResponseData<String> deleteList(@RequestBody List<AcctCard> acctCardList) {
    	boolean res = acctCardService.removeByIds(acctCardList);
    	if(res) {
        	return ResponseData.success(AcctCardConstant.DELETE_SUCCESS);
    	}else {
    		log.error(AcctCardConstant.DELETE_FAILED);
    		return ResponseData.error(AcctCardConstant.DELETE_FAILED);
    	}
    }

	/**
	* 根据主键ID查找卡账户主账户
	*/
	@ApiOperation(value = "根据主键ID查找卡账户主账户", notes = "根据主键ID查找卡账户主账户")
	@PostMapping("searchById")
	public ResponseData<AcctCard> searchById (@RequestBody AcctCard acctCard) {
		AcctCard acctCardRes = acctCardService.getById(acctCard.getId());
		if (ObjectUtil.isNotEmpty(acctCardRes)) {
			return ResponseData.success(acctCardRes);
		}else {
			log.error(AcctCardConstant.QUERY_FAILED);
			return ResponseData.error(AcctCardConstant.QUERY_FAILED);
		}
	}
 
}

2.接口的开发

除了开发应用,在2023年中很多时间都在开发接口,主要就是我们的小程序商城需要和外部企业进行合作,进行流量互到,所以有很多接口需要开发。

对于外部接口我们还是使用http的方式

接口对接主要是几个步骤

1、提供一个获取token的接口、

2、接口参数的加解密

3、提供业务接口

接口传输标准:

调用方式(url)

POST,视具体接口定义,POST请求头(headers)需要携带 source参数,值为1

请求类型(ContentType)

application/json

响应类型(ContentType)

application/json

部分接口参数示例:

{
    "code": 200,
    "message": "成功",
    "data": {
        "openId": null,
        "sessionKey": null,
        "userId": "6636b27895f80e3b23159",
        "oneId": null,
        "state": 1,
        "token": null,
        "isAuthorPhone": "0",
        "isRegUser": null,
        "userInfo": null
    },
    "encrypt": false
}

有的接口数据量和并发量比较大,对于实时性要求不高的我们才有走mq的形式,一方将数据发送到mq,另一方从mq进行消费。

3.应用维护

我们的小程序上线以后,就需要经常维护,比如服务器告警的处理,系统日志的归档,web安全漏洞等等,这些东西就占用了比较多的时间。有时候由于需要搞活动,还需要给应用进行扩容。对于扩容还比较简单,我们的系统支持横向无限扩容,但是最好规模是在100个服务以内,超过100个服务,那维护起来也是很麻烦的。

我们服务器的告警主要有带宽使用的告警,至于CPU,内存,磁盘这些告警,一年下来几乎没有,磁盘的告警也只是由于日志文件较多,占满了磁盘,日志一般保留半年就行。时间长的可以删除或者归档存储到其他地方去,这是主要的解决方案。至于web安全漏洞,就出现的比较多,一般有高危的和中低危的,高危的我们基本都修复了 ,有些低危的没有修复。下面列一下今年出现的部分系统漏洞

Apache Commons Text StringLookup 远程代码执行漏洞( 
Spring Cloud Gateway spel 远程代码执行 
Apache Spark 管理员后台未授权访问
Spring Data MongoDB SpEL表达式注入漏洞 
fastjson <= 1.2.68 反序列化远程代码执行漏洞
Apache Spark RPC协议反序列化漏洞 
Spring Cloud Gateway spel 远程代码执行 
Apache POI <= 4.1.0 XSSFExportToXml XXE漏洞
Jackson 最新反序列化漏洞(CVE-2019-14361和CVE-2019-14439)【版本检测】

上面的很多漏洞都是通过升级组件版本解决的 有些是通过网关 进行处理,也有些通过防火墙进行设置。

三、2023在csdn的创作之旅

今年在csdn上写了100多篇博文吧,主要还是记录工作中遇到的一些问题,很多都没按照优秀博文的形式进行编写,我觉得这并不重要,主要还是加深对编程的理解和保持新鲜度,因为还是要靠这个技能活下去,混口饭吃。博客写的好,精力和回报也成不了正比,今年在csdn收入的100多块钱都拿来发红包了。谢谢各位大佬的关注和抬爱。哈哈哈,就写这么多吧。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(7)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置&#xff08;6&#xff09; 2.2 HOST主桥 MPC8548处理器的拓扑结构如图2-2所示&#xff1a; OCeaN部件的拓扑结构如图2-3所示&#xff1a; 2.2.1 PCI设备配置空间的访问机制 为了…

轻松入门:Anaconda 在 PyCharm 中的配置与应用指南

1 Anaconda Anaconda 和 Conda 是两个相关但不同的概念。 Anaconda 是一个免费且开源的发行版&#xff0c;包含了 Python 和 R 语言的数据科学和机器学习相关的众多包&#xff0c;它包括 Conda、Python、Jupyter Notebook 等多个科学计算和数据科学中常用的应用。 Anaconda 通过…

30、共空间模式CSP与白化矩阵

CSP算法和PCA降维都涉及到了白化&#xff0c;那白化的目的和作用到底是啥呢&#xff1f; 矩阵白化目的&#xff1a; 对于任意一个矩阵X&#xff0c;对其求协方差&#xff0c;得到的协方差矩阵cov(X)并不一定是一个单位阵。 下面介绍几个线代矩阵的几个概念&#xff1a; 1、…

Oracle分区表

文章目录 A. varchar2类型时间字段(20240102)分区实战1. 表要不要分区2. 将已经存在的表改造为分区表(时间字段&#xff0c;varchar2类型)3. 增加分区3.1 增加分区3.2 置换分区&#xff0c;不会复制索引&#xff0c;不要用这种语法建表&#xff0c;这是专门为置换分区用的3.3 分…

【方法】PPT设置密码后如何修改?

PowerPoint是我们日常和工作中经常用到的办公软件&#xff0c;有时候为了保护文件&#xff0c;还会设置密码&#xff0c;那设置密码后又想要修改密码&#xff0c;怎么操作呢&#xff1f;下面来看看PPT常用的两种密码是如何修改的。 1. “打开密码” 想要修改PPT的“打开密码”…

【深度学习】cv领域中各种loss损失介绍

文章目录 前言一、均方误差二、交叉熵损失三、二元交叉熵损失四、Smooth L1 Loss五、IOU系列的loss 前言 损失函数是度量模型的预测输出与真实标签之间的差异或误差&#xff0c;在深度学习算法中起着重要作用。具体作用&#xff1a; 1、目标优化&#xff1a;损失函数是优化算法…

Modbus 通信协议 二

Modbus 常用缩写 通用Modbus帧结构 -应用数据单元&#xff08;ADU&#xff09; Modbus数据模型 Modbus ADU 和 PDU 的长度 Modbus PDU结构 串行链路上的 Modbus 帧结构 Modbus 地址规则 ASCLL 模式 和 RTU 模式的比较 RTU 模式 RTU 模式位序列 帧格式 帧的标识与鉴别 CRC 循环冗…

2023春季李宏毅机器学习笔记 02 :机器学习基本概念

资料 课程主页&#xff1a;https://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.phpGithub&#xff1a;https://github.com/Fafa-DL/Lhy_Machine_LearningB站课程&#xff1a;https://space.bilibili.com/253734135/channel/collectiondetail?sid2014800 一、機器學習基本原理…

【Pytorch】学习记录分享10——TextCNN用于文本分类处理

【Pytorch】学习记录分享10——PyTorchTextCNN用于文本分类处理 1. TextCNN用于文本分类2. 代码实现 1. TextCNN用于文本分类 具体流程&#xff1a; 2. 代码实现 # coding: UTF-8 import torch import torch.nn as nn import torch.nn.functional as F import numpy as np…

canal本地搭建以及运行

具体的文档可参考官网文档&#xff1a;https://github.com/alibaba/canal/wiki canal [kənl]&#xff0c;译意为水道/管道/沟渠&#xff0c;主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费 工作原理 canal 模拟 MySQL slave 的交互协议&#x…

01-线程池项目背景:C++的数据库操作

从0开始学习C与数据库的联动 1.原始方式-使用MySQL Connector/C 提供的API查询 1.1 数据库预操作 我的本地电脑上有mysql数据库&#xff0c;里面预先创建了一个database名叫chat&#xff0c;用户名root&#xff0c;密码password。 1.2 Visual Studio预操作 在Windows上使用…

vue3中使用echarts:tooltip的trigger为axis tooltip不显示问题

vue3中使用echarts时&#xff0c;tooltip的trigger设置为axis时formatter不触发 tooltip: {trigger: "axis",formatter: function (params) {console.log("params", params);},axisPointer: {type: "shadow", // 阴影指示器}, },解决办法&#…

10分钟设置免费海外远程桌面使用Amazon Lightsail服务的免费套餐轻松搭建远程桌面

本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道。 目录 前言 使用教程 启动 Amazon Lightsail 实例 配置远程桌面 启动远程桌面 使…

圆通速递单号查询入口,筛选出指定某天签收的单号

随着电商和物流行业的飞速发展&#xff0c;快递单号的管理也成了一个让人头疼的问题。如何快速筛选、整理这些快递单号&#xff0c;成为了提高生活和工作效率的关键。而【快递批量查询高手】的出现&#xff0c;正好可以巧妙的解决上面的问题&#xff0c;下面就来具体看看这款软…

Docker一键极速安装Nacos,并配置数据库!

1 部署方式 1.1 DockerHub javaedgeJavaEdgedeMac-mini ~ % docker run --name nacos \ -e MODEstandalone \ -e JVM_XMS128m \ -e JVM_XMX128m \ -e JVM_XMN64m \ -e JVM_MS64m \ -e JVM_MMS64m \ -p 8848:8848 \ -d nacos/nacos-server:v2.2.3 a624c64a1a25ad2d15908a67316d…

【洛谷千题详解】P5706 【深基2.例8】再分肥宅水

只需要用t/n即可。 AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int main() {float a;int b;cin>>a>>b;double ca/b;printf("%.3f\n",c);cout<<b*2<<endl;return 0; }

VuePress部署到GitHub Pages

一、git push自动部署 1、创建用于工作流的文件 在项目根目录下创建一个用于 GitHub Actions 的工作流 .yml 文件 name: docson:# 每当 push 到 main 分支时触发部署push:branches: [main]# 手动触发部署workflow_dispatch:jobs:docs:runs-on: ubuntu-lateststeps:- uses: a…

问题 E: 便利店

题目描述 天宝来到便利店想买些饮料。便利店有各种型号的瓶装饮料售卖&#xff0c;不同型号的饮料卖不同的价格。1瓶0.25升的卖A元&#xff0c;1瓶0.5升的饮料卖B元&#xff0c;1瓶1升的卖C元&#xff0c;1瓶2升的卖D元。便利店里每种饮料都是无限供应。 天宝要买N升的饮料&a…

逻辑斯蒂回归

逻辑斯蒂回归简介 逻辑斯蒂回归&#xff08;Logistic Regression&#xff09;是一个非常经典的算法&#xff0c;虽然被称为回归&#xff0c;但其实际上是分类模型&#xff0c;并常用于二分类。因为通过逻辑回归模型&#xff0c;我们得到的计算结果是0-1之间的连续数字&#xff…

FreeRTOS 实时操作系统第九讲 - 链表 (数据结构)

一、链表简述 链表是一种物理存储单元上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列节点&#xff08;链表中每一个元素称为节点&#xff09;组成&#xff0c;节点可以在运行时动态生成。每个节点包括两个部分&…