最近有个前端同学想做个小米商城,想委托我搭下后端,我寻思着最近也不忙,就答应了,没想到遇到的难题颇多,光数据库就研究了一星期,勉勉强强弄了个能看的出来。
本来是想着去网上找一个商城数据库改一改的,但百度了发现很难找到完善的商城数据库,基本都是简单的用于学习的,想想也是,哪个公司把他们数据库结构到处传的。被逼无奈,只好自己做了。
首先,商品肯定有分类,先贴我的分类表
CREATE TABLE `category` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '类别id',
`parent_id` int(11) NOT NULL COMMENT '父类别id 当id=0是说明是根节点',
`name` varchar(50) DEFAULT NULL,
`status` tinyint(1) DEFAULT '1' COMMENT '状态',
`sort_order` int(4) DEFAULT NULL COMMENT '排序编号,同类展示顺序',
`is_show` tinyint(1) DEFAULT '0' COMMENT '是否显示在首页,不包含根类',
`showimage` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '首页显示图片',
`introducePage` varchar(255) DEFAULT NULL COMMENT '点击跳转页面',
PRIMARY KEY (`id`)
)
用无限级分类(我是不太懂这个,数据库不太行,无限查询都写不出来),然后我加了个首页显示图片以及跳转页面的字段,用来显示首页分类那块数据
然后就是商品表
CREATE TABLE `produce` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`category_id` int(11) DEFAULT NULL,
`is_new` tinyint(1) DEFAULT NULL,
`create_time` datetime(6) DEFAULT NULL,
`label` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '标签 用于首页推荐分类,查询等',
`name` varchar(100) NOT NULL,
`subtitle` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '商品副标题',
`main_image` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '产品主图相对地址',
`sub_images` text COMMENT '图片地址,json',
`homepage_images` varchar(200) DEFAULT NULL,
`homepage_subtitle` varchar(200) DEFAULT NULL,
`detail` text COMMENT '商品详情',
`price` decimal(20,2) NOT NULL DEFAULT '0.00' COMMENT '价格 两位小数',
`stock` int(11) DEFAULT NULL COMMENT '库存数量',
`status` int(6) DEFAULT '1' COMMENT '商品状态1-在售 2-下架 3-删除',
`is_discount` tinyint(1) DEFAULT NULL COMMENT '促销',
`discount_price` decimal(20,0) DEFAULT NULL COMMENT '促销价',
`discount_describe` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '促销描述',
`color` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '选择颜色',
`edition` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '选择版本',
`size` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '选择尺寸',
`capacity` varchar(255) DEFAULT NULL COMMENT '容量 ',
`packages` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '套餐',
`style` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '款式',
`introducePage` varchar(255) DEFAULT NULL COMMENT '介绍页面',
`buyPage` varchar(255) DEFAULT NULL COMMENT '购买页面',
PRIMARY KEY (`id`)
)
商品表除了一些常见的名字价格,我为了简化表结构添加了一些字段
- 我添加了label字段,用来进行模糊查询,小米首页下面的分类我看着很繁琐,而且其他地方也没看见用来,要是都添加到数据库里就是多对多了,需要一个中间表,所以我干脆添加label字段用于模糊查询,此外label还用于搜索。
- 我看了一些商品,发现商品购买时的可选项不多,就颜色、版本、尺寸、容量、套餐、款式这几项,并不像淘宝那么多,既然如此,就直接添加到商品表中,数据冗余也不管了
- 商品详情我就放了一个字段,我看了一些商品sku的文章,基本都说用模板加json格式保存产品参数,所以我又创建了一个模板表
CREATE TABLE `mould` ( `id` int(11) NOT NULL AUTO_INCREMENT, `data` text, PRIMARY KEY (`id`) )
顺便写了个页面添加参数,我用的springboot,所以是templates(那个太长了,一会贴最后吧)
-
添加了介绍页和购买页,我看好像点击商品能跳转到的就这两个页了
商品的表就这么三个,然后讲讲我实际数据的情况,本来使用了无限分类应该一层一层分下去的,不过我发现我查询写不出来,无奈只能放两层了,因为只放了两层,本来我打算将所有商品都归到分类中(比如小米9我就打算在分类表中添加一个字段),这样首页显示的时候写接口会简单一些(反正都是我做,能省点事就省点),现在我已经预料到写接口会很繁琐。
最后在扯两句
- 重要的事说三遍,数据不要复制粘贴!数据不要复制粘贴!数据不要复制粘贴!如果你想添完手疼,就无视一条(不堪回首啊)最好是写爬虫添数据(虽然我不会,咳咳),但学个简单的爬虫肯定比你复制粘贴快
- 这个表结构还很粗糙,虽然我得先用它来写接口,不过肯定还得改,要是有建议的小伙伴可以留言告诉我,也可以加我QQ1057168743
贴上添加参数的templates
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
<script type="text/javascript">
$(function(){
//添加分组
$(".addGroup").click(function(){
var placeholder = prompt("请输入组名", "处理器");
var div = $("<div class='param'></div>");
var select = $("<select class='addBtn'></select>");
select.append("<option>h3</option>").append("<option>h4</option>").append("<option>image</option>");
div.append("<input type='text' placeholder='" + placeholder +"'>").append(select).append("<button class='delBtn'>删除</button>").append("<br>");
$(this).parent().append(div);
})
$("body").on('change', '.addBtn', function() {
var div = $("<div class='childParam'></div>");
div.append("---| ").append("<input type='text' placeholder='" + $(this).val() +"'>").append("<button class='delBtn'>删除</button><br>");
$(this).parent().append(div);
})
$("body").on('click', '.delBtn', function() {
$(this).parent().remove();
})
//选择商品
$(".selectProduce").click(function(){
$.ajax({
url : "selectAllProduce",
success : function(data){
$.each(data, function(key, value){
$(".selectProduce").append("<option produceid='" + value.id + "'>" + value.name + "</option>")
})
}
})
$(this).children().remove();
})
//提交
$(".submit").click(function(){
var array = new Array();
$(".param").each(function(){
//子节点
var paramArray = new Array();
$(this).children(".childParam").each(function(){
var childJson = {
"group" : $(this).children("input").attr("placeholder"),
"param" : $(this).children("input").attr("text")
}
paramArray.push(childJson)
})
var json = {
"group" : $(this).children("input").attr("placeholder"),
"param" : paramArray
}
array.push(json);
})
$.ajax({
url : "updateProduceByPrimaryKeySelective",
type : "POST",
data : {
id : $(".selectProduce option:selected").attr("produceid"),
detail : JSON.stringify(array)
},
success : function(data){
alert("添加成功")
}
})
})
})
</script>
</head>
<body>
<div>
商品:
<select class="selectProduce"></select>
<!-- <button class="selectProduce">选择商品</button> -->
</div>
<div>
参数规格:
<button class="addGroup">添加分组</button><br>
<tr th:each="params,paramsStat : ${params}">
<div class="param">
<input type="text" th:placeholder="${params.group}">
<select class="addBtn">
<option>h3</option>
<option>h4</option>
<option>image</option>
</select>
<button class="delBtn">删除</button>
<br>
</div>
</tr>
</div>
<button class="submit">提交</button>
</body>
</html>