【计算机毕业设计】基于SpringBoot+Vue记帐理财系统的设计与实现
博主主页:一季春秋
博主简介:专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。
主要内容:毕业设计(Java项目、小程序、安卓等)、简历模板、学习资料、技术咨询。精彩专栏推荐订阅👇🏻👇🏻 不然下次找不到哟
SpringBoot+Vue项目持续更新中
http://t.csdn.cn/1mgm8
🍅文末获取联系🍅
目录
一、项目介绍
二、项目主要技术
三、系统功能描述
3.1 系统功能结构
四、系统实现
4.1 系统前台用户功能实现
4.2 后台管理员模块实现
4.3 后台用户模块实现
五、实现代码
5.1 协同算法关键代码
5.2 支出记账关键代码
一、项目介绍
记帐理财系统采用B/S模式、后端采用JAVA语言、SpringBoot作为开发框架,同时集成MyBatis、Redis等相关技术、数据库使用的是mysql数据库、前台使用的是Vue技术。
二、项目主要技术
开发语言:Java使用框架:spring boot前端技术:JavaScript、Vue 、css3开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code数据库:MySQL 5.7/8.0数据库管理工具:phpstudy/NavicatJDK版本:jdk1.8Maven: apache-maven 3.8.1-bin
三、系统功能描述
(1)登陆注册(用户账号,密码,再次确认密码,手机号)
(2)用户注销功能,用户能注销,管理员不需要注销功能
(3)用户个人信息修改删除(头像,性别,账号,密码,手机号,地址)
(4)新闻页面供用户浏览新闻内容由管理员添加、修改、册除,作为新闻发布和推荐管理两部分
(5)收入、支出类型的添加修改删除收入、支出的添加修改删除,收入、支出分别用Echarts出统计图,根据用户记录收支时的收益类别看出类别占比
(6)浏览理财信息用户入口可以进行理财产品购买
(7)理财订单,用户查看已购买的理财产品管理,用户可以终止理财审核,管理员对理财产品能添加、修改、册除
3.1 系统功能结构

四、系统实现
4.1 系统前台用户功能实现
系统首页
理财产品

理财产品详情

4.2 后台管理员模块实现
系统首页

理财产品管理

理财订单管理

支出记账管理

系统管理

4.3 后台用户模块实现
理财订单管理

收入记账管理

