由elemnent-ui模拟一个全选、反选效果想到的购物车逻辑案例

news2024/11/26 0:39:42

本文参考 https://blog.csdn.net/sumimg/article/details/137508302?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22137508302%22%2C%22source%22%3A%22sumimg%22%7D
我遇到的问题
在这里插入图片描述

点击店铺二级的时候,checkedCities的值已经在数组里面了 ,但是页面却没有更新
重新赋值,使用$set解决
在这里插入图片描述
数据类型
在这里插入图片描述

全部代码

<template>
    <div class="container">
        <div class="manageSearch" style="margin-top: 10px">
            <div class="yanchang" style="font-size: 12px;
    color: #555555;
    margin-bottom: 10px;">我的购物车</div>
        </div>
        <!-- :style="{ height: tableHeight + 'px' }" -->
        <div class="orderTable" ref="marsTable">
            <div class="shopCar">
                <div class="carTop">
                    <ul flex>
                        <li>
                            <div>
                                <el-checkbox :indeterminate="indeterminateAll" v-model="checkAll"
                                    @change="handleCheckAllChange">全选</el-checkbox>

                            </div>

                        </li>
                        <li style="margin-left: 111px;">
                            商品信息

                        </li>
                        <li style="margin-left: 300px;">
                            规格

                        </li>
                        <li style="margin-left: 110px;">
                            单价

                        </li>
                        <li style="margin-left: 141px;">
                            数量

                        </li>
                        <li style="margin-left: 150px;">
                            小计

                        </li>
                        <li style="margin-left: 116px;">

                            操作
                        </li>
                    </ul>
                </div>
                <div class="carBot">
                    <ul class="carBotUl">
                        <li class="carBotLi" v-for="(item, index) in shopcarList" :key="index">
                            <div class="dptitle">
                                <el-checkbox v-model="item.checkGroupStatus" :indeterminate="item.isIndeterminate"
                                    @change="(val) => handleCheckGroup(val, item, index)">
                                    <!-- {{ item.name }} -->
                                </el-checkbox>
                                <span style="font-size: 12px;color: #AAAAAA;margin-left: 20px;">店铺:</span>
                                <span style="font-size: 12px;color: #333;">
                                    {{ item.ShopName }}
                                </span>
                                <span style="color: #666666;">></span>
                            </div>
                            <div class="box1">



                                <ul class="box1Ul" flex="cross:center" v-for="(g, i) in item.Goods" :key="i">
                                    <li class="box1Li">
                                        
                                        <el-checkbox-group v-model="item.checkedCities"
                                            @change="(val) => handleCheckedCitiesChange(val, item, g)">
                                            <el-checkbox :key="i" :label="g">{{ }}</el-checkbox>
                                        </el-checkbox-group>

                                        


                                    </li>
                                    <li flex style="margin-left: 25px;">
                                        <div>
                                            <img style="width: 70px;height: 71px;" :src="g.Img" alt="">
                                        </div>
                                        <div style="margin-left: 8px;">
                                            <div style="width: 262px; font-size: 12px;color: #333333;"
                                                class="ellipsis-multiline">
                                                {{ g.Name }}</div>
                                            <div style="margin-top: 16px; width: 80px;height: 18px;border-radius: 2px;border: 1px solid #FAA07D;
                                            line-height: 18px;text-align: center;font-size: 12px;
color: #FAA07D;">48小时发货</div>
                                        </div>
                                    </li>
                                    <li style="width: 243px; font-size: 12px; text-align: center;
color: #333333;">
                                        颜色:{{ g.SubName }} 规格:{{ g.MainName }}
                                    </li>
                                    <li style="width: 120px; font-size: 12px;color: #E92927;text-align: center;">
                                        {{ g.Price }}
                                    </li>
                                    <li style="width: 200px; text-align: center;">
                                        <el-input-number v-model="g.Amount" :min="1" size="mini"
                                            label="描述文字"></el-input-number>
                                    </li>
                                    <li style="width: 174px; font-size: 12px;color: #333333; text-align: center;">
                                        {{ g.Price * g.Amount }}
                                    </li>
                                    <li @click="shanchuyige(g)"
                                        style="width: 100px; font-size: 12px;color: #999999; text-align: center;cursor: pointer;">
                                        删除
                                    </li>
                                </ul>



                            </div>
                        </li>
                    </ul>

                </div>
            </div>

        </div>
        <div class="jiesuanlan" flex="main:justify cross:center">
            <div flex="cross:center">
            
                <div @click="shanchuSingle()" style="margin-left: 20px; width: 99px;height: 28px;background: #FFFFFF;border-radius: 4px;border: 1px solid #DDDDDD;font-size: 12px;
