• 月木学途开发 4.公告模块


    概述

    效果图

    数据库设计

    1. DROP TABLE IF EXISTS `announcement`;
    2. CREATE TABLE `announcement` (
    3.   `announcementId` int(11) NOT NULL AUTO_INCREMENT,
    4.   `announcementTitle` varchar(255) DEFAULT NULL,
    5.   `announcementTime` varchar(255) DEFAULT NULL,
    6.   `announcementContent` longtext,
    7.   PRIMARY KEY (`announcementId`)
    8. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;

    实体类设计

    1. /**
    2.  * 公告
    3.  */
    4. @Data
    5. public class Announcement implements Serializable {
    6.     @TableId
    7.     private Integer announcementId;
    8.     private String announcementTitle;//标题
    9.     private String announcementTime;//时间
    10.     private String announcementContent;//内容
    11. }

    Mapper层开发

    1. public interface AnnouncementMapper extends BaseMapper<Announcement> {
    2. }

    Service层开发

    AnnouncementService
    1. package jkw.service;
    2. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    3. import jkw.pojo.Announcement;
    4. import java.util.List;
    5. public interface AnnouncementService {
    6.     void add(Announcement announcement);
    7.     void update(Announcement announcement);
    8.     void delete(Integer id);
    9.     Announcement findById(Integer id);
    10.     List findAll();
    11.     Page search(String search, int page, int size);
    12. }

    AnnouncementServiceImpl
    1. package jkw.service.impl;
    2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    3. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    4. import jkw.mapper.AnnouncementMapper;
    5. import jkw.pojo.Announcement;
    6. import jkw.service.AnnouncementService;
    7. import org.springframework.beans.factory.annotation.Autowired;
    8. import org.springframework.stereotype.Service;
    9. import org.springframework.transaction.annotation.Transactional;
    10. import java.util.List;
    11. @Service
    12. @Transactional
    13. public class AnnouncementServiceImpl implements AnnouncementService {
    14.     @Autowired
    15.     private AnnouncementMapper announcementMapper;
    16.     @Override
    17.     public void add(Announcement announcement) {
    18.         announcementMapper.insert(announcement);
    19.     }
    20.     @Override
    21.     public void update(Announcement announcement) {
    22.         announcementMapper.updateById(announcement);
    23.     }
    24.     @Override
    25.     public void delete(Integer id) {
    26.         announcementMapper.deleteById(id);
    27.     }
    28.     @Override
    29.     public Announcement findById(Integer id) {
    30.         return announcementMapper.selectById(id);
    31.     }
    32.     @Override
    33.     public List<Announcement> findAll() {
    34.         return announcementMapper.selectList(null);
    35.     }
    36.     @Override
    37.     public Page<Announcement> search(String search, int page, int size) {
    38.         QueryWrapper queryWrapper = new QueryWrapper();
    39.         if (search != null) {
    40.         }
    41.         return announcementMapper.selectPage(new Page<>(page, size), queryWrapper);
    42.     }
    43. }

    控制层开发

    AnnouncementCon
    1. package jkw.controller.back;
    2. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    3. import jkw.pojo.Announcement;
    4. import jkw.service.AnnouncementService;
    5. import jkw.vo.BaseResult;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.security.access.prepost.PreAuthorize;
    8. import org.springframework.web.bind.annotation.*;
    9. import java.util.List;
    10. @RestController
    11. @CrossOrigin
    12. @RequestMapping("/back/announcement")
    13. public class AnnouncementCon {
    14.     @Autowired
    15.     private AnnouncementService announcementService;
    16.     /**
    17.      * 新增
    18.      *
    19.      * @param announcement
    20.      * @return
    21.      */
    22.     @PostMapping("/add")
    23.     @PreAuthorize("hasAnyAuthority('/website/announcement')")
    24.     public BaseResult add(Announcement announcement) {
    25.         announcementService.add(announcement);
    26.         return BaseResult.ok();
    27.     }
    28.     /**
    29.      * 修改
    30.      *
    31.      * @param announcement
    32.      * @return
    33.      */
    34.     @PostMapping("/update")
    35.     @PreAuthorize("hasAnyAuthority('/website/announcement')")
    36.     public BaseResult update(Announcement announcement) {
    37.         announcementService.update(announcement);
    38.         return BaseResult.ok();
    39.     }
    40.     /**
    41.      * 删除
    42.      *
    43.      * @param announcementId
    44.      * @return
    45.      */
    46.     @DeleteMapping("/delete")
    47.     @PreAuthorize("hasAnyAuthority('/website/announcement')")
    48.     public BaseResult delete(Integer announcementId) {
    49.         announcementService.delete(announcementId);
    50.         return BaseResult.ok();
    51.     }
    52.     /**
    53.      * 根据id查询
    54.      *
    55.      * @param announcementId
    56.      * @return
    57.      */
    58.     @GetMapping("/findById")
    59.     @PreAuthorize("hasAnyAuthority('/website/announcement')")
    60.     public BaseResult findById(Integer announcementId) {
    61.         Announcement announcement = announcementService.findById(announcementId);
    62.         return BaseResult.ok(announcement);
    63.     }
    64.     /**
    65.      * 查询所有
    66.      *
    67.      * @return
    68.      */
    69.     @GetMapping("/findAll")
    70.     @PreAuthorize("hasAnyAuthority('/website/announcement')")
    71.     public BaseResult findAll() {
    72.         List<Announcement> all = announcementService.findAll();
    73.         return BaseResult.ok(all);
    74.     }
    75.     /**
    76.      * 分页查询
    77.      *
    78.      * @param page
    79.      * @param size
    80.      * @return
    81.      */
    82.     @GetMapping("/search")
    83.     @PreAuthorize("hasAnyAuthority('/website/announcement')")
    84.     public BaseResult search(String search, int page, int size) {
    85.         Page<Announcement> brandPage = announcementService.search(search, page, size);
    86.         return BaseResult.ok(brandPage);
    87.     }
    88. }

    后台ui设计

    1. <template>
    2.   <div class="data-container">
    3.     <!--添加 start-->
    4.     <div class="data-header">
    5.       <el-input class="input" @keyup.enter="searchHandle" v-model="searchInfo" size="large"
    6.                 placeholder="请输入关键字"></el-input>
    7.       <el-button @click="searchHandle" class="button" size="large" type="primary" plain>搜索</el-button>
    8.       <el-button round @click="addHander" size="large" type="primary">
    9.         <el-icon>
    10.           <DocumentAdd/>
    11.         </el-icon>
    12.         <span>新增</span>
    13.       </el-button>
    14.     </div>
    15.     <!--添加 end-->
    16.     <!--表格数据展示 start-->
    17.     <div class="data-table">
    18.       <el-table :data="dataList.list" style="width: 700px;">
    19.         <el-table-column show-overflow-tooltip label="标题" prop="announcementTitle" align="center"></el-table-column>
    20.         <el-table-column align="center" :formatter="value => detaFormater(Number(value.announcementTime))" prop="announcementTime" label="时间" width="100"/>
    21.         <el-table-column label="操作" align="center" width="220">
    22.           <template #default="scope">
    23.             <el-button size="small" type="primary" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
    24.             <el-button size="small" type="danger" @click="handleDelete(scope.$index, scope.row)">删除</el-button>
    25.           </template>
    26.         </el-table-column>
    27.       </el-table>
    28.       <!--分页 start-->
    29.       <div class="page">
    30.         <el-pagination background
    31.                        layout="prev,pager,next,jumper"
    32.                        :default-page-size="defaultPageSize"
    33.                        :total="totalData"
    34.                        @current-change="currentChangeHaddler"></el-pagination>
    35.       </div>
    36.       <!--分页 end-->
    37.     </div>
    38.     <!--表格数据展示 end-->
    39.     <!--添加对话框 start-->
    40.     <el-dialog draggable destroy-on-close v-model="dialogAddVisible" title="添加" width="70%" center>
    41.       <el-form inline :model="addFormInfo" label-width="150px">
    42.         <el-form-item label="标题">
    43.           <el-input v-model="addFormInfo.announcementTitle"></el-input>
    44.         </el-form-item>
    45.         <el-form-item label="时间">
    46.           <el-date-picker value-format="x" v-model="addFormInfo.announcementTime" type="date"></el-date-picker>
    47.         </el-form-item>
    48.         <el-form-item label="内容">
    49.           <el-input type="textarea" rows="6" style="width: 800px" v-model="addFormInfo.announcementContent"></el-input>
    50.         </el-form-item>
    51.       </el-form>
    52.       <template #footer>
    53.             <span class="dialog-footer">
    54.                 <el-button @click="dialogAddVisible = false">取消</el-button>
    55.                 <el-button type="primary" @click="sureHandler">确定</el-button>
    56.             </span>
    57.       </template>
    58.     </el-dialog>
    59.     <!--添加对话框 end-->
    60.     <!--编辑对话框 start-->
    61.     <!--destroy-on-close:每次关闭对话框时直接销毁对话框,没有缓存-->
    62.     <el-dialog
    63.         draggable
    64.         destroy-on-close
    65.         v-model="dialogEditorVisible"
    66.         title="编辑"
    67.         width="70%"
    68.         center>
    69.       <el-form inline :model="editorFormInfo" label-width="150px">
    70.         <el-form-item label="标题">
    71.           <el-input v-model="editorFormInfo.announcementTitle"></el-input>
    72.         </el-form-item>
    73.         <el-form-item label="时间">
    74.           <el-date-picker value-format="x" v-model="editorFormInfo.announcementTime" type="date"></el-date-picker>
    75.         </el-form-item>
    76.         <el-form-item label="内容">
    77.           <el-input type="textarea" rows="6" style="width: 800px" v-model="editorFormInfo.announcementContent"></el-input>
    78.         </el-form-item>
    79.       </el-form>
    80.       <template #footer>
    81.             <span class="dialog-footer">
    82.                 <el-button @click="dialogEditorVisible = false">取消</el-button>
    83.                 <el-button type="primary" @click="sureEditorHandler">确定</el-button>
    84.             </span>
    85.       </template>
    86.     </el-dialog>
    87.     <!--编辑对话框 end-->
    88.   </div>
    89. </template>
    90. <script setup>
    91. import axios from "../../api/index.js"
    92. import {onMounted, reactive, ref} from "vue";
    93. import {ElMessage} from "element-plus";
    94. import {detaFormater} from "@/utils/utils.js"
    95. //初始化分页查询数据
    96. const dataList = reactive({
    97.   list: []
    98. })
    99. //初始化总条数
    100. const totalData = ref(0)
    101. //当前页
    102. const currentPage = ref(1)
    103. //初始化分页显示条数
    104. const defaultPageSize = ref(10)
    105. //搜索初始化状态
    106. const searchInfo = ref("")
    107. //添加添加对话框控制器
    108. const dialogAddVisible = ref(false)
    109. //初始化添加对话框状态
    110. const addFormInfo = reactive({
    111.   announcementTitle: "",
    112.   announcementTime: "",
    113.   announcementContent:''
    114. })
    115. //编辑对话框控制器
    116. const dialogEditorVisible = ref(false)
    117. //初始化编辑对话框状态
    118. const editorFormInfo = reactive({
    119.   announcementId: '',
    120.   announcementTitle: "",
    121.   announcementTime: "",
    122.   announcementContent:''
    123. })
    124. /**
    125.  * 网路请求:分页查询
    126.  *  */
    127. const http = (search, page, size) => {
    128.   axios.announcement_search({
    129.     search: search,
    130.     page: page,
    131.     size: size
    132.   }).then(res => {
    133.     if (res.data.code == 200) {
    134.       dataList.list = res.data.data.records
    135.       totalData.value = res.data.data.total
    136.     } else {
    137.       ElMessage.error(res.data.message)
    138.     }
    139.   })
    140. }
    141. onMounted(() => {
    142.   http(searchInfo.value, currentPage.value, defaultPageSize.value)
    143. })
    144. /**
    145.  * 分页
    146.  */
    147. const currentChangeHaddler = (nowPage) => {
    148.   http(searchInfo.value, nowPage, defaultPageSize.value)
    149.   currentPage.value = nowPage
    150. }
    151. /**
    152.  * 搜索按钮
    153.  */
    154. const searchHandle = () => {
    155.   http(searchInfo.value, currentPage.value, defaultPageSize.value)
    156. }
    157. /**
    158.  * 添加对话框弹出事件
    159.  */
    160. const addHander = () => {
    161.   dialogAddVisible.value = true
    162. }
    163. /**
    164.  * 添加对话框 确定事件
    165.  */
    166. const sureHandler = () => {
    167.   axios.announcement_add({
    168.     announcementTitle: addFormInfo.announcementTitle,
    169.     announcementTime: addFormInfo.announcementTime,
    170.     announcementContent: addFormInfo.announcementContent,
    171.   }).then(res => {
    172.     if (res.data.code == 200) {
    173.       dialogAddVisible.value = false
    174.       http(searchInfo.value, currentPage.value, defaultPageSize.value)
    175.     } else {
    176.       ElMessage.error(res.data.message)
    177.     }
    178.   })
    179. }
    180. /**
    181.  * 编辑对话框 弹出事件
    182.  *  */
    183. const handleEdit = (index, row) => {
    184.   dialogEditorVisible.value = true
    185.   axios.announcement_findById({
    186.     announcementId: row.announcementId
    187.   }).then(res => {
    188.     if (res.data.code == 200) {
    189.       editorFormInfo.announcementId = res.data.data.announcementId;
    190.       editorFormInfo.announcementTitle = res.data.data.announcementTitle;
    191.       editorFormInfo.announcementTime = res.data.data.announcementTime;
    192.       editorFormInfo.announcementContent = res.data.data.announcementContent;
    193.     } else {
    194.       ElMessage.error(res.data.data.message)
    195.     }
    196.   })
    197. }
    198. /**
    199.  * 编辑对话框 确定事件
    200.  */
    201. const sureEditorHandler = () => {
    202.   axios.announcement_update({
    203.     announcementId: editorFormInfo.announcementId,
    204.     announcementTitle: editorFormInfo.announcementTitle,
    205.     announcementTime: editorFormInfo.announcementTime,
    206.     announcementContent: editorFormInfo.announcementContent,
    207.   }).then(res => {
    208.     if (res.data.code == 200) {
    209.       dialogEditorVisible.value = false
    210.       http(searchInfo.value, currentPage.value, defaultPageSize.value)
    211.     } else {
    212.       ElMessage.error(res.data.message)
    213.     }
    214.   })
    215. }
    216. /**删除 */
    217. const handleDelete = (index, row) => {
    218.   ElMessageBox.confirm(
    219.       '确定删除么',
    220.       '删除',
    221.       {
    222.         confirmButtonText: '确定',
    223.         cancelButtonText: '取消',
    224.         type: 'warning',
    225.       }
    226.   ).then(() => {
    227.     //确认删除
    228.     axios.announcement_delete({
    229.       announcementId: row.announcementId
    230.     }).then(res => {
    231.       if (res.data.code == 200) {
    232.         ElMessage({
    233.           type: 'success',
    234.           message: "删除成功!!!",
    235.         })
    236.         //刷新
    237.         http(searchInfo.value, currentPage.value, defaultPageSize.value)
    238.       } else {
    239.         ElMessage({
    240.           type: 'error',
    241.           message: res.data.message,
    242.         })
    243.       }
    244.     })
    245.   }).catch(error => {
    246.     ElMessage({
    247.       type: 'info',
    248.       message: "取消删除",
    249.     })
    250.   })
    251. }
    252. </script>
    253. <style scoped>
    254. .data-container {
    255.   background: linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
    256.   background: -o-linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
    257.   background: -ms-linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
    258.   background: -moz-linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
    259.   background: -webkit-linear-gradient(left, rgb(89, 234, 233) 27%, rgb(131, 231, 218) 44%, rgb(69, 150, 216) 88%);
    260.   height: 800px;
    261. }
    262. .data-header {
    263.   padding: 20px;
    264. }
    265. .data-header .input {
    266.   width: 300px;
    267. }
    268. .data-table {
    269.   padding: 20px;
    270. }
    271. .page {
    272.   position: fixed;
    273.   right: 10px;
    274.   bottom: 10px;
    275. }
    276. </style>

  • 相关阅读:
    时序预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络时间序列预测
    leetcode每天5题-Day06
    如何快速开发灵活自定义报表
    记录--源码视角,Vue3为什么推荐使用ref而不是reactive
    【Django】执行查询—创建和修改对象
    Mac滚动截屏了解一下?
    linux搭建git服务器,windows客户端配置git
    「算法刷题宝典」必须知道的知识点和技巧
    Java设计模式——单例模式
    Scikit-Learn支持向量机分类
  • 原文地址:https://blog.csdn.net/m0_63040701/article/details/133134105