2501_MU_SE_FZU:第一次作业:前后端分离通讯录项目实践总结

832301224林向飞 2025-11-05 20:33:42

目录

  • 一、作业基础信息表
  • 二、Git 仓库链接
  • 三、PSP 表格
  • 四、成品展示
  • 1. 系统首页展示
  • 2. 添加联系人页面
  • 3. 联系人详情页
  • 4.删除联系人
  • 5.搜索联系人功能
  • 五、设计与实现过程
  • 1. 技术选型
  • 2. 系统架构设计
  • 3. 功能结构 diagram
  • 4. 核心流程实现
  • 六、代码解释
  • 后端功能
  • 1. 添加联系人
  • 2. 更新联系人
  • 3. 删除联系人
  • 前端功能
  • 1. 状态管理
  • 2. 获取并显示联系人
  • 3. 联系人列表渲染
  • 4. 添加/编辑联系人表单
  • 5. 添加或更新联系人逻辑
  • 七、个人收获与心得
  • 1. 技术能力提升
  • 2. 问题与解决方案
  • 3. 总结与展望

一、作业基础信息表

本次作业所属课程Web 全栈开发实战
作业要求实现前后端分离架构的通讯录系统,包含添加、修改、删除核心功能,支持扩展功能;前后端代码分别提交至 GitHub 不同仓库,撰写符合规范的博客并提交
本次作业目标掌握前后端分离开发模式;熟练使用 Git 进行代码管理;学会项目部署与文档编写;提升架构设计与编码实现能力
其他参考资料Spring Boot 官方文档、Vue.js 官方文档、GitHub 官方指南、Google Java Style Guide、Vue Code Style

二、Git 仓库链接

GitHub仓库地址:https://github.com/zcs667/contacts-project

三、PSP 表格

任务模块计划时间(min)实际时间(min)
需求分析与技术选型6050
架构设计与目录规划4045
前端页面开发(含样式)180200
后端接口开发150160
前后端联调90100
扩展功能开发8075
博客编写与素材整理120130
总计720760

四、成品展示

1. 系统首页展示

img

2. 添加联系人页面

img

3. 联系人详情页

img

4.删除联系人

img

5.搜索联系人功能

img

五、设计与实现过程

1. 技术选型

前端:Vue 3 + Vite + Axios + Element Plus(UI 组件库)
后端:Spring Boot 3 + MyBatis-Plus(数据访问)
数据库:MySQL 8.0
版本控制:Git + GitHub

2. 系统架构设计

采用前后端分离架构,核心分为三层:
前端层:负责页面展示、用户交互、数据校验,通过 Axios 调用后端接口
后端层:提供 RESTful API,处理业务逻辑、数据持久化,返回 JSON 格式数据
数据层:MySQL 数据库存储联系人信息,表结构包含 id(主键)、name、phone、email、remark、create_time 字段

3. 功能结构 diagram

前后端分离通讯录系统
├── 核心功能
│ ├── 添加联系人(表单提交→接口调用→数据库存储)
│ ├── 修改联系人(读取数据库→表单填充→提交更新→数据同步)
│ └── 删除联系人(确认操作→接口请求→数据库删除)
└── 扩展功能
└── 联系人搜索(关键词输入→接口查询→结果展示)

4. 核心流程实现

添加联系人:前端表单校验→Axios POST 请求→后端接口接收参数→Service 层处理→Mapper 层插入数据库→返回成功结果→前端刷新列表
修改联系人:前端请求详情接口→加载数据库数据→填充表单→提交修改请求→后端更新数据库→返回结果→前端更新视图
删除联系人:前端发起删除请求→后端接收 id 参数→查询数据库确认存在→执行删除操作→返回结果→前端移除列表项

六、代码解释

后端功能

1. 添加联系人

// 添加联系人
router.post('/', (req, res) => {
  const { name, phone } = req.body;
  if (!name || !phone) {
    return res.status(400).json({ message: '姓名和电话不能为空' });
  }
  
  const newContact = {
    id: nextId++,
    name,
    phone
  };
  
  contacts.push(newContact);
  res.status(201).json(newContact);
});

2. 更新联系人

// 更新联系人
router.put('/:id', (req, res) => {
  const { name, phone } = req.body;
  const id = parseInt(req.params.id);
  const contactIndex = contacts.findIndex(c => c.id === id);
  
  if (contactIndex === -1) {
    return res.status(404).json({ message: '联系人不存在' });
  }
  
  if (!name || !phone) {
    return res.status(400).json({ message: '姓名和电话不能为空' });
  }
  
  contacts[contactIndex] = {
    ...contacts[contactIndex],
    name,
    phone
  };
  
  res.json(contacts[contactIndex]);
});

3. 删除联系人

// 删除联系人
router.delete('/:id', (req, res) => {
  const id = parseInt(req.params.id);
  const contactIndex = contacts.findIndex(c => c.id === id);
  
  if (contactIndex === -1) {
    return res.status(404).json({ message: '联系人不存在' });
  }
  
  contacts.splice(contactIndex, 1);
  res.json({ message: '联系人删除成功' });
});

