康鲁杰
2025-05-30 45b5f1580ef43a8eb881d2e2efe7e8821753f510
Merge remote-tracking branch 'origin/master'
已修改5个文件
已添加2个文件
411 ■■■■ 文件已修改
easegen-front/src/assets/imgs/bei5.png 补丁 | 查看 | 原始文档 | blame | 历史
easegen-front/src/assets/imgs/bei6-1.png 补丁 | 查看 | 原始文档 | blame | 历史
easegen-front/src/views/Login/Login.vue 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
easegen-front/src/views/Login/components/LoginForm.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
easegen-front/src/views/chooseTemplate/index.vue 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
easegen-front/src/views/digitalcourse/template/TemplateForm.vue 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
easegen-front/src/views/digitalcourse/template/index.vue 270 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
easegen-front/src/assets/imgs/bei5.png
easegen-front/src/assets/imgs/bei6-1.png
easegen-front/src/views/Login/Login.vue
@@ -1,9 +1,9 @@
<template>
  <div class="bei">
      <div class="">
      <div class="BeiArea">
        <!-- 左侧图片 -->
         <div class="Left-img" >
            <img src="@/assets/imgs/bei4.png" alt=""/>
         <div class="Left-img"  >
            <img src="@/assets/imgs/bei6-1.png" alt=""/>
         </div>
        <!-- 右边的登录界面 -->
        <Transition appear enter-active-class="animate__animated animate__bounceInRight">
