inleft
2022-03-01 88f419df77ade235ea5e5e24be204842a24b7b33
评论接口对接
15 files added
10 files modified
1 files copied
3 files renamed
1793 ■■■■■ changed files
_web/src/api/modular/main/blogarticlecomment/blogArticleCommentManage.js 86 ●●●●● patch | view | raw | blame | history
_web/src/views/main/blogarticlecomment/addForm.vue 146 ●●●●● patch | view | raw | blame | history
_web/src/views/main/blogarticlecomment/editForm.vue 159 ●●●●● patch | view | raw | blame | history
_web/src/views/main/blogarticlecomment/index.vue 326 ●●●●● patch | view | raw | blame | history
snowy-base/snowy-core/src/main/java/vip/xiaonuo/core/consts/MyConstant.java 11 ●●●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticle/controller/BlogArticleOutsideController.java 4 ●●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticle/entity/BlogArticleVo.java 2 ●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticle/mapper/mapping/BlogArticleMapper.xml 2 ●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticle/service/BlogArticleService.java 3 ●●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticlecomment/controller/BlogArticleCommentController.java 148 ●●●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticlecomment/controller/BlogArticleCommentOutsideController.java 118 ●●●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticlecomment/entity/BlogArticleComment.java 138 ●●●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticlecomment/entity/BlogCommentVo.java 36 ●●●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticlecomment/enums/BlogArticleCommentExceptionEnum.java 64 ●●●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticlecomment/mapper/BlogArticleCommentMapper.java 20 ●●●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticlecomment/mapper/mapping/BlogArticleCommentMapper.xml 5 ●●●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticlecomment/param/BlogArticleCommentAddDto.java 112 ●●●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticlecomment/param/BlogArticleCommentParam.java 121 ●●●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticlecomment/param/BlogCommentQueryDto.java 22 ●●●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticlecomment/service/BlogArticleCommentService.java 97 ●●●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticlecomment/service/impl/BlogArticleCommentServiceImpl.java 156 ●●●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticletype/controller/BlogArticleTypeOutsideController.java 2 ●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticletype/entity/BlogArticleTypeVo.java 2 ●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticletype/mapper/BlogArticleTypeMapper.java 2 ●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticletype/mapper/mapping/BlogArticleTypeMapper.xml 2 ●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticletype/service/BlogArticleTypeService.java 2 ●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticletype/service/impl/BlogArticleTypeServiceImpl.java 2 ●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogfriendshiplink/controller/BlogLinkOutsideController.java 2 ●●● patch | view | raw | blame | history
snowy-main/src/main/java/vip/xiaonuo/modular/blogfriendshiplink/entity/BlogLinkVo.java 3 ●●●● patch | view | raw | blame | history
_web/src/api/modular/main/blogarticlecomment/blogArticleCommentManage.js
New file
@@ -0,0 +1,86 @@
import { axios } from '@/utils/request'
/**
 * 查询文章评论
 *
 * @author inleft
 * @date 2022-03-01 14:00:53
 */
export function blogArticleCommentPage (parameter) {
  return axios({
    url: '/blogArticleComment/page',
    method: 'get',
    params: parameter
  })
}
/**
 * 文章评论列表
 *
 * @author inleft
 * @date 2022-03-01 14:00:53
 */
export function blogArticleCommentList (parameter) {
  return axios({
    url: '/blogArticleComment/list',
    method: 'get',
    params: parameter
  })
}
/**
 * 添加文章评论
 *
 * @author inleft
 * @date 2022-03-01 14:00:53
 */
export function blogArticleCommentAdd (parameter) {
  return axios({
    url: '/blogArticleComment/add',
    method: 'post',
    data: parameter
  })
}
/**
 * 编辑文章评论
 *
 * @author inleft
 * @date 2022-03-01 14:00:53
 */
export function blogArticleCommentEdit (parameter) {
  return axios({
    url: '/blogArticleComment/edit',
    method: 'post',
    data: parameter
  })
}
/**
 * 删除文章评论
 *
 * @author inleft
 * @date 2022-03-01 14:00:53
 */
export function blogArticleCommentDelete (parameter) {
  return axios({
    url: '/blogArticleComment/delete',
    method: 'post',
    data: parameter
  })
}
/**
 * 导出文章评论
 *
 * @author inleft
 * @date 2022-03-01 14:00:53
 */
export function blogArticleCommentExport (parameter) {
  return axios({
    url: '/blogArticleComment/export',
    method: 'get',
    params: parameter,
    responseType: 'blob'
  })
}
_web/src/views/main/blogarticlecomment/addForm.vue
New file
@@ -0,0 +1,146 @@
<template>
  <a-modal
    title="新增文章评论"
    :width="900"
    :visible="visible"
    :confirmLoading="confirmLoading"
    @ok="handleSubmit"
    @cancel="handleCancel"
  >
    <a-spin :spinning="confirmLoading">
      <a-form :form="form">
        <a-form-item
          label="访客名称"
          :labelCol="labelCol"
          :wrapperCol="wrapperCol"
          has-feedback
        >
          <a-input placeholder="请输入访客名称" v-decorator="['visitorNickName', {rules: [{required: true, message: '请输入访客名称!'}]}]" />
        </a-form-item>
        <a-form-item
          label="访客邮箱"
          :labelCol="labelCol"
          :wrapperCol="wrapperCol"
          has-feedback
        >
          <a-input placeholder="请输入访客邮箱" v-decorator="['visitorEmail']" />
        </a-form-item>
        <a-form-item
          label="访客主页"
          :labelCol="labelCol"
          :wrapperCol="wrapperCol"
          has-feedback
        >
          <a-input placeholder="请输入访客主页" v-decorator="['visitorHomePage']" />
        </a-form-item>
        <a-form-item
          label="留言内容(500字内)"
          :labelCol="labelCol"
          :wrapperCol="wrapperCol"
          has-feedback
        >
          <a-textarea placeholder="请输入留言内容(500字内)" v-decorator="['commentContent']" :auto-size="{ minRows: 3, maxRows: 6 }"/>
        </a-form-item>
        <a-form-item
          label="是否已审核 0:否 1:是"
          :labelCol="labelCol"
          :wrapperCol="wrapperCol"
        >
          <a-select style="width: 100%" placeholder="请选择是否已审核 0:否 1:是">
            <a-select-option v-for="(item,index) in isCheckData" :key="index" :value="item.code">{{ item.name }}</a-select-option>
          </a-select>
        </a-form-item>
        <a-form-item
          label="公开状态 1:公开 2:私密 3:密码授权"
          :labelCol="labelCol"
          :wrapperCol="wrapperCol"
        >
          <a-select style="width: 100%" placeholder="请选择公开状态 1:公开 2:私密 3:密码授权">
            <a-select-option v-for="(item,index) in authStatusData" :key="index" :value="item.code">{{ item.name }}</a-select-option>
          </a-select>
        </a-form-item>
        <a-form-item
          label="是否启用 0:否 1是"
          :labelCol="labelCol"
          :wrapperCol="wrapperCol"
        >
          <a-select style="width: 100%" placeholder="请选择是否启用 0:否 1是">
            <a-select-option v-for="(item,index) in isEnableData" :key="index" :value="item.code">{{ item.name }}</a-select-option>
          </a-select>
        </a-form-item>
      </a-form>
    </a-spin>
  </a-modal>