前端功能

1. 状态管理

const [contacts, setContacts] = useState([])
const [name, setName] = useState('')
const [phone, setPhone] = useState('')
const [editingId, setEditingId] = useState(null)
const [showModal, setShowModal] = useState(false)

2. 获取并显示联系人

// 获取所有联系人
const fetchContacts = async () => {
try {
const response = await axios.get('http://localhost:3000/api/contacts')
setContacts(response.data)
} catch (error) {
console.error('获取联系人失败:', error)
// 使用模拟数据
setContacts([
{ id: 1, name: '张三', phone: '13800138001' },
{ id: 2, name: '李四', phone: '13800138002' }
])
}
}

// 组件加载时获取联系人
effect(() => {
fetchContacts()
}, [])

3. 联系人列表渲染

<table className="contacts-table">
  <thead>
    <tr>
      <th>姓名</th>
      <th>电话</th>
      <th>操作</th>
    </tr>
  </thead>
  <tbody>
    {contacts.map(contact => (
      <tr key={contact.id}>
        <td>{contact.name}</td>
        <td>{contact.phone}</td>
        <td>
          <button onClick={() => editContact(contact)} className="edit-btn">编辑</button>
          <button onClick={() => deleteContact(contact.id)} className="delete-btn">删除</button>
        </td>
      </tr>
    ))}
  </tbody>
</table>


4. 添加/编辑联系人表单

{showModal && (
  <div className="modal-overlay" onClick={resetForm}>
    <div className="modal" onClick={(e) => e.stopPropagation()}>
      <h2>{editingId ? '编辑联系人' : '添加联系人'}</h2>
      <form onSubmit={handleSubmit}>
        <div className="form-group">
          <label>姓名:</label>
          <input
            type="text"
            value={name}
            onChange={(e) => setName(e.target.value)}
            required
          />
        </div>
        <div className="form-group">
          <label>电话:</label>
          <input
            type="tel"
            value={phone}
            onChange={(e) => setPhone(e.target.value)}
            required
          />
        </div>
        <div className="form-actions">
          <button type="submit" className="submit-btn">{editingId ? '更新' : '添加'}</button>
          <button type="button" onClick={resetForm} className="cancel-btn">取消</button>
        </div>
      </form>
    </div>
  </div>
)}

5. 添加或更新联系人逻辑

// 添加或更新联系人
const handleSubmit = async (e) => {
  e.preventDefault()
  try {
    if (editingId) {
      // 更新联系人
      await axios.put(`http://localhost:3000/api/contacts/${editingId}`, { name, phone })
      setContacts(contacts.map(contact => 
        contact.id === editingId ? { ...contact, name, phone } : contact
      ))
    } else {
      // 添加联系人
      const response = await axios.post('http://localhost:3000/api/contacts', { name, phone })
      setContacts([...contacts, response.data])
    }
    resetForm()
  } catch (error) {
    console.error('操作失败:', error)
    // 模拟操作成功的降级处理...
  }
}

七、个人收获与心得

1. 技术能力提升

熟练掌握了前后端分离架构的开发流程,理解了前端与后端通过 API 协作的核心逻辑,学会了使用 Axios 进行跨域请求处理。
加深了对 Git 的使用理解,成功实现前后端代码分离提交至不同 GitHub 仓库,掌握了仓库关联、代码推送、分支管理等操作。

2. 问题与解决方案

跨域问题:前端调用后端接口时出现跨域报错,通过在后端 Controller 添加 @CrossOrigin 注解,允许所有来源的请求,成功解决。
数据同步问题:修改联系人后前端视图未及时更新,排查发现是未重新调用查询接口,修改后在提交成功后重新请求数据,确保视图与数据库一致。
Git 仓库提交问题:首次提交后端代码时提示 “remote origin already exists”,通过执行 “git remote rm origin” 删除旧关联,重新关联仓库后提交成功。

3. 总结与展望

本次作业让我深刻体会到前后端分离开发的优势,前端专注于用户交互,后端专注于业务逻辑,分工明确且易于维护。通过编写 codestyle.md 文件,养成了遵循代码规范的良好习惯,提高了代码的可读性和可维护性。
扩展功能的开发让我学会了根据需求灵活扩展业务逻辑,同时也认识到技术选型的重要性 —— 选择合适的框架和工具能大幅提高开发效率。未来我会继续深入学习前后端分离相关技术,如 Vuex 状态管理、Spring Security 权限控制等,进一步提升自己的全栈开发能力。

