SpringCloud+Vue3一个字段多个存储以及回显

news2024/11/15 22:56:59

♥️作者:小宋1021
🤵‍♂️个人主页:小宋1021主页
♥️坚持分析平时学习到的项目以及学习到的软件开发知识,和大家一起努力呀!!!
🎈🎈加油! 加油! 加油! 加油
🎈欢迎评论 💬点赞👍🏻 收藏 📂加关注+!


目录

场景:

存储过程:

数据库:

后端:

实体类:

CourseManageSaveReqVO:

CourseManageRespVO:

Mapper:

CourseManageServiceImpl实现类:

回显过程:

前端:

主要方法:

列表项:

全部代码:


场景:

新发布一个补课班的班级课程,班级上课的科目不一定是一个有可能是多个,这就需要一个字段存储多条数据,主要的修改都在实现类里,下面我们来看怎样实现。

数据库存储结果:

存储过程:

数据库:

按照自己的字段需求定义即可,我定义的是varchar

后端:

实体类:

多定义一个subject2[]字段是为了前端传值的时候好拼接,留着以后有用,存储的时候只需要一个String[]类型的subject字段即可。

    /**
     * 科目
     */
    private String subject;
    /**
     * 科目2
     */
    private String[] subject2;

CourseManageSaveReqVO:

同样是String[]类型的数组,为了存储。

 @Schema(description = "科目")
    private String[] subject;

CourseManageRespVO:

在控制回显的VO里也要回显subject2,前端需要拼接

    @Schema(description = "科目")
    @ExcelProperty("科目")
    private String subject;

    @Schema(description = "科目2")
    @ExcelProperty("科目2")
    private String[] subject2;

Mapper:

直接继承BaseMapperX方法即可。

/**
 * 课程管理 Mapper
 *
 * @author 平台管理员
 */
@Mapper
public interface CourseManageMapper extends BaseMapperX<CourseManageDO> {

}

Service层:

/**
 * 课程管理 Service 接口
 *
 * @author 平台管理员
 */
public interface CourseManageService {

    /**
     * 创建课程管理
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createCourseManage(@Valid CourseManageSaveReqVO createReqVO);



}

CourseManageServiceImpl实现类:

/**
 * 课程管理 Service 实现类
 *
 * @author 平台管理员
 */
@Service
@Validated
public class CourseManageServiceImpl implements CourseManageService {

    @Resource
    private CourseManageMapper courseManageMapper;

    @Override
    @LogRecord(type = TEACH_COURSE_MANAGE_TYPE, subType = TEACH_COURSE_MANAGE_SUB_TYPE, bizNo = "{{#teachCourseManage.id}}",
            success = TEACH_COURSE_MANAGE_CREATE_SUCCESS)
    public Long createCourseManage(CourseManageSaveReqVO createReqVO) {
        // 插入
        CourseManageDO courseManage = BeanUtils.toBean(createReqVO, CourseManageDO.class);
        String[] subjects = createReqVO.getSubject();
        courseManage.setSubject(String.join(",", subjects));
        courseManageMapper.insert(courseManage);

        // 3. 记录操作日志上下文
        LogRecordContext.putVariable("teachCourseManage", courseManage);

        // 返回
        return courseManage.getId();
    }

    @Override
    @LogRecord(type = TEACH_COURSE_MANAGE_TYPE, subType = TEACH_COURSE_MANAGE_UPDATE_SUB_TYPE, bizNo = "{{#updateReqVO.id}}",
            success = TEACH_COURSE_MANAGE_UPDATE_SUCCESS)
    public void updateCourseManage(CourseManageSaveReqVO updateReqVO) {
        // 校验存在
        validateCourseManageExists(updateReqVO.getId());

        CourseManageDO oldCourseManage = courseManageMapper.selectById(updateReqVO.getId());

        // 更新
        CourseManageDO updateObj = BeanUtils.toBean(updateReqVO, CourseManageDO.class);
        courseManageMapper.updateById(updateObj);

        // 3. 记录操作日志上下文
        LogRecordContext.putVariable(DiffParseFunction.OLD_OBJECT, BeanUtils.toBean(oldCourseManage, CourseManageSaveReqVO.class));
        LogRecordContext.putVariable("teachCourseManage", oldCourseManage);

    }

}

下面我们来拆解一下新增方法:

