From 4d0ebb399281589564d6fa9d512c375a28abc303 Mon Sep 17 00:00:00 2001
From: Flex <q1406482700@163.com>
Date: 星期五, 30 五月 2025 17:26:35 +0800
Subject: [PATCH] 补充提交

---
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/util/PPTUtil.java                                          |    2 
 easegen-front/src/views/digitalcourse/digitalhumans/index.vue                                                                                                            |   25 +
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/template/TemplateDO.java                    |    3 
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/template/TemplateController.java          |    2 
 easegen-front/src/views/digitalcourse/template/TemplateForm.vue                                                                                                          |   46 ++-
 easegen-front/src/views/Login/Login.vue                                                                                                                                  |   84 +++-
 easegen-front/src/views/Login/components/LoginForm.vue                                                                                                                   |  128 +++++--
 easegen-front/src/views/Login/components/LoginFormTitle.vue                                                                                                              |    9 
 easegen-front/src/views/digitalcourse/template/index.vue                                                                                                                 |  272 ++++++++++++-----
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/template/vo/TemplateSaveReqVO.java        |    7 
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/mysql/template/TemplateMapper.java                     |   36 ++
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/digitalhumans/DigitalHumansServiceImpl.java        |    2 
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/template/vo/TemplatePageReqVO.java        |    3 
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/template/TemplateServiceImpl.java                  |   18 +
 /dev/null                                                                                                                                                                |    0 
 easegen-front/src/views/chooseTemplate/index.vue                                                                                                                         |  106 ++++--
 easegen-front/src/views/digitalcourse/digitalhumans/LookDigitalHumansForm.vue                                                                                            |   40 +-
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/digitalhumans/vo/DigitalHumansRespVO.java |    3 
 easegen-front/src/views/dialogue/index.vue                                                                                                                               |   86 +++--
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/template/vo/TemplateRespVO.java           |    4 
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceUtil.java            |    8 
 easegen-front/src/assets/imgs/bei3-1.png                                                                                                                                 |    0 
 22 files changed, 605 insertions(+), 279 deletions(-)

diff --git a/easegen-front/src/assets/imgs/bei3-1.png b/easegen-front/src/assets/imgs/bei3-1.png
new file mode 100644
index 0000000..08f7e6f
--- /dev/null
+++ b/easegen-front/src/assets/imgs/bei3-1.png
Binary files differ
diff --git a/easegen-front/src/assets/imgs/bei3.png b/easegen-front/src/assets/imgs/bei3.png
deleted file mode 100644
index 658ada4..0000000
--- a/easegen-front/src/assets/imgs/bei3.png
+++ /dev/null
Binary files differ
diff --git a/easegen-front/src/assets/imgs/bei4.png b/easegen-front/src/assets/imgs/bei4.png
deleted file mode 100644
index 9c79122..0000000
--- a/easegen-front/src/assets/imgs/bei4.png
+++ /dev/null
Binary files differ
diff --git a/easegen-front/src/views/Login/Login.vue b/easegen-front/src/views/Login/Login.vue
index 0b2f5cb..d57f808 100644
--- a/easegen-front/src/views/Login/Login.vue
+++ b/easegen-front/src/views/Login/Login.vue
@@ -1,9 +1,11 @@
 <template>
   <div class="bei">
-      <div class="">
+      <div class="BeiArea">
         <!-- 宸︿晶鍥剧墖 -->
-         <div class="Left-img" >
-            <img src="@/assets/imgs/bei4.png" alt=""/>
+         <div class="Left-img">
+            <div class="TitleText" >
+              <text> 鏁板瓧浜� </text>鏅鸿兘浜や簰骞冲彴
+            </div>
          </div>
         <!-- 鍙宠竟鐨勭櫥褰曠晫闈� -->
         <Transition appear enter-active-class="animate__animated animate__bounceInRight">
@@ -25,7 +27,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,45 +59,74 @@
 .bei{
   width: 100%;
   height: 100%;
-  background-image: url('@/assets/imgs/bei3.png');
-  background-size: 100% 100%;
-  background-repeat: no-repeat;
+  background-color: #000;
+  display: flex;
+  justify-content: center;
+  align-items: center;
 }