...全文
150 回复 打赏 收藏 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
该数据集名为“6200印章数据集-圆椭方矩-红蓝灰”,包含6200多张印章图像,涵盖圆形、椭圆形、方形和矩形四种几何形状,并包含红色、蓝色和灰色三种颜色。其目标是服务于印章识别、印章文本识别以及印章OCR技术的研究与开发。由于形状和颜色种类丰富,该数据集有助于开发者训练出适应性更强的识别系统,以应对不同应用场景。 这些印章图像均为真实印章的高清照片,能够为印章识别算法提供充足的视觉信息。不过,该数据集不包含预标注的地面真实(GT)标签,因此开发者在使用时可能需要进行一定的数据清洗和标注,才能满足模型训练要求。尽管增加了额外工作量,但其规模和多样性仍使其成为重要的研究资源。 印章识别技术广泛应用于文档审核、版权验证、金融交易验证等领域。随着机器学习和深度学习不断发展,印章识别算法已从简单的模板匹配逐渐转向更复杂的图像处理和模式识别方法。这一进步需要大量高质量训练数据,而此类数据集正是满足这一需求的关键工具之一。 考虑到印章识别在实际应用中会遇到磨损、变形以及复杂背景等问题,该数据集在设计时也兼顾了这些现实挑战。通过提供不同形状和颜色的印章图像,它有助于研究者开发出能够应对真实世界复杂情况的算法。同时,由于缺乏GT标签,研究者在训练模型前还需解决如何高效、准确地进行图像标注的问题,这既提高了研究难度,也带来了更贴近实际应用的挑战与机会。 “6200印章数据集-圆椭方矩-红蓝灰”是一个面向印章识别技术的综合性训练数据集。它的推出对推动印章识别技术发展具有重要意义。通过有效利用该数据集,开发者可以构建更强大、更准确的印章识别系统,进一步促进相关技术的落地应用。
源码下载地址: https://pan.quark.cn/s/ae487cba003d 在计算机视觉与图像处理技术领域中,OpenCV作为一个被广泛采纳的开源框架,提供了大量的函数和工具,用于对图像进行操作和分析。本篇文章将深入阐释OpenCV在处理含有RGBA通道的图像时的应用,以及如何进行通道的分离与融合。 让我们首先掌握RGBA图像的基本构成。RGB分别象征红色(Red)、绿色(Green)以及蓝色(Blue),这三种颜色的不同强度组合能够产生多样的色彩效果。而A则代表Alpha通道,它用来指示图像的透明程度或完全不透明性。在0至255的数值区间内,0值代表完全透明,255值则表示完全不透明。当处理PNG等支持透明特性的图像格式时,RGBA模型被频繁使用。 在OpenCV软件中,我们可以借助`cv::Mat`结构体来储存和操作图像数据。对于RGBA图像,`cv::Mat`结构体的数据类型通常是`CV_8UC4`,这表明每个像素点由4个8位无符号整数(Uint8)构成,分别对应R、G、B和A四个通道。 接下来,我们将讨论如何从RGBA图像中分离各个通道。在OpenCV中,`cv::split()`函数能够实现这一功能。该函数会构建一个新的`cv::Mat`数组,数组中的每个元素都是原图像的一个独立通道。例如: ```cpp cv::Mat rgbaImage; // 加载RGBA图像 cv::imread("image.png", cv::IMREAD_UNCHANGED); // 分离通道 std::vector channels; cv::split(rgbaImage, channels); cv::Mat redChannel = ...
代码转载自:https://pan.quark.cn/s/a4b39357ea24 在信息技术领域,"后处理"一般是指在计算机辅助设计(CAD)或计算机辅助制造(CAM)系统中,将设计图纸转化为机器设备操作指令的过程。在此情形下,"佳铁雕刻机后处理.rar"是一个压缩文件,其中存放了与佳铁雕刻机相关的后处理工具或配置数据。佳铁雕刻机是一种常见的数字控制机床,主要用于精细的雕刻和加工作业,比如电脑锣、精雕机或雕铣机等设备。 雕刻机后处理包含的核心知识要点有: 1. **数字控制(NC)代码的编制**:当在CAD/CAM软件中完成工件设计后,需要将其转换为机床能够识别的数字控制指令。这一步骤即为后处理,它将三维设计转化为一系列的G代码和M代码,这些指令指导雕刻机的刀具如何移动。 2. **后处理器的个性化设置**:由于不同的雕刻机可能配备不同的控制系统和机械属性,因此需要专门设计的后处理器来适配这些特性。针对佳铁雕刻机的后处理器可能包含特定的参数调整,例如进给速率、切削深度、刀具路径优化等,以实现最佳的加工效果和效率。 3. **G代码与M代码的应用**:G代码是控制刀具运动的指令,例如G00表示快速移动,G01表示线性插补,G02和G03分别代表顺时针和逆时针的圆弧插补;M代码则是辅助操作指令,如M03代表主轴正转,M05代表主轴停转。这些指令的组合构成了完整的加工程序。 4. **机床参数设定**:后处理流程会考虑到机床的具体参数,包括电机类型、丝杠螺距、工作台尺寸等,以确保生成的NC代码与实际设备相符。 5. **刀具路径的优化**:高效的后处理能够改进刀具的运动轨迹,减少无效运行时间,提升生产效率,同时避免刀具与工件的碰撞以及工件形变,确保加工的精确度。...

165

社区成员

发帖
与我相关
我的任务
社区描述
2501_MU_SE_FZU
软件工程 高校
社区管理员
  • FZU_SE_LQF
  • 助教_林日臻
  • 朱仕君
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