Files
cmanager/src/views/tenant/main/serve/index.vue
2024-07-30 16:53:48 +08:00

1038 lines
31 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div>
<el-row>
<el-col :span="6">
<basic-container>
<div style="display: flex; justify-content: space-between; align-items: center">
<div>服务分组管理</div>
<div>
<el-button type="text" icon="el-icon-plus"
v-if="vaildData(permission.tenant_main_serve_index_groupadd, false)"
@click="updateGroups('add')">新建分组
</el-button>
</div>
</div>
<div class="box" :style="{height: leftHeight}">
<el-scrollbar style="height: 100%">
<el-tree ref="tree" node-key="id" highlight-current @node-click="nodeClick"
:default-expand-all="true" :data="treeData" :props="{ label: 'groupName', id: 'id'}">
<span class="custom-tree-node" slot-scope="{ node, data }" style="width: 80%">
<span style="
flex-basis: 80%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
flex-shrink: 1;
">
{{ data.groupName || data.name }}
{{ data.sumNum ? `${data.sumNum}个)` : '' }}
</span>
<span v-show="data.children && data.id && data.id !== '0'" style="flex-basis: 20%">
<el-button type="text" icon="el-icon-edit" size="mini"
v-if="vaildData(permission.tenant_main_serve_index_groupedit, false)"
@click="() => updateGroups('edit', data)">
</el-button>
<el-button icon="el-icon-delete" type="text" size="mini"
v-if="vaildData(permission.tenant_main_serve_index_groupdel, false)"
@click="() => removeGroups(data)">
</el-button>
</span>
</span>
</el-tree>
</el-scrollbar>
</div>
</basic-container>
</el-col>
<el-col :span="18">
<basic-container>
<avue-crud
v-model="obj"
ref="crud"
:data="dataSource"
:option="option"
:search.sync="query"
:page.sync="page"
:table-loading="loading"
@search-change="serveSearchChange"
@search-reset="serveResetChange"
@size-change="infoSizeChange"
@current-change="infoCurrentChange">
<template slot="menuLeft">
<el-button type="primary" size="small" @click="selectPushService">推送服务</el-button>
</template>
<template slot-scope="{row,index}" slot="menu">
<!-- <el-button type="text"-->
<!-- icon="el-icon-document"-->
<!-- size="small"-->
<!-- @click="matchWorkStation(row)"-->
<!-- >查看匹配岗位-->
<!-- </el-button>-->
<!-- <el-button type="text"-->
<!-- icon="el-icon-document"-->
<!-- size="small"-->
<!-- @click="matchPolicy(row)"-->
<!-- >查看匹配政策-->
<!-- </el-button>-->
<el-button type="text"
icon="el-icon-document"
size="small"
@click="phoneDataList(row)"
>回访
</el-button>
<el-button type="text"
icon="el-icon-document"
size="small"
@click="selectPushUserService(row)"
>推送服务
</el-button>
<el-button type="text"
icon="el-icon-document"
size="small"
@click="serveLog(row)"
>管理服务日志
</el-button>
</template>
</avue-crud>
</basic-container>
</el-col>
</el-row>
<!-- 匹配任务/岗位 -->
<el-drawer
title="匹配任务/岗位"
size="80%"
:append-to-body="true"
:before-close="() => innerDrawer1 = false"
:visible.sync="innerDrawer1">
<avue-crud
:data="workData"
:option="workOption"
:page.sync="workPage"
@size-change="workSizeChange"
@current-change="workCurrentChange"
>
<template slot="missionDesc" slot-scope="{ row }">
<TextTooltip :content="row.missionDesc"></TextTooltip>
</template>
<template slot-scope="{row,index}" slot="menu">
<el-button type="text"
icon="el-icon-document"
size="small"
@click="toWorkMissionDetail(row)"
>查看详情
</el-button>
</template>
</avue-crud>
</el-drawer>
<!-- 匹配政策-->
<el-drawer
title="匹配政策"
size="80%"
:append-to-body="true"
:before-close="() => innerDrawer2 = false"
:visible.sync="innerDrawer2">
<avue-crud
:data="policyData"
:option="policyOption"
:page.sync="policyPage"
@size-change="policySizeChange"
@current-change="policyCurrentChange"
>
<template slot="policyContent" slot-scope="{ row }">
<el-tooltip class="item" effect="dark" placement="top-start">
<div slot="content">
<div v-for="(item, index) in clipStr(row.policyContent)" :key="index">
<div>{{ item }}</div>
</div>
</div>
<span>{{ row.policyContent.length > 50 ? row.policyContent.substring(0, 50) : row.policyContent }}</span>
</el-tooltip>
</template>
<template slot="labelName" slot-scope="{ row }">
<el-tooltip class="item" effect="dark" placement="top-start">
<div slot="content">
<div v-for="(item, index) in clipStr(row.labelName)" :key="index">
<div>{{ item }}</div>
</div>
</div>
<span>{{ row.labelName.length > 50 ? row.labelName.substring(0, 50) : row.labelName }}</span>
</el-tooltip>
</template>
<template slot="labelNameForm" slot-scope="{row}">
<div>
<el-tag style="margin: 4px 10px" v-for="(item, index) in row.labelName.split(',')" :key="index">{{
item
}}
</el-tag>
</div>
</template>
<template slot="guidelineContentForm" slot-scope="{row}">
<div>
<Tinymce v-model="row.guidelineContent" :visibleToolbar="false" :visibleMenubar="false"></Tinymce>
</div>
</template>
<template slot="policyContentForm" slot-scope="{row}">
<div>
<Tinymce v-model="row.policyContent" :visibleToolbar="false" :visibleMenubar="false"></Tinymce>
</div>
</template>
</avue-crud>
</el-drawer>
<!-- 服务日志-->
<el-drawer
title="服务日志"
size="80%"
:append-to-body="true"
:before-close="() => innerDrawer3 = false"
:visible.sync="innerDrawer3">
<!-- <div>
<span>姓名:</span>
<span>身份证号:</span>
</div> -->
<avue-crud
:data="logData"
:option="logOption"
@row-save="saveLog"
@row-update="saveUpdateLog"
@row-del="removeLog"
:page.sync="logPage"
@size-change="logSizeChange"
@current-change="logCurrentChange"
>
<!-- <template slot="menuLeft">
<el-button @click="addNewLog" icon="el-icon-plus" type="primary" size="mini">添加</el-button>
</template>
<template slot="menu" slot-scope="{row}">
<el-button type="text" @click="editLogInfo(row.id)" icon="el-icon-edit" size="mini">修改</el-button>
<el-button type="text" @click="editLogInfo(row.id)" icon="el-icon-edit" size="mini">查看附件</el-button>
</template> -->
</avue-crud>
</el-drawer>
<!--新建 编辑分组dialog-->
<add-groups ref="addGroups" @refresh="refresh" :listAllPolicyTree="listAllPolicyTree"
:treeData="treeData" :data="worktypeData" :worktypeDic="worktypeDic"
:talentsList="talentsList"></add-groups>
<PushService
:visible.sync="PushServiceVisible"
:rowData="selectPushServiceData"
ref="pushRef"
></PushService>
<mission-view :visible.sync="viewDrawer" :model="view"></mission-view>
<work-view :visible.sync="workViewDrawer" :model="workViewModel"></work-view>
<el-dialog
title="回访"
append-to-body
:visible.sync="phoneDialogVisible"
width="30%"
:before-close="handlePhoneClose">
<el-form :model="phoneForm" label-position="top" label-width="100px">
<el-form-item label="验证手机号">
<el-checkbox-group
v-model="phoneForm.list"
:min="0"
:max="1">
<el-checkbox v-for="phone in phoneList" :label="phone" :key="phone">{{ phone }}</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="输入手机号">
<el-input v-model="phoneForm.phone" :disabled="phoneForm.list.length" autocomplete="off"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="handlePhoneClose">取 消</el-button>
<el-button type="primary" @click="handelPhoneConfirm">确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import {
addServeLog, detail,
getDepTree,
getList,
getListAllPolicy,
getListAllTalents, getMatchPolicy, getMatchServeList, getMatchWorkStation,
getServeListTalents,
removeDept, removeServeLog, updateServeLog, getPhoneList, phoneUpdate
} from "@/api/tenant/serve";
import {mapGetters} from "vuex";
import addGroups from "./Dialog/addGroup";
import {getLabelList} from "@/api/tenant/common";
import missionView from "../../mission/Table/missionView.vue";
import workView from "../../works/Table/missionView.vue"
import TextTooltip from "@/components/text-tooltip/index.vue";
import {serviceType} from "@/common/dic";
import PushService from './Dialog/pushService.vue'
const page = {
pageSize: 10,
currentPage: 1,
total: 0,
}
export default {
components: {addGroups, missionView, workView, TextTooltip, PushService},
data() {
return {
arr: [],
worktypeDic: {},
treeData: [],
loading: false,
tenantId: null,
page: Object.assign({}, page),
workPage: Object.assign({}, page),
dataSource: [],
tempWorkType: [],
talentsList: [],
query: {},
obj: {},
selectInfo: null,
innerDrawer1: false,
viewDrawer: false,
workViewDrawer: false,
workViewModel: {},
view: {},
workData: [],
policyData: [],
innerDrawer2: false,
policyPage: Object.assign({}, page),
innerDrawer3: false,
logData: [],
logPage: Object.assign({}, page),
selectUserServeLog: null,
selectPushServiceData: null,
PushServiceVisible: false,
phoneDialogVisible: false,
phoneList: [],
phoneForm: {
phone: '',
list: []
},
phoneItem: null,
}
},
computed: {
...mapGetters(["permission", "userInfo"]),
permissionList() {
return {
addBtn: this.vaildData(this.permission.tenant_main_serve_index_add, false),
viewBtn: true,
delBtn: this.vaildData(this.permission.tenant_main_serve_index_del, false),
editBtn: this.vaildData(this.permission.tenant_main_serve_index_edit, false),
};
},
leftHeight: function () {
//获取高度值
if (document.getElementsByClassName("avue-crud__pagination")[0]) {
let pageHeight = document.getElementsByClassName(
"avue-crud__pagination"
)[0].offsetTop;
return pageHeight - 105 + "px";
} else {
return 725 + "px";
}
},
worktypeData() {
let rel = [];
for (let j = 0; j < this.arr.length; j++) {
const key = this.arr[j];
if (this.worktypeDic.hasOwnProperty(key)) {
rel.push({name: key})
}
}
// for (let i = 0; i < this.tempWorkType.length; i++) {
// const key = this.tempWorkType[i];
// if (key && !this.worktypeDic.hasOwnProperty(key)) {
// rel.push({name: key});
// }
// }
return rel;
},
option() {
return {
dialogWidth: "50%",
dialogType: "drawer",
dialogClickModal: false,
editBtn: false,
delBtn: false,
addBtn: false,
viewBtn: false,
border: true,
refreshBtn: false,
searchBtn: true,
searchShow: true,
searchMenuSpan: 6,
height: '100',
column: [
{
label: "姓名",
prop: "name",
search: true,
searchLabelWidth: 50,
searchSpan: 7,
},
{
label: "身份证",
prop: "idNumber",
search: true,
searchLabelWidth: 60,
searchSpan: 7,
},
{
label: "手机号",
prop: "telphone",
},
// {
// label: "用户类型",
// prop: "userId",
// },
{
label: "身份标签",
prop: "labelsBase",
},
]
}
},
workOption() {
return {
editBtn: false,
delBtn: false,
addBtn: false,
border: true,
index: true,
indexLabel: "序号",
refreshBtn: false,
height: '100',
column: [{
label: "名称",
prop: "missionTitle",
}, {
label: "描述",
prop: "missionDesc",
slot: true
}]
}
},
policyOption() {
return {
editBtn: false,
delBtn: false,
addBtn: false,
border: true,
index: true,
indexLabel: "序号",
refreshBtn: false,
height: '100',
viewBtn: true,
dialogType: "drawer",
column: [{
label: '政策名称',
prop: 'name'
},
{
label: "政策级别",
prop: "level",
span: 12,
hide: true,
},
{
label: "政策文号",
prop: "number",
span: 12,
hide: true,
},
{
label: "发文机构",
prop: "issuingAuthority",
span: 12,
hide: true,
},
{
label: "分组",
prop: "groupId",
type: "tree",
hide: true,
span: 12,
display: true,
placeholder: "请选择 分组",
},
{
label: "有效性",
prop: "status",
type: "tree",
span: 12,
hide: true,
display: true,
dicData: [{name: "有效", value: 1}, {name: "无效", value: 0}],
props: {
label: "name",
value: "value",
},
},
{
label: "服务类型",
prop: "stype",
type: "tree",
span: 12,
display: true,
hide: true,
dicData: serviceType,
props: {
label: "label",
value: "value",
},
rules: [
{
required: true,
message: "请选择服务类型",
trigger: "change",
},
],
placeholder: "请选择 服务类型",
},
{
label: "发文字号",
prop: "issuingNumber",
hide: true,
span: 12,
// row: true,
maxlength: 50,
showWordLimit: true,
},
{
label: "类别",
prop: "category",
span: 12,
hide: true,
maxlength: 50,
showWordLimit: true,
},
{
label: "标签",
prop: "labelName",
hide: false,
formslot: true,
span: 24,
},
{
label: "政策文件名",
prop: "policyFileName",
hide: true,
span: 24,
},
{
label: '政策内容',
prop: 'policyContent',
slot: true,
hide: true,
formslot: true,
span: 24,
},
{
label: "指南文件名",
prop: "guidelineFileName",
hide: true,
span: 24,
maxlength: 50,
showWordLimit: true,
},
{
label: "指南内容",
prop: "guidelineContent",
hide: true,
formslot: true,
span: 24,
},
{
label: "备注",
prop: "remarks",
type: "textarea",
hide: true,
span: 24,
maxlength: 100,
showWordLimit: true,
},
]
}
},
logOption() {
return {
editBtn: true,
delBtn: true,
addBtn: true,
viewBtn: true,
border: true,
index: true,
indexLabel: "序号",
refreshBtn: false,
dialogType: "drawer",
height: '100',
column: [{
label: '服务时间',
prop: 'createTime',
type: 'date',
format: "yyyy-MM-dd",
valueFormat: "yyyy-MM-dd HH:mm:ss",
rules: [
{
required: true,
message: "请选择服务时间",
trigger: "blur",
},
],
}, {
label: '服务名称',
prop: 'serveName',
display: false,
}, {
label: '服务发起人',
prop: 'fromName',
display: false,
}, {
label: '服务对象',
prop: 'toName',
display: false,
}, {
label: '服务类型',
prop: 'serveType',
type: 'select',
dicData: [
{label: '普通日志', value: 0},
{label: '回访日志', value: 1},
{label: '推送岗位日志', value: 2},
{label: '推送政策日志', value: 3},
],
display: false,
}, {
label: '服务主题',
prop: 'serveTheme',
rules: [
{
required: true,
message: "请输入服务主题",
trigger: "blur",
},
],
}, {
label: '服务内容',
span: 24,
prop: 'serveContent',
type: 'textarea',
rules: [
{
required: true,
message: "请输入服务内容",
trigger: "blur",
},
],
}, {
label: '备注说明',
span: 24,
type: 'textarea',
prop: 'bak1'
}]
}
},
},
created() {
this.initDept();
this.getListAllPolicyTree()
this.getLabelList()
this.ListAllTalents()
},
methods: {
selectPushUserService(row) {
this.selectPushService().then(() => {
this.$nextTick(() => {
console.log(this.$refs.pushRef, row.name)
this.$refs.pushRef.refLeftSearch(row.name)
})
})
},
handelPhoneConfirm() {
let _this = this
let phone = ''
if (this.phoneForm.list.length) phone = this.phoneForm.list[0];
if (/^1[3-9]{1}\d{9}/.test(this.phoneForm.phone)) phone = this.phoneForm.phone;
if (phone) {
this.$confirm(`手机号为:${phone}`, {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(async (res) => {
let params = {
idNumber: _this.phoneItem.idNumber,
phone
}
let resData = await phoneUpdate(params)
if (resData.data.code === 200) {
_this.$message.success("手机号更新成功");
_this.handlePhoneClose()
}
})
} else {
this.$message.error("请选择或输入用户手机号!");
}
},
handlePhoneClose() {
this.phoneDialogVisible = false
this.phoneForm.phone = ''
this.phoneForm.list = []
},
async phoneDataList(item) {
let params = {
idNumber: item.idNumber
}
let resData = await getPhoneList(params)
if (resData.data.code === 200) {
this.phoneList = resData.data.data
this.phoneItem = item
this.phoneDialogVisible = true
} else {
this.$message.error("用户数据异常!");
}
},
/*点击分组加载相应人才列表*/
nodeClick(data) {
if (data.children) return;
this.selectInfo = data
this.tenantId = data.id ? data.id : "";
this.page.currentPage = 1;
this.onLoad(this.page, this.query);
},
/*加载分组*/
getLabelList() {
getLabelList().then((res) => {
const arr = res.data.data.flatMap(obj => obj.child.map(item => item.concatName));
this.arr = arr.map(concatName => {
this.worktypeDic[concatName] = 1;
return concatName;
});
});
},
async ListAllTalents() {
let resData = await getListAllTalents()
if (resData.data.code === 200) {
this.talentsList = resData.data.data
}
},
initDept(groupId) {
getDepTree().then((res) => {
const data = res.data.data.list.map((item) => ({
...item,
disabled: true
}));
this.treeData = data;
// const column = this.findObject(this.option.column, "groupId");
// column.dicData = this.treeData;
if (groupId) {
this.$nextTick(function () {
this.$refs.tree.setCurrentKey(groupId);
}); //默认高亮
this.nodeClick({id: groupId});
} else {
if (this.treeData.length) {
const serveId2 = this.treeData[0].id
const serveId = this.treeData[0].children[0].id
this.$nextTick(function () {
this.$refs.tree.setCurrentKey(serveId);
}); //默认高亮第一个
this.nodeClick({id: serveId});
}
}
this.loading = false;
});
},
async getListAllPolicyTree() {
let resData = await getListAllPolicy({})
if (resData.data.code === 200) {
this.listAllPolicyTree = resData.data.data
}
},
updateGroups(type, data) {
this.$refs.addGroups.openDialog(type, data);
},
/*删除分组*/
removeGroups(data) {
//检验该分组是否存在人员,存在提示无法删除,不存在泽提示确定要删除此分组吗
const h = this.$createElement;
this.$confirm(
h("div", null, [
h("p", {style: "font-size: 16px"}, "您确定要删除此分组吗? "),
h("p", {style: "color: red"}, "一旦删除则无法找回"),
]),
{
type: "warning",
showClose: false,
showCancelButton: true,
confirmButtonText: "确定",
cancelButtonText: "取消",
beforeClose: (action, instance, done) => {
if (action === "confirm") {
instance.confirmButtonLoading = true;
instance.cancelButtonLoading = true;
instance.closeOnPressEscape = false;
instance.closeOnClickModal = false;
setTimeout(() => {
done();
setTimeout(() => {
instance.confirmButtonLoading = false;
instance.cancelButtonLoading = false;
}, 300);
}, 1000);
} else {
done();
}
},
}
)
.then(() => {
removeDept(data.id).then(
() => {
this.$message({
type: "success",
message: "操作成功!",
});
this.refresh("del");
},
(error) => {
window.console.log(error);
}
);
})
.catch(() => {
});
},
/*加载人才列表 */
onLoad(page, params = {}) {
this.loading = true;
let paramsed = {
current: page.currentPage,
pageSize: page.pageSize,
id: this.tenantId,
...params
}
getServeListTalents(paramsed).then((res) => {
const {records, current, size, total} = res.data.data
this.dataSource = records
this.loading = false;
console.log({
pageSize: size,
currentPage: current,
total: total,
})
this.page = {
pageSize: size,
currentPage: current,
total: total,
}
// this.selectionClear();
});
},
refresh(type) {
this.page.currentPage = 1;
this.query = {};
if (type === "del") {
//删除分组后重新选中分组为未分组
this.initDept();
// this.onLoad(this.page, this.query);
} else {
this.initDept(this.tenantId);
// this.onLoad(this.page, this.query);
}
},
serveSearchChange(params, done) {
this.page.currentPage = 1;
this.query = params
this.onLoad(this.page, this.query);
done();
},
serveResetChange() {
this.page.currentPage = 1;
this.query = {}
this.onLoad(this.page, this.query);
},
infoSizeChange(pageSize) {
this.onLoad(this.page, this.query);
},
infoCurrentChange(currentPage) {
this.onLoad(this.page, this.query);
},
// 匹配任务和岗位
matchWorkStation(row) {
getMatchWorkStation({
serveUserId: row.serveUserId,
serveId: this.selectInfo.id,
companyId: this.selectInfo.companyId
}).then(res => {
const {records, current, size, total} = res.data.data
this.innerDrawer1 = true
this.workData = records
this.workPage = {
pageSize: size,
currentPage: current,
total: total,
}
})
},
// 匹配政策
matchPolicy(row) {
console.log('匹配政策')
getMatchPolicy({id: row.id, serveId: this.selectInfo.id, serveUserId: row.serveUserId}).then(res => {
let _this = this;
const {records, current, size, total} = res.data.data
_this.policyData = records
_this.innerDrawer2 = true
_this.policyPage = {
pageSize: size,
currentPage: current,
total: total,
}
})
},
// 服务日志
serveLog(row) {
console.log('服务日志', row)
this.selectUserServeLog = row
getMatchServeList({
id: row.id,
serveId: this.selectInfo.id,
companyId: this.selectInfo.companyId,
current: this.logPage.currentPage,
size: this.logPage.pageSize
}).then(res => {
let _this = this;
const {records, current, size, total} = res.data.data
_this.logData = records
_this.innerDrawer3 = true
_this.logPage = {
pageSize: size,
currentPage: current,
total: total,
}
})
},
async saveLog(row, index, done, loading) {
let params = {
...row,
serveId: this.selectInfo.id,
serveUserId: this.selectUserServeLog.serveUserId,
talentsId: this.selectUserServeLog.id,
idNumber: this.selectUserServeLog.idNumber,
toName: this.selectUserServeLog.name,
fromName: this.userInfo.real_name
}
let resData = await addServeLog(params)
done()
if (resData.data.code === 200) {
this.$message({
type: "success",
message: "添加成功!",
});
this.serveLog(this.selectUserServeLog)
}
},
async saveUpdateLog(row, index, done, loading) {
let params = {
id: row.id,
createTime: row.createTime,
fromName: row.fromName,
toName: row.toName,
serveTheme: row.serveTheme,
serveContent: row.serveContent,
bak1: row.bak1,
}
let resData = await updateServeLog(params)
done()
if (resData.data.code === 200) {
this.$message({
type: "success",
message: "修改成功!",
});
this.serveLog(this.selectUserServeLog)
}
},
removeLog(row, index, done, loading) {
this.$confirm("确定将选择数据删除?", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
return removeServeLog({ids: row.id});
})
.then(() => {
this.serveLog(this.selectUserServeLog)
this.$message({
type: "success",
message: "操作成功!",
});
});
},
logSizeChange(pageSize) {
this.logPage.pageSize = pageSize;
this.serveLog(this.selectUserServeLog)
},
logCurrentChange(currentPage) {
this.logPage.currentPage = currentPage;
this.serveLog(this.selectUserServeLog)
},
workSizeChange() {
},
workCurrentChange() {
},
policySizeChange() {
},
policyCurrentChange() {
},
selectPushService() {
return new Promise((resolve, reject) => {
detail(this.selectInfo.id).then((res) => {
if (res.data.code === 200) {
this.selectPushServiceData = res.data.data
this.PushServiceVisible = true
resolve()
}
})
})
// this.selectPushServiceData = deepClone(this.selectInfo)
// this.PushServiceVisible = true
},
/*查看*/
toWorkMissionDetail(row) {
if (row.type == 0) {
missionDetail(row.missionNo).then((res) => {
this.viewDrawer = true;
this.view = res;
});
} else if (row.type == 1) {
workDetail(row.id).then(res => {
this.workViewDrawer = true;
this.workViewModel = res;
})
}
},
clipStr(str) {
const clip = []
if (str && str.length > 50) {
for (let i = 0; i < Math.ceil(str.length / 50); i++) {
clip.push(str.slice(i * 50, i * 50 + 50))
}
return clip
}
return [str]
},
}
}
</script>
<style lang="scss" scoped>
</style>