BLOG - 个人博文系统开发总结 一:概览

BLOG 是学习 JavaWeb 开发4个月以来的总结实践项目,使用了SSM(Spring、SpringMVC、MyBatis)框架,MVC 三层结构,Shiro 身份,权限管理,Lucene 全文检索引擎工具的个人博文系统。

GitHub地址:DuanJiaNing/BlogSystem

1. 开发环境

IDE:IntelliJ IDEA 2017.3 x64、Postman、navicat、Google Chrome
jdk版本:jdk1.8.0_45
MySQL版本:5.7.16-log
服务器:apache-tomcat-8.5.24

2. 项目结构

参考博文:手把手教你整合最优雅SSM框架:SpringMVC + Spring + MyBatis

项目结构
代码包结构

项目使用 SSM 框架,spring 的配置文件、mybatis 的映射文件、国际化资源、数据库文件以及项目的配置文件放置于 resources 目录中。

代码放置于 java 目录中,包分层包含 JavaWeb 项目基础包:entity、dao、dto、service、web,此外还有 util 工具包,枚举类包,异常类包、shiro 的 realm所在包,manager(类似于util包,但承当了比util更具针对性,与web.api耦合更紧密的一些功能)包。

2.1 service

业务层(service)根据用例参与者来进行划分,分为 audience(读者)、blogger(博主)、通用的 common 以及他们的实现(impl)。

2.2 web

web 层分为 api 和 blog 两层,api 层主要为 url 接口,每一个 url 请求都返回 json 数据,用于前端 javaScript 访问,不涉及页面跳转控制。blog 对应一个具体的网站应用,即BLOGBLOG使用了 api 包中提供的接口,同时依赖于其他的包。

2.3 dao

dao 层定义了 MyBatis 的数据库操控接口,在 resources/mapper 目录中存放了其对应的映射文件。

2.4 exception

exception 包中定义了所有的项目异常(错误信息),这些错误都是 RuntimeException,一些检查异常,如IOException也被转化为运行时异常,这样做使这些异常在繁杂的方法调用栈中可以不被吞噬,能够以简洁的方式抛到最上层,即 web 包中的类,由控制层(web层)决定如何处理这些异常,如对于 web.api 中抛出的错误信息,将会以 json 的方式将错误信息对应的代码以及错误的描述信息返回给API使用者。
参考了聚合API的设计。

3. 开发流程

项目开发流程参考javaee项目开发流程,开发过程将一些过程省略(毕竟这是一个人的项目)。

将项目的开发分为两大部分:后端API接口开发和网站开发。

3.1 后端 API 接口开发(web.api)

API开发的最终代码入口为 com.duan.blogos.web.api 包中的类,每一个类对应于一类数据的操控,不涉及页面跳转控制。api 的调用通过 url 的方式,url 的设计遵循 RESTful 风格。
参照:RESTful API 设计指南

这部分的开发占据了大量时间,在最终编写 api 包中类的代码前需完成数据库表的设计,dao、entity、service 以及其他辅助类的编写以及测试,后续的网站开发也依赖于其中一部分类。

例如:com.duan.blogos.web.api.BloggerLinkController#add 方法
其对应的url:/blogger/{bloggerId}/link,bloggerId指博主id
请求方式:POST
返回数据类型:JSON
请求参数:iconIdtitleurlbewrite
代码为:

对于 api 包中的每一个接口方法都有对应的文档说明。包含详尽的调用说明、返回参数说明以及错误代码说明。

详尽API文档见 BlogSystem-wiki

1.2 网站开发 (web.blog)

网页开发的最终代码放置于 com.duan.blogos.web.blog 包中,这些类(或类中的方法)直接与前端页面对应,相互依赖,控制跳转和数据传递。

网站截图

3. 用例图

3.1 读者用例

3.2 博主用例



