当前位置: 首页 > news >正文

谷粒商城第十二天-基本属性销售属性管理功能的实现

目录

一、总述

二、前端部分

三、后端部分

四、总结


一、总述

前端的话,依旧是直接使用老师给的。

前端的话还是那些增删改查,业务复杂一点的话,无非就是设计到多个字段多个表的操作,当然这是后端的事了,前端这里不做深究,走一下流程,知道哪些数据,需要绑定哪些事件,哪些方法就行了。

其实我之前讲的前端开发的三步,是基于已经有了大致的代码,也就是已经提供了一份代码了,只需要我们去修改,理解一下就行了,如果我们单纯使用elementUI进行开发的话,需要对那些组件比较熟悉。然后再作修改,数据域,方法等。

这里后端的话其实还是那些CRUD,比较常规。

二、前端部分

前端部分,这里我不像之前那样一点一点解析了,说实话浪费时间,稍微理解一下就行了,这里我直接贴上前端相应的代码:

代码很长,我直接放到这篇博文对应的资源包下面了。

三、后端部分

1. 模糊分页查询接口

接口:

/*** 查询基本商品属性列表*/@ApiOperation("查询商品基本属性列表")//@PreAuthorize("@ss.hasPermi('product:attr:list')")@PostMapping("/{type}/list/{catId}")public TableDataInfo pageBaseList(@PathVariable("type") String type,@PathVariable("catId")Long catId, @RequestBody PageParamsDto pageParamsDto) {TableDataInfo tableDataInfo = attrService.pageList(type,catId,pageParamsDto);return tableDataInfo;}

实现:

