一年一度的程序员节日到了,小孟祝大家往后写代码无bug,不脱发,财务自由。
对于1024节日,CSDN也举办了技术交流大会,我的很多博主小伙伴也都去了,因为我离的比较远就没有去。
最近,没事的时候,拍拍视频,和大家分享下技术、私活、职场经验。
没想到的是,我竟然被喷上了热搜。骂声一片!搞不懂我做错什么了!
三周我开发完了一个小程序的系统。本来是很正常的一个系统,一个很正常的开发周期。
前面的这个系统,我也在CSDN发了文章:
小孟5w接了个盲盒小程序,三周开发完毕!
三周开发完被喷,用分库分表被喷,有头发被喷。三周开发完很难吗?现在框架这么多,关键我重构了一套属于自己的系统,现在哪个公司开发让你从搭建框架开始写?。大部分的crud,我都可以一键生成,复杂逻辑的我才会去写。很多系统我一两天就搞完。如果我说这个,还不被骂s!
看下我分享的技术栈:
下面是系统的核心代码
@Controller
@RequestMapping("/addressInfo")
public class AddressInfoController extends BaseController {
@Resource
private AddressInfoService addressInfoService;
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@SetMenuAnnotation
@RequestMapping("listPage")
public ModelAndView listPage(ModelAndView modelAndView) {
modelAndView.setViewName("addressInfo/list");
return modelAndView;
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("addPage")
public String addPage() {
return "addressInfo/add";
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("editPage")
public ModelAndView editPage(ModelAndView modelAndView, Long id) {
modelAndView.addObject("id", id);
modelAndView.setViewName("addressInfo/edit");
return modelAndView;
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("/getList")
@ResponseBody
public ReturnDataForLayui getList(AddressInfo addressInfo) {
addressInfo.setIsDeleted(PageBean.isDeletedNo);
return addressInfoService.getList(addressInfo);
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("/add")
@ResponseBody
public ReturnData add(AddressInfo addressInfo) {
return addressInfoService.add(addressInfo);
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("/update")
@ResponseBody
public ReturnData update(AddressInfo addressInfo) {
return addressInfoService.update(addressInfo);
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("/updateDelete")
@ResponseBody
public ReturnData updateDelete(AddressInfo addressInfo) {
addressInfo.setIsDeleted(PageBean.isDeletedYes);
return addressInfoService.updateDelete(addressInfo);
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("/updateDeleteBatch")
@ResponseBody
public ReturnData updateDeleteBatch(String ids) {
List<Long> idList = JSON.parseArray(ids, Long.class);
return addressInfoService.updateDeleteBatch(idList);
}
}
@Controller
@RequestMapping("/blindBoxInfo")
public class BlindBoxInfoController extends BaseController {
@Resource
private BlindBoxInfoService blindBoxInfoService;
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@SetMenuAnnotation
@RequestMapping("listPage")
public ModelAndView listPage(ModelAndView modelAndView) {
modelAndView.setViewName("blindBoxInfo/list");
return modelAndView;
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("addPage")
public String addPage() {
return "blindBoxInfo/add";
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("editPage")
public ModelAndView editPage(ModelAndView modelAndView, Long id) {
modelAndView.addObject("id", id);
modelAndView.setViewName("blindBoxInfo/edit");
return modelAndView;
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("goodsLevelEditPage")
public ModelAndView goodsLevelEditPage(ModelAndView modelAndView, Long id) {
BlindBoxInfo blindBoxInfo = new BlindBoxInfo();
blindBoxInfo.setId(id);
ReturnDataForLayui list = blindBoxInfoService.getList(blindBoxInfo);
ArrayList<BlindBoxInfo> blindBoxInfos = (ArrayList<BlindBoxInfo>) list.getData();
BlindBoxInfo blindBoxInfoDb = blindBoxInfos.get(0);
String goodsLevel = blindBoxInfoDb.getGoodsLevel();
GoodsLevelInfo goodsLevelInfo = JSONUtils.json2pojo(goodsLevel, GoodsLevelInfo.class);
if (goodsLevelInfo == null) {
goodsLevelInfo = new GoodsLevelInfo();
}
goodsLevelInfo.setId(id);
modelAndView.addObject("goodsLevelInfo", goodsLevelInfo);
modelAndView.setViewName("blindBoxInfo/goodsLevelEdit");
return modelAndView;
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("/getList")
@ResponseBody
public ReturnDataForLayui getList(BlindBoxInfo blindBoxInfo) {
blindBoxInfo.setIsDeleted(PageBean.isDeletedNo);
return blindBoxInfoService.getList(blindBoxInfo);
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("/add")
@ResponseBody
public ReturnData add(BlindBoxInfo blindBoxInfo) {
return blindBoxInfoService.add(blindBoxInfo);
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("/update")
@ResponseBody
public ReturnData update(BlindBoxInfo blindBoxInfo) {
return blindBoxInfoService.update(blindBoxInfo);
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("/updateGoodsLevel")
@ResponseBody
public ReturnData updateGoodsLevel(GoodsLevelInfo goodsLevelInfo) {
return blindBoxInfoService.updateGoodsLevel(goodsLevelInfo);
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("/updateIsOnSale")
@ResponseBody
public ReturnData updateIsOnSale(BlindBoxInfo blindBoxInfo) {
return blindBoxInfoService.updateIsOnSale(blindBoxInfo);
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("/updateDelete")
@ResponseBody
public ReturnData updateDelete(BlindBoxInfo blindBoxInfo) {
blindBoxInfo.setIsDeleted(PageBean.isDeletedYes);
return blindBoxInfoService.updateDelete(blindBoxInfo);
}
@MustSetForOrderNoAnnotation
@AuthenticationAnnotation
@RequestMapping("/updateDeleteBatch")
@ResponseBody
public ReturnData updateDeleteBatch(String ids) {
List<Long> idList = JSON.parseArray(ids, Long.class);
return blindBoxInfoService.updateDeleteBatch(idList);
}
系统的核心数据库:
DROP TABLE IF EXISTS `address_info`;
CREATE TABLE `address_info` (
`id` bigint(19) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键id',
`person_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名',
`phone` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '电话',
`gender` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '性别',
`address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '地址',
`user_id` bigint(19) NOT NULL COMMENT '用户',
`is_deleted` char(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '是否删除',
`gmt_create` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`gmt_update` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '收货地址信息' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of address_info
-- ----------------------------
INSERT INTO `address_info` VALUES (1, 'zhy', '18034272031', '2', '河北省 衡水市', 1, '0', '2021-09-08 14:39:49', '2021-09-08 15:37:20');
INSERT INTO `address_info` VALUES (2, '张红雨', '18034272031', '2', '北京市 海淀区 中央电视台大楼对面 富尔大厦 3008', 1, '0', '2021-09-08 15:21:00', '2021-09-08 15:37:00');
-- ----------------------------
-- Table structure for blind_box_info
-- ----------------------------
DROP TABLE IF EXISTS `blind_box_info`;
CREATE TABLE `blind_box_info` (
`id` bigint(19) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键id',
`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '标题',
`description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述',
`price` bigint(19) NOT NULL COMMENT '单价',
`sort` int(9) NOT NULL COMMENT '排序',
`is_on_sale` char(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '是否上架',
`goods_level` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '概率',
`is_deleted` char(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '是否删除',
`gmt_create` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`gmt_update` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '盲盒信息' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of blind_box_info
-- ----------------------------
INSERT INTO `blind_box_info` VALUES (1, '擎天柱重装上阵', '变形金刚变身“咔咔咔咔咔咔”', 1, 0, '1', '{\"id\":1,\"level1\":25,\"level2\":25,\"level3\":25,\"level4\":25}', '0', '2021-09-02 17:21:15', '2021-09-19 13:30:47');
INSERT INTO `blind_box_info` VALUES (2, '苹果iPhone纯享', '苹果手机笔记本平板主机耳机', 1, 0, '1', '{\"id\":2,\"level1\":0.01,\"level2\":0.01,\"level3\":0.01,\"level4\":99.97}', '0', '2021-09-02 17:35:39', '2021-09-19 13:30:48');
INSERT INTO `blind_box_info` VALUES (3, '燃烧生命吧!你的可能性是无限可能,无所不能', '概率所得限量真骨雕新品!', 11, 1, '1', '{\"id\":3,\"level1\":0.01,\"level2\":0.02,\"level3\":0.03,\"level4\":99.94}', '0', '2021-09-02 17:53:36', '2021-09-12 21:44:13');
INSERT INTO `blind_box_info` VALUES (4, '111', '111', 1100, 1, '1', '{\"id\":null,\"level1\":25,\"level2\":25,\"level3\":25,\"level4\":25}', '0', '2021-09-19 13:32:10', '2021-09-19 13:32:27');
-- ----------------------------
-- Table structure for file_upload_info
-- ----------------------------
DROP TABLE IF EXISTS `file_upload_info`;
CREATE TABLE `file_upload_info` (
`id` bigint(19) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键id',
`path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '路径',
`file_size` bigint(19) NULL DEFAULT NULL COMMENT '大小',
`data_from` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '来源',
`is_deleted` char(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '是否删除',
`gmt_create` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`gmt_update` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 102 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '文件上传信息' ROW_FORMAT = Dynamic;
被喷其实我的心还比较平静。但我知道大部分的程序员在公司做的还是比较低端的代码,一直CRUD,没有自己封装的系统,没有重构过代码。接私活的话,考察的能力比较全。
整个项目,需求、原型设计、UI、前端、后端、数据库设计,基本都是我自己干完的。
作为程序员,如果你也想全能,下面可以看下我写的,如果我上面写的瞎吹,可以直接划走 。
第一, 喜欢搞技术,往架构师、CTO迈步
这是我搞技术的时候,最初的梦想,也是最纯粹的想法。
开始写程序的时候,没有任何的我杂念,参加比赛、给导师做项目、泡图书馆、深夜写代码。
做了8年程序员后,我发现我不再适合做程序员,因为我做不到架构师的那个层面。
我没有造轮子的心,虽然也在学习底层、算法,但是和我的博士老婆对比,我找出了差距。
如果你工作几年后,觉得还喜欢代码,喜欢研究技术,就往架构师、CTO迈步。
具体需要什么要的能力,看一些招聘网站就知道了。例如:
如果你觉得写代码不行,可以去做业务,专精业务。当然职场有kpi,有勾心斗角,这需要你情商较高,有一定的沟通能力。
这种小孟就不适合,我原来经常怼产品经理。
但是仅仅靠沟通、关系远远是不够的,要成为管理者,也需要技术,不然也说服不了众人呀,比如Java这一块
你要懂:
Java基础;
SSM框架;
SpringBoot;
微服务;
JDK底层;
中间件;
缓存;
数据库;
Vue、React等前端。
如果你没有学习的框架,看我整理的这个学习的路线:
第三,创业
我创业这几年,感受颇深。
孤独、无奈、沮丧,鬼tm直到我怎么过来的。关键是有时候父母的不理解,一直数落我:
你说你一个硕士,不找个好点的单位上班,整天游荡什么,和一个无业游民有什么区别?
我知道自己想要什么,年轻的时候不拼一把,难道要等到50岁的时候拼 吗?父母是传统的父母,我尊重、理解他们的想法,但是我是一个独立的个体,我有自己的思想和追求。失败了,我会承担后果,其实也没什么后果。大不了,再回职场敲代码。
还好媳妇比较支持我,有一个人支持我就够了。
我深知创业和风险成正比,上班一个月两三万是比较安稳,但是改变不了现状。现在的收入比原来也好了很多。单单zfb的收入都还可以。商业的单子收益更大。
创业操心比较多,就是费心的事,为了节省成本,公司的技术都是我来做,还有其他的很多事。
现在我发布的文章、视频很多都是我凌晨一两点搞定的。
纵观我所有的技术朋友,他们都有一个共同的特点:
有非常清晰的职业规划。
梦想还是有的,万一实现呢!乾坤未定,你我皆黑马!
鸡血打完了,1024快乐,我去继续码代码了!
求个三连,点赞,收藏,更多干货的更新ing:
为了帮助大家快速提高技术,我整理了很多100个项目。