—END—

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
一个简单的前后端分离的个人博客系统可以使用Vue.js作为前端框架,Express作为后端框架,MongoDB作为数据库。下面是一个示例的项目结构和代码: 项目结构: - backend/ - app.js - routes/ - posts.js - models/ - Post.js - frontend/ - src/ - components/ - Home.vue - Post.vue - NewPost.vue - views/ - Home.vue - Post.vue - NewPost.vue - router.js - main.js - public/ - index.html 后端代码(backend/app.js): ```javascript const express = require('express'); const bodyParser = require('body-parser'); const cors = require('cors'); const app = express(); const port = 3000; // 使用中间件 app.use(cors()); app.use(bodyParser.json()); // 导入路由模块 const postsRouter = require('./routes/posts'); // 注册路由 app.use('/api/posts', postsRouter); app.listen(port, () => { console.log(`Server started on port ${port}`); }); ``` 后端路由代码(backend/routes/posts.js): ```javascript const express = require('express'); const router = express.Router(); const Post = require('../models/Post'); // 获取所有博文 router.get('/', async (req, res) => { try { const posts = await Post.find(); res.json(posts); } catch (err) { res.status(500).json({ message: err.message }); } }); // 创建新博文 router.post('/', async (req, res) => { const post = new Post({ title: req.body.title, content: req.body.content }); try { const newPost = await post.save(); res.status(201).json(newPost); } catch (err) { res.status(400).json({ message: err.message }); } }); module.exports = router; ``` 后端数据模型代码(backend/models/Post.js): ```javascript const mongoose = require('mongoose'); const postSchema = new mongoose.Schema({ title: { type: String, required: true }, content: { type: String, required: true }, createdAt: { type: Date, default: Date.now } }); module.exports = mongoose.model('Post', postSchema); ``` 前端代码(frontend/src/main.js): ```javascript import Vue from 'vue'; import App from './App.vue'; import router from './router'; Vue.config.productionTip = false; new Vue({ router, render: h => h(App) }).$mount('#app'); ``` 前端路由代码(frontend/src/router.js): ```javascript import Vue from 'vue'; import VueRouter from 'vue-router'; import Home from './views/Home.vue'; import Post from './views/Post.vue'; import NewPost from './views/NewPost.vue'; Vue.use(VueRouter); const routes = [ { path: '/', component: Home }, { path: '/post/:id', component: Post }, { path: '/new-post', component: NewPost } ]; const router = new VueRouter({ mode: 'history', routes }); export default router; ``` 前端视图组件代码(frontend/src/views/Home.vue): ```html <template> <div> <h1>博客系统</h1> <ul> <li v-for="post in posts" :key="post._id"> <router-link :to="'/post/' + post._id">{{ post.title }}</router-link> </li> </ul> </div> </template> <script> export default { data() { return { posts: [] } }, mounted() { this.fetchPosts(); }, methods: { fetchPosts() { fetch('http://localhost:3000/api/posts') .then(response => response.json()) .then(data => { this.posts = data; }); } } } </script> ``` 前端视图组件代码(frontend/src/views/Post.vue): ```html <template> <div> <h2>{{ post.title }}</h2> <p>{{ post.content }}</p> </div> </template> <script> export default { data() { return { post: {} } }, mounted() { this.fetchPost(); }, methods: { fetchPost() { const postId = this.$route.params.id; fetch(`http://localhost:3000/api/posts/${postId}`) .then(response => response.json()) .then(data => { this.post = data; }); } } } </script> ``` 前端视图组件代码(frontend/src/views/NewPost.vue): ```html <template> <div> <h2>创建新博文</h2> <form @submit.prevent="createPost"> <div> <label for="title">标题</label> <input type="text" id="title" v-model="title" required> </div> <div> <label for="content">内容</label> <textarea id="content" v-model="content" required></textarea> </div> <button type="submit">创建</button> </form> </div> </template> <script> export default { data() { return { title: '', content: '' } }, methods: { createPost() { fetch('http://localhost:3000/api/posts', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ title: this.title, content: this.content }) }) .then(response => response.json()) .then(data => { // 创建成功后跳转到博文详情页 this.$router.push('/post/' + data._id); }); } } } </script> ``` 这是一个简单的前后端分离的个人博客系统示例。前端使用Vue.js进行页面渲染和路由管理,通过axios库与后端API进行交互。后端使用Express框架处理HTTP请求,并使用Mongoose库与MongoDB进行数据交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值