/*** 分页查询商品基本属性列表* @param catId 分类id* @param pageParamsDto 分页参数* @return*/@Overridepublic TableDataInfo pageList(String type,Long catId, PageParamsDto pageParamsDto) {//1. 根据catId查询出基本属性LambdaQueryWrapper<Attr> wrapper = new LambdaQueryWrapper<>();if(catId!=0){wrapper.eq(Attr::getCatelogId,catId);}if("base".equalsIgnoreCase(type)){wrapper.eq(Attr::getAttrType,1L);} else if ("sale".equalsIgnoreCase(type)) {wrapper.eq(Attr::getAttrType,0L);}if(StringUtils.hasText(pageParamsDto.getKey())){if (NumberUtils.isParsable(pageParamsDto.getKey())) {//如果当前字符串是数字,也就是代表是属性id的话,就拼接上属性idwrapper.eq(Attr::getAttrId,Long.parseLong(pageParamsDto.getKey()));}else{wrapper.like(Attr::getAttrName,pageParamsDto.getKey());}}//2. 分页处理Page<Attr> page = new Page<>(pageParamsDto.getPage(),pageParamsDto.getLimit());page(page,wrapper);List<Attr> records = page.getRecords();List<AttrVo> attrVos = BeanCopyUtils.copyBean(records, AttrVo.class);attrVos.stream().forEach((item)->{//1. 获取属性对应的分类名Long catelogId = item.getCatelogId();Category category = categoryService.getById(catelogId);if (category != null) {item.setCatelogName(category.getName());}if("base".equalsIgnoreCase(type)){//2. 获取属性对应的分组id及分组名AttrAttrgroupRelation relation = attrAttrgroupRelationService.getOne(new LambdaQueryWrapper<AttrAttrgroupRelation>().eq(AttrAttrgroupRelation::getAttrId, item.getAttrId()));if (relation != null) {Long attrGroupId = relation.getAttrGroupId();AttrGroup group = groupService.getById(attrGroupId);if (group != null) {item.setAttrGroupId(attrGroupId);item.setGroupName(group.getAttrGroupName());}}}//3. 获取属性对应的分类id对应的路径Long[] path = categoryService.categoryPath(catelogId);item.setCatelogPath(path);});return new TableDataInfo(attrVos,(int)page.getTotal());}

2. 新增属性接口

接口:

/*** 新增商品属性*/@ApiOperation("新增商品属性")//@PreAuthorize("@ss.hasPermi('product:attr:add')")@Log(title = "商品属性", businessType = BusinessType.INSERT)@PostMappingpublic AjaxResult add(@RequestBody AttrVo attrVo) {return toAjax(attrService.saveDetail(attrVo));}

实现:

/*** 添加商品属性的详细信息,包含属性分组* @param attrVo* @return*/@Transactional@Overridepublic boolean saveDetail(AttrVo attrVo) {//1. 先新增自己本身Attr attr = BeanCopyUtils.copyBean(attrVo, Attr.class);boolean save = save(attr);if(attrVo.getAttrType().equals(ProductConstant.AttrTypeConstant.BASE_ATTR)){AttrAttrgroupRelation relation = new AttrAttrgroupRelation();relation.setAttrGroupId(attrVo.getAttrGroupId());relation.setAttrId(attr.getAttrId());//2. 添加上分组信息return attrAttrgroupRelationService.save(relation);}return save;}

3. 修改属性接口

接口:

/*** 修改商品属性*/@ApiOperation("修改商品属性")//@PreAuthorize("@ss.hasPermi('product:attr:edit')")@Log(title = "商品属性", businessType = BusinessType.UPDATE)@PutMappingpublic AjaxResult edit(@RequestBody AttrVo attrVo) {return toAjax(attrService.updateDetail(attrVo));}

实现:

/*** 更新商品属性信息* @param attrVo* @return*/@Transactional@Overridepublic boolean updateDetail(AttrVo attrVo) {//1. 先更新自己Attr attr = BeanCopyUtils.copyBean(attrVo, Attr.class);boolean update = updateById(attr);//2. 更新关联的分组信息if(attrVo.getAttrType().equals(ProductConstant.AttrTypeConstant.BASE_ATTR)){LambdaUpdateWrapper<AttrAttrgroupRelation> wrapper = new LambdaUpdateWrapper<>();wrapper.eq(AttrAttrgroupRelation::getAttrId,attrVo.getAttrId());wrapper.set(AttrAttrgroupRelation::getAttrGroupId,attrVo.getAttrGroupId());return attrAttrgroupRelationService.update(wrapper);}return update;}

4. 删除属性接口

/*** 删除商品属性*/@ApiOperation("删除商品属性")//@PreAuthorize("@ss.hasPermi('product:attr:remove')")@Log(title = "商品属性", businessType = BusinessType.DELETE)@DeleteMappingpublic AjaxResult remove(@RequestBody Long[] attrIds) {return toAjax(attrService.removeMore(Arrays.asList(attrIds)));}

四、总结

前端后端还是那些东西....

相关文章:

谷粒商城第十二天-基本属性销售属性管理功能的实现

目录 一、总述 二、前端部分 三、后端部分 四、总结 一、总述 前端的话&#xff0c;依旧是直接使用老师给的。 前端的话还是那些增删改查&#xff0c;业务复杂一点的话&#xff0c;无非就是设计到多个字段多个表的操作&#xff0c;当然这是后端的事了&#xff0c;前端这里…...

利用安全区域的概念解决移动端兼容不同手机刘海的问题

移动端 安全区 在做移动端的项目时&#xff0c;由于不同的手机设备设置的不同&#xff0c;有些手机在上方有刘海的设计&#xff0c;我们需要做适配&#xff0c;即把想要展示的内容放在安全区域内展示。 1.自定义导航栏 在pages.json中修改如下配置 {"path":"…...

数据结构---图

这里写目录标题 图的基本概念和术语基本概念和术语1基本概念和术语2 图的类型定义抽象数据类型定义二级目录二级目录 一级目录二级目录二级目录二级目录二级目录二级目录二级目录 图的基本概念和术语 基本概念和术语1 V代表顶点的有穷非空集合 E代表边的有穷集合 n为顶点 有向…...

励志长篇小说《周兴和》书连载之十八 内外交困搞发明

内外交困搞发明 路灯发出昏黄而惺忪的光影。 周兴和疲惫地从车间出来&#xff0c;拖着沉重的腿爬上几级石阶&#xff0c;准备回到家里去。可走到家门口&#xff0c;他想了想&#xff0c;又折了回去&#xff0c;在车间的一条长条椅子上&#xff0c;他用一块试验用的废料当枕头&…...

web基础入门和php语言基础入门 二

web基础入门和php语言基础入门 二 MySQL入门-续MySQL之数据查询操作MySQL其他知识点 php语言基础入门认识PHPPHP的工作流程安装PHP环境认识一个PHP程序PHP基础知识点进入正题 PHP与WEB交互PHP与MySQL交互总结 MySQL入门-续 MySQL之数据查询操作 WHERE 子句&#xff0c;条件限…...

typeScript 之 Array

工具: PlayGround 源码&#xff1a;GitHub TypeScript 数组简介 在TypeScript中&#xff0c; 使用[]表示数组&#xff0c; 它的结构&#xff1a;let valus: 类型名[] 数据; // 数字 let numList: number[] [1, 2, 3]; // 字符串 let strList: string[] ["hello"…...

【题解】二叉树的前中后遍历

文章目录 二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历 二叉树的前序遍历 题目链接&#xff1a;二叉树的前序遍历 解题思路1&#xff1a;递归 代码如下&#xff1a; void preorder(vector<int>& res, TreeNode* root){if(root nullptr) return;//遇到空节点…...

文件操作/IO

文件 文件是一种在硬盘上存储数据的方式&#xff0c;操作系统帮我们把硬盘的一些细节都封装起来了&#xff0c;程序员只需要了解文件相关的接口即可&#xff0c;相当于操作文件就是间接的操作硬盘了 硬盘用来存储数据&#xff0c;和内存相比硬盘的存储空间更大&#xff0c;访问…...

基于Java+SpringBoot+vue前后端分离共享汽车管理系统设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…...

Mac RN环境搭建

RN ios android原生环境搭建有时候是真恶心&#xff0c;电脑环境不一样配置也有差异。 我已经安装官网的文档配置了ios环境 执行 npx react-nativelatest init AwesomeProject 报错 然后自己百度查呀执行 gem update --system 说是没有权限&#xff0c;执行失败。因为Mac…...

log4j教程_编程入门自学教程_菜鸟教程-免费教程分享

教程简介 Log4j是Apache的一个开源项目&#xff0c;通过使用Log4j&#xff0c;我们可以控制日志信息输送的目的地是控制台、文件、GUI组件&#xff0c;甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等&#xff1b;我们也可以控制每一条日志的输出格式&#xff1b;…...

DP——背包问题

DP——背包问题 01背包问题分数背包问题多重背包问题完全背包问题 当我们谈论背包问题时&#xff0c;可以想象成一个小朋友要去旅行&#xff0c;但是他只能带一个容量有限的背包。他有一些物品可以选择放入背包&#xff0c;每个物品都有自己的重量和价值。小朋友的目标是在不超…...

【从零学习python 】29. 「函数参数详解」——了解Python函数参数的不同用法

文章目录 函数参数详解一、缺省参数二、不定长参数三、缺省参数在*args后面可变、不可变类型总结 进阶案例 函数参数详解 一、缺省参数 调用函数时&#xff0c;缺省参数的值如果没有传入&#xff0c;则取默认值。 下例会打印默认的age&#xff0c;如果age没有被传入&#xf…...

10个经典战略分析模型,助力洞察市场明确优势

在企业的经营管理过程中&#xff0c;要时刻清晰内外部环境和自身的优劣势&#xff0c;做好企业略规划&#xff0c;进行企业内外部资源的分析&#xff0c;对经营环境&#xff0c;企业核心竞争力有足够的判断&#xff0c;才能明确企业的发展方向。本文为大家分享10个常用的战略分…...

C++(Qt)软件调试---将调试工具安装到AeDebug(11)

C(Qt)软件调试—将调试工具安装到AeDebug&#xff08;11&#xff09; 文章目录 C(Qt)软件调试---将调试工具安装到AeDebug&#xff08;11&#xff09;1、前言1.1 使用的调试工具 2、调试器安装1.1 WinDbg1.2 procdump1.3 DrMinGW1.4 vsjitdebugger 更多精彩内容&#x1f449;个…...

浅谈限流式保护器在住宅电气防火的应用

安科瑞 华楠 【摘要】随着人民生活水平的提高&#xff0c;家用大功率电器普遍被使用&#xff0c;导致用电量剧增&#xff0c;电气火灾频发。文章分析了电气火灾发生的原因&#xff0c;并时电气火灾的防范措施进行了探讨。 【关键词】电气火灾&#xff1b;原因&#xff1b;防范…...

ChatGPT助力ModStartBlog,博客写作更智能

ModStartBlog v7.1.0&#xff0c;ChatGPT 支持、界面全新优化 在数字化时代&#xff0c;博客已经成为人们分享知识、表达观点和建立个人品牌的重要工具。ModStartBlog是一款流行的博客平台&#xff0c;其最新的版本v7.1.0不仅增加了ChatGPT支持&#xff0c;还对界面进行了全新…...

Jpa与Druid线程池及Spring Boot整合(二): spring-boot-starter-data-jpa 踏坑异常处理方案

Jpa与Druid线程池及Spring Boot整合(一) Jpa与Druid线程池及Spring Boot整合(二)&#xff1a;几个坑 附录官网文档&#xff1a;core.domain-events域事件 从聚合根发布事件 存储库管理的实体是聚合根。在领域驱动设计应用程序中&#xff0c;这些聚合根通常会发布领域事件。Sp…...

Vue3组件库

Vue组件库 ViteVue3TypescriptTSX 1、项目搭建 1.1、创建项目&#xff08;yarn&#xff09; D:\WebstromProject>yarn create vite yarn create v1.22.19 [1/4] Resolving packages... [2/4] Fetching packages... [3/4] Linking dependencies... [4/4] Building fresh pa…...

AUTOSAR从入门到精通-【应用篇】基于 CAN/LIN 总线的智能配电监控系统的研究设计

目录 前言 国内外研究现状 CAN 总线和 LIN 总线技术 2.1CAN 总线技术 2.1.1 通信模型...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...