springboot字画网站---附源码50387
2026/8/19 21:55:22 网站建设 项目流程

源码获取
私信联系我即可~
大家点赞、收藏、关注、评论啦
精彩专栏推荐订阅:在下方专栏👇🏻

👇🏻 精彩专栏 推荐订阅👇🏻

Java精品项目案例【2000套】https://blog.csdn.net/fykj_2010/category_13187274.html

Python精品项目案例【500套】

uniapp/微信小程序/安卓app【1800套】

✅文末获取源码✅

感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以找我咨询,希望帮助更多的人❤️

系统分析

功能需求分析

普通用户可以在系统内对字画作品进行查看,购物车管理,地址管理,支付订单,订单管理,订单配送跟踪以及售后退款等操作。普通用户通过浏览模块获取作品信息,将感兴趣的作品添加到购物车里暂存起来,在结算时管理收货地址并完成在线支付,支付成功之后可以在订单列表中查看订单的状态以及配送的进度,对于有问题的商品可以发起售后退款流程。普通用户用例图如下图3-1所示。

商家用户在系统内可以进行字画作品管理、分类管理、字画交易管理、订单管理、订单配送和订单售后操作。商家用户通过作品管理模块发布作品、管理信息,利用分类管理将作品按类别归类,使用交易管理模块查看成交情况,通过订单管理模块处理买家的订单,对快递状态进行配送更新,买家申请售后时由管理员审核并处理。商家用户用例图如图3-2所示。

管理员在系统内可执行字画作品管理、分类管理、字画交易、订单管理、订单配送与订单售后操作。管理员对全站字画作品进行统一监管,对分类体系进行调整与维护,查看所有交易记录,对商家与普通用户产生的订单进行全局管理,监督配送流程并处理售后纠纷。管理员用例图如图3-3所示。

系统流程设计

总体业务流程图设计

用户进入系统后根据自身身份选择登录或注册操作。普通用户登录后浏览字画作品,可将作品添加至购物车,在购物车中调整数量或移除作品,确认购买意向后进入结算环节填写收货地址并提交订单。订单生成后用户需完成在线支付,支付成功则订单状态更新为待发货,支付失败可重新尝试。商家用户登录后管理字画作品信息,处理买家订单,确认订单无误后安排配送并更新物流状态。管理员登录后监管全站交易,审核商家提交的作品信息,处理售后纠纷。用户收到商品后可确认收货,若商品存在问题可发起售后退款申请,商家审核申请后进行处理。总体业务流程如图4-3所示。

普通用户字画交易流程设计

普通用户进入字画作品列表页面,可按分类筛选或通过关键词搜索目标作品。用户点击作品卡片进入详情页面查看作品图片、作者信息、价格及库存情况。用户决定购买后点击加入购物车按钮,系统将作品添加至购物车并保留当前浏览状态。用户进入购物车页面可修改购买数量或删除已选作品,确认无误后点击去结算按钮。系统跳转至订单确认页面,用户选择或新增收货地址,核对商品信息与金额后提交订单。订单提交成功跳转至支付页面,用户选择支付方式完成付款操作。普通用户字画交易流程如图4-4所示。

商家用户订单处理流程设计

商家用户登录后进入订单管理页面,系统按订单状态分类展示待处理订单列表。商家点击待发货订单查看订单详情,核对买家收货地址与商品信息。商家确认信息无误后点击发货按钮,系统弹出配送信息填写窗口。商家输入物流单号并选择配送方式后提交,订单状态变更为已发货。若买家发起售后申请,商家在订单管理页面看到待处理售后标识,点击进入售后详情查看买家退款理由与凭证图片。商家根据实际情况选择同意退款或拒绝退款,操作完成后系统更新售后状态并通知买家。商家用户订单处理流程如图4-5所示。

概念设计

E-R图(实体关系图)是一种用来做数据建模的图形化工具,描述实体、属性以及实体之间的关系。以图示的形式来辅助数据库结构的分析与设计,清楚地表明数据间的相互联系,利于后续的数据库开发及管理工作。下面给出系统全局E-R图以及各个实体的属性图[19]

字画作品实体主要包括作品编号、作品名称、作品分类、作品作者等属性。实体属性图如图4-8所示。

普通用户实体主要包括用户姓名、用户手机、审核状态、用户id等属性。实体属性图如图4-9所示。

商家用户实体主要包括商家姓名、商家手机、审核状态、用户id等属性。实体属性图如图4-10所示。

订单实体主要包括订单号、商品标题、订单状态、总价等属性。实体属性图如图4-11所示。

数据库