color: #666666;line-height: 28px;text-align: center;cursor: pointer;">删除选中商品</div>
                <div @click="qingkongShop()" style="margin-left: 20px; width: 87px;height: 28px;background: #FFFFFF;border-radius: 4px;border: 1px solid #DDDDDD;font-size: 12px;
color: #666666;line-height: 28px;text-align: center;cursor: pointer;">清空购物车</div>
            </div>
            <div flex="cross:center">
                <span style="font-size: 14px;color: #666666;">应付总额(不含运费):</span>
                <span style="font-size: 18px;color: #DF3627;">{{ zongjia }}</span>
                <div @click="shouhuodizhi()" style="margin-left: 15px; width: 168px;height: 48px;background: #DF3627;border-radius: 4px;font-size: 16px;
color: #FFFFFF;line-height: 48px;text-align: center;cursor: pointer;">
                    去结算
                </div>
            </div>
        </div>

    </div>
</template>

<script>
import { VShoppingCartList, ShoppingCartDele } from '@/api/api'




export default {
    components: { },
    data() {
        return {
            form: {},
            
            compPama: {
                "pageSize": 15,
                "pageIndex": 1,
                "enablePager": true,
                strJson: {
                    UserInfo_ID: JSON.parse(localStorage.getItem('loginInfo')).Users.ID
                }
            },
            newForm: {
                name: ''
            },
            model: {},
            tableData: [],

            total: 0,
            
            tableHeight: 0,
            searchName: '',
            shopcarList: [],
            checkAll: false,
            indeterminateAll: false,
            testArr: [],
            zongjia: 0,
            


        };
    },
    computed: {},
    watch: {},
    methods: {
        shanchuyige(g) {
            this.$confirm('确定删除该商品?', '提示', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
                type: 'warning'
            }).then(() => {
                let params = {
                    "SysRow": g.SysRow
                }
                ShoppingCartDele(params).then(res => {
                    const { ReturnCode, Data } = res
                    if (ReturnCode == 200) {
                        this.$message.success('删除成功!');
                        this.getVShoppingCartList();
                    }
                })
            }).catch(() => {


            });
        },
        // 删除选中
        shanchuSingle() {

            this.$confirm('确定删除该商品?', '提示', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
                type: 'warning'
            }).then(() => {
                this.xuanzhong = []
                this.testArr.forEach((e, i) => {
                    e.Goods.forEach((m, j) => {

                        if (m.checked) {
                            this.xuanzhong.push(m.SysRow)
                        }
                    })
                })
                
                this.xuanzhong.forEach((e) => {
                    this.shanchu(e)
                })
                setTimeout(() => {
                    // 刷新列表
                    this.getVShoppingCartList();
                }, 500)


            }).catch(() => {


            });
            
        },
        shanchu(e) {
            let params = {
                "SysRow": e
            }
            ShoppingCartDele(params).then(res => {
                const { ReturnCode, Data } = res
                if (ReturnCode == 200) {
                    // this.$message.success('删除成功!');
                }
            })
        },
        // 清空购物车
        qingkongShop() {
            this.$confirm('确定清空购物车?', '提示', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
                type: 'warning'
            }).then(() => {
                this.xuanzhong = []
                this.testArr.forEach((e, i) => {
                    e.Goods.forEach((m, j) => {

                        
                        this.xuanzhong.push(m.SysRow)
                        
                    })
                })
                console.log(this.xuanzhong, '==this.xuanzhong');

                
                this.xuanzhong.forEach((e) => {
                    this.shanchu(e)
                })

                setTimeout(() => {
                    // 刷新列表
                    this.getVShoppingCartList();
                }, 500)

            }).catch(() => {


            });
        },
        handleCheckAllChange(val) {

            
            console.log(this.testArr, 'this.testArr==');
            if (this.checkAll) {
                this.testArr.forEach(group => {
                    group.checkedCities = group.Goods;
                    group.checkGroupStatus = true
                    group.Goods.forEach(k => k.checked = true)
                })
            } else {
                this.testArr.forEach(group => {
                    group.checkedCities = [];
                    group.checkGroupStatus = false
                    group.Goods.forEach(k => k.checked = false)
                })
            }


            this.zongjia = 0
            
            this.testArr.forEach((e, i) => {
                
                e.Goods.forEach((m, j) => {

                    if (m.checked) {
                        this.zongjia += (m.Price * m.Amount)
                    }
                })
                
            })
        },

        //勾选group的复选项选择当前组
        handleCheckGroup(val, group, index) {
            this.$forceUpdate()
            console.log(val, group, index, '二级');
            if (val) {
                console.log('001');
                let xiznhi = []
                group.Goods.forEach(ele => {
                    console.log(ele, '--ele=');
                    group.checkedCities.push(ele)
                    xiznhi.push(ele)

                })
                
                group.checkGroupStatus = true
                group.Goods.forEach(k => k.checked = true)

                
                this.$set(group, 'checkedCities', xiznhi)
                this.$set(this.shopcarList, index, Object.assign({}, group));
                this.$forceUpdate()

                // 算价格

                console.log('算价格1 ');
                this.zongjia = 0
                
                this.testArr.forEach((e, i) => {
                    
                    e.Goods.forEach((m, j) => {

                        if (m.checked) {
                            this.zongjia += (m.Price * m.Amount)
                        }
                    })
                    
                })
                console.log(this.testArr, '===this.testArr');


            } else {
                if (!val) {
                    console.log('002');
                    group.checkedCities = []
                    group.Goods.forEach(k => k.checked = false)
                    this.$forceUpdate()


                    console.log('算价格2 ');
                    this.zongjia = 0
                    
                    this.testArr.forEach((e, i) => {
                        
                        e.Goods.forEach((m, j) => {

                            if (m.checked) {
                                this.zongjia += (m.Price * m.Amount)
                            }
                        })
                        
                    })
                    console.log(this.testArr, '===this.testArr');
                }
            }

            //影响整体
            this.checkAllStatus()
            group.isIndeterminate = false;
            this.$forceUpdate()
        },
        handleCheckedCitiesChange(value, item, g) {
            console.log(value, item, g, 'value, item三级');
            
            item.checkGroupStatus = item.checkedCities.length === item.Goods.length ? true : false;
            item.isIndeterminate = item.checkedCities.length > 0 && item.checkedCities.length < item.Goods.length

            
            this.testArr.forEach((e, i) => {
                e.Goods.forEach((m, j) => {

                    if (m.SysRow == g.SysRow) {
                        m.checked ? m.checked = false : m.checked = true
                        this.$forceUpdate()
                    }

                })
            })
            
            //影响整体全选
            this.checkAllStatus()
            this.$forceUpdate()
            console.log('算价格 ');
            this.zongjia = 0
            // checkGroupStatus
            this.testArr.forEach((e, i) => {
                e.Goods.forEach((m, j) => {

                    if (m.checked) {
                        this.zongjia += (m.Price * m.Amount)
                    }
                })
            })
            console.log(this.testArr, '===this.testArr');
            console.log(this.zongjia, 'this.zongjia---');
        },

        checkAllStatus() {
            console.log(this.testArr, 'this.testArr---');
            
            let isAll = this.testArr.every(group => group.checkedCities.length == group.Goods.length) ? true : false;
            if (isAll) {
                console.log('003');
                this.checkAll = true
                this.indeterminateAll = false
            } else {
                console.log('004');

                this.checkAll = false
                this.indeterminateAll = true
            }
            this.$forceUpdate()
        },
        shouhuodizhi() {
            let testArr1 = JSON.stringify(this.testArr)
            let testArr = JSON.parse(testArr1)
            testArr.forEach((e, i) => {
                e.weiGoods = []
                e.Goods.forEach((m, j) => {

                    if (m.checked) {
                        // this.xuanzhong.push(m.SysRow)
                        e.weiGoods.push(m)
                    }
                })
            })
            console.log(testArr, 'testArr===');
            let jiesuanList = []
            testArr.forEach((e, i) => {
                if (e.weiGoods.length > 0) {
                    jiesuanList.push(e)
                }

            })

            jiesuanList.forEach((e, i) => {
                e.Goods = e.weiGoods

            })
            console.log(jiesuanList, '===--this.jiesuanList');
            if (jiesuanList.length < 0 || jiesuanList == 0) {
                this.$message.warning('请选择需要结算的商品')
                return
            }
            localStorage.removeItem('jiesuanList')

            this.$router.push({
                path: '/shouhuodizhi',
                query: {
                    shoppingList: JSON.stringify(jiesuanList)
                }
            })
            localStorage.setItem('jiesuanList', JSON.stringify(jiesuanList))

        },
       
       
        handleSizeChange(val) {

            this.compPama.pageSize = val;

            this.getSourcingList();
        },
        handleCurrentChange(val) {

            this.compPama.pageIndex = val;

            this.getSourcingList();
        },
        //查询
        selectBtn() {
            this.getSourcingList();
        },
        //清空
        emptyBtn() {
            this.form.Name = '';
            this.getSourcingList();
        },
        
        getVShoppingCartList() {
        
            let params = {
                "pageSize": 15,
                "pageIndex": 1,
                "enablePager": false,
                "strJson": {
                    "UserInfo": JSON.parse(localStorage.getItem('loginInfo')).Users.ID
                }
            }

            VShoppingCartList(params).then(res => {
                const { Data, ReturnCode } = res
                if (ReturnCode == 200) {
                    
                    console.log(Data, '---');
                    this.shopcarList = Data
                    // 首先填充值
                    this.shopcarList.forEach((e, i) => {
                        e.checkGroupStatus = false
                        e.isIndeterminate = false
                        e.checkedCities = []

                        e.Goods.forEach((m, j) => {
                            m.checked = false
                            
                        })
                        


                    })

                    this.testArr = this.shopcarList
                    
                }
            })
        },


    },
    created() {
        this.$nextTick(() => {
            var isMac = /macintosh|mac os x/i.test(navigator.userAgent);
            if (isMac) {
                //your code
                // 根据浏览器高度设置初始高度
                this.tableHeight = window.innerHeight - 370;
                // 监听浏览器高度变化,改变表格高度
                window.onresize = () => {
                    this.tableHeight = window.innerHeight - 370;
                };
            } else {
                // 根据浏览器高度设置初始高度
                this.tableHeight = window.innerHeight - 270;
                // 监听浏览器高度变化,改变表格高度
                window.onresize = () => {
                    this.tableHeight = window.innerHeight - 270;
                };
            }
        });




    },
    mounted() {
    
        this.getVShoppingCartList();


    },
    beforeCreate() { },
    beforeMount() { },
    beforeUpdate() { },
    updated() { },
    beforeDestroy() { },
    destroyed() { },
    activated() { }
};
</script>
<style lang="scss" scoped>
.shopCar {
    padding: 0 20px 20px;
    box-sizing: border-box;

    .carTop {
        height: 50px;
        border-bottom: 1px solid #EEEEEE;
        padding: 0 20px;
        box-sizing: border-box;
        line-height: 50px;

        ul {
            li {
                font-size: 14px;
                color: #333333;
            }
        }
    }

    .carBot {
        .carBotUl {
            .carBotLi {
                width: 100%;
                border-left: 1px solid #EDEDED;
                margin-bottom: 10px;

                .dptitle {
                    height: 34px;
                    line-height: 34px;
                    background: #F8F8F8;
                    padding: 0 20px;
                    box-sizing: border-box;
                }

                .box1 {
                    .box1Ul {
                        padding: 18px;
                        box-sizing: border-box;
                        border-bottom: 1px solid #EDEDED;
                        border-right: 1px solid #EDEDED;

                        .box1Li {}
                    }
                }

            }


        }

    }
}