五、实现代码
5.1 协同算法关键代码
/*** 协同算法(按收藏推荐)*/@RequestMapping("/autoSort2")public R autoSort2(@RequestParam Map<String, Object> params,ChanpinxinxiEntity chanpinxinxi, HttpServletRequest request){String userId = request.getSession().getAttribute("userId").toString();String inteltypeColumn = "chanpinfenlei";List<StoreupEntity> storeups = storeupService.selectList(new EntityWrapper<StoreupEntity>().eq("type", 1).eq("userid", userId).eq("tablename", "chanpinxinxi").orderBy("addtime", false));List<String> inteltypes = new ArrayList<String>();Integer limit = params.get("limit")==null?10:Integer.parseInt(params.get("limit").toString());List<ChanpinxinxiEntity> chanpinxinxiList = new ArrayList<ChanpinxinxiEntity>();//去重if(storeups!=null && storeups.size()>0) {for(StoreupEntity s : storeups) {chanpinxinxiList.addAll(chanpinxinxiService.selectList(new EntityWrapper<ChanpinxinxiEntity>().eq(inteltypeColumn, s.getInteltype())));}}EntityWrapper<ChanpinxinxiEntity> ew = new EntityWrapper<ChanpinxinxiEntity>();params.put("sort", "id");params.put("order", "desc");PageUtils page = chanpinxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, chanpinxinxi), params), params));List<ChanpinxinxiEntity> pageList = (List<ChanpinxinxiEntity>)page.getList();if(chanpinxinxiList.size()<limit) {int toAddNum = (limit-chanpinxinxiList.size())<=pageList.size()?(limit-chanpinxinxiList.size()):pageList.size();for(ChanpinxinxiEntity o1 : pageList) {boolean addFlag = true;for(ChanpinxinxiEntity o2 : chanpinxinxiList) {if(o1.getId().intValue()==o2.getId().intValue()) {addFlag = false;break;}}if(addFlag) {chanpinxinxiList.add(o1);if(--toAddNum==0) break;}}} else if(chanpinxinxiList.size()>limit) {chanpinxinxiList = chanpinxinxiList.subList(0, limit);}page.setList(chanpinxinxiList);return R.ok().put("data", page);}}
5.2 支出记账关键代码
/*** 支出记账* 后端接口* @author * @email * @date 2023-05-12 22:58:08*/
@RestController
@RequestMapping("/zhichujizhang")
public class ZhichujizhangController {@Autowiredprivate ZhichujizhangService zhichujizhangService;/*** 后端列表*/@RequestMapping("/page")public R page(@RequestParam Map<String, Object> params,ZhichujizhangEntity zhichujizhang,HttpServletRequest request){String tableName = request.getSession().getAttribute("tableName").toString();if(tableName.equals("yonghu")) {zhichujizhang.setYonghuzhanghao((String)request.getSession().getAttribute("username"));}EntityWrapper<ZhichujizhangEntity> ew = new EntityWrapper<ZhichujizhangEntity>();PageUtils page = zhichujizhangService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, zhichujizhang), params), params));return R.ok().put("data", page);}/*** 前端列表*/@IgnoreAuth@RequestMapping("/list")public R list(@RequestParam Map<String, Object> params,ZhichujizhangEntity zhichujizhang, HttpServletRequest request){EntityWrapper<ZhichujizhangEntity> ew = new EntityWrapper<ZhichujizhangEntity>();PageUtils page = zhichujizhangService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, zhichujizhang), params), params));return R.ok().put("data", page);}/*** 列表*/@RequestMapping("/lists")public R list( ZhichujizhangEntity zhichujizhang){EntityWrapper<ZhichujizhangEntity> ew = new EntityWrapper<ZhichujizhangEntity>();ew.allEq(MPUtil.allEQMapPre( zhichujizhang, "zhichujizhang")); return R.ok().put("data", zhichujizhangService.selectListView(ew));}/*** 查询*/@RequestMapping("/query")public R query(ZhichujizhangEntity zhichujizhang){EntityWrapper< ZhichujizhangEntity> ew = new EntityWrapper< ZhichujizhangEntity>();ew.allEq(MPUtil.allEQMapPre( zhichujizhang, "zhichujizhang")); ZhichujizhangView zhichujizhangView = zhichujizhangService.selectView(ew);return R.ok("查询支出记账成功").put("data", zhichujizhangView);}/*** 后端详情*/@RequestMapping("/info/{id}")public R info(@PathVariable("id") Long id){ZhichujizhangEntity zhichujizhang = zhichujizhangService.selectById(id);return R.ok().put("data", zhichujizhang);}/*** 前端详情*/@IgnoreAuth@RequestMapping("/detail/{id}")public R detail(@PathVariable("id") Long id){ZhichujizhangEntity zhichujizhang = zhichujizhangService.selectById(id);return R.ok().put("data", zhichujizhang);}/*** 后端保存*/@RequestMapping("/save")public R save(@RequestBody ZhichujizhangEntity zhichujizhang, HttpServletRequest request){zhichujizhang.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());//ValidatorUtils.validateEntity(zhichujizhang);zhichujizhangService.insert(zhichujizhang);return R.ok();}/*** 前端保存*/@RequestMapping("/add")public R add(@RequestBody ZhichujizhangEntity zhichujizhang, HttpServletRequest request){zhichujizhang.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());//ValidatorUtils.validateEntity(zhichujizhang);zhichujizhangService.insert(zhichujizhang);return R.ok();}/*** 修改*/@RequestMapping("/update")@Transactionalpublic R update(@RequestBody ZhichujizhangEntity zhichujizhang, HttpServletRequest request){//ValidatorUtils.validateEntity(zhichujizhang);zhichujizhangService.updateById(zhichujizhang);//全部更新return R.ok();}/*** 删除*/@RequestMapping("/delete")public R delete(@RequestBody Long[] ids){zhichujizhangService.deleteBatchIds(Arrays.asList(ids));return R.ok();}/*** (按值统计)*/@RequestMapping("/value/{xColumnName}/{yColumnName}")public R value(@PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName,HttpServletRequest request) {Map<String, Object> params = new HashMap<String, Object>();params.put("xColumn", xColumnName);params.put("yColumn", yColumnName);EntityWrapper<ZhichujizhangEntity> ew = new EntityWrapper<ZhichujizhangEntity>();String tableName = request.getSession().getAttribute("tableName").toString();if(tableName.equals("yonghu")) {ew.eq("yonghuzhanghao", (String)request.getSession().getAttribute("username"));}List<Map<String, Object>> result = zhichujizhangService.selectValue(params, ew);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");for(Map<String, Object> m : result) {for(String k : m.keySet()) {if(m.get(k) instanceof Date) {m.put(k, sdf.format((Date)m.get(k)));}}}return R.ok().put("data", result);}/*** (按值统计(多))*/@RequestMapping("/valueMul/{xColumnName}")public R valueMul(@PathVariable("xColumnName") String xColumnName,@RequestParam String yColumnNameMul, HttpServletRequest request) {String[] yColumnNames = yColumnNameMul.split(",");Map<String, Object> params = new HashMap<String, Object>();params.put("xColumn", xColumnName);List<List<Map<String, Object>>> result2 = new ArrayList<List<Map<String,Object>>>();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");EntityWrapper<ZhichujizhangEntity> ew = new EntityWrapper<ZhichujizhangEntity>();String tableName = request.getSession().getAttribute("tableName").toString();if(tableName.equals("yonghu")) {ew.eq("yonghuzhanghao", (String)request.getSession().getAttribute("username"));}for(int i=0;i<yColumnNames.length;i++) {params.put("yColumn", yColumnNames[i]);List<Map<String, Object>> result = zhichujizhangService.selectValue(params, ew);for(Map<String, Object> m : result) {for(String k : m.keySet()) {if(m.get(k) instanceof Date) {m.put(k, sdf.format((Date)m.get(k)));}}}result2.add(result);}return R.ok().put("data", result2);}/*** (按值统计)时间统计类型*/@RequestMapping("/value/{xColumnName}/{yColumnName}/{timeStatType}")public R valueDay(@PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName, @PathVariable("timeStatType") String timeStatType,HttpServletRequest request) {Map<String, Object> params = new HashMap<String, Object>();params.put("xColumn", xColumnName);params.put("yColumn", yColumnName);params.put("timeStatType", timeStatType);EntityWrapper<ZhichujizhangEntity> ew = new EntityWrapper<ZhichujizhangEntity>();String tableName = request.getSession().getAttribute("tableName").toString();if(tableName.equals("yonghu")) {ew.eq("yonghuzhanghao", (String)request.getSession().getAttribute("username"));}List<Map<String, Object>> result = zhichujizhangService.selectTimeStatValue(params, ew);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");for(Map<String, Object> m : result) {for(String k : m.keySet()) {if(m.get(k) instanceof Date) {m.put(k, sdf.format((Date)m.get(k)));}}}return R.ok().put("data", result);}/*** (按值统计)时间统计类型(多)*/@RequestMapping("/valueMul/{xColumnName}/{timeStatType}")public R valueMulDay(@PathVariable("xColumnName") String xColumnName, @PathVariable("timeStatType") String timeStatType,@RequestParam String yColumnNameMul,HttpServletRequest request) {String[] yColumnNames = yColumnNameMul.split(",");Map<String, Object> params = new HashMap<String, Object>();params.put("xColumn", xColumnName);params.put("timeStatType", timeStatType);List<List<Map<String, Object>>> result2 = new ArrayList<List<Map<String,Object>>>();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");EntityWrapper<ZhichujizhangEntity> ew = new EntityWrapper<ZhichujizhangEntity>();String tableName = request.getSession().getAttribute("tableName").toString();if(tableName.equals("yonghu")) {ew.eq("yonghuzhanghao", (String)request.getSession().getAttribute("username"));}for(int i=0;i<yColumnNames.length;i++) {params.put("yColumn", yColumnNames[i]);List<Map<String, Object>> result = zhichujizhangService.selectTimeStatValue(params, ew);for(Map<String, Object> m : result) {for(String k : m.keySet()) {if(m.get(k) instanceof Date) {m.put(k, sdf.format((Date)m.get(k)));}}}result2.add(result);}return R.ok().put("data", result2);}/*** 分组统计*/@RequestMapping("/group/{columnName}")public R group(@PathVariable("columnName") String columnName,HttpServletRequest request) {Map<String, Object> params = new HashMap<String, Object>();params.put("column", columnName);EntityWrapper<ZhichujizhangEntity> ew = new EntityWrapper<ZhichujizhangEntity>();String tableName = request.getSession().getAttribute("tableName").toString();if(tableName.equals("yonghu")) {ew.eq("yonghuzhanghao", (String)request.getSession().getAttribute("username"));}List<Map<String, Object>> result = zhichujizhangService.selectGroup(params, ew);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");for(Map<String, Object> m : result) {for(String k : m.keySet()) {if(m.get(k) instanceof Date) {m.put(k, sdf.format((Date)m.get(k)));}}}return R.ok().put("data", result);}/*** 总数量*/@RequestMapping("/count")public R count(@RequestParam Map<String, Object> params,ZhichujizhangEntity zhichujizhang, HttpServletRequest request){String tableName = request.getSession().getAttribute("tableName").toString();if(tableName.equals("yonghu")) {zhichujizhang.setYonghuzhanghao((String)request.getSession().getAttribute("username"));}EntityWrapper<ZhichujizhangEntity> ew = new EntityWrapper<ZhichujizhangEntity>();int count = zhichujizhangService.selectCount(MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, zhichujizhang), params), params));return R.ok().put("data", count);}}
相关文章:
【计算机毕业设计】基于SpringBoot+Vue记帐理财系统的设计与实现
博主主页:一季春秋博主简介:专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容:毕业设计(Java项目、小程序、安卓等)、简历模板、学习资料、…...
2023年中国研究生数学建模竞赛E题
出血性脑卒中临床智能诊疗建模 一、背景介绍 出血性脑卒中指非外伤性脑实质内血管破裂引起的脑出血,占全部脑卒中发病率的10-15%。其病因复杂,通常因脑动脉瘤破裂、脑动脉异常等因素,导致血液从破裂的血管涌入脑组织,从而造成脑部…...
基于springboot+vue的大学生科创项目在线管理系统
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...
什么是文档签名证书?PDF文档怎么签名?
什么是文档签名证书?在“互联网”时代,电子合同、电子证照、电子病历、电子保单等各类电子文档无纸化应用成为常态。如何让电子文档的签署、审批具有公信力及法律效力,防止伪造签名、假冒签名等问题出现,是电子文档无纸化应用的主…...
2023年汉字小达人区级比赛倒计时2天,最新问题解答和真题练一练
今天是9月23日,距离2023年第十届汉字小达人区级比赛(初赛)的自由报名参赛时间还有2天,六分成长结合家长和小朋友们问的比较多的问题进行解答,并提供一些真题供大家练习、了解比赛题型和规则。 问题1:2023年…...
关于地址存放的例题
unsigned int a 0x1234; unsigned char b *(unsigned char*)&a; 上面代码大端存储和小端存储的值分别是多少? 大端存储的是把高位地址存放在低位地址处,低位存放到高位。小端是高位存放在高位,低位在低位。因为a是整型,所…...
Flume最简单使用
文章目录 一、简介1、定义2、基础架构 二、快速入门1、解压Flume2、案例一:监控端口号3、案例二:将空目录下文件 三、Flume进阶1、Flume事务2、Flume Agent内部原理3、案例一:监控日志4、案例二:多路复用和拦截器适应4.1 原理4.2 …...
第2章 Java集合
2.1 谈谈你对Java集合的理解 难度:★★★ 重点:★★★★ 白话解析 集合类的概念还是比较重要的,不仅面试经常问,实际开发中也离不开。如果能把这道题真正理解了,集合可以说基本上没问题了。 集合就用来用存数据的,它提供了对数据增删改查和统计大小等方法。在Java中集合…...
YOLOv5、YOLOv8改进:C3STR(Swin Transformer)
目录 1.介绍 2. YOLOv5、YOLOv8改进 2.1 common.py配置 2.2 yolo.py配置 2.3 yaml配置文件 1.介绍 视觉领域正在见证从 CNN 到 Transformers 的建模转变,纯 Transformer 架构在主要视频识别基准测试中达到了最高准确度。这些视频模型都建立在 Transformer 层之…...
AIGC百模大战
AIGC Artificial Intelligence Generated Content, 或者Generative Artificial Intelligence,它能够生成新的数据、图像、语音、视频、音乐等内容,从而扩展人工智能系统的应用范围。 生成式人工智能有可能给全球经济带来彻底的变化。根据高盛…...
docker jira 一键安装含PJ(docker 一键安装jira)
docker jira 一键安装含PJ(docker 一键安装jira) 本文仅供参考学习,请勿用于商业用途本文用于Jira在Docker的安装,仅用于记录安装方式转载请注明来源Linux安装可参考链接Windows安装可查考链接Docker一键安装Confluence PJ条件允…...
认识一下Git
目录 Git Git下载 Git安装 Git初始化 Git操作 Git、GitLab、和Eclipse是公司中软件开发常用的组合: 1. Git:Git是一种分布式版本控制系统,用于跟踪文件和代码的变化。它提供了管理代码仓库的功能,可以记录每次提交的修改&am…...
只需4步使用Redis缓存优化Node.js应用
介绍 通过API获取数据时,会向服务器发出网络请求,收到响应数据。但是,此过程可能非常耗时,并且可能会导致程序响应时间变慢。 我们使用缓存来解决这个问题,客户端程序首先向API发送请求,将返回的数据存储…...
【react基础01】项目文件结构描述
react 项目文件结构描述 📂 REACTWORKSPACE📂 node_modules📂 public📄 favicon.ico📄 index.html📄 logo192.png📄 logo512.png📄 manifest.json📄 robots.txt …...
光电开关-NPN-PNP
基础概念 有信号 “检测到物体/有物体遮挡” 工作原理 NPN:表示共正电压,输出负电压【只能输出低电压或者悬空 常开常闭是指 输出有没有跟“地”接通】; NPN NO:表示常态下是常开的,检测到物体时黑色线输出一个负电压…...
学会使用Git 和 GitHub
Git 和 GitHub 都是程序员每天都要用到的东西 —— 前者是目前最先进的 版本控制工具,拥有最多的用户,且管理着地球上最庞大的代码仓库;而后者是全球最大 同性交友 代码托管平台、开源社区。 在没有这两个工具时,编程可能是这样的…...
SoftwareTest3 - 要了人命的Bug
软件测试基础篇 一 . 如何合理的创建一个 Bug二 . Bug 等级2.1 崩溃2.2 严重2.3 一般2.4 次要 三 . Bug 的生命周期四 . 跟开发产生争执应该怎么解决 Hello , 大家好 , 又给大家带来新的专栏喽 ~ 这个专栏是专门为零基础小白从 0 到 1 了解软件测试基础理论设计的 , 虽然还不足…...
Linux系统中MySQL库的操作,实操sql代码
Linux系统中MySQL库的操作 本文主要是对linux系统下MySQL库操作的总结,包含创建、删除、修改数据库,数据库的编码格式和校验格式以及数据库的恢复和备份。 1.创建数据库 1.1基本语法: CREATE DATABASE [IF NOT EXISTS] db_name [create_s…...
Python基础分享之面向对象的进一步拓展
我们熟悉了对象和类的基本概念。我们将进一步拓展,以便能实际运用对象和类。 调用类的其它信息 上一讲中提到,在定义方法时,必须有self这一参数。这个参数表示某个对象。对象拥有类的所有性质,那么我们可以通过self,调…...
Windows安装Docker Desktop并配置镜像、修改内存占用大小
启用Hyper-V Win S 搜索控制面板 安装WSL2 第一种方法(推荐) 以管理员运行命令提示符,然后重启Docker Desktop wsl --updatewsl --set-default-version 2第2种方法去微软官网下载WSL2并安装 《微软官网下载WSL2》 配置WSL2最大内…...
Python execjs执行中文JS文件报GBK解码错?一个继承Popen的修复方案
Python execjs执行中文JS文件报GBK解码错误的终极修复方案 遇到Python的execjs库在执行含有中文的JavaScript文件时抛出GBK解码错误,确实让人头疼。这种问题通常发生在Windows环境下,当系统默认编码为GBK而JS文件使用UTF-8编码时。本文将深入分析问题根…...
Linux桌面应用管理革命:AppImageLauncher完整使用指南
Linux桌面应用管理革命:AppImageLauncher完整使用指南 【免费下载链接】AppImageLauncher Helper application for Linux distributions serving as a kind of "entry point" for running and integrating AppImages 项目地址: https://gitcode.com/gh_…...
从零搭建NLP系统:文本分类与知识抽取
从零搭建NLP系统:文本分类与知识抽取 标签:#自然语言处理、#人工智能、#大模型、#大模型实战、#transformer、#机器学习、#深度学习 自然语言处理行业价值、核心应用场景 原理:从句子中抽取人名、地名、组织名等实体。 1. 高薪敲门砖…...
STC单片机看门狗避坑指南:从原理到调试的5个关键步骤
STC单片机看门狗避坑指南:从原理到调试的5个关键步骤 在嵌入式系统开发中,稳定性是衡量产品质量的重要指标。作为51单片机开发者,我们常常会遇到程序跑飞、死循环等异常情况,这时内部看门狗(WDT)就成了最后…...
别再只用localhost了!手把手教你用路由侠把本地宝塔面板‘搬’到公网(Windows版)
突破局域网限制:Windows下宝塔面板安全外网访问实战指南 你是否遇到过这样的困境?——在本地环境调试得心应手的项目,当需要向异地同事演示或临时交付客户预览时,却因为网络隔离而束手无策。传统解决方案要么要求部署到正式服务器…...
面试真题集(三):CUDA核心概念与内存优化专题
引言 进阶篇的核心是让你从“会写”到“会优化”。本专题精选20道面试真题,聚焦CUDA内存层次、合并访问、共享内存、寄存器压力等进阶篇核心内容,帮你系统检验学习成果。 一、选择题(6题) 1.1 关于CUDA内存层次,下列说法正确的是?(⭐⭐) A. 寄存器的访问速度比共享内…...
编码检测终极指南:告别乱码的批量字符集检测解决方案
编码检测终极指南:告别乱码的批量字符集检测解决方案 【免费下载链接】EncodingChecker A GUI tool that allows you to validate the text encoding of one or more files. Modified from https://encodingchecker.codeplex.com/ 项目地址: https://gitcode.com/…...
CODESYS开发实战:指针与动态内存分配的高级应用
1. 指针基础:从内存模型到实战应用 指针这个概念对于刚接触CODESYS开发的工程师来说,往往既神秘又令人畏惧。我第一次在项目中遇到指针问题时,整整花了三天时间才搞明白为什么程序会莫名其妙崩溃。指针本质上就是内存地址的变量化表示&#x…...
UE4 UI设计:Size Box的5个实用技巧与常见坑点解析
UE4 UI设计:Size Box的5个实用技巧与常见坑点解析 在虚幻引擎4(UE4)的UI开发中,精确控制元素尺寸是构建响应式界面的关键。Size Box作为基础布局控件之一,看似简单却隐藏着许多实用技巧和潜在陷阱。本文将深入剖析Size…...
AI设计新利器!我外卖都没到,你方案图就出来了!
凌晨两点,设计部灯火通明。 小王盯着屏幕上改了第18版的方案,揉了揉酸涩的眼睛。甲方上午刚推翻上周确定的概念,明天就要看新方案。市场部的同事在旁边催:“客户说再不出图就要换供应商了。”而结构组的同事还在等着方案定稿才能…...
