JS实现商品SKU

<!DOCTYPE html>
<html>
<head>
  <title>商品SKU</title>
	<link rel="stylesheet" href="element/css/element.css">
	<style>
		*{ margin:0; padding:0px; box-sizing: border-box; }
		ul,li{ list-style-type: none;}
		body{ font-size: 12px;}
		[v-lock]{ display: none;}
		.el-input__inner{ height:30px; line-height:30px;}
		.el-button{height:30px; line-height:30px;  padding:0 10px; }
		.el-button.is-round{ height:30px; line-height:30px; background: none; border:0; color:#F56C6C; padding:0 10px;}
		.flex{ display: flex; align-items: center;}
		.between{ display: flex; align-items: center; justify-content: space-between;}
		.center{display: flex; align-items: center; justify-content: center;}
		.mt10{ margin-top:10px;}
		.specbox{ padding:20px; }
		.specbox .spec-top li{ background:#f5f5f5; padding:20px; margin-bottom: 10px; }
		.specbox .spec-top li .tit{ width:100px; text-align: right; line-height:30px;}
		.specbox .spec-top li .hm{ display: flex;}
		.specbox .spec-top li .hm .tit{ margin-top:10px;}
		.specbox .spec-top li .val{ flex: 1; display: flex; flex-wrap: wrap; }
		.specbox .spec-top li .val .itm{ margin:10px 20px 0px 0; position: relative;}
		.specbox .spec-top li .val .itm .el-input__inner{ width:100px;}		
		.specbox .spec-top li .val .itm .c{ position: absolute; right:0; top:0; color:#999; }
		.specbox .spec-top li .val .itm .add{ padding:0;}
		.specbox .spec-table{ border-collapse:collapse; width:100%; border-left:1px solid #eee; border-top:1px solid #eee;}
		.specbox .spec-table tr th{ border-bottom: 1px solid #eee; background:#f9f9f9; border-right: 1px solid #eee; padding:10px;}
		.specbox .spec-table tr td{ text-align: center; border-bottom: 1px solid #eee; width:130px; background:#fff; border-right: 1px solid #eee; padding:10px;}
		.specbox .spec-table tr td .el-input__inner{ text-align: center; padding:0 5px;}
		.specbox .spec-table tr td.td1{width:auto;}
	</style>
</head>
<body>
	
  <div id="app" v-lock>
		<div class="specbox">
			<ul class="spec-top">
				<li v-for="(item,index) in specList" :key="index">
					<div class="ht flex">
						<div class="tit">规格:</div> 
						<div class="val">
							<el-input style="width:254px;" v-model="item.label" placeholder="请输入规格名称"></el-input>
							<el-button type="danger" icon="el-icon-delete" @click="delSpec(index)" round></el-button>
						</div>
					</div>
					<div class="hm">
						<div class="tit">规格值:</div>
						<div class="val">
							<div class="itm flex" v-for="(a,i) in item.attr" :key="i">
								<el-input v-model="a" placeholder="请输入"></el-input>
								<el-button class="c" v-if="i!=0" type="danger" @click="delAttr(item.attr,i)" icon="el-icon-close" round>
							</div>
							<div class="itm"><el-button type="text" @click="addAttr(item.attr)" class="add">添加规格值</el-button></div>
						</div>
					</div>
				</li>			
			</ul>
			<el-button type="primary" class="mt10" @click="addSpec">新增规格</el-button>
			<h3 class="mt10">规格明细</h3>
			<table class="spec-table mt10">
				 <tr>
					 <th v-for="(item,index) in specList" :key="index">{{item.label}}</th>
					 <th>规格图片</th>
					 <th>售价/元</th>
					 <th>成本价</th>
					 <th>兑换积分</th>
					 <th>库存</th>
					 <th>规格编码</th>
					 <th>规格状态</th>
				 </tr>
				 <tr v-for="(item,index) in specData" :key="index">
					 <td class="td1" v-for="(a,i) in item.spec" :key="i">{{a}}</td>
					 <td>上图</td>
					 <td><el-input v-model="item.price"></el-input></td>
					 <td><el-input v-model="item.costPrice"></el-input></td>
					 <td><el-input v-model="item.score"></el-input></td>
					 <td><el-input v-model="item.stock"></el-input></td>
					 <td style="width:150px;"><el-input v-model="item.code"></el-input></td>
					 <td><div class="center"><el-switch v-model="item.status"></el-switch></div></td>
				 </tr>
			</table>
		</div>
		
	</div>
	
	<script src="element/js/vue.min.js"></script>
	<script src="element/js/element.js"></script>
  <script>
		new Vue({
			el:'#app',
			data:{
				specList:[
					{label:'规格1', attr:['属于1']},
					{label:'规格2', attr:['2属于1','2属于2','2属于3']}
				],
				specData:[],
				specItem: {img:'',price:'0.00',costPrice:'0.00',score:0,stock:10, code:'', status:1}
			},
			
			watch:{
				specList:{
					handler:function(newVal,oldVal){
						this.setSpecData(newVal)
					},
					deep:true
				}
			},
			
			mounted() {	
				this.specItem.code = this.getRand(14,'S');
				this.setSpecData(this.specList)
			},
			
			methods:{
				
				getRand(length, prefix) {
					return (function (time, code) {
							code += parseInt(time.substr(0, 1)) + parseInt(time.substr(1, 1)) + time.substr(2, 8);
							while (code.length < length) code += Math.round(Math.random() * 10);
							return code;
					})(Date.now().toString(), prefix || '' + '')
				},
				
				// 递归函数,用于生成所有规格组合的算法
				generateSpecifications(specs, index, current, result) {				
					if (index === specs.length) {				
					  result.push(current);
					  return;
					}
				  for (var i = 0; i < specs[index].attr.length; i++) {
				    var next = current.slice();
				    next.push(specs[index].attr[i]);
				    this.generateSpecifications(specs, index + 1, next, result);
				  }
				},
				
				//设置规格值
				setSpecData(arr){
					let result = [], list = [];
					this.generateSpecifications(arr, 0, [], result);
					result.forEach(res=>{
						 list.push({spec:res,...this.specItem})
					})
					this.specData = list
				},
				
				addSpec(){
					let len = this.specList.length+1
					this.specList.push({label:'规格'+len, attr:['属于1']})
					this.setSpecData(this.specList)
				},				
				
				addAttr(attr, i){
					let len = attr.length+1
					attr.push('属性'+len)
				},
				delSpec(index){
					this.specList.splice(index,1)
				},				
				delAttr(attr,i){
					attr.splice(i,1);
				},					
				
			}
		})
  </script>
</body>
</html>

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

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

相关文章

LVS集群-NAT模式

集群的概念&#xff1a; 集群&#xff1a;nginx四层和七层动静分离 集群标准意义上的概念&#xff1a;为解决特定问题将多个计算机组合起来形成一个单系统 集群的目的就是为了解决系统的性能瓶颈。 垂直扩展&#xff1a;向上扩展&#xff0c;增加单个机器的性能&#xff0c;…

JVM 类的加载子系统

文章目录 类的加载过程加载阶段链接阶段初始化 类的加载器测试代码中获取对应的加载器获取加载器加载的路径不同类对应的加载器自定义加载器自定义加载器的方式 获取类的加载器的方式双亲委派机制双亲委派机制的好处 Java 的 SPI 机制1. 接口定义2. 具体实现3. 配置 META-INF/s…

StreamSaver.js入门教程:优雅解决前端下载文件的难题

本文简介 点赞 关注 收藏 学会了 本文介绍一个能让前端优雅下载大文件的工具&#xff1a;StreamSaver.js ⚡️ StreamSaver.js GitHub地址⚡️ 官方案例 StreamSaver.js 可用于实现在Web浏览器中直接将大文件流式传输到用户设备的功能。 传统的下载方式可能导致大文件的加…

centos ubantu IP一直变化,远程连接不上问题

文章目录 一、为什么IP地址会变1.主机DHCP导致 二、解决IP地址变化1.centos2.ubantu 总结 虚拟机能连接为互联网,但下一次启动IP地址再发生变化,无法使用ssh远程连接 一、为什么IP地址会变 1.主机DHCP导致 虚拟机系统(ubantu,centos…)启动后会向本地申请IP地址租约,租聘的I…

Java采集传感器数据,亲测有效!

背景 先说背景&#xff0c; 最近公司项目需要用到传感器&#xff0c;采集设备温湿度&#xff0c;倾斜角&#xff0c;电流…&#xff0c;公司采购采购了一个温湿度传感器给我们开发测试使用&#xff0c;如下图&#xff1a; 看着还挺精致有没有。 进入正题 有了这个温湿度传感器…

基于ChatGPT实现AI软件研发 | 神经网络 | 数据

计算机技术的发展和互联网的普及&#xff0c;使信息处理和传输变得更加高效&#xff0c;极大地改变了金融、商业、教育、娱乐等领域的运作方式。数据分析、人工智能和云计算等新兴技术&#xff0c;也在不断地影响和改变着各个行业。 如今&#xff0c;我们正在见证人工智能技术…

Redis(04)| 数据结构-压缩列表

压缩列表的最大特点&#xff0c;就是它被设计成一种内存紧凑型的数据结构&#xff0c;占用一块连续的内存空间&#xff0c;不仅可以利用 CPU 缓存&#xff0c;而且会针对不同长度的数据&#xff0c;进行相应编码&#xff0c;这种方法可以有效地节省内存开销。 但是&#xff0c;…

RK3568-pcie接口

pcie接口与sata接口 pcie总线pcie总线pcie控制器sata控制器nvme设备sata设备nvme协议ahci协议m-key接口b-key接口RC模式和EP模式 RC和EP分别对应主模式和从模式,普通的PCI RC主模式可以用于连接PCI-E以太网芯片或PCI-E的硬盘等外设。 RC模式使用外设一般都有LINUX驱动程序,安…

计算机操作系统重点概念整理-第四章 内存管理【期末复习|考研复习】

第四章 内存管理 【期末复习|考研复习】 计算机操作系统系列文章传送门&#xff1a; 第一章 计算机系统概述 第二章 进程管理 第三章 进程同步 第四章 内存管理 第五章 文件管理 第六章 输出输出I/O管理 文章目录 第四章 内存管理 【期末复习|考研复习】前言四、内存管理4.1 内…

企业安全—DevSecOps概述详情

0x00 前言 SDL存在的问题在于体量过于庞大&#xff0c;不利于快速进行适配和进行&#xff0c;所以就有了DevSecOps&#xff0c;实际上是因为敏捷开发也就是DevOps的推进&#xff0c;并且坐上了云服务模式的火车&#xff0c;所以这一系列的东西都开始普及。DevSecOps作为DevOps…

PTE-写作 学习(一)

目录 PTE写作 写作技能 词汇积累 熟悉机经 pte写作考的就是态度 写作技能 看一段写一句 蓝色框里的单词是不可以使用的 &#xff0c;他们是副词&#xff0c;要添加新的句子 PTE写作 写作技能 词汇积累 熟悉机经 题库太窄 pte写作考的就是态度 写作技能 极有模板可…

【数据结构】选择排序

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈数据结构 &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 直接选择、堆排序 1. 直接选择排序2…

泛微OA之获取每月固定日期

文章目录 1.需求及效果1.1需求1.2效果 2. 思路3. 实现 1.需求及效果 1.1需求 需要获取每个月的7号作为需发布日期&#xff0c;需要自动填充1.2效果 自动获取每个月的七号2. 思路 1.功能并不复杂&#xff0c;可以用泛微前端自带的插入代码块的功能来实现。 2.将这需要赋值的…

Redis -- 基础知识2

1.Redis客户端介绍 1.基础介绍 Redis是一种客户端-服务器结构的程序&#xff0c;通过网络进行互动 客户端的多种形态 1.自带了命令行客户端&#xff1a;redis-cil 2.图形化界面的客户端&#xff1a;依赖windows系统&#xff0c;连接服务器有诸多限制&#xff0c;不建议使用 3.基…

模拟算法及其优化

第一题 替换所有问号 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 class Solution { public:string modifyString(string s) {string ret;for(int i0;i<s.size();i){if(i0){if(s[i]?&&i1<s.size()){for(char aa;a<z;a){if(a!s…

J2EE项目部署与发布(Windows版本)

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 越努力 &#xff0c;越幸运。 1.单机项目的部署 1.1们需要将要进行部署的项目共享到虚拟机中 在部署项目之前&#xff0c;我们先要检查一下…

基于情感词典的情感分析方法

计算用户情绪强弱性&#xff0c;对于每一个文本都可以得到一个情感分值&#xff0c;以情感分值的正负性表示情感极性&#xff0c;大于0为积极情绪&#xff0c;小于0反之&#xff0c;绝对值越大情绪越强烈。 基于情感词典的情感分析方法主要思路&#xff1a; 1、对文本进行分词…

数据结构与算法基础(青岛大学-王卓)(9)

终于迎来了最后一部分(排序)了&#xff0c;整个王卓老师的数据结构就算是一刷完成了&#xff0c;但是也才是数据结构的开始而已&#xff0c;以后继续与诸位共勉 &#x1f603; (PS.记得继续守护家人们的健康当然还有你自己的)。用三根美味的烤香肠开始吧。。。 文章目录 排序基…

CSS 基础知识-02

CSS 基础知识-01 1. flex布局2.定位3.CSS精灵4.CSS修饰属性 1. flex布局 2.定位 3.CSS精灵 4.CSS修饰属性

NEWCC:新时代的区块链生态新币私募造势平台

在当今区块链领域&#xff0c;这项技术已经为金融资产注入了全新的生机&#xff0c;同时也为初创企业提供了新的商业模式和融资机会。通过代币的金融属性&#xff0c;企业和项目方得以实现资本的初期积累&#xff0c;同时在区块链空间以更低成本和更高效率进行交易和服务创新。…