congzc пре 2 година
родитељ
комит
1428db0430
9 измењених фајлова са 412 додато и 103 уклоњено
  1. +12
    -0
      src/apis/createVideo.js
  2. BIN
      src/assets/img/star.png
  3. +2
    -0
      src/lang/package/en.ts
  4. +2
    -0
      src/lang/package/zh-cn.ts
  5. +12
    -6
      src/layout/components/Navbar.vue
  6. +13
    -1
      src/layout/components/Sidebar/index.vue
  7. +6
    -1
      src/store/modules/userInfo.js
  8. +2
    -0
      src/types/components.d.ts
  9. +363
    -95
      src/views/createVideo/index.vue

+ 12
- 0
src/apis/createVideo.js Прегледај датотеку

@@ -180,4 +180,16 @@ export function findByIdApi(id) {
url: `/api/userPhotoVideo/findById?id=${id}`, url: `/api/userPhotoVideo/findById?id=${id}`,
method: 'get', method: 'get',
}) })
}

/**
* @description 获取音乐列表
* @params data
* @returns data
*/
export function musicListApi() {
return request({
url: `api/userPhotoVideo/music`,
method: 'get',
})
} }

BIN
src/assets/img/star.png Прегледај датотеку

Before After
Width: 200  |  Height: 200  |  Size: 5.2 KiB

+ 2
- 0
src/lang/package/en.ts Прегледај датотеку

@@ -69,6 +69,8 @@ export default {
music:'Music', music:'Music',
Aipicture:'Ai-generated pictures', Aipicture:'Ai-generated pictures',
AipictureTip:'Please customize your picture', AipictureTip:'Please customize your picture',
chooseMusic:'Choose music',
searchMusic:'Search music'
}, },


// 我的视频 // 我的视频


+ 2
- 0
src/lang/package/zh-cn.ts Прегледај датотеку

@@ -69,6 +69,8 @@ export default {
music:'音乐', music:'音乐',
Aipicture:'Ai生成图片', Aipicture:'Ai生成图片',
AipictureTip:'请自定义您的图片', AipictureTip:'请自定义您的图片',
chooseMusic:'选择音乐',
searchMusic:'搜索音乐',
}, },


// 我的视频 // 我的视频


+ 12
- 6
src/layout/components/Navbar.vue Прегледај датотеку

@@ -16,12 +16,15 @@
<!--语言选择--> <!--语言选择-->
<lang-select class="navItem" style="color: #ffffff" /> <lang-select class="navItem" style="color: #ffffff" />


<div
class="avatar"
v-if="userInfoPinia.userInfo.avatarUrl"
@click="routerTo"
>
<img :src="userInfoPinia.userInfo.avatarUrl" alt="" />
<div class="avatar" v-if="userInfoPinia.userInfo" @click="routerTo">
<img
:src="
userInfoPinia.userInfo.avatarUrl
? userInfoPinia.userInfo.avatarUrl
: defaultAvater
"
alt=""
/>
</div> </div>
<div class="navItem" v-if="AccessToken" @click="routerTo"> <div class="navItem" v-if="AccessToken" @click="routerTo">
{{ $t("navbar.account") }} {{ $t("navbar.account") }}
@@ -50,6 +53,8 @@ import { useUserStore } from "@/store/modules/user";
import { useI18n } from "vue-i18n"; import { useI18n } from "vue-i18n";
import LangSelect from "@/components/LangSelect/index.vue"; import LangSelect from "@/components/LangSelect/index.vue";
import { userInfoModules } from "@/store/modules/userInfo"; import { userInfoModules } from "@/store/modules/userInfo";
import defaultAvater from "../../assets/img/left-top-logo.png";

const userInfoPinia = userInfoModules(); //pinia const userInfoPinia = userInfoModules(); //pinia
const { locale } = useI18n(); const { locale } = useI18n();


@@ -93,6 +98,7 @@ function logout() {
confirmButtonText: confirm, confirmButtonText: confirm,
cancelButtonText: cancel, cancelButtonText: cancel,
}).then(() => { }).then(() => {
userInfoPinia.loginOut();
router.push(`/login`); router.push(`/login`);
localStorage.removeItem("AccessToken"); localStorage.removeItem("AccessToken");
}); });


+ 13
- 1
src/layout/components/Sidebar/index.vue Прегледај датотеку