.jiesuanlan {
    padding: 0 37px;
    box-sizing: border-box;
    width: 100%;
    margin-top: 10px;
    background: #fff;
    height: 80px;
    line-height: 80px;
}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HNUST湖南科技大学嵌入式开发板使用-2024

目录 1.需要准备的软件(版本必须相同)꒰ঌ( ⌯ ⌯)໒꒱ 2.下载链接地址⌯▾⌯ 3.软件安装教程 4.安装好了&#xff0c;正常情况会是什么样子呢&#xff1f;(๑•̌.•๑) 4.1.拆入第一个接口(串口com接口是用来上传代码的ฅ˙Ⱉ˙ฅ) 4.2.拆入第三个接口&#xff08;SWD Jlink口…

鸿蒙应用开发之富文本(RichText)组件

前面学习了评分组件,现在来学习富文本组件,这个组件用来表示复杂的文本,把文本显示得更加有特色,比如网页一样显示。这种显示会比较复杂,所以应用的场合就会少一点。不过富文本显示最多的,就是即时通讯软件了,比如显示图片与文本,以及一些特殊的字符。 比如显示如下面的…

Unity Standalone File Browser,Unity打开文件选择器

Unity Standalone File Browser&#xff0c;Unity打开文件选择器 下载地址&#xff1a;GitHub链接&#xff1a; https://github.com/gkngkc/UnityStandaloneFileBrowser简单的示例代码 using SFB; using System; using System.IO; using UnityEngine; using UnityEngine.UI;…

