最近有个前端同学想做个小米商城,想委托我搭下后端,我寻思着最近也不忙,就答应了,没想到遇到的难题颇多,光数据库就研究了一星期,勉勉强强弄了个能看的出来。
本来是想着去网上找一个商城数据库改一改的,但百度了发现很难找到完善的商城数据库,基本都是简单的用于学习的,想想也是,哪个公司把他们数据库结构到处传的。被逼无奈,只好自己做了。
首先,商品肯定有分类,先贴我的分类表
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>