@@ -21,6 +21,12 @@
</div> </div>
{{ $t("shop.title") }} {{ $t("shop.title") }}
</div> </div>
<div class="myRouter-item API" @click="routerTo('/myStore')">
<div class="icon">
<el-icon><i-ep-DocumentAdd /></el-icon>
</div>
API
</div>
</div> </div>
</div> </div>
</template> </template>
@@ -103,7 +109,13 @@ function routerTo(url: RouteLocationRaw) {


.pricing { .pricing {
position: absolute; position: absolute;
bottom: 20px;
bottom: 60px;
width: calc(100% - 40px);
text-align: center;
}
.API {
position: absolute;
bottom: 0px;
width: calc(100% - 40px); width: calc(100% - 40px);
text-align: center; text-align: center;
} }


+ 6
- 1
src/store/modules/userInfo.js Прегледај датотеку

@@ -9,11 +9,16 @@ export const userInfoModules = defineStore("userInfo", () => {
function setEmail(params) { function setEmail(params) {
email.value = params email.value = params
} }
// 登录获取用户信息
async function getUserInfo() { async function getUserInfo() {
const res = await getUserInfoApi() const res = await getUserInfoApi()
userInfo.value = res.data userInfo.value = res.data
} }
return { userInfo, setEmail, getUserInfo };
// 退出清除用户信息
function loginOut(params) {
userInfo.value = null
}
return { userInfo, setEmail, getUserInfo, loginOut };
}, },
{ {
persist: true, persist: true,

+ 2
- 0
src/types/components.d.ts Прегледај датотеку

@@ -53,9 +53,11 @@ declare module '@vue/runtime-core' {
IEpCloseBold: typeof import('~icons/ep/close-bold')['default'] IEpCloseBold: typeof import('~icons/ep/close-bold')['default']
IEpCollection: typeof import('~icons/ep/collection')['default'] IEpCollection: typeof import('~icons/ep/collection')['default']
IEpDelete: typeof import('~icons/ep/delete')['default'] IEpDelete: typeof import('~icons/ep/delete')['default']
IEpDocumentAdd: typeof import('~icons/ep/document-add')['default']
IEpDownload: typeof import('~icons/ep/download')['default'] IEpDownload: typeof import('~icons/ep/download')['default']
IEpEdit: typeof import('~icons/ep/edit')['default'] IEpEdit: typeof import('~icons/ep/edit')['default']
IEpGoods: typeof import('~icons/ep/goods')['default'] IEpGoods: typeof import('~icons/ep/goods')['default']
IEpHeadset: typeof import('~icons/ep/headset')['default']
IEpLoading: typeof import('~icons/ep/loading')['default'] IEpLoading: typeof import('~icons/ep/loading')['default']
IEpMenu: typeof import('~icons/ep/menu')['default'] IEpMenu: typeof import('~icons/ep/menu')['default']
IEpMic: typeof import('~icons/ep/mic')['default'] IEpMic: typeof import('~icons/ep/mic')['default']


+ 363
- 95
src/views/createVideo/index.vue Прегледај датотеку

@@ -159,10 +159,14 @@
</div> </div>
<div <div
v-if="AccessToken" v-if="AccessToken"
class="pointer"
class="pointer aiPicTab"
:class="showFace == 2 ? 'tabAvtive' : ''" :class="showFace == 2 ? 'tabAvtive' : ''"
@click="chooseAiPic" @click="chooseAiPic"
> >
<div class="subscript">
<span>GPT</span>
<img src="../../assets/img/star.png" alt="" />
</div>
{{ $t("createVideo.Aipicture") }} {{ $t("createVideo.Aipicture") }}
</div> </div>
</div> </div>
@@ -239,6 +243,10 @@
</div> </div>
<!-- 右侧栏 --> <!-- 右侧栏 -->
<div class="right"> <div class="right">
<div class="subscript">
<span>GPT</span>
<img src="../../assets/img/star.png" alt="" />
</div>
<el-tabs type="border-card" class="tabs"> <el-tabs type="border-card" class="tabs">
<!-- ----------------------------- 1 --> <!-- ----------------------------- 1 -->
<el-tab-pane :label="$t('createVideo.typeScript')"> <el-tab-pane :label="$t('createVideo.typeScript')">
@@ -348,7 +356,7 @@
<div class="card2"> <div class="card2">
<!-- 上传音频 --> <!-- 上传音频 -->
<p> <p>
<el-icon class="icon-VideoCamera"><i-ep-VideoCamera /></el-icon>
<el-icon class="icon-Headset"><i-ep-Headset /></el-icon>
{{ $t("createVideo.uploadAudio") }} {{ $t("createVideo.uploadAudio") }}
</p> </p>
<div class="uploadVideo"> <div class="uploadVideo">
@@ -415,133 +423,167 @@
<!-- ----------------------- 3 --> <!-- ----------------------- 3 -->
<el-tab-pane :label="$t('createVideo.music')"> <el-tab-pane :label="$t('createVideo.music')">
<div class="card3"> <div class="card3">
<div class="text">
<!-- 选择音乐 -->
<p>
<el-icon class="icon-Headset"><i-ep-Headset /></el-icon>
{{ $t("createVideo.chooseMusic") }}
</p>
<!-- 搜索框 -->
<div class="flex justify-between" style="width: 99%">
<el-input <el-input
v-model="title"
:placeholder="$t('createVideo.typeTitle')"
v-model="searchInput"
:placeholder="$t('createVideo.searchMusic')"
@keyup.enter="searchMusicList"
/> />
<el-button type="primary">
{{ $t("createVideo.confirm") }}
</el-button>
<el-input
v-model="title"
:rows="15"
type="textarea"
:placeholder="$t('createVideo.aiText')"
/>
<el-icon :size="20">
<Edit />
</el-icon>
<el-icon class="icon-edit" @click="searchMusicList"
><i-ep-search
/></el-icon>
</div> </div>
<p>{{ $t("createVideo.languages") }}</p>
<el-select
v-model="language"
placeholder="Select"
style="width: 100%"
<!-- 音乐列表展示 -->
<div class="musicList">
<div
@click="chooseMusicUrl(item.url, item.id)"
class="musicItem"
:class="musicItemAction == item.id ? 'musicItemAvtive' : ''"
v-for="item in musicList"
:key="item.id"
>
<span class="musicNmae"> {{ item.name }}</span>
<span class="musicTime"> {{ handleTime(item.time) }}</span>
</div>
</div>
<div class="AudioBox" v-if="audioMusicUrl">
<audio controls :src="audioMusicUrl" id="uploadAudio"></audio>
</div>
<!-- 保存视频 -->
<el-button
@click="saveOrUpdate(3, 'saveVideo')"
color="#000"
type="primary"
> >
<el-option
v-for="item in languageOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<p>{{ $t("createVideo.voices") }}</p>
<el-select
v-model="language"
placeholder="Select"
style="width: 100%"
<my-loading :isLoading="createLoading"></my-loading>
<span v-if="!createLoading">{{
$t("createVideo.saveVideo")
}}</span></el-button
> >
<el-option
v-for="item in languageOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<p>{{ $t("createVideo.styles") }}</p>
<el-select
v-model="language"
placeholder="Select"
style="width: 100%"
<!-- 生成视频 -->
<el-button
style="margin-left: 0"
@click="saveOrUpdate(3)"
color="#000"
type="primary"
> >
<el-option
v-for="item in languageOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-button type="primary">{{
$t("createVideo.generateVideo")
}}</el-button>
<my-loading :isLoading="createLoading"></my-loading>
<span v-if="!createLoading">{{
$t("createVideo.generateVideo")
}}</span>
</el-button>
</div> </div>
</el-tab-pane> </el-tab-pane>
<!-- ----------------------- 4 --> <!-- ----------------------- 4 -->
<el-tab-pane :label="$t('createVideo.aiScript')"> <el-tab-pane :label="$t('createVideo.aiScript')">
<div class="card3">
<div class="card4">
<div class="text"> <div class="text">
<!-- 文本域 -->
<el-input <el-input
v-model="title"
:placeholder="$t('createVideo.typeTitle')"
/>
<el-button type="primary">
{{ $t("createVideo.confirm") }}
</el-button>
<el-input
v-model="title"
maxlength="3000"
id="textInputId"
v-model="textareaContent"
:rows="15" :rows="15"
type="textarea" type="textarea"
:placeholder="$t('createVideo.aiText')" :placeholder="$t('createVideo.aiText')"
/> />
<el-icon :size="20">
<Edit />
</el-icon>
<span
class="pointer"
@click="getPreviewAudio"
style="margin-right: 10px; font-size: 20px"
>🔊</span
>
<span class="pointer" @click="insertIcon">🕗</span>
</div> </div>
<p>{{ $t("createVideo.languages") }}</p> <p>{{ $t("createVideo.languages") }}</p>
<!-- 语言 -->
<el-select <el-select
@change="chooseType"
v-model="language" v-model="language"
placeholder="Select"
:placeholder="$t('createVideo.select')"
style="width: 100%" style="width: 100%"
> >
<el-option <el-option
v-for="item in languageOptions" v-for="item in languageOptions"
:key="item.value" :key="item.value"
:label="item.label"
:value="item.value"
/>
:label="item.name"
:value="item.id"
>
<img
:src="item.img"
alt=""
style="
width: 20px;
margin-right: 10px;
vertical-align: text-top;
"
/>
<span style="line-height: 20px">{{ item.name }}</span>
</el-option>
</el-select> </el-select>
<p>{{ $t("createVideo.voices") }}</p> <p>{{ $t("createVideo.voices") }}</p>
<!-- 声音 -->
<el-select <el-select
v-model="language"
placeholder="Select"
@change="chooseStyle"
:disabled="language ? false : true"
v-model="sound"
:placeholder="$t('createVideo.select')"
style="width: 100%" style="width: 100%"
> >
<el-option <el-option
v-for="item in languageOptions"
v-for="item in soundOptions"
:key="item.value" :key="item.value"
:label="item.label"
:value="item.value"
:label="item.displayName"
:value="item.id"
/> />
</el-select> </el-select>
<p>{{ $t("createVideo.styles") }}</p> <p>{{ $t("createVideo.styles") }}</p>
<!-- 风格 -->
<el-select <el-select
v-model="language"
placeholder="Select"
:disabled="soundStyleOptions ? false : true"
v-model="soundStyle"
:placeholder="$t('createVideo.select')"
style="width: 100%" style="width: 100%"
> >
<el-option <el-option
v-for="item in languageOptions"
:key="item.value"
:label="item.label"
:value="item.value"
v-for="item in soundStyleOptions"
:key="item"
:label="item"
:value="item"
/> />
</el-select> </el-select>
<el-button type="primary">{{
$t("createVideo.generateVideo")
}}</el-button>
<!-- 保存视频 -->
<el-button
@click="saveOrUpdate(1, 'saveVideo')"
color="#000"
type="primary"
>
<my-loading :isLoading="createLoading"></my-loading>
<span v-if="!createLoading">{{
$t("createVideo.saveVideo")
}}</span></el-button
>
<!-- 生成视频 -->
<el-button
style="margin-left: 0"
@click="saveOrUpdate(1)"
color="#000"
type="primary"
>
<my-loading :isLoading="createLoading"></my-loading>
<span v-if="!createLoading">{{
$t("createVideo.generateVideo")
}}</span></el-button
>
</div> </div>
</el-tab-pane> </el-tab-pane>
<!-- -------------------------脚标 -->
</el-tabs> </el-tabs>
</div> </div>
<!-- 试听的mp3 --> <!-- 试听的mp3 -->
@@ -568,6 +610,7 @@ import {
createVideoApi, createVideoApi,
previewAudioApi, previewAudioApi,
findByIdApi, findByIdApi,
musicListApi,
} from "@/apis/createVideo"; } from "@/apis/createVideo";
import { useI18n } from "vue-i18n"; import { useI18n } from "vue-i18n";
import Recorder from "js-audio-recorder"; //mp3插件 import Recorder from "js-audio-recorder"; //mp3插件
@@ -1025,7 +1068,7 @@ async function saveOrUpdate(index, isSaveVideo) {
if (createLoading.value == true) { if (createLoading.value == true) {
return; return;
} }
tabFrom.value = index;
tabFrom.value = index; // 判断是哪一个tab栏内的生成视频按钮
const saveOrUpdateData = { const saveOrUpdateData = {
id: id.value, //从草稿或者重新编辑回到创建视频时有id id: id.value, //从草稿或者重新编辑回到创建视频时有id
title: title.value, title: title.value,
@@ -1035,6 +1078,7 @@ async function saveOrUpdate(index, isSaveVideo) {
speakTypeStr: soundStyle.value, //声音风格 speakTypeStr: soundStyle.value, //声音风格
voiceMouldId: sound.value, //选择声音id voiceFrom=1 时必传 voiceMouldId: sound.value, //选择声音id voiceFrom=1 时必传
voiceMaterialId: afterSaveAudioId.value, //上传音频且保存音频后得到的id voiceFrom=2 时必传 voiceMaterialId: afterSaveAudioId.value, //上传音频且保存音频后得到的id voiceFrom=2 时必传
musicId: musicItemAction.value, // 选中音乐的id,voiceFrom=3 时必传
}; };
if (index == 1) { if (index == 1) {
createLoading.value = true; createLoading.value = true;
@@ -1072,6 +1116,35 @@ async function saveOrUpdate(index, isSaveVideo) {
createLoading.value = false; createLoading.value = false;
} }
} }
if (index == 3) {
try {
const res1 = await saveOrUpdateApi(saveOrUpdateData); // 保存数据

// 这个if判断是不是仅仅保存视频
if (isSaveVideo == "saveVideo") {
ElMessage.success(
lanChange.value == "zh-cn" ? `已保存为草稿` : `Saved as manuscript`
);
createLoading.value = false;
router.push("/myCreating");
return;
}
console.log("ceshi");
const res2 = await createVideoApi({ id: res1.data.id }); // 生成视频
if (res2.message == "success") {
ElMessage.success(
lanChange.value == "zh-cn"
? `视频正在生成中,请耐心等待`
: `The video is being generated, please wait patiently`
);
}
createLoading.value = false;
router.push("/myCreating");
} catch (error) {
ElMessage.error(error);
createLoading.value = false;
}
}
} }
//#endregion ---------------------------- //#endregion ----------------------------


