一、项目背景与技术选型
在现代化企业管理系统中,地址数据管理是高频且关键的功能模块。本方案采用前后端分离架构,前端基于Vue.js构建动态交互界面,后端使用SpringBoot框架提供RESTful API服务,通过MyBatis-Plus简化数据库操作。该技术栈具有开发效率高、扩展性强、维护成本低等优势,特别适合作为毕业设计或实训项目的技术原型。
1.1 技术栈组成
- 前端框架:Vue 3 + Element Plus(UI组件库)
- 后端框架:SpringBoot 2.7 + MyBatis-Plus
- 数据库:MySQL 8.0
- 数据交换:Excel处理(Apache POI)、JSON格式API
- 构建工具:Maven(后端)、Vite(前端)
1.2 核心功能规划
| 功能模块 | 技术实现要点 | 适用场景 |
|---|---|---|
| 地址CRUD | RESTful API + 通用Mapper | 单条数据增删改查 |
| 分页查询 | PageHelper分页插件 | 大数据量分批次加载 |
| Excel导入 | POI解析Excel文件 | 批量数据初始化 |
| Excel导出 | 动态生成Excel模板 | 数据备份与离线分析 |
二、数据库设计与实现
2.1 表结构设计
CREATE TABLE `sys_address` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',`receiver_name` varchar(50) NOT NULL COMMENT '收件人姓名',`phone` varchar(20) NOT NULL COMMENT '联系电话',`province` varchar(50) NOT NULL COMMENT '省份',`city` varchar(50) NOT NULL COMMENT '城市',`district` varchar(50) NOT NULL COMMENT '区县',`detail_address` varchar(200) NOT NULL COMMENT '详细地址',`is_default` tinyint DEFAULT '0' COMMENT '是否默认地址',`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`),KEY `idx_receiver` (`receiver_name`,`phone`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='地址信息表';
2.2 MyBatis-Plus实体类
@Data@TableName("sys_address")public class Address {@TableId(type = IdType.AUTO)private Long id;private String receiverName;private String phone;private String province;private String city;private String district;private String detailAddress;@TableLogicprivate Integer isDeleted;// 省略getter/setter...}
三、后端API开发实战
3.1 基础CRUD实现
@RestController@RequestMapping("/api/address")public class AddressController {@Autowiredprivate AddressService addressService;@GetMapping("/{id}")public Result<Address> getById(@PathVariable Long id) {return Result.success(addressService.getById(id));}@PostMappingpublic Result<Void> save(@RequestBody Address address) {addressService.saveOrUpdate(address);return Result.success();}@DeleteMapping("/{id}")public Result<Void> delete(@PathVariable Long id) {addressService.removeById(id);return Result.success();}}
3.2 Excel导入导出实现
导入处理逻辑
@PostMapping("/import")public Result<Void> importExcel(@RequestParam("file") MultipartFile file) {try {List<Address> addressList = EasyExcel.read(file.getInputStream()).head(Address.class).sheet().doReadSync();// 数据校验List<String> errorMessages = new ArrayList<>();for (Address address : addressList) {if (StringUtils.isBlank(address.getReceiverName())) {errorMessages.add("第" + (addressList.indexOf(address)+1) + "行:收件人不能为空");}// 其他校验...}if (!errorMessages.isEmpty()) {throw new BusinessException("导入失败:" + String.join(";", errorMessages));}addressService.saveBatch(addressList);return Result.success();} catch (Exception e) {throw new BusinessException("导入异常:" + e.getMessage());}}
导出处理逻辑
@GetMapping("/export")public void exportExcel(HttpServletResponse response) throws IOException {List<Address> addressList = addressService.list();response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");String fileName = URLEncoder.encode("地址列表", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");EasyExcel.write(response.getOutputStream(), Address.class).sheet("地址信息").doWrite(addressList);}
四、前端界面开发指南
4.1 Vue组件结构
src/├── views/│ └── address/│ ├── AddressList.vue # 主列表页面│ ├── AddressForm.vue # 表单对话框│ └── ImportDialog.vue # 导入对话框├── api/│ └── address.js # API接口封装└── utils/└── excel.js # Excel处理工具
4.2 核心代码示例
表格组件配置
<template><el-table :data="tableData" border><el-table-column prop="receiverName" label="收件人" width="120"/><el-table-column prop="phone" label="电话" width="150"/><el-table-column prop="fullAddress" label="完整地址"><template #default="{row}">{{ row.province }}{{ row.city }}{{ row.district }}{{ row.detailAddress }}</template></el-table-column><el-table-column label="操作" width="180"><template #default="{row}"><el-button size="small" @click="handleEdit(row)">编辑</el-button><el-button size="small" type="danger" @click="handleDelete(row.id)">删除</el-button></template></el-table-column></el-table></template>
Excel导入实现
<script setup>import { ref } from 'vue';import { importAddress } from '@/api/address';import { ElMessage } from 'element-plus';const fileRef = ref(null);const handleImport = async () => {const file = fileRef.value.files[0];if (!file) {ElMessage.warning('请选择文件');return;}const formData = new FormData();formData.append('file', file);try {await importAddress(formData);ElMessage.success('导入成功');// 刷新表格数据...} catch (error) {ElMessage.error(error.message || '导入失败');}};</script><template><el-uploadref="fileRef":show-file-list="false":auto-upload="false"accept=".xlsx,.xls"><el-button type="primary">选择文件</el-button><template #tip><div class="el-upload__tip">仅支持Excel文件</div></template></el-upload><el-button @click="handleImport" type="success">开始导入</el-button></template>
五、项目部署与优化建议
5.1 部署方案
- 开发环境:前后端分离部署,前端使用Vite开发服务器,后端使用SpringBoot内嵌Tomcat
- 生产环境:
- 前端:打包生成dist目录,部署至Nginx静态资源服务器
- 后端:打包为JAR文件,使用Java命令启动
- 数据库:建议使用云数据库服务或独立MySQL实例
5.2 性能优化
-
接口优化:
- 对地址查询接口添加缓存(如Redis)
- 实现分页查询避免全量数据加载
-
Excel处理优化:
- 大文件导入采用分片读取
- 导出时添加进度提示
-
前端优化:
- 表格数据虚拟滚动
- 组件按需加载
六、扩展功能建议
- 地址智能解析:集成第三方地址解析API,自动拆分省市区
- 地图可视化:结合Web地图API展示地址分布
- 数据校验增强:电话号码格式校验、敏感词过滤
- 操作日志:记录地址变更历史
本方案完整实现了地址管理系统的核心功能,通过模块化设计和清晰的代码结构,既适合作为毕业设计项目,也可直接应用于企业级系统开发。开发者可根据实际需求进一步扩展功能模块,如添加权限控制、多语言支持等高级特性。