du
2025-04-18 b0e77ad9ca41ae80121fe995a1f0f00e770809e4
片头片尾
已添加2个文件
327 ■■■■■ 文件已修改
easegen-front/src/api/system/file/index.ts 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
easegen-front/src/views/File/index.vue 305 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
easegen-front/src/api/system/file/index.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
import request from '@/config/axios'
// æŸ¥è¯¢ç‰‡å¤´ç‰‡å°¾
export const listFile = (params: PageParam) => {
  return request.get({ url: '/digitalcourse/titles-trailer/page', params })
}
// æŸ¥è¯¢ç‰‡å¤´ç‰‡å°¾è¯¦æƒ…
export const getFile = (id: number) => {
  return request.get({ url: '/digitalcourse/titles-trailer/get?id=' + id })
}
// æ–°å¢žç‰‡å¤´ç‰‡å°¾
export const createFile = (data: any) => {
  return request.post({ url: '/digitalcourse/titles-trailer/create', data })
}
// ä¿®æ”¹ç‰‡å¤´ç‰‡å°¾
export const updateFile = (data: any) => {
  return request.put({ url: '/digitalcourse/titles-trailer/update', data })
}
// åˆ é™¤ç‰‡å¤´ç‰‡å°¾
export const deleteFile = (id: number) => {
  return request.delete({ url: '/digitalcourse/titles-trailer/delete?id=' + id })
}
easegen-front/src/views/File/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,305 @@
<template>
  <div class="app-container">
    <!-- æœç´¢è¡¨å• -->
    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
      <el-form-item label="文件名" prop="fileName">
        <el-input
          v-model="queryParams.name"
          placeholder="请输入文件名"
          clearable
          size="default"
          @keyup.enter="handleQuery"
        />
      </el-form-item>
      <el-form-item>
        <el-button type="primary" size="default" @click="handleQuery">搜索</el-button>
        <el-button size="default" @click="resetQuery">重置</el-button>
      </el-form-item>
    </el-form>
    <!-- æ–°å¢žæŒ‰é’® -->
    <el-row :gutter="10" class="mb8">
      <el-col :span="1.5">
        <el-button
          type="primary"
          size="default"
          @click="handleAdd"
        >新增</el-button>
      </el-col>
    </el-row>
    <!-- è¡¨æ ¼ -->
    <el-table v-loading="loading" :data="fileList" border>
      <el-table-column type="index" label="序号" align="center" width="80" />
      <el-table-column label="文件名" prop="name" :show-overflow-tooltip="true" align="center" />
      <el-table-column label="文件类别" prop="type" align="center">
        <template #default="scope">
          {{ scope.row.type === VIDEO_TYPE.HEAD ? '片头' : '片尾' }}
        </template>
      </el-table-column>
      <el-table-column label="创建人" prop="creatorName" align="center" />
      <el-table-column label="创建时间" prop="createTime" align="center">
        <template #default="scope">
          <span>{{ parseTime(scope.row.createTime) }}</span>
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
        <template #default="scope">
          <el-button
            size="mini"
            type="text"
            icon="el-icon-download"
            @click="handleDownload(scope.row.url,scope.row.name)"
          >下载</el-button>
          <el-button
            size="mini"
            type="text"
            icon="el-icon-edit"
            @click="handleUpdate(scope.row)"
          >修改</el-button>
          <el-button
            size="mini"
            type="text"
            icon="el-icon-delete"
            @click="handleDelete(scope.row)"
            style="color: #F56C6C"
          >删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <!-- åˆ†é¡µ -->
    <pagination
      v-show="total>0"
      :total="total"
      v-model:page="queryParams.pageNo"
      v-model:limit="queryParams.pageSize"
      @pagination="getList"
    />
    <!-- æ–°å¢žå¼¹çª— -->
    <el-dialog :title="dialogTitle" v-model="open" width="40%" append-to-body>
      <el-form ref="formRef" :model="form" :rules="rules" label-width="80px">
        <el-form-item label="文件名" prop="name">
          <el-input v-model="form.name" placeholder="请输入文件名" />
        </el-form-item>
        <el-form-item label="文件类别" prop="type">
          <el-select v-model="form.type" placeholder="请选择文件类别">
            <el-option label="片头" :value="VIDEO_TYPE.HEAD" />
            <el-option label="片尾" :value="VIDEO_TYPE.TAIL" />
          </el-select>
        </el-form-item>
        <el-form-item label="上传文件" prop="url">
          <UploadFile v-model="form.url" :fileType="['mp4']" :limit="1" @on-success="handleFileSuccess('videoUrl', $event)"/>
        </el-form-item>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" @click="submitForm">ç¡® å®š</el-button>
          <el-button @click="cancel">取 æ¶ˆ</el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>