 CourseManageDO courseManage = BeanUtils.toBean(createReqVO, CourseManageDO.class);

这句话的作用是:

BeanUtils.toBean(createReqVO, CourseManageDO.class); 这行代码是将一个对象(createReqVO)的属性值复制到另一个对象(CourseManageDO的一个实例)的相应属性中。这个过程通常被称为“属性拷贝”或“Bean转换”。

这里的createReqVO是一个请求对象(Request Value Object),比如来自Web请求的表单数据或JSON数据经过反序列化后得到的对象。而CourseManageDO(Data Object)则是一个用于数据库操作或业务逻辑处理的数据对象。

 String[] subjects = createReqVO.getSubject();

定义了一个名叫subjects的String类型的数据,来获取createReqVO传过来的subject的值。

 courseManage.setSubject(String.join(",", subjects));

给courseManage实体类使用set方法赋值,并使用String.join方法拼接,这就使数据库存储的数据是2,1,0

courseManageMapper.insert(courseManage);

使用BaseMapperX的方法直接插入。

到这存储过程就结束了,要注意的是实体类的类型要保持一致,要是数组类型。

前端:

 <el-form-item label="科目" prop="subject">
        <el-select v-model="formData.subject" 
        multiple
        placeholder="请选择科目">
          <el-option
            v-for="dict in getIntDictOptions(DICT_TYPE.SUBJECT)"
            :key="dict.value"
            :label="dict.label"
            :value="dict.value"
          />
        </el-select>
      </el-form-item>

const formData = ref({
  id: undefined,
  courseName: undefined,
  courseType: undefined,
  chargeMethod: undefined,
  priceStandard: undefined,
  courseStatus: undefined,
  grade: undefined,
  subject: [],
  term: undefined,
  studentName: undefined,
  studentPhone: undefined,
  courseSource: undefined,
  courseApplicationScope: undefined,
  remark: undefined,
  deduceClassRules: undefined,
  operaName: undefined,
  operaTime: undefined,
  operaType: undefined,
  operaExplain: undefined,
  coursePrice: undefined,
  courseStudyTime: undefined,
  discount: undefined,
  giftCourseNumber: undefined,

})

回显过程:

前端:

我这里有一些是测试数据,有些数据没有填写完全,请大家忽略,只关注”科目“即可。

主要方法:

/** 查询列表 */
const getList = async () => {
  loading.value = true
  try {
    const data = await CourseManageApi.getCourseManagePage(queryParams)
    list.value = data.list
    total.value = data.total
    const subjectList = []
    const subjectList2 = []
    subjectList.value = getIntDictOptions(DICT_TYPE.SUBJECT)
    list.value.forEach((item) => {
      if (item.subject) {
        item.subject2 = []
        subjectList2.value = item.subject.split(',')
        subjectList.value.forEach(i => {
          subjectList2.value.forEach(e => {
            if (Number(e) === i.value) {
              console.log(item.subject2, typeof (item.subject2), 'asdsad')
              item.subject2.push(i.label)
            }
          })
        })
      }

    })

  } finally {
    loading.value = false
  }
}

    const subjectList = []
    const subjectList2 = []

这里定义了两个数组subjectList 用来接收后端传过来的subject的值,也就是存在数据库里的值,

subjectList2 用来去数据字典里查找匹配再进行回显

subjectList.value = getIntDictOptions(DICT_TYPE.SUBJECT)

把数据库存的值和数据字典里的值匹配再存到subjectList里

getIntDictOptions方法:

export const getIntDictOptions = (dictType: string): NumberDictDataType[] => {
  // 获得通用的 DictDataType 列表
  const dictOptions: DictDataType[] = getDictOptions(dictType)
  // 转换成 number 类型的 NumberDictDataType 类型
  // why 需要特殊转换:避免 IDEA 在 v-for="dict in getIntDictOptions(...)" 时,el-option 的 key 会告警
  const dictOption: NumberDictDataType[] = []
  dictOptions.forEach((dict: DictDataType) => {
    dictOption.push({
      ...dict,
      value: parseInt(dict.value + '')
    })
  })
  return dictOption
}

  list.value.forEach((item) => {
      if (item.subject) {
        item.subject2 = []
        subjectList2.value = item.subject.split(',')
        subjectList.value.forEach(i => {
          subjectList2.value.forEach(e => {
            if (Number(e) === i.value) {
              item.subject2.push(i.label)
            }
          })
        })
      }

    })

  }

这里用了两个forEach循环,item的箭头函数是vue3特有的语法,目的就是遍历传过来的值再与数据字典里的值一一匹配,匹配成功以后再通过push方法插入到subject2[]这个数组中,通过subject2进行回显

