b2c 商城项目经验总结
时间:2023-03-28 21:26:01 | 来源:电子商务
时间:2023-03-28 21:26:01 来源:电子商务
提示:本文约三千字。
经过三个月时间,终于完成了我的第二个项目,先简要概括下,该项目是个“b2c”的商城,b2c 指唯品会、小米商城这种商家-客户的模式,像京东、淘宝这种做平台的叫 C2C(我猜这个 2 可能是取的 to 和 two 的谐音?),C2C 目前已被京东、淘宝、拼多多占据了绝大部分市场份额,所以做 C2C 意义不大,而且 C2C 的复杂度要远超 b2c,不适合我个人来做。项目的前端样式主要仿照小米商城,当然只是仿照了其样式,内部逻辑应该是完全不同的,后台管理系统的样式很常见,主要参考了这个开源项目:
https://gitee.com/hnjihai/jshop_mall 其实该项目做到一半时,我发现“商城”并不适合作为个人项目来开发,因为它的核心是商品,而商品这个东西通常要包含很多素材,而收集这些素材是属于程序之外的事情,弄这些素材真的很麻烦,我是从小米商城上扒的资源,再添加到我自己的数据库中,过程花费了我四五天时间,当时我就想,如果是做个“论坛”就不会有这个麻烦。
上次提到,写项目主要是难在设计“系统模型”这种宏观层面上的东西,这次项目更加深了我的这个观点。一般来说,“系统模型”既要能灵活适应“需求”的不断变化,同时也要能很好的满足当前需求,光做到这点就很难,起码对我来说很难,比如这次我埋头设计了十天的模型,到最后还是漏洞百出,别说满足变化的“需求”了,即使是当前需求都满足的很勉强,当然很大程度上是因为我在这方面本身就缺乏经验,算上上次的新闻站,这也只是我第二次设计一个项目,而且这次的 b2c 商城在规模上要比上次的新闻站翻了好几倍,内部逻辑也有很大不同,所以我确实是缺乏经验。但就问题本身来说,我还是觉得相当有难度,你得考虑的非常非常全面,稍不注意就会出现纰漏,要知道这个“考虑”是建立在你还没做的基础上的,你需要在没做时就考虑到整个项目的方方面面、边边角角,即要想到“该有什么”,又要想到“该如何组合、协调”它们,还要想到“某个部位具体的技术细节”,甚至想到如果以后要加入一些东西,该在哪里预留位置?写项目就是要解决这个大而复杂的问题,它的局部难度往往不高,甚至很简单,但是要想把它的整体做好,就很难,非常难。
基于上次做项目的经验,这次我是本着先设计,再实现的原则做的,其实想想写程序都是这么回事,把你脑海中想的东西用编程语言精确的表达出来,如果你脑海中没东西,那自然也无从写起,或者写出来一坨屎。我首先花了十天时间进行抽象层的设计,这十天也包括查相关信息,因为我刚开始对如何实现一个商城是一无所知的,甚至不知道 b2c 和 c2c 是啥,我设计抽象层的步骤主要分确定需求、设计业务流程、设计数据库、设计权限系统这四步,具体过程的话,主要还是参照现有的商城,比如淘宝、小米商城这些,思考下我写的商城该有什么功能,这样需求就确定下来了,接着业务逻辑也一样,然后是数据库,数据库是个重头戏,要思考该用什么样的内部逻辑来管理这些数据,怎样设计才能更便于实现需求,这也是个很棘手的事情,我十天时间主要就花在设计它上了,那时候整天开着 xmind 不停画脑图,不停的改来改去,最后实在改不动了才慢慢确定下来。
虽然这次项目我遵循了上次总结出的原则,先设计,再实现,实现时先做基本框架,然后层层递进,不过现在我觉得这样也不对,因为这样做时,前期设计时是完全依靠想象来进行的,没有先写哪怕一点代码,这就造成很多局部的设计与实际情况很不贴切,甚至存在很多遗漏,导致在设计模型时不能充分考虑到需求的细节,比如这次项目中的首页轮播图、商品类展示推荐图、展示到首页的商品类,以及后来的优惠券、退货、售后等模块,它们要么是没有被集成到后台管理界面上,要么是由于数据库设计缺陷导致几乎做不出来,没集成到页面上的就需要在源码里临时添加,很麻烦,而属于数据库缺陷的就只能砍掉,除非对整个项目进行大规模改动。经过思考总结后,我发现让前期设计与前端页面编写同步进行才是更好的选择,因为只编写页面模版并不需要多少数据支撑,想改也是很快的,而页面模板却能比较具体的反映出实际需求到底有哪些,这对前期设计的帮助我觉得是很大的,这点我这样直接说,没做过项目的同学可能不是很好理解,这里我只能建议你先做一个项目感受一下。
接下来是技术方面,项目应用到的技术是 Sass、JQuery、ThinkPhp,起初我还打算用 Bootstrap,但正式开工后我发现它非常难用,Bootstrap 会私自加很多全局样式,导致样式混乱,可以说就是个搅屎棍,所以我便弃用了。项目生成视图的方式主要仍然是字符串拼接,没怎么用到 tp 的模板引擎,只是将页面主体结构用 tp 的模版引擎 fetch() 出来,之后再在前端发 ajax 请求过来,后台把页面各个局部位置的 html 拼接后再发送过去。我不用模版引擎主要是因为喜好问题,而且如今通过虚拟 DOM 在前端进行渲染的方式已经越来越流行了,虚拟 DOM 实现了彻底的前后端分离,所以我觉得自己没有必要非去使用模板引擎,我在学习时也跳过了 tp5 的模板语法。代码方面,秉承我的一贯作风,整个项目没有套用任何现成模版,前后端都是我自己一点点写出来的,引用的插件共两个,一个美化滚动条,另一个是 eCharts,剩下的大概有十几个效果,以及常用函数都是我自己动手封装实现的,目前还没整理,初步估计应该能整理出个一千多行吧。
代码编写上,我踩了个比较大的坑,由于对 MVC 不熟悉(毕竟用框架做项目我还是第一次),我对在什么情况下使用 model 没什么概念,起初我一味的在控制器中使用 Db,因为之前都是用面向过程的方式写原生 php,业务逻辑都是直接调 PDO 操作数据库,所以即便学了 tp5,也只是知道有 model 这么个东西,但并不知道具体是在什么情况下去使用它,所以我起初写项目时一直在用 Db 类,然而写了大概半个月后我发现自己经常要用到 cv 大法(复制粘贴),因为我经常需要在不同的控制器内对同一数据表中取出的数据进行相同的操作,我意识到这会造成大量的代码冗余,代码冗余的缺点显而易见 —— 维护性差、可读性差、难以迭代,要解决这个问题,只有多进行一些封装,但用函数封装显然不是个好办法,不同数据表进行操作时的逻辑不同,如果为每个数据表的每个操作都单独封装个函数,光函数命名都够我头疼的了。那怎样才能基于数据表、具有封装性,又不用头疼命名呢?可以说答案已经呼之欲出了,当然是使用 model,你可以为每个你经常要操作的数据表单独封装一个 model,需要时直接调用数据表所对应的 model 的对应操作即可,非常方便。
再说说我在前后端交互方面总结的经验,前端给后端传数据分为四种情况,如果数据量很小且不敏感,比如就一两个字段,而且字段的值也很简单,那就直接用 get 传输,如果字段比较多,数据量比较复杂或敏感,那就用 post 传输,如果需要在传输时维持数据的结构不变,比如你传个对象或多维数组给后端,那就把数据转换为 json 格式再传输,另外,如果需要通过 ajax 发送文件给后台,就需要使用 FormData 对象。它的用法很简单,直接将 form 节点传递给 FormData(),再用 xhr(我用 jq 封装过的 ajax 会报错,所以只好换原生的 xhr 了) 的 send() 发送即可,如果还需要添加其它值,可以用 FormData.append() 为 formdata 对象添加 key/value。
最后,记几个遇到的小坑:
1、form 内的控件的 name 不能为 style,否则 form 本身的 style 属性会被覆盖,导致你无法通过 style 属性更改 form 的标签内嵌 css,进而也会导致 jq 的 css() 方法失效。
2、mysql 建表时字段名不能为 key,否则会报语法错误。
3、thinkphp 5.0 内控制器的方法名不能为 result,否则会报错。
4、json 不支持关联数组,json 只支持简单值、对象、以数字为下标的数组,所以 php 的关联数组不能直接转为 json 格式的字符串。
5、与路径相关的东西千万不要加中文字符,比如文件,这次我就遇到 php 的 move_uploaded_file() 不支持中文路径。