【自然语言处理八-transformer实现翻译任务-一(输入)】

自然语言处理八-transformer实现翻译任务-一&#xff08;输入&#xff09; transformer架构数据处理部分模型的输入数据(图中inputs outputs outputs_probilities对应的label)以处理英中翻译数据集为例的代码 positional encoding 位置嵌入代码 鉴于transfomer的重要性&#xf…

Ja-netfilter(idea激活码破解原理)分析

Ja-netfilter&#xff08;idea破解&#xff09;分析 简介 ja-netfilter是一款可以破解jetbrainsIDE系列的javaagent jar 包。 原理简介 通过javaagent创造修改字节码的时机。通过asm修改相关类&#xff0c;达到hook特定方法的作用。主要依赖power&#xff08;rsa方法hook&a…

【Java】Set集合的基本使用

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 一、HashSet集合 1.HashSet集合的特点 2.HashSet常用方法 ①&#xff1a;add(Object o)&#xff1a;向Set集合中添加元素&#xff0c;不允许添加重复数据。 ②&#xff1a;size()&#xff1a;返回Set集合中的元素个数…

NASA数据集——亚洲夏季季风化学与气候影响项目超高灵敏度气溶胶光谱(UHSAS)数据

ACCLIP_Aerosol_AircraftInSitu_WB57_Data 简介 ACCLIP_Aerosol_AircraftInSitu_WB57_Data 是亚洲夏季季风化学与气候影响项目&#xff08;ACCLIP&#xff09;期间收集的原地气溶胶数据。本数据集收录了来自下一代激光质谱仪&#xff08;PALMS-NG&#xff09;、单颗粒烟尘光度…