</template>
<script>
  import { blogArticleCommentAdd } from '@/api/modular/main/blogarticlecomment/blogArticleCommentManage'
  export default {
    data () {
      return {
        labelCol: {
          xs: { span: 24 },
          sm: { span: 5 }
        },
        wrapperCol: {
          xs: { span: 24 },
          sm: { span: 15 }
        },
        isCheckData: [],
        authStatusData: [],
        isEnableData: [],
        visible: false,
        confirmLoading: false,
        form: this.$form.createForm(this)
      }
    },
    methods: {
      // 初始化方法
      add (record) {
        this.visible = true
        const commentTypeOption = this.$options
        this.commentTypeData = commentTypeOption.filters['dictData']('blog_comment_type')
        const isCheckOption = this.$options
        this.isCheckData = isCheckOption.filters['dictData']('blog_yes_or_no')
        const authStatusOption = this.$options
        this.authStatusData = authStatusOption.filters['dictData']('blog_auth_status')
        const isEnableOption = this.$options
        this.isEnableData = isEnableOption.filters['dictData']('blog_yes_or_no')
      },
      /**
       * 提交表单
       */
      handleSubmit () {
        const { form: { validateFields } } = this
        this.confirmLoading = true
        validateFields((errors, values) => {
          if (!errors) {
            for (const key in values) {
              if (typeof (values[key]) === 'object' && values[key] != null) {
                values[key] = JSON.stringify(values[key])
              }
            }
            blogArticleCommentAdd(values).then((res) => {
              if (res.success) {
                this.$message.success('新增成功')
                this.confirmLoading = false
                this.$emit('ok', values)
                this.handleCancel()
              } else {
                this.$message.error('新增失败')// + res.message
              }
            }).finally((res) => {
              this.confirmLoading = false
            })
          } else {
            this.confirmLoading = false
          }
        })
      },
      handleCancel () {
        this.form.resetFields()
        this.visible = false
      }
    }
  }
</script>
_web/src/views/main/blogarticlecomment/editForm.vue
New file
@@ -0,0 +1,159 @@
<template>
  <a-modal
    title="编辑文章评论"
    :width="900"
    :visible="visible"
    :confirmLoading="confirmLoading"
    @ok="handleSubmit"
    @cancel="handleCancel"
  >
    <a-spin :spinning="confirmLoading">
      <a-form :form="form">
        <a-form-item v-show="false"><a-input v-decorator="['id']" /></a-form-item>
        <a-form-item
          label="访客名称"
          :labelCol="labelCol"
          :wrapperCol="wrapperCol"
          has-feedback
        >
          <a-input placeholder="请输入访客名称" v-decorator="['visitorNickName', {rules: [{required: true, message: '请输入访客名称!'}]}]" />
        </a-form-item>
        <a-form-item
          label="访客邮箱"
          :labelCol="labelCol"
          :wrapperCol="wrapperCol"
          has-feedback
        >
          <a-input placeholder="请输入访客邮箱" v-decorator="['visitorEmail']" />
        </a-form-item>
        <a-form-item
          label="访客主页"
          :labelCol="labelCol"
          :wrapperCol="wrapperCol"
          has-feedback
        >
          <a-input placeholder="请输入访客主页" v-decorator="['visitorHomePage']" />
        </a-form-item>
        <a-form-item
          label="留言内容"
          :labelCol="labelCol"
          :wrapperCol="wrapperCol"
          has-feedback
        >
          <a-textarea placeholder="请输入留言内容" v-decorator="['commentContent']" :auto-size="{ minRows: 3, maxRows: 6 }"/>
        </a-form-item>
        <a-form-item
          label="是否已审核"
          :labelCol="labelCol"
          :wrapperCol="wrapperCol"
        >
          <a-select style="width: 100%" placeholder="请选择是否已审核">
            <a-select-option v-for="(item,index) in isCheckData" :key="index" :value="item.code">{{ item.name }}</a-select-option>
          </a-select>
        </a-form-item>
        <a-form-item
          label="公开状态"
          :labelCol="labelCol"
          :wrapperCol="wrapperCol"
        >
          <a-select style="width: 100%" placeholder="请选择公开状态">
            <a-select-option v-for="(item,index) in authStatusData" :key="index" :value="item.code">{{ item.name }}</a-select-option>
          </a-select>
        </a-form-item>
        <a-form-item
          label="是否启用"
          :labelCol="labelCol"
          :wrapperCol="wrapperCol"
        >
          <a-select style="width: 100%" placeholder="请选择是否启用">
            <a-select-option v-for="(item,index) in isEnableData" :key="index" :value="item.code">{{ item.name }}</a-select-option>
          </a-select>
        </a-form-item>
      </a-form>
    </a-spin>
  </a-modal>
</template>
<script>
  import { blogArticleCommentEdit } from '@/api/modular/main/blogarticlecomment/blogArticleCommentManage'
  export default {
    data () {
      return {
        labelCol: {
          xs: { span: 24 },
          sm: { span: 5 }
        },
        wrapperCol: {
          xs: { span: 24 },
          sm: { span: 15 }
        },
        isCheckData: [],
        authStatusData: [],
        isEnableData: [],
        visible: false,
        confirmLoading: false,
        form: this.$form.createForm(this)
      }
    },
    methods: {
      // 初始化方法
      edit (record) {
        this.visible = true
        const commentTypeOption = this.$options
        this.commentTypeData = commentTypeOption.filters['dictData']('blog_comment_type')
        const isCheckOption = this.$options
        this.isCheckData = isCheckOption.filters['dictData']('blog_yes_or_no')
        const authStatusOption = this.$options
        this.authStatusData = authStatusOption.filters['dictData']('blog_auth_status')
        const isEnableOption = this.$options
        this.isEnableData = isEnableOption.filters['dictData']('blog_yes_or_no')
        setTimeout(() => {
          console.log(11);
          this.form.setFieldsValue(
            {
              id: record.id,
              visitorNickName: record.visitorNickName,
              visitorEmail: record.visitorEmail,
              visitorHomePage: record.visitorHomePage,
              commentContent: record.commentContent,
              isCheck: record.isCheck,
              authStatus: record.authStatus,
              isEnable: record.isEnable
            }
          )
        }, 100)
      },
      handleSubmit () {
        const { form: { validateFields } } = this
        this.confirmLoading = true
        validateFields((errors, values) => {
          if (!errors) {
            for (const key in values) {
              if (typeof (values[key]) === 'object' && values[key] != null) {
                values[key] = JSON.stringify(values[key])
              }
            }
            blogArticleCommentEdit(values).then((res) => {
              if (res.success) {
                this.$message.success('编辑成功')
                this.confirmLoading = false
                this.$emit('ok', values)
                this.handleCancel()
              } else {
                this.$message.error('编辑失败')//  + res.message
              }
            }).finally((res) => {
              this.confirmLoading = false
            })
          } else {
            this.confirmLoading = false
          }
        })
      },
      handleCancel () {
        this.form.resetFields()
        this.visible = false
      }
    }
  }