@@ -1087,14 +1160,56 @@ async function findById(findId) {
afterSaveAudioId.value = res.data.voiceMaterialId; //保存音频后得到的id afterSaveAudioId.value = res.data.voiceMaterialId; //保存音频后得到的id
imgUrl.value = res.data.personPhotoUrl; //图片回显 imgUrl.value = res.data.personPhotoUrl; //图片回显
audioUrl.value = res.data.voiceMaterialUrl; // mp3回显 audioUrl.value = res.data.voiceMaterialUrl; // mp3回显
language.value = res.data.voiceInfo.languageId;
await chooseType(language.value);
musicItemAction.value = res.data.musicId; //音乐id回显
language.value = res.data.voiceInfo ? res.data.voiceInfo.languageId : null;
if (language.value) {
await chooseType(language.value);
}
sound.value = res.data.voiceMouldId; //声音id sound.value = res.data.voiceMouldId; //声音id
chooseStyle(); chooseStyle();
soundStyle.value = res.data.speakTypeStr; //选择风格 soundStyle.value = res.data.speakTypeStr; //选择风格
} }
//#endregion ---------------------------- //#endregion ----------------------------


//#region 音乐tab
const musicList = ref(null); //展示音乐列表
const audioMusicUrl = ref(null); //选中音乐Url回显
const musicItemAction = ref(null); //选中高亮
// 获取音乐列表
async function getMusicList() {
try {
const res = await musicListApi();
musicList.value = res.data;
} catch (error) {
console.log(error);
}
}
// 点击选择音乐
function chooseMusicUrl(url, id) {
audioMusicUrl.value = url;
musicItemAction.value = id;
}
// 转化秒为分秒
function handleTime(time) {
let m = Math.floor(time / 60);
let s = time % 60;
if (s < 10) {
s = "0" + s;
}
return m + ":" + s;
}
// 搜索功能
const searchInput = ref(null);
async function searchMusicList() {
// const res = await
console.log("搜索");
}
//#endregion ----------------------------

//#region

//#endregion ----------------------------

//#region //#region


//#endregion ---------------------------- //#endregion ----------------------------
@@ -1116,8 +1231,15 @@ onMounted(async () => {
} }
await voiceTotal(); await voiceTotal();
if (route.query.id) { if (route.query.id) {
findById(route.query.id);
await findById(route.query.id);
} }
await getMusicList();

musicList.value.forEach((item) => {
if (item.id == musicItemAction.value) {
audioMusicUrl.value = item.url;
}
});
}); });
</script> </script>


@@ -1342,7 +1464,7 @@ onMounted(async () => {
padding: 10px; padding: 10px;
> div { > div {
margin-right: 20px; margin-right: 20px;
padding: 5px 10px;
padding: 10px 15px;
transition: all 0.3s; transition: all 0.3s;
border-radius: 5px; border-radius: 5px;
&:hover { &:hover {
@@ -1470,6 +1592,38 @@ onMounted(async () => {
background-size: 200% 100% !important; background-size: 200% 100% !important;
} }
} }
.aiPicTab {
position: relative;
z-index: 2;
.subscript {
position: absolute;
top: -20px;
right: -20px;
width: 40px;
height: 40px;

z-index: 1;
img {
position: absolute;
top: 0;
left: 0px;
width: 100%;
height: 100%;
z-index: 3;
}
span {
position: absolute;
line-height: 45px;
z-index: 4;
padding-left: 0px;
padding-bottom: 5px;
font-size: 16px;
color: #17ceb9;
font-weight: 900;
transform: rotate(45deg);
}
}
}
} }
} }


@@ -1479,6 +1633,36 @@ onMounted(async () => {
padding: 30px 30px 20px 30px; padding: 30px 30px 20px 30px;
background-color: #f1f2f6; background-color: #f1f2f6;
border-radius: 30px 0 0 0; border-radius: 30px 0 0 0;
position: relative;
z-index: 2;

.subscript {
position: absolute;
top: 30px;
right: 30px;
width: 40px;
height: 40px;
z-index: 3;
img {
position: absolute;
top: 0;
left: 0px;
width: 100%;
height: 100%;
z-index: 3;
}
span {
position: absolute;
line-height: 45px;
z-index: 4;
padding-left: 0px;
padding-bottom: 5px;
font-size: 16px;
color: #17ceb9;
font-weight: 900;
transform: rotate(45deg);
}
}
:deep(.el-tabs--border-card) { :deep(.el-tabs--border-card) {
font-size: 20px; font-size: 20px;
border: none; border: none;
@@ -1488,6 +1672,7 @@ onMounted(async () => {
height: 100%; height: 100%;
padding: 20px 20px 0px 20px; padding: 20px 20px 0px 20px;
border-radius: 20px; border-radius: 20px;

.card1 { .card1 {
.text { .text {
padding: 10px; padding: 10px;
@@ -1607,10 +1792,89 @@ onMounted(async () => {
} }
} }
.card3 { .card3 {
width: 100%;
padding: 10px;
.el-icon {
vertical-align: text-top;
}
.musicList {
width: 100%;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
.musicItem {
width: 100%;
height: 30px;
position: relative;
margin-top: 10px;
padding: 0 20px;
border: #000 1px solid;
border-radius: 10px;
overflow: hidden;
transition: all 0.3s;
box-shadow: #00000026 2px 2px 2px 2px;
transition: all 0.3s;
cursor: pointer;
.musicNmae {
display: inline-block;
width: 320px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.musicTime {
display: inline-block;
max-width: 300px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.musicItemAvtive {
background-color: #000;
color: #fff;
}
}
.AudioBox {
display: flex;
justify-content: space-around;
width: 100%;
padding: 20px;
transition: all 0.3s;
audio {
width: 100%;
}
}
> .el-button {
width: 100%;
height: 50px;
margin-top: 10px;
// background-color: #000;
}
:deep(.el-input__wrapper) {
border: none;
border-bottom: 2px solid #000;
border-radius: 0;
box-shadow: none;
}

.el-icon.icon-edit {
width: 30px;
height: 30px;
font-size: 30px;
color: #8c939d;
text-align: center;
cursor: pointer;
transition: all 0.3s;
&:hover {
color: #292929;
}
}
}
.card4 {
.text { .text {
padding: 10px; padding: 10px;
border: 1px solid #000; border: 1px solid #000;

.el-button { .el-button {
float: right; float: right;
margin-top: 10px; margin-top: 10px;
@@ -1623,7 +1887,7 @@ onMounted(async () => {
} }


p { p {
margin: 10px 0;
margin: 7px 0;
} }


> .el-button { > .el-button {
@@ -1631,8 +1895,12 @@ onMounted(async () => {
height: 50px; height: 50px;
margin-top: 10px; margin-top: 10px;
} }
}


:deep(.el-input .is-focus) {
// box-shadow: none !important;
// box-shadow: 0 0 0 1px #000 !important;
}
}
:deep(.el-tabs__item.is-active) { :deep(.el-tabs__item.is-active) {
color: #909393; color: #909393;
background-color: #000; background-color: #000;
@@ -1643,7 +1911,7 @@ onMounted(async () => {
} }


:deep(.el-tabs__item) { :deep(.el-tabs__item) {
width: 25%;
width: 26%;
} }


:deep(.el-tabs__item:hover) { :deep(.el-tabs__item:hover) {


Loading…
Откажи
Сачувај