列表项:

 <el-table-column label="科目" align="center" prop="subject2" show-overflow-tooltip="true">

          <template #default="scope">
            <el-tag v-for="(item, index) in scope.row.subject2" style="margin-right: 5px" :key="index" size="small">
              {{ item }}
            </el-tag>
          </template>
        </el-table-column>

用el-tag和v-for遍历显示subject2数组中的每一个值,margin-right: 5px是为了每个科目之间有间距,show-overflow-tooltip="true"是隐藏显示, {{ item }}是插值表达式,插入到列表里。

全部代码:

<template>
  <div>
    <ContentWrap>
      <!-- 搜索工作栏 -->
      <el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
        <el-form-item label="学员姓名" prop="studentName">
          <el-input v-model="queryParams.studentName" placeholder="请输入学员姓名" clearable @keyup.enter="handleQuery"
            class="!w-240px" />
        </el-form-item>
        <el-form-item label="手机号" prop="studentPhone">
          <el-input v-model="queryParams.studentPhone" placeholder="请输入手机号" clearable @keyup.enter="handleQuery"
            class="!w-240px" />
        </el-form-item>
        <el-form-item label="课程来源" prop="courseSource">
          <el-select v-model="queryParams.courseSource" placeholder="请选择课程来源" clearable class="!w-240px">
            <el-option v-for="dict in getIntDictOptions(DICT_TYPE.COURSE_SOURCE)" :key="dict.value" :label="dict.label"
              :value="dict.value" />
          </el-select>
        </el-form-item>
        <el-form-item label="课程类型" prop="courseType">
          <el-select v-model="queryParams.courseType" placeholder="请选择课程类型" clearable class="!w-240px">
            <el-option v-for="dict in getIntDictOptions(DICT_TYPE.COURSE_TYPE)" :key="dict.value" :label="dict.label"
              :value="dict.value" />
          </el-select>
        </el-form-item>
        <el-form-item label="年级" prop="grade">
          <el-select v-model="queryParams.grade" placeholder="请选择年级" clearable class="!w-240px">
            <el-option v-for="dict in getIntDictOptions(DICT_TYPE.GRADE)" :key="dict.value" :label="dict.label"
              :value="dict.value" />
          </el-select>
        </el-form-item>
        <el-form-item label="科目" prop="subject">
          <el-select v-model="queryParams.subject" placeholder="请选择科目" clearable class="!w-240px">
            <el-option v-for="dict in getIntDictOptions(DICT_TYPE.SUBJECT)" :key="dict.value" :label="dict.label"
              :value="dict.value" />
          </el-select>
        </el-form-item>
        <el-form-item label="学期" prop="term">
          <el-select v-model="queryParams.term" placeholder="请选择学期" clearable class="!w-240px">
            <el-option v-for="dict in getIntDictOptions(DICT_TYPE.TERM)" :key="dict.value" :label="dict.label"
              :value="dict.value" />
          </el-select>
        </el-form-item>


        <el-form-item>
          <el-button @click="handleQuery">
            <Icon icon="ep:search" class="mr-5px" /> 搜索
          </el-button>
          <el-button @click="resetQuery">
            <Icon icon="ep:refresh" class="mr-5px" /> 重置
          </el-button>
          <el-button type="primary" plain @click="openForm('create')" v-hasPermi="['teach:course-manage:create']">
            <Icon icon="ep:plus" class="mr-5px" /> 新增
          </el-button>
        </el-form-item>
      </el-form>
    </ContentWrap>

    <!-- 列表 -->
    <ContentWrap>
      <el-table v-loading="loading" :data="list" :stripe="true">
        <el-table-column label="序号" type="index" header-align="center" align="center" width="60px" fixed />
        <el-table-column label="课程名称" align="center" prop="courseName" width="150px" />
        <el-table-column label="课程来源" align="center" prop="courseSource">
          <template #default="scope">
            <dict-tag :type="DICT_TYPE.COURSE_SOURCE" :value="scope.row.courseSource" />
          </template>
        </el-table-column>
        <el-table-column label="课程类型" align="center" prop="courseType">
          <template #default="scope">
            <dict-tag :type="DICT_TYPE.COURSE_TYPE" :value="scope.row.courseType" />
          </template>
        </el-table-column>
        <el-table-column label="收费方式" align="center" prop="chargeMethod">
          <template #default="scope">
            <dict-tag :type="DICT_TYPE.CHARGE_METHOD" :value="scope.row.chargeMethod" />
          </template>
        </el-table-column>
        <el-table-column label="定价标准" align="center" prop="priceStandard" />
        <el-table-column label="课程状态" align="center" prop="courseStatus">
          <template #default="scope">
            <dict-tag :type="DICT_TYPE.COURSE_STATUS" :value="scope.row.courseStatus" />
          </template>
        </el-table-column>
        <el-table-column label="年级" align="center" prop="grade" width="150px">
          <template #default="scope">
            <dict-tag :type="DICT_TYPE.GRADE" :value="scope.row.grade" />
          </template>
        </el-table-column>
        <el-table-column label="科目" align="center" prop="subject2" show-overflow-tooltip="true">

          <template #default="scope">
            <el-tag v-for="(item, index) in scope.row.subject2" style="margin-right: 5px" :key="index" size="small">
              {{ item }}
            </el-tag>
          </template>
        </el-table-column>
        <el-table-column label="学期" align="center" prop="term">
          <template #default="scope">
            <dict-tag :type="DICT_TYPE.TERM" :value="scope.row.term" />
          </template>
        </el-table-column>
        <el-table-column label="创建人" align="center" prop="creator">
          <template #default="scope">
            {{ userList.find((user) => user.id === scope.row.creator)?.nickname }}
          </template>
        </el-table-column>
        <el-table-column label="创建时间" align="center" prop="createTime" :formatter="dateFormatter" width="180px" />
        <el-table-column label="操作" align="center" fixed="right" width="200px">
          <template #default="scope">
            <el-button link type="primary" @click="openForm('update', scope.row.id)"
              v-hasPermi="['teach:course-manage:update']">
              编辑
            </el-button>
            <el-button link type="primary" @click="details('update', scope.row.id)" v-hasPermi="['study:plan:delete']">
              详情
            </el-button>
            <el-button link type="primary" @click="openForm('update', scope.row.id)"
              v-hasPermi="['teach:course-manage:update']">
              启用
            </el-button>
            <el-button link type="danger" @click="handleDelete(scope.row.id)"
              v-hasPermi="['teach:course-manage:delete']">
              停用
            </el-button>
            <!-- <el-button
            link
            type="danger"
            @click="handleDelete(scope.row.id)"
            v-hasPermi="['teach:course-manage:delete']"
          >
            删除
          </el-button> -->
          </template>
        </el-table-column>
      </el-table>
      <!-- 分页 -->
      <Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
        @pagination="getList" />
    </ContentWrap>
  </div>
  <!-- 表单弹窗:添加/修改 -->
  <CourseManageForm ref="formRef" @success="getList" />
  <!-- 表单弹窗:详情 -->
  <el-drawer v-model="drawer" title="详情" :direction="direction" v-if="drawer" size="71%" class="drawer"
    destory-on-close>
    <DetailForm ref="detailRef" :detailId="detailId" />
  </el-drawer>

