前言:
项目前端是基于其他博主的项目改的,所以部分页面会相似,但时间太久找不到链接了,有知道的可以在评论留言,同时也十分感谢这位博主,参考其源码很快就能上手arkts语言,arkts相关api见官方文档:开发说明-API参考概述 - 华为HarmonyOS开发者https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/development-intro-api-V5?catalogVersion=V5
后端是学习的课程:(老师讲解很好,十分推荐)黑马程序员JavaWeb全套基础教程,java web从入门到项目实战(IDEA版javaweb)_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1qv4y1o79t/?spm_id_from=333.999.0.0&vd_source=90948eca8c09feb152fe5f51af7b284d然后由于本来这项目后端是另外一位同学做的,我只负责前端,但课设提交后我想把它完善一下,又重写了后端,外加项目开发经验欠缺没有使用成熟的框架,所以项目会有一些比较让人迷惑的代码,还请见谅。
一、项目效果展示:
整体流程视频:(源码链接见视频置顶评论)
1.1账号相关
注册 手机登录(功能没有实现) 密码登录(可记住密码)
用户中心(实现部分功能)设置(可改ip和端口) 修改用户信息
1.2商品相关
首页 浏览商品(可以一直下拉刷新) 商品分类
商品详细 (功能全部实现) 查看评论 店铺(功能实现部分,甚至忘记做返回键)
商品发布(添加图片来自app.madia,从本地相册选图好像挺复杂就没弄)购物车
1.3订单相关
买家订单查看 卖家订单查看(支持关键词以及orderId:xx或productId:xx搜索)
1.4评论相关
买家评论(追加评价) 卖家回复
1.5其他
用户收藏
二、项目环境配置
服务器
java版本:
maven项目直接导入即可,就是虽然pom.xml中用的tomcat7,但实际本地安装的为tomcat8.5.31
客户端
DevEco Studio版本:
SDK版本:
数据库
mysql:
redis:2.8.9
三、项目系统设计
3.1数据库(MySQL)
(数据库部分不建议直接复制下面语句,建议直接从源码sql文件导入,里面存有用户和商品数据,用户密码为1234QWEr)
DDL信息如下:
用户信息表
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`account` varchar(15) NOT NULL,
`username` varchar(50) NOT NULL,
`password` varchar(255) NOT NULL,
`email` varchar(100) NOT NULL,
`state` enum('active','using','frozen','canceled','banned') NOT NULL DEFAULT 'active',
`last_login` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `account` (`account`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8
商品类型表
CREATE TABLE `product_types` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`TYPE` varchar(50) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `TYPE` (`TYPE`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8
商品表
CREATE TABLE `products` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`NAME` varchar(100) NOT NULL,
`description` text,
`price` decimal(10,2) NOT NULL,
`location` varchar(100) DEFAULT NULL,
`type_id` int(11) NOT NULL,
`DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`seller_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `type_id` (`type_id`),
KEY `seller_id` (`seller_id`),
CONSTRAINT `products_ibfk_1` FOREIGN KEY (`type_id`) REFERENCES `product_types` (`id`) ON DELETE CASCADE,
CONSTRAINT `products_ibfk_2` FOREIGN KEY (`seller_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8
商品图片表
CREATE TABLE `product_images` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`product_id` int(11) NOT NULL,
`image_url` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `product_id` (`product_id`),
CONSTRAINT `product_images_ibfk_1` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=64 DEFAULT CHARSET=utf8
订单表
CREATE TABLE `orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`buyer_id` int(11) NOT NULL,
`product_id` int(11) NOT NULL,
`amount` int(11) NOT NULL,
`phone` varchar(15) NOT NULL,
`shipping_address` varchar(255) NOT NULL,
`recipient_name` varchar(100) NOT NULL,
`STATUS` enum('pending','shipped','delivered','canceled','prepared') NOT NULL DEFAULT 'pending',
`DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `buyer_id` (`buyer_id`),
KEY `product_id` (`product_id`),
CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`buyer_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
CONSTRAINT `orders_ibfk_2` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8
库存表
CREATE TABLE `inventory` (
`product_id` int(11) NOT NULL DEFAULT '0',
`stock` int(11) NOT NULL,
`sale_amount` int(11) DEFAULT '0',
PRIMARY KEY (`product_id`),
CONSTRAINT `inventory_ibfk_1` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
用户收藏表
CREATE TABLE `user_favorites` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`product_id` int(11) NOT NULL,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `user_product` (`user_id`,`product_id`),
KEY `fk_product` (`product_id`),
CONSTRAINT `fk_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
CONSTRAINT `fk_product` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8
评论表
CREATE TABLE `comments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`order_id` int(11) NOT NULL,
`description` text NOT NULL,
`score` int(11) DEFAULT NULL,
`DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`next_id` int(11) DEFAULT '-1',
`TYPE` enum('original','follow','reply') NOT NULL,
PRIMARY KEY (`id`),
KEY `order_id` (`order_id`),
CONSTRAINT `comments_ibfk_1` FOREIGN KEY (`order_id`) REFERENCES `orders` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=62 DEFAULT CHARSET=utf8
3.2服务器端(Tomcat Servlet)
服务器部分项目结构如下:
具体逻辑如下:
客户端的http请求如果访问受控资源就过filter提取token中信息,然后到对应servlet,servlet调对应service,service使用dao完成服务,因为个人感觉使用响应码判断服务是否成功会使前后端耦合,即后端响应码变,前端也需要更改,于是使用info和result来代替响应码功能,info存响应是否成功或响应失败原因,result由info和value组成,负责返回数据。
用枚举实现info,之后各个service返回枚举即可,前端接受枚举类型后解析result和message,对于一般的操作只需要判断result即可,如果为false即弹窗显示message,如果需要额外处理再读取code,这样就能极大减少前端的if判断。
但也给我自己挖了一个大坑,前端确实省了很多代码,但代价是每个service都需要单写一个info枚举,同时连带dao也得跟着传info枚举,然后还必须得写change函数完成两种info的转变,这一套下来代码量感觉翻了好几倍,但等我意识到这个问题的时候前端对应解析的逻辑也做好了,沉没成本了属于,就只能硬着额头继续做了。
然后服务器端需要自己补全mailUtil的user和password属性,不然邮件是发送不了的。
3.3客户端(Arkts)
前端界面部分感觉没啥好说的,就是有一个坑,在用router跳转页面时最好传的是基本类型,如果一定要传对象不要直接传而要传一个copy(obj),copy就是重新new一个一样的obj,接受的时候最好再copy这个copy的对象,不然会出bug,我猜是之前页面销毁后连带对象也销毁了,导致接受的是个null。
然后http这块就套模板就行,注意Json.stringfy的用法,可以自己console.log看生成json字符串的形式。
最后:
距离这篇文章发布已经过去大半年了,因为环境配置不同可能可能比较难复现上述演示效果,这里是一个简单的环境配置视频链接。BitGo Servlet的配置演示_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Y9oHYvEM1/?spm_id_from=333.1387.homepage.video_card.click&vd_source=90948eca8c09feb152fe5f51af7b284d 不过确实用servlet做后端还是太原始了,当时也不知道mybatis这种工具能够很方便的执行sql,所以使用的驱动是mysql5,但现在无论是Spring Cloud还是Spring Boot自带的数据源依赖8+,也算是为复现留下了较大的坑都是可能更多关注点还在鸿蒙前端这边的代码。以及关于servlet版本的前后端应该不会再进行迭代,工作量确实太大了而且也不适合当下的环境,但Spring Cloud版本的商城还是会持续推进并形成完整的配置文档,只是具体时间安排可能不好说,还敬请期待,可能会先发布1.0的release版本,到时候会放在这。