SpringBoot+layui实现商品打标

标题

    • 下拉框组件
    • 效果图
      • 代码实现
        • 前端界面
        • 产品打标页面代码
      • 后端代码
        • controller
        • service ,serviceImpl
        • mapper
        • mapper.xml
        • entity
      • 数据库表

下拉框组件

xm-select

效果图

在这里插入图片描述

在这里插入图片描述

代码实现

前端界面

在这里插入图片描述

<script type="text/html" id="stockTags">
    <div>
        <div>{{d.model}}</div>
        <ul style="display: flex;flex-wrap: wrap;">
            {{# layui.each(d.tags, function(index, item){}}
            <li class="layui-badge data-other-btn tags">
                {{item.name}}
            </li>
            {{# });}}
            {{# if(d.tags === null){}}
            {{#}}}
        </ul>
    </div>
</script>

在这里插入图片描述

产品打标页面代码

在这里插入图片描述

 table.on('toolbar(stockTableFilter)', function (obj) {
            var id = obj.config.id;
            var checkStatus = table.checkStatus(id);
            var dataArr = checkStatus.data;//用于删除
            var data = checkStatus.data[0]; //获取选中行数据
            var othis = lay(this);
            switch (obj.event) {
                case 'tag':
                    if (dataArr.length == 0) {
                        notify.info('请选择要打标的产品', "vcenter", "shadow", false, 1000);
                        return false;
                    }
                    layer.open({
                        type: 1,
                        title: '产品打标',
                        area: ['390px', '160px'],
                        content: '<div id="tagsSelect" class="xm-select-demo-alert" style="padding: 10px"></div>',
                        skin: 'class-layer-sea',
                        btn: ['<i class="fa fa-check"></i> 确认', '<i class="fa fa-reply-all"></i> 取消'],
                        success: function (layero, index) {
                            //这里因为内容过少, 会被遮挡, 所以简单修改了下样式
                            document.getElementById('layui-layer' + index).getElementsByClassName('layui-layer-content')[0].style.overflow = 'unset';
                            //产品打标管理
                            tagsData('#tagsSelect');
                            getData('/tag/getTagsSelectData', tagsSelect);
                        },
                        yes: function (index,) {
                            //获取打标数据
                            var selectArr = tagsSelect.getValue();
                            var str = '';
                            for (var i = 0; i < selectArr.length; i++) {
                                str += selectArr[i].value + ',';
                            }
                            console.log(str);
                            notify.loading('正在保存...', 'vcenter', 'shadow', false)
                            setTimeout(function () {
                                notify.destroyAll();
                                $.ajax({
                                    url: '/stock/updateTagsInfo',
                                    type: 'POST',
                                    data: {
                                        id: data.id,
                                        value: str,
                                    },
                                    success: function (result) {
                                        if (result.code === 0) {
                                            notify.success(result.msg, 'vcenter', 'shadow', false, 1000);
                                        } else {
                                            notify.error(result.msg, "vcenter", "shadow", false, 1000);
                                        }
                                    }
                                }).done(function () {
                                    setTimeout(function () {
                                        notify.destroyAll();
                                        layer.closeAll();
                                        parent.location.reload();//重载页面
                                    }, 500);
                                });
                            }, 1000)

                        },
                        btn2: function () {
                            //按钮【按钮二】的回调
                            layer.close();
                        }
                    });
                    break;
              
            }
            ;
        });
// 下拉组件渲染
        var tagsSelect;

        function tagsData(el) {
            tagsSelect = xmSelect.render({
                el: el,
                filterable: true,
                paging: true,
                pageSize: 5,
                tips: '请选择标签',
                searchTips: '搜索标签',
                toolbar: {
                    show: true,
                    list: ['ALL', 'CLEAR', 'REVERSE', {
                        name: '标签',
                        icon: 'fa fa-plus-square',
                        method(data) {
                            addData('请填写新增标签信息', '/tag/addTags')
                        },
                    }, {
                        name: '重载数据',
                        icon: 'fa fa-refresh',
                        method(data) {
                            getData('/tag/getTagsSelectData', tagsSelect, 0)
                        },
                    }]
                },
                max: 3,
                maxMethod(item) {
                    layer.msg('最多选择三个标签')
                },
                data: []
            })
        }
/*
        * 后端获取下拉框数据
        * */
        function getData(url, select, val) {
            $.ajax({
                url: url, type: 'GET', success: function (data) {
                    var newData = data.map(function (item) {
                        if (val != 0) {//编辑数据
                            // 根据不同的数据类型,设置不同的name和value
                            return {
                                name: item.name,
                                value: item.id,
                                selected: (item.id === val),
                                // disabled: item.status == 0 ? true : false
                            };
                        }
                        // 根据不同的数据类型,设置不同的name和value:disabled:item.status == 0 ? true : false :禁用已经停用的状态
                        return {
                            name: item.name,
                            value: item.id,
                            // disabled: item.status == 0 ? true : false
                        };
                    });
                    select.update({data: newData});//更新下拉选择框的数据
                }, error: function (error) {
                    console.log('Error fetching data from backend: ' + error);
                }
            });
        }

后端代码

controller
 /*
    * 产品标签更新
    * @updateTagsInfo
    * */
    @PostMapping("/updateTagsInfo")
    public ResultUtil updateTagsInfo(Integer id, String value) {
       try {
           stockService.updateTagsInfo(id,value);
           return ResultUtil.ok(0,"打标成功!");
       }catch (Exception e){
           e.printStackTrace();
           return ResultUtil.error("打标失败!");
       }
    }
service ,serviceImpl
 /*
    * 产品打标
    * */
    void updateTagsInfo(Integer id, String value);
  @Override
    public void updateTagsInfo(Integer id, String value) {
        //根据id获取标签实体对象
       tagsMapper.deleteByStockId(id);
        // 判断是否为空
        if (value != null && value.length() != 0){
            // 将字符串按逗号分割
            String[] split = value.split(",");
            for (String s : split) {
                // 创建实体对象
                StockTagsEntity stockTags = new StockTagsEntity();
                // 设置ID
                stockTags.setStockId(id);
                // 设置标签ID
                stockTags.setTagsId(Integer.parseInt(s));
                // 插入信息
                tagsMapper.insertStockTags(stockTags);
            }
        }
    }
mapper
 // 根据id删除
    void deleteByStockId(Integer id);
        /*
    * 插入产品标签信息
    *
    * */
    void insertStockTags(StockTagsEntity stockTagsEntity);
mapper.xml
  <!--插入产品标签信息insertStockTags-->
    <insert id="insertStockTags" parameterType="com.example.erp_project.entity.StockTagsEntity">
        insert into tb_s_tags(stockId,tagsId)
        values (#{stockId},#{tagsId})
    </insert>
 <!--根据id删除角色资源-->
    <delete id="deleteByStockId" parameterType="int">
        delete from tb_s_tags
        where stockId = #{stockId}
    </delete>
entity

import lombok.Data;

/**
 * @author Lolo don‘t feel
 */
@Data
public class StockTagsEntity {
    // 主键
    private Integer id;
    // 产品id
    private Integer stockId;
    // 标签id
    private Integer tagsId;
}

数据库表

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/701027.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

助力草莓智能自动化采摘,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建果园种植采摘场景下草莓成熟度智能检测识别系统

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;技术已经渗透到我们生活的方方面面&#xff0c;从智能家居到自动驾驶&#xff0c;再到医疗健康&#xff0c;其影响力无处不在。然而&#xff0c;当我们把目光转向中国的农业领域时&#xff0c;一个令人惊讶的…

如何优雅的实现Excel导入通用处理流程

目录 1.业务背景2.业务导入流程3.流程优化3.1 模板模式3.1.1 导入处理器接口ImportProcessor3.1.2 抽象父类 AbstractImportProcessor3.1.3 子类实现 ImportDemoProcessor 3.2 工厂模式3.2.1 标识子类的枚举ImportTypeEnum3.2.2 工厂类ProcessorHolder3.2.3 工厂类的调用 4. 特…

openh264 编码器源码分析:主体框架

openh264 OpenH264 是一个开源的 H.264 编码解码库&#xff0c;专为实时应用如 WebRTC 设计。OpenH264 编码器因其高效性能、广泛的操作系统和架构支持以及灵活的编码参数设置&#xff0c;成为许多开发者在需要 H.264 编码解码解决方案时的理想选择。关于其介绍可以参考&#…

express+宝塔实现文件上传服务

文章目录 服务器部分开启存放文件的端口配置nginx该端口入口手动在/www/wwwroot/file目录下存放一张图片进行访问 express接口部分代码测试 服务器部分 开启存放文件的端口 我这里以83为例 先到对应的服务商开启端口&#xff0c;比如我这里是阿里云 测试&#xff0c;比如这里…

大模型基础——从零实现一个Transformer(3)

大模型基础——从零实现一个Transformer(1)-CSDN博客 一、前言 之前两篇文章已经讲了Transformer的Embedding,Tokenizer,Attention,Position Encoding, 本文我们继续了解Transformer中剩下的其他组件. 二、归一化 2.1 Layer Normalization layerNorm是针对序列数据提出的一种…

如何掌握多门编程语言?

我的答案是&#xff1a;掌握学习新编程语言的能力。 授之以鱼不如授之以渔 对于一个编程老手来说&#xff0c;学习新的编程语言应该很容易。他们只需要一个周末甚至是几个小时就可以开始用新学的编程语言写代码了。优秀的程序员可以为了完成某个任务使用任何一门编程语言。毕…

UE5 Sequencer 使用指导 - 学习笔记

https://www.bilibili.com/video/BV1jG411L7r7/?spm_id_from333.337.search-card.all.click&vd_source707ec8983cc32e6e065d5496a7f79ee6 Sequencer 01 1.1 调整视口 调整窗口数量 调整视口类型为Cinematic视口 视口显示网格&#xff0c;或者条件参考线 1.2 关卡动画与…

探索工厂智能制造解决方案的革新与应用

随着工业4.0时代的到来&#xff0c;工厂智能制造解决方案正在以前所未有的速度和规模改变着传统制造业的面貌。从自动化生产到智能化管理&#xff0c;工厂智能制造解决方案正在为制造企业带来前所未有的效率提升和竞争优势。本文将深入探讨工厂智能制造解决方案的革新与应用&am…

ANSYS电池包行业结构仿真解决方案

目前动力电池开发中面临的问题&#xff1a; ▪ 性能(能量密度及功率密度) ▪ 耐用性和使用寿命(考虑在不同环境和使用周期) ▪ 安全性(考虑恶劣环境) ▪ 费用成本 ▪ 复杂的多尺度、多物理场系统 ▪ 快速发展的材料和设计理念 ▪ 现有软件工具局限性 目录 1. 动力电池开…

Python 制作词云图

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

VM ubuntu终端使用Host代理的方法

1、设置网络地址转换NAT 2、在终端敲击如下命令 先敲击 ip route show 找到网关。再敲击如下命令&#xff1a; export http_proxyhttp://10.0.2.2:33210 export https_proxyhttp://10.0.2.2:33210 export HTTP_PROXYhttp://10.0.2.2:33210/ export HTTPS_PROXYhttp://10.0.2.…

“探索AIGC市场:腾讯元宝APP加入竞争,大模型产品的未来走向与个人选择“

文章目录 每日一句正能量前言使用体验分享独特优势和倾向选择字节豆包百度文心一言阿里通义千问腾讯元宝个人倾向选择结论 未来发展方向技术创新可持续可拓展性用户体验应用场景政府赋能数据安全与隐私保护伦理与社会责任国际合作与竞争结论 后记 每日一句正能量 不管现在有多么…

小程序视图渲染数据和部分事件的绑定

今天依旧使用这个目录进行教学 数据的渲染 在 index.js的 page中定义一个data对象结构是这样的 Page({data:{name:张三} }) 在index.wxml 中 利用模板语法进行渲染 <view >{{name}}</view> 注意这个模板里边不能使用js的方法 要循环渲染数组&#xff0c;如 在…

AIGC简介

目录 1.概述 2.诞生背景 3.作用 4.优缺点 4.1.优点 4.2.缺点 5.应用场景 5.1.十个应用场景 5.2.社交媒体内容 6.如何使用 7.未来展望 8.总结 1.概述 AIGC 是“人工智能生成内容”&#xff08;Artificial Intelligence Generated Content&#xff09;的缩写&#x…

vue element-ui 下拉框 以及 input 限制输入,小数点后保留两位 界面设计案例 和 例子:支持mp4和m3u8视频播放

vue input 限制输入&#xff0c;小数点后保留两位 以及 图片垂直居中显示 和 分享 git 小技巧-CSDN博客文章浏览阅读430次&#xff0c;点赞5次&#xff0c;收藏4次。error:Your local changes to the following files would be overwritten by merge:_error: your local change…

VS Code扩展开发介绍和快速示例

VS Code 介绍 VS Code&#xff08;Visual Studio Code&#xff09;是一款由微软开发的轻量级的免费开源的源代码编辑器&#xff0c;它支持多种操作系统&#xff0c;包括Windows、macOS和Linux。以下是对VS Code的详细介绍&#xff1a; 一、跨平台支持 VS Code是一个真正的跨…

阅读源码解析dynamic-datasource-spring-boot-starter中是如何动态切换数据源的

dynamic-datasource-spring-boot-starter是苞米豆提供的一个动态切换数据源的工具&#xff0c;可以帮助企业或者个人实现多数据源的切换&#xff0c;这里通过阅读源码的方式解析是如何动态的切换数据源的&#xff0c;采用的版本是3.5.1 源码解析 通过官方文档可以看到&#x…

HTML制作一个太阳、地球、月球之间的绕转动画

大家好&#xff0c;今天制作一个太阳、地球、月球之间的绕转动画&#xff01; 先看具体效果&#xff1a; 要制作一个太阳、地球、月球之间的绕转动画&#xff0c;我们需要结合HTML、CSS和JavaScript。由于CSS动画和JavaScript动画各有优缺点&#xff0c;这里我将给出一个使用…

LCD电子广告牌课程设计

概述 1.1课程设计简介 亮丽实用的广告牌可以给我们的生活添加光彩、可以给店铺招揽生意。传统的广告牌都是固定的汉字&#xff0c;并且时间长了会掉色&#xff0c;使汉字模糊难认&#xff0c;这就给我的生活带来很多的不便。尤其到了晚上传统广告牌就会失去其该有的作用。所以在…

空山新雨后-故事和场景搭建(一)

1、关于故事 1.故事的灵感 2.故事的表线 3.故事的里线 4.故事的参考图 5.故事的资源 6.关于音乐,听了100多首音乐选出来的 2、场景搭建 1.放入HDRI,放入PostProcessVolumn,将PostProcessVolumn设置为无限范围,将曝光补偿、Min EUV、Max EUV都设置为0,