</template>

<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE, getStrDictOptions } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { CourseManageApi, CourseManageVO } from '@/api/teach/coursemanage'
import DetailForm from '@/views/teach/coursemanagePlus/Index.vue'
import CourseManageForm from './CourseManageForm.vue'
import type { DrawerProps } from 'element-plus'
import { ref } from 'vue';
import * as UserApi from '@/api/system/user'
const userList = ref<UserApi.UserVO[]>([])

/** 课程管理 列表 */
defineOptions({ name: 'CourseManage' })

const message = useMessage() // 消息弹窗
const { t } = useI18n() // 国际化
const direction = ref<DrawerProps['direction']>('rtl')
const loading = ref(true) // 列表的加载中
const list = ref<CourseManageVO[]>([]) // 列表的数据
const total = ref(0) // 列表的总页数
const queryParams = reactive({
  pageNo: 1,
  pageSize: 10,
  courseType: undefined,
  grade: undefined,
  subject: undefined,
  term: undefined,
  studentName: undefined,
  studentPhone: undefined,
  courseSource: undefined,
})
const queryFormRef = ref() // 搜索的表单

/** 查询列表 */
const getList = async () => {
  loading.value = true
  try {
    const data = await CourseManageApi.getCourseManagePage(queryParams)
    list.value = data.list
    total.value = data.total
    const subjectList = []
    const subjectList2 = []
    subjectList.value = getIntDictOptions(DICT_TYPE.SUBJECT)
    list.value.forEach((item) => {
      if (item.subject) {
        item.subject2 = []
        subjectList2.value = item.subject.split(',')
        subjectList.value.forEach(i => {
          subjectList2.value.forEach(e => {
            if (Number(e) === i.value) {
              console.log(item.subject2, typeof (item.subject2), 'asdsad')
              item.subject2.push(i.label)
            }
          })
        })
      }

    })

  } finally {
    loading.value = false
  }
}