0101tomcat部署war访问mysql失败-容器间通信-docker项目部署

文章目录 一、简介二、部署1、mysql数据迁移2、docker部署redis3、docker部署tomcat并运行war包 三、报错四、解决1 分析2 解决 结语 一、简介 最近参与开发一个项目&#xff0c;其中一部分系统需要迁移。从阿里云迁移到实体服务器&#xff0c;使用docker部署。系统使用Java语…

RAG进阶之通用文档处理:从RAGFlow、TextMonkey到mPLUG-DocOwl 1.5

前言 我司RAG项目组每个月都会接到一些B端客户的项目需求&#xff0c;做的多了&#xff0c;会发现很多需求是大同小异的&#xff0c;所以我们准备做一个通用的产品&#xff0c;特别是对通用文档的处理 而在此之前&#xff0c;我们则想先学习一下目前市面上各种优秀的解决方法…

IIS服务器更换即将过期的SSL证书

公司IIS服务器证书快要过期&#xff0c;替换证书的步骤&#xff1a; Winr输入mstsc命令&#xff0c;显示远程登录&#xff1b;输入服务器IP以及密码&#xff0c;进行远程登陆登陆IIS服务器&#xff0c;winr输入inetmgr命令显示IIS操控器&#xff1b;选择服务器证书--点击服务器…

成为摄影拍照高手,摄影技术进阶秘籍

