• 【计算机毕业设计】基于SpringBoot的电影在线预定与管理系统的设计与实现


    博主主页:一季春秋
    博主简介:专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。
    主要内容:毕业设计(Java项目、小程序等)、简历模板、学习资料、面试题库、技术咨询。

    🍅文末获取联系🍅

    精彩专栏推荐订阅👇🏻👇🏻 不然下次找不到哟

    SpringBoot+Vue项目持续更新中

    http://t.csdn.cn/1mgm8

    目录

    一、项目介绍 

    二、项目主要技术 

    三、系统总体功能设计

    四、系统实现

    4.1 前台功能实现

    4.2 后台模块实现 

    五、实现代码


    一、项目介绍 

    本系统是通过Java语言来进行设计和实现的。项目主要用到的技术是SpringBoot框架,Vue框架,数据库使用的是SQL,系统采用的开发工具是IntelliJ IDEA。

    本电影在线预定与管理系统主要包括个首页、人中心、管理员管理、用户管理、电影管理、论坛管理、公告信息管理、基础数据管理、轮播图信息等多个模块。它帮助电影在线预定与管理实现了信息化、网络化,通过测试,实现了系统设计目标,相比传统的管理模式,本系统合理的利用了电影在线预定与管理数据资源,有效的减少了电影在线预定与管理的经济投入,大大提高了电影在线预定与管理的效率。

    二、项目主要技术 

    1. 开发语言:Java
    2. 使用框架:spring boot
    3. 前端技术:Vue 、css、element-ui、js
    4. 开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code
    5. 数据库:MySQL 5.7/8.0
    6. 数据库管理工具:phpstudy/Navicat
    7. JDK版本:jdk1.8
    8. Maven: apache-maven 3.8.1-bin

    三、系统总体功能设计

    通过软件的需求分析已经获得了系统的基本功能需求,根据需求,将电影在线预定与管理系统功能模块主要分为管理员模块。管理员添加首页、个人中心、管理员管理、用户管理、电影管理、论坛管理、公告信息管理、基础数据管理、轮播图信息等等操作。如图是系统的功能结构图。

    四、系统实现

    4.1 前台功能实现

     前台首页

    电影页面

    电影详情

    电影订单

    4.2 后台模块实现 

    管理员输入用户名和密码,下拉选择框,选择用户权限,然后点击立即登录,系统与保存在数据库的数据进行匹配,如果用户名与密码与数据库存放数据匹配,系统跳转到用户页面,否则提示错误重新跳转到登录页面。

    管理员子系统模块主要包括对首页、人中心、管理员管理、用户管理、电影管理、论坛管理、公告信息管理、基础数据管理、轮播图信息等模块。

    个人中心是可以进行添加系统管理员操作。添加管理员时,需要分别设置管理员的用户名,用户名不能为空,设置密码,在下拉选择框中选择权限。该模块还具备查询所有管理员列表,可以编辑修改列表中管理员的资料,包括用户名、密码和权限。

    用户管理是可以进行添加用户信息操作。在文本框输入所要添加的用户管理,然后提交即可,输入错误可以点击重置按钮对文本框重置。

    查询所有电影管理列表,查询电影信息,可以对列表中电影信息进行修改、删除等操作。

    论坛管理是可以进行添加论坛信息操作。添加论坛信息时,需要设置论坛信息,然后提交即可,输入错误可以点击重置按钮对文本框重置。

    查询所有公告信息管理列表,查询公告信息,并对公告信息进行修改,可以对列表中公告信息进行删除。

    基础数据管理是可以列表中进行添加基础数据信息操作。添加基础数据信息时,需要设置基础数据信息基本信息,然后提交即可,输入错误可以点击重置按钮对文本框重置。

    轮播图信息是可以列表中进行添加轮播图信息操作。添加轮播图信息时,需要设置轮播图基本信息,然后提交即可,输入错误可以点击重置按钮对文本框重置。

    五、实现代码

    电影订单

    1. /**
    2. * 电影订单
    3. * 后端接口
    4. * @author
    5. * @email
    6. */
    7. @RestController
    8. @Controller
    9. @RequestMapping("/dianyingOrder")
    10. public class DianyingOrderController {
    11. private static final Logger logger = LoggerFactory.getLogger(DianyingOrderController.class);
    12. private static final String TABLE_NAME = "dianyingOrder";
    13. @Autowired
    14. private DianyingOrderService dianyingOrderService;
    15. @Autowired
    16. private TokenService tokenService;
    17. @Autowired
    18. private DianyingService dianyingService;//电影
    19. @Autowired
    20. private DianyingCommentbackService dianyingCommentbackService;//电影评价
    21. @Autowired
    22. private DictionaryService dictionaryService;//字典
    23. @Autowired
    24. private ForumService forumService;//论坛
    25. @Autowired
    26. private GonggaoService gonggaoService;//公告信息
    27. @Autowired
    28. private YonghuService yonghuService;//用户
    29. @Autowired
    30. private UsersService usersService;//管理员
    31. /**
    32. * 后端列表
    33. */
    34. @RequestMapping("/page")
    35. public R page(@RequestParam Map params, HttpServletRequest request){
    36. logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
    37. String role = String.valueOf(request.getSession().getAttribute("role"));
    38. if(false)
    39. return R.error(511,"永不会进入");
    40. else if("用户".equals(role))
    41. params.put("yonghuId",request.getSession().getAttribute("userId"));
    42. CommonUtil.checkMap(params);
    43. PageUtils page = dianyingOrderService.queryPage(params);
    44. //字典表数据转换
    45. List list =(List)page.getList();
    46. for(DianyingOrderView c:list){
    47. //修改对应字典表字段
    48. dictionaryService.dictionaryConvert(c, request);
    49. }
    50. return R.ok().put("data", page);
    51. }
    52. /**
    53. * 后端详情
    54. */
    55. @RequestMapping("/info/{id}")
    56. public R info(@PathVariable("id") Long id, HttpServletRequest request){
    57. logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
    58. DianyingOrderEntity dianyingOrder = dianyingOrderService.selectById(id);
    59. if(dianyingOrder !=null){
    60. //entity转view
    61. DianyingOrderView view = new DianyingOrderView();
    62. BeanUtils.copyProperties( dianyingOrder , view );//把实体数据重构到view中
    63. //级联表 电影
    64. //级联表
    65. DianyingEntity dianying = dianyingService.selectById(dianyingOrder.getDianyingId());
    66. if(dianying != null){
    67. BeanUtils.copyProperties( dianying , view ,new String[]{ "id", "createTime", "insertTime", "updateTime", "yonghuId"});//把级联的数据添加到view中,并排除id和创建时间字段,当前表的级联注册表
    68. view.setDianyingId(dianying.getId());
    69. }
    70. //级联表 用户
    71. //级联表
    72. YonghuEntity yonghu = yonghuService.selectById(dianyingOrder.getYonghuId());
    73. if(yonghu != null){
    74. BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createTime", "insertTime", "updateTime", "yonghuId"});//把级联的数据添加到view中,并排除id和创建时间字段,当前表的级联注册表
    75. view.setYonghuId(yonghu.getId());
    76. }
    77. //修改对应字典表字段
    78. dictionaryService.dictionaryConvert(view, request);
    79. return R.ok().put("data", view);
    80. }else {
    81. return R.error(511,"查不到数据");
    82. }
    83. }
    84. /**
    85. * 后端保存
    86. */
    87. @RequestMapping("/save")
    88. public R save(@RequestBody DianyingOrderEntity dianyingOrder, HttpServletRequest request){
    89. logger.debug("save方法:,,Controller:{},,dianyingOrder:{}",this.getClass().getName(),dianyingOrder.toString());
    90. String role = String.valueOf(request.getSession().getAttribute("role"));
    91. if(false)
    92. return R.error(511,"永远不会进入");
    93. else if("用户".equals(role))
    94. dianyingOrder.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
    95. dianyingOrder.setCreateTime(new Date());
    96. dianyingOrder.setInsertTime(new Date());
    97. dianyingOrderService.insert(dianyingOrder);
    98. return R.ok();
    99. }
    100. /**
    101. * 后端修改
    102. */
    103. @RequestMapping("/update")
    104. public R update(@RequestBody DianyingOrderEntity dianyingOrder, HttpServletRequest request) throws NoSuchFieldException, ClassNotFoundException, IllegalAccessException, InstantiationException {
    105. logger.debug("update方法:,,Controller:{},,dianyingOrder:{}",this.getClass().getName(),dianyingOrder.toString());
    106. DianyingOrderEntity oldDianyingOrderEntity = dianyingOrderService.selectById(dianyingOrder.getId());//查询原先数据
    107. String role = String.valueOf(request.getSession().getAttribute("role"));
    108. // if(false)
    109. // return R.error(511,"永远不会进入");
    110. // else if("用户".equals(role))
    111. // dianyingOrder.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
    112. dianyingOrderService.updateById(dianyingOrder);//根据id更新
    113. return R.ok();
    114. }
    115. /**
    116. * 删除
    117. */
    118. @RequestMapping("/delete")
    119. public R delete(@RequestBody Integer[] ids, HttpServletRequest request){
    120. logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
    121. List oldDianyingOrderList =dianyingOrderService.selectBatchIds(Arrays.asList(ids));//要删除的数据
    122. dianyingOrderService.deleteBatchIds(Arrays.asList(ids));
    123. return R.ok();
    124. }
    125. /**
    126. * 批量上传
    127. */
    128. @RequestMapping("/batchInsert")
    129. public R save( String fileName, HttpServletRequest request){
    130. logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
    131. Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")));
    132. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    133. //.eq("time", new SimpleDateFormat("yyyy-MM-dd").format(new Date()))
    134. try {
    135. List dianyingOrderList = new ArrayList<>();//上传的东西
    136. Map> seachFields= new HashMap<>();//要查询的字段
    137. Date date = new Date();
    138. int lastIndexOf = fileName.lastIndexOf(".");
    139. if(lastIndexOf == -1){
    140. return R.error(511,"该文件没有后缀");
    141. }else{
    142. String suffix = fileName.substring(lastIndexOf);
    143. if(!".xls".equals(suffix)){
    144. return R.error(511,"只支持后缀为xls的excel文件");
    145. }else{
    146. URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);//获取文件路径
    147. File file = new File(resource.getFile());
    148. if(!file.exists()){
    149. return R.error(511,"找不到上传文件,请联系管理员");
    150. }else{
    151. List> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
    152. dataList.remove(0);//删除第一行,因为第一行是提示
    153. for(List data:dataList){
    154. //循环
    155. DianyingOrderEntity dianyingOrderEntity = new DianyingOrderEntity();
    156. // dianyingOrderEntity.setDianyingOrderUuidNumber(data.get(0)); //订单号 要改的
    157. // dianyingOrderEntity.setDianyingId(Integer.valueOf(data.get(0))); //电影 要改的
    158. // dianyingOrderEntity.setYonghuId(Integer.valueOf(data.get(0))); //用户 要改的
    159. // dianyingOrderEntity.setDianyingOrderTruePrice(data.get(0)); //实付价格 要改的
    160. // dianyingOrderEntity.setDianyingOrderTypes(Integer.valueOf(data.get(0))); //订单类型 要改的
    161. // dianyingOrderEntity.setBuySectionNumber(Integer.valueOf(data.get(0))); //车厢 要改的
    162. // dianyingOrderEntity.setBuyZuoweiNumber(data.get(0)); //购买的座位 要改的
    163. // dianyingOrderEntity.setBuyZuoweiTime(sdf.parse(data.get(0))); //订购日期 要改的
    164. // dianyingOrderEntity.setInsertTime(date);//时间
    165. // dianyingOrderEntity.setCreateTime(date);//时间
    166. dianyingOrderList.add(dianyingOrderEntity);
    167. //把要查询是否重复的字段放入map中
    168. //订单号
    169. if(seachFields.containsKey("dianyingOrderUuidNumber")){
    170. List dianyingOrderUuidNumber = seachFields.get("dianyingOrderUuidNumber");
    171. dianyingOrderUuidNumber.add(data.get(0));//要改的
    172. }else{
    173. List dianyingOrderUuidNumber = new ArrayList<>();
    174. dianyingOrderUuidNumber.add(data.get(0));//要改的
    175. seachFields.put("dianyingOrderUuidNumber",dianyingOrderUuidNumber);
    176. }
    177. }
    178. //查询是否重复
    179. //订单号
    180. List dianyingOrderEntities_dianyingOrderUuidNumber = dianyingOrderService.selectList(new EntityWrapper().in("dianying_order_uuid_number", seachFields.get("dianyingOrderUuidNumber")));
    181. if(dianyingOrderEntities_dianyingOrderUuidNumber.size() >0 ){
    182. ArrayList repeatFields = new ArrayList<>();
    183. for(DianyingOrderEntity s:dianyingOrderEntities_dianyingOrderUuidNumber){
    184. repeatFields.add(s.getDianyingOrderUuidNumber());
    185. }
    186. return R.error(511,"数据库的该表中的 [订单号] 字段已经存在 存在数据为:"+repeatFields.toString());
    187. }
    188. dianyingOrderService.insertBatch(dianyingOrderList);
    189. return R.ok();
    190. }
    191. }
    192. }
    193. }catch (Exception e){
    194. e.printStackTrace();
    195. return R.error(511,"批量插入数据异常,请联系管理员");
    196. }
    197. }
    198. /**
    199. * 前端列表
    200. */
    201. @IgnoreAuth
    202. @RequestMapping("/list")
    203. public R list(@RequestParam Map params, HttpServletRequest request){
    204. logger.debug("list方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
    205. CommonUtil.checkMap(params);
    206. PageUtils page = dianyingOrderService.queryPage(params);
    207. //字典表数据转换
    208. List list =(List)page.getList();
    209. for(DianyingOrderView c:list)
    210. dictionaryService.dictionaryConvert(c, request); //修改对应字典表字段
    211. return R.ok().put("data", page);
    212. }
    213. /**
    214. * 前端详情
    215. */
    216. @RequestMapping("/detail/{id}")
    217. public R detail(@PathVariable("id") Long id, HttpServletRequest request){
    218. logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
    219. DianyingOrderEntity dianyingOrder = dianyingOrderService.selectById(id);
    220. if(dianyingOrder !=null){
    221. //entity转view
    222. DianyingOrderView view = new DianyingOrderView();
    223. BeanUtils.copyProperties( dianyingOrder , view );//把实体数据重构到view中
    224. //级联表
    225. DianyingEntity dianying = dianyingService.selectById(dianyingOrder.getDianyingId());
    226. if(dianying != null){
    227. BeanUtils.copyProperties( dianying , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段
    228. view.setDianyingId(dianying.getId());
    229. }
    230. //级联表
    231. YonghuEntity yonghu = yonghuService.selectById(dianyingOrder.getYonghuId());
    232. if(yonghu != null){
    233. BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段
    234. view.setYonghuId(yonghu.getId());
    235. }
    236. //修改对应字典表字段
    237. dictionaryService.dictionaryConvert(view, request);
    238. return R.ok().put("data", view);
    239. }else {
    240. return R.error(511,"查不到数据");
    241. }
    242. }
    243. /**
    244. * 前端保存
    245. */
    246. @RequestMapping("/add")
    247. public R add(@RequestBody DianyingOrderEntity dianyingOrder, HttpServletRequest request){
    248. logger.debug("add方法:,,Controller:{},,dianyingOrder:{}",this.getClass().getName(),dianyingOrder.toString());
    249. DianyingEntity dianyingEntity = dianyingService.selectById(dianyingOrder.getDianyingId());
    250. if(dianyingEntity == null){
    251. return R.error(511,"查不到该电影");
    252. }
    253. // Double dianyingNewMoney = dianyingEntity.getDianyingNewMoney();
    254. if(false){
    255. }
    256. else if(dianyingEntity.getDianyingNewMoney() == null){
    257. return R.error(511,"票价不能为空");
    258. }
    259. List buyZuoweiNumberList = new ArrayList<>(Arrays.asList(dianyingOrder.getBuyZuoweiNumber().split(",")));//这次购买的座位
    260. List beforeBuyZuoweiNumberList = new ArrayList<>();//之前已经购买的座位
    261. //某天日期的某个分段
    262. List dianyingOrderEntityList =
    263. dianyingOrderService.selectList(new EntityWrapper()
    264. .eq("dianying_id", dianyingOrder.getDianyingId())
    265. .eq("buy_zuowei_time", dianyingOrder.getBuyZuoweiTime())
    266. .eq("buy_section_number", dianyingOrder.getBuySectionNumber())
    267. .notIn("dianying_order_types",102)//已退款的订单
    268. );
    269. for(DianyingOrderEntity d:dianyingOrderEntityList){
    270. beforeBuyZuoweiNumberList.addAll(Arrays.asList(d.getBuyZuoweiNumber().split(",")));
    271. }
    272. buyZuoweiNumberList.retainAll(beforeBuyZuoweiNumberList);//判断当前购买list包含已经被购买的list中是否有重复的 有的话 就保留
    273. if(buyZuoweiNumberList != null && buyZuoweiNumberList.size()>0 ){
    274. return R.error(511,buyZuoweiNumberList.toString()+" 的座位已经被使用");
    275. }
    276. //计算所获得积分
    277. Double buyJifen =0.0;
    278. Integer userId = (Integer) request.getSession().getAttribute("userId");
    279. YonghuEntity yonghuEntity = yonghuService.selectById(userId);
    280. if(yonghuEntity == null)
    281. return R.error(511,"用户不能为空");
    282. if(yonghuEntity.getNewMoney() == null)
    283. return R.error(511,"用户金额不能为空");
    284. double balance = yonghuEntity.getNewMoney() - dianyingEntity.getDianyingNewMoney()*(dianyingOrder.getBuyZuoweiNumber().split(",").length);//余额
    285. if(balance<0)
    286. return R.error(511,"余额不够支付");
    287. dianyingOrder.setDianyingOrderTypes(101); //设置订单状态为已购买
    288. dianyingOrder.setDianyingOrderTruePrice(dianyingEntity.getDianyingNewMoney()*(dianyingOrder.getBuyZuoweiNumber().split(",").length)); //设置实付价格
    289. dianyingOrder.setYonghuId(userId); //设置订单支付人id
    290. dianyingOrder.setDianyingOrderUuidNumber(String.valueOf(new Date().getTime()));
    291. dianyingOrder.setInsertTime(new Date());
    292. dianyingOrder.setCreateTime(new Date());
    293. dianyingOrderService.insert(dianyingOrder);//新增订单
    294. //更新第一注册表
    295. yonghuEntity.setNewMoney(balance);//设置金额
    296. yonghuService.updateById(yonghuEntity);
    297. return R.ok();
    298. }
    299. /**
    300. * 退款
    301. */
    302. @RequestMapping("/refund")
    303. public R refund(Integer id, HttpServletRequest request){
    304. logger.debug("refund方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
    305. String role = String.valueOf(request.getSession().getAttribute("role"));
    306. DianyingOrderEntity dianyingOrder = dianyingOrderService.selectById(id);//当前表service
    307. Integer buyNumber = dianyingOrder.getBuyZuoweiNumber().split(",").length;
    308. Integer dianyingId = dianyingOrder.getDianyingId();
    309. if(dianyingId == null)
    310. return R.error(511,"查不到该电影");
    311. DianyingEntity dianyingEntity = dianyingService.selectById(dianyingId);
    312. if(dianyingEntity == null)
    313. return R.error(511,"查不到该电影");
    314. Double dianyingNewMoney = dianyingEntity.getDianyingNewMoney();
    315. if(dianyingNewMoney == null)
    316. return R.error(511,"电影价格不能为空");
    317. Integer userId = (Integer) request.getSession().getAttribute("userId");
    318. YonghuEntity yonghuEntity = yonghuService.selectById(userId);
    319. if(yonghuEntity == null)
    320. return R.error(511,"用户不能为空");
    321. if(yonghuEntity.getNewMoney() == null)
    322. return R.error(511,"用户金额不能为空");
    323. Double zhekou = 1.0;
    324. //计算金额
    325. Double money = dianyingEntity.getDianyingNewMoney() * buyNumber * zhekou;
    326. //计算所获得积分
    327. Double buyJifen = 0.0;
    328. yonghuEntity.setNewMoney(yonghuEntity.getNewMoney() + money); //设置金额
    329. dianyingOrder.setDianyingOrderTypes(102);//设置订单状态为已退款
    330. dianyingOrderService.updateAllColumnById(dianyingOrder);//根据id更新
    331. yonghuService.updateById(yonghuEntity);//更新用户信息
    332. dianyingService.updateById(dianyingEntity);//更新订单中电影的信息
    333. return R.ok();
    334. }
    335. /**
    336. * 评价
    337. */
    338. @RequestMapping("/commentback")
    339. public R commentback(Integer id, String commentbackText, Integer dianyingCommentbackPingfenNumber, HttpServletRequest request){
    340. logger.debug("commentback方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
    341. DianyingOrderEntity dianyingOrder = dianyingOrderService.selectById(id);
    342. if(dianyingOrder == null)
    343. return R.error(511,"查不到该订单");
    344. Integer dianyingId = dianyingOrder.getDianyingId();
    345. if(dianyingId == null)
    346. return R.error(511,"查不到该电影");
    347. DianyingCommentbackEntity dianyingCommentbackEntity = new DianyingCommentbackEntity();
    348. dianyingCommentbackEntity.setId(id);
    349. dianyingCommentbackEntity.setDianyingId(dianyingId);
    350. dianyingCommentbackEntity.setYonghuId((Integer) request.getSession().getAttribute("userId"));
    351. dianyingCommentbackEntity.setDianyingCommentbackPingfenNumber(dianyingCommentbackPingfenNumber);
    352. dianyingCommentbackEntity.setDianyingCommentbackText(commentbackText);
    353. dianyingCommentbackEntity.setInsertTime(new Date());
    354. dianyingCommentbackEntity.setReplyText(null);
    355. dianyingCommentbackEntity.setUpdateTime(null);
    356. dianyingCommentbackEntity.setCreateTime(new Date());
    357. dianyingCommentbackService.insert(dianyingCommentbackEntity);
    358. dianyingOrder.setDianyingOrderTypes(105);//设置订单状态为已评价
    359. dianyingOrderService.updateById(dianyingOrder);//根据id更新
    360. return R.ok();
    361. }
    362. /**
    363. * 检票
    364. */
    365. @RequestMapping("/deliver")
    366. public R deliver(Integer id , HttpServletRequest request){
    367. logger.debug("refund:,,Controller:{},,ids:{}",this.getClass().getName(),id.toString());
    368. DianyingOrderEntity dianyingOrderEntity = dianyingOrderService.selectById(id);
    369. dianyingOrderEntity.setDianyingOrderTypes(103);//设置订单状态为已检票
    370. dianyingOrderService.updateById( dianyingOrderEntity);
    371. return R.ok();
    372. }
    373. }
  • 相关阅读:
    喜新厌旧?IT公司为什么宁愿花20k招人,也不愿涨薪留住老员工
    KVM
    Bean的作用域和生命周期
    常用数学分布
    图像处理之LCD显示屏的显示控制
    2023年浙工商MBA新生奖学金名单公布,如何看待?
    BM58 字符串的排列
    2、HTML常用标签
    Spark lazy list files 的实现
    「开源系统」mybatis-plus代码生成工具(自己基于官方的封装的,打包成了maven插件的方式)
  • 原文地址:https://blog.csdn.net/m0_49113107/article/details/133015732