-.form-box{
-  width: 25%;
-  padding: 20px;
+.bei .BeiArea{
+  width: 86%;
+  height: 95%;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  background-color: #000a25;
+}
+.bei .BeiArea .form-box{
+  /* width: 25%; */
+  width: 400px;
+  margin-top: -36px;
+  padding: 70px 30px;
   box-sizing: border-box;
   background: #fff;
-  float: right;
-  margin-top: 30vh;
-  margin-right: 10vw;
+  margin-left: 300px;
+  box-shadow: rgba(100, 100, 111, 0.2) 0px 7px 29px 0px;
 }
-
-.Left-img{
-  float: left;
-  width: 50%;
-  margin-top: 4vh;
-  margin-left: 60px;
+.bei .BeiArea .Left-img{
+  width: 729px;
+  height: 655px;
+  margin-top: 138px;
+  margin-left: -74px;
+  background-image:url( "@/assets/imgs/bei3-1.png" );
+  /* background-size: 100%; */
+  background-size: contain;
+  background-repeat: no-repeat;
+  background-position: center center;
+  display: flex;
+  justify-content: center;
+  align-items: center;
 }
-
-.Left-img img{
+.bei .BeiArea .Left-img .TitleText{
+  margin-top: calc( -85% );
+  margin-left: -60px;
+  color: #fff;
   width: 100%;
+  text-align: left;
+  font-size: 48px;
+  padding-left: 10%;
+  box-sizing: border-box;
+}
+.bei .BeiArea .Left-img .TitleText text{
+  color: #2d84fa;
 }
 
 @media screen and ( max-width: 1300px )  {
 
   .form-box{
-    width: 80%;
-    float: left;
-    margin-left: 10%;
-    margin-right: 0;
-    margin-top: calc( 50vh - 100px );
+    width: 50% !important;
+    margin: 0 auto !important;
   }
 
   .Left-img{
-    display: none;
+    display: none !important;
   }
   
 }
 
+@media (max-width:1650px) and ( min-width: 1300px )  {
+  .bei .BeiArea .Left-img{
+    margin-left: 0;
+  }
+}
+
 </style>
diff --git a/easegen-front/src/views/Login/components/LoginForm.vue b/easegen-front/src/views/Login/components/LoginForm.vue
index ffc76bb..989e379 100644
--- a/easegen-front/src/views/Login/components/LoginForm.vue
+++ b/easegen-front/src/views/Login/components/LoginForm.vue
@@ -4,7 +4,7 @@
     ref="formLogin"
     :model="loginData.loginForm"
     :rules="LoginRules"
-    class="login-form"
+    class="login-form NewClass"
     label-position="top"
     label-width="120px"
     size="large"
@@ -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>
@@ -72,6 +72,7 @@
             class="w-[100%]"
             type="primary"
             @click="getCode()"
+            style="background-color: #1d78f4"
           />
         </el-form-item>
       </el-col>
@@ -82,9 +83,10 @@
         mode="pop"
         @success="handleLogin"
       />
-      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
+      <!-- 娉ㄥ唽涓嶆樉绀� -->
+      <!-- <el-col :span="24"  > 
         <el-form-item>
-          <el-row :gutter="5" justify="space-between" style="width: 100%">
+          <el-row :gutter="5" justify="space-between" style="width: 100%; margin-left: 0 !important;">
             <el-col :span="12">
               <XButton
                 :title="t('login.btnMobile')"
@@ -92,14 +94,14 @@
                 @click="setLoginState(LoginStateEnum.MOBILE)"
               />
             </el-col>
-<!--            <el-col :span="8">-->
-<!--              <XButton-->
-<!--                :title="t('login.btnQRCode')"-->
-<!--                class="w-[100%]"-->
-<!--                @click="setLoginState(LoginStateEnum.QR_CODE)"-->
-<!--              />-->
-<!--            </el-col>-->
-            <el-col :span="12">
+                       <el-col :span="8">
+                         <XButton
+                           :title="t('login.btnQRCode')"
+                           class="w-[100%]"
+                           @click="setLoginState(LoginStateEnum.QR_CODE)"
+                         />
+                       </el-col>
+            <el-col :span="24"  style="padding-right: 10px; padding-left: 10px" >
               <XButton
                 :title="t('login.btnRegister')"
                 class="w-[100%]"
@@ -108,38 +110,38 @@
             </el-col>
           </el-row>
         </el-form-item>
-      </el-col>
-<!--      <el-divider content-position="center">{{ t('login.otherLogin') }}</el-divider>-->
-<!--      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">-->
-<!--        <el-form-item>-->
-<!--          <div class="w-[100%] flex justify-between">-->
-<!--            <Icon-->
-<!--              v-for="(item, key) in socialList"-->
-<!--              :key="key"-->
-<!--              :icon="item.icon"-->
-<!--              :size="30"-->
-<!--              class="anticon cursor-pointer"-->
-<!--              color="#999"-->
-<!--              @click="doSocialLogin(item.type)"-->
-<!--            />-->
-<!--          </div>-->
-<!--        </el-form-item>-->
-<!--      </el-col>-->
-<!--      <el-divider content-position="center">钀屾柊蹇呰</el-divider>-->
-<!--      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">-->
-<!--        <el-form-item>-->
-<!--          <div class="w-[100%] flex justify-between">-->
-<!--            <el-link href="https://doc.iocoder.cn/" target="_blank">馃摎寮�鍙戞寚鍗�</el-link>-->
-<!--            <el-link href="https://doc.iocoder.cn/video/" target="_blank">馃敟瑙嗛鏁欑▼</el-link>-->
-<!--            <el-link href="https://www.iocoder.cn/Interview/good-collection/" target="_blank">-->
-<!--              鈿¢潰璇曟墜鍐�-->
-<!--            </el-link>-->
-<!--            <el-link href="http://static.yudao.iocoder.cn/mp/Aix9975.jpeg" target="_blank">-->
-<!--              馃澶栧寘鍜ㄨ-->
-<!--            </el-link>-->
-<!--          </div>-->
-<!--        </el-form-item>-->
-<!--      </el-col>-->
+      </el-col> -->
+      <!--      <el-divider content-position="center">{{ t('login.otherLogin') }}</el-divider>-->
+      <!--      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">-->
+      <!--        <el-form-item>-->
+      <!--          <div class="w-[100%] flex justify-between">-->
+      <!--            <Icon-->
+      <!--              v-for="(item, key) in socialList"-->
+      <!--              :key="key"-->
+      <!--              :icon="item.icon"-->
+      <!--              :size="30"-->
+      <!--              class="anticon cursor-pointer"-->
+      <!--              color="#999"-->
+      <!--              @click="doSocialLogin(item.type)"-->
+      <!--            />-->
+      <!--          </div>-->
+      <!--        </el-form-item>-->
+      <!--      </el-col>-->
+      <!--      <el-divider content-position="center">钀屾柊蹇呰</el-divider>-->
+      <!--      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">-->
+      <!--        <el-form-item>-->
+      <!--          <div class="w-[100%] flex justify-between">-->
+      <!--            <el-link href="https://doc.iocoder.cn/" target="_blank">馃摎寮�鍙戞寚鍗�</el-link>-->
+      <!--            <el-link href="https://doc.iocoder.cn/video/" target="_blank">馃敟瑙嗛鏁欑▼</el-link>-->
+      <!--            <el-link href="https://www.iocoder.cn/Interview/good-collection/" target="_blank">-->
+      <!--              鈿¢潰璇曟墜鍐�-->
+      <!--            </el-link>-->
+      <!--            <el-link href="http://static.yudao.iocoder.cn/mp/Aix9975.jpeg" target="_blank">-->
+      <!--              馃澶栧寘鍜ㄨ-->
+      <!--            </el-link>-->
+      <!--          </div>-->
+      <!--        </el-form-item>-->
+      <!--      </el-col>-->
     </el-row>
   </el-form>
 </template>
@@ -352,4 +354,42 @@
     cursor: pointer;
   }
 }
+
+.NewClass {
+  ::v-deep(.el-input__inner) {
+    font-size: 20px;
+    line-height: 40px;
+    height: 60px;
+  }
+  ::v-deep(.el-button--large) {
+    padding: 20px;
+    box-sizing: border-box;
+    font-size: 20px;
+    height: 60px;
+    margin-top: 20px;
+  }
+}
+
+@media screen and (max-width: 1300px) {
+  .NewClass {
+    ::v-deep(.el-input__inner) {
+      font-size: 20px;
+      line-height: 40px;
+      height: 50px;
+    }
+    ::v-deep(.el-form-item--large){
+      margin-bottom: 40px;
+    }
+    ::v-deep(.el-checkbox__label){
+      font-size: 18px;
+    }
+    ::v-deep(.el-button--large) {
+      padding: 20px;
+      box-sizing: border-box;
+      font-size: 20px;
+      height: 60px;
+      margin-top: 10px;
+    }
+  }
+}
 </style>
diff --git a/easegen-front/src/views/Login/components/LoginFormTitle.vue b/easegen-front/src/views/Login/components/LoginFormTitle.vue
index cdf4fac..72c68d2 100644
--- a/easegen-front/src/views/Login/components/LoginFormTitle.vue
+++ b/easegen-front/src/views/Login/components/LoginFormTitle.vue
@@ -1,5 +1,12 @@
+
+<style>
+.c717a8a{
+  color: #717a8a
+}
+</style>
+
 <template>
-  <h2 class="enter-x mb-3 text-center text-2xl font-bold xl:text-center xl:text-3xl">
+  <h2 class="enter-x mb-3 text-2xl font-bold xl:text-3xl c717a8a"  >
     {{ getFormTitle }}
   </h2>
 </template>
diff --git a/easegen-front/src/views/chooseTemplate/index.vue b/easegen-front/src/views/chooseTemplate/index.vue
index 7a9e7ff..d8f9558 100644
--- a/easegen-front/src/views/chooseTemplate/index.vue
+++ b/easegen-front/src/views/chooseTemplate/index.vue
@@ -474,6 +474,7 @@
               }"
             />
           </div>
+          <el-empty v-if="hostList.length==0" description="鏆傛棤鏁版嵁" />
           <Pagination
             small="true"
             :total="total"
@@ -487,10 +488,25 @@
       <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"
             :key="index"
+            :style="{
+                width: '90%',
+                maxWidth: '90%',
+              }"
             @click="handleTemplateSelection(template)"
           >
             <div class="list-index" :style="template.isActive ? 'background: #409eff' : ''">
@@ -498,10 +514,11 @@
             </div>
             <el-image class="background" :src="template.previewImage" fit="contain" />
           </div>
+          <el-empty v-if="templates.length==0" description="鏆傛棤鏁版嵁" />
         </div>
-        <div class="apply-all">
-          <el-checkbox v-model="applyAllTemplate" :label="t('courseCenter.uploadAudio')" />
-        </div>
+<!--        <div class="apply-all">-->
+<!--          <el-checkbox v-model="applyAllTemplate" :label="t('courseCenter.uploadAudio')" />-->
+<!--        </div>-->
       </div>
       <!-- 鑳屾櫙璁剧疆 -->
       <div class="template-box template-right" v-if="showHeadImageTool">
@@ -751,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) => {
@@ -780,18 +812,18 @@
     activeUrl: userActive,
     isActive: false
   },
-  {
-    name: t('courseCenter.background'),
-    url: bg,
-    activeUrl: bgActive,
-    isActive: false
-  },
-  {
-    name: t('courseCenter.pictureInPicture'),
-    url: innerPicture,
-    activeUrl: innerPictureActive,
-    isActive: false
-  }
+  // {
+  //   name: t('courseCenter.background'),
+  //   url: bg,
+  //   activeUrl: bgActive,
+  //   isActive: false
+  // },
+  // {
+  //   name: t('courseCenter.pictureInPicture'),
+  //   url: innerPicture,
+  //   activeUrl: innerPictureActive,
+  //   isActive: false
+  // }
 ])
 
 const showHeadImageTool = ref(false)
@@ -828,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')
@@ -1187,7 +1222,11 @@
   gender: '',
   posture: ''
 })
-
+const queryParams1 = reactive({
+  pageNo: 1,
+  pageSize: 100,
+  zg:''
+})
 const selectHost = ref(null)
 
 const getList = async () => {
@@ -1198,16 +1237,6 @@
     queryParams.posture = tabs3ActiveNum.value
     queryParams.status = 0
     let data = await pptTemplateApi.pageList(queryParams)
-    if (data.list.length == 0) {
-      queryParams.type = tabs1ActiveNum.value == '0' ? '1' : '0'
-      tabs1ActiveNum.value = queryParams.type
-      data = await pptTemplateApi.pageList(queryParams)
-      if (data.list.length == 0) {
-        message.error('娌℃湁鏈夋晥鐨勬暟瀛椾汉锛岃鑱旂郴绠$悊鍛�')
-        return
-      }
-    }
-
     data.list.forEach((item) => {
       item.isActive = false
     })
@@ -1858,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,
@@ -2175,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;
@@ -2328,7 +2370,7 @@
     z-index: 1;
     width: 100%;
     height: 100%;
-    background-color: #f0f1fa;
+    //background-color: #f0f1fa;
   }
 
   .template-tool {
diff --git a/easegen-front/src/views/dialogue/index.vue b/easegen-front/src/views/dialogue/index.vue
index e9cc1e1..2299f01 100644
--- a/easegen-front/src/views/dialogue/index.vue
+++ b/easegen-front/src/views/dialogue/index.vue
@@ -1,43 +1,69 @@
 <template>
-<div>
-  <div class="remote-container"></div>
-</div>
+  <div>
+    <div class="remote-container" classNamev>
+    </div>
+  </div>
 </template>
 
 <script>
-import DUIX from 'duix-guiji-light'
-import {getDuixSign} from "../../api/dialogue";
-import * as pptTemplateApi from "../../api/pptTemplate";
-
+import DUIX from 'duix-guiji-light';
+import {getDuixSign} from "../../api/dialogue/index.ts";
 export default {
-  name: "index"
-}
-const tempConversationId ='dev-'+ Math.random().toString(36).substring(2, 11);
-const duix = new DUIX()
+  name: "index",
+  mounted() {
+    this.$nextTick(() => {
+      this.initDuix();
+    });
+  },
+  methods: {
 
-  getDuixSign().then(res => {
-    if (res.code === 200) {
-      duix.init({
-        sign: res.data.sign,
-        containerLable: '.remote-container',
-        conversationId: tempConversationId,
-      })
-    }
-  })
-duix.on('getDuixSign', () => {
-  // start session
-  duix.start({
-    conversationId: tempConversationId,
-    openAsr: true
-  }).then(res => {
-    console.info(res)
-  })
-})
+    async initDuix() {
+      // 1. 妫�鏌ュ鍣ㄦ槸鍚﹀瓨鍦�
+      const container = document.querySelector('.remote-container');
+      if (!container) {
+        console.error("閿欒锛氭湭鎵惧埌 .remote-container 鍏冪礌");
+        return;
+      }
+
+      // 2. 鑾峰彇 Token
+      let token;
+      try {
+        const res = await getDuixSign();
+        token = res.data?.sign || res.sign || res;
+        if (!token) throw new Error("Token 涓虹┖");
+      } catch (err) {
+        console.error("鑾峰彇绛惧悕澶辫触:", err);
+        return;
+      }
+
+      // 3. 鍒濆鍖� DUIX
+      const duix = new DUIX();
+      const conversationId = 'dev-'+ Math.random().toString(36).substring(2, 11);;
+
+      try {
+        await duix.init({
+          sign: token,
+          containerLable: '.remote-container', // 娉ㄦ剰锛氬彲鑳芥槸 containerLabel锛堟鏌ユ嫾鍐欙級
+          conversationId: conversationId,
+        });
+        // 4. 鐩戝惉浜嬩欢
+        duix.on('getDuixSign', () => {
+          duix.start({conversationId, openAsr: true})
+            .then(() => console.log("DUIX 鍚姩鎴愬姛"))
+            .catch(err => console.error("DUIX 鍚姩澶辫触:", err));
+        });
+      } catch (initErr) {
+        console.error("DUIX 鍒濆鍖栧け璐�:", initErr);
+      }
+    },
+  },
+};
 </script>
 
 <style scoped>
-.remote-container{
+.remote-container {
   width: 500px;
   height: 500px;
+  border: 1px solid red; /* 璋冭瘯鏃堕珮浜鍣� */
 }
 </style>
diff --git a/easegen-front/src/views/digitalcourse/digitalhumans/LookDigitalHumansForm.vue b/easegen-front/src/views/digitalcourse/digitalhumans/LookDigitalHumansForm.vue
index 8064faf..fb86cd6 100644
--- a/easegen-front/src/views/digitalcourse/digitalhumans/LookDigitalHumansForm.vue
+++ b/easegen-front/src/views/digitalcourse/digitalhumans/LookDigitalHumansForm.vue
@@ -35,15 +35,15 @@
         </el-form-item>
         <el-form-item label="鑳屾櫙鏍峰紡" prop="isTransparent">
           <el-select v-model="formData.isTransparent" placeholder="璇烽�夋嫨鏄惁鍘婚櫎鑳屾櫙">
-            <el-option value="1" label="閫忔槑鑳屾櫙"/>
-            <el-option value="2" label="缁垮箷鑳屾櫙"/>
+            <el-option :value="1" label="閫忔槑鑳屾櫙"/>
+            <el-option :value="2" label="缁垮箷鑳屾櫙"/>
           </el-select>
         </el-form-item>
         <el-form-item v-if="formData.useModel == 1" :label="t('digitalhumans.picture')" prop="pictureUrl">
           <UploadImg v-if="formData" v-model="formData.fixPictureUrl" />
           <UploadImg v-else v-model="formData.pictureUrl" />
         </el-form-item>
-  
+
         <!-- <el-form-item v-if="formData.useModel == 2" :label="t('digitalhumans.video')" prop="videoUrl"> -->
         <el-form-item v-if="false" :label="t('digitalhumans.video')" prop="videoUrl">
           <!-- 鍘熸湰鑷甫鐨勮棰戜笂浼� -->
@@ -85,8 +85,9 @@
         </el-form-item>
       </el-form>
       <template #footer>
-        <el-button @click="submitForm" type="primary" :disabled="formLoading" :loading="isUploading" >{{t('common.ok')}}</el-button>
-        <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
+        <el-button @click="submitForm" type="primary" :disabled="formLoading" :loading="isUploading" v-if="formType=='updata'">{{t('common.ok')}}</el-button>
+        <el-button @click="dialogVisible = false" v-if="formType=='updata'">{{t('common.cancel')}}</el-button>
+        <el-button @click="dialogVisible = false" v-if="formType=='detail'">鍏抽棴</el-button>
       </template>
     </Dialog>
   </template>
@@ -100,10 +101,10 @@
   import { useUpload } from '@/components/UploadFile/src/useUpload'
   import { el } from 'element-plus/es/locale';
   import { any } from 'vue-types';
-  
+
   const { t } = useI18n() // 鍥介檯鍖�
   const message = useMessage() // 娑堟伅寮圭獥
-  
+
   const { uploadUrl, httpRequest } = useUpload() //涓婁紶鏂规硶
   const dialogVisible = ref(false) // 寮圭獥鐨勬槸鍚﹀睍绀�
   const dialogTitle = ref('') // 寮圭獥鐨勬爣棰�
@@ -128,10 +129,10 @@
     status: undefined,
     isTransparent: undefined,
   })
-  
+
   // 褰撳墠鏄惁姝e湪涓婁紶瑙嗛
   const isUploading = ref(false)
-  
+
   const videoProperty = {
     videoUrl: '',
     posterUrl: '',
@@ -143,7 +144,7 @@
       height: 300
     }
   } as DiyComponent<VideoPlayerProperty>
-  
+
   watch(()=> formData.value.videoUrl,(newVal,oldValue)=>{
     if (newVal && newVal.length > 0){
       videoProperty.videoUrl = formData.value.fixVideoUrl || newVal
@@ -164,12 +165,12 @@
     videoUrl: [{ required: true, message: '瑙嗛涓嶈兘涓虹┖', trigger: 'blur' }]
   })
   const formRef = ref() // 琛ㄥ崟 Ref
-  
+
   const StartCes = () => {
     console.log( " ----- 寮�濮� ----- " )
     isUploading.value = true
   }
-  
+
   const End = (res)=>{
     const FileObject = {
       file:res
@@ -180,9 +181,9 @@
     } ).finally( res => {
       isUploading.value = false
     } )
-  
+
   }
-  
+
   /** 鎵撳紑寮圭獥 */
   const open = async (type: string, id?: number) => {
     dialogVisible.value = true
@@ -202,7 +203,7 @@
     }
   }
   defineExpose({ open }) // 鎻愪緵 open 鏂规硶锛岀敤浜庢墦寮�寮圭獥
-  
+
   /** 鎻愪氦琛ㄥ崟 */
   const emit = defineEmits(['success']) // 瀹氫箟 success 浜嬩欢锛岀敤浜庢搷浣滄垚鍔熷悗鐨勫洖璋�
   const submitForm = async () => {
@@ -226,7 +227,7 @@
       formLoading.value = false
     }
   }
-  
+
   /** 閲嶇疆琛ㄥ崟 */
   const resetForm = () => {
     formData.value = {
@@ -254,9 +255,9 @@
       formData.value.videoUrl = response.data;
     }
   };
-  
+
   // 淇敼榛樿鐨勬暟瀛椾汉瑙嗛妯″紡涓鸿棰�
-  
+
   const InitHumMODEL = ()=>{
     let ModelList = getIntDictOptions( DICT_TYPE.USE_MODEL )
     for (let index = 0; index < ModelList.length; index++) {
@@ -266,6 +267,5 @@
       }
     }
   }
-  
+
   </script>
-  
\ No newline at end of file
diff --git a/easegen-front/src/views/digitalcourse/digitalhumans/index.vue b/easegen-front/src/views/digitalcourse/digitalhumans/index.vue
index ac070a6..98bd833 100644
--- a/easegen-front/src/views/digitalcourse/digitalhumans/index.vue
+++ b/easegen-front/src/views/digitalcourse/digitalhumans/index.vue
@@ -161,6 +161,23 @@
           >
             {{t('digitalhumans.handle')}}
           </el-button>
+
+          <el-button
+            link
+            type="primary"
+            @click="OpenLookformRef('detail', scope.row.id)"
+            v-hasPermi="['digitalcourse:digital-humans:delete']"
+          >
+            {{t('digitalhumans.view')}}
+          </el-button>
+          <el-button
+            link
+            type="primary"
+            @click="OpenLookformRef('updata', scope.row.id)"
+            v-hasPermi="['digitalcourse:digital-humans:delete']"
+          >
+            淇敼
+          </el-button>
           <el-button
             :disabled="scope.row.status == 3 || scope.row.status == 6"
             link
@@ -169,14 +186,6 @@
             v-hasPermi="['digitalcourse:digital-humans:delete']"
           >
             {{ t('action.del') }}
-          </el-button>
-          <el-button
-            link
-            type="primary"
-            @click="OpenLookformRef('detail', scope.row.id)"
-            v-hasPermi="['digitalcourse:digital-humans:delete']"
-          >
-            {{t('digitalhumans.view')}}
           </el-button>
         </template>
       </el-table-column>
diff --git a/easegen-front/src/views/digitalcourse/template/TemplateForm.vue b/easegen-front/src/views/digitalcourse/template/TemplateForm.vue
index 6181c87..c353bee 100644
--- a/easegen-front/src/views/digitalcourse/template/TemplateForm.vue
+++ b/easegen-front/src/views/digitalcourse/template/TemplateForm.vue
@@ -96,7 +96,6 @@
         </el-col>
       </el-row>
       <el-row>
-
         <el-col :span="12">
           <el-form-item :label="t('template.digitalPeopleWidth')" prop="humanW">
             <el-input type="number" disabled v-model="formData.humanW" :placeholder="t('common.inputText') + t('template.digitalPeopleWidth')" />
@@ -119,8 +118,16 @@
             <el-input type="number" v-model="formData.humanY" :placeholder="t('common.inputText') + t('template.leftPositionDigitalPeople')" />
           </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">
@@ -135,13 +142,6 @@
         </el-col>
       </el-row>
 
-
-
-
-
-
-
-
     </el-form>
     <template #footer>
       <el-button @click="submitForm" type="primary" :disabled="formLoading">{{ t('common.ok') }}</el-button>
@@ -152,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' })
 
@@ -192,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
@@ -261,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()
 }
diff --git a/easegen-front/src/views/digitalcourse/template/index.vue b/easegen-front/src/views/digitalcourse/template/index.vue
index 1af6ecb..85c48b4 100644
--- a/easegen-front/src/views/digitalcourse/template/index.vue
+++ b/easegen-front/src/views/digitalcourse/template/index.vue
@@ -45,87 +45,180 @@
 
   <!-- 鍒楄〃 -->
   <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="鍒涘缓浜�"  align="center" prop="creator" />
+          <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="鍒涘缓浜�"  align="center" prop="creator" />
+          <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 +231,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 +258,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 +288,7 @@
 /** 閲嶇疆鎸夐挳鎿嶄綔 */
 const resetQuery = () => {
   queryFormRef.value.resetFields()
+  queryParams.zg = '2'
   handleQuery()
 }
 
@@ -225,6 +325,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(() => {
diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/digitalhumans/vo/DigitalHumansRespVO.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/digitalhumans/vo/DigitalHumansRespVO.java
index 7f59a97..bf272be 100644
--- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/digitalhumans/vo/DigitalHumansRespVO.java
+++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/digitalhumans/vo/DigitalHumansRespVO.java
@@ -104,4 +104,5 @@
     //杩囨湡鏃堕棿
     private Date expireDate;
 
-}
\ No newline at end of file
+    private Integer isTransparent;
+}
diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/template/TemplateController.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/template/TemplateController.java
index 866e673..906e1cb 100644
--- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/template/TemplateController.java
+++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/template/TemplateController.java
@@ -92,4 +92,4 @@
                         BeanUtils.toBean(list, TemplateRespVO.class));
     }
 
-}
\ No newline at end of file
+}
diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/template/vo/TemplatePageReqVO.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/template/vo/TemplatePageReqVO.java
index d7c5ca6..fa92304 100644
--- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/template/vo/TemplatePageReqVO.java
+++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/template/vo/TemplatePageReqVO.java
@@ -64,4 +64,5 @@
     @Schema(description = "妯℃澘鍚嶇О")
     private String templateName;;
 
-}
\ No newline at end of file
+    private Integer zg;
+}
diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/template/vo/TemplateRespVO.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/template/vo/TemplateRespVO.java
index b78925b..ac01ce1 100644
--- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/template/vo/TemplateRespVO.java
+++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/template/vo/TemplateRespVO.java
@@ -76,4 +76,6 @@
     @Schema(description = "妯℃澘灏哄")
     private String templateSize;
 
-}
\ No newline at end of file
+    private Integer zg;
+    private String creator;
+}
diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/template/vo/TemplateSaveReqVO.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/template/vo/TemplateSaveReqVO.java
index da74ba7..138b199 100644
--- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/template/vo/TemplateSaveReqVO.java
+++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/template/vo/TemplateSaveReqVO.java
@@ -57,8 +57,8 @@
     @NotNull(message = "鏁板瓧浜鸿窛绂诲乏渚т綅缃笉鑳戒负绌�")
     private BigDecimal humanY;
 
-    @Schema(description = "鑳屾櫙鍥剧墖", requiredMode = Schema.RequiredMode.REQUIRED)
-    @NotEmpty(message = "鑳屾櫙鍥剧墖涓嶈兘涓虹┖")
+    //@Schema(description = "鑳屾櫙鍥剧墖", requiredMode = Schema.RequiredMode.REQUIRED)
+    //@NotEmpty(message = "鑳屾櫙鍥剧墖涓嶈兘涓虹┖")
     private String bgImage;
 
     @Schema(description = "鏁堟灉鍥�")
@@ -70,4 +70,5 @@
     @Schema(description = "妯℃澘灏哄")
     private String templateSize;
 
-}
\ No newline at end of file
+    private Integer zg;
+}
diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/template/TemplateDO.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/template/TemplateDO.java
index 1265c8c..93ea6c6 100644
--- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/template/TemplateDO.java
+++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/template/TemplateDO.java
@@ -86,4 +86,5 @@
     // 妯℃澘灏哄
     private String templateSize;
 
-}
\ No newline at end of file
+    private Integer zg;
+}
diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/mysql/template/TemplateMapper.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/mysql/template/TemplateMapper.java
index 15fcfa6..a658b82 100644
--- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/mysql/template/TemplateMapper.java
+++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/mysql/template/TemplateMapper.java
@@ -5,6 +5,7 @@
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
 import cn.iocoder.yudao.module.digitalcourse.dal.dataobject.template.TemplateDO;
 import org.apache.ibatis.annotations.Mapper;
 import cn.iocoder.yudao.module.digitalcourse.controller.admin.template.vo.*;