一、资料前言 本套摄影高手资料&#xff0c;大小2.02G&#xff0c;共有57个文件。 二、资料目录 DSLR数码单反摄影圣经.pdf photoshop超细的人像后期磨皮及专业美化.docx “失传”的人像拍摄绝技.doc 白加黑减.怎样应用曝光补偿.pdf 标准镜头秘笈&#xff1a;标准镜如何…

快速寻找可以构建出网通信隧道的计算机

点击星标&#xff0c;即时接收最新推文 本文选自《内网安全攻防&#xff1a;红队之路》 扫描二维码五折购书 为加强内网的安全防范&#xff0c;安全管理员往往会限制内网计算机访问互联网&#xff0c;当然不同机构的限制策略是不一样的&#xff0c;有的完全阻断了内网计算机访问…

langchain LCEL,prompt模块,outputparse输出模块

目录 基本代码 prompt模块 prompt模版控制长度 outputparse格式化输出 并行使用调用链 LangChain表达式语言&#xff0c;或者LCEL&#xff0c;是一种声明式的方式&#xff0c;可以轻松地将链条组合在一起 langchian 可以使用 通义千问&#xff0c;我们用通义千问&#x…

openkylin系统通过网线连接ubuntukylin系统上网攻略

openkylin系统通过网线连接ubuntukylin系统上网攻略 主机1&#xff1a;x64 amd &#xff0c;系统&#xff1a;ubuntukylin 22.04 &#xff0c;状态&#xff1a;通过wifi连接热点进行上网&#xff0c;并共享网络。 主机2&#xff1a;x64 intel &#xff0c;系统&#xff1a;ope…

阿里一面:如何将重复性比较高的 String 类型的地址信息从 20GB 降到几百兆?...

这次应该是互联网及软件行业的第三次寒潮&#xff0c;大家在寒潮中一定要继续保持学习&#xff0c;寒潮挺过去以后还是会迎来新的发展机遇。 有粉丝去阿里面试&#xff0c;跟码哥分享了其中一题面试问题「如何将重复性比较高的 String 类型的地址信息从 20GB 降到几百兆&#x…

linux创建文件、linux创建文件的几种方式、touch、echo、cat、vi、vim

文章目录 一、创建文件1.1、touch1.2、echo1.3、cat1.4、vi或vim 一、创建文件 1.1、touch touch命令&#xff1a;用于创建一个新的空文件或者更新已存在文件的访问和修改时间。 &#xff08;1&#xff09;如果目标文件不存在&#xff0c;则新建一个文件 touch demo.txt&am…

AcWing 1388. 游戏(每日一题)

原题链接&#xff1a;1388. 游戏 - AcWing题库 玩家一和玩家二共同玩一个小游戏。 给定一个包含 N 个正整数的序列。 由玩家一开始&#xff0c;双方交替行动。 每次行动可以在数列的两端之中任选一个数字将其取走&#xff0c;并给自己增加相应数字的分数。&#xff08;双方…

Vscode设置滚轮进行字体大小的调节

Vscode设置滚轮进行字体大小的调节 正常的话按 ctrl 或者 ctrl - 进行字体的大小调节 1.打开Vscode&#xff0c;找打设置的图标&#xff0c;在点击设置&#xff0c;或者直接使用快捷键&#xff0c;【ctrl ,】 2. 在搜索框搜索Font Ligatures 3.双击进入settings.json ,找到如…

[大模型]# Yi-6B-Chat Lora 微调

Yi-6B-Chat Lora 微调 概述 本节我们介绍如何基于 transformers、peft 等框架&#xff0c;对 Yi-6B-Chat 模型进行 Lora 微调。Lora 是一种高效微调方法&#xff0c;深入了解其原理可参见博客&#xff1a;知乎|深入浅出Lora。 本节所讲述的代码脚本在同级目录 04-Yi-6B-Chat…

【教学类-52-04】20240412动物数独(4宫格)空1-空15

作品展示 背景需求&#xff1a; 【教学类-52-03】20240412动物数独&#xff08;4宫格&#xff09;难度1-9 打印版-CSDN博客文章浏览阅读603次&#xff0c;点赞20次&#xff0c;收藏8次。【教学类-52-03】20240412动物数独&#xff08;4宫格&#xff09;难度1-9 打印版https://…