/** 搜索按钮操作 */
const handleQuery = () => {
  queryParams.pageNo = 1
  getList()
}
/** 查看详情 */
const detailRef = ref()
const drawer = ref(false)
const detailId = ref()
const details = (type: string, id?: number) => {
  drawer.value = true
  detailId.value = id
}



/** 重置按钮操作 */
const resetQuery = () => {
  queryFormRef.value.resetFields()
  handleQuery()
}

/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
  formRef.value.open(type, id)
}

/** 删除按钮操作 */
const handleDelete = async (id: number) => {
  try {
    // 删除的二次确认
    await message.delConfirm()
    // 发起删除
    await CourseManageApi.deleteCourseManage(id)
    message.success(t('common.delSuccess'))
    // 刷新列表
    await getList()
  } catch { }
}


/** 初始化 **/
onMounted(async () => {
  getList()
  userList.value = await UserApi.getSimpleUserList()
})
</script>
<style scoped lang="scss">
.drawer {
  width: 70% !important;
}

:deep(.el-table .cell) {
  overflow: visible;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1967251.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uni-app便携式蓝牙打印机esc指令改成vue3中使用

1、前言&#xff1a; 之前小程序是用vue2写的&#xff0c;现在要改成vue3&#xff0c;由于不能使用require导入js文件&#xff0c;所以vue2打印中使用到的文件需要改成inport 2、需要改的文件目录 主要是修改这三个文件&#xff0c;把require导入改成import 3、esc.js文件…

《Milvus Cloud向量数据库指南》——图像数据:ResNet50与图像及视频搜索的深度解析

图像数据:ResNet50与图像及视频搜索的深度解析 在当今信息爆炸的时代,图像和视频作为最直观、最富表现力的媒体形式之一,其搜索与检索技术显得尤为重要。无论是科研探索、艺术创作还是日常娱乐,人们越来越依赖于高效的图像和视频搜索工具来快速定位所需内容。其中,ResNet…

SpringCloud03

一、网关 网关&#xff1a;就是网络的关口&#xff0c;负责请求的路由&#xff0c;转发&#xff0c;身份校验。 在SpringCloud中网关的实现&#xff1a; SpringCloud Gateway 由SpringCloud官方出品 基于WebFlux响应式编程 无需调优即可获得优异性能 &#xff08;1&…

评估分类机器学习模型的指标

欢迎来到雲闪世界。一旦我们训练了一个监督机器学习模型来解决分类问题&#xff0c;如果这就是我们工作的结束&#xff0c;我们会很高兴&#xff0c;我们可以直接向他们输入新数据。我们希望它能正确地对所有内容进行分类。然而&#xff0c;实际上&#xff0c;模型做出的预测并…

Linux--应用层协议HTTP

HTTP协议 HTTP协议&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是互联网上应用最为广泛的一种网络协议&#xff0c;它基于TCP/IP通信协议来传送数据&#xff0c;规定了浏览器与服务器之间数据传输的规则&#xff0c;确保数据能够在网络源头…

C# Unity 面向对象补全计划 之 画UML类图(持续更新)

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 本系列旨在通过补全学习之后&#xff0c;给出任意类图都能实现并做到逻辑上严丝合缝 学会这套规则&#xff0c;并看完面向对象补全计划文章之后&#xff0c;可以尝试…

Linux---进程(3)---进程状态

目录 进程排队 进程状态 运行状态 阻塞状态 挂起状态 Linux内核具体进程状态 浅度睡眠状态 运行状态 深度睡眠状态 暂停状态 可被追踪的暂停状态 终止状态 僵尸状态 进程排队 进程不是一直在运行的&#xff0c;进程放在了CPU上&#xff0c;也不是一直运行的。 进程…

C++|设计模式(七)|⭐️观察者模式与发布/订阅模式,你分得清楚吗

本文内容来源于B站&#xff1a; 【「观察者模式」与「发布/订阅模式」&#xff0c;你分得清楚吗&#xff1f;】 文章目录 观察者模式&#xff08;Observer Pattern&#xff09;的代码优化观察者模式 与 发布订阅模式 他们是一样的吗&#xff1f;发布订阅模式总结 我们想象这样一…

深度学习 —— 个人学习笔记8(层和块、参数管理、自定义层及读写文件)

声明 本文章为个人学习使用&#xff0c;版面观感若有不适请谅解&#xff0c;文中知识仅代表个人观点&#xff0c;若出现错误&#xff0c;欢迎各位批评指正。 十五、层和块 nn.Sequential()   nn.Sequential() 是一个序列容器&#xff0c;用于搭建神经网络的模块按照被传入构…

6-1 从全连接层到卷积

我们之前讨论的多层感知机十分适合处理表格数据&#xff0c;其中行对应样本&#xff0c;列对应特征。 对于表格数据&#xff0c;我们寻找的模式可能涉及特征之间的交互&#xff0c;但是我们不能预先假设任何与特征交互相关的先验结构。 此时&#xff0c;多层感知机可能是最好的…

程序员面试题------N皇后问题算法实现

N皇后问题是一个著名的计算机科学问题&#xff0c;它要求在NN的棋盘上放置N个皇后&#xff0c;使得它们之间不能相互攻击&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上。这个问题可以看作是一个回溯算法问题&#xff0c;通过逐步尝试不同的放置位置&#xf…

手持气象设备:掌握天气的便捷伙伴

在这个快速变化的时代&#xff0c;手持气象设备成为了我们日常生活中重要的小帮手。它小巧轻便&#xff0c;易于携带&#xff0c;让我们随时随地都能掌握天气变化&#xff0c;为出行、户外活动提供准确参考。 手持气象设备内置了高精度传感器&#xff0c;能够迅速感知并显示当前…

PCB学习

教你怎么检查电路原理图_原理图检视主要内容-CSDN博客https://blog.csdn.net/chenhuanqiangnihao/article/details/113664734

继全球蓝屏后,微软 Azure 云服务因安全错误导致全球宕机

7月30日&#xff0c;微软Azure云服务全球宕机约8小时。该事件由一次DDoS攻击引起&#xff0c;成功触发系统保护机制&#xff0c;但这些防御机制中的实施错误反而进一步放大了影响&#xff0c;最终造成一次大宕机事件。据英国广播公司报道&#xff0c;此次中断持续了大约 10 个小…

5步教你学会古诗词生成AI绘画

本文由 ChatMoney团队出品 首先&#xff0c;打开时下最热门的两个AI工具&#xff0c;mj和chatgpt这两个都是我们在创作AI古诗词绘画中一定要用到的&#xff0c;这里我用的是chatmoneyAI系统 第一步&#xff1a;我们要先使用ChatGPT来生成我们所想要展示古诗的关键词。那么我们…

代码随想录算法训练营第二十一天| 39. 组合总和, 40.组合总和II, 131.分割回文串

今天是回溯算法学习的第二天&#xff0c;主要的学习内容包括&#xff1a;1.组合问题的重复使用 2.组合问题的去重 3.分割问题的处理方法。 39. 组合总和 题目链接&#xff1a;39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 这个组合问题的特点是&#xff0c;集合内的…

Java:基于TextRank算法的自动摘要(自动生成事件摘要)

TextRank 是一种用于文本摘要的自然语言处理算法。它的工作原理类似于 Google 搜索引擎的 PageRank 算法&#xff0c;即根据文本中每个单词出现的频率和被引用的次数来评估它的重要性。 所谓自动摘要&#xff0c;就是从文章中自动抽取关键句。何谓关键句&#xff1f;人类的理解…

最好用的复制粘贴软件pastemate功能简介

这应当是windows下最好用的复制粘贴软件&#xff0c;遥遥领先的复制粘贴软件。 效增PasteMate - 下载页面 windows下界面最优美&#xff0c;操作最方便的复制粘贴神器&#xff0c;学生党论文必备&#xff0c;效率神器 pastemate 1.搜索功能&#xff0c;能够按文本、图片、文件…

C# 构建观测者模式(或者为订阅者模型)

前言&#xff1a; 观测者模型的基本理念&#xff0c;就是&#xff0c;我有一个公共的事件&#xff0c;定义好他的事件的触发、数据接口。然后&#xff0c;通过增加订阅者&#xff08;实例&#xff09;来订阅这个事件的&#xff0c;或者说观察这个事件。如果事件发生&#xff0…

软件测试的挑战和压力

软件测试过程中可能会遇到很多挑战&#xff0c;比如&#xff1a; 1. 需求不明确或不稳定。如果需求文档不完整、不清晰或不一致&#xff0c;或者需求在开发过程中频繁变更&#xff0c;那么测试人员就很难设计和执行有效的测试用例&#xff0c;也很难判断测试结果是否符合预期。…