</script>
_web/src/views/main/blogarticlecomment/index.vue
New file
@@ -0,0 +1,326 @@
<template>
  <div>
    <a-card :bordered="false" :bodyStyle="tstyle">
      <div class="table-page-search-wrapper" v-if="hasPerm('blogArticleComment:page')">
        <a-form layout="inline">
          <a-row :gutter="48">
            <a-col :md="8" :sm="24">
              <a-form-item label="留言类型">
                <a-select style="width: 100%" v-model="queryParam.commentType" placeholder="请选择留言类型">
                  <a-select-option v-for="(item,index) in commentTypeData" :key="index" :value="item.code">{{ item.name }}</a-select-option>
                </a-select>
              </a-form-item>
            </a-col>
            <a-col :md="8" :sm="24">
              <a-form-item label="文章id主键">
                <a-input v-model="queryParam.articleId" allow-clear placeholder="请输入文章id主键"/>
              </a-form-item>
            </a-col>
            <template v-if="advanced">
              <a-col :md="8" :sm="24">
                <a-form-item label="访客id(随机字符)">
                  <a-input v-model="queryParam.visitorId" allow-clear placeholder="请输入访客id(随机字符)"/>
                </a-form-item>
              </a-col>
              <a-col :md="8" :sm="24">
                <a-form-item label="访客名称">
                  <a-input v-model="queryParam.visitorNickName" allow-clear placeholder="请输入访客名称"/>
                </a-form-item>
              </a-col>
              <a-col :md="8" :sm="24">
                <a-form-item label="访客邮箱">
                  <a-input v-model="queryParam.visitorEmail" allow-clear placeholder="请输入访客邮箱"/>
                </a-form-item>
              </a-col>
              <a-col :md="8" :sm="24">
                <a-form-item label="访客主页">
                  <a-input v-model="queryParam.visitorHomePage" allow-clear placeholder="请输入访客主页"/>
                </a-form-item>
              </a-col>
              <a-col :md="8" :sm="24">
                <a-form-item label="是否已审核">
                  <a-select style="width: 100%" v-model="queryParam.isCheck" placeholder="请选择是否已审核">
                    <a-select-option v-for="(item,index) in isCheckData" :key="index" :value="item.code">{{ item.name }}</a-select-option>
                  </a-select>
                </a-form-item>
              </a-col>
              <a-col :md="8" :sm="24">
                <a-form-item label="公开状态">
                  <a-select style="width: 100%" v-model="queryParam.authStatus" placeholder="请选择公开状态">
                    <a-select-option v-for="(item,index) in authStatusData" :key="index" :value="item.code">{{ item.name }}</a-select-option>
                  </a-select>
                </a-form-item>
              </a-col>
              <a-col :md="8" :sm="24">
                <a-form-item label="是否启用">
                  <a-select style="width: 100%" v-model="queryParam.isEnable" placeholder="请选择是否启用">
                    <a-select-option v-for="(item,index) in isEnableData" :key="index" :value="item.code">{{ item.name }}</a-select-option>
                  </a-select>
                </a-form-item>
              </a-col>
              <a-col :md="8" :sm="24">
                <a-form-item label="创建时间">
                  <a-date-picker style="width: 100%" placeholder="请选择创建时间" v-model="queryParam.createDateDate" @change="onChangecreateDate"/>
                </a-form-item>
              </a-col>
            </template>
            <a-col :md="8" :sm="24" >
              <span class="table-page-search-submitButtons">
                <a-button type="primary" @click="$refs.table.refresh(true)" >查询</a-button>
                <a-button style="margin-left: 8px" @click="() => queryParam = {}">重置</a-button>
                <a @click="toggleAdvanced" style="margin-left: 8px">
                  {{ advanced ? '收起' : '展开' }}
                  <a-icon :type="advanced ? 'up' : 'down'"/>
                </a>
              </span>
            </a-col>
          </a-row>
        </a-form>
      </div>
    </a-card>
    <a-card :bordered="false">
      <s-table
        ref="table"
        :columns="columns"
        :data="loadData"
        :alert="options.alert"
        :rowKey="(record) => record.id"
        :rowSelection="options.rowSelection"
      >
        <template class="table-operator" slot="operator" v-if="hasPerm('blogArticleComment:add')" >
          <a-button type="primary" v-if="hasPerm('blogArticleComment:add')" icon="plus" @click="$refs.addForm.add()">新增文章评论</a-button>
          <a-button type="danger" :disabled="selectedRowKeys.length < 1" v-if="hasPerm('blogArticleComment:delete')" @click="batchDelete"><a-icon type="delete"/>批量删除</a-button>
          <x-down
            v-if="hasPerm('blogArticleComment:export')"
            ref="batchExport"
            @batchExport="batchExport"
          />
        </template>
        <span slot="commentTypeScopedSlots" slot-scope="text">
          {{ 'blog_comment_type' | dictType(text) }}
        </span>
        <span slot="isCheckScopedSlots" slot-scope="text">
          {{ 'blog_yes_or_no' | dictType(text) }}
        </span>
        <span slot="authStatusScopedSlots" slot-scope="text">
          {{ 'blog_auth_status' | dictType(text) }}
        </span>
        <span slot="isEnableScopedSlots" slot-scope="text">
          {{ 'blog_yes_or_no' | dictType(text) }}
        </span>
        <span slot="action" slot-scope="text, record">
          <a v-if="hasPerm('blogArticleComment:edit')" @click="$refs.editForm.edit(record)">编辑</a>
          <a-divider type="vertical" v-if="hasPerm('blogArticleComment:edit') & hasPerm('blogArticleComment:delete')"/>
          <a-popconfirm v-if="hasPerm('blogArticleComment:delete')" placement="topRight" title="确认删除?" @confirm="() => singleDelete(record)">
            <a>删除</a>
          </a-popconfirm>
        </span>
      </s-table>
      <add-form ref="addForm" @ok="handleOk" />
      <edit-form ref="editForm" @ok="handleOk" />
    </a-card>
  </div>
</template>
<script>
  import { STable, XDown } from '@/components'
  import moment from 'moment'
  import { blogArticleCommentPage, blogArticleCommentDelete, blogArticleCommentExport } from '@/api/modular/main/blogarticlecomment/blogArticleCommentManage'
  import addForm from './addForm.vue'
  import editForm from './editForm.vue'
  export default {
    components: {
      STable,
      addForm,
      editForm,
      XDown
    },
    data () {
      return {
        // 高级搜索 展开/关闭
        advanced: false,
        // 查询参数
        queryParam: {},
        // 表头
        columns: [
          {
            title: '留言类型',
            align: 'center',
            dataIndex: 'commentType',
            scopedSlots: { customRender: 'commentTypeScopedSlots' }
          },
          {
            title: '文章id主键',
            align: 'center',
            dataIndex: 'articleId'
          },
          {
            title: '访客id(随机字符)',
            align: 'center',
            dataIndex: 'visitorId'
          },
          {
            title: '访客名称',
            align: 'center',
            dataIndex: 'visitorNickName'
          },
          {
            title: '访客邮箱',
            align: 'center',
            dataIndex: 'visitorEmail'
          },
          {
            title: '访客主页',
            align: 'center',
            dataIndex: 'visitorHomePage'
          },
          {
            title: '留言内容',
            align: 'center',
            dataIndex: 'commentContent'
          },
          {
            title: '是否已审核',
            align: 'center',
            dataIndex: 'isCheck',
            scopedSlots: { customRender: 'isCheckScopedSlots' }
          },
          {
            title: '公开状态',
            align: 'center',
            dataIndex: 'authStatus',
            scopedSlots: { customRender: 'authStatusScopedSlots' }
          },
          {
            title: '是否启用',
            align: 'center',
            dataIndex: 'isEnable',
            scopedSlots: { customRender: 'isEnableScopedSlots' }
          },
          {
            title: '更新时间',
            align: 'center',
            dataIndex: 'updateDate'
          },
          {
            title: '创建时间',
            align: 'center',
            dataIndex: 'createDate'
          }
        ],
        tstyle: { 'padding-bottom': '0px', 'margin-bottom': '10px' },
        // 加载数据方法 必须为 Promise 对象
        loadData: parameter => {
          return blogArticleCommentPage(Object.assign(parameter, this.switchingDate())).then((res) => {
            return res.data
          })
        },
        commentTypeData: [],
        isCheckData: [],
        authStatusData: [],
        isEnableData: [],
        selectedRowKeys: [],
        selectedRows: [],
        options: {
          alert: { show: true, clear: () => { this.selectedRowKeys = [] } },
          rowSelection: {
            selectedRowKeys: this.selectedRowKeys,
            onChange: this.onSelectChange
          }
        }
      }
    },
    created () {
      if (this.hasPerm('blogArticleComment:edit') || this.hasPerm('blogArticleComment:delete')) {
        this.columns.push({
          title: '操作',
          width: '150px',
          dataIndex: 'action',
          scopedSlots: { customRender: 'action' }
        })
      }
      const commentTypeOption = this.$options
      this.commentTypeData = commentTypeOption.filters['dictData']('blog_comment_type')
      const isCheckOption = this.$options
      this.isCheckData = isCheckOption.filters['dictData']('blog_yes_or_no')
      const authStatusOption = this.$options
      this.authStatusData = authStatusOption.filters['dictData']('blog_auth_status')
      const isEnableOption = this.$options
      this.isEnableData = isEnableOption.filters['dictData']('blog_yes_or_no')
    },
    methods: {
      moment,
      /**
       * 查询参数组装
       */
      switchingDate () {
        const queryParamcreateDate = this.queryParam.createDateDate
        if (queryParamcreateDate != null) {
            this.queryParam.createDate = moment(queryParamcreateDate).format('YYYY-MM-DD')
            if (queryParamcreateDate.length < 1) {
                delete this.queryParam.createDate
            }
        }
        const obj = JSON.parse(JSON.stringify(this.queryParam))
        return obj
      },
      /**
       * 单个删除
       */
      singleDelete (record) {
        const param = [{ 'id': record.id }]
        this.blogArticleCommentDelete(param)
      },
      /**
       * 批量删除
       */
      batchDelete () {
        const paramIds = this.selectedRowKeys.map((d) => {
            return { 'id': d }
        })
        this.blogArticleCommentDelete(paramIds)
      },
      blogArticleCommentDelete (record) {
        blogArticleCommentDelete(record).then((res) => {
          if (res.success) {
            this.$message.success('删除成功')
            this.$refs.table.clearRefreshSelected()
          } else {
            this.$message.error('删除失败') // + res.message
          }
        })
      },
      toggleAdvanced () {
        this.advanced = !this.advanced
      },
      onChangecreateDate(date, dateString) {
        this.createDateDateString = dateString
      },
      /**
       * 批量导出
       */
      batchExport () {
        const paramIds = this.selectedRowKeys.map((d) => {
            return { 'id': d }
        })
        blogArticleCommentExport(paramIds).then((res) => {
            this.$refs.batchExport.downloadfile(res)
        })
      },
      handleOk () {
        this.$refs.table.refresh()
      },
      onSelectChange (selectedRowKeys, selectedRows) {
        this.selectedRowKeys = selectedRowKeys
        this.selectedRows = selectedRows
      }
    }
  }
