Skip to content

Commit

Permalink
feat(字体): 增加样式字体
Browse files Browse the repository at this point in the history
  • Loading branch information
nihaojob committed May 17, 2024
1 parent 5169596 commit 7aed103
Show file tree
Hide file tree
Showing 7 changed files with 529 additions and 246 deletions.
4 changes: 2 additions & 2 deletions packages/core/plugin/FontPlugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* @Author: 秦少卫
* @Date: 2024-04-21 23:51:01
* @LastEditors: 秦少卫
* @LastEditTime: 2024-04-22 19:14:54
* @LastEditTime: 2024-05-17 16:13:03
* @Description: 自定义字体
*/

Expand Down Expand Up @@ -31,7 +31,7 @@ class FontPlugin {
public canvas: fabric.Canvas;
public editor: IEditor;
static pluginName = 'FontPlugin';
static apis = ['getFontList', 'loadFont'];
static apis = ['getFontList', 'loadFont', 'getFontJson', 'downFontByJSON'];
repoSrc: string;
cacheList: FontSource[];
constructor(canvas: fabric.Canvas, editor: IEditor, config: { repoSrc: string }) {
Expand Down
165 changes: 165 additions & 0 deletions src/components/fontStyle.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
<!--
* @Author: 秦少卫
* @Date: 2023-08-05 17:47:35
* @LastEditors: 秦少卫
* @LastEditTime: 2024-05-17 16:26:25
* @Description: 字体样式
-->

<template>
<div>
<!-- 搜索组件 -->
<div class="search-box">
<Select class="select" v-model="typeValue" @on-change="startGetList" :disabled="pageLoading">
<Option v-for="item in typeList" :value="item.value" :key="item.value">
{{ item.label }}
</Option>
</Select>
<Input
class="input"
:placeholder="`${typeText}中搜索`"
v-model="searchKeyWord"
search
:disabled="pageLoading"
@on-search="startGetList"
/>
</div>
<!-- 列表 -->
<div style="height: calc(100vh - 108px)" id="myTemplBox3">
<Scroll
key="mysscroll2"
v-if="showScroll"
:on-reach-bottom="nextPage"
:height="scrollHeight"
:distance-to-edge="[-1, -1]"
>
<!-- 列表 -->
<div class="img-group">
<Tooltip :content="info.name" v-for="info in pageData" :key="info.src" placement="top">
<div class="tmpl-img-box">
<Image
lazy
:src="info.src"
fit="contain"
height="100%"
:alt="info.name"
@click="addItem(info)"
@dragend="(e) => dragItem(e, info)"
/>
</div>
</Tooltip>
</div>
<Spin size="large" fix :show="pageLoading"></Spin>

<Divider plain v-if="isDownBottm">已经到底了</Divider>
</Scroll>
</div>
</div>
</template>

<script setup name="ImportSvg">
import useSelect from '@/hooks/select';
import usePageList from '@/hooks/pageList';
import { fabric } from 'fabric';
import { v4 as uuid } from 'uuid';
import { Spin } from 'view-ui-plus';
import { useI18n } from 'vue-i18n';
const { t } = useI18n();
const {
startPage,
typeValue,
typeText,
typeList,
pageLoading,
pageData,
searchKeyWord,
isDownBottm,
startGetList,
nextPage,
showScroll,
scrollHeight,
} = usePageList({
typeUrl: 'font-style-types',
listUrl: 'font-styles',
searchTypeKey: 'font_style_type',
searchWordKey: 'name',
pageSize: 50,
scrollElement: '#myTemplBox3',
});
const { canvasEditor } = useSelect();
// 按照类型渲染
const dragItem = async (e, item) => {
Spin.show({
render: (h) => h('div', t('alert.loading_data')),
});
await canvasEditor.downFontByJSON(JSON.stringify(item.json));
const el = JSON.parse(JSON.stringify(item.json));
el.id = uuid();
const elType = capitalizeFirstLetter(el.type);
new fabric[elType].fromObject(el, (fabricEl) => {
canvasEditor.dragAddItem(fabricEl, e);
Spin.hide();
});
};
const addItem = async (item) => {
Spin.show({
render: (h) => h('div', t('alert.loading_data')),
});
await canvasEditor.downFontByJSON(JSON.stringify(item.json));
const el = JSON.parse(JSON.stringify(item.json));
el.id = uuid();
const elType = capitalizeFirstLetter(el.type);
new fabric[elType].fromObject(el, (fabricEl) => {
canvasEditor.dragAddItem(fabricEl);
Spin.hide();
});
};
function capitalizeFirstLetter(string) {
return string.charAt(0).toUpperCase() + string.slice(1);
}
onMounted(async () => {
startPage();
});
</script>

<style scoped lang="less">
.search-box {
padding-top: 10px;
display: flex;
.input {
margin-left: 10px;
}
.select {
width: 100px;
}
}
.img-group {
background: #eeeeeea1;
border-radius: 10px;
padding: 10px;
}
.tmpl-img-box {
width: 67px;
height: 100px;
padding: 5px;
cursor: pointer;
border-radius: 10px;
&:hover {
background: #e3e3e3;
}
}
.tip-text {
display: block;
text-align: center;
}
</style>
141 changes: 45 additions & 96 deletions src/components/importSvgEl.vue
Original file line number Diff line number Diff line change
@@ -1,53 +1,48 @@
<!--
* @Author: 秦少卫
* @Date: 2024-05-17 15:31:24
* @LastEditors: 秦少卫
* @LastEditTime: 2024-05-17 15:31:25
* @Description: file content
-->
<!--
* @Author: 秦少卫
* @Date: 2023-08-05 17:47:35
* @LastEditors: 秦少卫
* @LastEditTime: 2024-05-09 15:05:49
* @LastEditTime: 2024-05-17 15:16:59
* @Description: file content
-->

<template>
<div>
<!-- 搜索组件 -->
<div class="search-box">
<Select
class="select"
v-model="materialType"
@on-change="startGetMaterialList"
:disabled="loading"
>
<Option key="全部" value="">全部</Option>
<Option v-for="item in materialTypeList" :value="item.value" :key="item.value">
<Select class="select" v-model="typeValue" @on-change="startGetList" :disabled="pageLoading">
<Option v-for="item in typeList" :value="item.value" :key="item.value">
{{ item.label }}
</Option>
</Select>
<Input
class="input"
:placeholder="`${getSearchTypeText()}中搜索`"
v-model="searchKeyword"
:placeholder="`${typeText}中搜索`"
v-model="searchKeyWord"
search
:disabled="loading"
@on-search="startGetMaterialList"
:disabled="pageLoading"
@on-search="startGetList"
/>
</div>

<!-- 列表 -->
<div style="height: calc(100vh - 110px)" id="myTemplBox">
<div style="height: calc(100vh - 108px)" id="myTemplBox1">
<Scroll
key="mysscroll"
key="mysscroll2"
v-if="showScroll"
:on-reach-bottom="handleReachBottom"
:on-reach-bottom="nextPage"
:height="scrollHeight"
:distance-to-edge="[-1, -1]"
>
<!-- 列表 -->
<div>
<Tooltip
:content="info.name"
v-for="info in materialList"
:key="info.src"
placement="top"
>
<div class="img-group">
<Tooltip :content="info.name" v-for="info in pageData" :key="info.src" placement="top">
<div class="tmpl-img-box">
<Image
lazy
Expand All @@ -61,87 +56,47 @@
</div>
</Tooltip>
</div>
<Spin size="large" fix :show="loading"></Spin>
<Spin size="large" fix :show="pageLoading"></Spin>

<Divider plain v-if="isDownBottm()">已经到底了</Divider>
<Divider plain v-if="isDownBottm">已经到底了</Divider>
</Scroll>
</div>
</div>
</template>

<script setup name="ImportSvg">
import useSelect from '@/hooks/select';
import usePageList from '@/hooks/pageList';
import { fabric } from 'fabric';
import { v4 as uuid } from 'uuid';
import { useRoute } from 'vue-router';
import { Utils } from '@kuaitu/core';
const { canvasEditor } = useSelect();
// 素材类型
const materialType = ref('');
materialType.value = '';
// 素材类型列表
const materialTypeList = ref([]);
// 素材列表
const materialList = ref([]);
// 搜索关键字
const searchKeyword = ref('');
// 面板加载
const loading = ref(false);
// 分页信息
const page = ref(1);
const pagination = reactive({
page: 0,
pageCount: 0,
pageSize: 10,
total: 0,
const {
startPage,
typeValue,
typeText,
typeList,
pageLoading,
pageData,
searchKeyWord,
isDownBottm,
startGetList,
nextPage,
showScroll,
scrollHeight,
} = usePageList({
typeUrl: 'material-types',
listUrl: 'materials',
searchTypeKey: 'material_type',
searchWordKey: 'name',
pageSize: 50,
scrollElement: '#myTemplBox1',
});
const getSearchTypeText = () => {
const info = materialTypeList.value.find((item) => item.value === materialType.value);
const type = info?.label || '全部';
return type;
};
const isDownBottm = () => {
return pagination.page === page.value && pagination.page >= pagination.pageCount;
};
// 获取素材分类
canvasEditor.getMaterialTypeList().then((list) => {
materialTypeList.value = list;
});
// 获取素材列表
const getMaterialList = () => {
loading.value = true;
canvasEditor.getMaterialList(materialType.value, page.value, searchKeyword.value).then((res) => {
const { list, pagination: resPagination } = res;
Object.keys(resPagination).forEach((key) => {
pagination[key] = resPagination[key];
});
materialList.value = [...materialList.value, ...list];
loading.value = false;
});
};
const startGetMaterialList = () => {
materialList.value = [];
page.value = 1;
getMaterialList();
};
const handleReachBottom = () => {
if (page.value >= pagination.pageCount) return;
page.value++;
setTimeout(() => {
getMaterialList();
}, 1000);
};
const { canvasEditor } = useSelect();
// // 按照类型渲染
// 按照类型渲染
const dragItem = (e) => {
const target = e.target;
const imgType = canvasEditor.getImageExtension(target.src);
Expand Down Expand Up @@ -198,8 +153,6 @@ const addItem = (e) => {
}
};
const showScroll = ref(false);
const scrollHeight = ref(0);
onMounted(async () => {
// 默认添加图片
const route = useRoute();
Expand All @@ -209,11 +162,7 @@ onMounted(async () => {
addItem({ target: image });
}
// 滚动
const myTemplBox = document.querySelector('#myTemplBox');
scrollHeight.value = myTemplBox.offsetHeight - 10;
showScroll.value = true;
getMaterialList();
startPage();
});
</script>
Expand Down

0 comments on commit 7aed103

Please sign in to comment.