当前位置: 首页 > news >正文

Springboot3+vue3实现系统公告功能

创建系统公告表

CREATE TABLE `notice` (`id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',`title` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '公告标题',`content` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '公告内容',`time` datetime DEFAULT NULL COMMENT '发布时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统公告表';

Notice 管理页面 和 相关接口

页面 Notice.vue

<template><div><div class="card" style="margin-bottom: 5px"><el-input clearable @clear="load" style="width: 260px;margin-right: 5px" v-model="data.title" placeholder="请输入标题查询" :prefix-icon="Search"></el-input><el-button type="primary" @click="load">查 询</el-button><el-button @click="reset">重 置</el-button></div><div class="card" style="margin-bottom: 5px"><el-button type="primary" @click="handleAdd">新 增</el-button></div><div class="card" style="margin-bottom: 5px"><el-table :data="data.tableData" style="width: 100%" :header-cell-style="{color:'#333',backgroundColor:'#eaf4ff'}"><el-table-column prop="title" label="公告标题" /><el-table-column prop="content" label="公告内容" /><el-table-column prop="time" label="发布时间" /><el-table-column label="操作" width="100"><template #default="scope"><el-button type="primary" icon="Edit" circle @click="handleEdit(scope.row)"></el-button><el-button type="danger" icon="Delete" circle @click="del(scope.row.id)"></el-button></template></el-table-column></el-table></div><el-dialog title="公告信息"  v-model="data.formVisible" width="30%" destroy-on-close><el-form ref="formRef":model="data.form" :rules="data.rules" label-width="80px" style="padding: 20px 30px 10px 0"><el-form-item prop="title" label="公告标题"><el-input v-model="data.form.title" autocomplete="off" placeholder="请输入公告标题"/></el-form-item><el-form-item prop="content" label="公告内容"><el-input type="textarea" :rows="3" v-model="data.form.content" autocomplete="off" placeholder="请输入公告内容"/></el-form-item></el-form><template #footer><div class="dialog-footer"><el-button @click="data.formVisible = false">取 消</el-button><el-button type="primary" @click="save">保 存</el-button></div></template></el-dialog></div>
</template><script setup>
import {Search} from "@element-plus/icons-vue";
import {reactive, ref} from "vue";
import request from "@/utils/request.js";
import {ElMessage, ElMessageBox} from "element-plus";const formRef = ref()const data = reactive({user: JSON.parse(localStorage.getItem('code_user') || '{}'),title: null,pageNum:1,pageSize:5,total:0,tableData:[],form:{},formVisible:false,rules:{title:[{required:true,message:'请填写公告标题',trigger:'blur'}],content:[{required:true,message:'请填写公告内容',trigger:'blur'}],}
})const load = () => {request.get('/notice/selectPage',{params:{pageNum:data.pageNum,pageSize:data.pageSize,title:data.title}}).then(res => {if(res.code === '200'){data.tableData =res.data?.list//? 防止为空data.total = res.data?.total}else {ElMessage.error(res.msg)}})
}
load()const handleAdd = () => {data.form = {}data.formVisible = true
}const handleEdit = (row) => {data.form = JSON.parse(JSON.stringify(row))data.formVisible = true
}const add = () => {request.post('/notice/add',data.form).then(res =>{if (res.code === '200'){ElMessage.success('新增成功')data.formVisible = falseload()}else {ElMessage.error(res.msg)}})
}const update = () => {request.put('notice/update',data.form).then(res => {if (res.code === '200'){ElMessage.success('更新成功')data.formVisible = falseload()}else {ElMessage.error(res.msg)}})
}const save = () => {formRef.value.validate(valid => {if(valid){data.form.id ? update() : add()}})
}const del = (id) => {ElMessageBox.confirm('删除后无法恢复,您确认删除吗?','删除确认',{type:'warning'}).then(res => {request.delete('/notice/delete/'+ id).then(res => {if (res.code === '200') {ElMessage.success('删除成功')load()} else {ElMessage.error(res.msg)}})}).catch(err => {})
}
const reset = () => {data.title = nullload()
}
</script>

相关接口

Notice.java

package com.example.entity;/*** 系统公告信息*/
public class Notice {private int id;private String title;private String content;private String time;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public String getTime() {return time;}public void setTime(String time) {this.time = time;}
}

NoticeController

package com.example.controller;import com.example.common.Result;
import com.example.entity.Notice;
import com.example.service.NoticeService;
import com.github.pagehelper.PageInfo;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/notice")
public class NoticeController {@ResourceNoticeService noticeService;@PostMapping("/add")public Result add(@RequestBody Notice notice) {//@RequestBody 接受前端传来的 json 参数noticeService.add(notice);return Result.success();}@PutMapping("/update")public Result update(@RequestBody Notice notice) {noticeService.update(notice);return Result.success();}@DeleteMapping("/delete/{id}")public Result delete(@PathVariable Integer id) {//@PathVariable 接受前端传来的路径参数noticeService.deleteById(id);return Result.success();}@GetMapping("/selectAll") //完整的请求路径: http:/ip:port/notice/selectAllpublic Result selectAll() {List<Notice> noticeList = noticeService.selectAll();return Result.success(noticeList);}/*** 分页查询* pageNum:当前的页码* pageSize:每页的个数*/@GetMapping("/selectPage")public Result selectPage(@RequestParam(defaultValue = "1") Integer pageNum,@RequestParam(defaultValue = "10") Integer pageSize,Notice notice) {PageInfo<Notice> pageInfo = noticeService.selectPage(pageNum,pageSize,notice);return Result.success(pageInfo);//返回的是分页的对象}
}

NoticeService

package com.example.service;import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.example.entity.Account;
import com.example.entity.Notice;
import com.example.exception.CustomerException;
import com.example.mapper.NoticeMapper;
import com.example.utils.TokenUtils;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class NoticeService {@ResourceNoticeMapper noticeMapper;public void add(Notice notice) {notice.setTime(DateUtil.now());noticeMapper.insert(notice);}public void update(Notice notice) {noticeMapper.updateById(notice);}public void deleteById(Integer id) {noticeMapper.deleteById(id);}public List<Notice> selectAll(){return noticeMapper.selectAll(null);}public PageInfo<Notice> selectPage(Integer pageNum, Integer pageSize,Notice notice) {//开启分页查询PageHelper.startPage(pageNum, pageSize);List<Notice> list = noticeMapper.selectAll(notice);return PageInfo.of(list);}}

NoticeMapper

package com.example.mapper;import com.example.entity.Notice;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Select;import java.util.List;public interface NoticeMapper {List<Notice> selectAll(Notice notice);void insert(Notice notice);void updateById(Notice notice);@Delete("delete  from `notice` where id = #{id}")void deleteById(Integer id);}

NoticeMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.NoticeMapper"><select id="selectAll" resultType="com.example.entity.Notice">select * from `notice`<where><if test="title != null">and title like concat('%', #{title}, '%')</if> <!-- 相当于 like '%1%'--></where>order by id desc</select><insert id="insert">insert into `notice` (title,content,time)values(#{title},#{content},#{time})</insert><update id="updateById">update `notice` set title = #{title},content = #{content},time = #{time}where id = #{id}</update>
</mapper>

公告首页渲染

Home.vue

<template><div><div class="card">你好,同学</div><div class="card" style="margin-top: 10px;"><div style="font-size: 16px;margin-bottom: 20px">系统公告</div><el-timeline><el-timeline-item :timestamp="item.time" placement="top" v-for="item in data.noticeData"><el-card><h4>{{item.title}}</h4><p>{{item.content}}</p></el-card></el-timeline-item></el-timeline></div></div>
</template>
<script setup>import {reactive} from "vue";
import {ElMessage} from "element-plus";
import request from "@/utils/request.js";const data = reactive({user: JSON.parse(localStorage.getItem('code_user') || '{}'),noticeData:[]
})const loadNotice = () => {request.get('notice/selectAll').then(res => {if (res.code === '200'){data.noticeData = res.dataif (data.noticeData.length > 3){data.noticeData = data.noticeData.slice(0,3)}}else {ElMessage.error(res.msg)}})
}
loadNotice()
</script>
http://www.jsqmd.com/news/412501/

相关文章:

  • Python长时序植被遥感动态分析、物候提取、时空变异归因及RSEI生态评估实战
  • 遗传评估的基本原则
  • DML(完成表内数据的增删改)
  • 贷款逾期找哪家债务协商机构最可靠?专业债务协商如何帮你走出信用卡逾期困境 - 代码非世界
  • 解决matlab打开批量脚本文件问题
  • 一键开关机电路工作原理示例
  • 信用卡逾期想做协商分期,哪家债务处理服务机构更靠谱?选对专业服务真的少走太多弯路 - 代码非世界
  • 开发日志8
  • Python serialize list to json file and deserialize from json file to data list
  • ITIL 5 问世!从服务管理到产品治理,数字转型迎来体系化升级
  • 全栈可观测性白皮书——实施、收益与投资回报率
  • 贷款信用卡逾期协商哪家靠谱?最佳推荐,负债人亲历的上岸之路 - 代码非世界
  • 《解锁!提示工程架构师带你挖掘Agentic AI在智能制造潜力》
  • 见证数智力量,甄知科技再获客户感谢信
  • 基于Pulsar的实时消息处理系统设计
  • 2026最新月子中心/月子会所/母婴护理推荐:全护士服务+现做月子餐,这家实力凸显 - 十大品牌榜
  • 备课党狂喜!PicDoc 拯救高校教师:告别改图套模板,10分钟搞定一堂专业课的PPT课件
  • docker基本概念
  • 2026贵阳月子中心TOP5评测!专业护理+特色服务权威榜单发布 - 十大品牌榜
  • 自媒体起号/陪娃神器|PicDoc知识卡片实操攻略(附万能公式)
  • 信用卡逾期债务规划,靠谱口碑佳的协商机构选择指南,债务协商公司哪家比较靠谱,口碑较佳? - 代码非世界
  • 提示工程架构师实战:AI提示系统伦理审查的跨文化挑战
  • 2026贵阳月子会所TOP5评测!专属定制权威榜单发布 - 十大品牌榜
  • 2026最新包包维修推荐!广州优质包包维修服务权威榜单发布,专业修复助力奢品重焕新生 - 十大品牌榜
  • 2026贵阳母婴护理服务商TOP5评测!权威榜单发布 - 十大品牌榜
  • pikachu靶场——Cross-Site Scripting(Kali系统)
  • 2026信用卡逾期协商机构哪家靠谱?负债人亲测:这家专业机构! - 代码非世界
  • 电脑C盘爆满原因以及解决方案
  • 2026最新包包修复/旧包改造/包包护理/包包改款/包包维修推荐:匠心智造,奢品焕新之选 - 十大品牌榜
  • 2026最新旧包改造服务推荐!广州地区优质旧包改造机构权威榜单发布,专业工艺助力奢品重焕新生 - 十大品牌榜