DROP TABLE IF EXISTS `logistics_delivery`; CREATE TABLE `logistics_delivery` ( `logistics_delivery_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '物流配送ID', `order_number` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '订单号', `product_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '商品名称', `purchase_quantity` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '购买数量', `total_transaction_amount` double(10,2) DEFAULT '0.00' COMMENT '交易总额', `the_date_of_issuance` date DEFAULT NULL COMMENT '发货日期', `delivery_number` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '配送订单', `ordinary_users` int(11) DEFAULT '0' COMMENT '普通用户', `shipping_address` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '收货地址', `delivery_status` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '配送状态', `signing_status` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '签收状态', `recommend` int(11) NOT NULL DEFAULT '0' COMMENT '智能推荐', `contact_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '联系人名字', `merchant_id` int(11) DEFAULT NULL COMMENT '商家id', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', DROP TABLE IF EXISTS `cart`; CREATE TABLE `cart` ( `cart_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '购物车ID', `title` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '标题', `img` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0' COMMENT '图片', `user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '用户ID', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `state` int(1) unsigned NOT NULL DEFAULT '0' COMMENT '状态:使用中,已失效', `price` double(8,2) NOT NULL DEFAULT '0.00' COMMENT '单价', `price_ago` double(8,2) NOT NULL DEFAULT '0.00' COMMENT '原价', `price_count` double(10,2) NOT NULL DEFAULT '0.00' COMMENT '总价', `num` int(8) unsigned NOT NULL DEFAULT '1' COMMENT '数量', `goods_id` mediumint(8) unsigned NOT NULL COMMENT '商品id', `type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '未分类' COMMENT '商品分类', `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '描述', `norms` varchar(64) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '规格', PRIMARY KEY (`cart_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='购物车'; DROP TABLE IF EXISTS `message_inform`; CREATE TABLE `message_inform` ( `message_inform_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '通知ID', `user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '通知人ID', `title` varchar(255) DEFAULT NULL COMMENT '标题', `state` varchar(255) DEFAULT NULL COMMENT '状态', `type` varchar(64) DEFAULT NULL COMMENT '分类', `content` varchar(255) DEFAULT NULL COMMENT '内容', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', DROP TABLE IF EXISTS `address`; CREATE TABLE `address` ( `address_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '收货地址', `name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '姓名', `phone` varchar(13) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '手机', `postcode` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '邮编', `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '地址', `user_id` mediumint(8) unsigned NOT NULL COMMENT '用户ID', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',

代码

<template> <el-main class="bg edit_wrap comtable_e"> <el-form ref="form" :model="form" status-icon label-width="120px" v-if="is_view()"> <el-row class="row_ce"> <el-col :xs="24" :sm="12" :lg="8" class="el_form_item_warp"> <el-form-item label="订单号" prop="order_number"> <el-input :disabled="true" id="order_number" v-model="form['order_number']" placeholder="请输入订单号" ></el-input> </el-form-item> </el-col> <el-col :xs="24" :sm="12" :lg="8" class="el_form_item_warp"> <el-form-item label="商品名称" prop="title"> <el-input :disabled="true" id="title" v-model="form['title']" ></el-input> </el-form-item> </el-col> <!--<el-col :xs="24" :sm="12" :lg="8" class="el_form_item_warp"> <el-form-item label="价格" prop="price"> <el-input :disabled="true" id="price" v-model="form['price']" placeholder="请输入购买数量" ></el-input> </el-form-item> </el-col>--> <!--<el-col :xs="24" :sm="12" :lg="8" class="el_form_item_warp"> <el-form-item label="购买数量" prop="num"> <el-input :disabled="true" id="num" v-model="form['num']" placeholder="请输入购买数量" ></el-input> </el-form-item> </el-col>--> <el-col :xs="24" :sm="12" :lg="8" class="el_form_item_warp"> <el-form-item label="交易总额" prop="price_count"> <el-input-number :disabled="true" id="price_count" v-model.number="form['price_count']" ></el-input-number> </el-form-item> </el-col> <el-col :xs="24" :sm="12" :lg="8" class="el_form_item_warp"> <el-form-item label="卖家" prop="merchant_id"> <el-select v-model="form.merchant_id" placeholder="请选择" :disabled="true"> <el-option :key="-1" label="未选择" :value="0"> </el-option> <el-option v-for="(o,i) in list_user" :key="i" :label="o.nickname" :value="o.user_id"> </el-option> </el-select> </el-form-item> </el-col> <el-col :xs="24" :sm="12" :lg="8" class="el_form_item_warp"> <el-form-item label="买家" prop="user_id"> <el-select v-model="form.user_id" placeholder="请选择" :disabled="true"> <el-option :key="-1" label="未选择" :value="0"> </el-option> <el-option v-for="(o,i) in list_user" :key="i" :label="o.nickname" :value="o.user_id"> </el-option> </el-select> </el-form-item> </el-col> <el-col :xs="24" :sm="12" :lg="8" class="el_form_item_warp"> <el-form-item label="订单状态" prop="state"> <el-select id="state" v-model="form.state" :disabled="true" > <el-option v-for="o in order_state_list" :key="o" :label="o" :value="o"> </el-option> </el-select> </el-form-item> </el-col> <el-col :xs="24" :sm="12" :lg="8" class="el_form_item_warp"> <el-form-item label="售后类型" prop="type"> <el-select id="type" v-model="form['type']" :disabled="true" > <el-option v-for="o in after_state_type_list" :key="o.value" :label="o.label" :value="o.value"> </el-option> </el-select> </el-form-item> </el-col> <el-col :xs="24" :sm="12" :lg="8" class="el_form_item_warp"> <el-form-item label="售后内容" prop="content_desc"> <el-input type="textarea" v-model="form['content_desc']" :disabled="true"></el-input> </el-form-item> </el-col> <el-col :xs="24" :sm="24" :lg="24" class="el_form_item_warp"> <el-form-item label="售后凭证" prop="imgs"> <img style="height:100px;margin-right:10px;width:auto;border-radius: 4px;" v-for="(item,index) in form['imgs']" :src="$fullUrl(item)" :key='index' alt="" /> </el-form-item> </el-col> <el-col :xs="24" :sm="12" :lg="8" class="el_form_item_warp"> <el-form-item label="售后状态" prop="after_state"> <el-select id="after_state" v-model="form['after_state']" :disabled="true" > <el-option v-for="o in list_aftersale_status" :key="o" :label="o" :value="o"> </el-option> </el-select> </el-form-item> </el-col> <el-col v-if="form['after_state']!='未审核'" :xs="24" :sm="12" :lg="8" class="el_form_item_warp"> <el-form-item label="售后回复" prop="after_state_reply"> <el-input type="textarea" v-model="form['after_state_reply']" :disabled="true"></el-input> </el-form-item> </el-col> </el-row> <el-col :xs="24" :sm="12" :lg="8" class="el_form_btn_warp"> <el-form-item v-if="$check_action('/order_after_sale/view','set')"> <el-button type="primary" @click="submit()">提交</el-button> <el-button @click="cancel()">取消</el-button> </el-form-item> <el-form-item v-else> <el-button @click="cancel()">返回</el-button> </el-form-item> </el-col> </el-form> </el-main> </template> <script> import mixin from "@/mixins/page.js"; export default { mixins: [mixin], data() { return { field: "order_after_sale_id", url_add: "~/api/order_after_sale/add?", url_set: "~/api/order_after_sale/set?", url_get_obj: "~/api/order_after_sale/get_obj?", url_upload: "~/api/order_after_sale/upload?", query: { "order_after_sale_id": 0, }, form: { "order_number": '', // 订单号 "title": '', // 商品名称 "num": '', // 购买数量 "price": '', // 单价 "price_count": '', // 交易总额 "merchant_id":'',//卖家 "user_id":'',//买家 "order_after_sale_id": 0, // ID "after_state":"",//售后状态 "after_state_reply":"",//售后回复 "content_desc":"",//售后内容 "imgs":[], "type":"",//售后类型 "state":"",//订单状态 }, disabledObj: { "order_number_isDisabled": false, "title_isDisabled": false, "price_isDisabled": false, "num_isDisabled": false, "price_count_isDisabled": false, "merchant_id_isDisabled": false, "user_id_isDisabled": false, }, list_user: [], after_state_type_list:[ { label: '仅退款', value: '1' }, { label: '退货退款', value: '2' }, { label: '其他', value: '3' } ], order_state_list:['待付款','待发货','待签收','已签收','待退款','售后/退款'], list_aftersale_status:['未审核','未通过','已通过'] } }, methods: { /** * 获取对象之后 * @param {Object} json * @param {Object} func */ get_obj_after(json, func) { if (!this.form["after_state"]) { this.form["after_state"] = '未审核'; } if(!!this.form['imgs']){ this.form["imgs"]=JSON.parse(this.form["imgs"]); } this.form['user_id']=Number(this.form['user_id']) this.form['merchant_id']=Number(this.form['merchant_id']) console.log( this.form) }, /** * 提交前验证事件 * @param {Object} 请求参数 * @return {String} 验证成功返回null, 失败返回错误提示 */ submit_check(param) { let msg = null return msg; }, is_view() { var bl = this.user_group == "管理员"; if (!bl) { bl = this.$check_action('/order_after_sale/table', 'add'); console.log(bl ? "你有表格添加权限视作有添加权限" : "你没有表格添加权限"); } if (!bl) { bl = this.$check_action('/order_after_sale/table', 'set'); console.log(bl ? "你有表格添加权限视作有修改权限" : "你没有表格修改权限"); } if (!bl) { bl = this.$check_action('/order_after_sale/view', 'add'); console.log(bl ? "你有视图添加权限视作有添加权限" : "你没有视图添加权限"); } if (!bl) { bl = this.$check_action('/order_after_sale/view', 'set'); console.log(bl ? "你有视图修改权限视作有修改权限" : "你没有视图修改权限"); } if (!bl) { bl = this.$check_action('/order_after_sale/view', 'get'); console.log(bl ? "你有视图查询权限视作有查询权限" : "你没有视图查询权限"); } console.log(bl ? "具有当前页面的查看权,请注意这不代表你有字段的查看权" : "无权查看当前页,请注意即便有字段查询权限没有页面查询权限也不行"); return bl; }, /** * 获取用户 */ async get_list_user() { var json = await this.$get("~/api/user/get_list?"); if (json.result) { this.list_user = json.result.list; } else if (json.error) { console.error(json.error); } } }, created() { this.get_list_user() }, } </script>

普通用户功能实现

字画交易功能实现

普通用户通过字画交易模块完成作品的浏览与购买流程。前端页面发送请求至CalligraphyAndPaintingInformationController,调用get_list方法获取字画列表数据,该方法从数据库检索作品信息并返回分页结果。用户选择作品后提交订单请求,OrderController中的add方法接收订单信息并写入数据库。字画交易界面如图5-1所示。

图5-1 字画交易界面

5.1.2我的地址管理功能实现

用户管理收货地址时通过地址管理模块完成新增、修改、删除操作。前端提交地址数据至AddressController,add方法接收请求后校验地址信息非空,调用addEntity方法将数据持久化至address表。修改地址时set方法接收查询条件与更新数据,调用service.update完成记录更新。地址管理界面如图5-2所示。

图5-2 我的地址管理界面

5.1.3支付订单功能实现

用户在订单确认页面选择支付方式后调用支付接口。OrderController接收支付请求,根据订单号更新订单状态。系统在update方法中传入查询条件与状态参数,将订单状态字段修改为“待发货”。支付成功后返回提示信息,前端跳转至订单列表页面。支付订单界面如图5-3所示。

图5-3 支付订单界面

订单配送功能实现

用户在订单详情页面点击查看配送信息时系统调用LogisticsDeliveryController的get_list方法。该方法根据订单号查询logistics_delivery表,返回物流单号、配送状态、签收状态、发货日期等信息。前端页面将配送详情展示给用户。订单配送界面如图5-8所示。

图5-8 订单配送界面

管理员功能实现

5.3.1字画作品管理功能实现

管理员通过字画作品管理模块对全站作品进行监管。CalligraphyAndPaintingWorksController的get_list方法返回所有作品列表,管理员可查看作品详情并执行下架操作。set方法接收更新参数,将作品状态字段修改为已下架,系统同时通知对应商家用户。字画作品管理界面如图5-15所示。

图5-15 字画作品管理界面

核心代码实现如下:

@RequestMapping("/get_list")

public Map<String, Object> getList(HttpServletRequest request) {

Map<String, Object> map = this.service.selectToPage(service.readQuery(request), service.readConfig(request));

return success(map);

}

字画交易功能实现

管理员查看全站交易记录时调用CalligraphyAndPaintingInformationController的get_list方法。该方法不附加用户筛选条件,返回所有商家产生的交易数据。管理员可通过交易时间、作品名称等条件检索,对异常交易进行标记处理。字画交易界面如图5-16所示。

图5-16 字画交易界面

核心代码实现如下:

@RequestMapping("/get_list")

public Map<String, Object> getList(HttpServletRequest request) {

Map<String, Object> map = this.service.selectToPage(service.readQuery(request), service.readConfig(request));

return success(map);

}

分类管理功能实现

管理员对作品分类体系进行全局维护时调用GoodsTypeController的add、set、del方法。新增分类时add方法校验分类名称非空后写入数据库,修改分类时set方法根据分类ID更新记录,删除分类时del方法检查该分类下是否存在关联作品,若无关联方可删除。分类管理界面如图5-17所示。

图5-17 分类管理界面

源码获取
私信联系我即可~
大家点赞、收藏、关注、评论啦
精彩专栏推荐订阅:在下方专栏👇🏻

👇🏻 精彩专栏 推荐订阅👇🏻

Java精品项目案例【2000套】https://blog.csdn.net/fykj_2010/category_13187274.html

Python精品项目案例【500套】

uniapp/微信小程序/安卓app【1800套】

✅文末获取源码✅

感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以找我咨询,希望帮助更多的人❤️

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询