96SEO 2026-02-19 11:47 2
后端接口BrandControllerBrandServiceBrandMapperBrandMapper.xml

后端接口需求分析CategoryBrandDtoCategoryBrandCategoryBrandControllerCategoryBrandServiceCategoryBrandMapperCategoryBrandMapper.xml
前端对接categoryBrand.jscategoryBrand.vue
后端接口CategoryBrandControllerCategoryBrandServiceCategoryBrandMapperCategoryBrandMapper.xml
前端对接实现思路categoryBrand.jscategoryBrand.vue
提交修改后端接口CategoryBrandControllerCategoryBrandServiceCategoryBrandMapperCategoryBrandMapper.xml
前端对接categoryBrand.jscategoryBrand.vue
后端接口CategoryBrandControllerCategoryBrandServiceCategoryBrandMapperCategoryBrandMapper.xml
前端对接categoryBrand.jscategoryBrand.vue
后端接口ProductSpecProductSpecControllerProductSpecServiceProductSpecMapperProductSpecMapper.xml
前端对接productSpec.jsproductSpec.vue
后端接口ProductSpecControllerProductSpecServiceProductSpecMapperProductSpecMapper.xml
前端对接实现思路productSpec.jsproductSpec.vue
后端接口ProductSpecControllerProductSpecServiceProductSpecMapperProductSpecMapper.xml
前端对接productSpec.jsproductSpec.vue
后端接口ProductSpecControllerProductSpecServiceProductSpecMapperProductSpecMapper.xml
前端对接productSpec.jsproductSpec.vue
后端接口需求分析ProductDtoProductProductControllerProductServiceProductMapperProductMapper.xmlProductMapper.xml
分类品牌管理就是将分类的数据和品牌的数据进行关联分类数据和品牌数据之间的关系是多对多的关系因此需要单独使用一张数据表来存储该数据。
1、在后台管理系统中通过系统管理的菜单管理添加分类品牌管理的相关菜单如下所示
在src/views/product的文件夹在该文件夹中加入分类管理页面文件如下所示
在src/router/modules文件夹下创建product.js路由文件文件内容如下所示
import(/views/product/category.vue)
import(/views/product/brand.vue)
import(/views/product/categoryBrand.vue)export
label品牌el-selectclassm-2placeholder选择品牌sizesmallstylewidth:
brandList:keyitem.id:labelitem.name:valueitem.id//el-select/el-form-item/el-colel-col
label分类el-cascader:propscategoryPropsstylewidth:
100%//el-form-item/el-col/el-rowel-row
sizesmall重置/el-button/el-row/el-form/divdiv
//el-table-columnel-table-column
sizesmall删除/el-button/el-table-column/el-tableel-pagination:page-sizes[10,
next:totaltotal//templatescript
http://139.198.127.41:9000/sph/20230506/华为.png},{id:
http://139.198.127.41:9000/sph/20230506/小米.png}
https://lilishop-oss.oss-cn-beijing.aliyuncs.com/0f423fb60f084b2caade164fae25a9a0.png,parentId:
https://lilishop-oss.oss-cn-beijing.aliyuncs.com/665dd952b54e4911b99b5e1eba4b164f.png,parentId:
http://139.198.127.41:9000/sph/20230506/小米.png},{id:
http://139.198.127.41:9000/sph/20230506/华为.png}
需求当页面加载完毕以后需要请求后端接口查询出系统中所有的品牌数据将品牌数据在搜索表单的品牌下拉框中进行展示
com.atguigu.spzx.manager.controller
com.atguigu.spzx.manager.service.impl;
com.atguigu.spzx.manager.mapper
在BrandMapper.xml映射文件中添加如下的sql语句
需求当页面加载完毕以后需要查询出系统中所对应的所有的一级分类数据将一级分类数据在搜索表单的分类下拉框中进行展示当用户选择某一个一级分类的时候需要将该一级分类下所对应的二级分类查询出来…
分析根据一个分类的id查询该分类下所对应的子分类数据该接口已经编写过了因此只需要针对前端页面进行修改接口
FindCategoryByParentId(node.value)data.forEach(function(item)
!item.hasChildren})resolve(data)
1、如果在搜索表单中选择了某一个品牌以及分类那么此时就需要按照品牌id和分类id进行查询
1、前端提交请求参数的时候包含了两部分的参数搜索条件参数、分页参数。
搜索条件参数可以通过?拼接到请求路径后面分页参数【当前页码、每页显示的数据条数】可以让前端通过请求路径传递过来
2、后端查询完毕以后需要给前端返回一个分页对象分页对象中就封装了分页相关的参数(当前页数据、总记录数、总页数…)
3、前端进行参数传递的时候不一定会传递搜索条件因此sql语句的编写需要使用到动态sql
com.atguigu.spzx.model.dto.product
com.atguigu.spzx.model.entity.product
com.atguigu.spzx.manager.controller
;GetMapping({/page}/{limit})public
categoryBrandService.findByPage(page,
com.atguigu.spzx.manager.service.impl;
categoryBrandMapper.findByPage(CategoryBrandDto)
PageInfo(categoryBrandList);}}CategoryBrandMapper
com.atguigu.spzx.manager.mapper;
在CategoryBrandMapper映射文件中添加如下sql语句
http://mybatis.org/dtd/mybatis-3-mapper.dtd
namespacecom.atguigu.spzx.manager.mapper.CategoryBrandMapperresultMap
typecom.atguigu.spzx.model.entity.product.CategoryBrand
idcolumnsid,brand_id,category_id,create_time,update_time,is_deleted/sqlsql
resultMapcategoryBrandMapselectcb.id,cb.brand_id,cb.category_id,cb.create_time,cb.update_time,c.name
在src/api文件夹下创建categoryBrand.js文件如下所示
${api_name}/${page}/${limit},method:
label品牌el-selectclassm-2placeholder选择品牌sizesmallstylewidth:
100%v-modelqueryDto.brandIdel-optionv-foritem
brandList:keyitem.id:labelitem.name:valueitem.id//el-select/el-form-item/el-colel-col
label分类el-cascader:propscategoryPropsstylewidth:
100%v-modelsearchCategoryIdList//el-form-item/el-col/el-rowel-row
clickfetchData()搜索/el-buttonel-button
clickresetData重置/el-button/el-row/el-form
(searchCategoryIdList.value.length
searchCategoryIdList.value[2]}const
当用户点击添加按钮的时候那么此时就弹出对话框在该对话框中需要展示添加分类品牌表单。
当用户在该表单中点击提交按钮的时候那么此时就需要将表单进行提交在后端需要将提交过来的表单数据保存到数据库中即可。
label品牌el-selectclassm-2placeholder选择品牌sizesmallel-optionv-foritem
brandList:keyitem.id:labelitem.name:valueitem.id//el-select/el-form-itemel-form-item
label分类el-cascader:propscategoryProps//el-form-itemel-form-itemel-button
typeprimary提交/el-buttonel-button
false取消/el-button/el-form-item/el-form
com.atguigu.spzx.manager.controller
{categoryBrandService.save(categoryBrand);return
com.atguigu.spzx.manager.service.impl;
{categoryBrandMapper.save(categoryBrand)
com.atguigu.spzx.manager.mapper;
在CategoryBrandMapper映射文件中添加如下sql语句
(id,brand_id,category_id,create_time,update_time
(#{id},#{brandId},#{categoryId},now(),now(),0)
在src/api文件夹下创建categoryBrand.js文件如下所示
label品牌el-selectclassm-2placeholder选择品牌sizesmallv-modelcategoryBrand.brandIdel-optionv-foritem
brandList:keyitem.id:labelitem.name:valueitem.id//el-select/el-form-itemel-form-item
label分类el-cascader:propscategoryPropsv-modelcategoryBrand.categoryId//el-form-itemel-form-itemel-button
clicksaveOrUpdate提交/el-buttonel-button
false取消/el-button/el-form-item/el-form
{ElMessage.info(品牌信息必须选择)return}//categoryId为数组[1,2,3]if
(categoryBrand.value.categoryId.length
{ElMessage.info(分类信息必须选择)return}//系统只需要三级分类idcategoryBrand.value.categoryId
categoryBrand.value.categoryId[2]if
SaveCategoryBrand(categoryBrand.value)dialogVisible.value
falseElMessage.success(操作成功)fetchData()
当用户点击修改按钮的时候那么此时就弹出对话框在该对话框中需要将当前行所对应的分类品牌数据在该表单页面进行展示。
当用户在该表单中点击提交按钮的时候那么此时就需要将表单进行提交在后端需要提交过来的表单数据修改数据库中的即可。
clickeditShow(scope.row)修改/el-button
com.atguigu.spzx.manager.controller
{categoryBrandService.updateById(categoryBrand);return
com.atguigu.spzx.manager.service.impl;
{categoryBrandMapper.updateById(categoryBrand)
com.atguigu.spzx.manager.mapper;
在CategoryBrandMapper映射文件中添加如下sql语句
在src/api文件夹下创建categoryBrand.js文件如下所示
{...//系统只需要三级分类idcategoryBrand.value.categoryId
categoryBrand.value.categoryId[2]if
UpdateCategoryBrandById(categoryBrand.value)dialogVisible.value
falseElMessage.success(操作成功)fetchData()
当点击删除按钮的时候此时需要弹出一个提示框询问是否需要删除数据如果用户点击是那么此时向后端发送请求传递id参数后端接收id参数进行逻辑删除。
com.atguigu.spzx.manager.controller
DeleteMapping(/deleteById/{id})
{categoryBrandService.deleteById(id);return
com.atguigu.spzx.manager.service.impl;
{categoryBrandMapper.deleteById(id)
com.atguigu.spzx.manager.mapper;
在CategoryBrandMapper映射文件中添加如下sql语句
在src/api文件夹下创建categoryBrand.js文件如下所示
${api_name}/deleteById/${id},method:
clickremove(scope.row.id)删除/el-button
{ElMessageBox.confirm(此操作将永久删除该记录,
DeleteCategoryBrandById(id)ElMessage.success(删除成功)fetchData()}).catch(()
在电商项目中商品规格指的是商品属性、型号、尺寸、颜色等具体描述商品特点和属性的标准化信息。
3、分辨率1920x1080、2960x1440、2532x1170
1、在后台管理系统中通过系统管理的菜单管理添加商品规格管理的相关菜单如下所示
在src/views/product的文件夹中加入商品规格管理页面文件如下所示
在src/router/modules文件夹下创建product.js路由文件文件内容如下所示
import(/views/product/category.vue)
import(/views/product/brand.vue)
import(/views/product/categoryBrand.vue)
import(/views/product/productSpec.vue)export
规格值[{key:颜色,valueList:[蓝,白,红]],create_time
scope.row.specValue:keyindex1stylepadding:
item1.valueList:keyindex2classdiv-atrr{{
}}/span/div/el-table-columnel-table-column
sizesmall删除/el-button/el-table-column/el-tableel-pagination:page-sizes[10,
next:totaltotal//templatescript
[{key:内存,valueList:[8G,18G,32G]}]},{id:
[{key:颜色,valueList:[白色,红色,黑色]},{key:内存,valueList:[8G,18G]}]}
需求说明当产品规格管理页面加载完毕以后就向后端发送分页查询请求后端进行分页查询返回分页结果数据。
com.atguigu.spzx.model.entity.product
com.atguigu.spzx.manager.controller
RequestMapping(value/admin/product/productSpec)
;GetMapping(/{page}/{limit})public
productSpecService.findByPage(page,
com.atguigu.spzx.manager.service.impl;
PageInfo(productSpecList);}}ProductSpecMapper
com.atguigu.spzx.manager.mapper
在ProductSpecMapper.xml映射文件中添加如下sql语句
http://mybatis.org/dtd/mybatis-3-mapper.dtd
namespacecom.atguigu.spzx.manager.mapper.ProductSpecMapperresultMap
typecom.atguigu.spzx.model.entity.product.ProductSpec
idcolumnsid,spec_name,spec_value,create_time,update_time,is_deleted/sqlselect
在src/api目录下添加productSpec.js文件内容如下所示
${api_name}/${page}/${limit},method:
el-paginationv-model:current-pagepageParams.pagev-model:page-sizepageParams.limit:page-sizes[10,
next:totaltotalsize-changehandleSizeChangecurrent-changehandleCurrentChange
GetProductSpecPageList(pageParams.value.page
用户点击添加按钮此时需要展示一个添加数据的表单对话框用户填写表单数据点击提交按钮请求后端接口完成数据的保存操作。
效果如下所示
//el-form-itemel-form-itemel-button
typesuccess添加新规格/el-button/el-form-itemel-form-item
:span10el-inputv-modelitem.keyplaceholder规格stylewidth:
:span10el-inputv-modelitem.valueListplaceholder规格值(如:白色,红色)stylewidth:
typedanger删除/el-button/el-col/el-row
typeprimary提交/el-buttonel-button
false取消/el-button/el-form-item/el-form
com.atguigu.spzx.manager.controller
{productSpecService.save(productSpec);return
com.atguigu.spzx.manager.service.impl;
{productSpecMapper.save(productSpec)
com.atguigu.spzx.manager.mapper
在ProductSpecMapper.xml映射文件中添加如下sql语句
(id,spec_name,spec_value,create_time,update_time,is_deleted)
(#{id},#{specName},#{specValue},now(),now(),0)
在src/api目录下添加productSpec.js文件内容如下所示
v-modelproductSpec.specName//el-form-itemel-form-itemel-button
clickaddSpec添加新规格/el-button/el-form-itemel-form-item
:span10el-inputv-modelitem.keyplaceholder规格stylewidth:
:span10el-inputv-modelitem.valueListplaceholder规格值(如:白色,红色)stylewidth:
clickdelSpec(index)删除/el-button/el-col/el-row
clicksaveOrUpdate提交/el-buttonel-button
false取消/el-button/el-form-item/el-form
{productSpec.value.specValue.push({})
{productSpec.value.specValue.splice(index
需要将productSpec.value.specValue转换成json字符串提交到后端通过clone一个新的对象进行实现const
JSON.parse(JSON.stringify(productSpec.value))//
将productSpecClone.specValue.valueList转换成数组因为后端需要的数组格式的数据[{key:内存,valueList:[8G,18G,32G]}]//
v-model绑定的数据模型为字符串productSpecClone.specValue.forEach(item
item.valueList.split(,)})productSpecClone.specValue
JSON.stringify(productSpecClone.specValue)console.log(productSpecClone);//
SaveProductSpec(productSpecClone)dialogVisible.value
falseElMessage.success(操作成功)fetchData()}
当用户点击修改按钮的时候那么此时就弹出对话框在该对话框中需要将当前行所对应的产品规格数据在该表单页面进行展示。
当用户在该表单中点击提交按钮的时候那么此时就需要将表单进行提交在后端需要提交过来的表单数据修改数据库中的即可。
clickeditShow(scope.row)修改/el-button
com.atguigu.spzx.manager.controller
{productSpecService.updateById(productSpec);return
com.atguigu.spzx.manager.service.impl;
{productSpecMapper.updateById(productSpec);
com.atguigu.spzx.manager.mapper
在ProductSpecMapper.xml映射文件中添加如下sql语句
在src/api目录下添加productSpec.js文件内容如下所示
需要将productSpec.value.specValue转换成json字符串提交到后端通过clone一个新的对象进行实现const
JSON.parse(JSON.stringify(productSpec.value))//
将productSpecClone.specValue.valueList转换成数组因为后端需要的数组格式的数据[{key:内存,valueList:[8G,18G,32G]}]//
v-model绑定的数据模型为字符串productSpecClone.specValue.forEach(item
针对规格数据修改完毕以后数据类型有可能会变成string针对string类型的数据将其转换成数组item.valueList
JSON.stringify(productSpecClone.specValue)//
UpdateProductSpecById(productSpecClone)dialogVisible.value
falseElMessage.success(操作成功)fetchData()}
当点击删除按钮的时候此时需要弹出一个提示框询问是否需要删除数据如果用户点击是那么此时向后端发送请求传递id参数后端接收id参数进行逻辑删除。
com.atguigu.spzx.manager.controller
DeleteMapping(/deleteById/{id})
{productSpecService.deleteById(id);return
com.atguigu.spzx.manager.service.impl;
{productSpecMapper.deleteById(id);
com.atguigu.spzx.manager.mapper
在ProductSpecMapper.xml映射文件中添加如下sql语句
在src/api目录下添加productSpec.js文件内容如下所示
${api_name}/deleteById/${id},method:
clickremove(scope.row.id)删除/el-button
{ElMessageBox.confirm(此操作将永久删除该记录,
DeleteProductSpecById(id)ElMessage.success(删除成功)fetchData()}).catch(()
1、在后台管理系统中通过系统管理的菜单管理添加商品管理的相关菜单如下所示
在src/views/product的文件夹中加入商品管理页面文件如下所示
在src/router/modules文件夹下创建product.js路由文件文件内容如下所示
import(/views/product/category.vue)
import(/views/product/brand.vue)
import(/views/product/categoryBrand.vue)
import(/views/product/productSpec.vue)
import(/views/product/product.vue)export
线上状态0-初始值1-上架-1-自主下架,audit_status
审核状态0-初始值1-通过-1-未通过,audit_message
直接导入资料中所提供的product.vue页面以及对应的product.js
1、如果在搜索表单中选择了某一个品牌以及分类那么此时就需要按照品牌id和分类id进行查询
1、前端提交请求参数的时候包含了两部分的参数搜索条件参数、分页参数。
搜索条件参数可以通过?拼接到请求路径后面分页参数【当前页码、每页显示的数据条数】可以让前端通过请求路径传递过来
2、后端查询完毕以后需要给前端返回一个分页对象分页对象中就封装了分页相关的参数(当前页数据、总记录数、总页数…)
3、前端进行参数传递的时候不一定会传递搜索条件因此sql语句的编写需要使用到动态sql
com.atguigu.spzx.model.dto.product;
com.atguigu.spzx.model.entity.product
com.atguigu.spzx.manager.controller;
RequestMapping(value/admin/product/product)
productService.findByPage(page,
com.atguigu.spzx.manager.service.impl;
productMapper.findByPage(productDto)
PageInfo(productList);}}ProductMapper
在ProductMapper.xml映射文件中添加如下的sql语句
http://mybatis.org/dtd/mybatis-3-mapper.dtd
namespacecom.atguigu.spzx.manager.mapper.ProductMapperresultMap
typecom.atguigu.spzx.model.entity.product.Product
idcolumnsid,name,brand_id,category1_id,category2_id,category3_id,unit_name,slider_urls,spec_value,status,audit_status,audit_message,create_time,update_time,is_deleted/sqlsql
productMapper.findByPage(productDto)
在ProductMapper.xml映射文件中添加如下的sql语句
http://mybatis.org/dtd/mybatis-3-mapper.dtd
namespacecom.atguigu.spzx.manager.mapper.ProductMapperresultMap
typecom.atguigu.spzx.model.entity.product.Product
idcolumnsid,name,brand_id,category1_id,category2_id,category3_id,unit_name,slider_urls,spec_value,status,audit_status,audit_message,create_time,update_time,is_deleted/sqlsql
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback