三木 преди 1 година
родител
ревизия
6f8f694458

+ 44 - 40
admin-ui/src/views/work/notice/edit.vue

@@ -1,31 +1,25 @@
 <template>
   <div class="cmain">
-    <el-form ref="form" :model="form" :rules="rules" label-width="100px">
-      <el-form-item label="标题" prop="title">
-        <el-input v-model="form.title" placeholder="请输入标题" clearable />
-      </el-form-item>
-      <el-form-item label="内容" prop="contents">
-        <el-input v-model="form.contents" type="textarea" placeholder="请输入内容" />
-      </el-form-item>
-      <el-form-item label="是否置顶" prop="top">
-        <el-input v-model="form.top" placeholder="请输入是否置顶" clearable />
-      </el-form-item>
-      <el-form-item label="状态" prop="state">
-        <el-input v-model="form.state" placeholder="请输入状态" clearable />
-      </el-form-item>
-      <el-form-item label="创建者" prop="createBy">
-        <el-input v-model="form.createBy" placeholder="请输入创建者" clearable />
-      </el-form-item>
-      <el-form-item label="创建时间" prop="createTime">
-        <el-date-picker clearable v-model="form.createTime" type="date" value-format="yyyy-MM-dd" placeholder="请选择创建时间"></el-date-picker>
-      </el-form-item>
-      <el-form-item label="更新者" prop="updateBy">
-        <el-input v-model="form.updateBy" placeholder="请输入更新者" clearable />
-      </el-form-item>
-      <el-form-item label="更新时间" prop="updateTime">
-        <el-date-picker clearable v-model="form.updateTime" type="date" value-format="yyyy-MM-dd" placeholder="请选择更新时间"></el-date-picker>
-      </el-form-item>
-    </el-form>
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="标题" prop="title">
+          <el-input v-model="form.title" placeholder="请输入标题" clearable maxlength="20" show-word-limit/>
+        </el-form-item>
+        <el-form-item label="是否置顶" prop="top">
+          <el-radio-group v-model="form.top">
+            <el-radio :label="1">是</el-radio>
+            <el-radio :label="0">否</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="状态" prop="state">
+          <el-radio-group v-model="form.state">
+            <el-radio :label="1">启用</el-radio>
+            <el-radio :label="0">停用</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="内容" prop="contents">
+          <editor v-model="form.contents" placeholder="请输入内容" ></editor>
+        </el-form-item>
+      </el-form>
     <div class="mfooter">
       <el-button type="primary" @click="submitForm">确 定</el-button>
       <el-button @click="$layer.close(layerid)">取 消</el-button>
@@ -39,8 +33,18 @@ export default {
     return {
       form: {},
       rules: {
-        title: [{ required: true, message: '标题不能为空', trigger: 'blur' }],
-        contents: [{ required: true, message: '内容不能为空', trigger: 'blur' }]
+        title: [
+          { required: true, message: "标题不能为空", trigger: "blur" }
+        ],
+        contents: [
+          { required: true, message: "内容不能为空", trigger: "blur" }
+        ],
+        top: [
+          { required: true, message: "是否置顶不能为空", trigger: "blur" }
+        ],
+        state: [
+          { required: true, message: "状态不能为空", trigger: "blur" }
+        ],
       }
     };
   },
@@ -57,27 +61,27 @@ export default {
   },
   mounted() {
     if (this.param.id) {
-      this.ajax({ url: '/work/notice/detail/' + this.param.id }).then((response) => {
+      this.ajax({ url: '/work/notice/detail/' + this.param.id }).then(response => {
         this.form = response.data;
       });
     }
   },
   methods: {
     submitForm() {
-      this.$refs['form'].validate((valid) => {
+      this.$refs["form"].validate(valid => {
         if (valid) {
           if (this.form.id) {
-            this.ajax({ method: 'post', url: '/work/notice/edit', data: this.form }).then((response) => {
-              this.$modal.msgSuccess('修改成功');
-              this.$layer.close(this.layerid);
-              this.$parent.getList();
-            });
+              this.ajax({method: 'post',url: '/work/notice/edit', data: this.form }).then(response => {
+                  this.$modal.msgSuccess("修改成功");
+                  this.$layer.close(this.layerid);
+                  this.$parent.getList();
+              });
           } else {
-            this.ajax({ method: 'post', url: '/work/notice/add', data: this.form }).then((response) => {
-              this.$modal.msgSuccess('新增成功');
-              this.$layer.close(this.layerid);
-              this.$parent.getList();
-            });
+              this.ajax({method: 'post',url: '/work/notice/add', data: this.form }).then(response => {
+                  this.$modal.msgSuccess("新增成功");
+                  this.$layer.close(this.layerid);
+                  this.$parent.getList();
+               });
           }
         }
       });

+ 69 - 10
admin-ui/src/views/work/notice/index.vue

@@ -1,14 +1,40 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" @submit.native.prevent v-show="showSearch" label-width="auto">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" @submit.native.prevent v-show="showSearch">
       <el-form-item label="标题" prop="title">
         <el-input v-model="queryParams.title" placeholder="请输入标题"  @keyup.enter.native="handleQuery" clearable class="inp"/>
       </el-form-item>
       <el-form-item label="是否置顶" prop="top">
-        <el-input v-model="queryParams.top" placeholder="请输入是否置顶"  @keyup.enter.native="handleQuery" clearable class="inp"/>
+        <el-select v-model="queryParams.top" placeholder="请选择">
+          <el-option
+            v-for="item in topOpt"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
       </el-form-item>
       <el-form-item label="状态" prop="state">
-        <el-input v-model="queryParams.state" placeholder="请输入状态"  @keyup.enter.native="handleQuery" clearable class="inp"/>
+        <el-select v-model="queryParams.state" placeholder="请选择">
+          <el-option
+            v-for="item in stateOpt"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="创建时间" prop="dateRange">
+        <el-date-picker
+          v-model="queryParams.dateRange"
+          type="daterange"
+          range-separator="至"
+          value-format="yyyy-MM-dd"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          @change="changeDate"
+        >
+        </el-date-picker>
       </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
@@ -24,11 +50,21 @@
 
     <el-table :data="response.rows" border @selection-change="selects" height="calc(100vh - 270px)">
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="id" align="center" prop="id" />
       <el-table-column label="标题" align="center" prop="title" />
-      <el-table-column label="内容" align="center" prop="contents" />
-      <el-table-column label="是否置顶" align="center" prop="top" />
-      <el-table-column label="状态" align="center" prop="state" />
+      <el-table-column label="是否置顶" align="center" prop="top" >
+        <template slot-scope="scope">
+          <el-tag v-if="scope.row.top">是</el-tag>
+          <el-tag v-else type="danger">否</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="状态" align="center" prop="state" >
+        <template slot-scope="scope">
+          <el-tag v-if="scope.row.state">启用</el-tag>
+          <el-tag v-else type="danger">停用</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建人" align="center" prop="createBy" />
+      <el-table-column label="创建时间" align="center" prop="createTime" />
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="op('edit',scope.row)" v-hasPermi="['work:notice:edit']">修改</el-button>
@@ -44,7 +80,7 @@
 </template>
 
 <script>
-import edit from './edit'
+import edit from './edit.vue'
 export default {
   name: "Notice",
   data() {
@@ -52,6 +88,20 @@ export default {
       ids: [],
       showSearch:true,
       response: {},
+      topOpt: [{
+        value: '0',
+        label: '未置顶'
+      }, {
+        value: '1',
+        label: '已置顶'
+      }],
+      stateOpt: [{
+        value: '0',
+        label: '停用'
+      }, {
+        value: '1',
+        label: '启用'
+      }],
       queryParams: {
         pageNum: 1,
         pageSize: 10,
@@ -60,14 +110,21 @@ export default {
         top: null,
         state: null,
         orderByColumn: 'id',
-        isAsc: 'desc'
-      }
+        isAsc: 'desc',
+        dateRange:[],
+        beginTime:null,
+        endTime:null,
+      },
     };
   },
   created() {
     this.getList();
   },
   methods: {
+    changeDate(data){
+      this.queryParams.beginTime = data[0]
+      this.queryParams.endTime = data[1]
+    },
     getList() {
       this.ajax({ url: '/work/notice/list', data: this.queryParams }).then(response => {
             this.response = response;
@@ -78,6 +135,8 @@ export default {
       this.getList();
     },
     resetQuery() {
+      this.queryParams.beginTime = null
+      this.queryParams.endTime = null
       this.resetForm("queryForm");
       this.handleQuery();
     },

+ 40 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/api/Api_NoticeController.java

@@ -0,0 +1,40 @@
+package com.ruoyi.web.work.api;
+
+import com.ruoyi.common.annotation.Anonymous;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.web.work.domain.Notice;
+import com.ruoyi.web.work.service.INoticeService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 通知公告
+ * @author 高伟森
+ * @date 2024-04-18
+ */
+@RestController
+@RequestMapping("/app/notice")
+@Api( tags = "通知公告 小程序")
+public class Api_NoticeController extends BaseController {
+    @Autowired
+    private INoticeService noticeService;
+
+
+    @GetMapping
+    @ApiOperation( value = "获取通知")
+    @Anonymous
+    public AjaxResult queryList(){
+        List<Notice> noticeList = noticeService.queryList();
+        return AjaxResult.success(noticeList);
+    }
+}

+ 1 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/api/config/InterceptorConfig.java

@@ -24,6 +24,7 @@ public class InterceptorConfig implements WebMvcConfigurer {
         registration.excludePathPatterns("/app/user/aa"); //排除
         registration.excludePathPatterns("/app/common/captcha"); //排除
         registration.excludePathPatterns("/app/common/upgrade"); //排除
+        registration.excludePathPatterns("/app/notice"); //排除
     }
 
     @Override

+ 85 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/controller/NoticeController.java

@@ -0,0 +1,85 @@
+package com.ruoyi.web.work.controller;
+
+import java.util.Arrays;
+import java.util.List;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.web.work.domain.Notice;
+import com.ruoyi.web.work.service.INoticeService;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 通知公告
+ * @author 高伟森
+ * @date 2024-04-18
+ */
+@RestController
+@RequestMapping("/work/notice")
+@Api( tags = "通知公告")
+public class NoticeController extends BaseController {
+    @Autowired
+    private INoticeService noticeService;
+
+    @PreAuthorize("@ss.hasPermi('work:notice:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(Notice notice){
+        startPage();
+        List<Notice> list = noticeService.selectList(notice);
+        return getDataTable(list);
+    }
+
+    @PreAuthorize("@ss.hasPermi('work:notice:query')")
+    @GetMapping(value = "/detail/{id}")
+    public AjaxResult detail(@PathVariable("id") Long id){
+        return AjaxResult.success(noticeService.getById(id));
+    }
+
+    @PreAuthorize("@ss.hasPermi('work:notice:add')")
+    @Log(title = "通知公告", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody Notice notice){
+        List<Notice> noticeList = noticeService.selectList(new Notice().setTitle(notice.getTitle()));
+        if(notice.getTitle().length() > 20){
+            return AjaxResult.error("标题长度大于20");
+        }
+        if (!noticeList.isEmpty()){
+            return AjaxResult.error("该标题已存在!");
+        }
+        return toAjax(noticeService.save(notice));
+    }
+
+    @PreAuthorize("@ss.hasPermi('work:notice:edit')")
+    @Log(title = "通知公告", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody Notice notice){
+        if(notice.getTitle().length() > 20){
+            return AjaxResult.error("标题长度大于20");
+        }
+        List<Notice> noticeList = noticeService.selectisEmpty(new Notice().setTitle(notice.getTitle()));
+        noticeList.remove(noticeService.getById(notice.getId()));
+        if (!noticeList.isEmpty()){
+            return AjaxResult.error("该标题已存在!");
+        }
+        return toAjax(noticeService.updateById(notice));
+    }
+
+    @PreAuthorize("@ss.hasPermi('work:notice:remove')")
+    @Log(title = "通知公告", businessType = BusinessType.DELETE)
+    @GetMapping("/remove/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids){
+        return toAjax(noticeService.removeByIds(Arrays.asList(ids)));
+    }
+}

+ 61 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/domain/Notice.java

@@ -0,0 +1,61 @@
+package com.ruoyi.web.work.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.experimental.Accessors;
+/**
+ * @author 高伟森
+ * @date 2024-04-18
+ */
+@Data
+@TableName(value = "tb_notice")
+@Accessors(chain = true)
+@ApiModel( value = "通知公告 实体对象")
+public class Notice{
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    @ApiModelProperty(value = "标题")
+    private String title;
+
+    @ApiModelProperty(value = "内容")
+    private String contents;
+
+    @ApiModelProperty(value = "是否置顶")
+    private Integer top;
+
+    @ApiModelProperty(value = "状态:0=正常,1=停用")
+    private Integer state;
+
+    @TableField(fill = FieldFill.INSERT)
+    private String createBy;
+
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    @TableField(fill = FieldFill.UPDATE)
+    private String updateBy;
+
+    @TableField(fill = FieldFill.UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @TableField(exist = false)
+    private String beginTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @TableField(exist = false)
+    private String endTime;
+
+
+}

+ 15 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/mapper/NoticeMapper.java

@@ -0,0 +1,15 @@
+package com.ruoyi.web.work.mapper;
+
+import java.util.List;
+import com.ruoyi.web.work.domain.Notice;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @author 高伟森
+ * @date 2024-04-18
+ */
+public interface NoticeMapper extends BaseMapper<Notice> {
+    List<Notice> selectList(Notice notice);
+    List<Notice> selectisEmpty(Notice notice);
+    List<Notice> queryList();
+}

+ 15 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/INoticeService.java

@@ -0,0 +1,15 @@
+package com.ruoyi.web.work.service;
+
+import java.util.List;
+import com.ruoyi.web.work.domain.Notice;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @author 高伟森
+ * @date 2024-04-18
+ */
+public interface INoticeService extends IService<Notice>{
+    List<Notice> selectList(Notice notice);
+    List<Notice> selectisEmpty(Notice notice);
+    List<Notice> queryList();
+}

+ 34 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/work/service/impl/NoticeServiceImpl.java

@@ -0,0 +1,34 @@
+package com.ruoyi.web.work.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.web.work.mapper.NoticeMapper;
+import com.ruoyi.web.work.domain.Notice;
+import com.ruoyi.web.work.service.INoticeService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @author 高伟森
+ * @date 2024-04-18
+ */
+@Service
+public class NoticeServiceImpl extends ServiceImpl<NoticeMapper, Notice> implements INoticeService {
+    @Autowired
+    private NoticeMapper noticeMapper;
+
+    @Override
+    public List<Notice> selectList(Notice notice) {
+        return noticeMapper.selectList(notice);
+    }
+
+    @Override
+    public List<Notice> selectisEmpty(Notice notice) {
+        return noticeMapper.selectisEmpty(notice);
+    }
+
+    @Override
+    public List<Notice> queryList() {
+        return noticeMapper.queryList();
+    }
+}

+ 35 - 0
ruoyi-admin/src/main/resources/mapper/work/NoticeMapper.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.web.work.mapper.NoticeMapper">
+
+    <select id="selectList" resultType="com.ruoyi.web.work.domain.Notice">
+        select * from tb_notice
+        <where>
+            <if test="title != null  and title != ''"> and title like concat('%', #{title}, '%')</if>
+            <if test="contents != null  and contents != ''"> and contents like concat('%', #{contents}, '%')</if>
+            <if test="top != null "> and top = #{top}</if>
+            <if test="state != null "> and state = #{state}</if>
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
+                and (create_time between #{beginTime} and #{endTime})
+            </if>
+        </where>
+    </select>
+
+    <select id="selectisEmpty" resultType="com.ruoyi.web.work.domain.Notice">
+        select * from tb_notice
+        <where>
+            <if test="title != null  and title != ''"> and title =  #{title}</if>
+        </where>
+    </select>
+
+    <select id="queryList" resultType="com.ruoyi.web.work.domain.Notice">
+        select * from tb_notice
+        <where>
+            and state = 1
+        </where>
+        ORDER BY top DESC,create_time DESC
+    </select>
+
+</mapper>