</script>
<style lang="less">
  .table-operator {
    margin-bottom: 18px;
  }
  button {
    margin-right: 8px;
  }
</style>
snowy-base/snowy-core/src/main/java/vip/xiaonuo/core/consts/MyConstant.java
@@ -1,12 +1,21 @@
package vip.xiaonuo.core.consts;
public interface MyConstant {
    Integer No = 0;
    Integer Yes = 1;
    Integer No = 1;
    interface AuthStatus {
        int publicCode = 1;
        int privateCode = 2;
        int authCode = 3;
    }
    /**
     * 留言类型 1:留言板 2:日志评论
     */
    interface CommentType {
        int type_1 = 1;
        int type_2 = 2;
    }
}
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticle/controller/BlogArticleOutsideController.java
@@ -43,7 +43,7 @@
import vip.xiaonuo.modular.blogarticle.entity.BlogArticle;
import vip.xiaonuo.modular.blogarticle.param.BlogArticleAddDto;
import vip.xiaonuo.modular.blogarticle.param.BlogArticleQueryDto;
import vip.xiaonuo.modular.blogarticle.param.BlogArticleVo;
import vip.xiaonuo.modular.blogarticle.entity.BlogArticleVo;
import vip.xiaonuo.modular.blogarticle.service.BlogArticleService;
import vip.xiaonuo.modular.blogarticletype.entity.BlogArticleType;
import vip.xiaonuo.modular.blogarticletype.service.BlogArticleTypeService;
@@ -188,7 +188,7 @@
                throw new BlogException(BlogExceptionEnum.article_auth_error);
            }
            //授权码比对
            if (!SecureUtil.md5(find.getAuthPassword()).equals(queryDto.getAuthWord())) {
            if (!find.getAuthPassword().equals(queryDto.getAuthWord())) {
                throw new BlogException(BlogExceptionEnum.article_auth_pass_error);
            }
        } else if (find.getAuthStatus().equals(MyConstant.AuthStatus.privateCode)) {
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticle/entity/BlogArticleVo.java
File was renamed from snowy-main/src/main/java/vip/xiaonuo/modular/blogarticle/param/BlogArticleVo.java
@@ -22,7 +22,7 @@
5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/xiaonuobase/snowy
6.若您的项目无法满足以上几点,可申请商业授权,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
 */
package vip.xiaonuo.modular.blogarticle.param;
package vip.xiaonuo.modular.blogarticle.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticle/mapper/mapping/BlogArticleMapper.xml
@@ -43,7 +43,7 @@
    </sql>
    <select id="searchList" resultType="vip.xiaonuo.modular.blogarticle.param.BlogArticleVo">
    <select id="searchList" resultType="vip.xiaonuo.modular.blogarticle.entity.BlogArticleVo">
        select
        <include refid="Base_Column_List"/>
        ,IFNULL("",CONCAT("/",f2.file_bucket,"/",f2.file_object_name)) as coverFileURL
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticle/service/BlogArticleService.java
@@ -27,10 +27,9 @@
import com.baomidou.mybatisplus.extension.service.IService;
import vip.xiaonuo.core.pojo.page.PageResult;
import vip.xiaonuo.modular.blogStatistics.vo.BlogArchiveDetailVo;
import vip.xiaonuo.modular.blogStatistics.vo.BlogArchiveVo;
import vip.xiaonuo.modular.blogarticle.entity.BlogArticle;
import vip.xiaonuo.modular.blogarticle.param.BlogArticleParam;
import vip.xiaonuo.modular.blogarticle.param.BlogArticleVo;
import vip.xiaonuo.modular.blogarticle.entity.BlogArticleVo;
import java.util.List;
import java.util.Map;
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticlecomment/controller/BlogArticleCommentController.java
New file
@@ -0,0 +1,148 @@
/*
Copyright [2020] [https://www.xiaonuo.vip]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
  http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
1.请不要删除和修改根目录下的LICENSE文件。
2.请不要删除和修改Snowy源码头部的版权声明。
3.请保留源码和相关描述文件的项目出处,作者声明等。
4.分发源码时候,请注明软件出处 https://gitee.com/xiaonuobase/snowy
5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/xiaonuobase/snowy
6.若您的项目无法满足以上几点,可申请商业授权,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
 */
package vip.xiaonuo.modular.blogarticlecomment.controller;
import vip.xiaonuo.core.annotion.BusinessLog;
import vip.xiaonuo.core.annotion.Permission;
import vip.xiaonuo.core.enums.LogAnnotionOpTypeEnum;
import vip.xiaonuo.core.pojo.response.ResponseData;
import vip.xiaonuo.core.pojo.response.SuccessResponseData;
import vip.xiaonuo.modular.blogarticlecomment.param.BlogArticleCommentParam;
import vip.xiaonuo.modular.blogarticlecomment.service.BlogArticleCommentService;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import javax.annotation.Resource;
import java.util.List;
/**
 * 文章评论控制器
 *
 * @author inleft
 * @date 2022-03-01 14:00:53
 */
@RestController
public class BlogArticleCommentController {
    @Resource
    private BlogArticleCommentService blogArticleCommentService;
    /**
     * 查询文章评论
     *
     * @author inleft
     * @date 2022-03-01 14:00:53
     */
    @Permission
    @GetMapping("/blogArticleComment/page")
    @BusinessLog(title = "文章评论_查询", opType = LogAnnotionOpTypeEnum.QUERY)
    public ResponseData page(BlogArticleCommentParam blogArticleCommentParam) {
        return new SuccessResponseData(blogArticleCommentService.page(blogArticleCommentParam));
    }
    /**
     * 添加文章评论
     *
     * @author inleft
     * @date 2022-03-01 14:00:53
     */
    @Permission
    @PostMapping("/blogArticleComment/add")
    @BusinessLog(title = "文章评论_增加", opType = LogAnnotionOpTypeEnum.ADD)
    public ResponseData add(@RequestBody @Validated(BlogArticleCommentParam.add.class) BlogArticleCommentParam blogArticleCommentParam) {
            blogArticleCommentService.add(blogArticleCommentParam);
        return new SuccessResponseData();
    }
    /**
     * 删除文章评论,可批量删除
     *
     * @author inleft
     * @date 2022-03-01 14:00:53
     */
    @Permission
    @PostMapping("/blogArticleComment/delete")
    @BusinessLog(title = "文章评论_删除", opType = LogAnnotionOpTypeEnum.DELETE)
    public ResponseData delete(@RequestBody @Validated(BlogArticleCommentParam.delete.class) List<BlogArticleCommentParam> blogArticleCommentParamList) {
            blogArticleCommentService.delete(blogArticleCommentParamList);
        return new SuccessResponseData();
    }
    /**
     * 编辑文章评论
     *
     * @author inleft
     * @date 2022-03-01 14:00:53
     */
    @Permission
    @PostMapping("/blogArticleComment/edit")
    @BusinessLog(title = "文章评论_编辑", opType = LogAnnotionOpTypeEnum.EDIT)
    public ResponseData edit(@RequestBody @Validated(BlogArticleCommentParam.edit.class) BlogArticleCommentParam blogArticleCommentParam) {
            blogArticleCommentService.edit(blogArticleCommentParam);
        return new SuccessResponseData();
    }
    /**
     * 查看文章评论
     *
     * @author inleft
     * @date 2022-03-01 14:00:53
     */
    @Permission
    @GetMapping("/blogArticleComment/detail")
    @BusinessLog(title = "文章评论_查看", opType = LogAnnotionOpTypeEnum.DETAIL)
    public ResponseData detail(@Validated(BlogArticleCommentParam.detail.class) BlogArticleCommentParam blogArticleCommentParam) {
        return new SuccessResponseData(blogArticleCommentService.detail(blogArticleCommentParam));
    }
    /**
     * 文章评论列表
     *
     * @author inleft
     * @date 2022-03-01 14:00:53
     */
    @Permission
    @GetMapping("/blogArticleComment/list")
    @BusinessLog(title = "文章评论_列表", opType = LogAnnotionOpTypeEnum.QUERY)
    public ResponseData list(BlogArticleCommentParam blogArticleCommentParam) {
        return new SuccessResponseData(blogArticleCommentService.list(blogArticleCommentParam));
    }
    /**
     * 导出系统用户
     *
     * @author inleft
     * @date 2022-03-01 14:00:53
     */
    @Permission
    @GetMapping("/blogArticleComment/export")
    @BusinessLog(title = "文章评论_导出", opType = LogAnnotionOpTypeEnum.EXPORT)
    public void export(BlogArticleCommentParam blogArticleCommentParam) {
        blogArticleCommentService.export(blogArticleCommentParam);
    }
}
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticlecomment/controller/BlogArticleCommentOutsideController.java
New file
@@ -0,0 +1,118 @@
/*
Copyright [2020] [https://www.xiaonuo.vip]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
  http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
1.请不要删除和修改根目录下的LICENSE文件。
2.请不要删除和修改Snowy源码头部的版权声明。
3.请保留源码和相关描述文件的项目出处,作者声明等。
4.分发源码时候,请注明软件出处 https://gitee.com/xiaonuobase/snowy
5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/xiaonuobase/snowy
6.若您的项目无法满足以上几点,可申请商业授权,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
 */
package vip.xiaonuo.modular.blogarticlecomment.controller;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import vip.xiaonuo.core.annotion.BusinessLog;
import vip.xiaonuo.core.consts.MyConstant;
import vip.xiaonuo.core.enums.LogAnnotionOpTypeEnum;
import vip.xiaonuo.core.exception.BlogException;
import vip.xiaonuo.core.pojo.response.ResponseData;
import vip.xiaonuo.core.pojo.response.SuccessResponseData;
import vip.xiaonuo.modular.blogarticle.service.BlogArticleService;
import vip.xiaonuo.modular.blogarticlecomment.entity.BlogArticleComment;
import vip.xiaonuo.modular.blogarticlecomment.entity.BlogCommentVo;
import vip.xiaonuo.modular.blogarticlecomment.param.BlogArticleCommentAddDto;
import vip.xiaonuo.modular.blogarticlecomment.param.BlogCommentQueryDto;
import vip.xiaonuo.modular.blogarticlecomment.service.BlogArticleCommentService;
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
/**
 * blog 留言/评论 控制器 (提供给外部blog系统查询)
 *
 * @author inleft
 * @date 2022-02-09 18:20:22
 */
@RestController
@RequestMapping("/outside")
public class BlogArticleCommentOutsideController {
    @Resource
    private BlogArticleService blogArticleService;
    @Resource
    private BlogArticleCommentService blogArticleCommentService;
    @PostMapping("/blogComment/add")
    @BusinessLog(title = "外部blog系统_blog留言/评论_增加", opType = LogAnnotionOpTypeEnum.ADD)
    public ResponseData add(@RequestBody @Validated(BlogArticleCommentAddDto.add.class) BlogArticleCommentAddDto addDto) {
        if (addDto.getCommentType().equals(MyConstant.CommentType.type_2)) {
            if (addDto.getArticleId() == null) {
                throw new BlogException("评论类型为日志评论,日志id不能为空");
            }
            if (blogArticleService.getById(addDto.getId()) == null) {
                throw new BlogException("查询不到相关日志");
            }
        }
        BlogArticleComment insert = new BlogArticleComment();
        BeanUtil.copyProperties(addDto, insert);
        insert.setIsCheck(MyConstant.No);
        insert.setIsEnable(MyConstant.Yes);
        insert.setIsReceiveCallback(addDto.getIsReceiveMail());
        blogArticleCommentService.save(insert);
        return new SuccessResponseData();
    }
    @GetMapping("/blogComment/queryBlogCommentList")
    @BusinessLog(title = "外部blog系统_blog留言/评论_查询", opType = LogAnnotionOpTypeEnum.QUERY)
    public ResponseData queryBlogCommentList(BlogCommentQueryDto queryDto) {
        if (queryDto.getArticleId() != null && blogArticleService.getById(queryDto.getArticleId()) == null) {
            throw new BlogException("查询不到相关日志");
        }
        Page queryPage = new Page<>(queryDto.getPageNo(), queryDto.getPageSize());
        List<BlogArticleComment> commentList = blogArticleCommentService.lambdaQuery()
                .eq(queryDto.getArticleId() != null, BlogArticleComment::getArticleId, queryDto.getArticleId())
                .eq(BlogArticleComment::getCommentType, queryDto.getArticleId() == null ? MyConstant.CommentType.type_1 : MyConstant.CommentType.type_2)
                .eq(BlogArticleComment::getIsEnable, MyConstant.Yes)
                .eq(BlogArticleComment::getParentId,0)
                .orderByDesc(BlogArticleComment::getCreateDate)
                .page(queryPage).getRecords();
        List<BlogCommentVo> res = commentList.stream().map(e -> {
                    BlogCommentVo vo = new BlogCommentVo();
                    BeanUtil.copyProperties(e, vo);
                    return vo;
                }
        ).collect(Collectors.toList());
        queryPage.setRecords(res);
        return new SuccessResponseData(queryPage);
    }
}
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticlecomment/entity/BlogArticleComment.java
New file
@@ -0,0 +1,138 @@
/*
Copyright [2020] [https://www.xiaonuo.vip]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
  http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
1.请不要删除和修改根目录下的LICENSE文件。
2.请不要删除和修改Snowy源码头部的版权声明。
3.请保留源码和相关描述文件的项目出处,作者声明等。
4.分发源码时候,请注明软件出处 https://gitee.com/xiaonuobase/snowy
5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/xiaonuobase/snowy
6.若您的项目无法满足以上几点,可申请商业授权,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
 */
package vip.xiaonuo.modular.blogarticlecomment.entity;
import cn.afterturn.easypoi.excel.annotation.Excel;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.util.Date;
/**
 * 文章评论
 *
 * @author inleft
 * @date 2022-03-01 14:00:53
 */
@Data
@TableName("blog_article_comment")
public class BlogArticleComment {
    /**
     * 自增id
     */
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    /**
     * 留言类型 1:留言板 2:日志评论
     */
    @Excel(name = "留言类型 1:留言板 2:日志评论")
    private Integer commentType;
    /**
     * 文章id主键
     */
    @Excel(name = "文章id主键")
    private Long articleId;
    /**
     * 访客id(随机字符)
     */
    @Excel(name = "访客id(随机字符)")
    private String visitorId;
    /**
     * 访客名称
     */
    @Excel(name = "访客名称")
    private String visitorNickName;
    /**
     * 访客邮箱
     */
    @Excel(name = "访客邮箱")
    private String visitorEmail;
    /**
     * 访客主页
     */
    @Excel(name = "访客主页")
    private String visitorHomePage;
    /**
     * 回复id
     */
    @Excel(name = "回复id")
    private Long replyId;
    /**
     * 父id (不为0则是子回复)
     */
    @Excel(name = "父id (不为0则是子回复)")
    private Long parentId;
    /**
     * 留言内容(500字内)
     */
    @Excel(name = "留言内容(500字内)")
    private String commentContent;
    /**
     * 是否已审核 0:否 1:是
     */
    @Excel(name = "是否已审核 0:否 1:是")
    private Integer isCheck;
    /**
     * 公开状态 1:公开 2:私密 3:密码授权
     */
    @Excel(name = "公开状态 1:公开 2:私密 3:密码授权")
    private Integer authStatus;
    @Excel(name = "是否接收回信 0:否 1:是")
    private Integer isReceiveCallback;
    /**
     * 是否启用 0:否 1是
     */
    @Excel(name = "是否启用 0:否 1是")
    private Integer isEnable;
    /**
     * 更新时间
     */
    @Excel(name = "更新时间", databaseFormat = "yyyy-MM-dd HH:mm:ss", format = "yyyy-MM-dd", width = 20)
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateDate;
    /**
     * 创建时间
     */
    @Excel(name = "创建时间", databaseFormat = "yyyy-MM-dd HH:mm:ss", format = "yyyy-MM-dd", width = 20)
    @TableField(fill = FieldFill.INSERT)
    private Date createDate;
}
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticlecomment/entity/BlogCommentVo.java
New file
@@ -0,0 +1,36 @@
package vip.xiaonuo.modular.blogarticlecomment.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Date;
import java.util.List;
@Data
@Accessors(chain = true)
public class BlogCommentVo {
    private Long id;
    private Long parentId;
    private Long replyId;
    private String visitorId;
    private String visitorNickName;
    private String visitorHomePage;
    private String commentContent;
    private String replyUserName;
    private String replyUserHomePage;
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createDate;
    private List<BlogCommentVo> replyList;
}
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticlecomment/enums/BlogArticleCommentExceptionEnum.java
New file
@@ -0,0 +1,64 @@
/*
Copyright [2020] [https://www.xiaonuo.vip]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
  http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
1.请不要删除和修改根目录下的LICENSE文件。
2.请不要删除和修改Snowy源码头部的版权声明。
3.请保留源码和相关描述文件的项目出处,作者声明等。
4.分发源码时候,请注明软件出处 https://gitee.com/xiaonuobase/snowy
5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/xiaonuobase/snowy
6.若您的项目无法满足以上几点,可申请商业授权,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
 */
package vip.xiaonuo.modular.blogarticlecomment.enums;
import vip.xiaonuo.core.annotion.ExpEnumType;
import vip.xiaonuo.core.exception.enums.abs.AbstractBaseExceptionEnum;
import vip.xiaonuo.core.factory.ExpEnumCodeFactory;
import vip.xiaonuo.sys.core.consts.SysExpEnumConstant;
/**
 * 文章评论
 *
 * @author inleft
 * @date 2022-03-01 14:00:53
 */
@ExpEnumType(module = SysExpEnumConstant.SNOWY_SYS_MODULE_EXP_CODE)
public enum BlogArticleCommentExceptionEnum implements AbstractBaseExceptionEnum {
    /**
     * 数据不存在
     */
    NOT_EXIST(1, "此数据不存在");
    private final Integer code;
    private final String message;
        BlogArticleCommentExceptionEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
    @Override
    public Integer getCode() {
        return ExpEnumCodeFactory.getExpEnumCode(this.getClass(), code);
    }
    @Override
    public String getMessage() {
        return message;
    }
}
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticlecomment/mapper/BlogArticleCommentMapper.java
copy from snowy-main/src/main/java/vip/xiaonuo/modular/blogfriendshiplink/param/BlogLinkVo.java copy to snowy-main/src/main/java/vip/xiaonuo/modular/blogarticlecomment/mapper/BlogArticleCommentMapper.java
File was copied from snowy-main/src/main/java/vip/xiaonuo/modular/blogfriendshiplink/param/BlogLinkVo.java
@@ -22,24 +22,16 @@
5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/xiaonuobase/snowy
6.若您的项目无法满足以上几点,可申请商业授权,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
 */
package vip.xiaonuo.modular.blogfriendshiplink.param;
package vip.xiaonuo.modular.blogarticlecomment.mapper;
import lombok.Data;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import vip.xiaonuo.modular.blogarticlecomment.entity.BlogArticleComment;
/**
 * 友情链接参数类
 * 文章评论
 *
 * @author inleft
 * @date 2022-02-17 15:05:44
 * @date 2022-03-01 14:00:53
 */
@Data
public class BlogLinkVo {
    private String groupName;
    private List<BlogFriendshipLinkVo> linkVoList;
public interface BlogArticleCommentMapper extends BaseMapper<BlogArticleComment> {
}
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticlecomment/mapper/mapping/BlogArticleCommentMapper.xml
New file
@@ -0,0 +1,5 @@
<?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="vip.xiaonuo.modular.blogarticlecomment.mapper.BlogArticleCommentMapper">
</mapper>
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticlecomment/param/BlogArticleCommentAddDto.java
New file
@@ -0,0 +1,112 @@
/*
Copyright [2020] [https://www.xiaonuo.vip]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
  http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
1.请不要删除和修改根目录下的LICENSE文件。
2.请不要删除和修改Snowy源码头部的版权声明。
3.请保留源码和相关描述文件的项目出处,作者声明等。
4.分发源码时候,请注明软件出处 https://gitee.com/xiaonuobase/snowy
5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/xiaonuobase/snowy
6.若您的项目无法满足以上几点,可申请商业授权,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
 */
package vip.xiaonuo.modular.blogarticlecomment.param;
import lombok.Data;
import vip.xiaonuo.core.pojo.base.param.BaseParam;
import javax.validation.constraints.*;
/**
 * 文章评论参数类
 *
 * @author inleft
 * @date 2022-03-01 14:00:53
 */
@Data
public class BlogArticleCommentAddDto extends BaseParam {
    /**
     * 自增id
     */
    @NotNull(message = "自增id不能为空,请检查id参数", groups = {edit.class, delete.class, detail.class})
    private Long id;
    /**
     * 留言类型 1:留言板 2:日志评论
     */
    @NotNull(message = "留言类型 1:留言板 2:日志评论不能为空,请检查commentType参数", groups = {add.class})
    private Integer commentType;
    /**
     * 回复id
     */
    private Long replyId;
    /**
     * 父id (不为0则是子回复)
     */
    private Long parentId;
    /**
     * 文章id主键
     */
    private Long articleId;
    /**
     * 访客id(随机字符)
     */
    @NotBlank(message = "访客id(随机字符)不能为空,请检查visitorId参数", groups = {add.class})
    private String visitorId;
    /**
     * 访客名称
     */
    @NotBlank(message = "访客名称不能为空,请检查visitorNickName参数", groups = {add.class, edit.class})
    private String visitorNickName;
    /**
     * 访客邮箱
     */
    @Pattern(regexp = "^$|^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z0-9]{2,6}$", message = "邮箱格式错误", groups = {add.class})
    private String visitorEmail;
    /**
     * 访客主页
     */
    @Pattern(regexp = "^$|^((https|http)?:\\/\\/)[^\\s]+", message = "主页格式错误", groups = {add.class})
    private String visitorHomePage;
    /**
     * 留言内容(500字内)
     */
    @NotBlank(message = "留言内容不能为空", groups = {add.class})
    private String commentContent;
    /**
     * 公开状态 1:公开 2:私密 3:密码授权
     */
    @Min(value = 1, message = "公开状态参数异常,请检查authStatus参数", groups = {add.class})
    @Max(value = 3, message = "公开状态参数异常,请检查authStatus参数", groups = {add.class})
    @NotNull(message = "公开状态不能为空,请检查authStatus参数", groups = {add.class})
    private Integer authStatus;
    /**
     * 是否接收回信
     */
    @NotNull(message = "是否接收回信为空", groups = {add.class})
    private Integer isReceiveMail;
}
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticlecomment/param/BlogArticleCommentParam.java
New file
@@ -0,0 +1,121 @@
/*
Copyright [2020] [https://www.xiaonuo.vip]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
  http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
1.请不要删除和修改根目录下的LICENSE文件。
2.请不要删除和修改Snowy源码头部的版权声明。
3.请保留源码和相关描述文件的项目出处,作者声明等。
4.分发源码时候,请注明软件出处 https://gitee.com/xiaonuobase/snowy
5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/xiaonuobase/snowy
6.若您的项目无法满足以上几点,可申请商业授权,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
 */
package vip.xiaonuo.modular.blogarticlecomment.param;
import lombok.Data;
import vip.xiaonuo.core.pojo.base.param.BaseParam;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* 文章评论参数类
 *
 * @author inleft
 * @date 2022-03-01 14:00:53
*/
@Data
public class BlogArticleCommentParam extends BaseParam {
    /**
     * 自增id
     */
    @NotNull(message = "自增id不能为空,请检查id参数", groups = {edit.class, delete.class, detail.class})
    private Long id;
    /**
     * 留言类型 1:留言板 2:日志评论
     */
    @NotNull(message = "留言类型 1:留言板 2:日志评论不能为空,请检查commentType参数", groups = {add.class})
    private Integer commentType;
    /**
     * 文章id主键
     */
    private Long articleId;
    /**
     * 访客id(随机字符)
     */
    @NotBlank(message = "访客id(随机字符)不能为空,请检查visitorId参数", groups = {add.class})
    private String visitorId;
    /**
     * 访客名称
     */
    @NotBlank(message = "访客名称不能为空,请检查visitorNickName参数", groups = {add.class, edit.class})
    private String visitorNickName;
    /**
     * 访客邮箱
     */
    private String visitorEmail;
    /**
     * 访客主页
     */
    private String visitorHomePage;
    /**
     * 回复id
     */
    private Long replyId;
    /**
     * 父id (不为0则是子回复)
     */
    private Long parentId;
    /**
     * 留言内容(500字内)
     */
    private String commentContent;
    /**
     * 是否已审核 0:否 1:是
     */
    private Integer isCheck;
    /**
     * 公开状态 1:公开 2:私密 3:密码授权
     */
    private Integer authStatus;
    /**
     * 是否启用 0:否 1是
     */
    private Integer isEnable;
    /**
     * 更新时间
     */
    private String updateDate;
    /**
     * 创建时间
     */
    private String createDate;
}
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticlecomment/param/BlogCommentQueryDto.java
New file
@@ -0,0 +1,22 @@
package vip.xiaonuo.modular.blogarticlecomment.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Min;
@Data
public class BlogCommentQueryDto {
    @Min(1)
    @ApiModelProperty(value = "pageSize", required = false, example = "10")
    private Integer pageSize = 5;
    @Min(1)
    @ApiModelProperty(value = "pageNo", required = true, example = "1")
    private Integer pageNo = 1;
    private Long articleId;
}
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticlecomment/service/BlogArticleCommentService.java
New file
@@ -0,0 +1,97 @@
/*
Copyright [2020] [https://www.xiaonuo.vip]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
  http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
1.请不要删除和修改根目录下的LICENSE文件。
2.请不要删除和修改Snowy源码头部的版权声明。
3.请保留源码和相关描述文件的项目出处,作者声明等。
4.分发源码时候,请注明软件出处 https://gitee.com/xiaonuobase/snowy
5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/xiaonuobase/snowy
6.若您的项目无法满足以上几点,可申请商业授权,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
 */
package vip.xiaonuo.modular.blogarticlecomment.service;
import com.baomidou.mybatisplus.extension.service.IService;
import vip.xiaonuo.core.pojo.page.PageResult;
import vip.xiaonuo.modular.blogarticlecomment.entity.BlogArticleComment;
import vip.xiaonuo.modular.blogarticlecomment.param.BlogArticleCommentParam;
import java.util.List;
/**
 * 文章评论service接口
 *
 * @author inleft
 * @date 2022-03-01 14:00:53
 */
public interface BlogArticleCommentService extends IService<BlogArticleComment> {
    /**
     * 查询文章评论
     *
     * @author inleft
     * @date 2022-03-01 14:00:53
     */
    PageResult<BlogArticleComment> page(BlogArticleCommentParam blogArticleCommentParam);
    /**
     * 文章评论列表
     *
     * @author inleft
     * @date 2022-03-01 14:00:53
     */
    List<BlogArticleComment> list(BlogArticleCommentParam blogArticleCommentParam);
    /**
     * 添加文章评论
     *
     * @author inleft
     * @date 2022-03-01 14:00:53
     */
    void add(BlogArticleCommentParam blogArticleCommentParam);
    /**
     * 删除文章评论
     *
     * @author inleft
     * @date 2022-03-01 14:00:53
     */
    void delete(List<BlogArticleCommentParam> blogArticleCommentParamList);
    /**
     * 编辑文章评论
     *
     * @author inleft
     * @date 2022-03-01 14:00:53
     */
    void edit(BlogArticleCommentParam blogArticleCommentParam);
    /**
     * 查看文章评论
     *
     * @author inleft
     * @date 2022-03-01 14:00:53
     */
     BlogArticleComment detail(BlogArticleCommentParam blogArticleCommentParam);
    /**
     * 导出文章评论
     *
     * @author inleft
     * @date 2022-03-01 14:00:53
     */
     void export(BlogArticleCommentParam blogArticleCommentParam);
}
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticlecomment/service/impl/BlogArticleCommentServiceImpl.java
New file
@@ -0,0 +1,156 @@
/*
Copyright [2020] [https://www.xiaonuo.vip]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
  http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
1.请不要删除和修改根目录下的LICENSE文件。
2.请不要删除和修改Snowy源码头部的版权声明。
3.请保留源码和相关描述文件的项目出处,作者声明等。
4.分发源码时候,请注明软件出处 https://gitee.com/xiaonuobase/snowy
5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/xiaonuobase/snowy
6.若您的项目无法满足以上几点,可申请商业授权,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
 */
package vip.xiaonuo.modular.blogarticlecomment.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import vip.xiaonuo.core.exception.ServiceException;
import vip.xiaonuo.core.factory.PageFactory;
import vip.xiaonuo.core.pojo.page.PageResult;
import vip.xiaonuo.core.util.PoiUtil;
import vip.xiaonuo.modular.blogarticlecomment.entity.BlogArticleComment;
import vip.xiaonuo.modular.blogarticlecomment.enums.BlogArticleCommentExceptionEnum;
import vip.xiaonuo.modular.blogarticlecomment.mapper.BlogArticleCommentMapper;
import vip.xiaonuo.modular.blogarticlecomment.param.BlogArticleCommentParam;
import vip.xiaonuo.modular.blogarticlecomment.service.BlogArticleCommentService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
 * 文章评论service接口实现类
 *
 * @author inleft
 * @date 2022-03-01 14:00:53
 */
@Service
public class BlogArticleCommentServiceImpl extends ServiceImpl<BlogArticleCommentMapper, BlogArticleComment> implements BlogArticleCommentService {
    @Override
    public PageResult<BlogArticleComment> page(BlogArticleCommentParam blogArticleCommentParam) {
        QueryWrapper<BlogArticleComment> queryWrapper = new QueryWrapper<>();
        if (ObjectUtil.isNotNull(blogArticleCommentParam)) {
            // 根据留言类型 1:留言板 2:日志评论 查询
            if (ObjectUtil.isNotEmpty(blogArticleCommentParam.getCommentType())) {
                queryWrapper.lambda().eq(BlogArticleComment::getCommentType, blogArticleCommentParam.getCommentType());
            }
            // 根据文章id主键 查询
            if (ObjectUtil.isNotEmpty(blogArticleCommentParam.getArticleId())) {
                queryWrapper.lambda().eq(BlogArticleComment::getArticleId, blogArticleCommentParam.getArticleId());
            }
            // 根据访客id(随机字符) 查询
            if (ObjectUtil.isNotEmpty(blogArticleCommentParam.getVisitorId())) {
                queryWrapper.lambda().eq(BlogArticleComment::getVisitorId, blogArticleCommentParam.getVisitorId());
            }
            // 根据访客名称 查询
            if (ObjectUtil.isNotEmpty(blogArticleCommentParam.getVisitorNickName())) {
                queryWrapper.lambda().like(BlogArticleComment::getVisitorNickName, blogArticleCommentParam.getVisitorNickName());
            }
            // 根据访客邮箱 查询
            if (ObjectUtil.isNotEmpty(blogArticleCommentParam.getVisitorEmail())) {
                queryWrapper.lambda().like(BlogArticleComment::getVisitorEmail, blogArticleCommentParam.getVisitorEmail());
            }
            // 根据访客主页 查询
            if (ObjectUtil.isNotEmpty(blogArticleCommentParam.getVisitorHomePage())) {
                queryWrapper.lambda().like(BlogArticleComment::getVisitorHomePage, blogArticleCommentParam.getVisitorHomePage());
            }
            // 根据是否已审核 0:否 1:是 查询
            if (ObjectUtil.isNotEmpty(blogArticleCommentParam.getIsCheck())) {
                queryWrapper.lambda().eq(BlogArticleComment::getIsCheck, blogArticleCommentParam.getIsCheck());
            }
            // 根据公开状态 1:公开 2:私密 3:密码授权 查询
            if (ObjectUtil.isNotEmpty(blogArticleCommentParam.getAuthStatus())) {
                queryWrapper.lambda().eq(BlogArticleComment::getAuthStatus, blogArticleCommentParam.getAuthStatus());
            }
            // 根据是否启用 0:否 1是 查询
            if (ObjectUtil.isNotEmpty(blogArticleCommentParam.getIsEnable())) {
                queryWrapper.lambda().eq(BlogArticleComment::getIsEnable, blogArticleCommentParam.getIsEnable());
            }
            // 根据创建时间 查询
            if (ObjectUtil.isNotEmpty(blogArticleCommentParam.getCreateDate())) {
                queryWrapper.lambda().gt(BlogArticleComment::getCreateDate, blogArticleCommentParam.getCreateDate());
            }
        }
        return new PageResult<>(this.page(PageFactory.defaultPage(), queryWrapper));
    }
    @Override
    public List<BlogArticleComment> list(BlogArticleCommentParam blogArticleCommentParam) {
        return this.list();
    }
    @Override
    public void add(BlogArticleCommentParam blogArticleCommentParam) {
        BlogArticleComment blogArticleComment = new BlogArticleComment();
        BeanUtil.copyProperties(blogArticleCommentParam, blogArticleComment);
        this.save(blogArticleComment);
    }
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void delete(List<BlogArticleCommentParam> blogArticleCommentParamList) {
        blogArticleCommentParamList.forEach(blogArticleCommentParam -> {
            this.removeById(blogArticleCommentParam.getId());
        });
    }
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void edit(BlogArticleCommentParam blogArticleCommentParam) {
        BlogArticleComment blogArticleComment = this.queryBlogArticleComment(blogArticleCommentParam);
        BeanUtil.copyProperties(blogArticleCommentParam, blogArticleComment);
        this.updateById(blogArticleComment);
    }
    @Override
    public BlogArticleComment detail(BlogArticleCommentParam blogArticleCommentParam) {
        return this.queryBlogArticleComment(blogArticleCommentParam);
    }
    /**
     * 获取文章评论
     *
     * @author inleft
     * @date 2022-03-01 14:00:53
     */
    private BlogArticleComment queryBlogArticleComment(BlogArticleCommentParam blogArticleCommentParam) {
        BlogArticleComment blogArticleComment = this.getById(blogArticleCommentParam.getId());
        if (ObjectUtil.isNull(blogArticleComment)) {
            throw new ServiceException(BlogArticleCommentExceptionEnum.NOT_EXIST);
        }
        return blogArticleComment;
    }
    @Override
    public void export(BlogArticleCommentParam blogArticleCommentParam) {
        List<BlogArticleComment> list = this.list(blogArticleCommentParam);
        PoiUtil.exportExcelWithStream("SnowyBlogArticleComment.xls", BlogArticleComment.class, list);
    }
}
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticletype/controller/BlogArticleTypeOutsideController.java
@@ -31,7 +31,7 @@
import vip.xiaonuo.core.enums.LogAnnotionOpTypeEnum;
import vip.xiaonuo.core.pojo.response.ResponseData;
import vip.xiaonuo.core.pojo.response.SuccessResponseData;
import vip.xiaonuo.modular.blogarticletype.param.BlogArticleTypeVo;
import vip.xiaonuo.modular.blogarticletype.entity.BlogArticleTypeVo;
import vip.xiaonuo.modular.blogarticletype.service.BlogArticleTypeService;
import javax.annotation.Resource;
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticletype/entity/BlogArticleTypeVo.java
File was renamed from snowy-main/src/main/java/vip/xiaonuo/modular/blogarticletype/param/BlogArticleTypeVo.java
@@ -22,7 +22,7 @@
5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/xiaonuobase/snowy
6.若您的项目无法满足以上几点,可申请商业授权,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
 */
package vip.xiaonuo.modular.blogarticletype.param;
package vip.xiaonuo.modular.blogarticletype.entity;
import lombok.Data;
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticletype/mapper/BlogArticleTypeMapper.java
@@ -26,7 +26,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import vip.xiaonuo.modular.blogarticletype.entity.BlogArticleType;
import vip.xiaonuo.modular.blogarticletype.param.BlogArticleTypeVo;
import vip.xiaonuo.modular.blogarticletype.entity.BlogArticleTypeVo;
import java.util.List;
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticletype/mapper/mapping/BlogArticleTypeMapper.xml
@@ -2,7 +2,7 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="vip.xiaonuo.modular.blogarticletype.mapper.BlogArticleTypeMapper">
    <select id="listCount" resultType="vip.xiaonuo.modular.blogarticletype.param.BlogArticleTypeVo">
    <select id="listCount" resultType="vip.xiaonuo.modular.blogarticletype.entity.BlogArticleTypeVo">
        SELECT
            t1.id,
            t1.type_name AS typeName,
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticletype/service/BlogArticleTypeService.java
@@ -28,7 +28,7 @@
import vip.xiaonuo.core.pojo.page.PageResult;
import vip.xiaonuo.modular.blogarticletype.entity.BlogArticleType;
import vip.xiaonuo.modular.blogarticletype.param.BlogArticleTypeParam;
import vip.xiaonuo.modular.blogarticletype.param.BlogArticleTypeVo;
import vip.xiaonuo.modular.blogarticletype.entity.BlogArticleTypeVo;
import java.util.List;
snowy-main/src/main/java/vip/xiaonuo/modular/blogarticletype/service/impl/BlogArticleTypeServiceImpl.java
@@ -38,7 +38,7 @@
import vip.xiaonuo.modular.blogarticletype.enums.BlogArticleTypeExceptionEnum;
import vip.xiaonuo.modular.blogarticletype.mapper.BlogArticleTypeMapper;
import vip.xiaonuo.modular.blogarticletype.param.BlogArticleTypeParam;
import vip.xiaonuo.modular.blogarticletype.param.BlogArticleTypeVo;
import vip.xiaonuo.modular.blogarticletype.entity.BlogArticleTypeVo;
import vip.xiaonuo.modular.blogarticletype.service.BlogArticleTypeService;
import java.util.List;
snowy-main/src/main/java/vip/xiaonuo/modular/blogfriendshiplink/controller/BlogLinkOutsideController.java
@@ -37,7 +37,7 @@
import vip.xiaonuo.core.pojo.response.SuccessResponseData;
import vip.xiaonuo.modular.blogfriendshiplink.entity.BlogFriendshipLink;
import vip.xiaonuo.modular.blogfriendshiplink.param.BlogFriendshipLinkVo;
import vip.xiaonuo.modular.blogfriendshiplink.param.BlogLinkVo;
import vip.xiaonuo.modular.blogfriendshiplink.entity.BlogLinkVo;
import vip.xiaonuo.modular.blogfriendshiplink.service.BlogFriendshipLinkService;
import vip.xiaonuo.sys.modular.dict.param.SysDictTypeParam;
import vip.xiaonuo.sys.modular.dict.service.SysDictTypeService;
snowy-main/src/main/java/vip/xiaonuo/modular/blogfriendshiplink/entity/BlogLinkVo.java
File was renamed from snowy-main/src/main/java/vip/xiaonuo/modular/blogfriendshiplink/param/BlogLinkVo.java
@@ -22,9 +22,10 @@
5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/xiaonuobase/snowy
6.若您的项目无法满足以上几点,可申请商业授权,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
 */
package vip.xiaonuo.modular.blogfriendshiplink.param;
package vip.xiaonuo.modular.blogfriendshiplink.entity;
import lombok.Data;
import vip.xiaonuo.modular.blogfriendshiplink.param.BlogFriendshipLinkVo;
import java.util.List;