@@ -25,7 +25,6 @@
</template>
<script lang="ts" setup>
import { underlineToHump } from '@/utils'
import { useDesign } from '@/hooks/web/useDesign'
import { useAppStore } from '@/store/modules/app'
import { ThemeSwitch } from '@/layout/components/ThemeSwitch'
@@ -58,28 +57,27 @@
.bei{
  width: 100%;
  height: 100%;
  background-image: url('@/assets/imgs/bei3.png');
  background-size: 100% 100%;
  background-repeat: no-repeat;
  background-color: #061C43;
}
.form-box{
  width: 25%;
.bei .BeiArea{
  width: 100%;
  height: 100%;
  display: flex;
  justify-content: space-around;
  align-items: center;
}
.bei .BeiArea .form-box{
  width: 30%;
  padding: 20px;
  box-sizing: border-box;
  background: #fff;
  float: right;
  margin-top: 30vh;
  margin-right: 10vw;
}
.Left-img{
  float: left;
  width: 50%;
  margin-top: 4vh;
  margin-left: 60px;
.bei .BeiArea .Left-img{
  width: 677px;
}
.Left-img img{
.bei .BeiArea .Left-img img{
  width: 100%;
}
@@ -87,10 +85,6 @@
  .form-box{
    width: 80%;
    float: left;
    margin-left: 10%;
    margin-right: 0;
    margin-top: calc( 50vh - 100px );
  }
  .Left-img{
easegen-front/src/views/Login/components/LoginForm.vue
@@ -59,7 +59,7 @@
              </el-checkbox>
            </el-col>
            <el-col :offset="6" :span="12">
              <el-link style="float: right" type="primary">{{ t('login.forgetPassword') }}</el-link>
              <!-- <el-link style="float: right" type="primary">{{ t('login.forgetPassword') }}</el-link> -->
            </el-col>
          </el-row>
        </el-form-item>
@@ -85,13 +85,13 @@
      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
        <el-form-item>
          <el-row :gutter="5" justify="space-between" style="width: 100%">
            <el-col :span="12">
            <!-- <el-col :span="12">
              <XButton
                :title="t('login.btnMobile')"
                class="w-[100%]"
                @click="setLoginState(LoginStateEnum.MOBILE)"
              />
            </el-col>
            </el-col> -->
<!--            <el-col :span="8">-->
<!--              <XButton-->
<!--                :title="t('login.btnQRCode')"-->
@@ -99,7 +99,7 @@
<!--                @click="setLoginState(LoginStateEnum.QR_CODE)"-->
<!--              />-->
<!--            </el-col>-->
            <el-col :span="12">
            <el-col :span="24">
              <XButton
                :title="t('login.btnRegister')"
                class="w-[100%]"
easegen-front/src/views/chooseTemplate/index.vue
@@ -488,6 +488,17 @@
      <div class="template-box template-right" v-if="showTemplateTool">
        <div class="tabs-2"> </div>
        <div class="template-list">
          <div class="tabs-1">
            <div
              class="tabs-item"
              v-for="item in tabs4"
              :key="item.itemValue"
              @click="tabs4Click(item)"
            >
              <div>{{ item.itemName }}</div>
              <span v-if="tabs4ActiveNum == item.itemValue"></span>
            </div>
          </div>
          <div
            class="template-item"
            v-for="(template, index) in templates"
@@ -757,10 +768,25 @@
    itemValue: '2'
  }
]
const tabs4 = [
  {
    itemName: t('我的'),
    itemValue: '2'
  },
  {
    itemName: t('模板库'),
    itemValue: '1'
  }
]
const tabs4ActiveNum = ref('2')
const tabs1Click = (item) => {
  tabs1ActiveNum.value = item.itemValue
  getList()
}
const tabs4Click = (item) => {
  tabs4ActiveNum.value = item.itemValue
  queryParams1.zg=tabs4ActiveNum.value
  getList1()
}
const tabs2Click = (item) => {
@@ -834,8 +860,11 @@
  if (item.name == t('courseCenter.digitalPeople')) {
    tabs1ActiveNum.value = '0'
    getList()
  }else if (item.name == t('courseCenter.template')) {
    tabs4ActiveNum.value = '2'
    queryParams1.zg=tabs4ActiveNum.value
    getList1()
  }
  showHeadImageTool.value = item.name === t('courseCenter.background')
  showTemplateTool.value = item.name === t('courseCenter.template')
  showDigitalHumanTool.value = item.name === t('courseCenter.digitalPeople')
@@ -1193,7 +1222,11 @@
  gender: '',
  posture: ''
})
const queryParams1 = reactive({
  pageNo: 1,
  pageSize: 100,
  zg:''
})
const selectHost = ref(null)
const getList = async () => {
@@ -1854,9 +1887,22 @@
    uploadFileObj.size = pageInfo ? pageInfo.docInfo.fileSize : ''
  }
}
const getList1 = async () => {
  const data = await TemplateApi.getTemplatePage(queryParams1)
  if (data) {
    TEMPLATE_PRESETS.value = data.list.map((item) => ({
      ...item,
      showBackground: item.showBackground === 1,
      showDigitalHuman: item.showDigitalHuman === 1,
      showPpt: item.showPpt === 1
    }))
    templates.value = TEMPLATE_PRESETS.value.map((template) => cloneDeep(template))
    selectTemplate.value = cloneDeep(templates.value[0])
  }
}
onMounted(async () => {
  let data = await TemplateApi.getTemplatePage(queryParams)
  let data = await TemplateApi.getTemplatePage(queryParams1)
  TEMPLATE_PRESETS.value = data.list.map((item) => ({
    ...item,
    showBackground: item.showBackground === 1,
@@ -2171,14 +2217,14 @@
      border-bottom: 1px solid #ebeef5;
      .tabs-item {
        width: 30px;
        width: 50px;
        font-size: 14px;
        text-align: center;
        cursor: pointer;
        span {
          display: block;
          width: 30px;
          width: 50px;
          height: 2px;
          margin-top: 5px;
          background: #409eff;
easegen-front/src/views/digitalcourse/template/TemplateForm.vue
@@ -119,6 +119,16 @@
          </el-form-item>
        </el-col>
      </el-row>
      <el-row v-if="ishasAdminRole==true">
        <el-col :span="12">
          <el-form-item label="模板类型" prop="zg">
            <el-select v-model="formData.zg">
              <el-option label="公用模板" :value="1">公用模板</el-option>
              <el-option label="我的模板" :value="2">我的模板</el-option>
            </el-select>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="12">
          <el-form-item :label="t('template.backgroundImage')" prop="bgImage">
@@ -131,6 +141,7 @@
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
    <template #footer>
      <el-button @click="submitForm" type="primary" :disabled="formLoading">{{ t('common.ok') }}</el-button>
@@ -141,6 +152,7 @@
<script setup lang="ts">
import { TemplateApi, TemplateVO } from '@/api/digitalcourse/template'
import { DICT_TYPE, getIntDictOptions, getStrDictOptions } from '@/utils/dict'
import {getUserProfile} from "@/api/system/user/profile";
/** 模板 表单 */
defineOptions({ name: 'TemplateForm' })
@@ -181,15 +193,27 @@
  humanH: [{ required: true, message: t('template.digitalPeopleHeight') + t('common.notEmpty'), trigger: 'blur' }],
  humanX: [{ required: true, message: t('template.topPositionDigitalPeople') + t('common.notEmpty'), trigger: 'blur' }],
  humanY: [{ required: true, message: t('template.leftPositionDigitalPeople') + t('common.notEmpty'), trigger: 'blur' }],
  zg: [{ required: true, message: '模板类型', trigger: 'blur' }],
})
const formRef = ref() // 表单 Ref
let ishasAdminRole = ref(false)
let userInfo = ref()
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
  dialogVisible.value = true
  dialogTitle.value = t('action.' + type)
  formType.value = type
  //获取当前登录人的信息
   userInfo.value = await getUserProfile()
  let hasAdminRole = userInfo.value.roles.some(role => role.name === '数字人管理员')
  console.log(hasAdminRole)
  resetForm()
  if (hasAdminRole) {
    ishasAdminRole=true
  }else {
    ishasAdminRole=false
    formData.value.zg = '2'
  }
  // 修改时,设置数据
  if (id) {
    formLoading.value = true
@@ -250,13 +274,14 @@
    showPpt: undefined,
    pptW: undefined,
    pptH: undefined,
    pptX: undefined,
    pptY: undefined,
    bgImage: undefined,
    pptX: '40',
    pptY: '77',
    humanW: undefined,
    humanH: undefined,
    humanX: undefined,
    humanY: undefined,
    bgImage: undefined,
    humanX: '349',
    humanY: '92',
    zg:1,
  }
  formRef.value?.resetFields()
}
easegen-front/src/views/digitalcourse/template/index.vue
@@ -45,87 +45,178 @@
  <!-- 列表 -->
  <ContentWrap>
    <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
      <el-table-column :label="t('table.index')" align="center" type='index' width="60"/>
      <el-table-column :label="t('template.name')" align="center" prop="templateName" />
      <el-table-column :label="t('template.isShowBackground')" align="center" prop="showBackground" >
        <template #default="scope">
          <dict-tag :type="DICT_TYPE.IS_OR_NOT" :value="scope.row.showBackground" />
        </template>
      </el-table-column>
      <el-table-column :label="t('template.isShowDigitalPeople')" align="center" prop="showDigitalHuman" >
        <template #default="scope">
          <dict-tag :type="DICT_TYPE.IS_OR_NOT" :value="scope.row.showDigitalHuman" />
        </template>
      </el-table-column>
      <el-table-column :label="t('template.isShowPPt')" align="center" prop="showPpt" >
        <template #default="scope">
          <dict-tag :type="DICT_TYPE.IS_OR_NOT" :value="scope.row.showPpt" />
        </template>
      </el-table-column>
<!--      <el-table-column label="ppt宽" align="center" prop="pptW" />
      <el-table-column label="ppt高" align="center" prop="pptH" />
      <el-table-column label="ppt距离顶部位置" align="center" prop="pptX" />
      <el-table-column label="ppt距离左侧位置" align="center" prop="pptY" />
      <el-table-column label="数字人宽" align="center" prop="humanW" />
      <el-table-column label="数字人高" align="center" prop="humanH" />
      <el-table-column label="数字人距离顶部位置" align="center" prop="humanX" />
      <el-table-column label="数字人距离左侧位置" align="center" prop="humanY" />-->
      <el-table-column label="背景图片" align="center" prop="bgImage">
        <template #default="scope">
          <el-image
            :src="scope.row.bgImage"
            :preview-src-list="[scope.row.bgImage]"
            fit="cover"
            preview-teleported
    <el-tabs v-model="activeName" class="demo-tabs" @click="iszg">
      <el-tab-pane label="我的模板" name="first">
        <el-table :default-sort="{ prop: 'createTime', order: 'descending' }" v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
          <el-table-column :label="t('table.index')" align="center" type='index' width="60"/>
          <el-table-column :label="t('template.name')" align="center" prop="templateName" />
          <el-table-column :label="t('template.isShowBackground')" align="center" prop="showBackground" >
            <template #default="scope">
              <dict-tag :type="DICT_TYPE.IS_OR_NOT" :value="scope.row.showBackground" />
            </template>
          </el-table-column>
          <el-table-column :label="t('template.isShowDigitalPeople')" align="center" prop="showDigitalHuman" >
            <template #default="scope">
              <dict-tag :type="DICT_TYPE.IS_OR_NOT" :value="scope.row.showDigitalHuman" />
            </template>
          </el-table-column>
          <el-table-column :label="t('template.isShowPPt')" align="center" prop="showPpt" >
            <template #default="scope">
              <dict-tag :type="DICT_TYPE.IS_OR_NOT" :value="scope.row.showPpt" />
            </template>
          </el-table-column>
          <!--      <el-table-column label="ppt宽" align="center" prop="pptW" />
                <el-table-column label="ppt高" align="center" prop="pptH" />
                <el-table-column label="ppt距离顶部位置" align="center" prop="pptX" />
                <el-table-column label="ppt距离左侧位置" align="center" prop="pptY" />
                <el-table-column label="数字人宽" align="center" prop="humanW" />
                <el-table-column label="数字人高" align="center" prop="humanH" />
                <el-table-column label="数字人距离顶部位置" align="center" prop="humanX" />
                <el-table-column label="数字人距离左侧位置" align="center" prop="humanY" />-->
          <el-table-column label="背景图片" align="center" prop="bgImage">
            <template #default="scope">
              <el-image
                :src="scope.row.bgImage"
                :preview-src-list="[scope.row.bgImage]"
                fit="cover"
                preview-teleported
              />
            </template>
          </el-table-column>
          <el-table-column label="预览图片" align="center" prop="previewImage">
            <template #default="scope">
              <el-image
                :src="scope.row.previewImage"
                :preview-src-list="[scope.row.previewImage]"
                fit="cover"
                preview-teleported
              />
            </template>
          </el-table-column>
          <el-table-column
            :label="t('table.createTime')"
            align="center"
            prop="createTime"
            sortable
            :formatter="dateFormatter"
            width="180px"
          />
        </template>
      </el-table-column>
      <el-table-column label="预览图片" align="center" prop="previewImage">
        <template #default="scope">
          <el-image
            :src="scope.row.previewImage"
            :preview-src-list="[scope.row.previewImage]"
            fit="cover"
            preview-teleported
          <el-table-column :label="t('table.action')" align="center" min-width="120px">
            <template #default="scope">
              <el-button
                link
                type="primary"
                @click="openForm('update', scope.row.id)"
                v-hasPermi="['digitalcourse:template:update']"
              >
                {{ t('action.edit') }}
              </el-button>
              <el-button
                link
                type="danger"
                @click="handleDelete(scope.row.id)"
                v-hasPermi="['digitalcourse:template:delete']"
              >
                {{ t('action.del') }}
              </el-button>
            </template>
          </el-table-column>
        </el-table>
        <!-- 分页 -->
        <Pagination
          :total="total"
          v-model:page="queryParams.pageNo"
          v-model:limit="queryParams.pageSize"
          @pagination="getList"
        />
      </el-tab-pane>
      <el-tab-pane label="模板库模板" name="second">
        <el-table :default-sort="{ prop: 'createTime', order: 'descending' }" v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
          <el-table-column :label="t('table.index')" align="center" type='index' width="60"/>
          <el-table-column :label="t('template.name')" align="center" prop="templateName" />
          <el-table-column :label="t('template.isShowBackground')" align="center" prop="showBackground" >
            <template #default="scope">
              <dict-tag :type="DICT_TYPE.IS_OR_NOT" :value="scope.row.showBackground" />
            </template>
          </el-table-column>
          <el-table-column :label="t('template.isShowDigitalPeople')" align="center" prop="showDigitalHuman" >
            <template #default="scope">
              <dict-tag :type="DICT_TYPE.IS_OR_NOT" :value="scope.row.showDigitalHuman" />
            </template>
          </el-table-column>
          <el-table-column :label="t('template.isShowPPt')" align="center" prop="showPpt" >
            <template #default="scope">
              <dict-tag :type="DICT_TYPE.IS_OR_NOT" :value="scope.row.showPpt" />
            </template>
          </el-table-column>
          <!--      <el-table-column label="ppt宽" align="center" prop="pptW" />
                <el-table-column label="ppt高" align="center" prop="pptH" />
                <el-table-column label="ppt距离顶部位置" align="center" prop="pptX" />
                <el-table-column label="ppt距离左侧位置" align="center" prop="pptY" />
                <el-table-column label="数字人宽" align="center" prop="humanW" />
                <el-table-column label="数字人高" align="center" prop="humanH" />
                <el-table-column label="数字人距离顶部位置" align="center" prop="humanX" />
                <el-table-column label="数字人距离左侧位置" align="center" prop="humanY" />-->
          <el-table-column label="背景图片" align="center" prop="bgImage">
            <template #default="scope">
              <el-image
                :src="scope.row.bgImage"
                :preview-src-list="[scope.row.bgImage]"
                fit="cover"
                preview-teleported
              />
            </template>
          </el-table-column>
          <el-table-column label="预览图片" align="center" prop="previewImage">
            <template #default="scope">
              <el-image
                :src="scope.row.previewImage"
                :preview-src-list="[scope.row.previewImage]"
                fit="cover"
                preview-teleported
              />
            </template>
          </el-table-column>
          <el-table-column
            :label="t('table.createTime')"
            align="center"
            prop="createTime"
            sortable
            :formatter="dateFormatter"
            width="180px"
          />
        </template>
      </el-table-column>
      <el-table-column
        :label="t('table.createTime')"
        align="center"
        prop="createTime"
        :formatter="dateFormatter"
        width="180px"
      />
      <el-table-column :label="t('table.action')" align="center" min-width="120px">
        <template #default="scope">
          <el-button
            link
            type="primary"
            @click="openForm('update', scope.row.id)"
            v-hasPermi="['digitalcourse:template:update']"
          >
            {{ t('action.edit') }}
          </el-button>
          <el-button
            link
            type="danger"
            @click="handleDelete(scope.row.id)"
            v-hasPermi="['digitalcourse:template:delete']"
          >
            {{ t('action.del') }}
          </el-button>
        </template>
      </el-table-column>
    </el-table>
    <!-- 分页 -->
    <Pagination
      :total="total"
      v-model:page="queryParams.pageNo"
      v-model:limit="queryParams.pageSize"
      @pagination="getList"
    />
          <el-table-column :label="t('table.action')" align="center" min-width="120px" v-if="hasAdminRole">
            <template #default="scope">
              <el-button
                link
                type="primary"
                @click="openForm('update', scope.row.id)"
                v-hasPermi="['digitalcourse:template:update']"
              >
                {{ t('action.edit') }}
              </el-button>
              <el-button
                link
                type="danger"
                @click="handleDelete(scope.row.id)"
                v-hasPermi="['digitalcourse:template:delete']"
              >
                {{ t('action.del') }}
              </el-button>
            </template>
          </el-table-column>
        </el-table>
        <!-- 分页 -->
        <Pagination
          :total="total"
          v-model:page="queryParams.pageNo"
          v-model:limit="queryParams.pageSize"
          @pagination="getList"
        />
      </el-tab-pane>
    </el-tabs>
  </ContentWrap>
  <!-- 表单弹窗:添加/修改 -->
@@ -138,13 +229,14 @@
import { TemplateApi, TemplateVO } from '@/api/digitalcourse/template'
import TemplateForm from './TemplateForm.vue'
import {DICT_TYPE} from "@/utils/dict";
import type { TabsPaneContext } from 'element-plus'
import {getUserProfile} from "@/api/system/user/profile";
/** 模板 列表 */
defineOptions({ name: 'Template' })
const message = useMessage() // 消息弹窗
const { t } = useI18n() // 国际化
const activeName = ref('first')
const loading = ref(true) // 列表的加载中
const list = ref<TemplateVO[]>([]) // 列表的数据
const total = ref(0) // 列表的总页数
@@ -164,13 +256,18 @@
  humanY: undefined,
  bgImage: undefined,
  createTime: [],
  zg: 2
})
const queryFormRef = ref() // 搜索的表单
const exportLoading = ref(false) // 导出的加载中
let userInfo = ref()
let hasAdminRole = ref(false)
/** 查询列表 */
const getList = async () => {
  loading.value = true
  userInfo.value = await getUserProfile()
   hasAdminRole = userInfo.value.roles.some(role => role.name === '数字人管理员')
  try {
    const data = await TemplateApi.getTemplatePage(queryParams)
    list.value = data.list
@@ -189,6 +286,7 @@
/** 重置按钮操作 */
const resetQuery = () => {
  queryFormRef.value.resetFields()
  queryParams.zg = '2'
  handleQuery()
}
@@ -225,6 +323,16 @@
    exportLoading.value = false
  }
}
const iszg = () => {
  console.log(activeName)
  if (activeName.value == 'first') {
    queryParams.zg = 2
    getList()
  }else if (activeName.value == 'second') {
    queryParams.zg = 1
    getList()
  }
}
/** 初始化 **/
onMounted(() => {