@@ -18,7 +19,8 @@
 public interface TemplateMapper extends BaseMapperX<TemplateDO> {
 
     default PageResult<TemplateDO> selectPage(TemplatePageReqVO reqVO) {
-        return selectPage(reqVO, new LambdaQueryWrapperX<TemplateDO>()
+        Long loginUserId = WebFrameworkUtils.getLoginUserId();
+        LambdaQueryWrapperX<TemplateDO> wrapper = new LambdaQueryWrapperX<TemplateDO>()
                 .eqIfPresent(TemplateDO::getShowBackground, reqVO.getShowBackground())
                 .eqIfPresent(TemplateDO::getShowDigitalHuman, reqVO.getShowDigitalHuman())
                 .eqIfPresent(TemplateDO::getShowPpt, reqVO.getShowPpt())
@@ -31,8 +33,34 @@
                 .eqIfPresent(TemplateDO::getHumanX, reqVO.getHumanX())
                 .eqIfPresent(TemplateDO::getHumanY, reqVO.getHumanY())
                 .eqIfPresent(TemplateDO::getBgImage, reqVO.getBgImage())
-                .betweenIfPresent(TemplateDO::getCreateTime, reqVO.getCreateTime())
-                .orderByAsc(TemplateDO::getId));
+                .betweenIfPresent(TemplateDO::getCreateTime, reqVO.getCreateTime());
+                Integer zgParam = reqVO.getZg();
+                if (loginUserId != 1) {
+                    if (zgParam != null) {
+                        if (zgParam == 1) {
+                            wrapper.eq(TemplateDO::getZg, 1);
+                        } else if (zgParam == 2) {
+                            wrapper.eq(TemplateDO::getZg, 2).eq(TemplateDO::getCreator, loginUserId);
+                        }
+                    } else {
+                        // zg 鏈紶锛屾煡 zg = 1 鎴� (zg = 2 涓� creator = 鑷繁)
+                        wrapper.and(w -> w.eq(TemplateDO::getZg, 1)
+                                .or()
+                                .eq(TemplateDO::getZg, 2).eq(TemplateDO::getCreator, loginUserId));
+                    }
+                }else {
+                    if (zgParam != null) {
+                        if (zgParam == 1) {
+                            wrapper.eq(TemplateDO::getZg, 1);
+                        } else if (zgParam == 2) {
+                            wrapper.eq(TemplateDO::getZg, 2);
+                        }
+                    }
+                }
+
+
+                wrapper.orderByAsc(TemplateDO::getId);
+        return selectPage(reqVO, wrapper);
     }
 
-}
\ No newline at end of file
+}
diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceUtil.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceUtil.java
index 86b308f..cdeb917 100644
--- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceUtil.java
+++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceUtil.java
@@ -170,10 +170,10 @@
                 // 褰撴病鏈変汉鍍忔椂锛岃棰戞斁鍦� cover 鐨勪笅灞�
                 builder = new ProcessBuilder(
                         "ffmpeg",
-                        "-i", cover1,     // 鑳屾櫙鍥� 1
-                        "-i", substring1, // 瑙嗛锛堝惈闊抽锛�
-                        "-i", cover1,     // 鑳屾櫙鍥� 2
-                        "-i", cover,      // PPT 鍐呭
+                        "-loop", "1", "-i", cover1,     // 鑳屾櫙鍥�1锛堝姩鎬佹寔缁級
+                        "-i", substring1,               // 瑙嗛锛堝惈闊抽锛�
+                        "-loop", "1", "-i", cover1,     // 鑳屾櫙鍥�2锛堝姩鎬佹寔缁級
+                        "-loop", "1", "-i", cover,      // PPT 鍐呭锛堝姩鎬佹寔缁級
                         "-filter_complex",
                         "[0:v]scale=" + Math.round(scene.getBackground().getWidth()) + ":" + Math.round(scene.getBackground().getHeight()) + "[bg1];" +
                                 "[1:v]scale=" + Math.round(scene.getComponents().get(0).getWidth()) + ":" + Math.round(scene.getComponents().get(0).getHeight()) + "[v1];" +
diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/digitalhumans/DigitalHumansServiceImpl.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/digitalhumans/DigitalHumansServiceImpl.java
index ab1358c..582cdf2 100644
--- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/digitalhumans/DigitalHumansServiceImpl.java
+++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/digitalhumans/DigitalHumansServiceImpl.java
@@ -137,7 +137,7 @@
     }
     @Override
     public PageResult<DigitalHumansDO> getDigitalHumansPage(DigitalHumansPageReqVO pageReqVO) {
-        if(pageReqVO.getType()==1){
+        if(pageReqVO.getType() != null && pageReqVO.getType()==1){
             //鏌ヨ闈炲叕鍏辨暟瀛椾汉锛屽彧鑳芥煡璇㈣嚜宸辩殑锛屽叕鍏辨暟瀛椾汉锛屽彲浠ユ煡璇㈡墍鏈夌殑
             if (WebFrameworkUtils.getLoginUserId() != 1) pageReqVO.setCreator(String.valueOf(WebFrameworkUtils.getLoginUserId()));
         }
diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/template/TemplateServiceImpl.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/template/TemplateServiceImpl.java
index 5f714d9..82eee2c 100644
--- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/template/TemplateServiceImpl.java
+++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/template/TemplateServiceImpl.java
@@ -1,5 +1,8 @@
 package cn.iocoder.yudao.module.digitalcourse.service.template;
 
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import jakarta.annotation.Resource;
 import org.springframework.validation.annotation.Validated;
@@ -31,6 +34,10 @@
 
     @Override
     public Long createTemplate(TemplateSaveReqVO createReqVO) {
+        Integer zg = createReqVO.getZg();
+        if (zg != null && zg != 1) {
+            createReqVO.setZg(2);
+        }
         // 鎻掑叆
         TemplateDO template = BeanUtils.toBean(createReqVO, TemplateDO.class);
         templateMapper.insert(template);
@@ -66,9 +73,16 @@
         return templateMapper.selectById(id);
     }
 
+    @Autowired
+    private AdminUserApi adminUserApi;
     @Override
     public PageResult<TemplateDO> getTemplatePage(TemplatePageReqVO pageReqVO) {
-        return templateMapper.selectPage(pageReqVO);
+        PageResult<TemplateDO> templateDOPageResult = templateMapper.selectPage(pageReqVO);
+        for (TemplateDO templateDO : templateDOPageResult.getList()) {
+            AdminUserRespDTO user = adminUserApi.getUser(Long.valueOf(templateDO.getCreator()));
+            templateDO.setCreator(user.getNickname());
+        }
+        return templateDOPageResult;
     }
 
-}
\ No newline at end of file
+}
diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/util/PPTUtil.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/util/PPTUtil.java
index f917600..c772981 100644
--- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/util/PPTUtil.java
+++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/util/PPTUtil.java
@@ -193,7 +193,7 @@
         File pdfFile = File.createTempFile("ppt_to_pdf_"+tempFileName, ".pdf");
         String command;
         if (isWindows()) {
-            command = String.format("\"E:\\LibreOffice\\LibreOffice\\program\\soffice.exe\" --headless --convert-to pdf --outdir %s %s", pdfFile.getParent(), pptFile.getAbsolutePath());
+            command = String.format("\"C:\\Program Files\\LibreOffice\\program\\soffice.com\" --headless --convert-to pdf --outdir %s %s", pdfFile.getParent(), pptFile.getAbsolutePath());
         } else {
             command = String.format("libreoffice --headless --convert-to pdf --outdir %s %s", pdfFile.getParent(), pptFile.getAbsolutePath());
         }

--
Gitblit v1.9.3