<script lang="ts" setup>
import { ref, reactive, onMounted } from 'vue'
import type { FormInstance } from 'element-plus'
import  * as DigitalHumansApi from '@/api/system/file/index'
import dayjs from 'dayjs'
const message = useMessage() // æ¶ˆæ¯å¼¹çª—
// è§†é¢‘类别常量
const VIDEO_TYPE = {
  HEAD: '1', // ç‰‡å¤´
  TAIL: '2'  // ç‰‡å°¾
}
interface FileItem {
  id?: number
  name: string
  type: string
  createBy?: string
  url: string
}
interface QueryParams {
  pageNo: number
  pageSize: number
  name?: string
}
// é®ç½©å±‚
const loading = ref(true)
// æ˜¾ç¤ºæœç´¢æ¡ä»¶
const showSearch = ref(true)
// æ€»æ¡æ•°
const total = ref(0)
// æ–‡ä»¶åˆ—表
const fileList = ref<FileItem[]>([])
// æŸ¥è¯¢å‚æ•°
const queryParams = reactive<QueryParams>({
  pageNo: 1,
  pageSize: 10,
  name: undefined
})
// è¡¨å•引用
const formRef = ref<FormInstance>()
// æ–°å¢žå¼¹çª—
const open = ref(false)
const dialogTitle = ref('新增文件')
const form = reactive<FileItem>({
  id: undefined,
  name: '',
  url: '',
  type: '',
  createBy: undefined
})
const rules = reactive({
  name: [
    { required: true, message: "文件名不能为空", trigger: "blur" }
  ],
  type: [
    { required: true, message: "请选择文件类别", trigger: "change" }
  ],
  url: [
    { required: true, message: "请上传文件", trigger: "change" }
  ]
})
// æ–°å¢žæŒ‰é’®æ“ä½œ
const handleAdd = () => {
  open.value = true
}
// å–消按钮
const cancel = () => {
  open.value = false
  reset()
}
// è¡¨å•重置
const reset = () => {
  form.id = undefined
  form.name = ''
  form.url = ''
  form.type = ''
  form.createBy = undefined
  dialogTitle.value = '新增文件'
}
// æäº¤æŒ‰é’®
const submitForm = async () => {
  if (!formRef.value) return
  try {
    await formRef.value.validate()
    // éªŒè¯é€šè¿‡ï¼Œæ‰§è¡Œæäº¤æ“ä½œ
    let res
    if (form.id) {
      // ä¿®æ”¹æ“ä½œ
      res = await DigitalHumansApi.updateFile(form)
    } else {
      // æ–°å¢žæ“ä½œ
      res = await DigitalHumansApi.createFile(form)
    }
    console.log(res)
    open.value = false
    if (res) {
      message.success(form.id ? "修改成功" : "新增成功")
      getList()
    }
  } catch (error) {
    // éªŒè¯å¤±è´¥ï¼Œæ˜¾ç¤ºé”™è¯¯ä¿¡æ¯
    message.error("请填写完整信息")
  }
}
const handleFileSuccess = (fileType,response) => {
  if (fileType === 'videoUrl') {
    form.url = response.data;
  }
};
// æŸ¥è¯¢æ–‡ä»¶åˆ—表
const getList = async () => {
  loading.value = true
  try {
    const data = await DigitalHumansApi.listFile(queryParams)
    console.log(data)
    fileList.value = data.list
    total.value = data.total
  } finally {
    loading.value = false
  }
}
// æœç´¢æŒ‰é’®æ“ä½œ
const handleQuery = () => {
  queryParams.pageNo = 1
  getList()
}
// é‡ç½®æŒ‰é’®æ“ä½œ
const resetQuery = () => {
  queryParams.name = undefined
  handleQuery()
}
// ä¿®æ”¹æŒ‰é’®æ“ä½œ
const handleUpdate = (row: FileItem) => {
  form.id = row.id
  form.name = row.name || ''
  form.url = row.url || ''
  form.type = row.type
  form.createBy = row.createBy
  dialogTitle.value = '修改文件'
  open.value = true
}
// åˆ é™¤æŒ‰é’®æ“ä½œ
const handleDelete = async (row: FileItem) => {
  await message.delConfirm()
  if (row.id) {
    const res = await DigitalHumansApi.deleteFile(row.id)
    if (res) {
      message.success("删除成功")
      getList()
    }
  }
}
// ä¸‹è½½æŒ‰é’®æ“ä½œ
const handleDownload = (url, filename) => {
  if (!url) {
    message.warning("未找到资源文件!")
    return
  }
  console.log(url,filename)
  const link = document.createElement('a')
  link.href = url
  link.download = filename || 'download'
  link.target = '_blank'
  document.body.appendChild(link)
  link.click()
  document.body.removeChild(link)
}
// æ ¼å¼åŒ–æ—¶é—´
const parseTime = (time: number) => {
  return dayjs(time).format('YYYY-MM-DD HH:mm:ss')
}
onMounted(() => {
  getList()
})
</script>
<style scoped>
.app-container {
  padding: 20px;
}
.mb8 {
  margin-bottom: 8px;
}
</style>